July 9, 2026
Added
Self-Hosted audio mode — bring your whole voice stack
Self-Hosted mode gains a second variant: audio ("type": "audio"). Dial pipes the raw call audio to your WebSocket server, full duplex, over the new Self-hosted audio protocol — you bring the entire voice pipeline: a speech-to-speech model (OpenAI Realtime, Gemini Live, …) or your own STT → LLM → TTS chain. The existing bring-your-own-LLM variant is unchanged and now documented as the Self-hosted LLM protocol.
The protocol is a small JSON-over-WebSocket contract: media frames both ways (base64 audio, ~20 ms inbound cadence), mark/clear for playback checkpoints and barge-in, dtmf digits, a duration_warning before the max-duration cap, end_call/call_ended, keepalive, and mid-call reconnection with state restore. Audio formats are configurable per direction — G.711 (μ-law/A-law) or linear PCM at 8, 16, or 24 kHz — chosen to hit the zero-transcode path of common realtime voice APIs.
Changed
Per-mode Self-Hosted configuration
Each variant now keeps its own configuration — URL, signing secret, and (for audio) formats — so you can stage one mode while the other drives calls, and switch without re-entering anything. GET /api/v1/self-hosted returns both configs alongside enabled and activeMode; changes are made with a single action-based POST /api/v1/self-hosted — save (persist a mode’s config), activate (save it and route calls through it), or disable. The signing-secret reveal endpoint takes a mode query parameter.