A tool declared with 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.
For a Tool or a BaseTool, pass requires_approval=True to the constructor or set the field.

Pausing and resuming

Each 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:
In a stream, a paused call yields an 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.