Estudando Arquitetura e Orquestração de Agentes: o Maior Domínio do Exame CCA
Arquitetura e Orquestração de Agentes vale 27% do exame CCA Foundations, mais do que qualquer outro domínio.
Busque em todas as páginas da documentação
Arquitetura e Orquestração de Agentes vale 27% do exame CCA Foundations, mais do que qualquer outro domínio.
Ele abrange como você projeta sistemas onde Claude não apenas responde a uma pergunta, mas planeja, chama ferramentas, delega trabalho para outros agentes e decide quando terminou.
Este artigo aborda os padrões de orquestração que aparecem com mais frequência em cenários de exame, com ilustrações Python executáveis construídas sobre o SDK anthropic.
Sistemas multiagente trocam simplicidade por capacidade, e o exame testa se você sabe quando essa troca vale a pena.
Um único agente bem definido com boas ferramentas supera um sistema multiagente mal decomposto quase todas as vezes.
Os padrões principais que valem a pena conhecer são pipelines sequenciais, topologias supervisor-trabalhador e fan-out paralelo com uma etapa de merge.
Todo padrão precisa de uma condição de término explícita, ou corre o risco de entrar em loop além do ponto de ser útil.
Questões de orquestração no exame geralmente se concentram em escolher a menor arquitetura que resolve o problema, não a mais sofisticada.
Cartão de receita de referência rápida - a forma mínima de um loop supervisor-trabalhador.
from anthropic import Anthropic
client = Anthropic()
def run_worker(task: str, model: str = "claude-sonnet-5") -> str:
"""Um agente trabalhador de propósito único que faz um trabalho e retorna."""
response = client.messages.create(
model=model,
max_tokens=1024,
system="Você é um agente trabalhador focado. Faça exatamente a tarefa dada. Retorne apenas o resultado.",
messages=[{"role": "user", "content": task}],
)
return response.content[0].text
def run_supervisor(goal: str, max_steps: int = 5) -> str:
"""Um supervisor que decompõe um objetivo em tarefas de trabalhador e para na conclusão."""
completed_work = []
for step in range(max_steps):
plan_prompt = f"Objetivo: {goal}\nConcluído até agora: {completed_work}\nPróxima subtarefa única, ou DONE se concluído:"
plan = run_worker(plan_prompt, model="claude-sonnet-5")
if plan.strip().upper().startswith("DONE"):
break
result = run_worker(plan)
completed_work.append({"task": plan, "result": result})
return "\n".join(w["result"] for w in completed_work)Quando usar isso:
from anthropic import Anthropic
from dataclasses import dataclass
client = Anthropic()
@dataclass
class AgentResult:
agent_name: str
output: str
def draft_agent(topic: str) -> AgentResult:
response = client.messages.create(
model="claude-sonnet-5",
max_tokens=512,
system="Você elabora um breve esboço técnico. Retorne apenas o esboço, sem preâmbulo.",
messages=[{"role": "user", "content": f"Esboço: {topic}"}],
)
return AgentResult("draft", response.content[0].text)
def critic_agent(draft: str) -> AgentResult:
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=512,
system="Você critica um esboço técnico em busca de lacunas e riscos factuais. Seja conciso. Retorne apenas a crítica.",
messages=[{"role": "user", "content": draft}],
)
return AgentResult("critic", response.content[0].text)
def reviser_agent(draft: str, critique: str) -> AgentResult:
response = client.messages.create(
model="claude-sonnet-5",
max_tokens=768,
system="Você revisa um esboço de rascunho dada uma crítica. Retorne apenas o esboço revisado.",
messages=[{"role": "user", "content": f"Rascunho:\n{draft}\n\nCrítica:\n{critique}"}],
)
return AgentResult("reviser", response.content[0].text)
def orchestrate_draft_critique_revise(topic: str) -> str:
"""Um pipeline sequencial de três agentes: rascunho -> crítico -> revisor.
Cada agente tem um trabalho e um prompt de sistema restrito, que é o
padrão que o exame chama de 'design de agente de responsabilidade única'.
"""
draft = draft_agent(topic)
critique = critic_agent(draft.output)
final = reviser_agent(draft.output, critique.output)
return final.output
if __name__ == "__main__":
result = orchestrate_draft_critique_revise("Estratégia de migração de banco de dados sem tempo de inatividade")
print(result)O que isso demonstra:
| Padrão | Forma | Melhor para | Término |
|---|---|---|---|
| Pipeline sequencial | A -> B -> C | Etapas de transformação conhecidas e fixas | Comprimento fixo, sem necessidade de loop |
| Supervisor-trabalhador | Supervisor planeja, despacha para trabalhadores | Contagem de subtarefas desconhecida, objetivos decomponíveis | Supervisor emite DONE ou atinge o orçamento de etapas |
| Fan-out paralelo | Um despachante, N trabalhadores concorrentes, um merge | Subtarefas independentes, sensível à latência | Todos os trabalhadores retornam, ou um timeout dispara |
| Agente único + ferramentas | Um agente, múltiplas chamadas de ferramenta em um loop | A maioria das tarefas de produção; mais simples de raciocinar e depurar | Agente para de solicitar ferramentas |
MAX_STEPS = 8
def safe_supervisor_loop(goal: str) -> str:
step = 0
history = []
while step < MAX_STEPS:
step += 1
next_action = run_worker(f"Objetivo: {goal}\nHistórico: {history}\nPróxima etapa ou DONE:")
if "DONE" in next_action.upper():
break
history.append(next_action)
else:
# Loop esgotou MAX_STEPS sem um sinal DONE - trate como uma falha, não um sucesso.
raise RuntimeError(f"Supervisor não terminou dentro de {MAX_STEPS} etapas para o objetivo: {goal}")
return "\n".join(history)Um orçamento de etapas fixo combinado com um caminho de falha explícito (em vez de retornar silenciosamente um resultado parcial) é o padrão que o exame recompensa: um agente que não pode dizer que falhou é pior do que um que levanta um erro.
# Prefira dataclasses tipadas ou TypedDicts para cargas úteis inter-agentes em vez de dicts brutos,
# para que uma incompatibilidade de esquema entre agentes falhe rapidamente em vez de surgir como um
# bug confuso de formatação de prompt downstream.
from typing import TypedDict
class SubtaskResult(TypedDict):
agent: str
task: str
output: str| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Agente único com loop de ferramentas | A tarefa é limitada e um agente com ferramentas pode raciocinar sobre ela de ponta a ponta | A tarefa requer genuinamente papéis distintos ou trabalho paralelo independente |
| Pipeline sequencial | Etapas e sua ordem são conhecidas com antecedência | O número ou ordem das etapas depende de resultados intermediários |
| Supervisor-trabalhador | A contagem de subtarefas é desconhecida até o tempo de execução e o objetivo se decompõe de forma limpa | O objetivo é simples o suficiente que a decomposição adiciona sobrecarga sem benefício |
| Fan-out paralelo | Subtarefas são independentes e a latência é mais importante que o custo de coordenação | Subtarefas dependem da saída umas das outras, o que o força de volta ao sequencial |
Porque as decisões de orquestração (agente único vs. multiagente, qual topologia, como o término é tratado) tendem a ser as decisões que criam ou quebram a confiabilidade de um sistema de produção, mais do que qualquer prompt único ou definição de ferramenta.
Não. Um único agente bem definido com boas ferramentas é frequentemente mais confiável e barato do que um sistema multiagente mal decomposto; o exame testa especificamente o julgamento sobre quando o multiagente agrega valor real em vez de apenas sobrecarga de coordenação.
Qualquer loop onde a condição de saída depende da própria saída do modelo (como emitir "DONE") precisa de um limite máximo de etapas como backup, já que um modelo pode falhar em emitir esse sinal.
Não necessariamente. Combinar um modelo mais forte com etapas de julgamento pesado (como crítica ou síntese) e um modelo mais rápido com etapas mecânicas (como rascunho ou formatação) é um trade-off de custo e qualidade sobre o qual o exame espera que você raciocine.
Refere-se a decidir exatamente quais informações passam de um agente para o próximo, em vez de passar por padrão todo o histórico da conversa, o que infla o custo de tokens com cada agente adicional na cadeia.
Não, geralmente não é mais barato. O Fan-out reduz a latência de relógio de parede executando chamadas independentes concorrentemente, mas cada chamada ainda custa o mesmo em tokens; não confunda "mais rápido" com "mais barato".
Optar pela arquitetura mais complexa (multiagente, multi-etapas) quando um único agente com melhor design de ferramenta resolve o cenário de forma mais confiável e barata.
Eles se sobrepõem pesadamente: se um agente precisa de um agente auxiliar ou apenas de uma ferramenta melhor é, em si, uma decisão de orquestração, e uma ferramenta mal definida frequentemente se disfarça como um "problema de orquestração" no exame.
A estratégia de merge deve ser decidida antes do despacho, seja um supervisor arbitrando entre as saídas, voto majoritário ou concatenação direta, em vez de improvisada depois.
O domínio testa os padrões subjacentes (sequencial, supervisor-trabalhador, fan-out paralelo, agente-único-mais-ferramentas) e o julgamento por trás da escolha entre eles, não a memorização da API de qualquer framework de terceiros específico.
Cargas úteis tipadas fazem com que incompatibilidades de esquema entre agentes falhem rapidamente e visivelmente, em vez de surgirem mais tarde como um bug de formatação confuso dentro de um prompt downstream.
Versões da Stack: Escrito contra a linha de modelos Claude atual em ~junho de 2026 - Claude Fable 5, Claude Opus 4.8, Claude Sonnet 5 (o padrão) e Claude Haiku 4.5 - e o SDK oficial
anthropicpara Python (última versão 0.x). Nomes de modelos, preços, formato do exame e versões do SDK mudam rapidamente - verifique os detalhes atuais em platform.claude.com/docs e o guia oficial do exame CCA antes de confiar neles.
Revisado por Chris St. John·Última atualização: 13 de jul. de 2026