Skip to content

[FEATURE] Multi-Agent Primitives #214

Open
0 of 10 issues completed
Open
0 of 10 issues completed
@awsarron

Description

@awsarron

Problem Statement

Strands builders are increasingly asking for enhanced multi-agent capabilities that go beyond our current tool-based approach. Based on community feedback and customer requests, developers want:

  • First-Class Multi-Agent Patterns: Builders want native SDK support for common coordination patterns like hierarchical delegation, autonomous collaboration, and deterministic workflows
  • Seamless Agent Composition: The community is asking for the ability to easily combine different coordination styles - mixing autonomous swarms with deterministic graphs, nesting patterns within each other
  • Simplified Multi-Agent APIs: Developers want intuitive interfaces that make complex multi-agent systems as easy to build as single-agent applications
  • Better State Management: Requests for built-in persistence and state resumption capabilities that work seamlessly across multi-agent scenarios
  • Native Agent Orchestration: Builders want direct control over agent lifecycle, tool injection, and coordination without the overhead of tool-level abstractions

Proposed Solution

In response to builder requests, we propose introducing four core multi-agent orchestration primitives as top-level SDK concepts that address the complete spectrum of coordination patterns developers are asking for.

1. Agents-as-Tools

Specialized agents provided as tools to supervisor agents, enabling the hierarchical delegation patterns.

from strands import Agent

# Create specialized agents
research_assistant = Agent(
    name="research_assistant", 
    description="Use this agent to perform deep research on any topic.",
    system_prompt="You are a specialized research assistant with access to web search and analysis tools.",
    tools=[web_search, http_request, current_time, memory]
)

product_assistant = Agent(
    name="product_assistant",
    description="Use this agent for product recommendations and comparisons.", 
    system_prompt="You are a product specialist who helps with recommendations.",
    tools=[product_search, price_compare, review_analyzer]
)

travel_assistant = Agent(
    name="travel_assistant",
    description="Use this agent for travel planning and bookings.",
    system_prompt="You are a travel planning specialist.",
    tools=[flight_search, hotel_search, weather_check]
)

# Orchestrator agent coordinates specialists
orchestrator = Agent(
    name="travel_coordinator",
    tools=[research_assistant, product_assistant, travel_assistant]
)

# Natural delegation through tool calls
result = orchestrator("I need to plan a business trip to Amsterdam on August 10. Research the city, find good hotels, and book flights.")

2. Handoffs

Structured agent-to-agent and agent-to-user communication through injected coordination tools that enable the explicit control transfer.

from strands import Agent
from strands.multi_agent import handoff_to_agent, get_swarm_context, handoff_to_user

# Agents automatically receive coordination tools
sales_agent = Agent(
    name="sales",
    system_prompt="Handle initial customer inquiries and qualify leads.",
    tools=[crm_lookup, handoff_to_agent, handoff_to_user]
)

technical_agent = Agent(
    name="technical", 
    system_prompt="Provide technical support and troubleshooting.",
    tools=[knowledge_base, system_check, handoff_to_agent, handoff_to_user]
)

# Agents can hand off with context preservation
# Sales agent handling inquiry:
handoff_to_agent(
    target_agent="technical",
    message="Customer needs help with API integration error",
    context={
        "customer_id": "12345",
        "issue_type": "integration",
        "priority": "high"
    }
)

3. Swarms

Self-organizing collaborative agent teams with shared working memory.

from strands import Agent
from strands.multi_agent import Swarm

# Create agents with different specializations
researcher = Agent(
    name="researcher",
    system_prompt="You research topics thoroughly using web search.",
    tools=[web_search, memory]
)

analyst = Agent(
    name="analyst", 
    system_prompt="You analyze data and create insights.",
    tools=[calculator, data_processor, memory]
)

writer = Agent(
    name="writer",
    system_prompt="You write comprehensive reports based on research and analysis.",
    tools=[file_write, document_formatter, memory]
)

# Swarm automatically injects coordination tools
market_research_team = Swarm(
    agents=[researcher, analyst, writer],
)

# Agents coordinate autonomously to complete the task
results = await market_research_team.execute(
    "Analyze the current AI agent market trends and create a comprehensive report"
)

# Check coordination summary
summary = market_research_team.get_swarm_summary()
print(f"Agents used: {' → '.join(summary['swarm_history'])}")
print(f"Status: {summary['status']}")

4. Graphs

Deterministic workflow orchestration with conditional execution paths for structured control over multi-agent orchestration.

from strands import Agent
from strands.multi_agent import GraphBuilder

# Create specialized agents
analyzer_agent = Agent(
    name="analyzer",
    system_prompt="Analyze customer requests and categorize them.",
    tools=[text_classifier, sentiment_analyzer]
)

ai_processor = Agent(
    name="ai_processor", 
    system_prompt="Handle routine requests automatically.",
    tools=[knowledge_base, auto_responder]
)

