Framework guides
How to add human approvals to CrewAI
Bridge CrewAI review events into Contro1 for routing, approvals, and auditability.
CrewAI integrations work best when human review events carry execution IDs into Contro1 so the workflow can resume safely and only once.
Use the integration skill
Copy this skill link into your code agent to add CrewAI and Contro1 to your system.
Key takeaways
- CrewAI emits human-review webhooks; we turn each one into a Contro1 request and echo the decision back into the resume payload.
- Task(on_failure=...) hooks let you promote task exceptions to human decisions instead of silent failures.
- Idempotency uses crewai:{execution_id}:{task_id} so duplicate review events never create duplicate requests.
- Use an agent-role goal line to teach the crew when a human reviewer is mandatory.
When to reach for Contro1 with CrewAI
CrewAI is a natural fit for long-running, multi-agent workflows where different tasks need different approvers. A crew of agents might handle research, drafting, and scheduling autonomously, but publishing or sending an email is exactly the kind of task that needs a human sign-off.
Our bridge subscribes to CrewAI's human-review events and produces one Contro1 request per task_id. The response feeds back into CrewAI through the standard resume payload, so nothing in CrewAI has to know Contro1 exists.
Installation
Basic integration
Case continuity
Pass execution_id directly as correlation_id - no prefix or hashing needed. This groups every task review, callback mapping, and audit-only result for the same crew run into one case timeline.
Keep task_id in external_request_id because idempotency is per task review, not per execution.
Logging autonomous actions
Use log_action when a CrewAI task completes allowed work without a human decision, or when your bridge maps operator feedback back into CrewAI.
Set in_reply_to when the audit record explains what happened after a specific Contro1 request.
Gate the tool before it executes
The tool function itself is the right place to require approval for irreversible actions. The first line of a destructive tool calls Contro1 and blocks until an operator decides. Nothing runs until the human says yes - no prompt engineering needed.
Pause the agent on system error - orchestrator level
Attach an on_failure hook to risky Tasks. Instead of letting the crew fail silently and retry in a loop, promote the error to a human decision.
Escalate tool errors to a human
Inside tools your crew calls, escalate exceptions directly to Contro1 before they bubble back up. This keeps the operator close to the raw error context (stack trace, provider response) rather than CrewAI's abstraction of it.
Prompt engineering: force the agent to pause
Use the Agent role/goal/backstory to instruct the crew member that certain categories of output must always go through human review.
See our GitHub integration repo
Reference implementation for the CrewAI bridge, including resume payload mapping and deduplication guidance.
centcom-crewai on GitHub ยท crewai_bridge.py - full bridge example
Frequently asked questions
Why is correlation metadata so important in CrewAI?
Because you need to resume the exact execution and task safely after asynchronous human review. Pass execution_id and task_id through metadata on every request.
How do I handle duplicate review events?
Use crewai:{execution_id}:{task_id} as external_request_id. Contro1 returns the existing request instead of creating a second one.
Can I enforce approval at the crew level instead of per task?
Yes. Gate the final crew output with a single review task whose job is to emit the CrewAI human-review event before anything ships.
What if the reviewer rejects - does the crew retry forever?
No. Our bridge sets is_approve=false and passes the reviewer's comment into human_feedback. The crew sees this as a terminal "do not publish" signal unless your flow explicitly redirects to a redraft task.