### What happened? 阻塞式 `subagent` 链式模式下,所有步骤都会执行,且每一步的完整记录都保存在 `details.results` 中;但工具实际返回给父模型的 `content` 只有第一步的输出。因此父模型看不到最后一步的产物,也无法得知链路最终如何结束。 后续步骤失败或中止时也有类似问题:返回的 `content` 仍可能只有第一步的成功结果,失败信息只存在于 `details`。由于发给父模型的工具正文不包含 `details`,父模型可能误以为链路已经成功完成。尚未启动的步骤也可能仍被标记为 `running`。 这是结果回传问题,与子任务指令或步骤间摘要导致的内容失真无关。`{previous}` 可以正常传给后续步骤。 ### Steps to reproduce 使用确定性 runner 执行一个阻塞式三步链,例如: ```json { "chain": [ { "agent": "explore", "task": "返回 STEP_1_SOURCE" }, { "agent": "explore", "task": "将 {previous} 总结为 STEP_2_SUMMARY" }, { "agent": "general", "task": "基于 {previous} 返回 STEP_3_FINAL" } ] } ``` 1. 让三步分别返回 `STEP_1_SOURCE`、`STEP_2_SUMMARY` 和 `STEP_3_FINAL`,并均以成功状态结束。 2. 检查最终工具响应和 `details.results`。三条记录均为已完成,且 `{previous}` 正确传递;但工具 `content` 只有 `STEP_1_SOURCE`。 3. 再次运行,将第二步设为非零退出状态,并返回一条明确的错误信息。 4. 此时第三步不会启动,工具 `content` 仍不包含失败信息,步骤状态可能是 `completed / failed / running`。 可用 parallel 模式作为对照:其返回内容会包含所有任务的输出。 ### Expected behavior - 成功时返回最后一个已完成步骤的输出,并附上简洁的逐步状态摘要。不要把所有子代理的完整输出都拼进父模型上下文;链中每一步都可能产生很长的内容。 - 失败或中止时,在工具 `content` 中包含失败或中止步骤及其错误,使父模型能明确知道链路未完成。 - 尚未启动的步骤应标记为 `skipped` 等明确的非运行状态,而不是继续显示为 `running`。 - 为成功链路、后续步骤失败或中止、未启动步骤,以及 single 和 parallel 模式行为不变添加回归测试。 ### Version 0.84.4
Activity
7oMB2006 commentedon Oct 6, 2026
最初由下游桌面端测出 Related discussion: 7oMB2006/desktop-for-step-code#62
fix(subagent): return the chain's final result and mark unstarted steps