Skip to content

Operations ​

Deployment ​

Evo.ai ships as a Docker stack (the app plus Qdrant, with Ollama behind an optional profile) and deploys with the shared tooling:

powershell
zdeploy evoai

The server's .env (including a generated SECRET_KEY) lives on the host and is preserved across deploys. In production, run with DEV_MODE=false and a reachable EVOPLATFORM_JWKS_URL so tokens are verified and tenants isolated — see Multi-tenancy & security.

Running fully local (Ollama) keeps every prompt and retrieved chunk on the box; pointing a tenant at a cloud provider sends its prompts (including retrieved context) to that provider. Choose per tenant via model configuration.

Quality gates ​

Two gates are meant to run after every change to the retrieval or answer path, before shipping.

Latency gate ​

scripts/run_latency.py times representative questions per pipeline path (gate, analytics count, field lookup, vector, two-turn follow-up), averaged over several runs, against a committed baseline (eval/latency_baseline.json). Any category more than 25% over its baseline fails and needs review. After an intentional performance change, re-baseline with --update-baseline. Baselines are environment-specific.

bash
python scripts/run_latency.py --token <svc-key> --tenant <site-uuid>

LLM-as-judge suite ​

scripts/run_judge.py runs a growing set of answer-quality cases (eval/judge.jsonl) — every closed defect adds one, tagged with its issue. Each case runs deterministic asserts first (regex must / must-not, envelope checks), then an LLM judge scores the rubric (PASS/FAIL + reason). --skip-judge runs just the deterministic layer without a judge key.

bash
python scripts/run_judge.py --token <svc-key> --tenant <site-uuid>

Trend reporting ​

Every gate run is recorded to eval/qa_history.db (SQLite) with timestamp, git commit, and per-metric results. scripts/qa_report.py renders eval/qa_report.html — dependency-free inline-SVG trend charts (latency per path, judge pass rate) plus a table of recent runs. Pass --no-record for throwaway runs.

bash
python scripts/qa_report.py

Retrieval eval ​

Separately, scripts/run_eval.py scores retrieval against a golden Q&A set — hit rate, MRR, and keyword coverage — and is worth running on any retrieval change:

bash
cp eval/golden.example.jsonl eval/golden.jsonl   # then edit with real Q&A
python scripts/run_eval.py eval/golden.jsonl --min-hit-rate 0.7

Add --min-hit-rate as a CI gate to fail the build when retrieval regresses.

Documentation hub for Evomedia.net LLC products.