Skip to Content
cuelo.

03Conversation

Interruptions

Let callers cut in — and tell a real interruption from a "yeah".

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.

“yeah” over the agentagentuseruser_backchannel → keep talking“wait, no” over the agentagentuserinterrupt → stop after hold_ms decided
the barge-in detector tells the two apart while the agent is speaking.
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

ValueHow it decidesCost
vadAny caller speech longer than interrupt_after ms stops the agent, including "yeah".Free
backchannel-detectorA small model separates backchannels from real interruptions in the first few hundred ms.Light
maaiMaAI 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

  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

  • 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.
  • 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).

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.

On this page