ref/AgenticSwimlanes.com
menu
HANDOFF PATTERNSLast verified: April 2026

Agent Handoffs: Patterns for Agent-to-Agent and Agent-to-Human (2026)

A handoff is the moment control passes from one actor to another. Handoff primitives are documented as named operations in OpenAI Swarm, LangGraph, and the A2A protocol; consolidated nowhere. The reference below is the cross-framework view, with the BPMN-correct shape for each pattern and the common failure modes.

PROCESSAGENT AAGENT BHUMAN REVIEWERTaskAgent A: triage×route?hand offAgent A: sendmessage flowAgent B: receiveand continueAgent B:completeEscalateambiguousCaughtHuman reviewsand decides
Canonical handoff swimlane. Agent A and Agent B occupy separate lanes inside the same pool; the handoff between them is a sequence flow within the pool when they share an organisation, or a message flow across pools when they do not. The agent-to-human escalation is a bpmn:signalEvent thrown in the agent lane and caught in the human lane.Source: shape semantics per OMG BPMN 2.0 §10.7.4 (message flow) and §10.7.6 (signal event). Handoff primitive references per OpenAI Swarm and LangGraph documentation, cited inline below.

Agent-to-agent handoff

OpenAI Swarm handoff primitive

OpenAI Swarm (released October 2024 as an experimental orchestration library) defines handoff as a first-class operation: an agent returns a reference to another agent, and the runtime continues execution under the receiving agent. The Swarm pattern is documented in its repository, github.com/openai/swarm (accessed April 2026). The functionality has been carried into the OpenAI Agents SDK as the handoff abstraction documented at openai.github.io / openai-agents-python / handoffs.

LangGraph handoff and interrupt

LangGraph (LangChain's graph-based agent framework) models handoffs as edges between graph nodes. Subgraphs allow nested agent groups; the Send primitive supports parallel handoffs. The framework also ships an interrupt primitive used for human-in-the-loop gates. The documentation is at langchain-ai.github.io / langgraph / concepts / multi_agent (accessed April 2026).

A2A protocol

The A2A (Agent-to-Agent) protocol, announced by Google and a coalition of partners in April 2025, is an open specification for cross-vendor agent handoffs over HTTP. It defines a discovery and a task-delegation API. The spec is at google.github.io / A2A (accessed April 2026). Cross-vendor handoffs are BPMN message flows across pools; the A2A specification provides the wire format.

Agent-to-human handoff

Reviewer pattern

The agent acts; the human reviews the output before the action is final. LangGraph's interrupt primitive is the canonical implementation: the graph pauses, the human approves or modifies, the graph resumes. In BPMN, the reviewer pattern is the agent service-task followed by a downstream bpmn:userTask in the human lane.

Arbiter pattern

The agent attempts to resolve the case. On low confidence or out-of-scope input, the case escalates to a human arbiter. The most-cited public example is Klarna's AI assistant operator report (February 2024) which describes the assistant resolving roughly two thirds of customer chats with the remainder routed to human agents. The escalation is a BPMN bpmn:signalEvent thrown in the agent lane and caught in the human lane.

Fallback pattern

The agent gives up. After N attempts or on a hard error, the agent terminates its branch and the case is queued for a human. The fallback pattern is documented in the OpenAI Agents SDK as max_turns and in LangGraph as a recursion limit; both surface a terminal state that downstream code interprets as “ask a human”.

BPMN representation of handoffs

Three BPMN shapes carry the handoff semantics. The choice depends on where the receiving actor sits.

  • Sequence flow (bpmn:sequenceFlow, spec §10.7.1) , the receiving actor is a different lane in the same pool. The default within a single organisation.
  • Message flow (bpmn:messageFlow, spec §10.7.4) , the receiving actor is in a different pool. The default for cross-organisation handoffs (e.g. invoking an external scheduling agent).
  • Signal event (bpmn:signalEvent, spec §10.7.6) , the receiving actor is one of several possible catchers. The default for escalation patterns where the human queue is the catcher and the agent does not name a specific human.

Common handoff failure modes

Loss of context

The receiving agent does not have the conversation history, the user context, or the in-progress state. The fix is explicit context payload on the handoff primitive (Swarm passes the conversation; LangGraph passes the state object); the BPMN-correct way to model the payload is a data object attached to the message flow.

Infinite handoff loops

Agent A hands to B, B hands back to A, repeat. The fix is bounded recursion (Swarm and LangGraph both surface a recursion limit) and a gateway with a counter on the BPMN diagram (an bpmn:exclusiveGateway guarding a retry).

Silent escalation drop

The escalation is thrown but no human queue is configured to catch it. The case sits in limbo. The fix is a catching event with a timer boundary (bpmn:boundaryEvent with a timer); if the human does not pick up within the SLA window, the case routes to a dead-letter queue or to a fallback supervisor.

Related pages