dsh-exit-code-lens:让智能体区分「答案型」非零退出码

前言

在 DeepSeek Harness(DSH)里,智能体通过 bash 工具执行命令。DSH 会在每条非零结果末尾附加 [exit code: N],系统提示又要求模型「每个 bash 结果都检查 exit code,出错先排查」。不少 Unix 命令用退出码 1 表示正常语义上的「答案」,而不是 shell 失败:grep 没匹配、diff 有差异、test 条件为假都会返回 1。模型容易把这类结果当成故障,反复重跑搜索、列目录、核对文件,浪费轮次和 token。社区讨论里有人报告同类任务因 exit 1 循环导致请求量接近翻倍。dsh-exit-code-lens 是 YanYunCY 维护的工作流类 DSH 插件,在匹配到的 bash 结果里补一行说明,并可选地增强系统提示,帮助模型继续推进而不是误查。

这是什么

dsh-exit-code-lens 是 DeepSeek Harness 插件:当非零退出码表示「答案」(例如 grep 无匹配、diff 有差异、test 为假)而非失败时,在结果中标注说明,减少智能体对已正确执行的命令做重复核查。

维护者:YanYunCY。分类:工作流。许可证:MIT(见仓库 README)。当前 package.json 版本为 0.1.0。GitHub 星标:0(以目录页信息为准)。

问题从哪来

DSH 的 bash 工具对每条非零结果追加 [exit code: N],系统提示要求检查该标记并在失败时再排查。例如 grep -rn TODO src 无匹配时退出码为 1,模型仍可能当作错误去调查。README 引用了 deepseek-harness 讨论 #1884(第三方评测中 exit-1 循环约使请求从 32 增至 61)与 #8403(单次会话 56 条工具结果中有 7 条 exit 1,均来自命令写法而非真实错误)。

核心功能

每次 bash 调用结束后,插件根据命令与退出码判断是否为已知的「答案型」状态。若匹配,在 [exit code: N] 标记上一行插入 [exit-code note: …] 说明;[exit code: N] 仍保留为最后一行,终端卡片上的退出码展示不变。同时在系统提示中增加一句静态说明,让模型信任该 note(可通过配置关闭)。

内置规则目前针对 exit 1,包括但不限于:

命令 exit 1 的含义
grep、egrep、fgrep、zgrep、rg、ag、ack、git grep 无匹配
diff、cmp、git diff --exit-code / --quiet 输入不一致
test、[、[[ 条件为假
which、type、command -v、hash 未安装
pgrep、pidof 无对应进程
git merge-base --is-ancestor 不是祖先
jq -e 最后输出为 false/null

典型输出形态(README 示例):

(no output)
[exit-code note: grep exits 1 when no line matched. Nothing failed; the answer is "no matches".]
[exit code: 1]

何时不插入说明

插件刻意保守,下列情况不会加 note:

  • stderr 有输出(例如 grep pattern missing-file 退出 2 并打印错误,属于真实失败);
  • 退出码与规则不符(如 grep 的 2、diff 的 2);
  • 决定退出码的不是「最后一条」简单命令(管道、grep x f | wc -l、grep x f || echo none、后台 cmd & 等);
  • 命令含控制流、子 shell、heredoc(if、for、( … )、<<EOF 等);
  • 调用被 kill、超时或未成功运行。

前导的 VAR=x、env、sudo、timeout N、nice -n N 以及 2>/dev/null 等重定向会被穿透识别。对管道或 cd x && grep …,note 会附带说明:「Assuming the status came from the last command.」

安装与启用

需要先具备 DSH 与对应 profile。安装命令以 README 为准:

dsh plugin --profile <profile> add github:YanYunCY/dsh-exit-code-lens

要求 Node ≥ 24.9(package.json:>=24.9.0)。README 写明在 dsh 0.2.1-rc.5 上测试过。无需构建步骤,无运行时依赖,插件本身不发起网络访问。

DSH 生态采用「一切皆插件」思路;社区插件目录为独立站点,与 DeepSeek / 幻方无官方从属关系。插件随当前 dsh 进程权限运行,安装前建议自行查看仓库源码与 MIT 许可证。

可选配置

可在 $DSH_HOME/profiles/<profile>/cordis.patch.yml 中覆盖插件行为(README 示例):

- id: exit-code-lens
  config:
    tools: [bash]          # 要注解的工具名
    prompt: true           # 是否在系统提示中加入一行说明
    rules:                 # 自定义规则,优先于内置规则
      - command: mytool
        subcommand: check
        codes: [3]
        note: "{cmd} exits {code} when the check is still pending. Nothing failed."

成本方面:每条匹配结果多一行输出;系统提示多一句约 70 token 的静态句,prompt: true 时不破坏请求间 KV cache。设 prompt: false 可去掉提示句。

典型用法与边界

典型用法是:在已安装插件的 profile 下照常让智能体使用 bash;当智能体执行 grep、diff、test 等上述命令并得到语义上的 exit 1 时,会自动看到 [exit-code note: …],从而不必把「无匹配」当成故障再查一遍。

插件不会隐藏退出码或把卡片变绿,模型仍看到真实状态。README 明确:尚未覆盖 PowerShell 与 Windows cmd。

结尾

dsh-exit-code-lens 针对 DSH 里「非零 exit code 被一律当失败」的工作流摩擦,用一行结果注解和可选系统提示,把常见命令的「答案型」退出码说清楚,适合经常让智能体在仓库里 grep、diff、做条件测试的 DSH 用户。

  • 社区目录页:https://www.skillhub.cn/plugins/YanYunCY/dsh-exit-code-lens
  • 源码与完整说明:https://github.com/YanYunCY/dsh-exit-code-lens
羽毛球分组比赛记分
小程序二维码

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

小夜