Was this page helpful?
Claude Managed Agents reemplaza tu bucle de agente escrito a mano con infraestructura administrada. Esta página cubre qué cambios cuando migras desde un bucle personalizado construido en la API de Mensajes o desde el SDK del Agente Claude.
Todas las solicitudes de la API de Managed Agents 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 llamadas de herramientas tú mismo y añadiendo resultados al historial de conversación, la mayoría de ese código desaparece.
| Antes | Después |
|---|---|
| Mantienes el array del historial de conversación y lo pasas en cada turno. | La sesión almacena el historial en el servidor. Envía eventos, recibe eventos. |
Analizas stop_reason: "tool_use", ejecutas la herramienta y vuelves al bucle con un mensaje tool_result. | Las herramientas preintegradas se ejecutan dentro del contenedor 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 contenedor de sesión maneja la ejecución de código, 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 API de Mensajes, simplificado):
Después (Claude Managed Agents):
agent.custom_tool_use. Ver Flujo de eventos de sesión.Si construiste con el SDK del Agente Claude, ya estás trabajando con agentes, herramientas y sesiones como conceptos. La diferencia es dónde se ejecutan: el SDK se ejecuta en un proceso que operas, mientras que Managed Agents se ejecuta en la infraestructura de Anthropic. La mayoría de la migración es mapear objetos de configuración del SDK a sus equivalentes del lado de la API.
| SDK del Agente | Managed Agents |
|---|---|
ClaudeAgentOptions(...) construido por ejecución | client.beta.agents.create(...) una vez; el Agente se persiste y se versionea en el servidor. Ver Configuración del Agente. |
async with ClaudeSDKClient(...) o query(...) | client.beta.sessions.create(...) luego envía y recibe eventos. |
Funciones decoradas con @tool despachadas automáticamente por el SDK | Declara como {"type": "custom", ...} en el Agente; tu cliente maneja eventos agent.custom_tool_use y responde con user.custom_tool_result. Ver Herramientas. |
| Las herramientas integradas se ejecutan en tu proceso contra tu sistema de archivos | ejecuta las mismas herramientas dentro del contenedor de sesión contra . |
Antes (SDK del Agente):
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)Después (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":
breakEl Agente y el Entorno se crean una vez y se reutilizan en todas las sesiones. La función de herramienta aún 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.
El compromiso 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.
| Característica del SDK | Enfoque de Managed Agents |
|---|---|
| Modo de planificación | Ejecuta una sesión de solo planificación primero, luego una segunda sesión para ejecutar. |
| Estilos de salida, comandos de barra | Aplica en tu cliente antes de enviar user.message o después de recibir agent.message. |
Ganchos PreToolUse / PostToolUse | Tu cliente ya ve cada evento agent.custom_tool_use antes de responder; pon la lógica allí. Para herramientas integradas, usa permission_policy: always_ask. |
max_turns | Cuenta turnos en el lado del cliente. |
sessions.create y sessions.stream.resources.agent.custom_tool_use.Cuando se lanza un nuevo modelo Claude, migrar una integración de Claude Managed Agents es típicamente un cambio de un campo: actualiza model en tu definición de agente y el cambio toma efecto en la próxima sesión que crees.
La mayoría de los cambios de comportamiento a nivel de modelo documentados en la guía de migración de la API de Mensajes no requieren acción de tu parte:
max_tokens, configuración de thinking) son manejados por el tiempo de ejecución de Claude Managed Agents. Estos campos no se exponen 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 API de Mensajes (qué hace el modelo de manera diferente) aún se aplican. Los pasos de migración (cómo cambiar tu código de solicitud) no.
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'
)
# Open the SSE stream in the background, then send the user message.
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
# Read events until the session goes idle.
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 apuntan a rutas locales | Carga o monta archivos como recursos de sesión. |
system_prompt y la jerarquía CLAUDE.md | Una única cadena system en el Agente. Cada actualización produce una nueva versión en el servidor; fija sesiones a una versión específica para promover o revertir sin un despliegue. Ver Configuración del Agente. |
mcp_servers configurados y autenticados en un lugar | Declara servidores en el Agente; proporciona credenciales a través de un Vault en la Sesión. |
permission_mode, can_use_tool | Por herramienta permission_policy; responde a eventos user.tool_confirmation para herramientas 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"}')"