/improve-agent, we’re looking for out-of-distribution improvements. Evals make sure in-distribution cases continue to pass. The two work together.
Cases
Cases live inevals/cases.py. Each case sends one input to an agent and (optionally) checks two things:
- judge:
AgentAsJudgeEvalscores the response againstcriteria(binary pass/fail) using an LLM. - reliability:
ReliabilityEvalchecks which tools fired againstexpected_tool_calls.
evals/cases.py
smoke, release, and live. This case is tagged live because its answer depends on the open web.
Run the suite
1
Create a virtual environment
The eval suite runs on the host and needs a local virtual environment:Activate it:
2
Run the eval suite
Eval Summary table.
Results write to Postgres via eval_db. The eval history shows up on os.agno.com alongside your sessions and traces, so you can see when a case started failing and what changed.
Diagnose failures with Claude Code
Open Claude Code and run:When to run evals
The production cron is the most valuable one, and the template ships it as the
run_evals workflow. Set ENABLE_SCHEDULED_EVALS=True to run the smoke-tagged cases daily. See scheduling for the cron API.
What good cases look like
- Specific. “Returns a JSON object with
tickerandprice” beats “Returns the right answer”. - Stable. Avoid prompts whose correct answer changes daily. Use phrasing like “describes a real, recent…” instead of locking in a specific result.
- Scoped to one behavior. One case per behavior makes failures easy to read.
- Anchored to tools.
expected_tool_callscatches the failure mode where the agent confidently makes things up instead of calling a tool.