Claude Managed Agents reemplaza tu bucle de agente escrito a mano con infraestructura gestionada. Esta página cubre qué cambia cuando migras desde un bucle personalizado construido sobre la Messages API o desde el Claude Agent SDK.
Todas las solicitudes a la Managed Agents API requieren el encabezado beta managed-agents-2026-04-01. El SDK establece el encabezado beta automáticamente.
Si construiste un agente llamando a messages.create en un bucle while, ejecutando las llamadas a herramientas tú mismo y añadiendo los resultados al historial de conversación, la mayor parte de ese código desaparece.
| Antes | Después |
|---|---|
| Mantienes el arreglo del historial de conversación y lo pasas de vuelta en cada turno. | La sesión almacena el historial del lado del servidor. Envía eventos, recibe eventos. |
Iteras los bloques de contenido tool_use, ejecutas cada herramienta y vuelves al bucle con mensajes tool_result. | Las herramientas predefinidas se ejecutan dentro del sandbox automáticamente. 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 de 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,
}
],
}
)Después (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. 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 en cada ejecución | client.beta.agents.create(...) una 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 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 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 herramientas con 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)Después (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"
):
breakEl Agent y el Environment se crean una vez y se reutilizan en todas las sesiones. La función de herramienta sigue ejecutándose 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 pasan a ser responsabilidad de tu cliente.
| Funcionalidad del SDK | Enfoque en Managed Agents |
|---|---|
| Modo de planificación | Ejecuta primero una sesión solo de planificación, luego una segunda sesión para ejecutar el plan. |
| Estilos de salida, comandos slash | 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 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 surtirá efecto en la siguiente sesión que crees.
ant beta:agents update \
--agent-id "$AGENT_ID" \
--version "$AGENT_VERSION" \
--model claude-opus-4-8La 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 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 (qué hace el modelo de manera diferente) siguen aplicando. Los pasos de migración (cómo cambiar tu código de solicitud) no.
Was this page helpful?