Configuration
Setpipeline_mode: "s2s" in the agent config. The stt, llm, and tts fields are ignored in S2S mode.
Options
Voices
- OpenAI Realtime — one of a fixed set:
alloy,ash,ballad,coral,echo,sage,shimmer,verse. An unknown voice is rejected on create. - Gemini Live — any Gemini-supported voice (e.g.
Aoede,Charon,Kore,Puck,Zephyr, and more). The set grows per model, so TurnCall doesn’t allowlist it — Gemini validates the voice when the session connects.
Gateways and third-party models
Theopenai provider speaks the OpenAI-Realtime WebSocket protocol — and so do OpenAI-Realtime-compatible gateways (Vercel AI Gateway, LiteLLM) and xAI direct. Set s2s.base_url to route the realtime connection through one; provider-prefixed models like xai/grok-voice-think-fast-1.0 or openai/gpt-realtime-2 then flow over the same protocol — no new provider, same pipeline.
Two requirements:
1
Allowlist the gateway URL
base_url is an outbound target, so it’s gated by the same SSRF guard as custom LLM endpoints. Add its wss:// pattern to BYOM_ALLOWED_URL_PATTERNS, e.g. ["wss://ai-gateway.vercel.sh/*"]. A base_url outside the allowlist is rejected before the call starts.2
Use the gateway key
Set
OPENAI_API_KEY to the gateway’s API key — it’s sent as Authorization: Bearer … on the WebSocket.When
base_url is set, the OpenAI voice allowlist is bypassed — the gateway routes to models with their own voice sets (e.g. Grok), which it validates upstream. Pass the target model’s own voice name.