requires_confirmation, requires_user_input, or external_execution. The pause propagates from the agent/team up to the workflow. The paused tool calls arrive as serialized requirement dicts; you resolve them by mutating the dicts, then continuing the run.
When to Use
Use executor-level HITL when the gate is on the tool, not on the step. The agent can call other tools freely; only the marked tool pauses execution.
Tool Decorators
Three decorator flags trigger executor-level pauses. They behave the same as on standalone agents.The Pause Object
An executor pause setsrun_output.pause_kind == "executor". The matching StepRequirement has requires_executor_input == True and holds the paused tool calls in executor_requirements. Each entry is the agent’s RunRequirement serialized to a dict:
continue_run.
See Pause Anatomy for the full structure of every pause object and its fields.
Resolving Each Type
Confirmation
User Input
External Execution
@tool(external_execution=True) means the agent never runs the tool itself. The workflow pauses, hands you the tool name and arguments, and you run it however you want: call a backend service, dispatch a job, hit a privileged API. Set the result on the requirement, and the agent resumes with that result.
Streaming
In streaming mode the workflow yields aStepExecutorPausedEvent when the agent’s tool call pauses, and a StepExecutorContinuedEvent when execution resumes.
After a streaming run pauses, read the paused run from
workflow.get_session().runs[-1]. step_requirements is persisted to the database, not emitted as a stream event.Composite Steps
Executor HITL works inside any composite step that contains aStep with an agent or team. The pause propagates up through the wrapping primitive.
step_requirements, find the entry with requires_executor_input, and resolve its executor_requirements.