diff --git a/src/plugins/built_in/kokoro_flow_chatter/chatter.py b/src/plugins/built_in/kokoro_flow_chatter/chatter.py index 832b0cd7c..08b494133 100644 --- a/src/plugins/built_in/kokoro_flow_chatter/chatter.py +++ b/src/plugins/built_in/kokoro_flow_chatter/chatter.py @@ -125,6 +125,9 @@ class KokoroFlowChatter(BaseChatter): # 3. 获取或创建 Session session = await self.session_manager.get_session(user_id, self.stream_id) + # 3.5 **立即**更新活动时间,阻止 ProactiveThinker 并发处理 + session.last_activity_at = time.time() + # 4. 确定 situation_type(根据之前的等待状态) situation_type = self._determine_situation_type(session) diff --git a/src/plugins/built_in/kokoro_flow_chatter/proactive_thinker.py b/src/plugins/built_in/kokoro_flow_chatter/proactive_thinker.py index afec824fb..2a9f44893 100644 --- a/src/plugins/built_in/kokoro_flow_chatter/proactive_thinker.py +++ b/src/plugins/built_in/kokoro_flow_chatter/proactive_thinker.py @@ -460,6 +460,13 @@ class ProactiveThinker: action.params["situation_type"] = "timeout" action.params["extra_context"] = extra_context + # ★ 在执行动作前最后一次检查状态,防止与 Chatter 并发 + if session.status != SessionStatus.WAITING: + logger.info( + f"[ProactiveThinker] Session {session.user_id} 已被 Chatter 处理,取消执行动作" + ) + return + # 执行动作(回复生成在 Action.execute() 中完成) for action in plan_response.actions: await action_manager.execute_action( diff --git a/src/plugins/built_in/kokoro_flow_chatter/session.py b/src/plugins/built_in/kokoro_flow_chatter/session.py index 8e5254a73..b69adf274 100644 --- a/src/plugins/built_in/kokoro_flow_chatter/session.py +++ b/src/plugins/built_in/kokoro_flow_chatter/session.py @@ -199,6 +199,8 @@ class KokoroSession: """结束等待""" self.status = SessionStatus.IDLE self.waiting_config.reset() + # 更新活动时间,防止 ProactiveThinker 并发处理 + self.last_activity_at = time.time() def get_recent_entries(self, limit: int = 20) -> list[MentalLogEntry]: """获取最近的心理活动日志"""