Home/Docs/Overview

Hotato docs

Open-source, self-hosted conversation QA for voice agents. Verify task outcomes and policy, catch voice failures, and keep every result reproducible on your own infrastructure — five dimensions, never one blended score, with the evidence behind every result.

0s1s2s3s4s5s6sCallerAgentonset
fd-01-missed-interruption · one of the two recorded calls swept by uvx hotato start --demo, against a live agent on a provider’s default settings. The caller takes the floor at 2.00s with a half-volume “sorry, one second”; the agent keeps talking straight through it (talk_over=0.25s, did_yield=false). This is the per-event timeline the report draws for every scored moment.

What it is

MIT, zero-install CLI plus an MCP server and a self-hosted workspace. A conversation test checks a call across five dimensions — Outcome, Policy, Conversation, Speech, Reliability — using seventeen deterministic assertion kinds and a separate advisory model judge. Pass, fail, or inconclusive; a non-zero exit gates CI. Never one blended score.

Deterministic checks read the trace, the system of record, or the audio and run no model. Turn-taking timing measures energy over time, not intent — no speaker ID, diarization, transcription scoring, or emotion detection. How it works covers the method.

Five ways to run it

The demo catches a failure with zero setup; a conversation-test scores your own call across the five dimensions. Verdicts come only from scoring your own call.

bash
# 1) zero-setup first run: sweep the bundled calls, mint + verify a failure contract
uvx hotato start --demo

# 2) the atomic unit: author a conversation-test.yaml, then score a call across five dimensions
uvx hotato scenario init refund-flow --out refund.conversation-test.yaml
uvx hotato test run refund.conversation-test.yaml --agent support-v3 --transcript call.json --trace trace.jsonl

# 3) score your OWN call: capture auto-pulls the dual-channel recording, then scores it offline
uvx hotato capture --stack vapi --call-id <id>

# 4) the 5-minute path: score, render the visual report, open it, one command
uvx hotato doctor --stereo call.wav

# 5) connect once, then rank candidate moments across recent calls
uvx hotato connect vapi
uvx hotato sweep
Synthetic is a floor

Synthetic audio: a floor and regression guard, not production accuracy. Trust it only after running your own calls.

Where to go next

See it fail (demo)

A bad agent, caught talking over.

Watch →

Getting started

Author a conversation-test.yaml and score a call across five dimensions, offline.

Start →

The regression loop

A bad call becomes a permanent regression test.

Loop →

The closed loop

Analyze a folder or sweep your recent calls, then patch, verify, and prove the fix.

Close it →

Capture your calls

Pull your recording, then score it.

Capture →

Live probe calls

One default config, twelve calls: three talk-overs a clean transcript hid.

See the results →

How it works

Five dimensions, two lanes, and the turn-taking timing engine behind Conversation.

Method →

Visual report

Per-event timelines, analytics, a frame inspector, one file.

Report →

Team trends

Pass rate over time; mean/median/p90 across runs.

Trends →

Research export

events.csv, frames.csv, envelope.json, documented in-file.

Export →

MCP tool

An agent or IDE runs the same tests.

MCP →

CI integration

A sticky PR comment, and a gate on regression.

CI →

Pytest plugin

A fixture and a session gate, auto-registered.

Pytest →

Tiered suites

112 deterministic scenarios; defect suites must fail.

Suites →

Contributing

The best contribution: a labeled call, kept as a fixture.

Contribute →