compaction du contexte facon Hermes : conversations quasi illimitees sans clear

- nouveau compact.go : split head/torso/tail, elagage des vieux tool outputs
  sans IA + resume du torse par le modele local (un appel non-streame)
- proactif au seuil (75% de CTX) dans runChatStream + chat terminal, et filet
  reactif dans runChat si llama-server refuse un prompt trop long
- resume injecte en tour user->assistant (jamais un system au milieu : garde Qwen)
- toggle COMPACT (defaut on) : endpoint /api/agent/compact + case UI, event
  history_replace pour que le client remplace son historique, toast
- tests unitaires des frontieres head/tail et de la non-separation des paires outil
This commit is contained in:
nathaninline committed 2026-07-21 15:49:18 +02:00
1 parent c50ebdb6d1
commit e6c0bbe3b7
6 files changed
+420 -3

No files matched your search

+14
View File
@@ -376,6 +376,10 @@ func runChat(ctx context.Context, messages []Message, temperature float64, caps
// retry the same turn once with tools removed so the model answers in plain
// text from the tool results already gathered, instead of dying mid-chat.
disableTools := false
// Filet réactif (façon Hermes) : si llama-server refuse le prompt (souvent un
// 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
// Anti-loop net: if the model re-emits the exact same tool call (name+args)
// several times, it's stuck — break instead of spinning to the iteration cap.
lastSig := ""
@@ -434,6 +438,16 @@ func runChat(ctx context.Context, messages []Message, temperature float64, caps
if msg == "" {
msg = resp.Status
}
// Le prompt a peut-être dépassé la fenêtre de contexte : on tente une
// compaction en vol et on rejoue le tour (une seule fois) avant tout le
// reste. C'est le filet de secours à la Hermes.
if compactEnabled() && !compactedRetry {
if c, changed := compactMessages(ctx, messages, caps); changed {
compactedRetry = true
messages = c
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.