the classic STT → LLM → TTS pipeline. One model listens and speaks directly — lower latency, more natural prosody, and native barge-in handling.
Enable it#
Set the server-side LLM to a realtime model. That's it:
const agent = pc.agent("receptionist", {
llm: "pinecall/gpt-realtime",
instructions: "You are a warm, concise phone receptionist for Bella Vista.",
greeting: "Hi! Thanks for calling Bella Vista — how can I help?",
tools: [checkReservation],
});
agent.addChannel("phone", "+19035551234");Any model whose name contains realtime activates the mode
(gpt-realtime, gpt-realtime-2.1, gpt-realtime-2.1-mini, …).
What changes under the hood#
| Classic pipeline | Realtime S2S | |
|---|---|---|
| STT | Deepgram / Gladia / … | built into the model |
| Turn detection / VAD | smart_turn / silero | built into the model |
| TTS | ElevenLabs / Cartesia / … | built into the model |
| Barge-in | server energy + VAD | native (model interrupts itself) |
| Billing | STT min + LLM tokens + TTS chars | LLM audio tokens only (+ telephony) |
Because the model owns the whole audio path, stt, tts/voice,
turnDetection, vad and interruption config are ignored in this mode.
The speaking voice is one of OpenAI's realtime voices — default marin,
override with:
config: { realtime: { voice: "cedar" } }What still works exactly the same#
- Channels: phone (Twilio) and WebRTC (browser) — same
addChannelcalls. - Greeting: the
greeting:field (or onecall.sayoncall.started) — the realtime model speaks it verbatim. - Tools: same
toolsdefinitions, same SDK execution — the server sendsllm.tool_call, your handlers run locally, results go back mid-call. - Events:
call.started,user.message,turn.end,bot.speaking,bot.finished,bot.interrupted,call.ended(with the full transcript). call.say(text): speaks the exact text through the realtime voice.- Prompt vars: built-in
{{date}},{{time}},{{day}},{{datetime}}resolve at session start (with the agent'stimezone).
Not supported (yet) in realtime mode#
- Skills (
skill()progressive disclosure) - Knowledge bases / RAG (
knowledgeBase) - Per-word captions (
bot.word) and hold music - Custom
setPromptVarsrefresh per turn (vars resolve once at call start)
If you need any of these, stay on the classic pipeline for that agent.

