dsh-fail-fast:DSH 工具批次组内并行、失败即停

前言

在 DeepSeek Harness(DSH)里,模型常常在一个 step 里一次返回多个工具调用。其中只读、声明了并发安全的调用可以并行跑;写文件、bash 等有顺序或副作用的调用,Harness 会按组串起来。现实问题是:模型往往按依赖顺序发射调用(例如先 write 再 bash),前面一旦失败,后面调用的前提已经失效,继续执行只会浪费请求,有时还会留下破坏性副作用。若把整个批次改成全局串行,又牺牲了只读调用的并发度。

下面介绍社区插件 dsh-fail-fast(维护者 x402,分类:工作流)。它把「模型一次返回的多个工具调用」当作一个批次,在 Harness 既有分组调度之上实现组内并行、组间顺序、失败即停:并行安全的调用仍可重叠执行;任意调用最终以 is_error: true 结束时,本批次里所有尚未开始的调用不再执行,并为它们合成带明确原因的「未执行」结果,方便模型下一轮直接修复。

这是什么

dsh-fail-fast 是一个 DSH Host 插件,发布在 npm(包名 dsh-fail-fast),源码在 GitHub x402/dsh-fail-fast,社区目录页见 skillhub.cn/plugins/x402/dsh-fail-fast。插件利用模型通常按依赖顺序发射调用这一观察,在失败点之后拒绝尚未开始的调用,无需理解工具语义或依赖图;被跳过的调用以 is_error: true 返回,正文以 Error: Not executed: 开头,携带 FailFastSkippedError / SKIPPED_AFTER_FAILURE。

DSH 生态理念是「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。

核心功能

组内并行与组间顺序

  • 组内并行:声明了 isConcurrencySafe 的调用仍按 maxParallelToolCalls 并发,启用插件不会把调度降级为全局串行。
  • 组间顺序:非并发安全调用(写文件、bash 等)各自单独成组,天然构成 barrier,write → bash 等依赖顺序保持不变。

失败即停

任何最终 is_error: true 的结果(工具报错、策略拒绝、超时、post-execute block)都会中止本批次中所有尚未开始的调用;失败组内已启动的调用会自然完成。被拒调用不执行函数体、不触发审批。

模型可直接修复

被跳过的调用返回合成错误,例如:

Error: Not executed: the preceding `read` call failed, so fail-fast skipped this call
and every call that had not started yet in the batch. Fix the failure first, then
re-issue the remaining calls in dependency order.

失败调用本身沿用原始工具结果,不改写。

实现方式(零侵入)

插件只监听 DSH 公开扩展点:session/event、tools/result、tools/pre-execute。在 step/start、tool/call 上按模型发射顺序记录 callId;在 tools/result 上标记模型顺序中第一个 is_error: true 为失败点;在 tools/pre-execute 上对失败点之后尚未开始的调用 deny。纯 ESM 单文件、无运行时依赖;cordis.patch.yml 只插入插件行,不覆盖既有配置。

作用域与边界

  • 只作用于模型直接调用的顶层调用;PTC 子调用(带 exec.parent)和子代理(独立 session)各自独立。
  • 单调用批次与 abort 批次行为不变;step 结束时批次状态自动重置。
  • 已取消(abort)的批次由 agent loop 合成「aborted before dispatch」结果,本插件不参与。
  • 失败时已启动的同组并发调用无法收回;若需强制中断,需在工具实现里响应 exec.signal。

安装与启用

package.json 声明兼容 DSH >=0.2.0-rc.2 <0.3.0,许可证 MIT(© 2026 x402 and contributors)。插件以当前 DSH 进程权限运行,安装前建议阅读源码与许可证。

Web 插件页

在 DSH Web 的「插件」页点「添加插件」,输入包名,完成后点「立即启用」:

dsh-fail-fast

国内网络可在安装对话框选择自定义 registry 镜像。

会话内插件管理

安装并启用:

plugin_manager(action: "install_bundle", target: "dsh-fail-fast")

DSH 有新版本时会提示并支持一键更新。已安装 profile 可用 plugin_manager 的 list_plugins / list_bundles 确认 fail-fast 已启用。

其他方式

  • 固定版本或预览提交:在安装框粘贴 https://github.com/x402/dsh-fail-fast#<tag 或 commit>(需本机 git 且能访问 GitHub;此方式不检查更新,升级需先卸载再重装)。
  • 本地开发:clone 后以 checkout 作为 bundle 安装(link: 或绝对路径),见仓库 AGENTS.md。

典型用法

本插件无额外配置项,启用后随 agent loop 自动生效。典型场景是模型在一个 step 内混合发出多个工具调用:并行安全的 read / grep 仍可并发;若其中某个只读调用失败,或顺序组里前面的 write 失败,则后续尚未开始的调用会被跳过并返回「Not executed」类错误,模型在同一轮 provider 请求未完全浪费的前提下,下一轮先修复失败再按依赖顺序重发剩余调用。

README 未提供独立 CLI 示例;行为验证可参考仓库 CI(.github/workflows/ci.yml)与 npm run test smoke 测试。

适用场景与注意

适合:经常在单 step 多工具调用下工作、希望保留只读并发又避免「前失败后仍跑后续」的 DSH 用户与插件作者。

注意:

  1. 任何 is_error: true 的最终结果均触发 fail-fast,包括策略拒绝与超时。
  2. 同组内失败提交很快时,同组尾部尚未 prepare 的调用也可能被跳过,属保守 fail-fast 行为。
  3. 问题最初由 @Golden-Pigeon 发现并指出,插件 README 中有致谢。

结尾

dsh-fail-fast 在 Harness 原有顺序组调度上增加批次级失败即停,兼顾组内并行与依赖顺序,并用可修复的合成错误反馈给模型。进一步了解可访问社区目录 x402/dsh-fail-fast 与 GitHub 仓库 github.com/x402/dsh-fail-fast。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye