fix: avoid replaying older long turns

Treat the current live user message as the replay boundary for normal user turns, while keeping user-turn extension for history and consolidation paths that need it. Add regression coverage for the user-triggered long tool-turn case.
This commit is contained in:
chengyongru
2026-06-18 00:03:22 +08:00
committed by Xubin Ren
parent 09962895fb
commit fc635377bc
5 changed files with 108 additions and 6 deletions
+3 -3
View File
@@ -1168,14 +1168,14 @@ class AgentLoop:
channel, chat_id, msg.metadata.get("message_id"),
msg.metadata, session_key=key,
)
current_role = "assistant" if is_subagent else "user"
_hist_kwargs: dict[str, Any] = {
"max_messages": self._max_messages,
"max_tokens": self._replay_token_budget(),
"include_timestamps": True,
"extend_to_user": True,
"extend_to_user": is_subagent,
}
history = session.get_history(**_hist_kwargs)
current_role = "assistant" if is_subagent else "user"
workspace_scope = self.workspace_scopes.for_message(msg, session.metadata)
messages = self.context.build_messages(
@@ -1448,7 +1448,7 @@ class AgentLoop:
"max_messages": self._max_messages,
"max_tokens": self._replay_token_budget(),
"include_timestamps": True,
"extend_to_user": True,
"extend_to_user": False,
}
ctx.history = ctx.session.get_history(**_hist_kwargs)
self._runtime_events().record_turn_runtime(
+3 -1
View File
@@ -282,9 +282,11 @@ def recent_message_start_index(
start_idx = max(0, len(messages) - max_messages)
if not extend_to_user or len(messages) <= max_messages:
return start_idx
if any(messages[i].get("role") == "user" for i in range(start_idx, len(messages))):
return start_idx
recovered_user = next(
(i for i in range(start_idx, -1, -1) if messages[i].get("role") == "user"),
(i for i in range(start_idx - 1, -1, -1) if messages[i].get("role") == "user"),
None,
)
if recovered_user is None: