dsh-fail-guard:同一工具连续失败 N 次后强制停手并汇报

前言

在 DeepSeek Harness(DSH)里跑智能体时,工具一旦反复失败,模型往往不会回到系统提示里读「失败两次就停」这类规则——它主要在读自己的推理链。表现上常见同一命令换参数再试、推理里出现大量短句重复,而会话仍在空转。单靠 prompt 很难从内部打断这种「连续失败循环」。

dsh-fail-guard 是社区维护的工作流类插件:从外部监听工具结果,当同一工具连续失败达到阈值时,向对话注入一段结构化的停手说明,让智能体转向汇报而不是继续第四种拼写方式。下面介绍它的定位、安装与配置,以及使用时需要接受的边界。

这是什么

  • 名称:dsh-fail-guard(仓库 FenrirCait/dsh-fail-guard)
  • 维护者:FenrirCait
  • 分类:工作流(社区目录 SkillHub 条目)
  • 一句话:在智能体对同一工具连续失败 N 次后停止继续重试,改为推送四段式停手指令(尝试过什么 / 完整错误 / 初步原因猜测 / 需要你做什么)。

插件通过 dsh.bundle 挂载 cordis.patch.yml,在 Cordis 侧拦截工具结果并计数,不依赖你在 profile 里手写 patch。

核心功能

外部打断,而非 prompt 规则

README 说明:连续失败时模型往往读的是自己的 thinking,而不是当时的系统提示,因此「失败两次就停」写进 prompt 在该状态下通常无效;中断必须由插件从会话外部注入。

连续失败计数与重置

  • 计数按会话、默认按工具分别统计(可通过配置改为全工具共用一个计数器)。
  • 任意一次该工具(或全局,取决于配置)成功会清零计数。
  • 触发停手后,计数会重新开始;再次连续失败到阈值会再次触发——它不是速率限制器,而是可重复触发的 guard。

什么算一次「失败」

满足任一条件即计入:

  1. message.isError === true
  2. meta.opsShell.exitCode 存在且非零

两者都要考虑:shell 退出码为 1 时未必带 isError;部分工具级错误也没有 exit code。

停手时注入的内容

达到阈值后,插件向对话推送内置或可配置的 stopText(四段式说明)和面板上的 stopSummary(一行摘要),目的是让智能体汇报而不是再试同一种思路。

明确不做什么(Limits)

  • 不会撤销「刚刚已经失败」的那次工具调用。
  • 不判断失败是否「合理」——非零退出码即算。
  • 不会重置整段对话;停手指令相当于又多一条用户侧消息。
  • 触发后若继续失败,会重新计数并可能再次触发。

当前 package 版本为 0.2.0(以仓库 package.json 为准),许可证 MIT。

安装与启用

在 DSH 桌面 profile 下执行官方安装命令:

dsh plugin --profile desktop add dsh-fail-guard

安装后重启一次 DSH。cordis.patch.yml 经 dsh.bundle 清单应用,一般无需手动改 profile 里的 patch 列表。

插件以当前 DSH 进程权限运行;安装前建议浏览仓库源码并确认 MIT 许可证与行为是否符合你的环境策略。社区目录 SkillHub 为独立站点,与 DeepSeek / 幻方无官方从属关系。

配置

在客户端 Plugins → dsh-fail-guard → details 中编辑。字段标记为 .volatile():保存后立即生效,无需重启。

Key 默认值 含义
threshold 2 连续失败多少次后停手
sameToolOnly true 按工具分别计数;设为 false 则所有工具共用一个计数器
stopText 内置 注入对话的停手正文
stopSummary 内置 面板一行摘要
debug false 是否把事件、计数、触发写入日志
logFile <plugin dir>/fail-guard.log debug 写入路径

也可直接在 cordis.patch.yml 中写插件 config,例如:

- id: dsh-fail-guard
  config:
    threshold: 3

典型用法:保持默认 threshold: 2、sameToolOnly: true,在智能体容易对 Shell 或某固定工具死磕的任务里启用;若希望「任意工具加起来连续失败 N 次就停」,将 sameToolOnly 设为 false 并按需调高 threshold。排查计数行为时可临时打开 debug 并查看 logFile。

适用场景与注意

适合:长会话、多步工具链、容易出现同一命令反复改参数仍失败的工作流;希望失败循环由外部 guard 切断、让模型输出结构化错误汇报的场景。

注意:

  • 误报:任何非零 exit 都算失败,包括你可能认为「可接受」的退出码。
  • 不会阻止失败当次调用已完成的事实;停手发生在下一次模型决策之前(通过注入消息影响后续轮次)。
  • peer 依赖包括 @deepseek-ai/cordis、@deepseek-ai/dsh-agent、@deepseek-ai/dsh-llm 等,需与当前 DSH 版本兼容(见仓库 package.json)。

README 中引用的观测数据(例如某 74 轮会话里短句片段占比随连续失败上升)来自插件作者自测描述,用于解释现象,并非对你环境的保证。

结尾

dsh-fail-guard 把「同一工具连续失败」从 prompt 规则里拆出来,用 Cordis 插件在外部计数并在阈值处注入四段式停手指令,减少智能体在错误参数上无限重试。安装命令以 README 为准,配置可在 UI 即时生效。

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

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

小夜