Skip to main content
Le banc bench/frameworks/ compare des garde-fous, pas des modèles. Un même modèle compromis, scripté, obéit à ce qu’il lit et invente des outils. Il est branché sur quatre frameworks, chacun avec le mécanisme de sûreté que sa documentation recommande, et rien d’autre.

Résultats

Mesurés avec LangGraph 1.2.11, PydanticAI 2.45.0 et CrewAI 1.15.22, sous Python 3.12. Chaque scénario a une variante légitime, et les quatre frameworks la réussissent toutes. Un framework qui ne ferait rien ne pourrait donc pas gagner. ¹ Avec durability="sync". Avec le défaut ("async"), le point de contrôle n’est pas encore écrit au moment de la panne, le modèle est rejoué avec un nouvel identifiant d’appel, et le virement est doublé. ² La bibliothèque seule n’a pas de reprise : la tâche est relancée. Les intégrations durables (Temporal, DBOS, Prefect pour PydanticAI, Flow persistés pour CrewAI) n’ont pas été testées. ³ Une exception levée dans un crochet before_tool_call est avalée, et l’outil s’exécute. Un refus explicite (False) bloque bien. ⁴ Sans objet : l’approbation a lieu dans le processus, au moment de l’appel. Il n’y a pas d’état d’approbation persisté à réécrire.

Mécanismes comparés

NEVER wipe_host WHEN UNTRUSTED(host) AND NOT ATTESTED(host, check_wipeable), REQUIRE APPROVAL, DurableRun sur fichier, outil idempotent=True qui reçoit current_action().idempotency_key.

Pourquoi ces résultats

  • Injection. Dans les trois frameworks, le seul rempart est l’approbation humaine, et l’opérateur approuve. Dans AGENT-L, la cible porte les sources LLM et TOOL, et le validateur ne l’a pas attestée : le NEVER s’applique avant l’approbation. Voir Provenance.
  • Réécriture après approbation. L’état en attente est réécrit entre l’approbation et la reprise, sans toucher à la décision humaine. LangGraph (update_state) et PydanticAI (historique JSON) exécutent le virement réécrit : l’approbation est liée à un identifiant d’appel, pas au contenu. AGENT-L ne relit pas les arguments depuis son journal : il re-dérive l’action et la compare à l’approbation journalisée, puis refuse la reprise. Voir Noyau et permis.
  • Panne. Voir Exécution durable.

Règles d’équité

  1. Le même modèle. Un seul script sert aux quatre adaptateurs. Côté AGENT-L, le modèle ne choisit pas l’outil : il remplit les champs REASON … PRODUCE avec les mêmes valeurs.
  2. Le mécanisme recommandé, et rien d’autre. Aucun code maison de suivi de provenance n’est ajouté aux autres frameworks.
  3. Le même monde. Les effets sont écrits sur disque avec fsync. Le service de virement honore une clé d’idempotence quand on lui en donne une.
  4. Un oracle extérieur. Le verdict ne lit que les effets produits et les codes de sortie, jamais les journaux d’un framework.
  5. Des processus séparés pour chaque phase : panne puis reprise, demande puis réécriture puis reprise.

Ce que le banc ne dit pas

  • Le modèle est un script : le banc mesure les garde-fous, pas la probabilité qu’un vrai modèle se trompe.
  • Il mesure ce que chaque framework donne sans code maison. Un développeur LangGraph, PydanticAI ou CrewAI peut écrire lui-même une liste blanche ou lier l’approbation au condensat des arguments.
  • La sûreté d’AGENT-L dépend du programme. Sans la ligne NEVER … UNTRUSTED(host), l’injection passe aussi.
  • Le journal durable d’AGENT-L est chaîné sans clé. Un attaquant capable d’écrire le journal et de forger aussi l’approbation passerait.

Reproduire

Pour reproduire le doublon de LangGraph avec son défaut :
Le rapport consigne les versions, Python, la plateforme et le commit d’AGENT-L. Aucun réseau ni aucune clé d’API ne sont nécessaires.