Live practice
A human talking to the simulated customer in real time, over a WebSocket.
wss://your-host/api/nn-coach/live?token=<session-token>&scenario_uuid=<uuid>&mode=voice
The token goes in the query string because a browser WebSocket cannot set headers — the same reason the other binaries' live sockets work this way.
Parameters
| Param | Required | Notes |
|---|---|---|
token | ✓ | Session token |
scenario_uuid | ✓ | Which scenario to practise |
mode | — | voice for spoken practice; anything else is text |
rep_name | — | The trainee's name, used in the transcript |
proxy_model | — | Overrides the service default |
tts_provider | — | Overrides the service default |
agent_opens | — | Overrides the scenario's setting |
| Status | Cause |
|---|---|
401 | {"detail": "invalid or expired token"} |
404 | No such scenario in your organization |
Health
GET /api/nn-coach/live/health
{ "available": true, "proxy_model": "x-ai/grok-4.3", "turn_timeout_sec": 600 }
available reports whether live practice can run on this deployment.
How it differs from a run
| Run | Live practice | |
|---|---|---|
| Who plays the rep | An LLM | A person |
| Transport | HTTP, asynchronous | WebSocket, synchronous |
| What it tests | The deployed agent's prompt | The trainee |
| Scored | Yes | Yes, when the call ends |
A run is a regression test. Live practice is training. They share personas, scenarios, and the rubric, so a team practises against exactly the customers the prompts are tested against.
Voice mode
In voice, the trainee speaks and the persona replies through TTS, with the
persona's speech_profile shaping pace, fillers, and whether they interrupt.
A persona with interrupts_agent: true talks over a trainee who runs long —
which is the whole point of practising against them.
Text mode is the fallback when a deployment has no speech providers configured, and it is faster to iterate on wording with.