From 3e37b7cef57b9694997dd025198752fcf71ab93f Mon Sep 17 00:00:00 2001 From: Windpicker-owo <3431391539@qq.com> Date: Sun, 5 Oct 2025 18:30:16 +0800 Subject: [PATCH] =?UTF-8?q?refactor(chat):=20=E7=BB=9F=E4=B8=80=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=E8=B0=83=E7=94=A8=E6=A8=A1=E5=BC=8F=E5=B9=B6=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=BE=AA=E7=8E=AF=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 chat_manager.get_stream() 调用改为异步 - 将 replyer_manager.get_replyer() 方法改为异步 - 在 generator_api 中使用动态导入避免循环依赖 - 在 action_manager 中添加待处理动作队列清理 - 更新所有相关调用点以支持异步模式 --- src/chat/memory_system/memory_system.py | 2 +- src/chat/planner_actions/action_manager.py | 1 + src/chat/replyer/replyer_manager.py | 4 ++-- src/chat/utils/prompt.py | 2 +- src/plugin_system/apis/generator_api.py | 21 +++++++++++-------- .../affinity_flow_chatter/plan_executor.py | 2 +- 6 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/chat/memory_system/memory_system.py b/src/chat/memory_system/memory_system.py index e1494a83e..e2fd710e8 100644 --- a/src/chat/memory_system/memory_system.py +++ b/src/chat/memory_system/memory_system.py @@ -1111,7 +1111,7 @@ class MemorySystem: from src.chat.message_receive.chat_stream import get_chat_manager chat_manager = get_chat_manager() - chat_stream = chat_manager.get_stream(stream_id) + chat_stream = await chat_manager.get_stream(stream_id) if chat_stream and hasattr(chat_stream, "context_manager"): history_limit = self._determine_history_limit(context) messages = chat_stream.context_manager.get_messages(limit=history_limit, include_unread=True) diff --git a/src/chat/planner_actions/action_manager.py b/src/chat/planner_actions/action_manager.py index 054acce63..13eebb548 100644 --- a/src/chat/planner_actions/action_manager.py +++ b/src/chat/planner_actions/action_manager.py @@ -615,6 +615,7 @@ class ChatterActionManager: """禁用批量存储模式""" self._batch_storage_enabled = False self._current_chat_id = None + self._pending_actions = [] # 清空队列 logger.debug("已禁用批量存储模式") def add_action_to_batch(self, action_name: str, action_data: dict, thinking_id: str = "", diff --git a/src/chat/replyer/replyer_manager.py b/src/chat/replyer/replyer_manager.py index 55a422c1b..4f3f4f428 100644 --- a/src/chat/replyer/replyer_manager.py +++ b/src/chat/replyer/replyer_manager.py @@ -9,7 +9,7 @@ class ReplyerManager: def __init__(self): self._repliers: dict[str, DefaultReplyer] = {} - def get_replyer( + async def get_replyer( self, chat_stream: ChatStream | None = None, chat_id: str | None = None, @@ -37,7 +37,7 @@ class ReplyerManager: target_stream = chat_stream if not target_stream: if chat_manager := get_chat_manager(): - target_stream = chat_manager.get_stream(stream_id) + target_stream = await chat_manager.get_stream(stream_id) if not target_stream: logger.warning(f"[ReplyerManager] 未找到 stream_id='{stream_id}' 的聊天流,无法创建回复器。") diff --git a/src/chat/utils/prompt.py b/src/chat/utils/prompt.py index dddbd7692..9f24d6e29 100644 --- a/src/chat/utils/prompt.py +++ b/src/chat/utils/prompt.py @@ -490,7 +490,7 @@ class Prompt: from src.plugin_system.apis.generator_api import get_replyer # 创建临时生成器实例来使用其方法 - temp_generator = get_replyer(None, chat_id, request_type="prompt_building") + temp_generator = await get_replyer(None, chat_id, request_type="prompt_building") return await temp_generator.build_s4u_chat_history_prompts( message_list_before_now, target_user_id, sender, chat_id ) diff --git a/src/plugin_system/apis/generator_api.py b/src/plugin_system/apis/generator_api.py index 21bc6fdde..05f388c2a 100644 --- a/src/plugin_system/apis/generator_api.py +++ b/src/plugin_system/apis/generator_api.py @@ -9,17 +9,18 @@ """ import traceback -from typing import Any +from typing import TYPE_CHECKING, Any from rich.traceback import install from src.chat.message_receive.chat_stream import ChatStream -from src.chat.replyer.default_generator import DefaultReplyer -from src.chat.replyer.replyer_manager import replyer_manager from src.chat.utils.utils import process_llm_response from src.common.logger import get_logger from src.plugin_system.base.component_types import ActionInfo +if TYPE_CHECKING: + from src.chat.replyer.default_generator import DefaultReplyer + install(extra_lines=3) # 日志记录器 @@ -31,11 +32,11 @@ logger = get_logger("generator_api") # ============================================================================= -def get_replyer( +async def get_replyer( chat_stream: ChatStream | None = None, chat_id: str | None = None, request_type: str = "replyer", -) -> DefaultReplyer | None: +) -> Any | None: """获取回复器对象 优先使用chat_stream,如果没有则使用chat_id直接查找。 @@ -56,7 +57,9 @@ def get_replyer( raise ValueError("chat_stream 和 chat_id 不可均为空") try: logger.debug(f"[GeneratorAPI] 正在获取回复器,chat_id: {chat_id}, chat_stream: {'有' if chat_stream else '无'}") - return replyer_manager.get_replyer( + # 动态导入避免循环依赖 + from src.chat.replyer.replyer_manager import replyer_manager + return await replyer_manager.get_replyer( chat_stream=chat_stream, chat_id=chat_id, request_type=request_type, @@ -110,7 +113,7 @@ async def generate_reply( """ try: # 获取回复器 - replyer = get_replyer(chat_stream, chat_id, request_type=request_type) + replyer = await get_replyer(chat_stream, chat_id, request_type=request_type) if not replyer: logger.error("[GeneratorAPI] 无法获取回复器") return False, [], None @@ -199,7 +202,7 @@ async def rewrite_reply( """ try: # 获取回复器 - replyer = get_replyer(chat_stream, chat_id, request_type=request_type) + replyer = await get_replyer(chat_stream, chat_id, request_type=request_type) if not replyer: logger.error("[GeneratorAPI] 无法获取回复器") return False, [], None @@ -285,7 +288,7 @@ async def generate_response_custom( Returns: Optional[str]: 生成的回复内容 """ - replyer = get_replyer(chat_stream, chat_id, request_type=request_type) + replyer = await get_replyer(chat_stream, chat_id, request_type=request_type) if not replyer: logger.error("[GeneratorAPI] 无法获取回复器") return None diff --git a/src/plugins/built_in/affinity_flow_chatter/plan_executor.py b/src/plugins/built_in/affinity_flow_chatter/plan_executor.py index 10d44b1a8..91ea6ccc7 100644 --- a/src/plugins/built_in/affinity_flow_chatter/plan_executor.py +++ b/src/plugins/built_in/affinity_flow_chatter/plan_executor.py @@ -441,7 +441,7 @@ class ChatterPlanExecutor: # 通过 chat_id 获取真实的 chat_stream 对象 from src.plugin_system.apis.chat_api import get_chat_manager chat_manager = get_chat_manager() - chat_stream = chat_manager.get_stream(plan.chat_id) + chat_stream = await chat_manager.get_stream(plan.chat_id) if chat_stream: # 调用 action_manager 的批量存储