Speech-to-speech vs. cascade
Not every agent should be speech-to-speech. A duplex model is the fastest and
most natural option, but a cascade (see
BYO ASR / LLM / TTS) gives you
independent control of each stage — swap the language model without touching
the voice, run a fine-tuned transcriber, or mix vendors. Choose duplex for
latency and naturalness; choose the cascade for control and model choice.
Supported models
| Provider | Config provider | Status | Notes |
|---|---|---|---|
| OpenAI Realtime | openai | Shipped | Server-side VAD, function calling, per-response greeting. |
| Gemini Live | gemini | Shipped | Prebuilt voices (Aoede, Charon, Fenrir, Kore, Puck); function calling. |
| xAI Grok Voice | xai / grok | Shipped | OpenAI-Realtime-compatible; server VAD + function calling. |
| Self-hosted duplex | omni | Preview | Bring your own open-weights duplex model over a realtime WebSocket on your GPUs — see Self-Hosted Inference. |
Configure a duplex agent
Set the entry node to REALTIME
A duplex agent has a single node. Set
entry_node: REALTIME and give it a
provider, a model, and a voice. There is no separate ASR or TTS stage to
configure.- OpenAI Realtime
- Gemini Live
- xAI Grok
- Self-hosted duplex
Supply per-tenant credentials
Each workspace supplies its own keys — they are stored per tenant and
never shared across workspaces. Set them in the agent console at
agent.telequick.dev, or via the control-plane API:| Provider | Credential |
|---|---|
openai | OpenAI API key |
gemini | Gemini API key |
xai / grok | xAI API key |
omni | Endpoint host (host[:port], default port 443) + optional bearer token |
Turn-taking on a duplex model
For aREALTIME entry node, TeleQuick Voice defaults to server_vad —
the provider does its own endpointing and emits speech_started /
speech_stopped, which the runtime wires to barge-in so in-flight audio is
cut the instant the caller talks. You do not add a local turn detector.
Some self-hosted duplex models have no server-side VAD. In that case the
runtime owns the turn boundary with a local detector and commits the input
buffer when the caller finishes — which also keeps backchannels (“ok”, “mhm”)
from waking the model. See
Turn Detection & Barge-In for the
knobs.
Greeting on inbound calls
Some carrier SBCs will not send you RTP until they hear yours. On an inbound call the runtime asks the model to speak first so the carrier’s media path opens — the model greets from yourinstructions, or you can pin an exact
opening line. This behavior is on by default for inbound direct-media calls;
no extra config is required.
Tools mid-conversation
The shipped realtime adapters advertise your tools in the session bootstrap, so the model can call HTTP and MCP tools during a spoken turn and speak the result. Configure them exactly as you would for a cascade — see Tool Calling.Session budgets
Every realtime session is bounded so a stuck provider can’t run forever:- Connect timeout — the handshake is given 5 seconds before the runtime gives up and falls back.
- Max session — sessions are closed at a 15-minute ceiling even if the provider hasn’t. Tune lifetime, idle re-engage, and hangup budgets on Session Lifecycle.
Next steps
Cascade instead
Wire independent ASR, LLM, and TTS providers when you want per-stage control.
Turn detection
Tune barge-in, endpointing, and backchannel handling.
Self-hosted inference
Serve your own duplex model on-prem with the inference control plane.
All runtime knobs
Models, codecs, budgets, and guardrails in one reference.