Back to Adk Python

Multi-Agent Patterns

.agents/skills/adk-workflow/references/multi-agent.md

2.0.0b13.2 KB
Original Source

Multi-Agent Patterns

LLM-Based Multi-Agent (Chat Transfer)

python
from google.adk.agents.llm_agent import Agent

researcher = Agent(
    name='researcher',
    description='Researches topics.',
    instruction='You research topics and provide findings.',
    tools=[search_tool],
)

writer = Agent(
    name='writer',
    description='Writes content.',
    instruction='You write content based on research.',
)

root_agent = Agent(
    model='gemini-2.5-flash',
    name='coordinator',
    instruction=(
        'Delegate research to the researcher and '
        'writing to the writer.'
    ),
    sub_agents=[researcher, writer],
)

Key rules:

  • Only the root agent needs model=. Sub-agents inherit it.
  • Each sub-agent needs a description (used for routing).
  • Transfer between agents is automatic via LLM reasoning.
  • disallow_transfer_to_parent=True prevents back-transfer.
  • disallow_transfer_to_peers=True prevents peer-transfer.

Task-Based Multi-Agent (Structured Delegation)

For structured input/output, use task mode instead of chat transfer. See task-mode.md for full details.

python
from google.adk import Agent

worker = Agent(
    name='worker',
    mode='task',                     # or 'single_turn'
    input_schema=WorkerInput,
    output_schema=WorkerOutput,
    instruction='Do work, then call finish_task.',
    description='Performs structured work.',
)

root_agent = Agent(
    name='coordinator',
    model='gemini-2.5-flash',
    sub_agents=[worker],
    instruction='Delegate to worker via request_task_worker.',
)

Non-LLM Orchestration Agents

SequentialAgent

Runs sub-agents in order, one after another:

python
from google.adk.agents.sequential_agent import SequentialAgent

root_agent = SequentialAgent(
    name='pipeline',
    sub_agents=[step1_agent, step2_agent, step3_agent],
)

ParallelAgent

Runs sub-agents concurrently:

python
from google.adk.agents.parallel_agent import ParallelAgent

root_agent = ParallelAgent(
    name='fan_out',
    sub_agents=[task_a, task_b, task_c],
)

LoopAgent

Repeats sub-agents until exit_loop is called:

python
from google.adk.tools import exit_loop
from google.adk.agents.loop_agent import LoopAgent

looping_agent = Agent(
    name='checker',
    tools=[exit_loop],
    instruction='Check the result and call exit_loop if done.',
)

root_agent = LoopAgent(
    name='retry_loop',
    sub_agents=[worker_agent, looping_agent],
    max_iterations=5,
)

Model Configuration

  • Default model: gemini-2.5-flash
  • Override globally: Agent.set_default_model('gemini-2.5-pro')
  • Model inheritance: sub-agents inherit parent's model if not set
  • Non-Gemini models via LiteLlm:
    python
    from google.adk.models.lite_llm import LiteLlm
    root_agent = Agent(model=LiteLlm(model='anthropic/claude-sonnet-4-20250514'), ...)
    

Common Pitfalls

  • Agent stuck in sub-agent: Sub-agent has no path back to parent. Set disallow_transfer_to_parent=False (default) or add explicit transfer instructions.
  • Wrong agent handles request: Ambiguous description fields. Make each agent's description clearly differentiate its scope.
  • Circular imports: Define all agents in a single agent.py file, or use a shared module for sub-agents.