La communication avec Claude Managed Agents est basée sur les événements. Vous envoyez des événements utilisateur à l'agent et recevez des événements d'agent et de session en retour pour suivre l'état.
Toutes les demandes de 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.
Les événements circulent dans deux directions.
Les chaînes de type d'événement suivent une convention de nommage {domain}.{action}.
Chaque événement inclut un horodatage processed_at indiquant quand l'événement a été enregistré côté serveur. Si processed_at est null, cela signifie que l'événement a été mis en file d'attente par le harnais et sera traité après la fin du traitement des événements précédents.
Lorsque l'agent invoque un outil personnalisé :
agent.custom_tool_use contenant le nom et l'entrée de l'outil.session.status_idle contenant stop_reason: requires_action. Les ID d'événement de blocage se trouvent dans le tableau stop_reason.requires_action.event_ids.user.custom_tool_result pour chacun, en passant l'ID d'événement dans le paramètre custom_tool_use_id ainsi que le contenu du résultat.running.with client.beta.sessions.events.stream(session.id) as stream:
for event in stream:
if event.type == "session.status_idle" and (stop := event.stop_reason):
match stop.type:
case "requires_action":
for event_id in stop.event_ids:
# Look up the custom tool use event and execute it
tool_event = events_by_id[event_id]
result = call_tool(tool_event.name, tool_event.input)
# Send the result back
client.beta.sessions.events.send(
session.id,
events=[
{
"type": "user.custom_tool_result",
"custom_tool_use_id": event_id,
"content": [{"type": "text", "text": result}],
},
],
)
case "end_turn":
breakLorsqu'une politique de permission exige une confirmation avant l'exécution d'un outil :
agent.tool_use ou agent.mcp_tool_use.session.status_idle contenant stop_reason: requires_action. Les ID d'événement bloquants se trouvent dans le tableau stop_reason.requires_action.event_ids.user.tool_confirmation pour chacun, en passant l'ID d'événement dans le paramètre tool_use_id. Définissez result sur "allow" ou "deny". Utilisez deny_message pour expliquer un refus.running.with client.beta.sessions.events.stream(session.id) as stream:
for event in stream:
if event.type == "session.status_idle" and (stop := event.stop_reason):
match stop.type:
case "requires_action":
for event_id in stop.event_ids:
# Approve the pending tool call
client.beta.sessions.events.send(
session.id,
events=[
{
"type": "user.tool_confirmation",
"tool_use_id": event_id,
"result": "allow",
},
],
)
case "end_turn":
breakL'objet session inclut un champ usage avec des statistiques de jetons cumulatifs. Récupérez la session après qu'elle soit devenue inactive pour lire les totaux les plus récents, et utilisez-les pour suivre les coûts, appliquer des budgets ou surveiller la consommation.
{
"id": "sesn_01...",
"status": "idle",
"usage": {
"input_tokens": 5000,
"output_tokens": 3200,
"cache_creation_input_tokens": 2000,
"cache_read_input_tokens": 20000
}
}input_tokens rapporte les jetons d'entrée non mis en cache et output_tokens rapporte le total des jetons de sortie sur tous les appels de modèle dans la session. Les champs cache_creation_input_tokens et cache_read_input_tokens reflètent l'activité de mise en cache des invites. Les entrées de cache utilisent un TTL de 5 minutes, donc les tours consécutifs dans cette fenêtre bénéficient des lectures de cache, ce qui réduit le coût par jeton.
Was this page helpful?