fix: include pending summaries in consolidation estimates

Made-with: Cursor
This commit is contained in:
Xubin Ren
2026-04-19 20:06:11 +08:00
committed by Xubin Ren
parent 54b659929e
commit ccd6c05f71
4 changed files with 56 additions and 11 deletions
+8 -2
View File
@@ -648,7 +648,10 @@ class AgentLoop:
session, pending = self.auto_compact.prepare_session(session, key)
await self.consolidator.maybe_consolidate_by_tokens(session)
await self.consolidator.maybe_consolidate_by_tokens(
session,
session_summary=pending,
)
# Persist subagent follow-ups into durable history BEFORE prompt
# assembly. ContextBuilder merges adjacent same-role messages for
# provider compatibility, which previously caused the follow-up to
@@ -709,7 +712,10 @@ class AgentLoop:
if result := await self.commands.dispatch(ctx):
return result
await self.consolidator.maybe_consolidate_by_tokens(session)
await self.consolidator.maybe_consolidate_by_tokens(
session,
session_summary=pending,
)
self._set_tool_context(msg.channel, msg.chat_id, msg.metadata.get("message_id"))
if message_tool := self.tools.get("message"):
+21 -4
View File
@@ -416,7 +416,12 @@ class Consolidator:
return idx
return None
def estimate_session_prompt_tokens(self, session: Session) -> tuple[int, str]:
def estimate_session_prompt_tokens(
self,
session: Session,
*,
session_summary: str | None = None,
) -> tuple[int, str]:
"""Estimate current prompt size for the normal session history view."""
history = session.get_history(max_messages=0)
channel, chat_id = (session.key.split(":", 1) if ":" in session.key else (None, None))
@@ -425,6 +430,7 @@ class Consolidator:
current_message="[token-probe]",
channel=channel,
chat_id=chat_id,
session_summary=session_summary,
)
return estimate_prompt_tokens_chain(
self.provider,
@@ -467,7 +473,12 @@ class Consolidator:
self.store.raw_archive(messages)
return None
async def maybe_consolidate_by_tokens(self, session: Session) -> None:
async def maybe_consolidate_by_tokens(
self,
session: Session,
*,
session_summary: str | None = None,
) -> None:
"""Loop: archive old messages until prompt fits within safe budget.
The budget reserves space for completion tokens and a safety buffer
@@ -481,7 +492,10 @@ class Consolidator:
budget = self.context_window_tokens - self.max_completion_tokens - self._SAFETY_BUFFER
target = budget // 2
try:
estimated, source = self.estimate_session_prompt_tokens(session)
estimated, source = self.estimate_session_prompt_tokens(
session,
session_summary=session_summary,
)
except Exception:
logger.exception("Token estimation failed for {}", session.key)
estimated, source = 0, "error"
@@ -545,7 +559,10 @@ class Consolidator:
self.sessions.save(session)
try:
estimated, source = self.estimate_session_prompt_tokens(session)
estimated, source = self.estimate_session_prompt_tokens(
session,
session_summary=session_summary,
)
except Exception:
logger.exception("Token estimation failed for {}", session.key)
estimated, source = 0, "error"