# Python Agents 1.5.0 Released

**URL:** <https://community.livekit.io/t/python-agents-1-5-0-released/619>\
**Category:** Announcements\
**Tags:** python\
**Created:** [March 19, 2026, 5:52pm UTC](https://community.livekit.io/t/python-agents-1-5-0-released/619 "2026-03-19T17:52:00Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![CWilson](https://sea1.discourse-cdn.com/flex001/user_avatar/community.livekit.io/cwilson/32/135_2.png) [@CWilson](https://community.livekit.io/u/CWilson)\
**Post date:** [March 19, 2026, 5:52pm UTC](https://community.livekit.io/t/python-agents-1-5-0-released/619/1 "2026-03-19T17:52:00Z")

</div>

# **[livekit-agents@1.5.0](https://github.com/livekit/agents/releases/tag/livekit-agents%401.5.0)**

**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:

```python
session = AgentSession(
    ...
    turn_handling=TurnHandlingOptions(
        interruption={
            "mode": "vad",
        },
    ),
)

```

Blog post: [https://livekit.com/blog/adaptive-interruption-handling](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.

```python
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.

```python
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:

```python
@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:

```python
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 speech

- `end_of_turn_delay` — time between end of speech and turn decision

- `on_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](https://github.com/tinalenguyen)** in [#5125](https://github.com/livekit/agents/pull/5125)

- Remove Gemini 2.0 models from inference gateway types by **[@Shubhrakanti](https://github.com/Shubhrakanti)** in [#5133](https://github.com/livekit/agents/pull/5133)

- feat: support log level via ServerOptions and LIVEKIT\_LOG\_LEVEL env var by **[@onurburak9](https://github.com/onurburak9)** in [#5112](https://github.com/livekit/agents/pull/5112)

- fix: preserve ‘type’ field in TaskGroup JSON schema enum items by **[@weiguangli-io](https://github.com/weiguangli-io)** in [#5073](https://github.com/livekit/agents/pull/5073)

- feat(assemblyai): expose session ID from Begin event by **[@dlange-aai](https://github.com/dlange-aai)** in [#5132](https://github.com/livekit/agents/pull/5132)

- fix: strip empty {} entries from anyOf/oneOf in strict JSON schema by **[@theomonnom](https://github.com/theomonnom)** in [#5137](https://github.com/livekit/agents/pull/5137)

- fix: update\_instructions() now reflected in tool call response generation by **[@weiguangli-io](https://github.com/weiguangli-io)** in [#5072](https://github.com/livekit/agents/pull/5072)

- Make chat context summarization action-aware by **[@toubatbrian](https://github.com/toubatbrian)** in [#5099](https://github.com/livekit/agents/pull/5099)

- fix(realtime): sync remote items to local chat\_ctx with placeholders to prevent in-flight deletion by **[@longcw](https://github.com/longcw)** in [#5114](https://github.com/livekit/agents/pull/5114)

- Set \_speech\_start\_time when VAD START\_OF\_SPEECH activates by **[@hudson-worden](https://github.com/hudson-worden)** in [#5027](https://github.com/livekit/agents/pull/5027)

- Fix(inworld): “Context not found” errors caused by invalid enum parameter types by **[@ianbbqzy](https://github.com/ianbbqzy)** in [#5153](https://github.com/livekit/agents/pull/5153)

- increase generate\_reply timeout & remove RealtimeModelBeta by **[@theomonnom](https://github.com/theomonnom)** in [#5149](https://github.com/livekit/agents/pull/5149)

- add livekit-blockguard plugin by **[@theomonnom](https://github.com/theomonnom)** in [#5023](https://github.com/livekit/agents/pull/5023)

- openai: add max\_completion\_tokens to with\_azure() by **[@abhishekranjan-bluemachines](https://github.com/abhishekranjan-bluemachines)** in [#5143](https://github.com/livekit/agents/pull/5143)

- Restrict mistralai dependency to use v1 sdk by **[@csanz91](https://github.com/csanz91)** in [#5116](https://github.com/livekit/agents/pull/5116)

- feat(assemblyai): add DEBUG-level diagnostic logging by **[@dlange-aai](https://github.com/dlange-aai)** in [#5146](https://github.com/livekit/agents/pull/5146)

- Fix Phonic `generate_reply` to resolve with the current `GenerationCreatedEvent` by **[@qionghuang6](https://github.com/qionghuang6)** in [#5147](https://github.com/livekit/agents/pull/5147)

- fix(11labs): add empty keepalive message and remove final duplicates by **[@chenghao-mou](https://github.com/chenghao-mou)** in [#5139](https://github.com/livekit/agents/pull/5139)

- AGT-2182: Add adaptive interruption handling and dynamic endpointing by **[@chenghao-mou](https://github.com/chenghao-mou)** in [#4771](https://github.com/livekit/agents/pull/4771)

- livekit-agents 1.5.0 by **[@theomonnom](https://github.com/theomonnom)** in [#5165](https://github.com/livekit/agents/pull/5165)

## **New Contributors**

- **[@onurburak9](https://github.com/onurburak9)** made their first contribution in [#5112](https://github.com/livekit/agents/pull/5112)

- **[@weiguangli-io](https://github.com/weiguangli-io)** made their first contribution in [#5073](https://github.com/livekit/agents/pull/5073)

- **[@abhishekranjan-bluemachines](https://github.com/abhishekranjan-bluemachines)** made their first contribution in [#5143](https://github.com/livekit/agents/pull/5143)

- **[@csanz91](https://github.com/csanz91)** made their first contribution in [#5116](https://github.com/livekit/agents/pull/5116)

**Full Changelog** : [https://github.com/livekit/agents/compare/livekit-agents@1.4.6…livekit-agents@1.5.0](https://github.com/livekit/agents/compare/livekit-agents@1.4.6...livekit-agents@1.5.0)
