Skip to main content
LiveKit Agents is a framework for building realtime voice AI. Because Venice is fully OpenAI-compatible for chat, transcription, and speech, you can drive all three stages of a voice agent — speech-to-text (STT), the LLM, and text-to-speech (TTS) — through the 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:
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.

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.
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

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.
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 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-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 is buffered by the plugin. LiveKit’s OpenAI TTS wrapper reports streaming=False, so it does not use Venice’s sentence-by-sentence 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.