Skip to content
Section · Troubleshooting & FAQ

Troubleshooting & FAQ

Common problems and their fixes, frequent questions, and a glossary of the terms used in Duet.

Troubleshooting

I can't sign in.

Use the address your administrator gave you, and on a local setup open http://localhost:3000, not 127.0.0.1. There is no public sign-up: an administrator creates accounts. After many failed attempts, sign-in is paused for a while for your address; wait and try again.

The launch says “Some scenarios cannot run”.

A scenario is missing what the caller needs: a voice connection, or a chat model for the evaluator (an Azure OpenAI connection needs a chat deployment for that). Open the scenario, go to 7 · Evaluator, fix the connections and launch again.

My run failed with “Could not connect to the agent”.

Duet could not reach the WebSocket URL. Check it on the agent page and press Run connection test. Use wss:// for remote agents; ws:// only works for local addresses such as localhost.

“The agent never became ready” or “Protocol error”.

The connection opened but the session did not start, or Duet did not recognise the agent's protocol. Check the Channel ID, User ID and Origin (re-importing a fresh cURL is the easiest way), and try setting Protocol to the one your agent speaks instead of Auto-detect.

“Speech synthesis failed” or “The evaluator model failed”.

The caller's voice or chat model returned an error. Open Settings → Connections and press Test connection on the connections the scenario uses. A realtime evaluator on Azure OpenAI also needs a realtime deployment for the model you chose.

My text agent fails with “Access denied (HTTP 403)”.

The agent's channel refused the message. On an API channel the vivi-api-key is missing (a wrong key gives HTTP 401 instead): set Authentication to API key and save the key. On a WEB channel, such as the portal's testing channel, the Origin is checked: leave Origin empty or set it to the portal or one of the channel's allowed domains. A 403 also comes when the workspace's subscription is not active.

My text agent fails with “The agent refused the message (HTTP 422)”.

API and WEB channels require the threadId to be a UUID. Duet always sends one, so a 422 usually means the base URL or channel points to a different service; check them, or re-import a fresh cURL, and press Run connection test.

“The agent's stream ended before the reply finished (no on_chat_end event)”.

In Stream mode every reply must end with the on_chat_end event. A stream that stops without it is a failure: the agent errored mid-reply (a context that grew too long sends a short message and then stops). The run fails, and the report keeps the partial reply marked Reply broke off. Check the agent's traces for that thread ID. An agent with a response schema cannot stream at all (HTTP 409): switch it to Invoke.

The judgement is taking a long time.

Without Langfuse it usually takes a few minutes. With Langfuse, Duet waits until the agent's traces stop changing, which can take up to about 20 minutes after the call. The report shows how long it has been waiting.

A criterion says “Traces unavailable”.

It is a trace criterion, but Duet found no traces. Link a Langfuse connection to the agent, check that your agent uses the run's thread ID as its Langfuse session id, then Re-judge the run.

The caller never interrupts, even though I set interruptions.

Interruptions only work with agents on the Realtime protocol; on others the run shows a warning instead. Also check that the agent's reply was longer than the interruption point.

The same scenario gets different scores.

Some variation is normal: every call is a new conversation. Launch 3 or more runs and compare them. If one criterion keeps changing or shows Judges disagreed, rewrite it more concretely. See writing good criteria.

I can't delete an agent.

An agent can only be deleted when no scenario uses it. Delete or move its scenarios first.

I lost an API key.

Keys are shown only once and cannot be recovered. Create a new one, update your scripts, and revoke the old key.

Frequently asked questions

Does editing a scenario change past results?

No. Every run keeps a snapshot of what it was launched with. Re-run the scenario to try the new version.

How much does a run cost?

Each run uses your agent (a real session), the evaluator's chat model (and, for calls, its voice or realtime model), and the judge (3 model calls per judgement). The cost depends on your providers and the call length; the launch panel shows how many calls you are about to make. Each run report shows the evaluation's approximate cost (evaluator and judge) from the prices under Settings → Model prices.

Can I stop a call?

Yes: End call (End conversation for a text agent) in the live view, Cancel run on a run, or Stop all for a whole batch. Cancelled runs are not judged; finished runs keep their results.

Can I download a recording?

Yes. On the run report, Download conversation .wav gives you both voices on one timeline. Under Separate tracks you can also get each side on its own (those two files are not aligned in time).

Which languages can the caller speak?

The language of the persona's locale, like en-US or es-MX, as far as the voice and chat models support it.

Can I use Azure AI Speech for the caller's voice?

Not yet. You can store an Azure AI Speech connection, but use OpenAI or Azure OpenAI as the voice for now.

Is there a light theme?

Yes. Pick System, Light or Dark in the app under Settings → Preferences, on the sign-in page or in this guide's header. System follows your device. The choice is remembered in this browser only.

Can I use the app in Spanish?

Yes. Pick EN or ES in the app under Settings → Preferences, on the sign-in page or in this guide's header. The app's screens change language; your data, like scenario names and transcripts, stays as written.

Who can read this guide?

Anyone who can reach Duet: the guide and the API reference need no sign-in. Everything else in the app and the API does.

Glossary

Agent
The agent under test: a voice agent reached over its WebSocket, or a text agent reached over Vivi's channel API. Shown in blue.
Evaluator
Duet's simulated user. It plays a persona and pursues a goal, speaking with a synthetic voice to a voice agent or writing to a text agent. Shown in amber.
Scenario
One kind of call: the persona, goal, facts, success criteria, end conditions, interruptions and evaluator setup.
Persona
Who the caller is: a name, a language (locale), a temperament and notes on habits.
Batch
Everything created by one launch: one run per scenario and repetition.
Run
One real call between the evaluator and the agent, with its recording, transcript, timings and report.
Criterion
One thing a good call does, with a weight and an evidence source (transcript, timing or trace).
Must criterion
An essential criterion: if it fails, the call counts as failed whatever the score.
Band
The judge's 1-to-5 rating of a criterion, which fixes its points (25 to 100) and its verdict.
Judgement
The judge's result for one run: score, verdicts, evidence, suggestions and brief.
Brief
A Markdown note, ready to paste into a coding agent, that explains what to change in your agent and why.
Barge-in
Talking over the other side. The caller can be set up to cut the agent off mid-reply.
Latency
How long the agent takes to start answering after the caller stops speaking. For a text agent: from the user message to the first text (Stream) or the full reply (Invoke).
Thread ID
A fresh id for every run, also used as the agent's Langfuse session id. Use it to find the call in your agent's own logs.
Connection
Stored credentials for a provider (OpenAI, Azure OpenAI, Azure AI Speech or Langfuse). Secrets are never shown again.