PostToolUse et hooks d’appels sortants
Interceptez les résultats des outils et bloquez les actions contraires aux règles.
PostToolUse et hooks d’appels sortants est une leçon Claude Architect gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Claude Architect, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Claude Architect comprend 4 leçons au total.
Pourquoi les hooks existent
Les invites orientent le modèle, mais elles sont probabilistes — fiables à environ 90 %. Cela convient pour la plupart des comportements. Cependant, certaines actions ne doivent jamais passer : effectuer un remboursement important, supprimer des données de production ou envoyer de l'argent.
Les hooks vous offrent une application 100 % déterministe. Ce sont des instructions qui s'exécutent autour de l'exécution des outils, en dehors du contrôle du modèle. Utilisez-les lorsqu'un échec a des conséquences financières, juridiques ou liées à la sécurité.
Deux points d'intervention des hooks à connaître
Cette leçon couvre deux points d'application :
- PostToolUse — s'exécute après l'exécution d'un outil et intercepte le résultat avant que le modèle ne le voie. Vous pouvez réduire, valider, anonymiser ou remodeler la sortie de l'outil.
- Hooks d'appels sortants — bloquent une action contraire à la politique avant qu'elle ne quitte votre système (par exemple, un remboursement supérieur à un seuil).
Ensemble, ils encadrent la partie dangereuse de la boucle agentique : le moment où le résultat d'un outil entre dans la conversation et celui où un effet secondaire pourrait en sortir.
Position des hooks dans la boucle
Rappelez-vous la boucle agentique : envoyer la requête, examiner stop_reason et, lorsqu'il vaut tool_use, exécuter l'outil et ajouter le résultat à l'historique, puis recommencer jusqu'à end_turn.
Un hook PostToolUse enveloppe l'étape « exécuter l'outil ». Le modèle demande un appel d'outil ; votre code l'exécute ; avant d'ajouter le résultat à l'historique des messages, le hook l'examine et peut le modifier.
def run_tool_with_hook(tool_name, tool_input, tool_use_id):
raw_result = execute_tool(tool_name, tool_input)
# PostToolUse: inspect/transform BEFORE the model sees it
safe_result = post_tool_use_hook(tool_name, raw_result)
return {
"type": "tool_result",
"tool_use_id": tool_use_id,
"content": safe_result,
}PostToolUse : réduire une sortie verbeuse
Une tâche PostToolUse courante et pratique consiste à réduire la sortie de l'outil aux champs pertinents. Les réponses brutes des API sont souvent volumineuses, et un contexte trop chargé provoque le problème de l'information perdue au milieu — les modèles prêtent davantage attention au début et à la fin du contexte qu'à son milieu.
Le hook remodèle le résultat de manière déterministe, afin que le modèle ne voie que les champs importants.
def post_tool_use_hook(tool_name, raw_result):
if tool_name == "lookup_order":
# Keep only fields the model needs; drop the rest
return {
"order_id": raw_result["id"],
"status": raw_result["status"],
"total": raw_result["total"],
}
return raw_resultPostToolUse : des erreurs structurées, pas des erreurs génériques
PostToolUse permet également de normaliser les erreurs. Un état générique comme "Operation failed" empêche la récupération — le modèle ne peut pas distinguer un problème temporaire d'un problème d'autorisation.
Remodelez les échecs en erreurs structurées afin que le modèle puisse les orienter intelligemment : un indicateur, une catégorie, la possibilité de réessayer et le contexte.
def post_tool_use_hook(tool_name, raw_result):
if raw_result.get("error"):
return {
"isError": True,
"errorCategory": "transient", # transient/validation/business/permission
"isRetryable": True,
"message": raw_result["error"],
"attempted_query": raw_result.get("query"),
"partial_results": raw_result.get("partial", []),
}
return raw_resultDistinguer l'échec du résultat vide
Voici une règle subtile que PostToolUse aide à faire respecter : un échec d'accès n'est pas la même chose qu'un résultat vide valide.
- Une requête ayant échoué (délai d'attente, authentification) est une erreur que le modèle peut réessayer.
- Un résultat vide (zéro commande correspondante) est une réponse légitime — réessayer ne change rien.
Encodez cette différence afin que le modèle ne gaspille jamais d'itérations à réessayer une requête qui ne trouve simplement aucune correspondance.
def post_tool_use_hook(tool_name, raw_result):
if tool_name == "lookup_order":
if raw_result.get("connection_error"):
return {"isError": True, "errorCategory": "transient",
"isRetryable": True}
# Empty is a VALID answer, not an error
return {"orders": raw_result.get("orders", []),
"isError": False}
return raw_resultHooks d'appels sortants : l'arrêt strict
Abordons maintenant le cas d'utilisation principal. Le scénario du service client de l'examen comporte un outil process_refund. Règle : les remboursements supérieurs à 500 $ nécessitent l'intervention d'un humain.
Vous pourriez écrire cette règle dans l'invite — mais une invite est fiable à environ 90 %, et un seul remboursement manqué représente une perte financière réelle. Vous enveloppez donc l'appel sortant dans un hook qui bloque l'action de manière déterministe lorsque le seuil est dépassé. Le jugement du modèle n'a ici aucun poids.
REFUND_LIMIT = 500
def outgoing_call_hook(tool_name, tool_input):
if tool_name == "process_refund" and tool_input["amount"] > REFUND_LIMIT:
# Block the side effect; hand control back to the model
return {
"blocked": True,
"reason": "Refund over $500 requires human approval.",
"next_action": "escalate_to_human",
}
return execute_tool(tool_name, tool_input)Conditions préalables programmatiques
Les hooks d'appels sortants imposent également des conditions préalables — des garanties d'ordre qu'une invite ne peut pas fournir de manière fiable. Exemple : ne traitez jamais un remboursement tant que get_customer n'a pas renvoyé une identité vérifiée.
Le hook vérifie un fait dans votre propre état, et non l'affirmation du modèle selon laquelle il aurait « déjà vérifié » l'identité. C'est la différence entre une garantie déterministe et une instruction fondée sur l'espoir.
def outgoing_call_hook(tool_name, tool_input, session_state):
if tool_name == "process_refund" and not session_state.get("verified_customer_id"):
return {
"blocked": True,
"reason": "Identity not verified. Call get_customer first.",
}
return execute_tool(tool_name, tool_input)Renvoyer le blocage au modèle
Le blocage ne représente que la moitié du travail. Un hook qui absorbe silencieusement l'action laisse le modèle dans la confusion et la boucle à l'arrêt — c'est une dissimulation silencieuse, une mauvaise pratique.
Renvoyez plutôt le blocage sous la forme d'un résultat d'outil que le modèle peut lire et traiter. Un bon message de blocage indique la raison et l'étape suivante correcte (ici, escalate_to_human), afin que l'agent récupère proprement dans la même boucle.
def handle_tool_call(tool_name, tool_input, tool_use_id, state):
outcome = outgoing_call_hook(tool_name, tool_input, state)
if isinstance(outcome, dict) and outcome.get("blocked"):
return {"type": "tool_result", "tool_use_id": tool_use_id,
"is_error": True, "content": outcome["reason"]}
return {"type": "tool_result", "tool_use_id": tool_use_id,
"content": outcome}Hooks et limites d'itérations
Ne confondez pas les hooks d'application avec le filet de sécurité de la boucle. Une limite d'itérations arrête une boucle qui s'emballe, mais il s'agit d'un dispositif de secours — jamais du mécanisme de contrôle principal ni d'un substitut à l'application des règles.
Les hooks sont l'inverse : une garantie précise et intentionnelle concernant une action donnée. Le modèle continue de prendre les décisions ; les hooks réservent le code strict aux seules garanties qui comptent réellement.
Quand utiliser un hook
Règle de décision pour l'examen et la production :
- Utilisez un hook lorsque l'échec est financier, juridique ou critique pour la sécurité, ou lorsque vous avez besoin d'une condition préalable ou d'un seuil déterministe (remboursement > 500 $, identité vérifiée avant le versement).
- Utilisez une invite pour les conseils souples, le ton et les quelque 90 % de comportements pour lesquels un oubli occasionnel est acceptable.
Hooks = déterministes. Invites = probabilistes. Choisissez l'outil en fonction du coût d'une erreur.
Vérification rapide
Un agent d'assistance dispose d'un outil process_refund. La politique de l'entreprise exige que les remboursements supérieurs à 500 $ soient approuvés par un humain. La plupart des remboursements sont faibles et automatisés. Quelle est la manière la plus rigoureuse, au niveau de l'architecture, de faire respecter cette règle ?
Récapitulatif
Points essentiels :
- PostToolUse intercepte les résultats des outils avant que le modèle ne les voie — réduisez les sorties verbeuses, normalisez les échecs génériques en erreurs structurées et distinguez l'échec d'accès d'un résultat vide valide.
- Les hooks d'appels sortants bloquent les actions contraires à la politique (remboursement > 500 $) et imposent les conditions préalables (identité vérifiée avant le versement).
- Hooks = 100 % déterministes ; invites = environ 90 % probabilistes. Utilisez des hooks lorsque l'échec est financier, juridique ou critique pour la sécurité.
- Renvoyez toujours un blocage sous la forme d'un résultat structuré — ne le masquez jamais silencieusement. Les limites d'itérations sont un filet de sécurité, pas un mécanisme d'application des règles.
Apprends Python avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 26
- Leçons
- 104
Questions Fréquemment Posées
La leçon « PostToolUse et hooks d’appels sortants » est-elle gratuite ?
Oui — le texte complet de « PostToolUse et hooks d’appels sortants » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Claude Architect, passe à CoddyKit PRO. Le cours Claude Architect comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « PostToolUse et hooks d’appels sortants » ?
Interceptez les résultats des outils et bloquez les actions contraires aux règles. Tu pratiques Claude Architect avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Claude Architect ?
Aucune expérience préalable n'est requise. Claude Architect sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « PostToolUse et hooks d’appels sortants » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Claude Architect ?
Oui. Chaque leçon Claude Architect inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- PostToolUse et hooks d’appels sortants
- Application déterministe ou requêtes
- Préconditions programmatiques
- Protocoles de transmission structurés