Files
english/.opencode/skills/google-adk-python/references/multi-agent-and-a2a-protocol.md
2026-04-12 01:06:31 +07:00

3.8 KiB

Multi-Agent and A2A Protocol

Sub-Agent Composition

from google.adk.agents import Agent

code_agent = Agent(
    name="code_specialist", model="gemini-2.5-flash",
    description="Code generation/debugging", tools=[executor, linter]
)

research_agent = Agent(
    name="researcher", model="gemini-2.5-flash",
    description="Web search/analysis", tools=[search, scraper]
)

root = Agent(
    name="coordinator", model="gemini-2.5-flash",
    instruction="Route tasks to specialists.",
    sub_agents=[code_agent, research_agent]
)

Coordinator Pattern

coordinator = Agent(
    name="coordinator", model="gemini-2.5-flash",
    instruction="Delegate: code_specialist (programming), data_analyst (data), writer (docs)",
    sub_agents=[
        Agent(name="code_specialist", model="gemini-2.5-flash", tools=[code_tools]),
        Agent(name="data_analyst", model="gemini-2.5-flash", tools=[data_tools]),
        Agent(name="writer", model="gemini-2.5-flash", tools=[writing_tools])
    ]
)

RemoteA2aAgent

from google.adk.agents.remote_a2a_agent import RemoteA2aAgent, AGENT_CARD_WELL_KNOWN_PATH

prime_checker = RemoteA2aAgent(
    name="prime", description="Check primes",
    agent_card=f"http://localhost:8001{AGENT_CARD_WELL_KNOWN_PATH}"
)

root = Agent(
    name="coordinator", model="gemini-2.5-flash",
    sub_agents=[prime_checker, Agent(name="calc", model="gemini-2.5-flash", tools=[calc])]
)

Global Instruction

root = Agent(
    name="customer_service", model="gemini-2.5-flash",
    instruction="Handle inquiries",
    global_instruction="Be polite, follow privacy policy, escalate if uncertain",
    sub_agents=[
        Agent(name="billing", model="gemini-2.5-flash", tools=[billing]),
        Agent(name="tech", model="gemini-2.5-flash", tools=[tech])
    ]
)

Patterns

Pipeline

from google.adk.agents import SequentialAgent

pipeline = SequentialAgent(
    name="content",
    sub_agents=[
        Agent(name="researcher", model="gemini-2.5-flash", tools=[search]),
        Agent(name="writer", model="gemini-2.5-flash", tools=[write]),
        Agent(name="editor", model="gemini-2.5-flash", tools=[edit])
    ]
)

Parallel

from google.adk.agents import ParallelAgent

parallel = ParallelAgent(
    name="multi_source",
    sub_agents=[
        Agent(name="web", model="gemini-2.5-flash", tools=[web]),
        Agent(name="db", model="gemini-2.5-flash", tools=[db]),
        Agent(name="api", model="gemini-2.5-flash", tools=[api])
    ]
)

Hierarchical

backend = Agent(name="backend", model="gemini-2.5-flash",
    sub_agents=[Agent(name="api", tools=[api]), Agent(name="db", tools=[db])])
frontend = Agent(name="frontend", model="gemini-2.5-flash",
    sub_agents=[Agent(name="ui", tools=[ui]), Agent(name="ux", tools=[ux])])
root = Agent(name="root", model="gemini-2.5-flash", sub_agents=[backend, frontend])

Iterative

from google.adk.agents import LoopAgent

loop = LoopAgent(
    name="review",
    sub_agents=[
        Agent(name="generator", model="gemini-2.5-flash", tools=[gen]),
        Agent(name="reviewer", model="gemini-2.5-flash", tools=[lint])
    ],
    max_iterations=3
)

A2A Protocol

from google.adk.servers.a2a_server import create_a2a_server
app = create_a2a_server(root_agent)
# Run: uvicorn my_agent:app --host 0.0.0.0 --port 8000

Agent card: /.well-known/agent.json

Flow: 1) Client requests card 2) Card describes capabilities 3) Client sends task 4) Server streams events

Best Practices

  • Descriptive description for routing
  • Focused coordinator instructions
  • Combine local/remote agents
  • Use global_instruction for cross-cutting concerns
  • Apply workflow agents for orchestration
  • Cache remote cards, handle failures