From 17db0b22b92b8e4201fdde6767debcbb8af15e20 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Thu, 1 Oct 2026 14:41:10 +0800 Subject: [PATCH] fix(agent): preserve historical tool styles --- app/agent/callback/__init__.py | 7 +++---- app/agent/orchestrator.py | 2 -- tests/test_agent_tool_streaming.py | 26 ++++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/app/agent/callback/__init__.py b/app/agent/callback/__init__.py index 9d8680c23..77613deec 100644 --- a/app/agent/callback/__init__.py +++ b/app/agent/callback/__init__.py @@ -521,10 +521,9 @@ class StreamingHandler: live_summary = self._live_tool_summary visible_buffer = self._buffer live_start = len(self._buffer) - old_summary = None if live_summary and self._buffer[live_summary[0] :] == live_summary[1]: - live_start, _old_block, old_summary = live_summary + live_start, _old_block, _old_summary = live_summary visible_buffer = self._buffer[:live_start] if self._pending_tool_stats: @@ -535,8 +534,8 @@ class StreamingHandler: return "" summary, summary_block = pending_summary - if old_summary: - self._tool_summaries.discard(old_summary) + # 保留历史摘要的样式登记。相同文案可能在不同工具批次重复出现, + # 删除旧字符串会让前一批已写入消息在后续编辑时失去富文本样式。 self._tool_summaries.add(summary) self._buffer = visible_buffer + summary_block self._live_tool_summary = (len(visible_buffer), summary_block, summary) diff --git a/app/agent/orchestrator.py b/app/agent/orchestrator.py index be221823f..a4ccc2f75 100644 --- a/app/agent/orchestrator.py +++ b/app/agent/orchestrator.py @@ -2275,8 +2275,6 @@ class MoviePilotAgent: def emit_visible_token(text: str) -> None: """只在真正产生可见答案时结束思考状态,再转发正文。""" nonlocal thinking_finished - if not text: - return if not thinking_finished: finish_thinking = getattr(thinking_started, "thinking_finished", None) if callable(finish_thinking): diff --git a/tests/test_agent_tool_streaming.py b/tests/test_agent_tool_streaming.py index 853c9966d..0a4cd6265 100644 --- a/tests/test_agent_tool_streaming.py +++ b/tests/test_agent_tool_streaming.py @@ -768,6 +768,32 @@ class TestAgentToolStreaming: assert rich_message == "正文内容\n\n> (执行了 1 条命令)\n\n后续结论" + def test_rich_message_keeps_previous_tool_summaries_styled_after_edits(self): + """Telegram 后续编辑时,重复文案的历史工具摘要仍应保持引用样式。""" + handler = StreamingHandler() + handler._channel = NotificationChannel.Telegram.value + handler._streaming_enabled = True + handler._can_stream = lambda: True + + for _ in range(3): + handler.record_tool_call( + tool_name="execute_command", + tool_message="执行命令", + tool_kwargs={}, + ) + handler.emit("第一批完成") + for _ in range(4): + handler.record_tool_call( + tool_name="execute_command", + tool_message="执行命令", + tool_kwargs={}, + ) + + rich_message = handler._get_rich_message(handler._buffer) + + assert "> (执行了 3 条命令)" in rich_message + assert "> (执行了 4 条命令)" in rich_message + def test_rich_message_returns_none_for_non_telegram_channels(self): """校验非 Telegram 渠道不启用富文本,摘要保持原有纯文本格式。""" handler = StreamingHandler()