Concept
A single agent owns the conversation and the outcome. It can gather information, call tools, answer, and complete the request without transferring ownership. A specialist design separates the front door from the business owners. A supervisor receives the user request, chooses the right owner, and usesHANDOFF when another agent should take over. A specialist owns one capability, such as account access, order status, billing, claims, device care, or employee benefits.
The design question is ownership. If one team, policy set, permission model, and success criteria can own the outcome, keep one agent. If different teams, tools, policies, or escalation paths own different parts of the experience, use specialists.
Decision guide
Do not split agents just because a domain is large. Splitting adds routing, context-passing, target-agent readiness, testing, monitoring, and fallback design.
Minimal working example: one agent owns the outcome
This example is one agent file. It is enough when order-status work has one owner and one required field.agents/account-support-agent.agent.abl
agents/order-status-agent.agent.abl
agents/live-agent.agent.abl
AGENTS: is a readable roster. HANDOFF is the executable routing surface. customer_id is gathered before handoff and passed to the specialists with PASS.
Since none of the HANDOFF entries above declare HISTORY, each specialist now receives the full conversation history by default (the current platform default when HISTORY is omitted). Also, because each WHEN here is a single-field comparison (intent.category == "account"), an unset field simply makes the comparison evaluate false — no error, and the trace shows your literal source text.
When to use handoff
UseHANDOFF when the target agent should own the next part of the conversation.
Use RETURN: true when the specialist should do bounded work and return control to the supervisor. Use RETURN: false when the target agent or human channel should keep ownership.
When to use delegate
UseDELEGATE when the parent agent keeps the conversation but asks another agent for a result.
This example is a two-agent project set. The child produces total_fee, and the parent maps that result into quoted_fee.
agents/booking-manager.agent.abl
agents/fee-calculator.agent.abl
Verification
- Validate all files in the project together, not only the supervisor.
- Send an account access utterance and confirm the selected tool or trace shows
handoff_to_Account_Support_Agent. - Send an order-status utterance and confirm ownership moves to
Order_Status_Agent. - Send “I need a person” or an unclear request and confirm the fallback route reaches
Live_Agent. - For the delegate example, send “What would it cost to change this booking?” and confirm the parent stays active while
Fee_Calculatorreturnstotal_fee.
Production readiness checklist
- Every
HANDOFF TOandDELEGATE TOtarget exists in the project or is configured as an external/remote agent. - Every
PASSfield is gathered, read from memory, produced by a tool, or supplied by the channel before it is needed. - Each route has a distinct business owner and success criteria.
- A fallback or human route exists for unclear, unsupported, or high-risk requests.
- Test utterances cover every route, delegate failure, and human escalation.
- Trace/debug review confirms selected route, target agent, return behavior, and context passed.