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()