Evaluation CLI
The NeMo Labs Voice Agent evaluation harness ships two command-line entry points in evaluation/:
The argparse definitions in those two files specify every default below.
Before You Run
Start both bot servers before you run run_evaluation.py. The code resolves SERVER_CONFIG_PATH against the
current working directory, so run cd evaluation first. The run_agent.sh and run_user.sh helpers also
change to that directory and export the following ports.
Refer to Environment Variables for the complete bot-server variable list and Evaluation Quickstart for the end-to-end walkthrough.
run_evaluation.py
Use the following option groups to select scenarios, connect the bots, control runs, and configure scoring.
Scenario Selection and Listing
Use these flags to list or select the scenarios included in a run.
Domain filtering is a literal prefix match, so --domain tau2_telecom selects only the
tau2_telecom__… scenarios. The parallel workflow-policy registration is a separate domain,
--domain tau2_telecom_workflow. The four benchmark domains carry 50 (eva_airline), 50
(tau2_airline), 114 (tau2_retail), and 114 (tau2_telecom, mirrored by
tau2_telecom_workflow) scenarios. For domain details, refer to
Benchmark Domains.
Connection and Audio
Use these flags to configure bot endpoints, result storage, and audio streaming.
Run Control
Use these flags to set scenario limits, resume runs, and control matching behavior.
--min-agent-turns is a stall filter for runs where the LLM backend hung. Scenarios below the threshold
are counted as failures in the composite success rate and skipped in the per-signal rates
(action-match, DB-state, NL-assertion) — they are not dropped from the run. Under --resume they are
additionally treated as in-flight and re-run. The turn count comes from the live-recorded
token_usage.agent.n_calls in metrics.json, falling back to the saved agent LLM context for older runs.
LLM Judge
Use these flags to connect and configure the optional LLM judge.
The runner constructs the judge only when both --judge-url and --judge-model are nonempty. Passing an
empty string to either option disables judging for the run. Judge thinking is always enabled and is not
exposed as a flag. Changing that behavior would silently change score semantics across runs.
The runner validates numeric options before the run starts. A violation exits through parser.error
(status 2):
The runner passes --judge-temperature and --judge-seed through without validation.
Exit Codes
The evaluation driver exits with one of the following status codes.
Invocation Record
Every run writes run_args.json into the session directory with the shape
{"invocations": [...]}. Each entry records:
started_atand the rawargv.- The parsed arguments, with the judge API key redacted.
- The resolved scenario names and count.
A --resume invocation appends a new entry and
soft-checks it against the previous one on the scoring-relevant fields domain, scenarios, duration,
judge_url, judge_model, judge_threshold, judge_max_tokens, judge_temperature, judge_top_p,
judge_seed, and strict_match. Mismatches log a warning but do not block the run.
For result artifacts (all_metrics.json, all_summary.txt, and per-scenario metrics.json), refer to
Reading Results and the Metrics Dictionary. For the
six scoring signals, refer to Scoring.
check_resume.py
Use check_resume.py to classify a finished or interrupted session directory without moving or deleting
anything. The script applies the same classification as the runner, so its output predicts what --resume
would do.
The --min-agent-turns default here is 0, unlike the runner’s 3. Pass the same value you intend to
use with --resume if you want the preview to match.
Each subdirectory is bucketed into one of three states:
Directories already named *.killed.* or containing __KILLED__, and top-level files such as
run_args.json and evaluation_log.txt, are ignored. The script prints per-bucket counts followed by the
re-run and fresh lists, with the classification reason next to each re-run entry.
For the resume workflow, refer to Resuming a Run.