# Backchannels (/conversation/backchannels)

Backchannels are the small "mhm", "yeah" and "right" a listener says to show
they're following. Without them, a caller telling a long story talks into
silence and starts asking "are you there?".

```yaml title="config.cuelo"
turns:
  backchannel: true
  backchannel_model: maai # maai | vad
  backchannel_hold: 1200 # ms to wait after a "mhm" before taking the turn
```

## When to say it [#when-to-say-it]

| Value  | How it decides                                                                                       |
| ------ | ---------------------------------------------------------------------------------------------------- |
| `maai` | MaAI's VAP-BC model predicts, from both voices, the moments a listener would say "mhm". The default. |
| `vad`  | A short pause after a few new words. Cheap, and less well timed.                                     |

The policy plays a backchannel only while the agent is silent and no reply is
on its way.

## The hold [#the-hold]

<BackchannelDiagram />

After the agent says "mhm", the caller usually keeps going. But end-of-turn
models often fire on that same pause, and the agent would answer a story that
isn't finished. `backchannel_hold` makes the agent wait after a backchannel:

- If the caller **resumes** inside the hold, the agent stays quiet.
- If they **don't**, the agent takes the turn when the hold ends.

The default of 1200 ms suits storytelling and support calls. `0` turns it off
for snappier replies and fewer backchannels.

## Instant, in the agent's voice [#instant-in-the-agents-voice]

Backchannels never wait on TTS. Cuelo synthesizes "mhm", "mhmm", "yeah",
"okay", "right" and "uh-huh" once per voice and caches them under
`assets/phrases/<provider>-<voice>-<hash>/`. They play the moment the model
fires, and they're re-rendered automatically when the voice changes.

## Tuning [#tuning]

- **Too many:** raise the cooldown in a custom controller, or switch from `vad`
  to `maai`.
- **Interrupting the caller:** they're timed on pauses, so this usually means
  the caller pauses a lot. Lower the model threshold in `src/turns.py`.
- **Replies feel slow after a "mhm":** shorten `backchannel_hold`.

The dashboard marks every backchannel on the call timeline (`backchannel.played`),
so you can hear exactly where they landed.