Skip to main content
LiveKit Agents is a framework for building realtime voice AI. Venice can drive all three stages of a voice agent: speech-to-text (STT), the LLM, and text-to-speech (TTS). The livekit-plugins-openai plugin handles STT and the LLM when you point it at the Venice base URL. For TTS, a short VeniceTTS class calls Venice’s /audio/speech endpoint directly.
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:
Set your Venice API key and LiveKit connection details:
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.

Venice TTS class

Don’t use the plugin’s openai.TTS class with Venice. Current livekit-plugins-openai releases send a stream_format field with every speech request, and Venice’s /audio/speech endpoint rejects it with 400. Instead, save this class as venice_tts.py next to your agent. It calls /audio/speech with only the fields Venice accepts and hands the audio to LiveKit as it arrives.
venice_tts.py
response_format must be a format the model supports. Check model_spec.supported_formats in GET /models?type=tts. Use pcm with tts-kokoro, which LiveKit plays without a decode step. For other models, pass mp3 or wav and LiveKit decodes the audio.

Full Voice Agent

This is a complete voice agent that transcribes with Venice STT, thinks with a Venice LLM, and speaks with Venice TTS through the VeniceTTS class above. Silero provides local voice-activity detection so the batch STT knows when a turn is complete.
agent.py
Run it in development:

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.
Pass Venice-specific options (web search, character personas, thinking control) through 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

VeniceTTS 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, and its pcm output avoids an MP3 decode step and shaves a little latency. Faster provider-backed voices (e.g. Gemini) may apply content filtering, so avoid them if you need uncensored speech.
Model IDs change over time — discover current options at runtime with GET /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 tts-kokoro with response_format="pcm", the VeniceTTS default, 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-kokoro TTS, nvidia/parakeet-tdt-0.6b-v3 STT). Keep venice-uncensored-1-2 for the LLM to stay private and uncensored; switch to a flash-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:
Start all-Venice for the simplest, most private setup. If you’re building a fast, highly conversational consumer experience, keep the Venice LLM and evaluate a streaming TTS for the speech-output stage.

Limitations & Notes

  • No speech-to-speech / Realtime API. Venice has no OpenAI Realtime WebSocket, so openai.realtime.RealtimeModel and 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 uses the VeniceTTS class, not openai.TTS. Current livekit-plugins-openai releases send stream_format on speech requests, which Venice rejects with 400. VeniceTTS reports streaming=False, so LiveKit synthesizes the reply a sentence or so at a time, and it does not use Venice’s streaming flag. Latency is still fine for most agents; use response_format="pcm" to minimize decode overhead.
  • Match voice to model. TTS voice IDs are only valid for their matching model. See Text-to-Speech Models.
  • Don’t hardcode model lists. Venice model IDs are deprecated and replaced regularly — query GET /models / GET /models/traits at runtime. See Deprecations.