How Tools Execute

Every tool call plays out on a timeline with three phases: what the assistant says before the call, when the tool actually runs, and what the assistant says after. The configuration flags each change the timing of these phases: whether a phase exists, when it starts, whether it overlaps the others, and whether the caller can interrupt. Every diagram opens the same way, with the caller asking for something.

The first choice is the execution mode. Every other flag notes in its heading which modes it applies to, and each compares against the baseline (sync, all flags off).

Caller speech
Assistant speech
Tool executing
Blocked / dropped

execution_mode: sync vs async

The first and biggest choice. Sync (the default, and the baseline for the rest of this page): the assistant goes silent and the answer waits until the tool returns. Async: the assistant fires the tool and forgets it, the conversation keeps going in parallel. The key subtlety with async: the result is detached from tool timing. A reply before the tool finishes can’t use it, and the result then sits in context until a later turn actually needs it, whenever that happens.

SYNC (default / baseline)
Caller
asks something
Assistant
optional line
silent (waiting)
answers
Tool
executing
the assistant waits; the answer uses the result
ASYNC
Caller
asks something
asks again
Assistant
line + fires tool
reply (no result yet)
reply (uses result)
Tool
starts
...still running...
finishing
result waits in context →
the tool finishes early, but the result isn't used until a later turn needs it

require_speech_before_tool_call (sync and async)

Off (the baseline), the pre-tool line is optional: the model decides whether to say anything first. On, the assistant is forced to speak first, so the pre-tool line always appears and the tool never runs in silence.

OFF (default)
Caller
asks something
Assistant
optional line
answers
Tool
executing
ON
Caller
asks something
Assistant
required line
answers
Tool
executing

wait_for_speech_before_tool_call (sync and async)

To cut latency, Phonic normally dispatches the tool as soon as the model emits the call, which can overlap the assistant’s own speech. Turn this on to hold the tool until the assistant has finished speaking.

OFF (default)
Caller
asks something
Assistant
speaking…
answers
Tool
executing
tool dispatched immediately, overlapping the assistant's speech; the answer still waits for the result
ON
Caller
asks something
Assistant
speaking…
answers
Tool
executing
tool held until the assistant finishes speaking, then the answer follows

forbid_tool_call_after_speech (sync and async)

Off (the baseline), the assistant can call a tool even after it has already spoken in the turn. On, if the assistant already spoke this turn, the tool call is dropped rather than executed, useful for tools that only make sense as the very first thing the agent does.

OFF (default)
Caller
asks something
Assistant
speaks this turn
Tool
executes anyway
tool runs even though the assistant already spoke
ON
Caller
asks something
Assistant
speaks this turn
Tool
call dropped
because the assistant already spoke, the tool call is dropped

uninterruptible (sync only)

Off (the baseline), caller speech during a sync tool call cancels the call and the assistant handles the new input. On, the caller can’t interrupt the tool, but the assistant still hears them and can respond to it once the tool completes.

OFF (default)
Caller
asks something
barges in
Assistant
says a line
handles new input
Tool
executing
cancelled
caller speech cancels the running tool
ON
Caller
asks something
talks
talks
Assistant
says a line
answers (heard them)
Tool
executing (locked)
the caller can't interrupt the tool, but the assistant hears them and can respond afterward

forbid_speech_after_tool_call (sync and async)

Off (the baseline), the assistant generates a response once the result is back. On, no response is generated after the tool returns, useful when the tool’s side effect is the whole point and you don’t want the agent to narrate it.

OFF (default)
Caller
asks something
Assistant
says a line
answers
Tool
executing
ON
Caller
asks something
Assistant
says a line
stays silent after the tool
Tool
executing
no response generated after the tool returns

wait_for_response (async only)

Off (the baseline for async), the tool behaves like plain async: the result is added to context and used only when a later turn needs it, nothing is held. With wait_for_response on, the async tool enters “busy mode”: the agent stops offering other tools and stays on the task, keeps the caller posted while it waits, and proactively delivers the result the moment it lands. The conversation isn’t frozen: the caller and agent can still talk during the wait, the agent just can’t call other tools.

OFF (default async)
Caller
asks something
asks again
Assistant
line + fires tool
reply (no result yet)
reply (uses result)
Tool
starts
...still running...
finishing
result waits in context →
same as plain async: result waits in context, nothing is held
ON
Caller
asks something
checks in
Assistant
line + fires tool
tool has been called
status update
delivers result
Tool
starts
…still running…
finishing
result ready →
busy mode: the agent announces the call, then it and the caller keep talking (status updates, no other tools) while the tool runs; it delivers the result when it lands

Common combination: long-running background task

async + wait_for_response + forbid_speech_after_tool_call. Use this when a tool kicks off slow backend work (a lookup that takes several seconds, a booking, a payment) and you want the agent to acknowledge the request, skip narrating the tool call itself, keep the caller posted while it runs, then come back with the answer on its own. (Compare the wait_for_response timeline above, where the agent announces “tool has been called” right after firing; forbid_speech_after_tool_call is what removes that.)

FlagWhat it contributes
execution_mode: asyncthe call can take as long as it needs without blocking the turn or being cancelled by caller speech
wait_for_responsethe agent holds other tools and follow-ups, waits for the result, then proactively delivers it
forbid_speech_after_tool_callstops the agent from narrating or chattering right after it fires the tool
Caller
asks something
checks in
Assistant
line + fires tool
(no announcement)
status update
delivers result
Tool
starts
…still running…
finishing
result ready →
same timeline, but the empty slot after firing is the announcement that forbid_speech_after_tool_call removes