Was this page helpful?
Claude Managed Agents substitui seu loop de agente escrito manualmente por infraestrutura gerenciada. Esta página aborda as mudanças quando você migra de um loop personalizado construído na API de Mensagens ou do Claude Agent SDK.
Todas as solicitações da API Managed Agents exigem o cabeçalho beta managed-agents-2026-04-01. O SDK define o cabeçalho beta automaticamente.
Se você construiu um agente chamando messages.create em um loop while, executando chamadas de ferramentas você mesmo e adicionando resultados ao histórico de conversas, a maioria desse código desaparece.
| Antes | Depois |
|---|---|
| Você mantém o array de histórico de conversas e o passa em cada turno. | A sessão armazena o histórico no servidor. Envie eventos, receba eventos. |
Você analisa stop_reason: "tool_use", executa a ferramenta e volta com uma mensagem tool_result. | Ferramentas pré-construídas são executadas dentro do contêiner automaticamente. Você apenas lida com ferramentas personalizadas via eventos agent.custom_tool_use. |
| Você provisiona seu próprio sandbox para executar código gerado pelo agente. | O contêiner da sessão lida com execução de código, operações de arquivo e bash. |
| Você decide quando o loop termina. | A sessão emite session.status_idle quando o agente não tem mais nada a fazer. |
Antes (loop da API de Mensagens, simplificado):
Depois (Claude Managed Agents):
agent.custom_tool_use. Veja Fluxo de eventos da sessão.Se você construiu com o Claude Agent SDK, você já está trabalhando com agentes, ferramentas e sessões como conceitos. A diferença é onde eles são executados: o SDK é executado em um processo que você opera, enquanto Managed Agents é executado na infraestrutura da Anthropic. A maioria da migração é mapear objetos de configuração do SDK para seus equivalentes do lado da API.
| Agent SDK | Managed Agents |
|---|---|
ClaudeAgentOptions(...) construído por execução | client.beta.agents.create(...) uma vez; o Agent é persistido e versionado no servidor. Veja Configuração do Agent. |
async with ClaudeSDKClient(...) ou query(...) | client.beta.sessions.create(...) depois envie e receba eventos. |
Funções decoradas com @tool despachadas automaticamente pelo SDK | Declare como {"type": "custom", ...} no Agent; seu cliente lida com eventos agent.custom_tool_use e responde com user.custom_tool_result. Veja Ferramentas. |
| Ferramentas integradas executadas em seu processo contra seu sistema de arquivos | executa as mesmas ferramentas dentro do contêiner da sessão contra . |
Antes (Agent SDK):
from claude_agent_sdk import (
ClaudeAgentOptions,
ClaudeSDKClient,
create_sdk_mcp_server,
tool,
)
@tool("get_weather", "Get the current weather for a city.", {"city": str})
async def get_weather(args: dict) -> dict:
return {"content": [{"type": "text", "text": f"{args['city']}: 18°C, clear"}]}
options = ClaudeAgentOptions(
model="claude-opus-4-7",
system_prompt="You are a concise weather assistant.",
mcp_servers={
"weather": create_sdk_mcp_server("weather", "1.0", tools=[get_weather])
},
)
async with ClaudeSDKClient(options=options) as agent:
await agent.query("What's the weather in Tokyo?")
async for msg in agent.receive_response():
print(msg)Depois (Managed Agents):
from anthropic import Anthropic
client = Anthropic()
agent = client.beta.agents.create(
name="weather-agent",
model="claude-opus-4-7",
system="You are a concise weather assistant.",
tools=[
{
"type": "custom",
"name": "get_weather",
"description": "Get the current weather for a city.",
"input_schema": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
}
],
)
environment = client.beta.environments.create(
name="weather-env",
config={"type": "cloud", "networking": {"type": "unrestricted"}},
)
session = client.beta.sessions.create(
agent={"type": "agent", "id": agent.id, "version": agent.version},
environment_id=environment.id,
)
def get_weather(city: str) -> str:
return f"{city}: 18°C, clear"
with client.beta.sessions.events.stream(session.id) as stream:
client.beta.sessions.events.send(
session.id,
events=[
{
"type": "user.message",
"content": [{"type": "text", "text": "What's the weather in Tokyo?"}],
}
],
)
for ev in stream:
if ev.type == "agent.message":
print("".join(b.text for b in ev.content))
elif ev.type == "agent.custom_tool_use":
result = get_weather(**ev.input)
client.beta.sessions.events.send(
session.id,
events=[
{
"type": "user.custom_tool_result",
"custom_tool_use_id": ev.id,
"content": [{"type": "text", "text": result}],
}
],
)
elif ev.type == "session.status_idle" and ev.stop_reason.type == "end_turn":
breakO Agent e o Environment são criados uma vez e reutilizados em sessões. A função de ferramenta ainda é executada em seu processo; a diferença é que você lê o evento agent.custom_tool_use e envia o resultado explicitamente em vez do SDK despachá-lo para você.
O tradeoff para Anthropic executar o loop do agente é que algumas coisas que o SDK tratava automaticamente se tornam responsabilidade do seu cliente.
| Recurso do SDK | Abordagem Managed Agents |
|---|---|
| Modo de planejamento | Execute uma sessão somente de planejamento primeiro, depois uma segunda sessão para executar. |
| Estilos de saída, comandos de barra | Aplique em seu cliente antes de enviar user.message ou depois de receber agent.message. |
Hooks PreToolUse / PostToolUse | Seu cliente já vê cada evento agent.custom_tool_use antes de responder; coloque a lógica lá. Para ferramentas integradas, use permission_policy: always_ask. |
max_turns | Conte turnos no lado do cliente. |
sessions.create e sessions.stream.resources.agent.custom_tool_use.Quando um novo modelo Claude é lançado, migrar uma integração Claude Managed Agents é tipicamente uma mudança de um campo: atualize model em sua definição de agente e a mudança entra em vigor na próxima sessão que você criar.
A maioria das mudanças de comportamento em nível de modelo documentadas no guia de migração da API de Mensagens não requer ação do seu lado:
max_tokens, configuração de thinking) são tratadas pelo runtime Claude Managed Agents. Esses campos não são expostos na definição do agente.agent.custom_tool_use. Você vê dados estruturados, não strings brutas.As descrições de comportamento no guia da API de Mensagens (o que o modelo faz diferentemente) ainda se aplicam. As etapas de migração (como alterar seu código de solicitação) não.
messages = [{"role": "user", "content": task}]
while True:
response = client.messages.create(
model="claude-opus-4-7",
max_tokens=1024,
messages=messages,
tools=tools,
)
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason == "end_turn":
break
for block in response.content:
if block.type == "tool_use":
result = execute_tool(block.name, block.input)
messages.append(
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": block.id,
"content": result,
}
],
}
)agent = client.beta.agents.create(
name="Task Runner",
model="claude-opus-4-7",
tools=[{"type": "agent_toolset_20260401"}],
)
session = client.beta.sessions.create(
agent={"type": "agent", "id": agent.id, "version": agent.version},
environment_id=environment.id,
)
with client.beta.sessions.events.stream(session.id) as stream:
client.beta.sessions.events.send(
session.id,
events=[{"type": "user.message", "content": [{"type": "text", "text": task}]}],
)
for event in stream:
if event.type == "session.status_idle":
break{"type": "agent_toolset_20260401"}/workspacecwd, add_dirs apontam para caminhos locais | Carregue ou monte arquivos como recursos de sessão. |
system_prompt e a hierarquia CLAUDE.md | Uma única string system no Agent. Cada atualização produz uma nova versão no servidor; fixe sessões a uma versão específica para promover ou reverter sem um deploy. Veja Configuração do Agent. |
mcp_servers configurados e autenticados em um lugar | Declare servidores no Agent; forneça credenciais através de um Vault na Sessão. |
permission_mode, can_use_tool | Por ferramenta permission_policy; responda a eventos user.tool_confirmation para ferramentas always_ask. |
ant beta:agents update \
--agent-id "$AGENT_ID" \
--version "$AGENT_VERSION" \
--model claude-opus-4-7