Recording bitrate control
You can use constant-bitrate recording to avoid misleading duration estimates in players such as QuickLook, or match Egress’s 128 kb/s encoding. RecorderIO now lets you set the bitrate and encoding mode; defaults are unchanged.
RecorderIO(agent_session=session, bit_rate=128_000, constant_bit_rate=True)New providers and models
- Reson8: new STT plugin for batch and realtime transcription, including server-side turn detection.
- Mistral Voxtral 3: adds
voxtral-mini-transcribe-3,voxtral-small-transcribe-3,voxtral-mini-transcribe-realtime-3, andvoxtral-mini-tts-3, plus 36 TTS voice presets. - Inworld: adds
inworld-tts-2-flashthrough the plugin and LiveKit Inference. - AssemblyAI: adds typed LiveKit Inference TTS support for
assemblyaiandassemblyai/assemblyai-tts-1.
Breaking changes
- Mistral:
api_modeis now ignored; migrate Chat Completions usage to Conversations. Forrecognize(), explicitly select a batch model; replace removed known IDsvoxtral-mini-latestandvoxtral-mini-2507. Without VAD or server-side turn detection, standalone realtime streams needstream.flush().
Behavior changes
- Mistral: now requires
mistralai>=3.5.0,<4.0.0; defaults move to Voxtral 3 STT/TTS andmistral-small-latest. Silero is no longer loaded automatically. - TTS defaults: AssemblyAI now uses Audrey; Inworld uses
inworld-tts-2. - Streaming STT: detects stalled connections and limits retries without processing progress so fallback can proceed.
- Worker health: returns 503 before registration and after disconnections exceed the 30-second grace period.
STT flushing, language overrides, token accounting, translation startup, avatar errors, and noise cancellation are more reliable.
What's Changed
- fix(google): count Gemini thinking tokens in LLM completion_tokens by @ninglinLiu in #7891
- fix(hume): reject instant_mode without a voice in update_options by @ShivamSharma43 in #8090
- fix(tokenize): keep runs like ?! and !!! in one sentence by @ANDROIDHASSAN in #8116
- fix(gladia): require translation target languages in update_options by @ShivamSharma43 in #8091
- fix(tests): replace TCP port check with HTTP readiness probe in livekit_server fixture by @Lothnic in #6094
- fix(fal, mistralai): don't persist the per-call language passed to recognize() by @ShivamSharma43 in #8054
- fix(stt): stop per-call language leaking in openai/elevenlabs, forward deepgram options to open streams by @Atharvsinh-codez in #7828
- fix(worker): return 503 from health until RegisterWorkerResponse by @ninglinLiu in #8093
- fix(inference): detect a silently dropped Inference STT socket instead of hanging by @regalmoix in #8023
- feat(openai): add TTS sample rate option by @rosetta-livekit-bot[bot] in #8122
- fix(llm): drop the dangling openai.responses entry from _provider_format.all by @ShivamSharma43 in #8008
- fix(anthropic): send user as metadata.user_id by @omChauhanDev in #7970
- feat(voice): add bit_rate and constant_bit_rate options to RecorderIO by @ANDROIDHASSAN in #7740
- Detect stalled STT connections and limit recovery retries by @davidzhao in #8123
- fix(beta): stop unset_track from stalling TranslationRoomIO startup by @RaphaelFakhri in #8115
- feat(assemblyai): default the TTS voice to Audrey by @dlange-aai in #8132
- feat(reson8): add STT plugin with server-side turn detection by @phillip-kil in #7187
- Add docstrings to the xAI realtime model by @aryeila in #8141
- fix(deepgram): Drop the language hint the model cannot take, and add it for nova-3 multi by @adrian-cowham in #8079
- feat: send up existing jobs during worker connection migration by @davidzhao in #8135
- fix(bithuman): don't retry 4xx when starting a session, and keep the provider's error by @sidxh in #7500
- feat(inference): Type and gate language_hint for Deepgram Nova-3 by @adrian-cowham in #8072
- docs(plugins): fix environment variables in the neuphonic and rtzr READMEs by @ninglinLiu in #8151
- fix(baseten): flush buffered audio with end_audio when Whisper STT input ends by @A-K-Erol in #8144
- chore(examples): remove provider-specific examples by @tinalenguyen in #8154
- feat(inworld): add inworld-tts-2-flash and move the default off TTS-1.5 by @shawnfeldman in #8047
- synthesia: optionally start the avatar in the background (wait_for_avatar=False) by @atharvapatil-synth in #8146
- fix(assemblyai): don't cap language_codes at 10 on universal-3-6-pro by @tinalenguyen in #8178
- feat(simli): send Trinity-2 session options and the plain face ID by @Antonyesk601 in #8174
- docs(microsoft-ai): drop stale smoke script references by @detail-app[bot] in #8182
- feat(mistralai): add Voxtral 3 TTS support by @jeanprbt in #8164
- feat(mistralai): add Voxtral 3 STT support by @jeanprbt in #8136
- refactor(mistralai): use the Conversations API only for the LLM by @jeanprbt in #8169
- feat(inference): Type AssemblyAI TTS models and options by @tinalenguyen in #8181
- feat(mistralai): expose the Conversations API store option on the LLM by @tinalenguyen in #8187
- chore(deps): update dependency nltk to v3.10.4 [security] by @renovate[bot] in #8186
- chore(krisp): bump livekit-plugins-krisp-internal to 0.2.2 by @lukasIO in #8198
- livekit-agents@1.8.10 by @github-actions[bot] in #8206
New Contributors
- @ninglinLiu made their first contribution in #7891
- @Lothnic made their first contribution in #6094
- @Atharvsinh-codez made their first contribution in #7828
- @regalmoix made their first contribution in #8023
- @phillip-kil made their first contribution in #7187
- @atharvapatil-synth made their first contribution in #8146
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.8.9...livekit-agents@1.8.10