Contexte saturé ? Savoir élager.
« L'agent peut oublier de façon stratégique et continuer indéfiniment. » L'oubli stratégique est une compétence d'ingénierie.
Pourquoi compacter ?
Un agent qui tourne longtemps voit ses messages[] gonfler : chaque read_file rapporte des milliers de tokens, chaque bash quelques centaines, sans compter le texte de raisonnement du modèle. Après 50 tours, le contexte peut dépasser 100 K tokens. Deux conséquences :
- Limite du modèle atteinte : on touche la fenêtre de contexte ou le coût de chaque appel API augmente linéairement.
- Dilution de l'attention : la tâche courante se noie dans des tool_results d'il y a 30 tours qui n'ont plus aucune pertinence.
L'idée de s06 : faire en sorte que l'agent oublie activement le contenu peu important, tout en conservant l'état clé. Trois niveaux de mécanismes, du plus léger au plus lourd.
Niveau 1 · micro_compact (tourne silencieusement à chaque tour)
Le niveau le moins coûteux. Avant chaque appel LLM, il remplace les anciens tool_results (au-delà des 3 derniers) par un placeholder :
# à partir du 10e tour, la plupart des tool_results deviennent : { "type": "tool_result", "tool_use_id": "toolu_01A", "content": "[Previous: used bash]" # de milliers de chars à quelques dizaines }
Exception notable : les résultats de read_file ne sont pas compressés. Pourquoi ? Parce que la sortie d'un read est une référence — la comprimer obligerait le modèle à relire le fichier, ce qui coûterait encore plus cher.
PRESERVE_RESULT_TOOLS = {"read_file"} # jamais compressé
Voir micro_compact consommer les anciens résultats au fil des tours
Simulez 10 tours en cliquant sur Step. À chaque tour, micro_compact tourne une fois. Observez les anciens tool_results se transformer en [Previous: ...] tandis que les 3 derniers restent intacts.
Niveau 2 · auto_compact (déclenché quand le seuil est dépassé)
Même avec micro actif, l'accumulation finit par exploser. s06 fixe un seuil (par défaut 50 000 tokens) :
- Estimation du nombre de tokens :
len(str(messages)) // 4(approximatif mais suffisant). - Dépassement du seuil → écriture du transcript complet sur disque dans
.transcripts/transcript_TIMESTAMP.jsonl(archive de sécurité). - Le LLM génère un résumé de toute la conversation.
- Le tableau
messagesest entièrement remplacé par un seul message"[compressed] SUMMARY...".
Le coût est évident — les outputs d'outils précis et le ton de la conversation sont perdus, il ne reste que les grandes lignes. Mais l'agent peut continuer à travailler — c'est l'avantage fondamental.
Niveau 3 · le modèle appelle lui-même l'outil compact
auto_compact est déclenché automatiquement par le harness, sans que le modèle le sache. Le niveau 3 inverse la logique : donner au modèle un outil compact pour qu'il demande lui-même la compression — par exemple quand il estime que l'exploration précédente est terminée et qu'il veut repartir sur une nouvelle phase.
Appel du modèle :
tool_use("compact", focus="keep the API design decisions")
Le déclenchement est identique à auto, mais avec un paramètre focus qui indique au résumé ce qu'il doit prioritairement conserver. En pratique, c'est très utile — le modèle sait quelle partie de la session est « terminée » et peut donc cibler plus précisément que l'heuristique automatique du harness.
Quel niveau choisir ? Questions de jugement.
Pour chacun des scénarios suivants, décidez quel niveau — micro / auto / manual — est le plus approprié.