livekit-plugins-openai plugin by pointing it at the Venice base URL.
Venice fits the STT-LLM-TTS pipeline architecture in LiveKit Agents. Venice does not expose an OpenAI Realtime (speech-to-speech) WebSocket API, so the
RealtimeModel / multimodal path is not available. Use the componentized pipeline shown below — it gives you full control over each model and keeps inference on Venice’s private infrastructure.How Venice maps to LiveKit Agents
Setup
Install the framework and the plugins used below:The OpenAI plugin falls back to
OPENAI_API_KEY when api_key is omitted. Because you are pointing it at Venice, always pass api_key explicitly (or the key would be read from the wrong variable). The examples below read VENICE_API_KEY.Full Voice Agent
This is a complete voice agent that transcribes with Venice STT, thinks with a Venice LLM, and speaks with Venice TTS. Silero provides local voice-activity detection so the batch STT knows when a turn is complete.Configuring Each Component
LLM
The LLM is the cleanest mapping — Venice/chat/completions supports SSE streaming, tool calling, and vision, all of which LiveKit uses directly. venice-uncensored-1-2 keeps inference private and uncensored while feeding the TTS pipeline; reach for a flash-class model only if you need lower time-to-first-token.
extra_body:
Speech-to-Text
LiveKit’s OpenAI STT calls/audio/transcriptions per speech segment, so it needs a VAD (Silero above) to detect when a turn ends. Override the default model with a Venice STT model. nvidia/parakeet-tdt-0.6b-v3 is the smallest/lowest-latency option; stt-xai-v1 and elevenlabs/scribe-v2 are newer alternatives if you want higher accuracy.
Text-to-Speech
LiveKit’s OpenAI TTS calls/audio/speech. Voices are model-specific in Venice — pass a model/voice pair from the same model. tts-kokoro keeps the voice stage private and uncensored so it can speak the LLM’s output verbatim; request pcm to avoid an MP3 decode step and shave a little latency. Faster provider-backed voices (e.g. Gemini) may apply content filtering, so avoid them if you need uncensored speech.
Recommended Models
Model IDs change over time — discover current options at runtime withGET /models?type=... and GET /models/traits rather than hardcoding. For voice agents, prioritize low-latency tiers (models named flash, turbo, mini, or small parameter counts) since perceived responsiveness depends on time-to-first-token and TTS speed. Good starting points from the current catalog:
Browse all models
Filter by text, speech-to-text, and text-to-speech with live pricing and capabilities.
Latency & Production Tips
Voice-agent quality is dominated by turn-taking latency — the time between the user finishing their sentence and the agent starting to speak. With the all-Venice pipeline, budget roughly:
Expect ~0.8–1.5 s to first audio — great for assistant-style, measured turn-taking. For highly interruptible, overlapping conversation you’ll feel the gap versus a native speech-to-speech model.
Reduce latency
- Use
response_format="pcm"on TTS to skip the MP3 decode step. - Tune Silero VAD (
silero.VAD.load(min_silence_duration=0.4)) to shorten endpointing without clipping speech. - Prefer low-latency tiers for STT/TTS (e.g.
tts-kokoroTTS,nvidia/parakeet-tdt-0.6b-v3STT). Keepvenice-uncensored-1-2for the LLM to stay private and uncensored; switch to aflash-class LLM only if you need faster time-to-first-token. - Keep replies concise — the first sentence is what gates perceived responsiveness.
Mixing providers
LiveKit lets you choose each component independently, so you can keep Venice where its privacy and uncensored models matter most and swap in a streaming provider where latency is critical. A common high-interactivity setup keeps the Venice LLM (and optionally STT) and pairs it with a dedicated streaming TTS:Limitations & Notes
- No speech-to-speech / Realtime API. Venice has no OpenAI Realtime WebSocket, so
openai.realtime.RealtimeModeland the multimodal agent path are unavailable. Use the STT-LLM-TTS pipeline shown above. - STT is batch, not streaming. Venice transcription is request/response, so a VAD (Silero) is required for endpointing. This adds a small amount of latency versus a streaming STT socket.
- TTS is buffered by the plugin. LiveKit’s OpenAI TTS wrapper reports
streaming=False, so it does not use Venice’s sentence-by-sentencestreamingflag. Latency is still fine for most agents; useresponse_format="pcm"to minimize decode overhead. - Match voice to model. TTS
voiceIDs are only valid for their matchingmodel. See Text-to-Speech Models. - Don’t hardcode model lists. Venice model IDs are deprecated and replaced regularly — query
GET /models/GET /models/traitsat runtime. See Deprecations.