current_step or active_agent) that persists across turns, and the system reads this variable to adjust behavior—either applying different configuration (system prompt, tools) or routing to a different agent. This pattern supports both handoffs between distinct agents and dynamic configuration changes within a single agent.
Key characteristics
- State-driven behavior: Behavior changes based on a state variable (e.g.,
current_steporactive_agent) - Tool-based transitions: Tools update the state variable to move between states
- Direct user interaction: Each state’s configuration handles user messages directly
- Persistent state: State survives across conversation turns
When to use
Use the handoffs pattern when you need to enforce sequential constraints (unlock capabilities only after preconditions are met), the agent needs to converse directly with the user across different states, or you’re building multi-stage conversational flows. This pattern is particularly valuable for customer support scenarios where you need to collect information in a specific sequence — for example, collecting a warranty ID before processing a refund.Basic implementation
The core mechanism is a tool that returns aCommand to update state, triggering a transition to a new step or agent:
Why include a
ToolMessage? When an LLM calls a tool, it expects a response. The ToolMessage with matching tool_call_id completes this request-response cycle—without it, the conversation history becomes malformed. This is required whenever your handoff tool updates messages.Tutorial: Build customer support with handoffs
Learn how to build a customer support agent using the handoffs pattern, where a single agent transitions between different configurations.
Implementation approaches
There are two ways to implement handoffs: single agent with middleware (one agent with dynamic configuration) or multiple agent subgraphs (distinct agents as graph nodes).Single agent with middleware
A single agent changes its behavior based on state. Middleware intercepts each model call and dynamically adjusts the system prompt and available tools. Tools update the state variable to trigger transitions:Complete example: Customer support with middleware
Complete example: Customer support with middleware
Multiple agent subgraphs
Multiple distinct agents exist as separate nodes in a graph. Handoff tools navigate between agent nodes usingCommand.PARENT to specify which node to execute next.
Complete example: Sales and support with handoffs
Complete example: Sales and support with handoffs
This example shows a multi-agent system with separate sales and support agents. Each agent is a separate graph node, and handoff tools allow agents to transfer conversations to each other.
Context engineering
With subgraph handoffs, you control exactly what messages flow between agents. This precision is essential for maintaining valid conversation history and avoiding context bloat that could confuse downstream agents. For more on this topic, see context engineering. Handling context during handoffs When handing off between agents, you need to ensure the conversation history remains valid. LLMs expect tool calls to be paired with their responses, so when usingCommand.PARENT to hand off to another agent, you must include both:
- The
AIMessagecontaining the tool call (the message that triggered the handoff) - A
ToolMessageacknowledging the handoff (the artificial response to that tool call)
Why not pass all subagent messages? While you could include the full subagent conversation in the handoff, this often creates problems. The receiving agent may become confused by irrelevant internal reasoning, and token costs increase unnecessarily. By passing only the handoff pair, you keep the parent graph’s context focused on high-level coordination. If the receiving agent needs additional context, consider summarizing the subagent’s work in the ToolMessage content instead of passing raw message history.
AIMessage. This maintains valid conversation history and signals to the user interface that the agent has finished its work.
Implementation Considerations
As you design your multi-agent system, consider:- Context filtering strategy: Will each agent receive full conversation history, filtered portions, or summaries? Different agents may need different context depending on their role.
- Tool semantics: Clarify whether handoff tools only update routing state or also perform side effects. For example, should
transfer_to_sales()also create a support ticket, or should that be a separate action? - Token efficiency: Balance context completeness against token costs. Summarization and selective context passing become more important as conversations grow longer.