def get_human_input(request):
    """Function for human escalation"""
    return {"requires_human": True, "escalated_request": request}

def is_approved(analysis_result):
    """Condition function for routing"""
    return analysis_result.get("confidence", 0) > 0.8

def is_critical(analysis_result):
    """Condition function for critical cases"""
    return "urgent" in analysis_result.get("categories", [])

# Build deterministic workflow
builder = GraphBuilder()
builder.add_node(analyzer_agent, "analyze")
builder.add_node(ai_processor, "ai_processor")
builder.add_node(get_human_input, "manual_processor")

# Define conditional edges
builder.add_edge("analyze", "ai_processor", condition=is_approved)
builder.add_edge("analyze", "manual_processor", condition=is_critical)
builder.set_entry_point("analyze")

customer_support_graph = builder.build()

# Execute with deterministic routing
results = await customer_support_graph.execute(
    "Please refund my order #12345, it was damaged during shipping"
)

Advanced Composability

The primitives naturally compose to handle complex scenarios builders envision:

# Swarm of graphs - each research area has its own workflow
research_workflows = [
    create_market_analysis_graph(),  # type is strands.multi_agent.Graph
    create_competitor_analysis_graph(), 
    create_trend_analysis_graph()
]

analysis_swarm = Swarm(
    research_workflows,  # Graphs as swarm members
)

# Graph with swarm nodes - structured workflow with collaborative stages
content_pipeline = GraphBuilder()
content_pipeline.add_node(research_swarm, "research_phase")  # research_swarm type is strands.multi_agent.Swarm
content_pipeline.add_node(writing_swarm, "writing_phase") 
content_pipeline.add_node(review_agent, "final_review")
content_pipeline.add_edge("research_phase", "writing_phase")
content_pipeline.add_edge("writing_phase", "final_review")
content_pipeline.set_entry_point("research_phase")
content_graph = content_pipeline.build()

# Agents-as-tools within swarms - specialists available to team members
code_writer = Agent(
    name="code_writer",
    system_prompt="Write code, test it, debug, iterate until it works! Work in coordination with the code_reviewer to get feedback on your code and implement the feedback until they are satisfied.",
    tools=[file_read, file_write, editor, shell, journal]
)
code_reviewer_python = Agent(
    name="code_reviewer_python",
    system_prompt="Review the code thoroughly and offer suggestions for improvements if there are any. Iterate with the code_writer until you are satisfied with the code that they have written.",
    tools=[file_read, python_repl]
)
code_reviewer = Agent(
    name="code_reviewer",
    system_prompt="Analyze and review the Python code thoroughly.",
    tools=[code_reviewer_python, memory]  # code_reviewer_python included as an Agent-as-a-Tool
)
specialist_swarm = Swarm(
    agents=[code_writer, code_reviewer],  # code_reviewer_python is not included directly in the Swarm, instead it is called by the code_reviewer agent
)

Use Case

Agents-as-Tools: Consultation Model

Specialist Consultation: Main agent consults domain experts without giving up control
Hierarchical Decision Making: Senior agent delegates specific analysis to junior specialists
Expert Advisory: Orchestrator maintains oversight while leveraging specialized knowledge
Tool-like Interaction: Agents used as sophisticated, intelligent tools with natural language interfaces

Handoffs: Delegation Model

Sequential Processing: Work passes from one agent to another in a chain
Context Preservation: Full state transfer between agents with conversation history
Human-in-the-Loop: Agents can escalate to humans at decision points
Responsibility Transfer: Clear handoff of ownership and accountability

Swarms: Self-Organizing Teams

Autonomous Collaboration: Agents coordinate themselves without central control
Dynamic Task Distribution: Work allocation emerges from agent capabilities and availability
Collective Intelligence: Shared working memory enables emergent problem-solving
Adaptive Coordination: Team structure adapts to task requirements in real-time

Graphs: Deterministic Orchestration

Conditional Branching: Different execution paths based on runtime conditions
Workflow Control: Explicit definition of agent interaction sequences
Quality Gates: Validation checkpoints that control flow progression
Parallel Processing: Multiple agents working simultaneously on independent tasks
Error Handling: Predefined fallback paths and recovery mechanisms

Composable Patterns

Nested Coordination: Swarms within graphs, graphs as swarm members
Multi-Modal Teams: Combining autonomous and deterministic coordination
Scalable Hierarchies: Complex organizational structures with multiple coordination layers
Pattern Mixing: Different coordination styles for different phases of work

Additional Context

  • Optional name and description parameters will be added to the Agent class.
  • The existing swarm and agent_graph tools interfaces will be enhanced and use the underlying SDK multi-agent primitives. This means that your agents can autonomously create and execute their own swarms and graphs using a model-driven approach.

Please share your feedback and use cases to help shape multi-agent primitives in Strands Agents.

Sub-issues

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Projects

Status

We're Working On It

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions