wooden-librarian-60399
02/22/2026, 5:19 PMtall-airline-16756
02/22/2026, 5:20 PMtall-airline-16756
02/22/2026, 5:20 PMmodalities to ["text"]. This makes the model return text responses instead of audio.
• Take the text output and pass it to whatever TTS model or provider you want. LiveKit supports wiring that together inside an AgentSession, so the LLM handles understanding/generation and your chosen TTS handles synthesis.
Quick examples
1) Python
session = AgentSession(
llm=openai.realtime.RealtimeModel(modalities=["text"]),
tts="cartesia/sonic-3" # or another TTS model/provider
)
2) Node.js / TypeScript
const session = new voice.AgentSession({
llm: new openai.realtime.RealtimeModel({
modalities: ["text"]
}),
tts: "cartesia/sonic-3",
});
Notes and tips
• This pattern is often called a “half-cascade” or “half-duplex” setup: the Realtime API handles text generation (and speech comprehension if you also capture audio input), and you keep full control over the speech synthesis step.
• The same approach works with Azure OpenAI’s realtime plugin.
• If you plan to load conversation history, the Realtime API may default to text output — explicitly setting modalities: ["text"] ensures the behavior you want.
If you’d like, tell me:
• which TTS provider or model you want to use, and
• whether you need the final audio streamed back into a LiveKit room or saved as files—
and I’ll give a focused example for that scenario.
Sources: OpenAI Realtime API plugin guide | LiveKit Documentation | Realtime models overview | LiveKit Documentation | Azure OpenAI Realtime API and LiveKit | LiveKit Documentationwooden-librarian-60399
02/22/2026, 5:23 PMtall-airline-16756
02/22/2026, 5:23 PMmodalities=["TEXT"]) so the model produces text which you then send to your TTS of choice — the exact same half-cascade/half-duplex approach you described for OpenAI Realtime.
Additional note
• Gemini 2.0 Flash is deprecated and scheduled for retirement (February 13, 2026). Consider migrating to Gemini 2.5 Flash / Flash Lite or using Gemini Live if you need realtime-modal behavior.
If you want, tell me:
• whether you prefer to keep using Gemini 2.x (and which version), or
• which TTS provider you plan to use, and whether you need streamed audio back into a LiveKit room or saved files —
and I’ll give a focused example or migration recommendation.
Sources: Realtime models overview | LiveKit Documentation | Gemini Live API plugin | LiveKit Documentation | Large language models (LLM) overview | LiveKit Documentation | Google Gemini LLM | LiveKit Documentationwooden-librarian-60399
02/22/2026, 5:27 PMtall-airline-16756
02/22/2026, 5:27 PMwooden-librarian-60399
02/22/2026, 5:35 PMtall-airline-16756
02/22/2026, 5:35 PMelevenlabs/eleven_flash_v2
◦ elevenlabs/eleven_flash_v2_5
◦ elevenlabs/eleven_turbo_v2
◦ elevenlabs/eleven_turbo_v2_5
◦ elevenlabs/eleven_multilingual_v2
Notes
• LiveKit’s ElevenLabs plugin defaults to eleven_flash_v2_5 in examples, and eleven_multilingual_v2 is shown for multilingual use.
• Pricing and LiveKit Inference lists the V2 and v2.5 models; there’s no mention of an Eleven V3.
If you’d like, I can:
• Show a snippet for wiring one of the supported ElevenLabs models into an AgentSession or pipeline.
• Help you pick which Eleven model fits your needs (e.g., best multilingual support vs. naturalness).
• Sketch how to route ElevenLabs audio back into a LiveKit room or save it as files.
Which would you prefer?
Sources: ElevenLabs TTS | LiveKit Documentation | Build voice, video, and physical AI | LiveKit | ElevenLabs TTS plugin guide | LiveKit Documentation | Pipeline Translator Agent | LiveKit Documentation