Skip to main contentSkip to footer
EsempioscriptadvancedEseguibileguided-flow

Livello 5: Orchestrazione multi-agente — Autonomia delegata

Un orchestratore delega a subagent specializzati definiti tramite l’agent runtime SDK. Ogni subagent ha il proprio prompt, i propri strumenti e il proprio modello. L’orchestratore coordina.

Fatti chiave

Livello
advanced
Runtime
Python • Pydantic + Python Dotenv
Pattern
Flusso ispezionabile con confini di sistema visibili
Interazione
Sandbox live • Script
Aggiornato
14 marzo 2026

Naviga questo esempio

Vista rapida del flusso

Come questo esempio si muove tra input, esecuzione e risultato rivedibile
Livello 5: Orchestrazione multi-agente —… -> Run the agent task -> Load environment keys -> Constrain output schema -> Register tool actions -> Resolve refund action

Avvio

Livello 5: Orchestrazione multi-agente —…

Checkpoint

Run the agent task

Esito

Load environment keys

Perché esiste questa pagina

Questo esempio è mostrato sia come codice sorgente reale che come pattern di interazione orientato al prodotto, così i discenti possono collegare implementazione, UX e dottrina senza lasciare la libreria.

Flusso visivoCodice realeSandbox o walkthroughAccesso MCP
Come dovrebbe essere usato questo esempio nella piattaforma?

Usa prima la sandbox per comprendere il pattern di esperienza, poi ispeziona il sorgente per vedere come il confine del prodotto, il confine del modello e il confine della dottrina sono effettivamente implementati.

UX pattern: Flusso ispezionabile con confini di sistema visibili
Progettare per la delega piuttosto che per la manipolazione diretta
Sostituire la magia implicita con modelli mentali chiari
Rappresentare il lavoro delegato come un sistema, non solo come una conversazione
Riferimenti sorgente
Voce di libreria
agents-agent-complexity-5-multi-agent
Percorso sorgente
content/example-library/sources/agents/agent-complexity/5-multi-agent.py
Librerie
pydantic, python-dotenv
Requisiti di runtime
Ambiente del repository locale
Principi correlati
Progettare per la delega piuttosto che per la manipolazione diretta, Sostituire la magia implicita con modelli mentali chiari, Rappresentare il lavoro delegato come un sistema, non solo come una conversazione, Ottimizzare per la guida, non solo per l'inizio

Contesto del modello

Model-dipendenteRichiede tool calling nativoRagionamento avanzato

Multi-agent coordination requires reliable tool calling and structured output across agent boundaries. Failure modes compound across hops.

5-multi-agent.py

python
"""
Level 5: Multi-Agent Orchestration — Delegated Autonomy
An orchestrator delegates to specialized subagents defined via the Claude Agent SDK.
Each subagent has its own prompt, tools, and model. The orchestrator coordinates.

NOTE: Run with `python 5-multi-agent.py` (not IPython/Jupyter).

https://platform.claude.com/docs/en/agent-sdk/python
"""

import asyncio
import json
from pathlib import Path

from pydantic import BaseModel
from claude_agent_sdk import (
    AssistantMessage,
    ClaudeAgentOptions,
    ClaudeSDKClient,
    ResultMessage,
    TextBlock,
    ToolUseBlock,
    tool,
    create_sdk_mcp_server,
)
from claude_agent_sdk.types import AgentDefinition
from dotenv import load_dotenv

load_dotenv()

KNOWLEDGE_DIR = Path(__file__).parent / "knowledge"


# --- External API tools (shared across agents via MCP) ---


@tool(
    "check_payment_gateway",
    "Check payment processor for transaction status and refund eligibility",
    {"transaction_date": str, "amount": str},
)
async def check_payment_gateway(args):
    return {
        "content": [
            {
                "type": "text",
                "text": (
                    f"Payment Gateway Response for {args['transaction_date']} — ${args['amount']}:\n"
                    "- Transaction ID: txn_8f3k2j1\n"
                    "- Status: SETTLED\n"
                    "- Refund eligible: YES\n"
                    "- Original payment method: Visa ending in 4242\n"
                    "- Settlement date: 2025-02-02"
                ),
            }
        ]
    }


