requires_approval=True never runs on the model’s say-so alone. When the model calls it, the run pauses: the response has finish_reason="approval_required" and lists the calls in pending_approvals. The next run takes the decisions and resumes where it stopped.
Tool or a BaseTool, pass requires_approval=True to the constructor or set the field.
Pausing and resuming
ToolApprovalRequest has tool_call_id, tool_name and tool_args. The decisions map a call id to:
Only an explicit
True approves. Other tool calls of the same turn run without waiting; only the gated ones pause. response.content holds whatever text the model wrote in the paused turn.
Moving on without answering
If the user sends a new message instead of deciding, run the agent with that message: the pending calls are refused (“The user did not answer this approval request and sent a new message instead.”), and the conversation continues.Across processes
A paused run keeps no state outside the history: the pending calls are the last tool calls without a result. A web application can save the history, return the requests to the browser, and resume later in another process:AgentEventToolApprovalRequired event.
Retries
A tool that requires approval runs exactly once: a retry after a failure could repeat a side effect the user approved a single time.In delegated agents
- A sub-agent may use tools that require approval: the orchestrator’s run pauses, the requests carry
subagent_call_id, and the decisions are handed down to the sub-agent, which resumes. - A team member cannot ask for approval: its delegation fails with a message the orchestrator can act on.
With Temporal
AgentWorkflow waits durably for decisions, for hours or days, and exposes them through a query and a signal. See Durable execution.