From 844d4f336211c56c7b112eaf7d392d67f71da4ec Mon Sep 17 00:00:00 2001 From: tt-P607 <68868379+tt-P607@users.noreply.github.com> Date: Thu, 2 Oct 2025 23:22:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(chat):=20=E5=A2=9E=E5=BC=BA=E5=9B=9E?= =?UTF-8?q?=E5=A4=8D=E7=94=9F=E6=88=90=E7=9A=84=E5=81=A5=E5=A3=AE=E6=80=A7?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=B6=85=E6=97=B6=E5=92=8C=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 `DefaultReplyer` 的提示词构建流程中,为并行的子任务(如记忆、工具、关系等)增加了15秒的超时机制。这可以防止因某个子任务耗时过长或卡死而导致整个回复生成过程停滞。 同时,在能量系统中增加了对计算器分数和兴趣值的类型检查,确保它们是数值类型,避免了潜在的 `TypeError` 异常,提高了系统的稳定性。 --- src/chat/energy_system/energy_manager.py | 19 +++++----- src/chat/replyer/default_generator.py | 45 ++++++++++++++++-------- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/src/chat/energy_system/energy_manager.py b/src/chat/energy_system/energy_manager.py index 0bfb6fc4f..9983174d6 100644 --- a/src/chat/energy_system/energy_manager.py +++ b/src/chat/energy_system/energy_manager.py @@ -94,14 +94,10 @@ class InterestEnergyCalculator(EnergyCalculator): for msg in messages: interest_value = getattr(msg, "interest_value", None) - if interest_value is not None: - try: - interest_float = float(interest_value) - if 0.0 <= interest_float <= 1.0: - total_interest += interest_float - valid_messages += 1 - except (ValueError, TypeError): - continue + if isinstance(interest_value, (int, float)): + if 0.0 <= interest_value <= 1.0: + total_interest += interest_value + valid_messages += 1 if valid_messages > 0: avg_interest = total_interest / valid_messages @@ -315,7 +311,12 @@ class EnergyManager: weight = calculator.get_weight() - component_scores[calculator.__class__.__name__] = score + # 确保 score 是 float 类型 + if not isinstance(score, (int, float)): + logger.warning(f"计算器 {calculator.__class__.__name__} 返回了非数值类型: {type(score)},跳过此组件") + continue + + component_scores[calculator.__class__.__name__] = float(score) total_weight += weight logger.debug(f"{calculator.__class__.__name__} 能量: {score:.3f} (权重: {weight:.3f})") diff --git a/src/chat/replyer/default_generator.py b/src/chat/replyer/default_generator.py index 0d4b0b574..c2022af09 100644 --- a/src/chat/replyer/default_generator.py +++ b/src/chat/replyer/default_generator.py @@ -1217,21 +1217,36 @@ class DefaultReplyer: from src.chat.utils.prompt import Prompt # 并行执行六个构建任务 - task_results = await asyncio.gather( - self._time_and_run_task( - self.build_expression_habits(chat_talking_prompt_short, target), "expression_habits" - ), - self._time_and_run_task(self.build_relation_info(sender, target), "relation_info"), - self._time_and_run_task(self.build_memory_block(chat_talking_prompt_short, target), "memory_block"), - self._time_and_run_task( - self.build_tool_info(chat_talking_prompt_short, sender, target, enable_tool=enable_tool), "tool_info" - ), - self._time_and_run_task(self.get_prompt_info(chat_talking_prompt_short, sender, target), "prompt_info"), - self._time_and_run_task( - Prompt.build_cross_context(chat_id, global_config.personality.prompt_mode, target_user_info), - "cross_context", - ), - ) + tasks = { + "expression_habits": asyncio.create_task(self._time_and_run_task(self.build_expression_habits(chat_talking_prompt_short, target), "expression_habits")), + "relation_info": asyncio.create_task(self._time_and_run_task(self.build_relation_info(sender, target), "relation_info")), + "memory_block": asyncio.create_task(self._time_and_run_task(self.build_memory_block(chat_talking_prompt_short, target), "memory_block")), + "tool_info": asyncio.create_task(self._time_and_run_task(self.build_tool_info(chat_talking_prompt_short, sender, target, enable_tool=enable_tool), "tool_info")), + "prompt_info": asyncio.create_task(self._time_and_run_task(self.get_prompt_info(chat_talking_prompt_short, sender, target), "prompt_info")), + "cross_context": asyncio.create_task(self._time_and_run_task(Prompt.build_cross_context(chat_id, global_config.personality.prompt_mode, target_user_info), "cross_context")), + } + + # 设置超时 + timeout = 15.0 # 秒 + + async def get_task_result(task_name, task): + try: + return await asyncio.wait_for(task, timeout=timeout) + except asyncio.TimeoutError: + logger.warning(f"构建任务{task_name}超时 ({timeout}s),使用默认值") + # 为超时任务提供默认值 + default_values = { + "expression_habits": "", + "relation_info": "", + "memory_block": "", + "tool_info": "", + "prompt_info": "", + "cross_context": "", + } + logger.info(f"为超时任务 {task_name} 提供默认值") + return task_name, default_values[task_name], timeout + + task_results = await asyncio.gather(*(get_task_result(name, task) for name, task in tasks.items())) # 任务名称中英文映射 task_name_mapping = {