Claude Managed Agents reemplaza tu bucle de agente escrito a mano con infraestructura gestionada. Esta página cubre lo que cambia cuando migras desde un bucle personalizado construido sobre la Messages API o desde el Claude Agent SDK.
Las solicitudes a la API de Managed Agents requieren el encabezado beta managed-agents-2026-04-01, excepto los endpoints del almacén de memoria, que usan agent-memory-2026-07-22 en su lugar. El SDK establece el encabezado beta correcto automáticamente. Consulta Encabezados beta.
Si construiste un agente llamando a messages.create en un bucle while, ejecutando las llamadas a herramientas tú mismo y agregando los resultados al historial de la conversación, la mayor parte de ese código desaparece.
| Antes | Después |
|---|---|
| Mantienes el arreglo del historial de la conversación y lo devuelves en cada turno. | La sesión almacena el historial del lado del servidor. Envía eventos, recibe eventos. |
Iteras sobre los bloques de contenido tool_use, ejecutas cada herramienta y vuelves al bucle con mensajes tool_result. | Las herramientas preconstruidas se ejecutan automáticamente dentro del sandbox. Solo manejas herramientas personalizadas a través de eventos agent.custom_tool_use. |
| Aprovisionas tu propio sandbox para ejecutar código generado por el agente. | El sandbox de la sesión maneja la ejecución de código, las operaciones de archivos y bash. |
| Decides cuándo termina el bucle. | La sesión emite session.status_idle cuando el agente no tiene nada más que hacer. |
Antes (bucle con la 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,
}
],
}
)Después (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":
breakagent.custom_tool_use. Consulta Flujo de eventos de sesión.Si construiste con el Claude Agent SDK, ya estás trabajando con agentes, herramientas y sesiones como conceptos. La diferencia está en dónde se ejecutan: el SDK se ejecuta en un proceso que tú operas, mientras que Managed Agents se ejecuta en la infraestructura de Anthropic. La mayor parte de la migración consiste en mapear los objetos de configuración del SDK a sus equivalentes del lado de la API.
| Agent SDK | Managed Agents |
|---|---|
ClaudeAgentOptions(...) construido por cada ejecución | client.beta.agents.create(...) una sola vez; el Agent se persiste y versiona del lado del servidor. Consulta Configuración del agente. |
async with ClaudeSDKClient(...) o query(...) | client.beta.sessions.create(...) y luego envía y recibe eventos. |
Funciones decoradas con @tool despachadas automáticamente por el SDK | Decláralas como {"type": "custom", ...} en el Agent; tu cliente maneja los eventos agent.custom_tool_use y responde con user.custom_tool_result. Consulta Herramientas. |
| Las herramientas integradas se ejecutan en tu proceso contra tu sistema de archivos | {"type": "agent_toolset_20260401"} ejecuta las mismas herramientas dentro del sandbox de la sesión contra /workspace. |
cwd, add_dirs apuntan a rutas locales | Sube o monta archivos como recursos de la sesión. |
system_prompt y la jerarquía de CLAUDE.md | Una única cadena system en el Agent. Cada actualización produce una nueva versión del lado del servidor; fija las sesiones a una versión específica para promover o revertir sin un despliegue. Consulta Configuración del agente. |
mcp_servers configurados y autenticados en un solo lugar | Declara los servidores en el Agent; proporciona las credenciales a través de un Vault en la Session. |
permission_mode, can_use_tool | permission_policy por herramienta; envía eventos user.tool_confirmation para las herramientas 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-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)Después (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 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"
):
breakEl Agent y el Environment se crean una vez y se reutilizan entre sesiones. La función de la herramienta todavía se ejecuta en tu proceso; la diferencia es que lees el evento agent.custom_tool_use y envías el resultado explícitamente en lugar de que el SDK lo despache por ti.
La contrapartida de que Anthropic ejecute el bucle del agente es que algunas cosas que el SDK manejaba automáticamente se convierten en responsabilidad de tu cliente.
| Funcionalidad del SDK | Enfoque en Managed Agents |
|---|---|
| Modo de planificación | Ejecuta primero una sesión solo de planificación y luego una segunda sesión para ejecutar el plan. |
| Estilos de salida, comandos de barra diagonal | Aplícalos en tu cliente antes de enviar user.message o después de recibir agent.message. |
Hooks PreToolUse / PostToolUse | Tu cliente ya ve cada evento agent.custom_tool_use antes de responder; coloca la lógica ahí. Para las herramientas integradas, usa permission_policy: always_ask. |
max_turns | Cuenta los turnos del lado del cliente. |
sessions.create y sessions.events.stream.resources.agent.custom_tool_use.Cuando se lanza un nuevo modelo de Claude, migrar una integración de Claude Managed Agents suele ser un cambio de un solo campo: actualiza model en tu definición de agente y el cambio surte efecto en la siguiente sesión que crees.
ant beta:agents update \
--agent-id "$AGENT_ID" \
--version "$AGENT_VERSION" \
--model claude-opus-5La mayoría de los cambios de comportamiento a nivel de modelo documentados en la guía de migración de la Messages API no requieren ninguna acción de tu parte:
max_tokens, configuración de thinking) son manejados por el runtime de Claude Managed Agents. Estos campos no están expuestos en la definición del agente.agent.custom_tool_use. Ves datos estructurados, no cadenas sin procesar.Las descripciones de comportamiento en la guía de la Messages API (lo que el modelo hace de manera diferente) siguen siendo aplicables. Los pasos de migración (cómo cambiar tu código de solicitud) no.
Was this page helpful?