@tool(
    "issue_refund",
    "Process a refund through the payment gateway",
    {"amount": str, "reason": str, "customer_id": str},
)
async def issue_refund(args):
    return {
        "content": [
            {
                "type": "text",
                "text": (
                    f"Refund processed successfully:\n"
                    f"- Customer: {args['customer_id']}\n"
                    f"- Amount: ${args['amount']}\n"
                    f"- Reason: {args['reason']}\n"
                    "- Refund ID: ref_9x2m4p7\n"
                    "- ETA: 3-5 business days"
                ),
            }
        ]
    }


# --- Subagent definitions ---


AGENTS = {
    "researcher": AgentDefinition(
        description="Investigates billing issues by reading customer files and checking the payment gateway.",
        prompt=(
            "You are a billing research specialist. You have access to a knowledge base "
            "with customer profiles, policies, and templates. Investigate the issue thoroughly:\n"
            "1. Read the customer file to understand their history\n"
            "2. Check the payment gateway to verify the transaction\n"
            "3. Read the refund policy to determine eligibility\n"
            "Return a clear, factual summary of your findings."
        ),
        tools=[
            "Read",
            "Glob",
            "Grep",
            "mcp__billing-api__check_payment_gateway",
        ],
        model="haiku",
    ),
    "drafter": AgentDefinition(
        description="Drafts customer-facing responses using templates from the knowledge base.",
        prompt=(
            "You are a customer communications specialist. Draft a professional, empathetic "
            "response based on the research findings you receive. Use the response templates "
            "in the knowledge base as a starting point, then personalize for the customer."
        ),
        tools=["Read", "Glob"],
        model="haiku",
    ),
    "compliance_reviewer": AgentDefinition(
        description="Reviews proposed actions and responses for policy compliance.",
        prompt=(
            "You are a compliance reviewer. Verify that the proposed refund action and "
            "customer response follow company policy. Check the escalation matrix and "
            "refund policy. Flag any issues or approve the action."
        ),
        tools=["Read", "Glob"],
        model="haiku",
    ),
}


# --- Orchestrator ---


class CustomerEmail(BaseModel):
    subject: str
    body: str


class OrchestratorOutput(BaseModel):
    research_summary: str
    duplicate_confirmed: bool
    refund_amount: float
    compliance_approved: bool
    final_action: str
    customer_email: CustomerEmail


async def run_orchestrator(task: str):
    server = create_sdk_mcp_server(
        name="billing-api",
        version="1.0.0",
        tools=[check_payment_gateway, issue_refund],
    )

    options = ClaudeAgentOptions(
        system_prompt=(
            "You are a senior case manager. Resolve customer issues by delegating "
            "to your specialized team using the Task tool:\n\n"
            "1. 'researcher' — investigates billing data and payment gateway\n"
            "2. 'drafter' — writes customer-facing responses from templates\n"
            "3. 'compliance_reviewer' — checks policy compliance before sending\n\n"
            "Coordinate the workflow: research first, then draft, then compliance review. "
            "Pass findings between agents. After all agents report back, synthesize "
            "a final decision and present the approved response.\n\n"
            f"Knowledge base location: {KNOWLEDGE_DIR}"
        ),
        allowed_tools=[
            "Task",
            "Read",
            "Glob",
            "mcp__billing-api__check_payment_gateway",
            "mcp__billing-api__issue_refund",
        ],
        agents=AGENTS,
        mcp_servers={"billing-api": server},
        output_format={
            "type": "json_schema",
            "schema": OrchestratorOutput.model_json_schema(),
        },
        permission_mode="acceptEdits",
        max_turns=20,
        max_budget_usd=1.00,
        model="sonnet",
        cwd=str(KNOWLEDGE_DIR),
    )

    async with ClaudeSDKClient(options=options) as client:
        await client.query(task)
        async for message in client.receive_response():
            if isinstance(message, AssistantMessage):
                for block in message.content:
                    if isinstance(block, TextBlock):
                        print(block.text)
                    elif isinstance(block, ToolUseBlock):
                        print(f"\n  [Tool] {block.name}({block.input})")
            elif isinstance(message, ResultMessage):
                cost = (
                    f"${message.total_cost_usd:.4f}"
                    if message.total_cost_usd
                    else "n/a"
                )
                print(f"\n--- Done in {message.num_turns} turns | cost: {cost} ---")
                if message.structured_output:
                    raw = (
                        json.loads(message.structured_output)
                        if isinstance(message.structured_output, str)
                        else message.structured_output
                    )
                    output = OrchestratorOutput.model_validate(raw)
                    print("\nStructured output:")
                    print(output.model_dump_json(indent=2))


