Où placer les garde-fous de dépense dans DeepSeek Harness
Updated August 16, 2026 · first published August 16, 2026
Un agent qui découvre son budget sur la facture mensuelle n'a pas de budget : il a un post-mortem. La question utile à poser à un harness est : où peut-on se placer dans la boucle et dire non ? DeepSeek Harness y répond avec deux points d'extension en cascade nommés.
D'abord, la forme de la boucle
Le harness emploie un modèle tour et étape. Une étape est une requête modèle plus les appels d'outils qu'elle produit. Un tour contient zéro étape ou plus. Le déroulé d'un tour est en gros : prise de l'entrée, assemblage du prompt, agent/pre-step, flux LLM, exécution des outils, clôture de l'étape, clôture du tour.
Deux flux d'événements avancent en parallèle. session/event porte les faits durables de relecture — chunks, messages, appels d'outils, résultats. agent/* porte les signaux de coordination en direct — statut, boîte de réception, interception de requêtes. Les garde-fous appartiennent au second ; la comptabilité au premier.
Point d'interception 1 : agent/pre-step
C'est le point de contrôle avant l'envoi de la requête modèle. La documentation précise que la décision renvoyée par agent/pre-step fait autorité et que les listeners qui enveloppent next() préservent les messages en aval sauf remplacement intentionnel. C'est cette propriété qui en fait une porte budgétaire utilisable : un listener peut refuser une étape proposée, ou la modifier, et la décision tient.
Ce qui a sa place ici :
- Plafonds d'étapes par tour. Le mode de défaillance de l'agent emballé est un tour qui ne converge jamais. Un plafond dur transforme une facture non bornée en facture bornée.
- Budgets cumulés de tokens. Additionnez l'usage déjà consigné dans le journal de session et refusez l'étape suivante au-delà du seuil.
- Rétrogradation de modèle. Réécrivez l'étape vers une route moins chère dès qu'un tour a dépassé un seuil souple, plutôt que de la refuser sèchement.
- Limites de taille de contexte. L'assemblage du prompt a lieu avant ce hook : la requête assemblée est donc visible et mesurable ici.
Point d'interception 2 : tools/pre-execute
L'exécution d'outils est un pipeline en trois phases. La cascade tools/pre-execute passe d'abord, les gardes monotones ensuite, et seulement alors le corps de l'outil s'exécute — en bac à sable, avec filtrage du système de fichiers. Ensuite une cascade post-execute peut accepter, bloquer, remplacer ou enrichir le résultat, et ToolDefinition.finalizeContent impose des invariants de contenu de façon synchrone.
La couche de permissions est délibérément asymétrique. Les gardes monotones enregistrés refusent ou s'abstiennent, identité protégée : ils n'accordent jamais. Si un garde refuse, ou si l'invite unique de ctx.approval est absente ou sans réponse possible, le résultat est un refus et le corps de l'outil est ignoré. Échec fermé, pas ouvert.
Les mutations du système de fichiers sont filtrées à part : seules les mutations fs/write-intent ou fs/edit-intent passent. Écrire n'est pas un effet de bord incident de l'exécution d'un outil.
Deux propriétés rendent ce pipeline digne de confiance comme point de contrôle : les gardes ne peuvent que refuser, et une invite d'approbation sans réponse possible refuse. La plupart des couches de politique maison échouent en ouvert quand le canal d'approbation manque, c'est-à-dire précisément quand on en avait besoin.
Ce que le pipeline consigne
Trois événements de session forment la piste d'audit : tool/call avant exécution, tool/code-dispatch pour les sous-appels et tool/result comme résultat final faisant autorité. Que les sous-appels soient consignés séparément compte : un unique appel d'outil visible du modèle qui se ramifie en interne ne cache pas sa ramification.
Un jeu de garde-fous pratique
| Contrôle | Hook | Empêche |
|---|---|---|
| Étapes maximum par tour | agent/pre-step | Boucles qui ne convergent pas |
| Plafond cumulé de tokens | agent/pre-step | Dérive de dépense à petit feu |
| Rétrogradation de route au seuil | agent/pre-step | Tarif frontière sur du travail bon marché |
| Liste blanche d'outils par classe de coût | Garde monotone | Outils coûteux en contexte bon marché |
| Refus des sous-processus et du réseau | Politique ctx.sandbox | Sortie réseau non mesurée |
| Filtrage du write-intent | Couture ctx.fs | Mutations non relues |
La réserve
DeepSeek Harness est en developer preview et son propre README annonce des changements cassant la compatibilité. Ces noms et sémantiques de hooks sont ceux documentés aujourd'hui ; traitez les plugins de garde-fous bâtis dessus comme du code que vous rouvrirez, et épinglez la version contre laquelle vous avez construit.
Related
- DeepSeek Harness : le guide complet
- Le journal de session comme registre de coûts (EN)
- Tout est un plugin : l'architecture (EN)
- Garde-fous de dépense pour agents (EN)
Want this applied to your own LLM spend? FinOps LLM runs a free audit of your AI costs and shows where the savings are. Book free audit →