Tool (or any Runnable) can use requires_approval, and any handler can call suspend().
Approval gates on steps
Wrap a step function in aTool with requires_approval:
status.reason == "approval_required". Independent gates in parallel all emit before the workflow stops, so you can approve multiple steps in one resume={...} call.
Full reference: Approval gates, including edit-on-approve, redaction, time limits, and approvals in workflows.
Suspend inside a step
Handlers that callsuspend() pause the workflow mid-step. The handler re-runs from the top on resume, so keep side effects after the suspend() call or make them idempotent.
Use Suspend & interaction tools for ask_user, ask_user_multi, confirm, and custom interaction tools.
Resuming
Call the workflow again withparent_id (the paused run id) and resume={approval_id: True} or resume={interaction_id: value}. Cross-process resume needs a durable tracing provider.
See also
- Errors & failure — pauses vs failures
- Human in the Loop overview