Compaction : budget de queue base sur la conversation, pas la fenetre (fix "rien a compacter")

Bug : tailBudget = 0.25 x fenetre. Une conversation de 25k tokens dans une
fenetre de 64k gardait 16k en queue -> torse minuscule (~4k) -> reduction < 20%
-> refusee -> "rien a compacter" a 68%. Corrige : tailBudget = 0.25 x taille
estimee de la conversation -> on garde ~25% des tours recents et on compacte les
~75% du debut, quelle que soit la fenetre.

Aussi : la jauge post-compaction ajoute le surcout fixe non compactable (prompt
systeme injecte + schemas d'outils = contexte reel - estimation messages), pour
afficher une valeur realiste au lieu de chuter trop bas puis resauter.
This commit is contained in:
nathaninline committed 2026-07-23 17:28:12 +02:00
1 parent dcbfcb36f9
commit ea5d0eed4f
2 files changed
+21 -3

No files matched your search

+6 -1
View File
@@ -164,7 +164,12 @@ func compactBounds(msgs []Message, tailBudget int) (head, tailStart int) {
}
func compactMessages(ctx context.Context, msgs []Message, caps Caps) ([]Message, bool) {
tailBudget := int(float64(ctxWindow()) * compactTailFrac)
// Budget de queue = fraction de la CONVERSATION (pas de la fenêtre). Le lier à
// la fenêtre était le bug : une conversation de 25k tokens dans une fenêtre de
// 64k gardait 16k (0.25×64k) en queue → torse minuscule → réduction < 20% →
// refusée. Lié à la conversation, on garde toujours ~25% des tours récents et
// on compacte les ~75% du début, quelle que soit la taille de la fenêtre.
tailBudget := int(float64(estimateTokens(msgs)) * compactTailFrac)
head, tailStart := compactBounds(msgs, tailBudget)
// Rien à compacter : le torse [head, tailStart) est vide.