0 only if every
assertion passes, and writes a JSON report with per-turn metrics.
Evaluation runs against a real agent over the same runtime path a live call
uses — the same speech-to-text, language, and speech providers your agent runs
with — so a green run reflects real behavior, not a mock.
Write a scenario
A scenario is JSON: who the caller is, which agent to test, the scripted turns, and the assertions on each turn (and on the call as a whole).agent_key to the agent you built in the console (or "" to smoke-test the
default speech-to-text → language → speech pipeline with no agent configured). A
turn is either scripted user text (spoken through the TTS provider) or a wav
fixture (PCM16, mono or stereo, any sample rate) when you need a specific voice,
accent, or noise profile.
Assertion types
Each turn carriesexpect assertions; the call carries call-level
expectations judged against the whole transcript.
Latency gate: the gap from the caller’s last speech frame to the agent’s first
audio frame must be under
ms. Catches a slow agent before your users do.Case-insensitive regex over the agent’s transcript for that turn. Good for
must-say phrases, disclosures, or IDs.
LLM-as-judge: the configured judge model returns a strict
{ "pass": bool, "reason": string } verdict against your plain-English criterion. It fails
closed — a malformed or flaky judge reply counts as a fail, so a bad judge
can never silently green a run.Assert the agent invoked a tool by
the end of the turn (optionally with certain argument values).
Preview — pairs with the runtime’s tool-call surface.
Metrics in the report
Every run writes a JSON report with per-turn timings, all measured client-side:| Metric | What it is |
|---|---|
latency_to_first_audio_ms | Caller’s last speech frame → agent’s first audio frame (the number your callers feel). |
agent_turn_duration_ms | Wall-clock length of the agent’s turn. |
agent_audio_ms | How much audio the agent actually spoke. |
| greeting latency | Connect → the agent’s first audio out. |
| call duration | Total scripted call length. |
Run an evaluation
Point at an agent
Build and save the agent in the console so its config is live, and note its
agent_key. To smoke-test with no agent, use agent_key: "" — the default
pipeline runs off your provider keys.Provide credentials
The simulated caller reuses the same provider clients your agent uses, so it
needs keys for the TTS, ASR, and judge providers in your scenario (e.g.
Deepgram, ElevenLabs, OpenAI) — set them in the environment.
Run the evaluator
Point the evaluator at your engine and scenario and run it. It connects,
plays the scripted call, grades every assertion, and writes the report.
Today the evaluator ships as a standalone binary you run against a
self-hosted or managed engine; the
telequick eval wrapper is the
convenience entry point. See Self-Hosted deployment
for running it against your own engine.Gate your CI on it
Because the run is a single command with a meaningful exit code, drop it into CI to block a regression before it ships:Related
Turn Detection & Barge-in
Tune what your latency and barge-in assertions are testing.
Tool Calling
The tools that
function_call assertions check for.Runtime Configuration
The agent config an evaluation runs against.
Latency Breakdown
Compare bench latency to production.