From af56de681222560e9adc366538c8ef630a38feaa Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Sat, 11 Jul 2026 19:19:41 +0800 Subject: [PATCH] =?UTF-8?q?fix(sub=5Fagent):=20=E4=BF=AE=E5=A4=8D=20wait?= =?UTF-8?q?=5Ffor=5Fcompletion=20=E5=9B=A0=20=5Fload=5Fstate=20=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=20tasks=20=E5=AD=97=E5=85=B8=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E5=BC=95=E7=94=A8=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/sub_agent/manager.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/sub_agent/manager.py b/modules/sub_agent/manager.py index 865912c..082d8ed 100644 --- a/modules/sub_agent/manager.py +++ b/modules/sub_agent/manager.py @@ -264,11 +264,16 @@ class SubAgentManager(SubAgentStateMixin, SubAgentStatsMixin, SubAgentCreationMi return {"success": False, "status": task.get("status"), "message": "子智能体已结束。"} real_task_id = task["task_id"] - running_task = self._running_tasks.get(real_task_id) deadline = time.time() + (timeout_seconds or task.get("timeout_seconds") or SUB_AGENT_DEFAULT_TIMEOUT) while time.time() < deadline: self.reconcile_task_states() + # 关键:其他线程(如前端轮询 /api/sub_agents)可能调用 _load_state() + # 并替换 self.tasks 字典,导致旧 task 引用失效。每次循环重新获取引用。 + task = self.tasks.get(real_task_id) + if not task: + return {"success": False, "error": "未找到对应的子智能体任务"} + running_task = self._running_tasks.get(real_task_id) status = task.get("status") # 已到达终态:返回最终结果(持续 reconcile 直到 final_result 就绪) @@ -278,6 +283,7 @@ class SubAgentManager(SubAgentStateMixin, SubAgentStatsMixin, SubAgentCreationMi # 终态但 final_result 尚未写入,短暂等待后重试 time.sleep(SUB_AGENT_STATUS_POLL_INTERVAL) self.reconcile_task_states() + task = self.tasks.get(real_task_id) or task if task.get("final_result"): return task["final_result"] return {"success": False, "status": status, "message": "子智能体已结束,但未获取到结果。"} @@ -285,6 +291,7 @@ class SubAgentManager(SubAgentStateMixin, SubAgentStatsMixin, SubAgentCreationMi # asyncio Task 已结束但状态可能还没同步:等待 final_result 就绪 if running_task and running_task.done(): self.reconcile_task_states() + task = self.tasks.get(real_task_id) or task if task.get("final_result"): return task["final_result"] # 结果尚未落盘,继续轮询,避免把「已创建」误判为失败