La compaction de Hermes a un défaut lean : les modèles à grande fenêtre cessent d'accumuler des tails de 170K tokens

Imaginez : vous tenez une session marathon sur un modèle à contexte de 1M, vous atteignez le demi-million de tokens, les choses ralentissent, alors vous tapez /compress pour alléger le contexte — et la session ne rétrécit presque pas. Chaque tour suivant envoie toujours une « queue » de plus de cent mille tokens au modèle, et votre facture gonfle en silence. Ce n’est pas une impression : l’ancienne formule de compaction dimensionne la queue verbatim avec la taille de fenêtre et le seuil, si bien que sur les modèles à grande fenêtre elle accumule silencieusement 100K–240K tokens d’historique verbatim à chaque compaction. Un commit fusionné le 26 août (6e5413844e) a inversé le défaut : le nouveau mode lean ne conserve qu’une petite queue bornée, et l’espace récupéré est spectaculaire.
Pourquoi l’ancienne formule s’est mise à accumuler sur les modèles modernes
Quand la compaction s’exécute, Hermes divise la session en un « résumé » (mémoire à long terme) et une « queue » (contenu verbatim récent qui assure la continuité). L’ancien budget par défaut était threshold × target_ratio — une formule conçue autour de fenêtres de 128K avec un déclenchement à 50 %, qui produisait une queue d’environ 13K tokens, raisonnable.
Mais à mesure que les fenêtres des modèles grandissaient, la formule continuait de monter proportionnellement : une session à fenêtre de 1M avec un seuil de 0,85 obtient une queue verbatim de 170K tokens (plafond souple de 255K) en mode legacy. Un /compress manuel sur une session de 540K retombe à environ 290K — l’accumulation rend la compaction inutile, et chaque tour renvoie ces tokens au modèle, brûlant deux fois l’argent.
Le nouveau défaut : le mode lean (#87326 compaction-v2)
Le mode lean traite la queue comme une petite fenêtre de récence plutôt que comme un entrepôt de contexte. Concrètement :
- Budget de queue = 2,5 % de la taille de la fenêtre, plancher à 10K et plafond à 25K tokens ;
- La continuité ne dépend plus d’une grosse queue — elle repose sur le résumé amélioré : digests de contenu, index d’ancres, messages utilisateur verbatim et pointeurs de récupération
session_search; - La restitution a été validée par une évaluation avant/après (
evals/compaction/results/), pas au jugé.
Comparaison côte à côte (imports réels, fenêtre 1M @ seuil 0,85) :
| Scénario | Budget de queue verbatim |
|---|---|
| Ancien défaut (legacy) | 170 000 (plafond 255 000) |
| Nouveau défaut (lean) | 25 000 (plafond 37 500) |
| Retour explicite à legacy | 170 000 (désactivation intacte) |
| Bascule en cours de session vers un modèle 400K (lean préservé) | 10 000 |
Le changement corrige aussi un bug latent : update_model() réaffectait directement l’ancienne formule lors du recalcul des budgets, faisant silencieusement repasser un compresseur lean en mode accumulation à chaque changement de modèle en cours de session. Le recalcul passe désormais par la propriété tail_token_budget sensible au mode (test de régression inclus).
Vérifier et ajuster le réglage
Inspectez votre configuration actuelle :
hermes config get compression.tail_mode # désormais lean par défaut
hermes config get compression.threshold # défaut 0,50 (déclenchement à 50 %)
hermes config get compression.target_ratio # défaut 0,20
Pour rétablir l’ancien comportement, définissez-le explicitement dans config.yaml :
compression:
tail_mode: legacy # ancienne formule : 0,20 × threshold, accumule sur les grandes fenêtres
À noter : compression.tail_mode est désormais aussi une clé d’invalidation de cache de la gateway — la modifier éjecte les agents gateway mis en cache, tout comme les changements de target_ratio, sans redémarrage complet de la gateway.
Quand utiliser quoi
Pour la plupart des gens, gardez le défaut lean : il économise de l’argent, libère un vrai espace au /compress, et le résumé porte des pointeurs de récupération en filet de sécurité. Seulement si vous rencontrez vraiment « des informations importantes ont été perdues » après une compaction (par exemple, la sortie critique d’un outil dans une longue session que le digest ne couvrait pas), il vaut la peine de revenir à legacy pour comparer — au prix de dizaines de milliers de tokens d’entrée supplémentaires par tour.
Pour conclure
Ce changement fait passer « combien de texte original conserver » d’un accident de formule à une ingénierie bornée : la continuité vient d’un résumé plus intelligent, et la queue n’est qu’une fenêtre de récence. Si /compress semblait inutile sur les modèles à grande fenêtre, mettez à jour vers le dernier build de dev et réessayez — la différence est flagrante. La compaction n’est qu’une pièce de l’endurance en longues sessions : associez-la aux max_turns illimités et à l’export de session et les longues tâches pourront tourner l’esprit tranquille. Pour le détail champ par champ des budgets de contexte, voir le guide de configuration des longues tâches.