mirror of
https://github.com/tiennm99/goclaw.git
synced 2026-10-14 12:16:54 +00:00
fix(agent): preserve up to 30 media refs during history compaction
Both v3 mid-loop compaction and v2 background summarization were dropping MediaRefs when summarizing old messages, making previously shared images/documents permanently inaccessible to the agent. Now collect up to 30 most recent MediaRefs from compacted messages and attach them to the summary/first-kept message so they survive the compaction cycle.
This commit is contained in:
1 parent
1ea24ef8e2
commit
5dc696e3c6
2 files changed
+40
-2
No files matched your search
@@ -100,9 +100,22 @@ func (l *Loop) compactMessagesInPlace(ctx context.Context, messages []providers.
|
||||
return nil
|
||||
}
|
||||
|
||||
// Collect MediaRefs from compacted messages (keep up to 30 most recent).
|
||||
const maxPreservedMediaRefs = 30
|
||||
var preservedRefs []providers.MediaRef
|
||||
for i := len(toSummarize) - 1; i >= 0 && len(preservedRefs) < maxPreservedMediaRefs; i-- {
|
||||
for _, ref := range toSummarize[i].MediaRefs {
|
||||
preservedRefs = append(preservedRefs, ref)
|
||||
if len(preservedRefs) >= maxPreservedMediaRefs {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
summary := providers.Message{
|
||||
Role: "user",
|
||||
Content: "[Summary of earlier conversation]\n" + SanitizeAssistantContent(resp.Content),
|
||||
Role: "user",
|
||||
Content: "[Summary of earlier conversation]\n" + SanitizeAssistantContent(resp.Content),
|
||||
MediaRefs: preservedRefs,
|
||||
}
|
||||
result := make([]providers.Message, 0, 1+keepCount)
|
||||
result = append(result, summary)
|
||||
|
||||
@@ -292,8 +292,33 @@ func (l *Loop) maybeSummarize(ctx context.Context, sessionKey string) {
|
||||
return
|
||||
}
|
||||
|
||||
// Collect MediaRefs from messages about to be truncated (keep up to 30 most recent).
|
||||
const maxPreservedMediaRefs = 30
|
||||
var preservedRefs []providers.MediaRef
|
||||
for i := len(toSummarize) - 1; i >= 0 && len(preservedRefs) < maxPreservedMediaRefs; i-- {
|
||||
for _, ref := range toSummarize[i].MediaRefs {
|
||||
preservedRefs = append(preservedRefs, ref)
|
||||
if len(preservedRefs) >= maxPreservedMediaRefs {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
l.sessions.SetSummary(sctx, sessionKey, SanitizeAssistantContent(resp.Content))
|
||||
l.sessions.TruncateHistory(sctx, sessionKey, keepLast)
|
||||
|
||||
// Inject preserved MediaRefs into the first kept message so they survive truncation.
|
||||
if len(preservedRefs) > 0 {
|
||||
kept := l.sessions.GetHistory(sctx, sessionKey)
|
||||
if len(kept) > 0 {
|
||||
kept[0].MediaRefs = append(preservedRefs, kept[0].MediaRefs...)
|
||||
// Cap total refs on this message at maxPreservedMediaRefs.
|
||||
if len(kept[0].MediaRefs) > maxPreservedMediaRefs {
|
||||
kept[0].MediaRefs = kept[0].MediaRefs[:maxPreservedMediaRefs]
|
||||
}
|
||||
l.sessions.SetHistory(sctx, sessionKey, kept)
|
||||
}
|
||||
}
|
||||
l.sessions.IncrementCompaction(sctx, sessionKey)
|
||||
// Mirror SessionMetaKeyLastCompactionAt from the v3 prune/compact path
|
||||
// so the legacy v2 post-turn summarizer also surfaces compaction cadence.
|
||||
|
||||
Reference in new issue
Block a user