Which calls pause, and how
A client tool call whose input fails the tool’s
input_schema is never handed to you, even after an approval. The platform answers the model with an error naming the schema failure, and the model can try again.
When a model round contains any call that needs confirmation, the whole round pauses. Nothing in that round runs until you post confirmations.
Declare a client tool
Client tools live intools.client_tools of the instance config. See Instance configuration for every rule.
The examples on this page come from Harbor Group, a fictional company that reviews its suppliers. Its application keeps a record for each supplier. One tool reads a supplier’s review status; the other emails the supplier’s contact a reminder.
Handle a handoff
1
Read the tool_use frames
The segment ends with one or more
tool_use frames, then turn_end with stop_reason: "tool_use".2
Run the tool in your application
Execute each call with its
input, on behalf of the same end user.3
Post tool_results
Post one result per handed-off call. The ids must cover exactly the pending calls: no missing ids, no extras, no duplicates.The next segment starts with a
conversation frame (no user_message_id), then a tool_activity frame per result with phase: "completed", or "failed" when you set is_error: true. The model continues from there.tool_results fields:
Handle a confirmation
1
Read the pending_confirmation frames
The segment ends with one
pending_confirmation frame per call that needs approval, then turn_end with stop_reason: "pending_confirmation".execution tells you where the call runs once approved: client means it comes back to you as a handoff, platform means the platform runs it.2
Show the action and collect a decision
Show your user the tool name and
input. The approval is for exactly what you displayed.3
Post confirmations
Post one decision per paused call, covering exactly the paused ids.
confirmations fields:
What happens on resume:
- A denied call is answered to the model as an error carrying your
reason, and atool_activityframe withphase: "failed"is sent. - An approved platform call runs on the server.
- An approved client call is handed to you: a
tool_activityframe withphase: "started", atool_useframe, thenstop_reason: "tool_use". Posttool_resultsfor it as in the handoff flow. - Calls in the paused round that needed no approval run (platform) or are handed off (client) in the same segment.
- When no client call is handed off, the model continues in the same segment.
The environment of an approved action
An approval covers the action as it was displayed, including the environment it would act on. The platform records the environment when the turn pauses, and the approved calls run against that environment, never the one on the resuming request. If a paused action has no recorded environment,confirmations returns 409 confirmation_environment_unpinned, and the pause stays open: a new message in the same conversation gets 409 pending_turn. Start a new conversation and ask the question there.
Rules that return errors
A client that lost its local state learns from
pending_turn which resume is owed (pause_kind) and for which calls (pending_call_ids). The error does not carry tool names or inputs. Read them from the tool_use blocks in the transcript with GET /conversations/{conversation_id}, matching each block’s id to a pending call ID. The platform does not store a client tool’s result until you post it, so keep results your application computed until tool_results succeeds.
What is recorded
Each call to a declared tool is recorded as a tool event with the tool name, where it ran (platform or client), its outcome (ok, error, invalid_input, pending_confirmation, denied, approved), and its duration in milliseconds. For a client tool the duration runs from the handoff to your tool_results request. A call to a tool name the instance does not declare gets an error result and no tool event. Tool events appear in the conversation export.
In evaluation runs, no application is attached, so scenario scripts supply client tool results and confirmation decisions by tool name. An unscripted confirmation is denied.
Platform tools
Tools the platform runs on the server.
Turns and streaming
Frames, stop reasons, and errors.