Claude Managed Agents ersetzt deine handgeschriebene Agenten-Schleife durch verwaltete Infrastruktur. Diese Seite behandelt, was sich ändert, wenn du von einer benutzerdefinierten Schleife, die auf der Messages API aufbaut, oder vom Claude Agent SDK migrierst.
Managed Agents API-Anfragen erfordern den Beta-Header managed-agents-2026-04-01, mit Ausnahme der Memory-Store-Endpunkte, die stattdessen agent-memory-2026-07-22 verwenden. Das SDK setzt den korrekten Beta-Header automatisch. Siehe Beta-Header.
Wenn du einen Agenten gebaut hast, indem du messages.create in einer while-Schleife aufrufst, Tool-Aufrufe selbst ausführst und die 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 Codeausführung, Dateioperationen und Bash. |
| Du entscheidest, wann die Schleife fertig 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-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,
}
],
}
)Nachher (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-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 Lauf konstruiert | client.beta.agents.create(...) einmalig; der Agent wird serverseitig persistiert und versioniert. Siehe Agenten-Einrichtung. |
async with ClaudeSDKClient(...) oder query(...) | client.beta.sessions.create(...), dann Events senden und empfangen. |
Mit @tool dekorierte Funktionen, die automatisch vom SDK dispatcht werden | Deklariere sie als {"type": "custom", ...} auf dem Agenten; dein Client behandelt agent.custom_tool_use-Events und antwortet mit user.custom_tool_result. Siehe Tools. |
| Eingebaute 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 auf dem Agenten. Jede Aktualisierung erzeugt eine neue serverseitige Version; pinne Sessions auf eine bestimmte Version, um ohne Deployment zu promoten oder zurückzurollen. Siehe Agenten-Einrichtung. |
mcp_servers an einer Stelle konfiguriert und authentifiziert | Deklariere Server auf dem Agenten; stelle Anmeldedaten über einen Vault auf der Session bereit. |
permission_mode, can_use_tool | Pro Tool eine permission_policy; 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-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)Nachher (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"
):
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 Agenten-Schleife betreibt, ist, dass einige Dinge, die das SDK automatisch erledigt hat, in die Verantwortung deines Clients übergehen.
| SDK-Funktion | Ansatz mit Managed Agents |
|---|---|
| Plan-Modus | Führe zuerst eine reine Planungs-Session aus, dann eine zweite Session, um den Plan auszuführen. |
| 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 eingebaute 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 Agentendefinition, 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-5Die meisten Verhaltensänderungen auf Modellebene, die im Migrationsleitfaden für die Messages API dokumentiert sind, erfordern auf deiner Seite keine Maßnahmen:
max_tokens-Standardwerte, thinking-Konfiguration) werden von der Claude-Managed-Agents-Runtime gehandhabt. Diese Felder sind in der Agentendefinition nicht verfügbar.agent.custom_tool_use-Events erhältst. 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?