From ff73f7c0e85410527ed5cf455cdcb81f57c1705d Mon Sep 17 00:00:00 2001 From: tt-P607 <68868379+tt-P607@users.noreply.github.com> Date: Mon, 27 Oct 2025 12:13:52 +0800 Subject: [PATCH] =?UTF-8?q?fix(chat):=20=E4=BF=AE=E5=A4=8D=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E6=89=93=E6=96=AD=E5=90=8E=E7=9A=84=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=B9=B6=E4=BC=98=E5=8C=96=E5=9B=9E=E5=A4=8D?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 本次提交包含两项关键更改: 1. 将 `triggering_user_id` 的设置逻辑从 `ChatterManager` 迁移至 `StreamLoopManager` 的处理循环初期。这确保了触发用户ID能够更早、更可靠地被设置,为回复保护机制提供了正确的上下文,避免了潜在的逻辑错误。 2. 在消息成功打断正在执行的任务后,立即调用 `clear_all_unread_messages`。此举修复了当新消息打断旧任务时,旧消息队列未被清空,导致机器人可能在之后重新处理这些过时消息的缺陷,从而防止了重复响应。 --- src/chat/chatter_manager.py | 5 ----- src/chat/message_manager/distribution_manager.py | 5 +++++ src/chat/message_manager/message_manager.py | 16 ++++++++++------ 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/chat/chatter_manager.py b/src/chat/chatter_manager.py index 221c5e93f..73e258158 100644 --- a/src/chat/chatter_manager.py +++ b/src/chat/chatter_manager.py @@ -108,11 +108,6 @@ class ChatterManager: self.stats["streams_processed"] += 1 try: - # 设置触发用户ID - last_message = context.get_last_message() - if last_message: - context.triggering_user_id = last_message.user_info.user_id - result = await self.instances[stream_id].execute(context) # 检查执行结果是否真正成功 diff --git a/src/chat/message_manager/distribution_manager.py b/src/chat/message_manager/distribution_manager.py index 8caae1bf8..1328c432c 100644 --- a/src/chat/message_manager/distribution_manager.py +++ b/src/chat/message_manager/distribution_manager.py @@ -381,6 +381,11 @@ class StreamLoopManager: if cached_messages: logger.info(f"处理开始前刷新缓存消息: stream={stream_id}, 数量={len(cached_messages)}") + # 设置触发用户ID,以实现回复保护 + last_message = context.get_last_message() + if last_message: + context.triggering_user_id = last_message.user_info.user_id + # 创建子任务用于刷新能量(不阻塞主流程) energy_task = asyncio.create_task(self._refresh_focus_energy(stream_id)) child_tasks.add(energy_task) diff --git a/src/chat/message_manager/message_manager.py b/src/chat/message_manager/message_manager.py index e0dde6aec..ab21c95d4 100644 --- a/src/chat/message_manager/message_manager.py +++ b/src/chat/message_manager/message_manager.py @@ -401,12 +401,16 @@ class MessageManager: if random.random() < interruption_probability: logger.info(f"聊天流 {chat_stream.stream_id} 触发消息打断,打断概率: {interruption_probability:.2f}") - # 取消 stream_loop_task,子任务会通过 try-catch 自动取消 - try: - stream_loop_task.cancel() - logger.info(f"已取消流循环任务: {chat_stream.stream_id}") - except Exception as e: - logger.warning(f"取消流循环任务失败: {chat_stream.stream_id} - {e}") + # 修复:取消所有任务(包括多重回复) + cancelled_count = self.chatter_manager.cancel_all_stream_tasks(chat_stream.stream_id) + + if cancelled_count > 0: + logger.info(f"消息打断成功取消 {cancelled_count} 个任务: {chat_stream.stream_id}") + + # 修复:打断后,将被打断的消息标记为已读,防止重复处理 + await self.clear_all_unread_messages(chat_stream.stream_id) + else: + logger.warning(f"消息打断未能取消任何任务: {chat_stream.stream_id}") # 增加打断计数 await context.increment_interruption_count()