Highlights
☎️Answering Machine Detection ☎️
Introducing the headline feature of 1.5.9: AMD reliably distinguishes humans from machines and classifies every outbound call as human, voicemail, IVR, or unavailable. This feature is available in the core framework with no plugins required.
Read more about it in our blog post or see our docs.
Asynchronous Tools
AsyncToolset lets tools run in the background while the voice agent keeps talking. Here's an example:
class TravelToolset(AsyncToolset):
@function_tool
async def book_flight(self, ctx: AsyncRunContext, origin: str, dest: str) -> str:
await ctx.update(f"Searching flights from {origin} to {dest}...")
# agent replies to user that it's searching the flight
flights = await search_flights(origin, dest)
await ctx.update(f"Found {len(flights)} options, booking the best one...")
# agent will update to user when it's idle
booking = await confirm_booking(flights[0])
return f"Booked! Confirmation: {booking.id}"
# final result will also be updated when both user and agent is idle
agent = Agent(tools=[TravelToolset(id="travel")], instructions="...")Dynamic Tool Discovery
ToolSearchToolset — exposes a tool_search function. Matched tools are added directly to the LLM's tool list on the next turn, so the model uses native tool calls. Simpler for the model.
ToolProxyToolset — exposes exactly two fixed tools: tool_search (returns schemas) and call_tool (executes by name). The tool list remains unchanged, preserving prompt cache across turns for providers like OpenAI and Anthropic.
Both support:
- Nested toolsets (MCPToolset), standalone tools, ProviderTool, and RawFunctionTool
- Atomic toolset loading: if a tool picked belongs to a nested toolset, the whole toolset is loaded.
- Pluggable search via SearchStrategy protocol
- Built-in keywod and BM25 search strategy
See an example here: https://github.com/livekit/agents/blob/main/examples/voice_agents/tool_search_agent.py
Plugin Additions
Here are the newest plugins additions since 1.5.0:
- STT: Inworld, Simplismart, SLNG, xAI
- LLM: Perplexity,
- TTS: Mistral AI, Rime Streaming, SLNG, SmallestAI, Soniox
- Realtime: NVIDIA
- Avatar: Runway
Deprecations
The Hedra plugin has been deprecated. Please browse our other avatar integrations instead at https://docs.livekit.io/agents/models/avatar/.
Changelog
- fix(fishaudio): prevent TTS generation hang by @davidzhao in #5649
- add comments to agent side and inference side fallback adapters by @tmshapland in #5654
- fix(amd): fix negative zero in amd delay calculation by @chenghao-mou in #5650
- fix(async-toolset): use underscore in synthetic call_id by @longcw in #5656
- fix(console): set mock participant state to active by @longcw in #5645
- Update LemonSlice integration to use wait_playback_start by @jp-lemon in #5655
- Fix the memory leak of Google STT when no audio input. by @jmuk in #5591
- ci(examples): add separate file for workflow by @tinalenguyen in #5651
- fix: wording in missing required argument error by @carschandler in #5659
- chore(amd): add uncertain branch in example by @chenghao-mou in #5658
- docs(agents): document realtime capabilities by @shizhigu in #5598
- fix(elevenlabs): restore chunk_length_schedule in WS init payload by @IanSteno in #5006
- fix(voice): prevent scheduling deadlock when pipeline task crashes by @theomonnom in #5678
- (elevenlabs tts): add apply_language_text_normalization param by @tinalenguyen in #5679
- (gemini llm): add service tier param by @tinalenguyen in #5680
- Emit AgentConfigUpdate in OTLP session logs by @theomonnom in #5601
- fix(core): clean up variables when committing a user turn manually by @chenghao-mou in #5671
- (deepgram stt): add redact param by @tinalenguyen in #5692
- fix(agents): persist _speech_start_time across intra-turn VAD bursts by @AlessandroElyos in #5585
- fix: pass API key via header in Neuphonic and Murf WebSocket TTS by @u9g in #5691
- fix(core): make default user span time explicit by @chenghao-mou in #5699
- require CanManageAgentSession grant for remote session by @theomonnom in #5487
- test(examples/survey): add TaskGroup testing reference (DOCS-1225) by @kath0la in #5557
- fix(anthropic): raise default httpx read timeout for streaming; add configurable timeout param by @SuperMarioYL in #5529
- fix(examples): consistent CSV schema in survey_agent by @u9g in #5689
- Adding fine-grained VAD params to Sarvam saaras:v3 STT plugin by @dhruvladia-sarvam in #5563
- Update codec config, MIME mapping, and interruption handling by @dhruvladia-sarvam in #5561
- (gradium): update endpoint by @tinalenguyen in #5722
- Revert "require CanManageAgentSession grant for remote session (#5487)" by @chenghao-mou in #5714
- feat(gemini llm): add media resolution option to LLM and RealtimeModel by @csanz91 in #5712
- (inworld tts): add language param by @tinalenguyen in #5723
- fix(core): surface real http_context error from STT streams by @longcw in #5709
- docs: clarify function tools executed event pairing by @nightcityblade in #5701
- feat(workflows): expose dtmf and ringing_timeout on WarmTransferTask by @a-gasior in #5721
- fix(agents): await realtime auto tool reply in RunResult by @longcw in #5702
- chore(amd): update default models and default behavior by @chenghao-mou in #5713
- Add Perplexity LLM plugin by @jliounis in #5610
- fix: raise on unexpected ElevenLabs websocket close by @nightcityblade in #5729
- fix(agents): clear pending auto tool reply future on timeout by @u9g in #5725
- (azure + perplexity): bump versions by @tinalenguyen in #5731
- fix: do not republish tracks on reconnect by @davidzhao in #5698
- chore(amd): add default amd prediction log by @chenghao-mou in #5732
- feat(rime): add WebSocket streaming TTS support by @mcullan in #5663
- livekit-agents@1.5.9 by @github-actions[bot] in #5733
New Contributors
- @jmuk made their first contribution in #5591
- @shizhigu made their first contribution in #5598
- @SuperMarioYL made their first contribution in #5529
- @nightcityblade made their first contribution in #5701
- @a-gasior made their first contribution in #5721
- @jliounis made their first contribution in #5610
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.5.8...livekit-agents@1.5.9