From 79a0088065557492882b0201761e8902ee8b76c8 Mon Sep 17 00:00:00 2001 From: Windpicker-owo <3431391539@qq.com> Date: Mon, 27 Oct 2025 22:37:55 +0800 Subject: [PATCH] =?UTF-8?q?feat(chat):=20=E6=B7=BB=E5=8A=A0Chatter?= =?UTF-8?q?=E5=A4=84=E7=90=86=E7=8A=B6=E6=80=81=E8=B7=9F=E8=B8=AA=E6=9C=BA?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在StreamLoopManager中添加is_chatter_processing标志来精确跟踪Chatter处理状态,优化消息打断检查逻辑。 - 在distribution_manager中设置和清除Chatter处理标志 - 在message_manager中基于处理状态进行打断检查 - 在数据模型中添加is_chatter_processing字段 --- src/chat/message_manager/distribution_manager.py | 8 ++++++++ src/chat/message_manager/message_manager.py | 9 ++++++++- src/common/data_models/message_manager_data_model.py | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/chat/message_manager/distribution_manager.py b/src/chat/message_manager/distribution_manager.py index 1328c432c..e238a6059 100644 --- a/src/chat/message_manager/distribution_manager.py +++ b/src/chat/message_manager/distribution_manager.py @@ -391,6 +391,10 @@ class StreamLoopManager: child_tasks.add(energy_task) energy_task.add_done_callback(lambda t: child_tasks.discard(t)) + # 设置 Chatter 正在处理的标志 + context.is_chatter_processing = True + logger.debug(f"设置 Chatter 处理标志: {stream_id}") + # 直接调用chatter_manager处理流上下文 results = await self.chatter_manager.process_stream_context(stream_id, context) success = results.get("success", False) @@ -423,6 +427,10 @@ class StreamLoopManager: child_task.cancel() return False finally: + # 清除 Chatter 处理标志 + context.is_chatter_processing = False + logger.debug(f"清除 Chatter 处理标志: {stream_id}") + # 无论成功或失败,都要设置处理状态为未处理 self._set_stream_processing_status(stream_id, False) diff --git a/src/chat/message_manager/message_manager.py b/src/chat/message_manager/message_manager.py index e0dde6aec..c38e6d12c 100644 --- a/src/chat/message_manager/message_manager.py +++ b/src/chat/message_manager/message_manager.py @@ -374,8 +374,15 @@ class MessageManager: logger.info(f"消息 {message.message_id} 是表情包或Emoji,跳过打断检查") return - # 检查是否有 stream_loop_task 在运行 + # 检查上下文 context = chat_stream.context_manager.context + + # 只有当 Chatter 真正在处理时才检查打断 + if not context.is_chatter_processing: + logger.debug(f"聊天流 {chat_stream.stream_id} Chatter 未在处理,跳过打断检查") + return + + # 检查是否有 stream_loop_task 在运行 stream_loop_task = context.stream_loop_task if stream_loop_task and not stream_loop_task.done(): diff --git a/src/common/data_models/message_manager_data_model.py b/src/common/data_models/message_manager_data_model.py index 6b0bb9ab0..0a49b23a6 100644 --- a/src/common/data_models/message_manager_data_model.py +++ b/src/common/data_models/message_manager_data_model.py @@ -41,6 +41,7 @@ class StreamContext(BaseDataModel): is_active: bool = True processing_task: asyncio.Task | None = None stream_loop_task: asyncio.Task | None = None # 流循环任务 + is_chatter_processing: bool = False # Chatter 是否正在处理 interruption_count: int = 0 # 打断计数器 last_interruption_time: float = 0.0 # 上次打断时间