Les mécanismes de contrôle
Bloquez un appel d'outil interdit par votre politique avant l'exécution de tout hook ou outil. guardrails= accepte les mêmes objets agents.Hook que hooks= et les exécute en premier, à chaque point d'exécution des hooks. Utilisez-le pour les vérifications de sécurité et réservez hooks= au code de votre application.
Ce mécanisme de contrôle empêche le relecteur des paiements d'ouvrir un second dossier pour une alerte qui en possède déjà un. Chaque pre_tool_call affiche un message pour montrer l'ordre d'exécution. Enregistrez cet exemple à côté du fichier reviewer.py présenté sur cette page : il importe les deux outils.
import asyncio
from mistralai import agents
from reviewer import get_alert, open_case
CASES = {"4711": "CASE-4711"} # alerts that already have a case: read them from your case system
class OneCasePerAlert(agents.Hook):
async def pre_tool_call(self, ctx, call):
print("guardrail:", call.tool_id)
alert_id = call.arguments.get("alert_id")
if call.tool_id == "client.open_case" and alert_id in CASES:
return agents.skip(f"Alert {alert_id} already has case {CASES[alert_id]}. Do not open another.")
class AuditLog(agents.Hook):
async def pre_tool_call(self, ctx, call):
print("hook:", call.tool_id)
payment_reviewer = agents.Agent(
model="mistral-large-4",
name="payment-reviewer",
instructions=(
"Review the alert. Collect the context. If the payment is suspicious, open a case file. "
"Reply in one sentence."
),
tools=[get_alert, open_case],
guardrails=[OneCasePerAlert()],
hooks=[AuditLog()],
)
async def main() -> None:
state = await payment_reviewer.run("Review transaction monitoring alert 4711.")
if isinstance(state, agents.Completed):
print(state.text)
asyncio.run(main())guardrail: client.get_alert
hook: client.get_alert
guardrail: client.open_case
Alert 4711 is a suspicious 9,800 EUR payment from account FR76-3000-4471 to a beneficiary added just 3 minutes earlier right after a password reset — a classic account-takeover plus structuring pattern (amount just under the 10,000 EUR threshold) — and a case file (CASE-4711) is already open for it.Chaque appel d'outil est passé d'abord par le mécanisme de contrôle, puis par le hook. Le mécanisme de contrôle a renvoyé agents.skip(...) pour open_case : ni le hook ni l'outil n'ont donc été exécutés, et le modèle a reçu le motif à la place du résultat. Sa réponse indique que le dossier est déjà ouvert. call.tool_id est l'identifiant complet de l'outil, par exemple client.open_case (client est l'espace de noms par défaut de vos propres outils). Un mécanisme de contrôle peut donc aussi vérifier les outils intégrés. La Référence API de Hook répertorie les points d'exécution des hooks et ce que chacun peut renvoyer.
Les mécanismes de contrôle vérifient les données avant l'exécution de vos hooks. Si un hook de hooks= modifie ensuite ces données, par exemple les arguments d'un appel d'outil, aucun mécanisme de contrôle ne vérifie la nouvelle valeur.
Pour demander l'accord d'une personne avant l'exécution d'un outil, utilisez plutôt les Approbations.
Suite
Sessions : échangez avec l'agent sur plusieurs tours de conversation.