mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-24 15:38:12 +02:00
Contexte : fini le 400 « dépasse la fenêtre » qui bloquait la discussion
Repris d'AJEAN 0.17.5. Sur une fenêtre de 65k, un tour qui lit plusieurs gros fichiers d'un coup passait de 60 % à plus de 130 % sans jamais compacter, et l'erreur remontait telle quelle. - Le test de compactage en cours de tour compte aussi les résultats d'outils de l'étape, que le moteur n'a pas encore vus. Sans usage côté serveur, l'estimation porte toujours sur tout l'historique. - Tout résultat d'outil est borné à 30 000 caractères dans la vue du modèle, avec une mention qui l'invite à cibler. L'interface garde le résultat complet (« voir plus »). - Dernier recours quand le moteur refuse encore le prompt et que le compactage n'a rien pu faire : shrinkToFit tronque les gros résultats d'outils puis retire les plus vieux échanges, vers 60 % de la fenêtre corrigés par la taille réelle lue dans l'erreur. Deux essais au plus. - Tâches planifiées : la note de tâche passe en tête du message utilisateur au lieu du système. Le préfixe reste celui du chat et le cache de prompt de llama-server sert aux deux (l'amont mesurait 12 s de recalcul pour un « salut » après une tâche). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
199d7f1e99
commit
8171899ac1
4 files changed
+170
-15
No files matched your search
@@ -914,6 +914,8 @@ func runChat(ctx context.Context, messages []Message, temperature float64, caps
|
||||
// dépassement de la fenêtre de contexte après de gros résultats d'outils), on
|
||||
// compacte l'historique en vol et on rejoue le tour — une seule fois.
|
||||
compactedRetry := false
|
||||
// Réductions forcées (shrinkToFit) quand le compactage n'a pas suffi.
|
||||
shrinkRetries := 0
|
||||
// Repli d'intensité de raisonnement (llm_effort.go) : une seule tentative par
|
||||
// tour, comme les autres filets.
|
||||
effortRetried := false
|
||||
@@ -1092,6 +1094,19 @@ func runChat(ctx context.Context, messages []Message, temperature float64, caps
|
||||
continue
|
||||
}
|
||||
}
|
||||
// Compactage impuissant (ou déjà tenté et encore trop long) : réduction
|
||||
// forcée plutôt que de laisser remonter un 400 qui bloque la
|
||||
// conversation (AJEAN 0.17.5).
|
||||
if compactEnabled() && shrinkRetries < 2 && contextOverflow(msg, messages) {
|
||||
if c, changed := shrinkToFit(messages, overflowTokens(msg)); changed {
|
||||
shrinkRetries++
|
||||
logCompact("réduction", overflowTokens(msg), messages, c, changed)
|
||||
messages = c
|
||||
extra = nil
|
||||
cb(StreamEvent{NewHistory: append([]Message(nil), messages...)})
|
||||
continue
|
||||
}
|
||||
}
|
||||
// Most common 500 here: llama.cpp couldn't parse a malformed tool call
|
||||
// the model emitted. Retry the turn once without tools so it answers
|
||||
// in plain text rather than leaving the chat dead. Seulement sur 500 :
|
||||
@@ -1511,6 +1526,9 @@ func runChat(ctx context.Context, messages []Message, temperature float64, caps
|
||||
}
|
||||
messages = append(messages, assistant)
|
||||
extra = append(extra, assistant)
|
||||
// Début des résultats de CETTE étape, que le moteur n'a pas encore
|
||||
// comptés (voir le test de compactage en cours de tour, plus bas).
|
||||
stepStart := len(messages)
|
||||
// 2. Execute each tool locally and append a "tool" reply.
|
||||
for _, tc := range tcs {
|
||||
// Arrêt demandé : on n'enchaîne pas les outils restants. Sans ce
|
||||
@@ -1750,7 +1768,9 @@ func runChat(ctx context.Context, messages []Message, temperature float64, caps
|
||||
shot = capturedRelPath(result)
|
||||
}
|
||||
cb(StreamEvent{ToolUsed: fillToolResult(&ToolUsedEvent{Name: tc.Function.Name, Label: label, Done: true, Diff: diff, Added: diffAdd, Removed: diffDel, Image: shot}, result)})
|
||||
toolMsg := Message{Role: "tool", ToolCallID: tc.ID, Content: result}
|
||||
// Plafond pour le MODÈLE seulement : l'UI vient de recevoir le
|
||||
// résultat complet (aperçu + « voir plus »).
|
||||
toolMsg := Message{Role: "tool", ToolCallID: tc.ID, Content: capToolResult(result)}
|
||||
messages = append(messages, toolMsg)
|
||||
extra = append(extra, toolMsg)
|
||||
// Capture d'écran + vision active : on fait SUIVRE l'image elle-même
|
||||
@@ -1788,7 +1808,16 @@ func runChat(ctx context.Context, messages []Message, temperature float64, caps
|
||||
// enchaînés), on partait à 60% et on finissait en dépassement — rattrapé au
|
||||
// mieux par le filet réactif sur 500, une seule fois. On re-teste donc ici,
|
||||
// avec le contexte RÉEL du dernier appel (usage.prompt_tokens + généré).
|
||||
if used := stats.PromptTokensTotal + stats.GenTokens; compactWouldTrigger(messages, used) {
|
||||
// + les résultats d'outils de CETTE étape : le moteur ne les a pas encore
|
||||
// comptés. Sans eux, une étape qui lit plusieurs gros fichiers d'un coup
|
||||
// passait de 60 % à plus de 130 % de la fenêtre sans jamais compacter.
|
||||
// Serveur sans usage (base 0) : on laisse 0, compactWouldTrigger estime
|
||||
// alors TOUT l'historique — étape comprise.
|
||||
used := 0
|
||||
if base := stats.PromptTokensTotal + stats.GenTokens; base > 0 {
|
||||
used = base + estimateTokens(messages[stepStart:])
|
||||
}
|
||||
if compactWouldTrigger(messages, used) {
|
||||
yes, no := true, false
|
||||
cb(StreamEvent{Compacting: &yes})
|
||||
c, changed := compactMessages(ctx, messages, caps)
|
||||
|
||||
Reference in new issue
Block a user