Voice Daemon Runbook
Purpose
Operate the Phase 48 voice stack safely across the compatibility runtime and the standalone sidecar.
Current Runtime Modes
stub: session lifecycle works end to end for UI, policy, auth, and shutdown handlingsidecar: session lifecycle is delegated to the standaloneagent33.voiceFastAPI sidecarlivekit: intentionally rejected in the current runtime and reserved for the Phase 48 sidecar
Required Engine Settings
VOICE_DAEMON_ENABLED=true|falseVOICE_DAEMON_TRANSPORT=stub|sidecar|livekitVOICE_DAEMON_URLVOICE_DAEMON_API_KEYVOICE_DAEMON_API_SECRETVOICE_DAEMON_ROOM_PREFIXVOICE_DAEMON_MAX_SESSIONSVOICE_SIDECAR_URLVOICE_SIDECAR_PROBE_TIMEOUT_SECONDSVOICE_SIDECAR_VOICES_PATHVOICE_SIDECAR_ARTIFACTS_DIRVOICE_SIDECAR_PLAYBACK_BACKEND
For local validation, use:
VOICE_DAEMON_ENABLED=true
VOICE_DAEMON_TRANSPORT=stub
VOICE_DAEMON_ROOM_PREFIX=agent33-voice
VOICE_DAEMON_MAX_SESSIONS=25
For standalone sidecar validation, use:
VOICE_DAEMON_ENABLED=true
VOICE_DAEMON_TRANSPORT=sidecar
VOICE_SIDECAR_URL=http://127.0.0.1:8790
VOICE_SIDECAR_VOICES_PATH=config/voice/voices.json
VOICE_SIDECAR_ARTIFACTS_DIR=var/voice-sidecar
VOICE_SIDECAR_PLAYBACK_BACKEND=noop
Start the sidecar locally with:
python -m agent33.voice main --host 127.0.0.1 --port 8790
or, when the engine package entrypoint is installed:
agent33-voice-sidecar main --host 127.0.0.1 --port 8790
Tenant Policy Controls
Use the multimodal tenant policy endpoint to tune voice access:
voice_enabledmax_voice_concurrent_sessionsmax_voice_session_seconds
max_voice_session_seconds is currently recorded on each session for operator budgeting,
but the stub runtime does not auto-expire sessions yet. Stop or reconnect sessions
manually when they exceed the expected duration.
Example:
{
"voice_enabled": true,
"max_voice_concurrent_sessions": 1,
"max_voice_session_seconds": 1800
}
Operator Actions
List sessions
GET /v1/multimodal/voice/sessions
Use this to:
- find currently active tenant-scoped sessions
- locate a
session_idbefore deeper inspection or stop requests
Get session details
GET /v1/multimodal/voice/sessions/{session_id}
Use this to inspect:
- session state
- room name
- transport mode
- last recorded startup error, if any
Start a session
POST /v1/multimodal/voice/sessions
Expected result:
- HTTP
201 - session state
active - transport
stubor configured transport
Inspect session health
GET /v1/multimodal/voice/sessions/{session_id}/health
Use this to confirm:
- session state
- daemon health boolean
- transport mode
- basic daemon counters or sidecar snapshot details
Check sidecar and status-line health
Use:
GET /healthGET /v1/operator/status
Expected additional health services:
voice_sidecarstatus_line
Expected additional operator inventory:
voice_sessions
Stop a session
POST /v1/multimodal/voice/sessions/{session_id}/stop
Expected result:
- HTTP
200 - session state
stopped
Failure Modes
503 voice runtime is disabled
Cause:
VOICE_DAEMON_ENABLED=false
Resolution:
- enable the runtime or leave the voice tab disabled for the environment
503 livekit transport is deferred to the Phase 48 voice sidecar; use the stub transport in the current runtime
Cause:
VOICE_DAEMON_TRANSPORT=livekitwas selected in the current in-process control plane
Resolution:
- switch back to
stubfor the current runtime - keep LiveKit credentials only for the future sidecar deployment path
503 voice runtime could not start session with VOICE_DAEMON_TRANSPORT=sidecar
Cause:
- the main API runtime could not create the remote sidecar session
VOICE_SIDECAR_URLis unset, unreachable, or the sidecar returned an error
Resolution:
- confirm the sidecar is running and
GET {VOICE_SIDECAR_URL}/healthreturns200 - confirm
VOICE_DAEMON_TRANSPORT=sidecar - inspect
var/voice-sidecar/<session_id>/artifacts on the sidecar host for session evidence
503 voice runtime could not start session
Cause:
- the configured transport failed during daemon startup
Resolution:
- inspect engine logs for the specific startup failure
- switch back to
stubuntil the failing transport or daemon factory is fixed
400 voice session limit exceeded
Cause:
- tenant hit
max_voice_concurrent_sessions
Resolution:
- stop the active session or raise the policy limit explicitly
Shutdown Behavior
Active voice daemon sessions are stopped during FastAPI lifespan shutdown. When VOICE_DAEMON_TRANSPORT=sidecar, the compatibility daemon asks the standalone sidecar to stop the remote session first and the sidecar persists per-session artifacts under VOICE_SIDECAR_ARTIFACTS_DIR.