From be3834641ff538be8a36364dfdee71abbf8137ce Mon Sep 17 00:00:00 2001 From: tt-P607 <68868379+tt-P607@users.noreply.github.com> Date: Wed, 1 Oct 2025 11:33:12 +0800 Subject: [PATCH] =?UTF-8?q?fix(chatter):=20=E4=BF=AE=E5=A4=8D=E8=81=8A?= =?UTF-8?q?=E5=A4=A9=E8=AE=A1=E5=88=92=E6=89=A7=E8=A1=8C=E5=99=A8=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E5=AF=B9=E5=90=8C=E4=B8=80=E6=B6=88=E6=81=AF=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E5=9B=9E=E5=A4=8D=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在复杂的对话场景中,行动规划器可能会针对同一条用户消息生成多个回复动作。这会导致机器人对用户的同一句话进行多次回复,影响用户体验。 本次提交通过在执行回复动作前检查 `message_id`,对回复列表进行去重,确保每条消息在单次计划中只被回复一次。同时增加了相应的日志记录,方便追踪过滤行为。 --- .../affinity_flow_chatter/plan_executor.py | 40 ++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/src/plugins/built_in/affinity_flow_chatter/plan_executor.py b/src/plugins/built_in/affinity_flow_chatter/plan_executor.py index 821d52bd6..cf14c221e 100644 --- a/src/plugins/built_in/affinity_flow_chatter/plan_executor.py +++ b/src/plugins/built_in/affinity_flow_chatter/plan_executor.py @@ -111,17 +111,47 @@ class ChatterPlanExecutor: } async def _execute_reply_actions(self, reply_actions: List[ActionPlannerInfo], plan: Plan) -> Dict[str, any]: - """串行执行所有回复动作""" + """串行执行所有回复动作,增加去重逻辑,避免对同一消息多次回复""" results = [] - total_actions = len(reply_actions) - if total_actions > 1: + + # --- 新增去重逻辑 --- + unique_actions = [] + replied_message_ids = set() + for action_info in reply_actions: + target_message = action_info.action_message + message_id = None + if target_message: + # 兼容 Pydantic 对象和字典两种情况 + if hasattr(target_message, "message_id"): + message_id = getattr(target_message, "message_id", None) + elif isinstance(target_message, dict): + message_id = target_message.get("message_id") + + if message_id: + if message_id not in replied_message_ids: + unique_actions.append(action_info) + replied_message_ids.add(message_id) + else: + logger.warning( + f"[多重回复] 检测到对消息ID '{message_id}' 的重复回复,已过滤。" + f" (动作: {action_info.action_type}, 原因: {action_info.reasoning})" + ) + else: + # 如果没有message_id,无法去重,直接添加 + unique_actions.append(action_info) + # --- 去重逻辑结束 --- + + total_actions = len(unique_actions) + if len(reply_actions) > total_actions: + logger.info(f"[多重回复] 原始回复任务 {len(reply_actions)} 个,去重后剩余 {total_actions} 个。") + elif total_actions > 1: logger.info(f"[多重回复] 开始执行 {total_actions} 个回复任务。") - for i, action_info in enumerate(reply_actions): + for i, action_info in enumerate(unique_actions): is_last_action = i == total_actions - 1 if total_actions > 1: logger.info(f"[多重回复] 正在执行第 {i+1}/{total_actions} 个回复...") - + # 传递 clear_unread 参数 result = await self._execute_single_reply_action(action_info, plan, clear_unread=is_last_action) results.append(result)