Was this page helpful?
O Claude Managed Agents substitui seu loop de agente escrito manualmente por infraestrutura gerenciada. Esta página cobre o que muda quando você migra de um loop personalizado construído na API de Mensagens ou do Claude Agent SDK.
Todas as solicitações da API do Managed Agents requerem 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 maior parte desse código desaparece.
| Antes | Depois |
|---|---|
| Você mantém o array de histórico de conversas e o passa de volta a cada turno. | A sessão armazena o histórico no lado do 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ê só 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 de 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. Consulte Stream de eventos de 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 o Managed Agents é executado na infraestrutura da Anthropic. A maior parte da migração é mapear objetos de configuração do SDK para seus equivalentes no lado da API.
| Agent SDK | Managed Agents |
|---|---|
ClaudeAgentOptions(...) construído por 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(...) depois 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 executadas em seu processo contra seu sistema de arquivos | executa as mesmas ferramentas dentro do contêiner de 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-sonnet-4-6",
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-sonnet-4-6",
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 Agente e o Ambiente são criados uma vez e reutilizados entre 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 de o SDK despachá-lo para você.
A contrapartida de a Anthropic executar o loop do agente é que algumas coisas que o SDK tratava automaticamente se tornam responsabilidade do seu cliente.
| Recurso do SDK | Abordagem no 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 slash | Aplique em seu cliente antes de enviar user.message ou após 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 os 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 do Claude Managed Agents é tipicamente uma mudança de um campo: atualize model na 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 no nível do modelo documentadas no guia de migração da API de Mensagens não requer ação da sua parte:
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 API de Mensagens (o que o modelo faz de forma diferente) ainda se aplicam. As etapas de migração (como alterar o código de sua requisição) não se aplicam.
messages = [{"role": "user", "content": task}]
while True:
response = client.messages.create(
model="claude-sonnet-4-6",
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=$(
curl --fail-with-body -sS "https://api.anthropic.com/v1/agents?beta=true" \
-H "x-api-key: ${ANTHROPIC_API_KEY}" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: managed-agents-2026-04-01" \
--json '{
"name": "Task Runner",
"model": "claude-sonnet-4-6",
"tools": [{"type": "agent_toolset_20260401"}]
}'
)
agent_id=$(jq -r '.id' <<< "${agent}")
session_id=$(
curl --fail-with-body -sS "https://api.anthropic.com/v1/sessions?beta=true" \
-H "x-api-key: ${ANTHROPIC_API_KEY}" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: managed-agents-2026-04-01" \
--json "$(jq -n --argjson a "${agent}" --arg env "${environment_id}" \
'{agent: {type: "agent", id: $a.id, version: $a.version}, environment_id: $env}')" \
| jq -r '.id'
)
# Abra o stream SSE em segundo plano, depois envie a mensagem do usuário.
stream_log=$(mktemp)
curl --fail-with-body -sS -N \
"https://api.anthropic.com/v1/sessions/${session_id}/stream?beta=true" \
-H "x-api-key: ${ANTHROPIC_API_KEY}" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: managed-agents-2026-04-01" \
> "${stream_log}" &
stream_pid=$!
curl --fail-with-body -sS \
"https://api.anthropic.com/v1/sessions/${session_id}/events?beta=true" \
-H "x-api-key: ${ANTHROPIC_API_KEY}" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: managed-agents-2026-04-01" \
--json "$(jq -n --arg text "${task}" \
'{events: [{type: "user.message", content: [{type: "text", text: $text}]}]}')" \
> /dev/null
# Leia eventos até a sessão ficar ociosa.
while IFS= read -r line; do
[[ ${line} == data:* ]] || continue
event_type=$(jq -r '.type // empty' 2>/dev/null <<< "${line#data: }" || true)
[[ ${event_type} == "session.status_idle" ]] && break
done < <(tail -f -n +1 "${stream_log}")
kill "${stream_pid}" 2>/dev/null || true{"type": "agent_toolset_20260401"}/workspacecwd, add_dirs apontam para caminhos locais | Faça upload ou monte arquivos como recursos de 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 em uma versão específica para promover ou reverter sem um deploy. Consulte Configuração do agente. |
mcp_servers configurados e autenticados em um 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; responda a eventos user.tool_confirmation para ferramentas always_ask. |
curl -sS --fail-with-body "https://api.anthropic.com/v1/agents/$AGENT_ID?beta=true" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: managed-agents-2026-04-01" \
--json "$(jq -n --argjson version "$AGENT_VERSION" '{version: $version, model: "claude-sonnet-4-6"}')"