All benchmarks

τ³-bench (half-duplex voice)

Retail — order support

The identical retail tasks, spoken end to end through the real speech pipeline. The gap against the text run is the cost of hearing instead of reading.

20.0%1 of 5 tasks
95% CI 3.6–62.4%
VoicePreliminaryIndependent judge — τ²-bench database-state checker

Ran on

claude-haiku-4-5

the cheapest and fastest model in its family

provider Anthropic

The harness pinned nothing — no model, no provider, no reasoning-depth or speed setting. Those request controls did not exist on the benchmark endpoint when these runs were made, so every arm inherited the production deployment default.

Read from the deployment default in force on each run date, not from the run's own record: the endpoint did not report which model served a turn until after these runs, and no run artifact names one. Automatic failover to the secondary provider (Gemini 2.5 Flash) is logged but not recorded per turn, so we cannot rule out that a small fraction of turns was served by it.

Spoken through

recognition the production speech configuration — a third-party engine chosen by language routing; the run does not record which

synthesis the production synthesis configuration; the run does not record which engine served it

Whissle metadata head — not in the path

Whissle's metadata head — the emotion, intent and entity tags our cascade emits beside the transcript — is not deployed in production, so it was not in the path for any spoken run on this page. These numbers were set without it.

Established by an audit of the production speech configuration, not recorded by the run. The runs log no engine per session, so we can state the configuration they ran against but not which engine served any individual turn.

No published comparator

Run 6 August 2026.

Results

Every metric this run produced

Headline first, then the breakdown. Each row carries the sample it was computed over and its interval — or an explicit statement that there isn't one, which on a small run is the more useful fact.
Headline and per-dimension metrics for this run, with sample size and confidence interval for each.
MetricValueSampleInterval
Pass^1Headline95% Wilson score interval, computed here from the pass count. The harness does not emit an interval; this is derived, not reported.20.0%1 of 5 tasks95% CI 3.6–62.4%
Tool calls round-trippedThe agent reached for the right tools and persisted through failures.165 tasksNo interval — N=5 is too small to bound
Judged agent errorsAcross all five sessions. These are outcome failures, not conduct failures.05 tasksNo interval — N=5 is too small to bound
Sessions ending naturallyEvery task terminated on a normal user stop — nothing hung or crashed.100.0%5 of 5 tasksNo interval — N=5 is too small to bound
Reproduce

Run this yourself

The harness, the task suites and the raw trajectories are public, and the API these ran against is the same one your agents run on. You do not have to take the number.

You will need: Node 18+ and uv. A Whissle workspace key (Settings → API keys on whissle.ai) and an agent id, plus a key for the benchmark's own user simulator — that simulator is τ²-bench's, not ours, and the harness calls it directly.

git clone https://github.com/WhissleAI/tau2-bench-w && cd tau2-bench-w
uv sync
export WHISSLE_BASE=... WHISSLE_AGENT_ID=... WHISSLE_API_KEY=...

# half-duplex voice: <domain> <tasks> <concurrency> <max-steps>
./run_hd.sh retail 5 2 40

Concurrency 2 is not a default worth changing — higher triggers upstream rate limiting, which pollutes the score rather than measuring the agent.

Running a benchmark straight from the Whissle CLI is on the roadmap and does not exist yet — the CLI manages agents, calls and records today, and we are not going to print a command on this page that would fail when you paste it. Until it lands, the harness above is the path.

Comparison

What we measured against

A comparison is only a comparison when the two numbers come from the same experiment, on stated arms. We split the figures accordingly — produced on this harness with only the agent swapped, or published elsewhere — and both sides name their model.

Our arm in every row below

Whissle ran on

claude-haiku-4-5

the cheapest and fastest model in its family

provider Anthropic

The harness pinned nothing — no model, no provider, no reasoning-depth or speed setting. Those request controls did not exist on the benchmark endpoint when these runs were made, so every arm inherited the production deployment default.

Read from the deployment default in force on each run date, not from the run's own record: the endpoint did not report which model served a turn until after these runs, and no run artifact names one. Automatic failover to the secondary provider (Gemini 2.5 Flash) is logged but not recorded per turn, so we cannot rule out that a small fraction of turns was served by it.

Scoring 20.0% over 5 scored tasks. Where a row below names a different model, that difference is listed with the others.

No setup-matched baseline yet

We have not yet run another model through this exact harness — same domain, same task set, same user simulator, same pass^1, same concurrency — so there is no head-to-head to show. Published figures for other systems appear below for context, greyed, with the reasons they are not directly comparable. When a matched run lands it will appear here as a real comparison.

Nobody publishes a comparable figure for this benchmark at this modality, so we show none. An invented comparator would be worse than an empty column.

Exclusions

What was thrown away

The easiest way to improve a benchmark score is to drop the cases that went badly. Here is the arithmetic, so you can check we didn't.

Attempted

5

Scored

5

Excluded

0

None excluded — the sample is the whole attempt.

Nothing was excluded. All five sessions established, ran and ended naturally, so there was nothing to drop — which also means the 20.0 is not flattered by a quiet exclusion.

