Highlights
Adaptive Interruption Handling
The headline feature of v1.5.0: an audio-based ML model that distinguishes genuine user interruptions from incidental sounds like backchannels ("mm-hmm"), coughs, sighs, or background noise. Enabled by default — no configuration needed.
Key stats:
- 86% precision and 100% recall at 500ms overlapping speech
- Rejects 51% of traditional VAD false positives
- Detects true interruptions 64% faster than VAD alone
- Inference completes in 30ms or less
When a false interruption is detected, the agent automatically resumes playback from where it left off — no re-generation needed.
To opt out and use VAD-only interruption:
session = AgentSession(
...
turn_handling=TurnHandlingOptions(
interruption={
"mode": "vad",
},
),
)
Blog post: https://livekit.com/blog/adaptive-interruption-handling
Dynamic Endpointing
Endpointing delays now adapt to each conversation's natural rhythm. Instead of a fixed silence threshold, the agent uses an exponential moving average of pause durations to dynamically adjust when it considers the user's turn complete.
session = AgentSession(
...
turn_handling=TurnHandlingOptions(
endpointing={
"mode": "dynamic",
"min_delay": 0.3,
"max_delay": 3.0,
},
),
)
New TurnHandlingOptions API
Endpointing and interruption settings are now consolidated into a single TurnHandlingOptions dict passed to AgentSession. Old keyword arguments (min_endpointing_delay, allow_interruptions, etc.) still work but are deprecated and will emit warnings.
session = AgentSession(
turn_handling={
"turn_detection": "vad",
"endpointing": {"min_delay": 0.5, "max_delay": 3.0},
"interruption": {"enabled": True, "mode": "adaptive"},
},
)
Session Usage Tracking
New SessionUsageUpdatedEvent provides structured, per-model usage data — token counts, character counts, and audio durations — broken down by provider and model:
@session.on("session_usage_updated")
def on_usage(ev: SessionUsageUpdatedEvent):
for usage in ev.usage.model_usage:
print(f"{usage.provider}/{usage.model}: {usage}")
Usage types: LLMModelUsage, TTSModelUsage, STTModelUsage, InterruptionModelUsage.
You can also access aggregated usage at any time via the session.usage property:
usage = session.usage
for model_usage in usage.model_usage:
print(model_usage)
Usage data is also included in SessionReport (via model_usage), so it's available in post-session telemetry and reporting out of the box.
Per-Turn Latency on ChatMessage.metrics
Each ChatMessage now carries a metrics field (MetricsReport) with per-turn latency data:
transcription_delay— time to obtain transcript after end of speechend_of_turn_delay— time between end of speech and turn decisionon_user_turn_completed_delay— time in the developer callback
Action-Aware Chat Context Summarization
Context summarization now includes function calls and their outputs when building summaries, preserving tool-use context across the conversation window.
Configurable Log Level
Set the agent log level via LIVEKIT_LOG_LEVEL environment variable or through ServerOptions, without touching your code.
Deprecations
| Deprecated | Replacement | Notes |
|---|---|---|
metrics_collected event
| session_usage_updated event + ChatMessage.metrics
| Usage/cost data moves to session_usage_updated; per-turn latency moves to ChatMessage.metrics. Old listeners still work with a deprecation warning.
|
UsageCollector
| ModelUsageCollector
| New collector supports per-model/provider breakdown |
UsageSummary
| LLMModelUsage, TTSModelUsage, STTModelUsage
| Typed per-service usage classes |
RealtimeModelBeta
| RealtimeModel
| Beta API removed |
AgentFalseInterruptionEvent.message / .extra_instructions
| Automatic resume via adaptive interruption | Accessing these fields logs a deprecation warning |
AgentSession kwargs: min_endpointing_delay, max_endpointing_delay, allow_interruptions, discard_audio_if_uninterruptible, min_interruption_duration, min_interruption_words, turn_detection, false_interruption_timeout, resume_false_interruption
| turn_handling=TurnHandlingOptions(...)
| Old kwargs still work but emit deprecation warnings. Will be removed in v2.0. |
Agent / AgentTask kwargs: turn_detection, min_endpointing_delay, max_endpointing_delay, allow_interruptions
| turn_handling=TurnHandlingOptions(...)
| Same migration path as AgentSession. Will be removed in future versions.
|
Complete changelog
- (xai): add grok text to speech api to readme by @tinalenguyen in #5125
- Remove Gemini 2.0 models from inference gateway types by @Shubhrakanti in #5133
- feat: support log level via ServerOptions and LIVEKIT_LOG_LEVEL env var by @onurburak9 in #5112
- fix: preserve 'type' field in TaskGroup JSON schema enum items by @weiguangli-io in #5073
- feat(assemblyai): expose session ID from Begin event by @dlange-aai in #5132
- fix: strip empty {} entries from anyOf/oneOf in strict JSON schema by @theomonnom in #5137
- fix: update_instructions() now reflected in tool call response generation by @weiguangli-io in #5072
- Make chat context summarization action-aware by @toubatbrian in #5099
- fix(realtime): sync remote items to local chat_ctx with placeholders to prevent in-flight deletion by @longcw in #5114
- Set _speech_start_time when VAD START_OF_SPEECH activates by @hudson-worden in #5027
- Fix(inworld): "Context not found" errors caused by invalid enum parameter types by @ianbbqzy in #5153
- increase generate_reply timeout & remove RealtimeModelBeta by @theomonnom in #5149
- add livekit-blockguard plugin by @theomonnom in #5023
- openai: add max_completion_tokens to with_azure() by @abhishekranjan-bluemachines in #5143
- Restrict mistralai dependency to use v1 sdk by @csanz91 in #5116
- feat(assemblyai): add DEBUG-level diagnostic logging by @dlange-aai in #5146
- Fix Phonic
generate_replyto resolve with the currentGenerationCreatedEventby @qionghuang6 in #5147 - fix(11labs): add empty keepalive message and remove final duplicates by @chenghao-mou in #5139
- AGT-2182: Add adaptive interruption handling and dynamic endpointing by @chenghao-mou in #4771
- livekit-agents 1.5.0 by @theomonnom in #5165
New Contributors
- @onurburak9 made their first contribution in #5112
- @weiguangli-io made their first contribution in #5073
- @abhishekranjan-bluemachines made their first contribution in #5143
- @csanz91 made their first contribution in #5116
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.4.6...livekit-agents@1.5.0