EvalLayer vs HumanLayer: policy brain, approval rail
HumanLayer is an approval rail: it pauses an AI agent's risky actions and routes them to humans over Slack or email for sign-off. EvalLayer is a policy brain: it checks each consequential action against commercial rules and decides allow, rewrite, require approval, or block automatically, with humans reserved for the cases that earn escalation. The two answer the same question at different altitudes, and the honest comparison is less either/or than order-of-operations.
What HumanLayer is
HumanLayer is an API and SDK at the tool-calling layer. When an agent is about to do something the developer marked as risky, HumanLayer holds the action and sends an approval request to a person or a team, through Slack, email, or other channels, with escalations, timeouts, and webhooks around the loop. It is model-agnostic and framework-agnostic, and it has a genuinely good developer experience for wiring a human into an agent workflow.
Its core design assumption: the way to make a risky action safe is to ask a human first.
What EvalLayer is
EvalLayer's authorization layer takes the agent's intended action plus a commercial policy (discount authority, spend limits, forbidden commitments, approved claims, required disclaimers, blocked topics) and returns one of four decisions: allow, rewrite with a compliant version attached, require_approval, or block. Deterministic checks handle everything countable; one model pass handles semantics; every decision is stored as an audit record.
Its core design assumption: most actions can be decided by policy in about a second, and human attention should be spent on the residue.
The comparison
| Dimension | HumanLayer | EvalLayer |
|---|---|---|
| Primary job | Route risky actions to humans for approval | Decide actions against commercial policy automatically |
| Decision maker | A person, every time | Policy engine; people only on require_approval |
| Policy model | Developer marks which tools/actions need approval | Structured commercial policy evaluated per action content |
| Decisions returned | Approved / rejected (by the human) | allow / rewrite / require_approval / block |
| Rewrite path | No; a human edits or rejects | Yes; compliant rewrite generated and re-checked |
| Latency profile | Human response time (minutes to hours) | Milliseconds deterministic, one to two seconds semantic |
| Scales to | Actions worth human minutes | Every consequential action, with humans on the residue |
| Audit record | Approval trail of who signed off | Policy applied, violations found, decision, content hash |
Where each one wins
If your agents take a handful of genuinely high-stakes actions a day (production deployments, large payments, contract sends), approval-for-everything is correct and HumanLayer's ergonomics are excellent for it.
If your agents produce hundreds or thousands of outbound messages, quotes, replies, and refunds, approval-for-everything quietly turns into one of two failure modes: reviewers rubber-stamp (the control becomes theater) or the queue backs up (the automation becomes pointless). That volume regime is what a policy engine is for. The math is covered in routing the 2% that matters.
Using both
The architectures compose cleanly. EvalLayer sits first and decides everything it can: clean actions ship, hard violations block, fixable violations come back rewritten. The require_approval slice, arriving with named violations and excerpts, flows to whatever approval rail your team already answers, whether that is HumanLayer, a Slack workflow, or a queue in your own admin. A reviewer who sees "over_discount: 25% exceeds this agent's 15% authority" makes a faster, better decision than one staring at a raw transcript.
Policy first, people second. Not because people matter less, but because their attention is the scarcest resource in the loop, and policy is how you spend it where it counts.