Retour au blog

Optimisation des coûtsGuide

Utilisation des tokens dans Claude Code : garder la sortie des outils hors du contexte

Comment un hook PreToolUse et le plugin context-mode gardent les journaux de test hors du contexte de Claude Code, plus une estimation du coût de session avec et sans filtrage.

Par CheapTokens TeamPublié le 6 min de lecture

Terminal affichant une commande de test redirigée via grep et head pour que seuls les échecs atteignent Claude Code
Sur cette page
  1. Pourquoi un journal est payé plusieurs fois
  2. Correctif 1 : un hook PreToolUse qui filtre la sortie de test
  3. Correctif 2 : context-mode pour les gros résultats d'outils
  4. Ce que coûte une longue session, avec et sans filtrage
  5. Exécuter Claude Code sur un modèle CheapTokens
  6. Liste de vérification rapide

Votre agent a exécuté la suite de tests trois fois, et la facture dépasse la tâche. La raison est rarement le code qu'il a écrit. Ce sont les journaux de test : une fois qu'un résultat d'outil atterrit dans le contexte de Claude Code, chaque requête ultérieure le transporte à nouveau. La solution consiste à réduire la sortie de l'outil avant que le modèle ne la voie. La méthode officielle est un hook PreToolUse sur Bash ; la méthode tierce est le plugin context-mode. Les deux sont ci-dessous, avec une estimation de coût pour une longue session sur un modèle CheapTokens.

Pourquoi un journal est payé plusieurs fois#

D'après la page des coûts de Claude Code (https://code.claude.com/docs/en/costs, consultée le 23 octobre 2026), Claude Code envoie la conversation complète à chaque requête, et chaque utilisation d'outil déclenche une autre requête qui transporte les résultats de l'outil. La mise en cache des prompts relit l'historique à un tarif mis en cache moins cher, mais les tokens sont toujours là.

Supposons que l'agent exécute npm test et obtienne un journal de 10 000 lignes. La documentation indique que ce type de journal peut représenter des dizaines de milliers de tokens. Supposons 30 000 tokens. Quoi que vous fassiez ensuite, ces 30 000 tokens font partie de l'entrée de l'étape 11, de l'étape 12, de l'étape 13, et ainsi de suite jusqu'à ce que vous /clear ou compactiez. Et c'est là le piège : le journal est utile pour une étape, et vous le payez pendant trente.

Correctif 1 : un hook PreToolUse qui filtre la sortie de test#

La même page de documentation suggère des hooks comme prétraitement : un hook PreToolUse sur Bash réécrit les commandes de test (npm test, pytest, go test) pour qu'elles passent par grep -A 5 -E '(FAIL|ERROR|error:)' | head -100. L'agent ne voit alors que les échecs plus quelques lignes de contexte, et non 10 000 lignes de points verts. La documentation indique que cela peut transformer des dizaines de milliers de tokens en quelques centaines.

Ce que l'agent voit avant et après le hook
Sortie brute de npm test versus échecs uniquement

Voici le script de cette page de documentation (consultée le 23 octobre 2026). Il nécessite jq. Créez le dossier avec mkdir -p ~/.claude/hooks, enregistrez le script sous ~/.claude/hooks/filter-test-output.sh et exécutez chmod +x dessus :

bash
#!/bin/bash
input=$(cat)
cmd=$(echo "$input" | jq -r '.tool_input.command')

pattern='^(npm test|pytest|go test)( [^;&|<>`$#\\[:cntrl:]]*)?$'

if [[ "$cmd" =~ $pattern ]]; then
  filtered_cmd="$cmd 2>&1 | grep -A 5 -E '(FAIL|ERROR|error:)' | head -100"
  echo "$input" | jq --arg filtered "$filtered_cmd" '{hookSpecificOutput: {hookEventName: "PreToolUse", updatedInput: (.tool_input + {command: $filtered})}}'
else
  echo "{}"
fi

Ensuite, enregistrez-le dans ~/.claude/settings.json :

json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [{ "type": "command", "command": "~/.claude/hooks/filter-test-output.sh" }]
      }
    ]
  }
}

Pour vérifier que cela fonctionne, ouvrez /hooks dans Claude Code et cherchez l'entrée PreToolUse, ou commencez par claude --debug-file ./claude-debug.txt et demandez à l'agent d'exécuter npm test. Lorsque le hook a réécrit la commande, le fichier contient une ligne modified tool input keys avec le champ command. Si les tests passent, la sortie est vide, donc l'agent obtient un succès silencieux ; ajustez le motif si votre exécuteur affiche les échecs différemment.

Correctif 2 : context-mode pour les gros résultats d'outils#

Un hook ne couvre que les commandes que vous pouvez rediriger. Les captures de page de Playwright ou une liste de vingt tickets GitHub proviennent d'outils MCP. C'est ce que cible context-mode. D'après son README (https://github.com/mksglu/context-mode, consulté le 23 octobre 2026 ; il n'affiche ni version ni date), il s'agit d'un serveur MCP et d'un plugin qui garde la sortie brute des outils hors de la fenêtre de contexte, stocke l'état de session dans SQLite et route les appels d'outils via des hooks. Il nécessite Claude Code v1.0.33 ou plus récent, et sa licence est Elastic License 2.0, qui n'est pas une licence open source OSI.

