Readonly functionReadonly sessionReadonly speechReport progress from a long-running tool — and, on the first call, turn the tool
non-blocking so the conversation continues while execute() keeps running.
Behavior depends on whether this is the first update() for the call:
message and marks the
function call non-blocking (functionCall.extra.__livekit_agents_tool_non_blocking = true).
The framework treats message as the tool's immediate output to the LLM and returns
control to the session, so the agent can speak/listen while the tool continues in the
background. Whatever execute() ultimately returns is delivered later as a deferred reply.message is enqueued via the owning executor and delivered as a
fresh assistant turn, gated on the session being idle (so updates never talk over the user).
The arrival cadence is therefore conversational, not immediate.Message rendering:
updateTemplate — with {functionName},
{callId}, and {message} substituted. The default template tells the model the task is
still running and not to fabricate results.Every update is also recorded in RunContext.updates (with a _update_N call-id suffix
for the 2nd and later updates) so the full progress trail is preserved in chat history.
No-op for delivery when the tool isn't attached to an async-capable executor (e.g. a plain blocking tool): the update is still recorded but nothing is sent.
Progress text (templated) or a structured value (sent verbatim).
Per-call overrides; see RunContextUpdateOptions.
Waits for the speech playout corresponding to this function call step.
Unlike SpeechHandle.waitForPlayout, which waits for the full assistant turn to complete (including all function tools), this method only waits for the assistant's spoken response prior to running this tool to finish playing.
Speak filler audio while a long-running tool step is in progress.
The scheduler waits until the session is continuously idle for RunContextFillerOptions.delay milliseconds, then speaks
sourcethrough AgentSession.say. Whenintervalis set, it waits that many milliseconds before starting another idle dwell; otherwise it fires at most once. Agent speech, user speech, and RunContext.update reset any pending dwell so filler does not race real conversation turns.