Comparability

What this number can and cannot be put beside

Derived from the run's own configuration rather than written by hand, so it cannot drift away from the result it describes.

Five tasks, one trial each, one simulated customer. The name-recognition failure is one sample repeated, not four independent ones. This number is enough to diagnose and not enough to claim.

Comparable with

  • Other runs of this same benchmark on this page, at the same modality (Voice).
  • Runs of this benchmark on the same arm — claude-haiku-4-5 (the cheapest and fastest model in its family). A run on a different model is a different experiment.
  • Other Pass^1 figures — one attempt per task, no best-of-n.

Not comparable with

  • Any external leaderboard — no published figure exists for this suite at this modality, so we show none.
  • Text-modality leaderboards. The tasks are the same but the input is spoken, which is a strictly harder problem.
  • Any figure produced with Whissle's metadata head in the path. It was not in this one — the run used the production speech configuration, and that head is not deployed there.
  • Anything requiring a confidence interval. N=5 is diagnostic, not conclusive.
Sample cases

What passing and failing look like

A pass rate tells you how often. These tell you what happened. Excerpts are recorded artifacts from the run — where we have no publishable transcript we say so rather than reconstructing one.

Failures (2)

Authentication failed on the customer's own name

Fail

Speech recognition on a spelled-out identifier

The agent reached for the right tool with the right arguments. The postcode came through correctly; the name did not, and one wrong field was enough to miss the lookup. The mangling is deterministic across sessions, so this is a recognition ceiling rather than a flaky session.

Recorded tool call from the run trajectory — not a transcript

Tool call
find_user_id_by_name_zip → { first_name: "Youssef", last_name: "Rossi", zip: "19122" }
What the agent asked for, built from what it heard.
Record
The customer is yusuf_rossi_9620.
The postcode was heard correctly. The name alone was enough to miss.

A failure that has nothing to do with voice

Fail

Reasoning — availability not applied to a count

This task authenticated cleanly and made ten correct tool calls. It then counted twelve t-shirt variants, two of which were flagged unavailable, and reported twelve. It would fail identically in text. Attributing every voice loss to speech recognition would have hidden a real product bug, so it is called out by name.

Recorded outcome from the run trajectory — not a transcript

Agent
Reported 12 available variants.
Two of the twelve were flagged unavailable. The correct answer was 10.
History

The same benchmark over time

Whether we are actually getting better is a question one number cannot answer. Every run we publish stays on the record, including the ones that went backwards.

One run on record

One run on record — there is no trend to read yet. The next run lands here alongside it. A trend needs at least two runs on the same scenario set — anything less is a point, not a direction.
Every recorded run of this benchmark, oldest first, with its score, sample size, exclusions and the model configuration it ran on.
Run dateScoreScoredExcludedRan onStatus
6 Aug 202620.0%(1 of 5)50claude-haiku-4-5Preliminary
Methodology

How this run was produced

Enough detail to argue with, and enough to reproduce.
Agent under test
The same production Whissle agent stack as the text run, driven end to end over a real WebRTC session through the full speech-understanding → agent → speech-synthesis cascade.
How it was run
Half-duplex — one turn at a time. The simulated customer's turns are spoken aloud by a third-party synthetic voice, so our speech recognition hears audio it has never been tuned on. Tool calls are delegated back to the benchmark so it stays the authority on tools and scoring.
Model config
Model claude-haiku-4-5Provider Anthropicthe cheapest and fastest model in its family, in its own vendor's lineup.The harness pinned nothing — no model, no provider, no reasoning-depth or speed setting. Those request controls did not exist on the benchmark endpoint when these runs were made, so every arm inherited the production deployment default.Read from the deployment default in force on each run date, not from the run's own record: the endpoint did not report which model served a turn until after these runs, and no run artifact names one. Automatic failover to the secondary provider (Gemini 2.5 Flash) is logged but not recorded per turn, so we cannot rule out that a small fraction of turns was served by it.
Speech path
Recognition the production speech configuration — a third-party engine chosen by language routing; the run does not record whichSynthesis the production synthesis configuration; the run does not record which engine served itWhissle metadata head — not in the path.Whissle's metadata head — the emotion, intent and entity tags our cascade emits beside the transcript — is not deployed in production, so it was not in the path for any spoken run on this page. These numbers were set without it.Established by an audit of the production speech configuration, not recorded by the run. The runs log no engine per session, so we can state the configuration they ran against but not which engine served any individual turn.
Judge
Independent judge — τ²-bench database-state checker. The benchmark owns the tools, the task database and the scoring. It checks whether the world ended up the way the task required — not whether a transcript reads well, and not anything we supply. We only provide the agent.
Sampling
Five-task subset. The selection was not randomised and carries no seed — it was chosen to diagnose, not to estimate. Population: The τ²-bench retail domain (114 tasks). No seed — the selection was not randomised. 1 attempt per task.
Run date
6 August 2026
Harness commit
Not recorded for this run. Newer runs pin the commit.
Cost
Not recorded for this run.
Retail — order support — τ³-bench (half-duplex voice) (Voice) · Whissle