Installation dans Claude Code :

text
/plugin marketplace add mksglu/context-mode
/plugin install context-mode@context-mode

Redémarrez ou exécutez /reload-plugins, puis vérifiez avec /context-mode:ctx-doctor. La variante MCP uniquement, claude mcp add context-mode -- npx -y context-mode, ajoute les outils mais n'a pas de routage automatique.

Le projet rapporte d'importantes réductions : 315 Ko deviennent 5,4 Ko (98 %), une capture de page de 56 Ko devient 299 octets, 986 Ko deviennent 62 Ko. Ce sont les chiffres de l'auteur : considérez-les comme le plafond et mesurez sur votre propre session avec /context avant et après.

Ce que coûte une longue session, avec et sans filtrage#

Voici l'arithmétique sur une session supposée. Il s'agit d'une session de codage de 40 étapes sur un contexte de base moyen de 20 000 tokens, 500 tokens de sortie par étape, et trois exécutions de tests, aux étapes 10, 20 et 30. Chaque journal brut fait 30 000 tokens ; la version filtrée fait 500.

  • Un journal de l'étape 10 est renvoyé dans les 30 requêtes qui suivent : 30 × 30 000 = 900 000 tokens. Étape 20 : 20 × 30 000 = 600 000. Étape 30 : 10 × 30 000 = 300 000. Entrée supplémentaire : 900 000 + 600 000 + 300 000 = 1 800 000.
  • Filtré : (30 + 20 + 10) × 500 = 30 000 entrée supplémentaire.
  • Entrée de base : 40 × 20 000 = 800 000. Sortie : 40 × 500 = 20 000.
  • Donc la session fait 800 000 + 1 800 000 = 2 600 000 tokens d'entrée sans filtrage et 800 000 + 30 000 = 830 000 avec filtrage, avec 20 000 tokens de sortie dans les deux cas.

Le calcul compte chaque token d'entrée au tarif plein. La mise en cache abaisse le nombre réel, mais elle abaisse les deux cas selon la même logique. Les prix en direct pour MiniMax-M2.7 (MiniMaxAI/MiniMax-M2.7, contexte de 180K, jusqu'à 8 192 tokens de sortie), qui est le modèle adapté aux boucles d'agents à forte entrée comme celle-ci, figurent dans le graphique ci-dessous.

Coût de session sur MiniMax-M2.7, 40 étapes
  • Sans filtre$0.133
  • Avec le hook$0.0445

Hypothèses : 40 étapes, contexte de base de 20 000 tokens, 500 tokens de sortie par étape, trois exécutions de tests de 30 000 tokens (filtré : 500).

Sur MiniMax-M2.7, la session coûte $0.133 sans filtrage et $0.0445 avec filtrage, et au total, en comptant l'entrée et la sortie ensemble, elle est moins chère que le prix de référence d'OpenRouter. Environ deux tiers de l'entrée dans le cas non filtré sont des journaux que l'agent a lus une fois.

L'important n'est pas le montant exact en dollars. C'est que le filtre supprime environ 1 770 000 des 2 600 000 tokens d'entrée (2 600 000 − 830 000 = 1 770 000) sur n'importe quel modèle, et qu'un modèle moins cher abaisse le prix de chaque token restant.

Exécuter Claude Code sur un modèle CheapTokens#

Claude Code parle le protocole Anthropic Messages, et CheapTokens le prend en charge. L'URL de base pour Claude Code n'a pas de /v1. La configuration complète est dans comment connecter Claude Code à CheapTokens. La version courte, avec une clé fictive :

bash
export ANTHROPIC_BASE_URL=https://api.cheaptokens.dev
export ANTHROPIC_AUTH_TOKEN=YOUR_CHEAPTOKENS_KEY
export ANTHROPIC_MODEL=MiniMaxAI/MiniMax-M2.7
claude

Utilisez l'id complet de la documentation ; les noms courts des tableaux de prix ne sont pas acceptés par l'API. Les prix de chaque modèle sont sur la page de tarification. Pour les autres habitudes qui réduisent une facture Claude Code (/clear, /compact, /mcp, sous-agents), voir Comment rendre Claude Code moins cher. Pour voir comment l'entrée et la sortie sont comptées sur une vraie requête, lisez Combien de tokens une requête API utilise-t-elle.

Liste de vérification rapide#

  1. Exécutez /context dans une longue session et voyez ce qui prend de la place.
  2. Ajoutez le hook Bash pour les commandes de test ; confirmez la réécriture dans /hooks ou le journal de débogage.
  3. Si les outils MCP renvoient de grosses captures, essayez context-mode et comparez /context avant et après.
  4. /clear entre des tâches sans rapport, pour que les anciens journaux cessent de suivre.