Claude Managed Agents ersetzt deine selbst geschriebene Agent-Schleife durch verwaltete Infrastruktur. Diese Seite beschreibt, was sich ändert, wenn du von einer benutzerdefinierten Schleife auf Basis der Messages API oder vom Claude Agent SDK migrierst.
Alle Managed Agents API-Anfragen erfordern den Beta-Header managed-agents-2026-04-01. Das SDK setzt den Beta-Header automatisch.
Wenn du einen Agenten gebaut hast, indem du messages.create in einer while-Schleife aufrufst, Tool-Aufrufe selbst ausführst und Ergebnisse an den Gesprächsverlauf anhängst, fällt der Großteil dieses Codes weg.
| Vorher | Nachher |
|---|---|
| Du pflegst das Array mit dem Gesprächsverlauf und übergibst es bei jedem Turn erneut. | Die Session speichert den Verlauf serverseitig. Sende Events, empfange Events. |
Du iterierst über tool_use-Content-Blöcke, führst jedes Tool aus und kehrst mit tool_result-Nachrichten in die Schleife zurück. | Vorgefertigte Tools laufen automatisch innerhalb der Sandbox. Du behandelst nur benutzerdefinierte Tools über agent.custom_tool_use-Events. |
| Du stellst deine eigene Sandbox für die Ausführung von agentengeneriertem Code bereit. | Die Session-Sandbox übernimmt Code-Ausführung, Dateioperationen und Bash. |
| Du entscheidest, wann die Schleife beendet ist. | Die Session sendet session.status_idle, wenn der Agent nichts mehr zu tun hat. |
Vorher (Messages-API-Schleife, vereinfacht):
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,
}
],
}
)Nachher (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-Events. Siehe Session-Event-Stream.Wenn du mit dem Claude Agent SDK gebaut hast, arbeitest du bereits mit Agenten, Tools und Sessions als Konzepten. Der Unterschied liegt darin, wo sie laufen: Das SDK wird in einem Prozess ausgeführt, den du betreibst, während Managed Agents in der Infrastruktur von Anthropic läuft. Der Großteil der Migration besteht darin, SDK-Konfigurationsobjekte auf ihre API-seitigen Entsprechungen abzubilden.
| Agent SDK | Managed Agents |
|---|---|
ClaudeAgentOptions(...) wird pro Ausführung erstellt | client.beta.agents.create(...) einmalig; der Agent wird serverseitig persistiert und versioniert. Siehe Agent-Einrichtung. |
async with ClaudeSDKClient(...) oder query(...) | client.beta.sessions.create(...), dann Events senden und empfangen. |
Mit @tool dekorierte Funktionen werden automatisch vom SDK dispatcht | Deklariere sie als {"type": "custom", ...} am Agent; dein Client behandelt agent.custom_tool_use-Events und antwortet mit user.custom_tool_result. Siehe Tools. |
| Integrierte Tools laufen in deinem Prozess gegen dein Dateisystem | {"type": "agent_toolset_20260401"} führt dieselben Tools innerhalb der Session-Sandbox gegen /workspace aus. |
cwd, add_dirs zeigen auf lokale Pfade | Lade Dateien hoch oder mounte sie als Session-Ressourcen. |
system_prompt und die CLAUDE.md-Hierarchie | Ein einzelner system-String am Agent. Jedes Update erzeugt eine neue serverseitige Version; pinne Sessions an eine bestimmte Version, um ohne Deployment zu promoten oder zurückzurollen. Siehe Agent-Einrichtung. |
mcp_servers werden an einer Stelle konfiguriert und authentifiziert | Deklariere Server am Agent; stelle Zugangsdaten über einen Vault an der Session bereit. |
permission_mode, can_use_tool | permission_policy pro Tool; sende user.tool_confirmation-Events für always_ask-Tools. |
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-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)Nachher (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"
):
breakDer Agent und das Environment werden einmal erstellt und über Sessions hinweg wiederverwendet. Die Tool-Funktion läuft weiterhin in deinem Prozess; der Unterschied ist, dass du das agent.custom_tool_use-Event liest und das Ergebnis explizit sendest, anstatt dass das SDK es für dich dispatcht.
Der Kompromiss dafür, dass Anthropic die Agent-Schleife ausführt, besteht darin, dass einige Dinge, die das SDK automatisch erledigt hat, in die Verantwortung deines Clients übergehen.
| SDK-Feature | Ansatz bei Managed Agents |
|---|---|
| Plan-Modus | Führe zuerst eine reine Planungs-Session aus, dann eine zweite Session zur Ausführung des Plans. |
| Output-Styles, Slash-Befehle | Wende sie in deinem Client an, bevor du user.message sendest oder nachdem du agent.message empfangen hast. |
PreToolUse- / PostToolUse-Hooks | Dein Client sieht bereits jedes agent.custom_tool_use-Event, bevor er antwortet; platziere die Logik dort. Für integrierte Tools verwende permission_policy: always_ask. |
max_turns | Zähle Turns clientseitig. |
sessions.create und sessions.events.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: Aktualisiere model in deiner Agent-Definition, und die Änderung wird bei der nächsten Session wirksam, die du erstellst.
ant beta:agents update \
--agent-id "$AGENT_ID" \
--version "$AGENT_VERSION" \
--model claude-opus-4-8Die meisten Verhaltensänderungen auf Modellebene, die im Messages-API-Migrationsleitfaden dokumentiert sind, erfordern keine Aktion deinerseits:
max_tokens-Defaults, thinking-Konfiguration) werden von der Claude-Managed-Agents-Runtime behandelt. Diese Felder sind in der Agent-Definition nicht verfügbar.agent.custom_tool_use-Events empfängst. Du siehst strukturierte Daten, keine rohen Strings.Die Verhaltensbeschreibungen im Messages-API-Leitfaden (was das Modell anders macht) gelten weiterhin. Die Migrationsschritte (wie du deinen Request-Code änderst) nicht.
Was this page helpful?