Three ways a turn gets detected
Every agent uses exactly one of these. The right choice follows from the shape of your pipeline.
On-device VAD is the default because most agents are cascaded. They need a
local trigger to know when to hand the utterance to the ASR stage. When an
agent’s entry node is a realtime provider and you do not set a mode
explicitly, the runtime auto-promotes the default to
server_vad. The
realtime session owns the audio path end to end, so a local detector would
never actually run.
Two on-device backends exist: a lightweight built-in energy gate
(
type: "energy") and a higher-accuracy on-device VAD model. You get the VAD
model by default when you omit type. Both feed the identical turn-taking
and barge-in logic below. A backend switch never changes your timing knobs.Configure turn detection per agent
Turn detection lives in your agent config underturn_detection. Every field
is optional. Omit the block, and you get the phone-safe defaults.
"type": "energy" on a
realtime agent to force local detection instead. An explicit type wins over
the default in every case.
Set this on the agent from your workspace console at agent.clutchcall.dev,
or push it through the control-plane API. See
Runtime configuration for the full
agent-config shape.
Tune when the agent replies
Start with the defaults, then use these fields. Lower values give faster replies. Higher values help callers who pause to gather their thoughts.
The split between
answer_min_speech_ms and response_min_speech_ms is
deliberate. A short burst means opposite things at different moments. In the
answering window, the agent stopped and waits. There, even a one-syllable
“yes” is a real turn. Over the agent while it talks, that same short burst is
almost always a continuer (“mhm”, “ok”, “right”). The over-agent floor is
therefore higher, and backchannels never cancel the response.
Hold-and-confirm barge-in
Barge-in is armed automatically whenever the agent speaks. The mechanism is hold-and-confirm, controlled byparams.barge_confirm_ms (default 300):
1
Onset arms a pending barge
The instant the caller starts to speak over the agent, the runtime arms a
pending barge. It does not cancel the agent yet.
2
Sustained speech confirms it
The runtime fires the interrupt and cancels the in-flight response only if
that speech continues past
barge_confirm_ms.3
Backchannels self-cancel
A short “mhm” or “ok” ends before the window elapses. The runtime drops the
pending barge, and the agent continues to talk. The only cost of a real
interruption is the ~
barge_confirm_ms of extra latency before the cut.barge_confirm_ms: 0 to disable the hold. The interrupt then fires on the
very first frame of over-talk. Use 0 only on transports with client-side
echo cancellation (the browser path). There, a fast cut is wanted, and the
agent’s own audio cannot bleed back into the mic.
Backchannel suppression here is acoustic only. It is based on how long the
caller speaks, not on what they say. Lexical gating (to treat “stop”
differently from “uh-huh”) and provider-side semantic endpointing are not
built today. If you need word-aware interrupts, handle them in your own tool
logic.
Where barge-in actually works
Barge-in quality depends on whether the runtime can cancel the downstream provider mid-flight. The on-device VAD always detects the interruption. The honest question is whether the agent’s audio actually stops cleanly. A “partial” row is a known limitation, not a misconfiguration.
And by transport leg, where the caller’s audio actually comes from:
When you route media through an external agent-orchestration vendor, not the
built-in pipeline, the barge signal is only as good as that vendor’s adapter.
For the tightest interrupt budgets, keep the media on the native SIP/RTP,
browser, or WebRTC-fallback path.
Idle watchdog
The flip side of barge-in is silence. When both the caller and the agent go quiet, the idle watchdog can re-engage or end the call. Set it underturn_detection.idle:
soft_prompt_s— after this many idle seconds, the runtime nudges the model to speak (soft_prompt_text, or a bare re-engage on a realtime model).hangup_s— after this many idle seconds, the runtime drops the AI leg.
0 (off) in the raw schema. But the runtime ships sensible
ceilings: a re-engage prompt, a hangup, a capped response length, and a hard
maximum session duration. A stuck agent therefore cannot burn a call forever.
See Session lifecycle for those
guardrails.
Common gotchas
Related
Runtime configuration
See the full agent-config shape, including where
turn_detection lives.Handoffs
Learn what a barge-in and end-of-turn feed into when you transfer to a human.
Bring your own speech-to-speech
Use the client-commit path for self-hosted realtime models with no server VAD.
Debug barge-in
Trace why an interrupt did or did not fire on a live call.

