LiveKit Agents v1.8.9 lets your voice agent decide when a caller wants a human

2 hours ago

LiveKit Agents v1.8.9 adds Decisions through LiveKit Inference, so a voice agent can ask whether a caller wants a human on LiveKit credentials alone. Also: silent background-tool progress, span attributes from your llm_node, ThunderPhone, AssemblyAI and Fish Audio voices, three security fixes, and breaking changes for Rime, Gradium and Inworld. Release notes: https://github.com/livekit/agents/releases/tag/livekit-agents%401.8.9 Full changelog: https://github.com/livekit/agents/compare/livekit-agents@1.8.8...livekit-agents@1.8.9

Ask about this presentation

Chapters

  1. 0:00Decisions
  2. 0:15Silent tool progress
  3. 0:30LLM request attributes
  4. 0:41New providers
  5. 0:54Security
  6. 1:08Anthropic tool choice
  7. 1:23Changed defaults
  8. 1:37Breaking changes
Show transcript

Decisions

LiveKitLiveKit AgentsAdded

LiveKit Agents v1.8.9 lets your voice agent decide when a caller wants a human

model = inference.DecisionModel("openai/gpt-6-luna-decisions")
response = await model.evaluate(
    input=chat_ctx,
    decisions={"handoff": llm.Probability("The caller requests a human.")},
)

Access requires a project feature flag

GitHub release · livekit-agents@1.8.9 · Decisions through LiveKit Inference

LiveKit Agents v1.8.9 can ask a model a named question about the call, like whether the caller wants a human. It runs on your LiveKit credentials, batches the decisions, and your project needs a feature flag first.

Silent tool progress

LiveKitLiveKit AgentsAdded

Background tools can report progress without making the agent talk

await ctx.update("checking the fare rules", silent=True)

A final background-tool result can now trigger follow-up tool calls

GitHub release · livekit-agents@1.8.9 · Silent tool progress

A background tool can now log its progress silently, so the agent stays quiet while it checks the fare rules. When that tool finishes, its result can trigger another tool call.

LLM request attributes

LiveKitLiveKit AgentsAdded

Your llm_node can tag its own LLM request span

gen_ai.set_llm_request_attributes(
    {"langfuse.observation.prompt.name": "support-agent"}
)

No custom OpenTelemetry processor · scoped to that node’s calls

GitHub release · livekit-agents@1.8.9 · Custom LLM request attributes

If you trace with Langfuse, your custom LLM node can now put a prompt name straight on its request span. That used to take a custom OpenTelemetry processor.

New providers

LiveKitLiveKit AgentsAdded

ThunderPhone, AssemblyAI and Fish Audio join LiveKit Agents

ThunderPhoneRealtime speech-to-speech plugin
AssemblyAIassemblyai-tts-1 · streaming TTS, word timestamps, six languages
Fish Audiodrama-3 · Inference TTS you steer in free-form words
GitHub release · livekit-agents@1.8.9 · New providers and models

ThunderPhone arrives as a realtime speech-to-speech plugin. AssemblyAI adds streaming TTS with word timestamps, and Fish Audio's Drama 3 voice takes free-form direction on how to sound.

Security

LiveKitLiveKit AgentsSecurity

Tool errors stop leaking raw arguments into your logs

Tool errorsArguments and validation details now go through PII filtering
SimliStartup error logs drop the session token
RoomIOOnly the configured participant can start a turn by chat
GitHub release · livekit-agents@1.8.9 · Security

Tool errors now pass their raw arguments through PII filtering before they reach your logs. Simli stops logging its session token, and RoomIO stops another participant from starting a turn over chat.

Anthropic tool choice

LiveKitLiveKit AgentsChanged

Forced tool calls turn into auto on Claude Opus 5.5 and Sonnet 5.5

ModelsOpus 5.5 · Sonnet 5.5 · Fable 5.1 · Mythos 5.1
EffectA forced tool choice is sent as auto

Tool use is not guaranteed on these models

GitHub release · livekit-agents@1.8.9 · Behavior changes

If you force a tool call on Claude Opus 5.5, Sonnet 5.5, Fable 5.1 or Mythos 5.1, the Anthropic plugin now sends auto. The model can then answer without calling the tool.

Changed defaults

LiveKitLiveKit AgentsChanged

Google now defaults to Gemini 3.8 Flash

Googlegemini-3.8-flash is the default chat model
STTSupported engines flush at every turn boundary
InterruptionsAdaptive interruption errors fall back to VAD

Custom nodes that buffer STT must turn manual_flush off

GitHub release · livekit-agents@1.8.9 · Behavior changes

The Google plugin now picks Gemini 3.8 Flash when you don't name a model. Speech-to-text also flushes at each turn boundary, so a custom node that buffers audio needs a setting changed.

Breaking changes

LiveKitLiveKit AgentsBreaking

Rime, Gradium and Inworld setups can break on upgrade

RimeWebSocket v1 needs an explicit model
GradiumPassing both voice and voice_id raises ValueError
InworldPool settings are ignored · one WebSocket per TTS

Details: the LiveKit Agents v1.8.9 release notes on GitHub

Which TTS plugin does your agent run on?

GitHub release · livekit-agents@1.8.9 · Breaking changes

Rime, Gradium and Inworld users should check before upgrading. Rime needs a named model, Gradium rejects a voice and a voice ID together, and Inworld ignores its pool settings. The release notes cover each one. Which TTS plugin does your agent run on?

What happened in AI today, in your inbox

One short email each evening. Read it and you’re caught up.

Built in New York with ❤️