Claude Managed Agents ersetzt Ihre handgeschriebene Agentenschleife durch verwaltete Infrastruktur. Diese Seite beschreibt, was sich ändert, wenn Sie von einer benutzerdefinierten Schleife migrieren, die auf der Messages API oder dem Claude Agent SDK aufgebaut ist.
Alle Managed Agents API-Anfragen erfordern den managed-agents-2026-04-01 Beta-Header. Das SDK setzt den Beta-Header automatisch.
Wenn Sie einen Agenten erstellt haben, indem Sie messages.create in einer while-Schleife aufgerufen, Tool-Aufrufe selbst ausgeführt und Ergebnisse an den Gesprächsverlauf angehängt haben, entfällt der größte Teil dieses Codes.
| Vorher | Nachher |
|---|---|
| Sie pflegen das Gesprächsverlauf-Array und übergeben es bei jedem Durchlauf zurück. | Die Session speichert den Verlauf serverseitig. Senden Sie Events, empfangen Sie Events. |
Sie parsen stop_reason: "tool_use", führen das Tool aus und kehren mit einer tool_result-Nachricht zurück. | Vorgefertigte Tools werden automatisch im Container ausgeführt. Sie behandeln nur benutzerdefinierte Tools über agent.custom_tool_use-Events. |
| Sie stellen Ihre eigene Sandbox für die Ausführung von agentengenerierten Code bereit. | Der Session-Container übernimmt die Code-Ausführung, Dateioperationen und Bash. |
| Sie entscheiden, wann die Schleife beendet ist. | Die Session gibt session.status_idle aus, wenn der Agent nichts mehr zu tun hat. |
Vorher (Messages API-Schleife, vereinfacht):
Nachher (Claude Managed Agents):
agent.custom_tool_use-Events. Siehe Session-Event-Stream.Wenn Sie mit dem Claude Agent SDK entwickelt haben, arbeiten Sie bereits mit Agenten, Tools und Sessions als Konzepten. Der Unterschied liegt darin, wo sie ausgeführt werden: Das SDK wird in einem Prozess ausgeführt, den Sie betreiben, während Managed Agents in der Infrastruktur von Anthropic läuft. Der größte Teil der Migration besteht darin, SDK-Konfigurationsobjekte ihren API-seitigen Entsprechungen zuzuordnen.
| Agent SDK | Managed Agents |
|---|---|
ClaudeAgentOptions(...) wird pro Ausführung erstellt | client.beta.agents.create(...) einmalig; der Agent wird serverseitig gespeichert und versioniert. Siehe Agent-Setup. |
async with ClaudeSDKClient(...) oder query(...) | client.beta.sessions.create(...), dann Events senden und empfangen. |
@tool-dekorierte Funktionen werden automatisch vom SDK ausgeführt | Als {"type": "custom", ...} auf dem Agenten deklarieren; Ihr Client behandelt agent.custom_tool_use-Events und antwortet mit user.custom_tool_result. Siehe Tools. |
| Eingebaute Tools laufen in Ihrem Prozess gegen Ihr Dateisystem | {"type": "agent_toolset_20260401"} führt dieselben Tools im Session-Container gegen aus. |
Vorher (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)Nachher (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":
breakDer Agent und die Umgebung werden einmalig erstellt und über Sessions hinweg wiederverwendet. Die Tool-Funktion läuft weiterhin in Ihrem Prozess; der Unterschied besteht darin, dass Sie das agent.custom_tool_use-Event lesen und das Ergebnis explizit senden, anstatt dass das SDK es für Sie ausführt.
Der Kompromiss dafür, dass Anthropic die Agentenschleife ausführt, besteht darin, dass einige Dinge, die das SDK automatisch behandelt hat, zur Verantwortung Ihres Clients werden.
| SDK-Funktion | Managed Agents-Ansatz |
|---|---|
| Plan-Modus | Führen Sie zuerst eine reine Planungs-Session durch, dann eine zweite Session zur Ausführung. |
| Ausgabestile, Slash-Befehle | In Ihrem Client anwenden, bevor Sie user.message senden oder nachdem Sie agent.message empfangen. |
PreToolUse / PostToolUse-Hooks | Ihr Client sieht bereits jedes agent.custom_tool_use-Event, bevor er antwortet; legen Sie die Logik dort ab. Für eingebaute Tools verwenden Sie permission_policy: always_ask. |
max_turns | Zählen Sie Durchläufe clientseitig. |
sessions.create und sessions.stream.resources.agent.custom_tool_use-Events.Wenn ein neues Claude-Modell veröffentlicht wird, ist die Migration einer Claude Managed Agents-Integration typischerweise eine Änderung an einem einzigen Feld: Aktualisieren Sie model in Ihrer Agentendefinition, und die Änderung tritt bei der nächsten Session, die Sie erstellen, in Kraft.
Die meisten Verhaltensänderungen auf Modellebene, die im Messages API-Migrationsleitfaden dokumentiert sind, erfordern keine Maßnahmen Ihrerseits:
max_tokens-Standardwerte, thinking-Konfiguration) werden von der Claude Managed Agents-Laufzeit behandelt. Diese Felder sind in der Agentendefinition nicht verfügbar.agent.custom_tool_use-Events empfangen. Sie sehen strukturierte Daten, keine rohen Strings.Die Verhaltensbeschreibungen im Messages API-Leitfaden (was das Modell anders macht) gelten weiterhin. Die Migrationsschritte (wie Sie Ihren Request-Code ändern) gelten nicht.
Was this page helpful?
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'
)
# Öffnen Sie den SSE-Stream im Hintergrund, dann senden Sie die Benutzernachricht.
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
# Lesen Sie Events, bis die Session in den Leerlauf geht.
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/workspacecwd, add_dirs zeigen auf lokale Pfade | Laden Sie Dateien hoch oder mounten Sie sie als Session-Ressourcen. |
system_prompt und die CLAUDE.md-Hierarchie | Ein einzelner system-String auf dem Agenten. Jede Aktualisierung erzeugt eine neue serverseitige Version; pinnen Sie Sessions auf eine bestimmte Version, um ohne Deployment zu fördern oder zurückzurollen. Siehe Agent-Setup. |
mcp_servers an einem Ort konfiguriert und authentifiziert | Server auf dem Agenten deklarieren; Anmeldedaten über einen Vault auf der Session bereitstellen. |
permission_mode, can_use_tool | Pro-Tool permission_policy; auf user.tool_confirmation-Events für always_ask-Tools reagieren. |
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"}')"