Migração
Mova um agente existente construído sobre a Messages API ou o Claude Agent SDK para o Claude Managed Agents.
O Claude Managed Agents substitui seu loop de agente escrito à mão por infraestrutura gerenciada. Esta página aborda o que muda quando você migra de um loop personalizado construído sobre a Messages API ou a partir do Claude Agent SDK.
A partir de um loop de agente da Messages API
Se você construiu um agente chamando messages.create em um loop while, executando chamadas de ferramentas por conta própria e anexando os resultados ao histórico da conversa, a maior parte desse código desaparece.
O que você deixa de gerenciar
| Antes | Depois |
|---|---|
| Você mantém o array do histórico da conversa e o envia de volta a cada turno. | A sessão armazena o histórico no lado do servidor. Envie eventos, receba eventos. |
Você itera sobre os blocos de conteúdo tool_use, executa cada ferramenta e retorna ao loop com mensagens tool_result. | As ferramentas pré-construídas são executadas automaticamente dentro do sandbox. Você só lida com ferramentas personalizadas por meio de eventos agent.custom_tool_use. |
| Você provisiona seu próprio sandbox para executar código gerado pelo agente. | O sandbox da sessão cuida da execução de código, das operações de arquivo e do bash. |
| Você decide quando o loop termina. | A sessão emite session.status_idle quando o agente não tem mais nada a fazer. |
Comparação de código
Antes (loop da Messages API, simplificado):
messages = [{"role": "user", "content": task}]
while True:
response = client.messages.create(
model="claude-opus-5",
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-5",
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":
breakO que você ainda controla
- Prompt do sistema e modelo: Os mesmos campos, agora na definição do agente.
- Ferramentas personalizadas: Ainda declaradas com JSON Schema. A execução passa do tratamento inline para a resposta a eventos
agent.custom_tool_use. Consulte Fluxo de eventos da sessão. - Configurações de web search e web fetch: Os mesmos campos
allowed_domains,blocked_domains,max_content_tokenseuser_location, agora definidos uma única vez nas entradasweb_searcheweb_fetchdo arrayconfigsdo conjunto de ferramentas do agente, em vez de em cada requisição. Os camposmax_uses,citationsecache_controlnão estão disponíveis. Consulte Restringir domínios de web search e web fetch. - Contexto: Você ainda pode injetar contexto por meio do prompt do sistema, de recursos de arquivo ou de skills.
A partir do Claude Agent SDK
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 é executado em um processo que você opera, enquanto o Managed Agents é executado na infraestrutura da Anthropic. A maior parte da migração consiste em mapear os objetos de configuração do SDK para seus equivalentes no lado da API.
O que muda
| Agent SDK | Managed Agents |
|---|---|
ClaudeAgentOptions(...) construído a cada execução | client.beta.agents.create(...) uma única vez; o Agent é persistido e versionado no lado do servidor. Consulte Configuração do agente. |
async with ClaudeSDKClient(...) ou query(...) | client.beta.sessions.create(...) e, em seguida, envie e receba eventos. |
Funções decoradas com @tool despachadas automaticamente pelo SDK | Declare como {"type": "custom", ...} no Agent; seu cliente trata os eventos agent.custom_tool_use e responde com user.custom_tool_result. Consulte Ferramentas. |
| Ferramentas integradas são executadas no seu processo sobre o seu sistema de arquivos | {"type": "agent_toolset_20260401"} executa as mesmas ferramentas dentro do sandbox da sessão sobre /workspace. |
cwd, add_dirs apontam para caminhos locais | Faça upload ou monte arquivos como recursos da sessão. |
system_prompt e a hierarquia de CLAUDE.md | Uma única string system no Agent. Cada atualização que altera o agente 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 único lugar | Declare os servidores no Agent; forneça as credenciais por meio de um Vault na Session. |
permission_mode, can_use_tool | permission_policy por ferramenta; envie eventos user.tool_confirmation para ferramentas always_ask. |
Comparação de código
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-5",
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-5",
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 event in stream:
if event.type == "agent.message":
print(
"".join(block.text for block in event.content if block.type == "text")
)
elif event.type == "agent.custom_tool_use":
result = get_weather(**event.input)
client.beta.sessions.events.send(
session.id,
events=[
{
"type": "user.custom_tool_result",
"custom_tool_use_id": event.id,
"content": [{"type": "text", "text": result}],
}
],
)
elif (
event.type == "session.status_idle"
and event.stop_reason
and event.stop_reason.type == "end_turn"
):
breakO Agent e o Environment são criados uma única vez e reutilizados entre sessões. A função da ferramenta ainda é executada 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 para você.
Recursos que passam para o seu cliente
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.
| Recurso do SDK | Abordagem no Managed Agents |
|---|---|
| Modo de planejamento | Execute primeiro uma sessão somente de planejamento e, 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. |
Checklist de migração
- Crie um ambiente com a rede e os runtimes de que seu agente precisa.
- Porte seu prompt do sistema e sua seleção de ferramentas para uma definição de agente.
- Substitua seu loop por
sessions.createesessions.events.stream. - Para quaisquer arquivos locais que o agente leia, faça upload deles por meio da Files API e monte-os como
resources. - Para quaisquer handlers de ferramentas personalizadas, mova a execução para o seu loop de eventos como respostas a eventos
agent.custom_tool_use. - Verifique com uma sessão de teste antes de direcionar o tráfego de produção para o novo fluxo.
Migrando entre versões de modelo
Quando um novo modelo Claude é lançado, migrar uma integração do Claude Managed Agents normalmente é uma alteração de um único campo: atualize model na sua definição de agente e a alteração entra em vigor na próxima sessão que você criar.
ant beta:agents update --agent-id "$AGENT_ID" < agent.yamlname: Task Runner
model: claude-opus-5
system: You are a task automation agent. Complete the task you are given end to end.
tools:
- type: agent_toolset_20260401A maioria das mudanças de comportamento no nível do modelo documentadas no guia de migração da Messages API não exige nenhuma ação da sua parte:
- Mudanças em parâmetros de requisição (padrões de
max_tokens, configuração dethinking) são tratadas pelo runtime do Claude Managed Agents. Esses campos não são expostos na definição do agente. - O preenchimento prévio de mensagens do assistente não existe no modelo de sessão baseado em eventos, portanto sua remoção em modelos mais novos não tem efeito.
- O escape de JSON nos argumentos de ferramentas é analisado pelo runtime antes de você receber os eventos
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?