Set up your agent
There are two ways to run LLM evaluations:Calibrate agent
Define your agent completely within Calibrate
Agent connection
Connect your existing text or voice agent
Test cases
An array of test cases to evaluate your agent on. Each test case has:Tool call test
Verifies the agent calls the correct tools with the expected arguments:Passing
"arguments": null will make the agent simply check if the tool is
called without checking the arguments.Judging an argument against a criteria
If exact matching is too strict, you can also pass a criteria that an LLM judge uses to evaluate if the argument is correct. Each argument is matched independently, letting you mix exact matches and criteria-based evaluations in the same tool call:"555-123-4567") is matched exactly, as usual. To opt an argument out of exact matching, give it a spec with one of these match_type values:
To leave an argument completely unconstrained, give it an
"any" spec. This is a wildcard: the parameter is ignored entirely — it need not appear in the produced tool call, and whatever value it has is accepted. Use it to pin down only the arguments that matter and leave free-form or non-deterministic ones unchecked.
history and evaluation keys work identically for both setup options.
Response test
Given a conversation history, this test verifies that the agent’s response meets the evaluation criteria defined by you (evaluated by an LLM judge):Conversation test
Like a response test, the agent is run on thehistory to produce its next reply — but instead of grading only that reply, the entire resulting conversation (history + the new reply) is graded by the simulation judge. Use this when correctness depends on the whole exchange, not just the latest turn. As with response tests, history ends at the user’s turn that the agent should answer.
examples/llm/config-conversation.json for a full template.
Evaluators
Response test cases can be evaluated by one or more text LLM judges (routed through OpenRouter, setOPENROUTER_API_KEY in your environment).
Each evaluator’s system_prompt is sent to its own dedicated LLM judge call (one call per evaluator, run in parallel) with the conversation history and the agent’s last response as the inputs.
Defining custom evaluators
Define one or more evaluators at the top level and reference them by name from each test case. Each evaluator is an independent LLM call and produces its own column in the leaderboard:Using the default evaluator
The simplest setup needs no top-levelevaluators. Pass criteria as a string and the implicit correctness evaluator runs. The string is substituted into the default evaluator’s system prompt as the {{criteria}} variable:
correctness (default evaluator system prompt)
correctness (default evaluator system prompt)
When you omit top-level
evaluators and pass a string criteria, this is the implicit evaluator from DEFAULT_LLM_TEST_EVALUATOR that is used by default. Your criteria string is substituted for {{criteria}}.Variable substitution
A test case can passarguments to an evaluator. Each {{variable}} placeholder in the evaluator’s system_prompt is replaced with the matching value before the judge call:
criteria (shown in the quickstart above) is just a shortcut for the implicit correctness evaluator with { "arguments": { "criteria": "<your string>" } }.
Binary vs rating
Binary evaluators produce per-row pass/fail and a mean pass-rate in aggregates. Rating evaluators report mean/min/max scores per model on the leaderboard. At test-case pass/fail time, every referenced evaluator must pass: binary evaluators requirematch: true, and rating evaluators require the numeric score to equal scale_max (anything lower fails that evaluator). So on a 1–5 scale (scale_min 1, scale_max 5), only a judge score of 5 counts as pass — intermediate scores fail unless they hit the top of your declared scale.
If you want thresholds different from “top-of-scale” (for example “tone at least 4”), encode that as a binary evaluator whose system_prompt asks the judge explicitly (for example: “Mark True if and only if tone is at least 4 on a 1–5 scale”).
Full examples
Calibrate agent example
Calibrate agent example
Same structure as
examples/llm/config-internal-agent.json, with documentation-only // comments before each test case (jsonc — strip comments if you paste into a strict JSON parser).Agent connection example
Agent connection example
Same structure as
examples/llm/config-external-agent.json, with documentation-only // comments before each test case (jsonc — strip comments if you paste into a strict JSON parser).Get started
Interactive mode
Runcalibrate-agent llm with no arguments to launch the interactive UI:
- Config file — path to your config file
- Provider — OpenRouter or OpenAI
- Model entry — enter model names one at a time (single or multiple)
- Confirm models — review the list and add more or proceed
- Output directory — where results will be saved (defaults to
./out) - API keys — enter the API keys for the selected provider
agent_url in your config and switches to agent mode:
Single test:
- Config file — path to your config file (with
agent_urland optionallyagent_headers) - Mode — select “Single test”
- Verify — calibrate verifies the connection; shows success or failure with the option to go back
- Output directory — where results will be saved (defaults to
./out) - API keys — only
OPENAI_API_KEYis required (used by the LLM judge)
- Config file — path to your config file (with
agent_urland optionallyagent_headers) - Mode — select “Benchmark across models”
- Model entry — enter a model name; calibrate verifies the connection with that model before asking if you want to add another
- Confirm models — review the list and add more or proceed
- Output directory — where results will be saved (defaults to
./out) - API keys — only
OPENAI_API_KEYis required (used by the LLM judge)
Non-interactive mode
Calibrate agent: Single model:agent_url and optionally agent_headers:
--skip-verify to skip the agent connection verification step. This is useful in CI/automation pipelines where you’ve already confirmed the agent is reachable:
Output
Once all the models have completed, it displays a leaderboard with pass rates (% of tests passed) and bar charts for visualization.

Resources
Integrations
See the full list of supported providers and their configuration options