Was this page helpful?
La communication avec les agents gérés Claude est basée sur des événements. Vous envoyez des événements utilisateur à l'agent et recevez en retour des événements d'agent et de session pour suivre l'état.
Toutes les requêtes 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 la 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.
Consultez la référence API des événements de session pour le schéma complet de chaque type d'événement.
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 identifiants d'événements bloquants se trouvent dans le tableau stop_reason.requires_action.event_ids.user.custom_tool_result pour chacun, en passant l'identifiant d'événement dans le paramètre custom_tool_use_id avec le contenu du résultat.running.Lorsqu'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 identifiants d'événements bloquants se trouvent dans le tableau stop_reason.requires_action.event_ids.user.tool_confirmation pour chacun, en passant l'identifiant 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.L'objet session inclut un champ usage avec des statistiques cumulatives de tokens. Récupérez la session après qu'elle soit passée à l'état inactif pour lire les derniers totaux, 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 indique les tokens d'entrée non mis en cache et output_tokens indique le total des tokens de sortie pour 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 prompts. Les entrées de cache utilisent un TTL de 5 minutes, de sorte que les tours consécutifs dans cette fenêtre bénéficient des lectures de cache, ce qui réduit le coût par token.
exec {fd}< <(curl -sS -N --fail-with-body \
"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" \
-H "content-type: application/json" \
-H "Accept: text/event-stream")
while IFS= read -r -u "$fd" line; do
[[ $line == data:* ]] || continue
data="${line#data: }"
[[ $(jq -r '.type' <<<"$data") == "session.status_idle" ]] || continue
case $(jq -r '.stop_reason.type // empty' <<<"$data") in
requires_action)
while IFS= read -r event_id; do
# Rechercher l'événement d'utilisation d'outil personnalisé et l'exécuter
result=$(call_tool "$event_id")
# Renvoyer le résultat
jq -n --arg id "$event_id" --arg result "$result" \
'{events: [{type: "user.custom_tool_result", custom_tool_use_id: $id, content: [{type: "text", text: $result}]}]}' |
curl -sS --fail-with-body \
"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" \
-H "content-type: application/json" \
-d @-
done < <(jq -r '.stop_reason.event_ids[]' <<<"$data")
;;
end_turn)
break
;;
esac
done
exec {fd}<&-exec {fd}< <(curl -sS -N --fail-with-body \
"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" \
-H "content-type: application/json" \
-H "Accept: text/event-stream")
while IFS= read -r -u "$fd" line; do
[[ $line == data:* ]] || continue
data="${line#data: }"
[[ $(jq -r '.type' <<<"$data") == "session.status_idle" ]] || continue
case $(jq -r '.stop_reason.type // empty' <<<"$data") in
requires_action)
while IFS= read -r event_id; do
# Approve the pending tool call
jq -n --arg id "$event_id" \
'{events: [{type: "user.tool_confirmation", tool_use_id: $id, result: "allow"}]}' |
curl -sS --fail-with-body \
"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" \
-H "content-type: application/json" \
-d @-
done < <(jq -r '.stop_reason.event_ids[]' <<<"$data")
;;
end_turn)
break
;;
esac
done
exec {fd}<&-