if __name__ == "__main__":
    asyncio.run(
        run_orchestrator(
            "Customer cust_12345 reports a duplicate charge on their February bill. "
            "Delegate to your team: have the researcher investigate, the drafter prepare "
            "a response, and compliance review the final action before we send it."
        )
    )
Cosa dovrebbe ispezionare il discente nel codice?

Cerca il punto esatto in cui lo scope del sistema è delimitato: definizioni di schema, impostazione del prompt, configurazione di runtime e il punto di chiamata che trasforma l'intenzione dell'utente in un'azione concreta del modello o del workflow.

Cerca i contratti di output e la validazione
Cerca la chiamata di esecuzione esatta
Cerca cosa il prodotto potrebbe esporre all'utente
Come si relaziona la sandbox al sorgente?

La sandbox dovrebbe rendere leggibile l'UX: cosa vede l'utente, cosa sta decidendo il sistema e come il risultato diventa revisionabile. Il sorgente mostra poi come quel comportamento è effettivamente implementato.

Leggi il riepilogo dell'implementazione.
Esplora gli stati utente e di sistema.
Ispeziona il codice sorgente tenendo a mente le decisioni dottrinali evidenziate.
SandboxFlusso ispezionabile con confini di sistema visibili
Guida all'interazione

Usa la sandbox per esplorare l'esperienza visibile all'utente, il lavoro del sistema e la scelta dottrinale che l'esempio sta facendo.

Spiegazione UX

La sandbox spiega cosa dovrebbe vedere l'utente, cosa sta facendo il sistema e dove il controllo o l'ispezionabilità devono rimanere espliciti.

Spiegazione AI Design

La pagina trasforma il codice sorgente in un pattern orientato al prodotto: cosa può decidere il modello, cosa dovrebbe esporre il prodotto e dove il codice deterministico o la revisione devono subentrare.

Guida all'interazione

  1. 1Leggi il riepilogo dell'implementazione.
  2. 2Esplora gli stati utente e di sistema.
  3. 3Ispeziona il codice sorgente tenendo a mente le decisioni dottrinali evidenziate.

Visibile all'utente

Livello 5: Orchestrazione multi-agente — Autonomia delegata Un orchestratore delega a subagent specializzati definiti tramite l’agent runtime SDK. Ogni subagent ha il proprio prompt, i propri strumenti e il proprio modello. L’orchestratore coordina.

Lavoro del sistema

Il prodotto prepara un task delimitato per il modello o il workflow.

Perché è importante

L'interfaccia dovrebbe rendere il task delegato leggibile prima che avvenga l'automazione.

Usato in corsi e percorsi

Questo esempio attualmente è indipendente nella libreria, ma si connette comunque al sistema dei principi e alla famiglia di esempi più ampia.

Principi correlati

Runtime architecture

Usa questo esempio nei tuoi agenti

Questo esempio è disponibile anche tramite il layer agent-ready del blueprint. Usa la pagina Per agenti per recuperare MCP pubblico, export deterministici e setup per Claude o Cursor.

Definisci trigger, contesto e confini prima di aumentare l'autonomia
Rendi espliciti controllo, osservabilita e recovery nel runtime
Scegli i pattern operativi giusti prima di delegare ai workflow