# Interruptions (/conversation/interruptions)

With `barge_in: true`, the caller can interrupt the agent mid-sentence. The
hard part is that people constantly make small sounds while listening, like
"yeah", "mhm" and "right". An agent that stops for each one is unusable.

<InterruptDiagram />

```yaml title="config.cuelo"
turns:
  barge_in: true
  barge_in_detector: maai # vad | backchannel-detector | maai
  interrupt_after: 300 # ms of speech before vad counts it (vad only)
```

## Detectors [#detectors]

| Value                  | How it decides                                                                            | Cost                                           |
| ---------------------- | ----------------------------------------------------------------------------------------- | ---------------------------------------------- |
| `vad`                  | Any caller speech longer than `interrupt_after` ms stops the agent, including "yeah".     | Free                                           |
| `backchannel-detector` | A small model separates backchannels from real interruptions in the first few hundred ms. | Light                                          |
| `maai`                 | MaAI predicts from both voices whether the caller is taking the floor. The default.       | ~23 ms CPU per 80 ms, shared with backchannels |

The detector emits either `user_backchannel` (keep talking) or `interrupt`.
The policy waits `hold_ms` (200 ms by default) after an `interrupt` before
stopping, and cancels the stop if a `user_backchannel` arrives in that window.

## What happens when the agent stops [#what-happens-when-the-agent-stops]

1. LLM generation and TTS are cancelled mid-stream.
2. The server emits `agent.interrupted`. Over the Realtime API, clients get
   `input_audio_buffer.speech_started`, and the response ends with status
   `cancelled`.
3. **Clients must drop audio they haven't played.** Buffered audio would keep
   talking over the caller.
4. If the reply was cut off before any audio played, it is dropped from the
   history, and the caller's words carry into their next turn. Otherwise the
   partial reply stays in the history, and any unanswered tool calls are marked
   interrupted.

## Tuning [#tuning]

- **Stops too often:** use `maai` or `backchannel-detector` instead of `vad`, or
  raise `interrupt_after` (vad).
- **Stops too slowly:** lower `hold_ms` in a custom policy:
  `StandardTurnTaking(hold_ms=100)`. See [Custom turn-taking](/conversation/custom).
- **Never interrupt** (an IVR prompt, a legal disclosure): set `barge_in: false`,
  or filter `STOP` decisions in a custom policy (example in
  [Custom turn-taking](/conversation/custom#change-the-policy)).

In the dashboard, **barge-in rate** and **interruptions** per call show how
often callers cut in. Listen to a few with the call player to check the stops
were real.