fix(sub_agent): 修复 wait_for_completion 因 _load_state 替换 tasks 字典导致的引用失效

This commit is contained in:
JOJO 2026-07-11 19:19:41 +08:00
parent 6618ab03dc
commit af56de6812

View File

@ -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"]
# 结果尚未落盘,继续轮询,避免把「已创建」误判为失败