Stability-focused release with significant reliability improvements. Fixes multiple memory leaks in the process pool — job counter leaks on cancellation, pending assignment leaks on timeout, socket leaks on startup failure, and orphaned executors on send failure. IPC pipeline reliability has been improved, and several edge-case hangs have been resolved (participant never joining, Ctrl+C propagation to child processes). STT/TTS fallback behavior is now more robust: STT fallback correctly skips the main stream during recovery, and TTS fallback no longer shares resamplers across streams. Other fixes include ChatContext.truncate no longer dropping developer messages, correct cgroups v2 CPU quota parsing, proper on_session_end callback ordering, and log uploads even when sessions fail to start. Workers now automatically reject jobs when draining or full, and the proc pool correctly spawns processes under high load.
New RecordingOptions API
The record parameter on AgentSession.start() now accepts granular options in addition to bool. All keys default to True when omitted.
# record everything (default)
await session.start(agent, record=True)
# record nothing
await session.start(agent, record=False)
# granular: record audio but disable traces, logs, and transcript
await session.start(agent, record={"audio": True, "traces": False, "logs": False, "transcript": False})What's Changed
- fix multichannel input on speaking rate by @theomonnom in #4740
- livekit-agents 1.4.1 by @theomonnom in #4742
- fix ruff & type checks by @theomonnom in #4743
- rename camb plugin to cambai by @tinalenguyen in #4744
- fix ruff by @davidzhao in #4749
- (liveavatar): change avatar mode from CUSTOM to LITE by @tinalenguyen in #4748
- sarvam v3:stt and tts models by @dhruvladia-sarvam in #4603
- export ToolContext by @theomonnom in #4750
- fix: correct typo 'occured' to 'occurred' by @thecaptain789 in #4751
- fix: correct typo 'dont't' to 'don't' by @thecaptain789 in #4752
- Add jwt_token auth option for Neuphonic by @alexshelkov in #4734
- fix get_event_loop on py3.14 by @theomonnom in #4757
- feat: add missing OpenTelemetry GenAI attributes (gen_ai.provider.name, gen_ai.operation.name) by @Mr-Neutr0n in #4759
- add input_details to SpeechHandle by @longcw in #4701
- suppress tee aclose exception by @chenghao-mou in #4766
- fix 3.14 syntax warning by @chenghao-mou in #4763
- update issue template community link by @tinalenguyen in #4772
- remove browser plugin by @theomonnom in #4760
- write_int signed by @theomonnom in #4776
- add lemonslice to video avatars section in README by @tinalenguyen in #4778
- Added TruGen Avatar Plugin. by @hari-trugen in #4430
- Bump cryptography from 46.0.4 to 46.0.5 by @dependabot[bot] in #4788
- Updated Speechmatics STT integration by @sam-s10s in #4703
- Bump pillow from 12.1.0 to 12.1.1 by @dependabot[bot] in #4791
- automatically reject jobs if the worker is draining/full by @theomonnom in #4794
- add instruction on error-handling by @chenghao-mou in #4790
- replace asyncio with inspect for iscoroutinefunction by @chenghao-mou in #4789
- Add Hindi to the list of languages supported by the turn detector plu… by @darryncampbell in #4797
- generate_reply accepts ChatMessage as user_input by @longcw in #4808
- await interruption in _default_text_input_cb by @longcw in #4807
- Add google stt voice activity timeout by @AhmadIbrahiim in #4361
- fix: Update AvatarSession to use FormData format for expression model… by @CathyL0 in #4799
- Inworld tts auto mode by @ianbbqzy in #4655
- [inworld] add User-Agent and X-Request-Id for better traceability by @ianbbqzy in #4784
- [inworld] support async timestamps mode by @ianbbqzy in #4793
- ensure proc pool spawns processes for waiting jobs under high load by @theomonnom in #4820
- (openai responses): update field names and image inputs by @tinalenguyen in #4819
- chore(assemblyai): improve latency by default by @davidzhao in #4827
- fix: a few defensive fixes to guard for exceptions by @davidzhao in #4828
- Improve error handling and developer experience by @theomonnom in #4826
- fix _jobs_waiting_for_process counter leak on cancellation by @theomonnom in #4821
- fix cgroups v2 CPU quota parsing by @davidzhao in #4844
- improve IPC pipeline reliability by @theomonnom in #4825
- fix socket leak in supervised_proc._start() on failure by @theomonnom in #4823
- fix: ChatContext.truncate dropping "developer" message by @davidzhao in #4845
- fix: do not share resampler in tts fallback adapter by @davidzhao in #4840
- fix _pending_assignments memory leak on assignment timeout by @theomonnom in #4822
- fix launch_job send failure leaving executor orphaned by @theomonnom in #4824
- fix(stt): correct log key mislabeled as "tts" in STT retry logs by @SezginKahraman in #4830
- allow flexible recording options by @davidzhao in #4758
- fix: clean up inference tasks after completion by @davidzhao in #4841
- fix: prevent leak when channel task has been cancelled by @davidzhao in #4848
- fix: call speech_handle.add_done_callback even when task is done by @davidzhao in #4851
- upload logs to server even when session fails to start by @davidzhao in #4846
- ensure exception is seen by all peers of tee by @davidzhao in #4853
- add livekit-plugins-browser by @theomonnom in #4859
- fix: ruff and mypy issues in livekit-plugins-browser by @theomonnom in #4860
- fix: correct samples_per_channel in speaking rate stream by @theomonnom in #4863
- fix: run on_session_end callback before internal session cleanup by @theomonnom in #4862
- fix: STT fallback does not skip main_stream when recovering streams fail by @davidzhao in #4835
- bump livekit sdk to 1.1.1 by @theomonnom in #4865
- fix: prevent hang if participant never joins by @davidzhao in #4864
- fix: prevent KeyboardInterrupt in child processes on Ctrl+C by @theomonnom in #4866
- bump livekit sdk to 1.1.2 by @theomonnom in #4867
- livekit-agents 1.4.2 by @theomonnom in #4868
- browser plugin: add navigation RPCs + bump to 0.1.2 by @theomonnom in #4870
New Contributors
- @thecaptain789 made their first contribution in #4751
- @Mr-Neutr0n made their first contribution in #4759
- @hari-trugen made their first contribution in #4430
- @dependabot[bot] made their first contribution in #4788
- @darryncampbell made their first contribution in #4797
- @AhmadIbrahiim made their first contribution in #4361
- @ianbbqzy made their first contribution in #4655
- @SezginKahraman made their first contribution in #4830
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.4.0...livekit-agents@1.4.2