Просмотр исходного кода

feat:修改了subagent goal的数据格式;修复了goalid的问题

elksmmx 3 недель назад
Родитель
Сommit
a74b296a9d
4 измененных файлов с 37 добавлено и 13 удалено
  1. 3 0
      agent/core/runner.py
  2. 16 7
      agent/tools/builtin/subagent.py
  3. 1 1
      agent/trace/goal_models.py
  4. 17 5
      frontend/API.md

+ 3 - 0
agent/core/runner.py

@@ -564,6 +564,9 @@ class AgentRunner:
                     })
 
                     for tc in tool_calls:
+                        # 每次工具执行前重新获取最新的 goal_id(处理并行 tool_calls 的情况)
+                        current_goal_id = goal_tree.current_id if (goal_tree and goal_tree.current_id) else None
+
                         tool_name = tc["function"]["name"]
                         tool_args = tc["function"]["arguments"]
 

+ 16 - 7
agent/tools/builtin/subagent.py

@@ -247,7 +247,10 @@ async def _handle_explore_mode(
     for i, branch in enumerate(branches):
         # 生成唯一的 sub_trace_id
         sub_trace_id = generate_sub_trace_id(current_trace_id, f"explore-{i+1:03d}")
-        sub_trace_ids.append(sub_trace_id)
+        sub_trace_ids.append({
+            "trace_id": sub_trace_id,
+            "mission": branch
+        })
 
         # 创建 Sub-Trace
         parent_trace = await store.get_trace(current_trace_id)
@@ -301,13 +304,13 @@ async def _handle_explore_mode(
             }
             processed_results.append(error_result)
             await broadcast_sub_trace_completed(
-                current_trace_id, sub_trace_ids[i],
+                current_trace_id, sub_trace_ids[i]["trace_id"],
                 "failed", str(result), {}
             )
         else:
             processed_results.append(result)
             await broadcast_sub_trace_completed(
-                current_trace_id, sub_trace_ids[i],
+                current_trace_id, sub_trace_ids[i]["trace_id"],
                 result.get("status", "completed"),
                 result.get("summary", ""),
                 result.get("stats", {})
@@ -350,7 +353,10 @@ async def _handle_delegate_mode(
         if not existing_trace:
             return {"status": "failed", "error": f"Continue-from trace not found: {continue_from}"}
         sub_trace_id = continue_from
-        sub_trace_ids = [sub_trace_id]
+        # 获取 mission
+        goal_tree = await store.get_goal_tree(continue_from)
+        mission = goal_tree.mission if goal_tree else task
+        sub_trace_ids = [{"trace_id": sub_trace_id, "mission": mission}]
     else:
         parent_trace = await store.get_trace(current_trace_id)
         sub_trace_id = generate_sub_trace_id(current_trace_id, "delegate")
@@ -369,7 +375,7 @@ async def _handle_delegate_mode(
         )
         await store.create_trace(sub_trace)
         await store.update_goal_tree(sub_trace_id, GoalTree(mission=task))
-        sub_trace_ids = [sub_trace_id]
+        sub_trace_ids = [{"trace_id": sub_trace_id, "mission": task}]
 
         # 广播 sub_trace_started
         await broadcast_sub_trace_started(
@@ -458,7 +464,10 @@ async def _handle_evaluate_mode(
         if not existing_trace:
             return {"status": "failed", "error": f"Continue-from trace not found: {continue_from}"}
         sub_trace_id = continue_from
-        sub_trace_ids = [sub_trace_id]
+        # 获取 mission
+        goal_tree = await store.get_goal_tree(continue_from)
+        mission = goal_tree.mission if goal_tree else task_prompt
+        sub_trace_ids = [{"trace_id": sub_trace_id, "mission": mission}]
     else:
         parent_trace = await store.get_trace(current_trace_id)
         sub_trace_id = generate_sub_trace_id(current_trace_id, "evaluate")
@@ -477,7 +486,7 @@ async def _handle_evaluate_mode(
         )
         await store.create_trace(sub_trace)
         await store.update_goal_tree(sub_trace_id, GoalTree(mission=task_prompt))
-        sub_trace_ids = [sub_trace_id]
+        sub_trace_ids = [{"trace_id": sub_trace_id, "mission": task_prompt}]
 
         # 广播 sub_trace_started
         await broadcast_sub_trace_started(

+ 1 - 1
agent/trace/goal_models.py

@@ -62,7 +62,7 @@ class Goal:
     summary: Optional[str] = None            # 完成/放弃时的总结
 
     # agent_call 特有
-    sub_trace_ids: Optional[List[str]] = None      # 启动的 Sub-Trace IDs
+    sub_trace_ids: Optional[List[Dict[str, str]]] = None      # 启动的 Sub-Trace 信息 [{"trace_id": "...", "mission": "..."}]
     agent_call_mode: Optional[str] = None          # "explore" | "delegate" | "sequential"
     sub_trace_metadata: Optional[Dict[str, Dict[str, Any]]] = None  # Sub-Trace 元数据
 

+ 17 - 5
frontend/API.md

@@ -139,7 +139,10 @@ GET /api/traces/{trace_id}
         "reason": "评估不同技术选型",
         "status": "in_progress",
         "agent_call_mode": "explore",
-        "sub_trace_ids": ["abc123.A", "abc123.B"],
+        "sub_trace_ids": [
+          {"trace_id": "abc123.A", "mission": "JWT 方案"},
+          {"trace_id": "abc123.B", "mission": "Session 方案"}
+        ],
         "sub_trace_metadata": null,
         "self_stats": { "message_count": 0, "total_tokens": 0, "total_cost": 0.0, "preview": null },
         "cumulative_stats": { "message_count": 0, "total_tokens": 0, "total_cost": 0.0, "preview": null }
@@ -208,8 +211,14 @@ GET /api/traces/{trace_id}
         "status": "completed",
         "agent_call_mode": "explore",
         "sub_trace_ids": [
-          "abc123@explore-20260204220012-001",
-          "abc123@explore-20260204220012-002"
+          {
+            "trace_id": "abc123@explore-20260204220012-001",
+            "mission": "JWT 方案"
+          },
+          {
+            "trace_id": "abc123@explore-20260204220012-002",
+            "mission": "Session 方案"
+          }
         ],
         "sub_trace_metadata": {
           "abc123@explore-20260204220012-001": {
@@ -692,7 +701,7 @@ if (data.event === 'sub_trace_completed') {
 | `reason` | string | 创建理由(为什么做)|
 | `status` | string | `pending` / `in_progress` / `completed` / `abandoned` |
 | `summary` | string \| null | 完成/放弃时的总结 |
-| `sub_trace_ids` | string[] \| null | 启动的 Sub-Trace IDs(仅 agent_call)|
+| `sub_trace_ids` | Array<{trace_id: string, mission: string}> \| null | 启动的 Sub-Trace 信息(仅 agent_call)|
 | `agent_call_mode` | string \| null | "explore" / "delegate" / "sequential"(仅 agent_call)|
 | `sub_trace_metadata` | object \| null | Sub-Trace 元数据(仅 agent_call,包含最后消息等)|
 | `self_stats` | GoalStats | 自身统计 |
@@ -1078,7 +1087,10 @@ const mainTrace = {
   goal_tree: {
     goals: [
       { id: "1", type: "normal", description: "分析问题" },
-      { id: "2", type: "agent_call", agent_call_mode: "explore", sub_trace_ids: ["abc123.A", "abc123.B"] },
+      { id: "2", type: "agent_call", agent_call_mode: "explore", sub_trace_ids: [
+        {"trace_id": "abc123.A", "mission": "JWT 方案"},
+        {"trace_id": "abc123.B", "mission": "Session 方案"}
+      ] },
       { id: "3", type: "normal", description: "完善实现" }
     ]
   },