Skip to Content
cuelo.

03Conversation

Backchannels

An agent that says "mhm" while the caller talks — at the moments a person would.

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?".

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

ValueHow it decides
maaiMaAI's VAP-BC model predicts, from both voices, the moments a listener would say "mhm". The default.
vadA 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

useragent“mhm”hold 1200 mspause: backchannel firesuser resumes inside the hold: no reply
backchannel_hold turns a mid-story pause into a “mhm” instead of a reply.

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

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

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

On this page