Quatro formas de construir um agente
Objetivos de aprendizagem
- Comparar as quatro abordagens: loop manual (Messages API), Tool Runner do SDK, Claude Agent SDK e Managed Agents.
- Identificar, em cada uma, quem fornece o harness (o loop, as ferramentas, o controle) e quem fornece o deployment (onde o agente roda).
- Escolher a abordagem certa para o nível de controle, esforço e infraestrutura de cada cenário.
- Aplicar limites de iteração e task budgets como guarda-corpos de custo/segurança — sem transformá-los em mecanismo primário de parada.
O espectro: de "faço tudo" a "a Anthropic faz tudo"
Um agente sempre tem duas metades: o harness (o loop agêntico, a execução de ferramentas, o gerenciamento de contexto) e o deployment (a infraestrutura onde isso roda). As quatro abordagens se diferenciam por quem assume cada metade:
| Abordagem | Quem fornece o harness | Quem fornece o deployment | Quando usar |
|---|---|---|---|
| Loop manual (Messages API) | Você — escreve o loop, checa stop_reason, executa ferramentas, gerencia histórico. |
Você — sua infraestrutura. | Controle total: transporte customizado, formas de requisição que o SDK não monta, fluxos que não cabem nos hooks do runner, ou para evitar dependência beta. |
Tool Runner do SDK (client.beta.messages.tool_runner, beta) |
O SDK — automatiza o loop sobre as suas ferramentas (@beta_tool); você intervém por iteração se quiser. |
Você — sua infraestrutura. | Padrão recomendado para agentes de ferramentas customizadas: menos código, hooks por iteração (aprovação, interceptação, modificação de resultado), max_iterations. |
| Claude Agent SDK | A Anthropic — o harness completo do Claude Code: loop, ferramentas built-in (Read, Write, Bash, Grep, Glob), subagentes via Task, hooks, sessões, skills e MCP. | Você — roda na sua máquina/servidor, com acesso ao seu filesystem. | Agentes de propósito geral que operam sobre arquivos/código/ambiente: produtividade de dev, pesquisa multi-agente, suporte com MCP — sem reimplementar harness. |
| Managed Agents (beta) | A Anthropic — agente hospedado com harness gerenciado. | A Anthropic — sessões e sandbox gerenciados no servidor; você interage por API. | Quando você não quer operar nem o harness nem a infraestrutura de execução: menor esforço operacional, menos controle fino sobre o ambiente. |
flowchart LR
subgraph voce[Você fornece]
A[Loop manual
harness: você
deploy: você]
B[Tool Runner
harness: SDK
deploy: você]
C[Claude Agent SDK
harness: Anthropic
deploy: você]
end
subgraph anthropic[Anthropic fornece]
D[Managed Agents
harness: Anthropic
deploy: Anthropic]
end
A -- menos abstração --> B -- --> C -- mais abstração --> D
Tool Runner em 20 linhas
O runner elimina o loop manual: você declara as ferramentas como funções tipadas e itera pelas mensagens. A iteração termina sozinha quando o Claude para de chamar ferramentas:
import anthropic
from anthropic import beta_tool
client = anthropic.Anthropic()
@beta_tool
def lookup_order(order_id: str) -> str:
"""Busca o status de um pedido pelo numero.
Args:
order_id: Numero do pedido, ex. 4412.
"""
return '{"order_id": "%s", "status": "shipped"}' % order_id
runner = client.beta.messages.tool_runner(
model="claude-opus-5",
max_tokens=8000,
max_iterations=20, # guarda-corpo de custo, NAO o criterio de parada
tools=[lookup_order],
messages=[{"role": "user", "content": "Qual o status do pedido 4412?"}],
)
last = None
for message in runner:
# cada iteracao entrega a mensagem do assistente ANTES das tools rodarem:
# da para inspecionar, aprovar/negar ou modificar o resultado aqui.
last = message
if last is not None:
final_text = next((b.text for b in last.content if b.type == "text"), "")
print(final_text)
Beta e pause_turn: o Tool Runner é beta. E, na versão atual do SDK Python, ele não retoma pause_turn automaticamente — um turno pausado encerra o runner como se fosse a mensagem final. Se você usa ferramentas server-side longas, espelhe o histórico e reinicie o runner com o turno pausado anexado, ou trate pause_turn num loop manual.
Claude Agent SDK: o harness do Claude Code como biblioteca
O Claude Agent SDK (Python/TypeScript) empacota o mesmo harness que move o Claude Code: loop agêntico pronto, ferramentas de filesystem e shell, subagentes (Task), hooks de ciclo de vida, sessões persistentes, skills e integração MCP. Você configura via ClaudeAgentOptions (ferramentas permitidas, system prompt, agentes, hooks) e chama query() — o SDK executa o loop inteiro na sua máquina. As lições 5, 6 e 7 aprofundam subagentes, hooks e sessões.
Limites de iteração e task budgets
max_iterations(Tool Runner): limita quantas voltas o loop pode dar. É proteção contra runaway (custo e latência) — o término normal continua sendo o modelo parar de chamar ferramentas.max_continuations(padrão de código no loop manual): limite de retomadas depause_turnpara não retomar indefinidamente.- Task budgets (beta): orçamentos declarativos de esforço/custo por tarefa (ex.: teto de tokens ou de chamadas para uma tarefa delegada). Sinalize como recurso beta; a ideia arquitetural cobrada é a mesma: orçamento como guarda-corpo, decisão de parada com o modelo.
Na prova, qualquer alternativa que use limite de iterações/orçamento como mecanismo primário de terminação está errada (anti-padrão do task statement 1.1). A palavra-chave das alternativas corretas é "safety net"/"guarda-corpo" combinada com stop_reason.
Pegadinhas da prova
- Distrator típico: "para ter aprovação humana antes de ferramentas destrutivas, é obrigatório escrever o loop manual". Falso — o Tool Runner permite gate dentro da função da ferramenta ou interceptação por iteração.
- Distrator típico: confundir Claude Agent SDK (harness da Anthropic rodando na sua infra, com acesso ao seu filesystem) com Managed Agents (harness e sandbox hospedados pela Anthropic).
- Distrator típico: reimplementar do zero loop + ferramentas de arquivo + subagentes quando o cenário descreve exatamente o que o Claude Agent SDK já entrega (over-engineering).
- Distrator típico: tratar
max_iterationscomo critério de conclusão da tarefa, em vez de guarda-corpo de custo. - Distrator típico: esquecer que Tool Runner, Managed Agents e task budgets são recursos beta — a alternativa que apresenta um deles como GA sem ressalva pode ser a errada em questões de "qual afirmação é correta".
Resumo em 5 linhas
- Agente = harness (loop + ferramentas + controle) + deployment (onde roda); as 4 abordagens variam em quem fornece cada metade.
- Loop manual: você fornece tudo — controle máximo, esforço máximo.
- Tool Runner (beta): o SDK roda o loop sobre suas ferramentas na sua infra; hooks por iteração cobrem aprovação/interceptação;
max_iterationscomo guarda-corpo. - Claude Agent SDK: harness completo do Claude Code (built-in tools, Task, hooks, sessões) rodando na sua infra; Managed Agents (beta): harness e sandbox hospedados pela Anthropic.
- Limites de iteração e task budgets (beta) são guarda-corpos de custo/segurança — nunca o mecanismo primário de parada.
Documentação oficial
Questões de fixação
1. Sua equipe quer um agente que explore o codebase com Read/Grep/Bash, delegue a subagentes e mantenha sessões — rodando nos servidores da empresa por exigência de compliance. Qual abordagem entrega isso com menos esforço?
Gabarito: C. O cenário descreve exatamente o harness do Agent SDK, que roda na sua infra (atende compliance). A e D reimplementam o que já existe (D ainda teria que recriar subagentes e sessões). B falha no requisito: em Managed Agents o deployment é hospedado pela Anthropic, não nos servidores da empresa.
2. No Tool Runner do SDK Python, qual é o papel correto do parâmetro max_iterations?
Gabarito: B. Limite de iterações é rede de segurança de custo/latência. A transforma o cap em critério de conclusão — o anti-padrão do task statement 1.1. C confunde com disable_parallel_tool_use. D é falsa: o runner encerra a iteração exatamente porque acompanha quando o modelo para de chamar ferramentas.
3. Qual par "harness / deployment" descreve corretamente os Managed Agents?
Gabarito: D. Managed Agents é a ponta mais gerenciada do espectro: a Anthropic fornece o harness e hospeda a execução. A descreve o loop manual. B descreve o Claude Agent SDK. C não corresponde a nenhuma das quatro abordagens.
4. Um desenvolvedor afirma: "preciso de aprovação humana antes de qualquer ferramenta com efeito colateral, então sou obrigado a abandonar o Tool Runner e escrever o loop manual". Como avaliar?
Gabarito: A. O runner entrega cada mensagem do assistente antes de rodar as ferramentas, permitindo aprovar/negar; o gate dentro da função também funciona. B descreve o runner como caixa-preta — misconception explícita da documentação. C troca garantia determinística por compliance probabilística via prompt. D inventa uma exigência: aprovação humana não depende de Managed Agents.