From 9ea42e0de1335b1a6b232faacc116f45a6bdd101 Mon Sep 17 00:00:00 2001 From: Windpicker-owo <3431391539@qq.com> Date: Fri, 31 Oct 2025 23:50:35 +0800 Subject: [PATCH] =?UTF-8?q?refactor(planner):=20=E6=A0=B9=E6=8D=AEfocus=5F?= =?UTF-8?q?energy=E6=A6=82=E7=8E=87=E4=BC=98=E5=8C=96Focus=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E5=88=87=E6=8D=A2=E5=88=B0Normal=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../built_in/affinity_flow_chatter/planner.py | 48 ++++++++++++++++--- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/src/plugins/built_in/affinity_flow_chatter/planner.py b/src/plugins/built_in/affinity_flow_chatter/planner.py index dab5bca56..44c07577f 100644 --- a/src/plugins/built_in/affinity_flow_chatter/planner.py +++ b/src/plugins/built_in/affinity_flow_chatter/planner.py @@ -214,7 +214,7 @@ class ChatterActionPlanner: # 6. 根据执行结果更新统计信息 self._update_stats_from_execution_result(execution_result) - # 7. Focus模式下如果执行了reply动作,切换到Normal模式 + # 7. Focus模式下如果执行了reply动作,根据focus_energy概率切换到Normal模式 if chat_mode == ChatMode.FOCUS and context: if filtered_plan.decided_actions: has_reply = any( @@ -224,9 +224,7 @@ class ChatterActionPlanner: else: has_reply = False if has_reply and global_config.affinity_flow.enable_normal_mode: - logger.info("Focus模式: 执行了reply动作,自动切换到Normal模式") - context.chat_mode = ChatMode.NORMAL - await self._sync_chat_mode_to_stream(context) + await self._check_enter_normal_mode(context) # 8. 清理处理标记 if context: @@ -369,6 +367,44 @@ class ChatterActionPlanner: context.processing_message_id = None return [], None + async def _check_enter_normal_mode(self, context: "StreamContext | None") -> None: + """检查并执行进入Normal模式的判定 + + Args: + context: 流上下文 + """ + if not context: + return + + try: + from src.chat.message_receive.chat_stream import get_chat_manager + + chat_manager = get_chat_manager() + chat_stream = await chat_manager.get_stream(self.chat_id) if chat_manager else None + + if not chat_stream: + return + + focus_energy = chat_stream.focus_energy + # focus_energy越高,进入normal模式的概率越高 + # 使用正比例函数: 进入概率 = focus_energy + # 当focus_energy = 0.1时,进入概率 = 10% + # 当focus_energy = 0.5时,进入概率 = 50% + # 当focus_energy = 0.9时,进入概率 = 90% + enter_probability = focus_energy + + import random + if random.random() < enter_probability: + logger.info(f"Focus模式: focus_energy={focus_energy:.3f}, 进入概率={enter_probability:.3f}, 切换到Normal模式") + # 切换到normal模式 + context.chat_mode = ChatMode.NORMAL + await self._sync_chat_mode_to_stream(context) + else: + logger.debug(f"Focus模式: focus_energy={focus_energy:.3f}, 进入概率={enter_probability:.3f}, 保持Focus模式") + + except Exception as e: + logger.warning(f"检查进入Normal模式失败: {e}") + async def _check_exit_normal_mode(self, context: "StreamContext | None") -> None: """检查并执行退出Normal模式的判定 @@ -397,12 +433,12 @@ class ChatterActionPlanner: import random if random.random() < exit_probability: - logger.info(f"Normal模式: focus_energy={focus_energy:.3f}, 退出概率={exit_probability:.3f}, 切换回focus模式") + logger.info(f"Normal模式: focus_energy={focus_energy:.3f}, 退出概率={exit_probability:.3f}, 切换回Focus模式") # 切换回focus模式 context.chat_mode = ChatMode.FOCUS await self._sync_chat_mode_to_stream(context) else: - logger.debug(f"Normal模式: focus_energy={focus_energy:.3f}, 退出概率={exit_probability:.3f}, 保持normal模式") + logger.debug(f"Normal模式: focus_energy={focus_energy:.3f}, 退出概率={exit_probability:.3f}, 保持Normal模式") except Exception as e: logger.warning(f"检查退出Normal模式失败: {e}")