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.