From 69c6829aed989209636fcaca2068276a4e0e3d73 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Fri, 26 Sep 2025 19:56:46 +0800 Subject: [PATCH] =?UTF-8?q?refactor(chat):=20=E5=B0=86=20get=5Fchat=5Ftype?= =?UTF-8?q?=5Fand=5Ftarget=5Finfo=20=E9=87=8D=E6=9E=84=E4=B8=BA=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 `get_chat_type_and_target_info` 函数从同步改为异步,以支持其内部对异步方法 `person_info_manager.get_values` 的调用。 此更改可防止在获取聊天对象信息时阻塞事件循环。所有调用此函数的代码(包括 `SubHeartflow`, `ActionModifier`, `PlanGenerator`, `DefaultReplyer`)都已相应更新为使用 `await`。 在 `DefaultReplyer` 中引入了延迟异步初始化模式 (`_async_init`),以适应其类生命周期。 --- src/chat/heart_flow/sub_heartflow.py | 3 +- src/chat/planner_actions/action_modifier.py | 2 +- src/chat/planner_actions/plan_generator.py | 2 +- src/chat/replyer/default_generator.py | 34 +++++++++------------ src/chat/utils/utils.py | 5 +-- 5 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/chat/heart_flow/sub_heartflow.py b/src/chat/heart_flow/sub_heartflow.py index 275a25a57..136b1cb41 100644 --- a/src/chat/heart_flow/sub_heartflow.py +++ b/src/chat/heart_flow/sub_heartflow.py @@ -24,7 +24,7 @@ class SubHeartflow: self.subheartflow_id = subheartflow_id self.chat_id = subheartflow_id - self.is_group_chat, self.chat_target_info = get_chat_type_and_target_info(self.chat_id) + self.is_group_chat, self.chat_target_info = (None, None) self.log_prefix = get_chat_manager().get_stream_name(self.subheartflow_id) or self.subheartflow_id # focus模式退出冷却时间管理 @@ -38,4 +38,5 @@ class SubHeartflow: async def initialize(self): """异步初始化方法,创建兴趣流并确定聊天类型""" + self.is_group_chat, self.chat_target_info = await get_chat_type_and_target_info(self.chat_id) await self.heart_fc_instance.start() diff --git a/src/chat/planner_actions/action_modifier.py b/src/chat/planner_actions/action_modifier.py index 154fe62a7..bcd01934d 100644 --- a/src/chat/planner_actions/action_modifier.py +++ b/src/chat/planner_actions/action_modifier.py @@ -72,7 +72,7 @@ class ActionModifier: from src.chat.utils.utils import get_chat_type_and_target_info # 获取聊天类型 - is_group_chat, _ = get_chat_type_and_target_info(self.chat_id) + is_group_chat, _ = await get_chat_type_and_target_info(self.chat_id) all_registered_actions = component_registry.get_components_by_type(ComponentType.ACTION) chat_type_removals = [] diff --git a/src/chat/planner_actions/plan_generator.py b/src/chat/planner_actions/plan_generator.py index 5d1ab9c38..ec0a11691 100644 --- a/src/chat/planner_actions/plan_generator.py +++ b/src/chat/planner_actions/plan_generator.py @@ -51,7 +51,7 @@ class PlanGenerator: Returns: Plan: 一个填充了初始上下文信息的 Plan 对象。 """ - _is_group_chat, chat_target_info_dict = get_chat_type_and_target_info(self.chat_id) + _is_group_chat, chat_target_info_dict = await get_chat_type_and_target_info(self.chat_id) target_info = None if chat_target_info_dict: diff --git a/src/chat/replyer/default_generator.py b/src/chat/replyer/default_generator.py index 092f2680b..db10e779c 100644 --- a/src/chat/replyer/default_generator.py +++ b/src/chat/replyer/default_generator.py @@ -202,7 +202,10 @@ class DefaultReplyer: ): self.express_model = LLMRequest(model_set=model_config.model_task_config.replyer, request_type=request_type) self.chat_stream = chat_stream - self.is_group_chat, self.chat_target_info = get_chat_type_and_target_info(self.chat_stream.stream_id) + self.is_group_chat: Optional[bool] = None + self.chat_target_info: Optional[Dict[str, Any]] = None + self._initialized = False + self.heart_fc_sender = HeartFCSender() self.memory_activator = MemoryActivator() # 使用纯向量瞬时记忆系统V2,支持自定义保留时间 @@ -803,9 +806,12 @@ class DefaultReplyer: action_descriptions += "根据聊天情况,你决定在回复的同时做以下这些动作:\n" action_descriptions += choosen_action_descriptions - return action_descriptions - - + async def _async_init(self): + if self._initialized: + return + self.is_group_chat, self.chat_target_info = await get_chat_type_and_target_info(self.chat_stream.stream_id) + self._initialized = True + async def build_prompt_reply_context( self, extra_info: str = "", @@ -833,22 +839,11 @@ class DefaultReplyer: """ if available_actions is None: available_actions = {} + await self._async_init() chat_stream = self.chat_stream chat_id = chat_stream.stream_id - is_group_chat = bool(chat_stream.group_info) - platform = chat_stream.platform - - if reply_message: - user_id = reply_message.get("user_id","") - person = Person(platform=platform, user_id=user_id) - person_name = person.person_name or user_id - sender = person_name - target = reply_message.get('processed_plain_text') - else: - person_name = "用户" - sender = "用户" - target = "消息" - + person_info_manager = get_person_info_manager() + is_group_chat = self.is_group_chat if global_config.mood.enable_mood: chat_mood = mood_manager.get_mood_by_chat_id(chat_id) @@ -1164,9 +1159,10 @@ class DefaultReplyer: reply_to: str, reply_message: Optional[Dict[str, Any]] = None, ) -> str: # sourcery skip: merge-else-if-into-elif, remove-redundant-if + await self._async_init() chat_stream = self.chat_stream chat_id = chat_stream.stream_id - is_group_chat = bool(chat_stream.group_info) + is_group_chat = self.is_group_chat if reply_message: sender = reply_message.get("sender") diff --git a/src/chat/utils/utils.py b/src/chat/utils/utils.py index 7e463f5c0..b19c3b143 100644 --- a/src/chat/utils/utils.py +++ b/src/chat/utils/utils.py @@ -619,7 +619,7 @@ def translate_timestamp_to_human_readable(timestamp: float, mode: str = "normal" return time.strftime("%H:%M:%S", time.localtime(timestamp)) -def get_chat_type_and_target_info(chat_id: str) -> Tuple[bool, Optional[Dict]]: +async def get_chat_type_and_target_info(chat_id: str) -> Tuple[bool, Optional[Dict]]: """ 获取聊天类型(是否群聊)和私聊对象信息。 @@ -667,7 +667,8 @@ def get_chat_type_and_target_info(chat_id: str) -> Tuple[bool, Optional[Dict]]: if person_id: # get_value is async, so await it directly person_info_manager = get_person_info_manager() - person_name = person_info_manager.get_value(person_id, "person_name") + person_data = await person_info_manager.get_values(person_id, ["person_name"]) + person_name = person_data.get("person_name") target_info["person_id"] = person_id target_info["person_name"] = person_name