| 💾 Saved. d722711 k33g 6h ago | 1 | # Compression du contexte — explication |
| 2 | |
| 3 | ## De quoi s'agit-il ? |
| 4 | |
| 5 | Rien dans une boucle d'agent ne raccourcit jamais l'historique. Mesurés face à un faux moteur, les messages envoyés au modèle ont grossi 2 → 5 → 7 → 9 sur quatre requêtes, et chaque sortie de `bash`, jusqu'à `maxOutput` caractères, et chaque skill chargé restent jusqu'au `/quit`. Sur un modèle local, la fenêtre de contexte est fixée au chargement du serveur, et tout l'historique est relu à chaque tour sur le matériel du portable. Une longue session se manifeste donc d'abord par un faux blocage du watchdog, puis par une erreur du serveur. |
| 6 | |
| 7 | Le paquet `compact` remplace les anciens tours de question par un résumé écrit par le modèle lui-même, et garde les quelques derniers tours bruts. |
| 8 | |
| 9 | ## Pourquoi c'est conçu ainsi |
| 10 | |
| 11 | **Un hybride : résumé plus tours récents bruts.** Les tours récents sont là où le modèle travaille ; les résumer lui fait rejouer ce qu'il vient de faire. Le défaut garde trois tours de question, assez pour « fais X », « maintenant corrige », « et teste ». Tout ce qui est plus ancien devient une paire de messages insérée juste après le prompt système : un message utilisateur qui porte les notes, et un court accusé de réception du modèle. |
| 12 | |
| 13 | **La coupure tombe sur une frontière de tour.** Un appel d'outil et son résultat ne doivent jamais être séparés ; réutiliser des tours entiers le garantit. |
| 14 | |
| 15 | **Deux déclencheurs, parce que la fenêtre n'est pas toujours connue.** Le déclencheur principal est une part de la fenêtre de contexte, 75 % par défaut, qui laisse un quart pour la question suivante, ses sorties d'outils et la réponse. Le compte de tokens d'entrée rapporté par le serveur au dernier appel est préféré à l'estimation locale quand il est plus grand, parce qu'il voit le JSON des outils et le template de chat. Quand la fenêtre est inconnue, Docker Model Runner ne dit rien et `contextWindow` peut valoir `0`, seul le déclencheur sur le nombre de messages peut jouer, et l'agent le dit au démarrage. |
| 16 | |
| 17 | **Une seule clé pour la fenêtre.** La bannière et le déclencheur lisent le même `contextWindow` ; deux clés pour le même nombre finiraient par diverger. |
| 18 | |
| 19 | **Les résumés antérieurs sont fusionnés, pas re-résumés.** Les deux messages insérés portent un marqueur ; une compression ultérieure les reconnaît et replie les nouveaux tours anciens dans le résumé existant, parce que résumer un résumé perd du détail de façon exponentielle. |
| 20 | |
| 21 | **Un résumé de forme fixe.** Le prompt intégré demande sept sections avec chemins, lignes de commande et messages d'erreur exacts, et interdit de citer le contenu des fichiers : un fichier peut avoir changé depuis sa lecture, et le prompt système interdit déjà d'affirmer ce qu'une commande de cette réponse n'a pas renvoyé. La requête de résumé remplace le prompt système de l'agent par celui d'un preneur de notes, parce que « tu es un agent de code, exécute des commandes » envoyé avec un historique plein d'appels d'outils invite le modèle à continuer d'agir. |
| 22 | |
| 23 | **L'échec ne coûte rien.** Si la requête de résumé échoue, serveur arrêté, watchdog, résultat vide, l'historique est laissé intact et la question suivante part comme avant. La compression existe pour rendre la question suivante possible ; elle ne doit jamais en coûter une. |
| 24 | |
| 25 | **Le watchdog est deux fois plus patient ici.** Le résumé est le plus long préremplissage de la session et rien ne s'affiche pendant qu'il s'écrit. |
| 26 | |
| 27 | **`/compact` ignore le seuil, pas la frontière.** La commande garde toujours les derniers tours et le dit quand rien n'est plus ancien. La compression ne s'exécute jamais qu'entre deux générations, parce que Genkit détient sa propre copie de la conversation pendant qu'un tour tourne. |
| 28 | |
| 29 | ## Alternatives écartées |
| 30 | |
| 31 | - **Tronquer les messages les plus anciens.** Écarté : on perdrait des résultats d'outils dont les appels resteraient, et l'objectif de la session. |
| 32 | - **Tout résumer, tours récents compris.** Écarté : le modèle refait alors ses dernières étapes. |
| 33 | - **Une clé `context.contextWindow` séparée.** Écartée au profit de la seule clé de premier niveau. |
| 34 | |
| 35 | ## Liens avec le reste |
| 36 | |
| 37 | - L'activer et lire le rapport : [comment garder une longue session dans la fenêtre de contexte](../how-to/manage-the-context-window.md). |
| 38 | - Les clés `context.*` : [référence de la configuration](../reference/configuration.md). |
| 39 | - D'où vient la fenêtre : [fournisseurs](providers.md). |