Debug voice agents like software

Stop scrubbing recordings to find what broke. Every production call lands structured, scored, and searchable — transcript, per-stage latency, tool calls, Intents, and Outcomes. Then point your coding agent at it and ask why.

call_2a63c977ea87Failed
4m 12s34 turns$0.37
Transcript timeline01:12 · policy grounding
01:04“I bought it about two months ago and I’d like to send it back.”
01:12“You can return it any time within ninety days.”
01:21“Great, so I’m still inside the window then.”
01:26“Let me pull up your order and start that for you.”
Evals
Policy groundingFail
Intent capturedPass
TonePass
Latency budget4.8s

Works With

Custom Stack

Works With

Custom Stack

Works With

Custom Stack

Call Records

Every call is a record you can query and debug.

Intent, outcome, extracted fields, cost, and eval verdicts are resolved on ingest. Open any call and see the same data laid out turn by turn — transcript, audio, per-stage latency, tool calls, and state transitions. Everything in the UI is available through the API.

Classified on arrival

Intent, outcome, sentiment, extracted fields, cost, and eval verdicts are resolved as the call comes in, so you can query them immediately.

Red flags you define

Create a rule from any eval or metric and Tuner tags every matching call. Define it once, then use it across your production traffic.

Filter by what happened

Find calls by intent, outcome, sentiment, eval result, red flag, cost, duration, agent version, or any metadata you send.

Verdict with evidence

See the transcript evidence behind every eval result, so you can understand why a call passed or failed instead of trusting an unexplained score.

Full API access

Anything you can inspect in Tuner can be pulled programmatically into your own tools, workflows, or debugging agents.

Tuner · Call logs14 of 1,284
failedintent: refundv2.4.1red flag
call_2a63c9failed
Refund policy question$0.37
hallucination
call_2a63d1failed
Order status$0.52
tool timeout
call_2a63e4resolved
Appointment reschedule$0.21
call_2a63f0resolved
Transfer to human$0.18

Voice Metrics

Every silence has a source.

Tuner breaks every turn into the stages your voice pipeline actually runs — endpointing, transcription, model, and speech — so you can see where the silence came from.

Stage-level breakdown

Break every turn into endpointing, STT, LLM, and TTS and see exactly how long each stage took.

Endpointing measured

See when turn detection waits too long or cuts the caller off. Endpointing delay gets its own number instead of disappearing into overall latency.

See typical and worst-case latency

Compare p50 and p90 to tell whether latency is consistently high or a smaller number of calls are dragging the experience down.

Dead Air and Longest Monologue

See how long callers wait for a response and how long the agent speaks before giving the caller a turn.

Tuner · Voice metricslast 7 days
Latency by stagep50 → p90
EOU
0.08 → 0.34s
STT
0.24 → 0.57s
LLM
0.54 → 1.92s
TTS
0.19 → 0.41s
01s2s3s
P50 · typical
1.2s
Healthy
P90 · worst case
3.37s
Investigate

Diagnose

Ask why. Get an answer.

Tuner exposes an MCP server. Point Claude Code or Cursor at it and ask what's breaking. It can inspect the affected calls, look for patterns across the full window, and write the evals and alerts that catch the problem next time.

Read the affected calls

Search logs, red flags, eval results, and stage latency across the full time window instead of relying on a sample.

Trace the problem to its source

Find the calls behind a pattern, understand what's going wrong, and see the evidence supporting the diagnosis.

Create the checks that catch it

Turn what you found into evals, call outcomes, and alert rules directly from the same conversation.

tuner-mcp · claude codeconnected
youwhy is refund policy failing?
tunerRead 1,284 calls · 61 refund-policy calls · 36 failures.
Root cause: the prompt says "within 90 days"; the retrieved policy says 30.
Confidence high. 34 of 36 failures cite the same line. Introduced in v2.4.1.
tunerWrote eval policy_grounding, outcome refund_denied, alert to #voice-ops.

Dashboards

The patterns you'll never hear on a single call.

One call tells you something went wrong. Hundreds show you what's actually broken, what it's costing you, and whether the fix worked.

See success by intent

Break down outcomes across intents and see which types of calls consistently resolve and which ones fail.

Know the cost of every call

See what successful and failed calls cost, and understand how agent behavior affects your spend.

Compare versions side by side

Compare success rate, latency, cost, and other call metrics across agent versions before and after a deployment.

See what's driving failures

Rank red flags and failed evals by frequency to see which failure modes are having the biggest impact.

Tuner · Overviewlast 30 days
Success by intent
Order status
96.4%
Reschedule
91.2%
Billing dispute
74.0%
Refund policy
41.3%
Transfer to human
88.1%
Version comparisonv2.4.0 → v2.4.1
Metric2.4.02.4.1Δ
Success rate88.4%93.2%+4.8
TTFB p902.91s3.37s+0.46
Cost per call$0.31$0.28−0.03

Traces

The same timeline, as OpenTelemetry spans.

Everything on the call timeline is emitted as standard OTel spans — turns, pipeline stages, tool calls, workflow steps — so voice appears in the same waterfall as the services around it.

Export standard OTel spans

Voice spans export to Datadog, Grafana, or any OTLP compatible backend, no custom shim.

Trace every turn

Capture the arguments, response, and duration for each turn as a span in the trace.

Keep workflow context

For graph-based agents, see state changes and workflow steps directly in the conversation trace.

Tuner · Tracesotlp → datadog
turn 8 · agent7.63s total
eou.detect
0.34s
stt.transcribe
0.57s
llm.completion
0.71s
tool.crm_lookup
4.80s
llm.completion
0.80s
tts.synthesize
0.41s
02s4s6s8s
Spantool.crm_lookup
otel.status_codeERROR
peer.servicecrm-api
gen_ai.systemopenai
duration4.80s

Data Control

Keep the insight. Drop the PII.

Redaction runs before analysis and before storage. The unredacted transcript is never written.

Choose what gets redacted

Redact names, phone numbers, email and street addresses, card numbers, and other sensitive fields according to your policy.

Set your retention policy

Choose what data Tuner keeps and how long it stays available.

Apply it across the workspace

Set the policy once and apply it across every agent in the workspace.

Keep data where you need it

Store voice data in the EU, UK, or on-prem.

Tuner · Ingestredaction on
Inbound
"Hi, this is Maria Delgado,
my card ending 4021 was
charged twice at 14 Almond Row."
Stored
"Hi, this is [NAME],
my card ending [CARD] was
charged twice at [ADDRESS]."
intent kepttiming kepttool calls keptevals kept

Connect

Get connected in five minutes or less.

No-code

~2 mins

Retell, Vapi, Dograh. Add a key. Calls sync automatically.

SDKs

~5-10 mins

LiveKit, Pipecat, or your own Python stack. Two lines, and you get timing your platform can't give you.

API

~30 mins

Any language, any voice stack.

Connect

Get connected in five minutes or less.

No-code

~2 mins

Retell, Vapi, Dograh. Add a key. Calls sync automatically.

SDKs

~5-10 mins

LiveKit, Pipecat, or your own Python stack. Two lines, and you get timing your platform can't give you.

API

~30 mins

Any language, any voice stack.

Connect

Get connected in five minutes or less.

No-code

~2 mins

Retell, Vapi, Dograh. Add a key. Calls sync automatically.

SDKs

~5-10 mins

LiveKit, Pipecat, or your own Python stack. Two lines, and you get timing your platform can't give you.

API

~30 mins

Any language, any voice stack.