Skip to main content

Handoffs

Handoffs enable agents to transfer control to other agents during execution.

Overview

Handoffs allow:

  • Specialized agents for different tasks
  • Dynamic routing based on user needs
  • Collaborative multi-agent systems

Basic Usage

from openstackai import Agent, handoff

# Create specialized agents
sales_agent = Agent(
name="Sales Agent",
instructions="Handle sales inquiries"
)

support_agent = Agent(
name="Support Agent",
instructions="Handle technical support"
)

# Main agent with handoffs
triage_agent = Agent(
name="Triage Agent",
instructions="Route users to appropriate agent",
handoffs=[sales_agent, support_agent]
)

Handoff Decorator

from openstackai import Agent, handoff

@handoff(target="support_agent")
def transfer_to_support(reason: str):
"""Transfer the conversation to support team"""
return f"Transferring to support: {reason}"

agent = Agent(
name="Router",
handoffs=[transfer_to_support]
)

Conditional Handoffs

from openstackai import Agent

def should_handoff(context):
"""Determine if handoff is needed"""
if "billing" in context.message.lower():
return "billing_agent"
elif "technical" in context.message.lower():
return "support_agent"
return None

agent = Agent(
name="Router",
handoff_condition=should_handoff,
handoffs={
"billing_agent": billing_agent,
"support_agent": support_agent
}
)

Examples

Customer Service Bot

from openstackai import Agent, Runner

# Specialized agents
billing = Agent(
name="Billing",
instructions="Handle billing and payment issues"
)

technical = Agent(
name="Technical",
instructions="Handle technical support"
)

sales = Agent(
name="Sales",
instructions="Handle new purchases and upgrades"
)

# Router
router = Agent(
name="Customer Service",
instructions="""
You are a customer service router.
- Billing issues -> hand off to Billing
- Technical problems -> hand off to Technical
- Purchase inquiries -> hand off to Sales
""",
handoffs=[billing, technical, sales]
)

# Run
result = Runner.run_sync(router, "I can't log into my account")
# Automatically routes to Technical agent

Research Team

from openstackai import Agent

researcher = Agent(
name="Researcher",
instructions="Find and gather information"
)

analyst = Agent(
name="Analyst",
instructions="Analyze and synthesize findings"
)

writer = Agent(
name="Writer",
instructions="Write final report"
)

# Chain through handoffs
lead = Agent(
name="Research Lead",
instructions="""
Coordinate research:
1. Hand off to Researcher for gathering
2. Hand off to Analyst for analysis
3. Hand off to Writer for final report
""",
handoffs=[researcher, analyst, writer]
)

Handoff Context

from openstackai import handoff

@handoff
def transfer_with_context(agent, context):
"""Transfer with full context"""
return {
"target": agent,
"context": {
"user_id": context.user_id,
"history": context.messages[-5:],
"metadata": context.metadata
}
}

Handoff Events

from openstackai import Runner

async for event in Runner.run_stream(agent, message):
if event.type == "handoff":
print(f"Handing off to: {event.target}")
print(f"Reason: {event.reason}")
elif event.type == "response":
print(event.content)

See Also

  • [[Workflows]] - Multi-step workflows
  • [[Orchestration-Patterns]] - Orchestration patterns
  • [[Agent]] - Agent class