Workflows pause for user action at three levels:Documentation Index
Fetch the complete documentation index at: https://docs.agno.com/llms.txt
Use this file to discover all available pages before exploring further.
| Level | What pauses | Configured on | Guide |
|---|---|---|---|
| Step-level | The workflow primitive, before or after it executes | Step, Loop, Router, Condition, Steps | Step HITL |
| Executor-level | A tool call inside the agent or team running the step | The @tool decorator | Executor HITL |
| Nested | Both gates on the same step, in sequence | Both of the above | Nested HITL |
workflow.continue_run(run_output) to resume from where it left off.
Pick a Level
| You want to… | Use |
|---|---|
| Approve a whole step before it runs | Step confirmation |
| Collect parameters before a step runs | Step user input |
| Review a step’s output after it runs | Output review |
| Let the user pick which Router branch executes | Router selection |
| Review each iteration of a Loop | Loop iteration review |
| Pause a specific tool call inside an agent | Executor confirmation |
| Have an agent’s tool ask the user for argument values | Executor user input |
| Defer a tool’s execution to an external system | External execution |
| Combine a step gate and a tool gate on the same step | Nested HITL |
| Pause when a step errors | Error handling |
| Auto-resolve a pause if the user is slow | Timeout |
Step-Level vs Executor-Level
| Aspect | Step-Level | Executor-Level |
|---|---|---|
| Configured on | The workflow primitive (Step, Loop, etc.) | The tool, via @tool(...) |
| When it pauses | Before or after the step executes | During the step, when the agent calls the tool |
pause_kind | "step" | "executor" |
| Pause event | StepPausedEvent, RouterPausedEvent, StepOutputReviewEvent | StepExecutorPausedEvent |
| Continue event | StepContinuedEvent | StepExecutorContinuedEvent |
| Use case | Gate the whole step | Gate a specific tool call |
| Resolved by | req.confirm(), req.set_user_input(...), req.select(...) | executor_req.confirm(), executor_req.provide_user_input(...) |
Supported Primitives
User input is currently supported on
Step (to collect parameters) and Router (to select routes). Other primitives support confirmation only.Requirements
HITL workflows need a database to persist state between pauses.Run Output Properties
When a workflow pauses, inspectWorkflowRunOutput:
| Property | Description |
|---|---|
is_paused | True if waiting for user action |
pause_kind | "step" or "executor" |
paused_step_name | Name of the step where the pause occurred |
step_requirements | List of pending requirements (last entry is the active one) |
steps_requiring_confirmation | Filter: steps needing confirm/reject |
steps_requiring_user_input | Filter: steps needing user input values |
steps_requiring_output_review | Filter: steps needing output review |
steps_requiring_route | Filter: routers needing route selection |
steps_with_errors | Steps that failed with on_error="pause" |
step_requirements to determine the current pause type. Earlier entries are history. See Nested HITL.
For the full structure of every pause object (WorkflowRunOutput, StepRequirement, and executor requirements) and the methods that resolve each, see Pause Anatomy.
OnReject Behavior
on_reject controls what happens when a user rejects a step.
| Value | Behavior |
|---|---|
OnReject.skip | Skip the step and continue (default for most primitives) |
OnReject.cancel | Cancel the entire workflow |
OnReject.retry | Re-execute the step. Pair with reject(feedback=...) to send feedback. See Output Review |
OnReject.else_branch | For Condition only: execute else_steps (default for Condition) |
Timeout
Every HITL pause can have a deadline. If the user does not respond in time,on_timeout decides what happens.
Streaming
HITL works with streaming. Watch for pause events; read the paused run from the session.WorkflowRunOutput (including step_requirements) is persisted to the database, not yielded as a stream event.
The @pause Decorator
Mark custom function steps with HITL configuration.Guides
HumanReview Config
All HITL settings in a single config object
Step HITL
Confirmation, user input, and output review on steps
Executor HITL
Tool-level HITL inside agents and teams
Nested HITL
Combine step-level and executor-level on the same step
Pause Anatomy
The objects a paused run exposes and how to resolve them
Output Review
Review, edit, or reject output after a step runs
Router HITL
Route selection, confirmation, and output review
Condition HITL
User-controlled branching decisions
Loop HITL
Start confirmation and per-iteration review
Steps HITL
Confirm before executing a pipeline
Timeout
Auto-resolve HITL pauses after a deadline
Error Handling
Retry or skip failed steps