Documentation Index
Fetch the complete documentation index at: https://docs.swarmd.ai/llms.txt
Use this file to discover all available pages before exploring further.
Human-in-the-Loop (HITL)
Human-in-the-loop lets you pause agent communication and require manual approval before a message is forwarded. This is critical for high-stakes operations where you need a human to verify what an agent is about to do.How HITL Gets Triggered
There are two distinct ways a message can be held for human review:| Source | How it happens | Typical use case |
|---|---|---|
| Policy escalation | A detection policy with action HUMAN_REVIEW_REQUIRED matches the message | Compliance rules, PII detection, restricted operations |
| Agent-initiated | The downstream agent returns task status INPUT_REQUIRED | Agent is uncertain, needs clarification, or is designed to ask for confirmation |
These are fundamentally different flows. Policy escalation is triggered by a detection policy (regex, Presidio, Comprehend) at the relay level — before or after the message reaches the agent, depending on which leg matched. Agent-initiated
INPUT_REQUIRED happens when the agent has processed the message and decided it needs human input. Both are automatically intercepted by the relay’s built-in HITL middleware.Setting Up Policy-Based HITL
To escalate messages for human review, set theaction to HUMAN_REVIEW_REQUIRED on any detection policy (regex, Presidio, or Comprehend). There is no separate “HITL policy type” — human review is an action you configure on your existing detection policies.
- API
- UI
Reviewing Approvals
When a message is held for review, it appears as a pending approval.List Pending Approvals
- API
- UI
Get a Specific Approval
- API
- UI
Key Fields in an Approval
| Field | Description |
|---|---|
detectionSource | POLICY_ESCALATION (from a policy) or AGENT_INPUT_REQUIRED (from the agent) |
agentMessageText | The message content that triggered the review |
matchedContent | The specific content that matched the policy (if policy-triggered) |
policyName | The name of the policy that triggered escalation (if policy-triggered) |
sourceAgentId / sourceUserId | Who sent the message |
sinkAgentId | The target agent |
resolution | null if pending, otherwise contains the resolution details |
Resolving Approvals
Approve
Approving a request allows the message to continue through the relay to the target agent.- API
- UI
- The held message is forwarded to the target agent
- The task resumes from where it was paused — callers polling
tasks/getwill seecompletedstate with the full agent response - The
relay_reasonmetadata is no longer present in the resolved response - The approval, resolution, and reviewer are recorded in the audit log
Reject
Rejecting a request stops the message from being forwarded. The task is cancelled.- API
- UI
- The message is not forwarded
- The associated task is cancelled — callers polling
tasks/getwill seecanceledstate withrelay_reason: "HITL_REJECTED"in the metadata (includingpolicy_name,policy_version, andpolicy_levelif the hold was policy-triggered) - The rejection reason is recorded in the audit log
Policy Escalation vs Agent INPUT_REQUIRED
It’s important to understand the difference between these two flows:| Policy Escalation | Agent INPUT_REQUIRED | |
|---|---|---|
| Triggered by | A detection policy with HUMAN_REVIEW_REQUIRED action | Downstream agent returning INPUT_REQUIRED task status |
| When | During relay policy evaluation (on the matching leg) | After the agent has processed the message |
| Detection source | POLICY_ESCALATION | AGENT_INPUT_REQUIRED |
| Approval fields | policyName and matchedContent populated | policyName and matchedContent are null |
| Use case | Compliance, safety guardrails | Agent needs clarification or confirmation |
| On approve | Calls resumeTask() — the original held message is forwarded to the target agent | Calls resumeTask() — a confirmation response is sent to the agent |
Response Metadata — relay_reason
When the relay masks a response due to HITL (or a timeout), it sets a relay_reason field in the response metadata. This tells API consumers why the relay has taken ownership of the task. The response metadata is a strongly-typed discriminated union — the shape of the metadata depends on the relay_reason value.
relay_reason | status.state | Meaning | Additional fields |
|---|---|---|---|
TIMEOUT | working | Agent didn’t respond within the early-return timeout window | (none) |
HITL_HELD | working | Held for human review by a detection policy | policy_name, policy_version, policy_level |
HITL_HELD_AGENT_INPUT_REQUIRED | working | Agent explicitly requested human input (no policy involved) | (none) |
HITL_REJECTED | canceled | Human reviewer rejected the HITL request | policy_name, policy_version, policy_level (nullable) |
policy_name, policy_version, policy_level) are included for HITL_HELD and HITL_REJECTED to give consumers context about which policy triggered the hold. These fields are nullable on HITL_REJECTED — they will be null if the original hold was agent-initiated rather than policy-triggered.
policy_level indicates the scope at which the policy is bound: TENANT, AGENT, or SUBSCRIPTION.
Example metadata for a policy-held response:
For full frontend integration details — including how to route UI behavior based on
relay_reason, polling patterns, and decision flowcharts — see the Frontend Integration tutorial.Auditing HITL Decisions
Every HITL event is recorded in the audit log with specific audit types:| Audit Type | Description |
|---|---|
HITL | HITL detection occurred (policy escalation or agent input-required) |
HITL_GUARD | The message was held and the task is guarded pending review |
HITL_RESOLUTION | The approval was resolved (approved or rejected) |
- API
- UI
correlationId from the approval:Required Permissions
To manage HITL approvals, users need the following permissions (granted through group membership):| Action | Required Permission |
|---|---|
| List / view approvals | AGENT_CONVERSATIONS:READ |
| Approve or reject | AGENT_CONVERSATIONS:WRITE |
Next Steps
Frontend Integration
Handle HITL responses in your frontend for both channel and user access.
Monitoring & Audit
Track all agent activity and HITL decisions in the audit log.
