Claude Managed Agents substitui seu loop de agente escrito manualmente por infraestrutura gerenciada. Esta página aborda o que muda quando você migra de um loop personalizado construído na Messages API ou do Claude Agent SDK.
Todas as requisições à Managed Agents API 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 por conta própria e anexando resultados ao histórico da conversa, a maior parte desse código desaparece.
| Antes | Depois |
|---|---|
| Você mantém o array de histórico da conversa e o passa de volta a cada turno. | A sessão armazena o histórico no lado do servidor. Envie eventos, receba eventos. |
Você itera sobre blocos de conteúdo tool_use, executa cada ferramenta e retorna ao loop com mensagens tool_result. | Ferramentas pré-construídas são executadas automaticamente dentro do sandbox. Você só lida com ferramentas personalizadas através de eventos agent.custom_tool_use. |
| Você provisiona seu próprio sandbox para executar código gerado pelo agente. | O sandbox 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 Messages API, simplificado):
messages = [{"role": "user", "content": task}]
while True:
response = client.messages.create(
model="claude-opus-4-8",
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,
}
],
}
)Depois (Claude Managed Agents):
agent = client.beta.agents.create(
name="Task Runner",
model="claude-opus-4-8",
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":
breakagent.custom_tool_use. Consulte Stream de eventos da sessão.Se você construiu com o Claude Agent SDK, já está trabalhando com agentes, ferramentas e sessões como conceitos. A diferença é onde eles são executados: o SDK executa em um processo que você opera, enquanto Managed Agents executa na infraestrutura da Anthropic. A maior parte da migração consiste em mapear objetos de configuração do SDK para seus equivalentes no lado da API.
| Agent SDK | Managed Agents |
|---|---|
ClaudeAgentOptions(...) construído a cada execução | client.beta.agents.create(...) uma vez; o Agente é persistido e versionado no lado do servidor. Consulte Configuração do agente. |
async with ClaudeSDKClient(...) ou query(...) | client.beta.sessions.create(...) e então envie e receba eventos. |
Funções decoradas com @tool despachadas automaticamente pelo SDK | Declare como {"type": "custom", ...} no Agente; seu cliente lida com eventos agent.custom_tool_use e responde com user.custom_tool_result. Consulte Ferramentas. |
| Ferramentas integradas executam no seu processo contra seu sistema de arquivos | {"type": "agent_toolset_20260401"} executa as mesmas ferramentas dentro do sandbox da sessão contra /workspace. |
cwd, add_dirs apontam para caminhos locais | Faça upload ou monte arquivos como recursos da sessão. |
system_prompt e a hierarquia CLAUDE.md | Uma única string system no Agente. Cada atualização produz uma nova versão no lado do servidor; fixe sessões a uma versão específica para promover ou reverter sem um deploy. Consulte Configuração do agente. |
mcp_servers configurados e autenticados em um único lugar | Declare servidores no Agente; forneça credenciais através de um Vault na Sessão. |
permission_mode, can_use_tool | permission_policy por ferramenta; envie eventos user.tool_confirmation para ferramentas always_ask. |
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-8",
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-8",
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(block.text for block in ev.content if block.type == "text"))
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
and ev.stop_reason.type == "end_turn"
):
breakO Agente e o Ambiente são criados uma vez e reutilizados entre sessões. A função da ferramenta ainda executa no seu processo; a diferença é que você lê o evento agent.custom_tool_use e envia o resultado explicitamente, em vez de o SDK despachá-lo por você.
A contrapartida de a Anthropic executar o loop do agente é que algumas coisas que o SDK tratava automaticamente passam a ser responsabilidade do seu cliente.
| Funcionalidade do SDK | Abordagem do Managed Agents |
|---|---|
| Modo de planejamento | Execute primeiro uma sessão apenas de planejamento, depois uma segunda sessão para executar o plano. |
| Estilos de saída, comandos de barra | Aplique no 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 ali. Para ferramentas integradas, use permission_policy: always_ask. |
max_turns | Conte os turnos no lado do cliente. |
sessions.create e sessions.events.stream.resources.agent.custom_tool_use.Quando um novo modelo Claude é lançado, migrar uma integração do Claude Managed Agents é tipicamente uma mudança de um único campo: atualize model na sua definição de agente e a mudança entra em vigor na próxima sessão que você criar.
ant beta:agents update \
--agent-id "$AGENT_ID" \
--version "$AGENT_VERSION" \
--model claude-opus-4-8A maioria das mudanças de comportamento no nível do modelo documentadas no guia de migração da Messages API não requer ação do seu lado:
max_tokens, configuração de thinking) são tratadas pelo runtime do 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 Messages API (o que o modelo faz de diferente) ainda se aplicam. As etapas de migração (como alterar seu código de requisição) não.
Was this page helpful?