Skip to main content
A filler is a generated phrase such as “One moment, let me check.” It can cover a tool’s waiting period before the substantive answer arrives. It uses the session’s speech output, so it can be heard on phone and browser transports.

Enable one filler

Keep the agent and slow lookup from Using tools. Add this line after the Agent(...) definition, preserving the existing greeting and language:
Restart the server and start a new session. Ask “Check order 101.” When the lookup remains pending, the assistant can say a short waiting phrase, then give the delivery result. Turn the browser thinking sound off for this test so you can hear the filler behavior on its own. The default delay is one second; generation has a five-second timeout. A fast tool gets no filler. If generation is too slow or the reply starts first, the phrase is skipped. The default is at most one filler per turn.

Control the wording and timing

Replace that line with:
Generation starts when the tool call is detected and overlaps the delay. The phrase is spoken only while the turn still needs a filler and no substantive reply has started. Omit model to use the session’s LLM, or set a full provider/model ID to choose a separate generator.

Longer waits

For tools that legitimately take longer, opt into repeats:

Before the first tool call

A reasoning model can think for several seconds before it says or calls anything, and a tool-call filler cannot cover that. think_delay_secs arms the filler when the turn starts: if nothing has been said and no tool has been called that long after the user finished, the first filler is spoken anyway. A tool call before then still gets its filler after delay_secs, whichever comes first. A tool called after that filler gets one of its own, delay_secs after the later of the call and the filler, even without repeat_secs; max_per_turn: 1 turns that off. Pair it with phrases, ready-made lines for the first filler of a turn. They are spoken with no LLM round trip, so the line lands on time; follow-ups are still generated from the request, so they can say what the assistant is working on. Key them by the call’s language, with "*" for any other:
The line said on the previous turn is avoided when there is another to choose. A language with no entry falls back to a generated first line. Regions are dropped on both sides, so an "es-ES" key serves a call configured as "es" and the other way round. The language is the session’s configured language, not one the speech-to-text provider detects. With language unset (auto-detect), only the "*" lines are used, so set it per call when callers speak different languages. Only the session agent’s own reply is spoken. An agent it calls as a tool streams its text through the same run, and that text — working notes, a document being drafted — is never read aloud. Repeats are bounded and stop being useful once the answer arrives or the turn is interrupted. Test with representative tool latency; repeated acknowledgements can distract from the actual answer. Fillers consume LLM and TTS usage and appear in transcripts as fillers. First-audio latency can measure a filler instead of the useful answer; see Events and usage. Set agent.voice_config["filler"] = {"enabled": False} to explicitly disable an inherited filler. Empty objects mean unset, rather than disabling a server default. Continue to Background audio for a separate, optional room-tone layer, or Turn-taking and interruptions.