fix: unify summary injection strategy between consolidation paths

- Track last_summary in maybe_consolidate_by_tokens() to persist the summary
- Change return to break in the consolidation loop to allow summary persistence
- Save summary to session.metadata['_last_summary'] for consistency with AutoCompact._archive()
- Ensures compressed content remains visible to the model via prepare_session() injection

Fixes #3274
This commit is contained in:
Jiajun Xie 2026-04-19 09:54:31 +00:00 committed by Xubin Ren
parent 107eae14d7
commit d95bc9c9c4

View File

@ -499,9 +499,10 @@ class Consolidator:
) )
return return
last_summary = None
for round_num in range(self._MAX_CONSOLIDATION_ROUNDS): for round_num in range(self._MAX_CONSOLIDATION_ROUNDS):
if estimated <= target: if estimated <= target:
return break
boundary = self.pick_consolidation_boundary(session, max(1, estimated - target)) boundary = self.pick_consolidation_boundary(session, max(1, estimated - target))
if boundary is None: if boundary is None:
@ -510,7 +511,7 @@ class Consolidator:
session.key, session.key,
round_num, round_num,
) )
return break
end_idx = boundary[0] end_idx = boundary[0]
end_idx = self._cap_consolidation_boundary(session, end_idx) end_idx = self._cap_consolidation_boundary(session, end_idx)
@ -520,11 +521,11 @@ class Consolidator:
session.key, session.key,
round_num, round_num,
) )
return break
chunk = session.messages[session.last_consolidated:end_idx] chunk = session.messages[session.last_consolidated:end_idx]
if not chunk: if not chunk:
return break
logger.info( logger.info(
"Token consolidation round {} for {}: {}/{} via {}, chunk={} msgs", "Token consolidation round {} for {}: {}/{} via {}, chunk={} msgs",
@ -535,8 +536,11 @@ class Consolidator:
source, source,
len(chunk), len(chunk),
) )
if not await self.archive(chunk): summary = await self.archive(chunk)
return if summary:
last_summary = summary
else:
break
session.last_consolidated = end_idx session.last_consolidated = end_idx
self.sessions.save(session) self.sessions.save(session)
@ -546,7 +550,17 @@ class Consolidator:
logger.exception("Token estimation failed for {}", session.key) logger.exception("Token estimation failed for {}", session.key)
estimated, source = 0, "error" estimated, source = 0, "error"
if estimated <= 0: if estimated <= 0:
return break
# Persist the last summary to session metadata so it can be injected
# into the runtime context on the next prepare_session() call, aligning
# the summary injection strategy with AutoCompact._archive().
if last_summary and last_summary != "(nothing)":
session.metadata["_last_summary"] = {
"text": last_summary,
"last_active": session.updated_at.isoformat(),
}
self.sessions.save(session)
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------