Domínio 1 — Agentic Architecture & Orchestration · Lição 5 de 7

Multi-agente: coordenador, subagentes e contexto isolado

Objetivos de aprendizagem

Hub-and-spoke: o coordenador no centro

Na arquitetura multi-agente cobrada pela prova, um coordenador (hub) gerencia subagentes especializados (spokes). Toda a comunicação entre subagentes passa pelo coordenador — subagentes não conversam entre si. Isso dá:

O coordenador é responsável por: decompor a tarefa, delegar (escolhendo dinamicamente quais subagentes invocar conforme a complexidade da consulta — não rodar sempre o pipeline inteiro), agregar resultados e iterar: avaliar a síntese em busca de lacunas, re-delegar buscas direcionadas e re-invocar a síntese até a cobertura ser suficiente.

flowchart TD
    C[Coordenador
decompõe, delega, agrega, itera] -->|Task 1| S1[Subagente
web search] C -->|Task 2| S2[Subagente
análise de documentos] C -->|Task 3| S3[Subagente
síntese] S1 -->|achados| C S2 -->|achados| C S3 -->|relatório| C C -.->|lacunas? re-delegar
consultas direcionadas| S1

Contexto isolado: a regra mais cobrada

Cada subagente começa com uma janela de contexto limpa. Ele não herda automaticamente o histórico da conversa do coordenador, não vê os resultados de ferramentas de outros subagentes e não compartilha memória entre invocações. Consequências práticas:

Bug clássico de prova: "o subagente de síntese produziu um relatório genérico ignorando os achados da busca". Causa raiz: o coordenador delegou com um prompt tipo "sintetize os achados" sem incluir os achados, assumindo herança de contexto que não existe.

Task tool e allowedTools no Agent SDK

No Claude Agent SDK, o mecanismo de spawn de subagentes é a Task tool. Dois requisitos de configuração caem na prova:

import anyio
from claude_agent_sdk import query, ClaudeAgentOptions, AgentDefinition

options = ClaudeAgentOptions(
    # Sem "Task" aqui, o coordenador NAO consegue invocar subagentes.
    allowed_tools=["Task", "Read", "Grep", "Glob"],
    agents={
        "web-searcher": AgentDefinition(
            description="Busca fontes na web sobre um subtopico especifico. "
                        "Use uma invocacao por subtopico.",
            prompt="Voce pesquisa na web e retorna achados estruturados: "
                   "claim, trecho de evidencia, URL da fonte e data de publicacao.",
            tools=["WebSearch", "WebFetch"],
        ),
        "doc-analyst": AgentDefinition(
            description="Analisa documentos locais e extrai dados citaveis.",
            prompt="Analise os documentos indicados e retorne achados com "
                   "nome do documento e pagina para cada afirmacao.",
            tools=["Read", "Grep", "Glob"],
        ),
        "synthesizer": AgentDefinition(
            description="Sintetiza achados ja coletados em um relatorio citado. "
                        "Os achados completos DEVEM vir no prompt da Task.",
            prompt="Combine os achados fornecidos no prompt em um relatorio "
                   "coeso, preservando a atribuicao de fonte de cada claim.",
            tools=["Read"],
        ),
    },
    system_prompt="Voce e o coordenador de pesquisa. Decomponha o topico em "
                  "subtopicos que cubram TODO o dominio da pergunta, delegue "
                  "subtopicos independentes em paralelo (multiplas Task calls "
                  "numa unica resposta) e passe os achados completos ao "
                  "synthesizer no prompt da Task.",
)

async def main():
    async for message in query(
        prompt="Pesquise o impacto da IA nas industrias criativas.",
        options=options,
    ):
        print(message)

anyio.run(main)

Spawn paralelo e decomposição bem calibrada

Pegadinhas da prova

Resumo em 5 linhas

  1. Hub-and-spoke: toda comunicação entre subagentes passa pelo coordenador — observabilidade, erros e roteamento centralizados.
  2. Subagentes têm contexto isolado: não herdam histórico nem memória; tudo que precisam vai explicitamente no prompt da Task, em formato estruturado com metadados de fonte.
  3. No Agent SDK, subagentes são invocados pela Task tool — e allowedTools do coordenador precisa incluir "Task".
  4. Paralelismo = múltiplas Task calls numa única resposta do coordenador; seleção dinâmica de subagentes conforme a consulta, não pipeline fixo.
  5. Cobertura incompleta de tópicos amplos costuma ter como causa raiz decomposição estreita demais pelo coordenador — os subagentes só cobrem o que lhes foi atribuído.

Documentação oficial

Questões de fixação

1. O subagente de síntese produz relatórios genéricos que ignoram os achados coletados pelos outros subagentes. Qual é a causa mais provável?

2. Como o coordenador deve fazer três subagentes de busca rodarem em paralelo no Agent SDK?

3. Você define subagentes em agents={...}, mas o coordenador nunca os invoca e tenta fazer tudo sozinho. Qual é a causa provável?

4. Um relatório sobre "energia renovável" cobre apenas solar. Os logs mostram que cada subagente cumpriu corretamente sua atribuição: "painéis fotovoltaicos", "solar térmica" e "solar residencial". Qual é a correção adequada?

5. (escolha duas) Quais benefícios justificam rotear toda a comunicação entre subagentes através do coordenador (hub-and-spoke)?