DSH Sub-agent 空完成态分析
DeepSeek Harness Sub-agent:推理预算耗尽与空结果
- 作者
- DeepSeekAgent.io 编辑部
- 发布
- 更新
Sub-agent 显示 completed,不一定代表任务产物已经完成。2026 年 10 月 20 日公开的一次 DSH 复现中,后台 Sub-agent 运行约 20 分钟,消耗完整输出预算,却没有调用工具、没有返回正文、也没有创建任何文件,父 Agent 最终仍收到完成状态。
这个案例的重要性不在于一次任务失败,而在于 Harness 把“Provider 正常结束响应”折叠成了“工作已经成功完成”。当任务价值全部存在于磁盘产物时,空结果与成功共用一个状态,会同时制造可靠性与成本问题。
这次 Session 实际发生了什么
复现者解压并检查 Sub-agent 的 Session Log 后,记录到:
- 整个生命周期只有 1 个 Turn、1 个 Step;
- Assistant Message 只有
reasoning,没有text与tool_use; - 输入为 32,853 Token;
- 输出为 32,000 Token,正好到达输出上限;
- 其中 31,955 个是 Reasoning Token;
turn/end仍被记录为completed。
任务本身是机械性的 Markdown 批量改写,并且要求脚本验证 13 个文件。换言之,这不是 Agent 执行了一半,而是它在第一次可见行动之前就把整轮预算用在了内部推理上。
为什么 Harness 会把它判成完成
复现基于 DSH 0.2.0-rc.2 的 continuable background Sub-agent。报告定位到的状态折叠逻辑有两个关键点:
- Activation Observer 的默认停止原因为
completed; - 只有 Assistant 输出包含非空内容时,结算通知才附带 Closing Message。
Provider 在 Token 上限附近干净结束,并不一定返回一个 Harness 能识别的截断错误。如果这一轮只有 Reasoning Block,既没有 Tool Call,也没有可见文本,Observer 仍可能沿用默认完成态。父 Agent 看到的就只是“已完成”,却得不到空正文、零工具调用和预算耗尽之间的因果信号。
completed 应该表示什么
Agent Runtime 至少需要区分三件事:
- 响应结束:Provider 不再生成 Token;
- 执行结束:Agent Loop 不再推进;
- 任务完成:验收条件与产物已经满足。
这三个状态不能由一个 completed 代替。响应可以正常结束,但任务完全没有开始;执行也可以停止,但原因是预算耗尽、权限拒绝或工具失败。只有 Harness 验证了输出、工具行为或外部产物,才能把任务层状态交给上游继续使用。
为什么这会浪费大量 Token
对机械任务使用高推理档位时,模型可能在计划、复核和重新规划之间持续消耗预算。只要第一步没有形成工具调用,Harness 就看不到工作进展。此时再长的 Reasoning 也不会修改文件。
更危险的是父 Agent 把空 completed 当成成功后继续执行:它可能开始汇总并不存在的成果,或者再次派发相同任务,形成新的 Token 消耗。这个故障与 Sub-agent 计费盲区 和 Agentic Loop 过长问题 属于同一条可观测性链:界面状态没有完整表达实际模型调用和产物状态。
适合机械任务的调度约束
1. 降低默认推理档位
批量改名、格式修复、文件搬运和确定性代码替换,通常不需要高推理预算。为这类 Sub-agent 显式设置较低 Reasoning Effort,把预算留给工具执行和验证。
2. 让第一步产生外部进展
任务提示可以明确要求第一项动作必须是只读检查或工具调用,而不是长篇计划。对于文件任务,先列出目标文件、读取样例或创建进度记录,都比不可见推理更容易判断 Agent 是否真正启动。
3. 定义可验证的完成契约
父 Agent 不应只信任状态字符串。至少检查:
- Closing Message 非空;
- 预期文件、提交或报告存在;
- 验证命令已经执行并返回预期状态。
如果任务包含多个文件,可以让子任务持续写入 Heartbeat 或清单,最终以 done 标记结束。这样即使会话异常终止,也能区分“没有开始”“正在执行”和“已经验收”。
4. 限制无工具活动的预算
Harness 可以为“连续 Reasoning 但没有 Tool Call”单独设置阈值。到达阈值时,应返回 max-tokens、no-observable-progress 或其他明确状态,而不是继续沿用 completed。
Runtime 应补充哪些信号
父 Agent 的结算通知至少应包含:
- Stop Reason;
- 输入、输出与 Reasoning Token;
- Tool Call 数量;
- 非空 Assistant Text 是否存在;
- 产物或验收检查结果。
当“输出接近上限、零工具调用、零可见文本”同时出现时,Harness 可以直接将其识别为推理预算耗尽。即使暂时不改变状态机,向父 Agent显示一行诊断,也能避免把空结果当成成功。
对 DeepSeek V4.1 Flash 调度的意义
V4.1 Flash 能支持长上下文和复杂 Agent 任务,但更大的上下文与推理预算不应成为所有子任务的默认答案。模型能力越强,Harness 越需要按任务类型分配预算:研究、架构与模糊决策可以保留更高推理强度;确定性改写、文件操作与验证任务应优先执行、及时产生产物,并使用明确上限。
参考资料
- Sub-agent 推理预算耗尽但结算为 completed 的复现
- DeepSeek Harness v0.2.0-rc.2 Release
- DSH Sub-agent Token 计费与用量分析
- DeepSeek V4.1 Flash × DSH Agentic Loop 源码分析
常见问题
为什么输出达到 Token 上限却没有正文?
模型可以把输出预算几乎全部用于 Reasoning Block。如果没有剩余空间生成文本或工具调用,用户可见输出就可能为空。
把 Reasoning Effort 调低会不会降低所有任务质量?
不应全局一刀切。低推理更适合确定性机械任务;复杂研究和架构任务仍可以使用更高档位。关键是按任务类型路由。
父 Agent 怎样确认子任务真的完成?
同时检查非空结算消息、外部产物和验收命令。单独的 completed 状态不足以证明交付完成。