From c30b89eab1642ceb31e3deca84fe970c1164f2d0 Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Sat, 20 Dec 2025 20:13:16 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E5=90=8C=E4=B8=80=E5=8A=A8?= =?UTF-8?q?=E4=BD=9C=E4=B8=8D=E5=85=81=E8=AE=B8=E5=A4=9A=E6=AC=A1=E9=80=89?= =?UTF-8?q?=E6=8B=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chat/planner_actions/planner.py | 42 +++++++++++++++++++++++++++++ src/dream/dream_generator.py | 2 +- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/chat/planner_actions/planner.py b/src/chat/planner_actions/planner.py index def927cf..d901812d 100644 --- a/src/chat/planner_actions/planner.py +++ b/src/chat/planner_actions/planner.py @@ -677,10 +677,52 @@ class ActionPlanner: action.action_data = action.action_data or {} action.action_data["loop_start_time"] = loop_start_time + # 去重:如果同一个动作被选择了多次,随机选择其中一个 + actions = self._deduplicate_actions(actions) + logger.debug(f"{self.log_prefix}规划器选择了{len(actions)}个动作: {' '.join([a.action_type for a in actions])}") return extracted_reasoning, actions + def _deduplicate_actions(self, actions: List[ActionPlannerInfo]) -> List[ActionPlannerInfo]: + """ + 去重动作:如果同一个动作类型被选择了多次,随机选择其中一个 + + Args: + actions: 动作列表 + + Returns: + 去重后的动作列表,保持原有顺序 + """ + if not actions: + return actions + + # 按 action_type 分组 + action_groups: Dict[str, List[ActionPlannerInfo]] = {} + action_order: List[str] = [] # 保持第一次出现的顺序 + + for action in actions: + action_type = action.action_type + if action_type not in action_groups: + action_groups[action_type] = [] + action_order.append(action_type) + action_groups[action_type].append(action) + + # 对于每个动作类型,如果有多个,随机选择一个 + deduplicated_actions = [] + for action_type in action_order: + group = action_groups[action_type] + if len(group) > 1: + selected_action = random.choice(group) + logger.debug( + f"{self.log_prefix}动作 '{action_type}' 被选择了{len(group)}次,随机选择了其中一个" + ) + deduplicated_actions.append(selected_action) + else: + deduplicated_actions.append(group[0]) + + return deduplicated_actions + def _create_no_reply(self, reasoning: str, available_actions: Dict[str, ActionInfo]) -> List[ActionPlannerInfo]: """创建no_reply""" return [ diff --git a/src/dream/dream_generator.py b/src/dream/dream_generator.py index 6207f7e7..8c4b5bc3 100644 --- a/src/dream/dream_generator.py +++ b/src/dream/dream_generator.py @@ -216,7 +216,7 @@ async def generate_dream_summary( # 默认为私聊会话 stream_id = get_chat_manager().get_stream_id( platform=platform, - id_str=str(user_id), + id=str(user_id), is_group=False, ) if not stream_id: