Claude Managed Agents remplace votre boucle d'agent écrite manuellement par une infrastructure gérée. Cette page couvre ce qui change lorsque vous migrez depuis une boucle personnalisée construite sur l'API Messages ou depuis le Claude Agent SDK.
Toutes les requêtes à l'API Managed Agents nécessitent l'en-tête bêta managed-agents-2026-04-01. Le SDK définit automatiquement l'en-tête bêta.
Si vous avez construit un agent en appelant messages.create dans une boucle while, en exécutant vous-même les appels d'outils et en ajoutant les résultats à l'historique de conversation, la majeure partie de ce code disparaît.
| Avant | Après |
|---|---|
| Vous maintenez le tableau d'historique de conversation et le renvoyez à chaque tour. | La session stocke l'historique côté serveur. Envoyez des événements, recevez des événements. |
Vous itérez sur les blocs de contenu tool_use, exécutez chaque outil et rebouclez avec des messages tool_result. | Les outils préintégrés s'exécutent automatiquement dans le bac à sable. Vous ne gérez que les outils personnalisés via les événements agent.custom_tool_use. |
| Vous provisionnez votre propre bac à sable pour exécuter le code généré par l'agent. | Le bac à sable de session gère l'exécution de code, les opérations sur les fichiers et bash. |
| Vous décidez quand la boucle est terminée. | La session émet session.status_idle lorsque l'agent n'a plus rien à faire. |
Avant (boucle API Messages, simplifiée) :
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,
}
],
}
)Aprè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. Consultez Flux d'événements de session.Si vous avez construit avec le Claude Agent SDK, vous travaillez déjà avec les concepts d'agents, d'outils et de sessions. La différence réside dans l'endroit où ils s'exécutent : le SDK s'exécute dans un processus que vous opérez, tandis que Managed Agents s'exécute dans l'infrastructure d'Anthropic. La majeure partie de la migration consiste à faire correspondre les objets de configuration du SDK à leurs équivalents côté API.
| Agent SDK | Managed Agents |
|---|---|
ClaudeAgentOptions(...) construit à chaque exécution | client.beta.agents.create(...) une seule fois ; l'Agent est persisté et versionné côté serveur. Consultez Configuration de l'agent. |
async with ClaudeSDKClient(...) ou query(...) | client.beta.sessions.create(...) puis envoyez et recevez des événements. |
Fonctions décorées avec @tool dispatchées automatiquement par le SDK | Déclarez-les comme {"type": "custom", ...} sur l'Agent ; votre client gère les événements agent.custom_tool_use et répond avec user.custom_tool_result. Consultez Outils. |
| Les outils intégrés s'exécutent dans votre processus sur votre système de fichiers | {"type": "agent_toolset_20260401"} exécute les mêmes outils dans le bac à sable de session sur /workspace. |
cwd, add_dirs pointent vers des chemins locaux | Téléversez ou montez des fichiers en tant que ressources de session. |
system_prompt et la hiérarchie CLAUDE.md | Une seule chaîne system sur l'Agent. Chaque mise à jour produit une nouvelle version côté serveur ; épinglez les sessions à une version spécifique pour promouvoir ou revenir en arrière sans déploiement. Consultez Configuration de l'agent. |
mcp_servers configurés et authentifiés en un seul endroit | Déclarez les serveurs sur l'Agent ; fournissez les identifiants via un Vault sur la Session. |
permission_mode, can_use_tool | permission_policy par outil ; envoyez des événements user.tool_confirmation pour les outils always_ask. |
Avant (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)Aprè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"
):
breakL'Agent et l'Environnement sont créés une seule fois et réutilisés entre les sessions. La fonction d'outil s'exécute toujours dans votre processus ; la différence est que vous lisez l'événement agent.custom_tool_use et envoyez le résultat explicitement au lieu que le SDK le dispatche pour vous.
La contrepartie du fait qu'Anthropic exécute la boucle d'agent est que quelques éléments que le SDK gérait automatiquement deviennent la responsabilité de votre client.
| Fonctionnalité du SDK | Approche Managed Agents |
|---|---|
| Mode plan | Exécutez d'abord une session de planification uniquement, puis une seconde session pour exécuter le plan. |
| Styles de sortie, commandes slash | Appliquez-les dans votre client avant d'envoyer user.message ou après avoir reçu agent.message. |
Hooks PreToolUse / PostToolUse | Votre client voit déjà chaque événement agent.custom_tool_use avant de répondre ; placez la logique à cet endroit. Pour les outils intégrés, utilisez permission_policy: always_ask. |
max_turns | Comptez les tours côté client. |
sessions.create et sessions.events.stream.resources.agent.custom_tool_use.Lorsqu'un nouveau modèle Claude est publié, la migration d'une intégration Claude Managed Agents se résume généralement à la modification d'un seul champ : mettez à jour model sur votre définition d'agent et le changement prend effet à la prochaine session que vous créez.
ant beta:agents update \
--agent-id "$AGENT_ID" \
--version "$AGENT_VERSION" \
--model claude-opus-4-8La plupart des changements de comportement au niveau du modèle documentés dans le guide de migration de l'API Messages ne nécessitent aucune action de votre part :
max_tokens, configuration de thinking) sont gérés par le runtime de Claude Managed Agents. Ces champs ne sont pas exposés sur la définition de l'agent.agent.custom_tool_use. Vous voyez des données structurées, pas des chaînes brutes.Les descriptions de comportement dans le guide de l'API Messages (ce que le modèle fait différemment) s'appliquent toujours. Les étapes de migration (comment modifier votre code de requête) ne s'appliquent pas.
Was this page helpful?