dsh-reliability-guards:为小模型在 DSH 里加一层可验证的可靠性护栏

前言

在 DeepSeek Harness(DSH)里跑 Ollama 等 7–35B 量级本地模型时,常见现象是:工具明明失败,回答仍写「已成功」;声称「我查过了」却本回合没有任何 tool call;正文里出现工具结果里从未出现过的 DOI;回答半截结束或代码块未闭合。这些问题往往在用户读完一整段回复之后才被人工发现。

dsh-reliability-guards 是社区插件,维护者为 MathieuPortmann,分类为 admin-security。它在回合即将结束前,用确定性规则对照工具真实返回值检查最终回答;发现问题时在同一回合内给模型一次(每类规则最多一次,整回合默认最多 2 次)steering notice,让模型重写;仍未纠正的内容会在回答下方保留可见记录。插件还可在破坏性命令执行前弹出审批、拒绝把备份写到 /tmp,并提供 /explain 只读模式。维护策略为 best-effort,Issue 可能无人回复,欢迎 fork。

这是什么

一句话:面向 DSH 中小本地模型的 guardrails——在用户阅读前拦截虚假成功、无工具行动、未核实 DOI 等,并约束危险操作与只读讲解场景。

  • 目录页:https://www.skillhub.cn/plugins/MathieuPortmann/dsh-reliability-guards
  • 源码与文档:https://github.com/MathieuPortmann/dsh-reliability-guards
  • 许可证:MIT(package.json / README)

回合结束前的规则检查

当回合即将关闭时,插件用纯规则比较「最终回答」与「本回合工具实际返回」。触发时会收到 steering notice 并重写;Web UI 会在有 finding 的回合下展示看到了什么、模型是否已纠正(英文与法文 UI)。规则同时覆盖英文与法文表述。

Code 触发条件(摘要)
falseSuccess 回答声称成功,但存在失败或未补过的 tool call(含 shell [exit code: N])
actionWithoutTool 出现「我检查过 / 我运行过…」且本回合 tool call 为零
announcedOnly 宣布要做某事(如「让我查一下:」)但未调用任何工具
deniedCapability 声称「无法访问…」而请求里已有合适工具
unverifiedDoi 回答中的 DOI 未出现在任何 tool result;Harness 依次查 OpenAlex、Crossref,仅「未知 DOI」才通知(网络错误不算编造)
foreignScript 回答出现用户未使用的 CJK 字符
markupLeak 工具调用被写成纯文本(如 <tool_call>、<function=...>、</think>)
cutAnswer 回答句中截断或未闭合代码块
emoji(默认关) 用户未使用的 emoji
frenchSpelling(默认关) 拼写错误,离线用 enchant-2 检查

默认每回合最多 2 次 steering notice(maxNudgesPerTurn),每类 code 每回合至多一次。

工具运行前与 Skill 行为

破坏性操作审批(可配置 destructiveAsk):对破坏性 shell(如 rm、mv、git reset --hard、git push --force、dd、向已存在文件 >、cp 覆盖已存在文件等)以及对已存在文件的 write 弹出审批卡片;新建文件不询问。插件只读 statSync 判断目标是否已存在;读失败时视为不存在,不弹审批。

拒绝 /tmp 备份(tmpBackupDeny):备份到 /tmp 会被拒绝并说明原因(该目录在命令之间会被清空)。

/explain 只读模式(explainMode):仅允许白名单内的工具(读、搜、提案等);其余一律拒绝,含后续新增工具。输入 /explain off 退出。需安装 skill:

cp -r skills/explain ~/.dsh/skills/

或复制到 $DSH_HOME/skills。

Skill 指令在摘要后保留(keepInvokedSkills):自动摘要隐藏了用户调用的 skill(如 /word)说明时,会重新发送。

安装与启用

环境要求(README Compatibility):

  • Node.js:^22.19.0 || >=24.0.0
  • DSH:>=0.2.0-rc.2 <0.3.0
  • 平台:Linux(插件作者侧测试);插件本身为纯 JavaScript,无 native addon

官方安装方式:

dsh plugin --profile web add dsh-reliability-guards
# or straight from GitHub:
dsh plugin --profile web add github:MathieuPortmann/dsh-reliability-guards

安装后需重启对应 profile。当前 package 版本为 0.1.0;作者在 disposable profile 上验证过与 DSH 0.2.0-rc.2、Node 22.23 的组合(见 README Verification)。

配置

在 profile 的 cordis.patch.yml 中配置行 reliability-guards。各 guard 均可单独开关:falseSuccess、actionWithoutTool、announcedOnly、deniedCapability、unverifiedDoi、cutAnswer、foreignScript、emoji、frenchSpelling、destructiveAsk、tmpBackupDeny、explainMode、keepInvokedSkills。

Key 默认 含义
maxNudgesPerTurn 2 每回合 steering notice 上限
doiTimeoutMs 15000 单次 DOI 存在性检查超时
spellAllow [] 拼写检查额外允许词
explainAllow [] /explain 下额外允许的工具
llmBodyTimeoutMinutes 0 慢本地模型时提高 HTTP body 超时(0 为 Node 默认,约 5 分钟)

规则细节见仓库 SPEC.md。

权限与外部依赖

插件以当前 DSH 进程权限运行;安装前建议阅读源码与 MIT 许可证。能力边界(README Permissions)摘要如下:

  • 只读文件:判断覆盖目标是否存在;失败时不弹审批。
  • 不写文件:状态在 DSH session log,插件自身不落盘。
  • 网络:仅 lib/doi.js 对未出现在 tool result 中的 DOI 请求 api.openalex.org 与 api.crossref.org;超时或网络错误不判为编造 DOI。
  • 命令:仅当开启 frenchSpelling 时通过 execFile 调用固定参数的 enchant-2;缺程序或词典则跳过检查。
  • 模块加载:从当前 DSH 安装加载 zod、@deepseek-ai/dsh-llm、@deepseek-ai/schemastery、@deepseek-ai/dsh-skill 等;undici 可选。

插件不替模型执行命令,也不新增 tool;主要作用是检查、steering、拦截与审批。

适用场景与注意

适合:本地小模型为主、希望减少「假成功」与幻觉引用、又需要在同一回合内自动纠偏的 DSH Web profile 用户;需要在讲解场景强制只读、或在破坏性 shell / 覆盖写入前人工确认的环境。

注意:

  • DSH 版本需落在 >=0.2.0-rc.2 <0.3.0;与 0.3 及以上是否兼容需自行对照上游变更。
  • frenchSpelling 依赖系统 enchant-2,默认关闭。
  • DOI 校验会产生对外 HTTP 请求;离线或防火墙环境需预期行为。
  • 社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系;插件同样为社区维护、best-effort。

结尾

经过上面的步骤,你可以在不大改 prompt 的前提下,用确定性规则在回合关闭前拦住小模型常见的可靠性问题,并用审批与 /explain 收窄破坏性与越权工具调用。详情与 issue 见 GitHub 仓库;浏览与安装入口见 SkillHub 目录页:

  • https://www.skillhub.cn/plugins/MathieuPortmann/dsh-reliability-guards
  • https://github.com/MathieuPortmann/dsh-reliability-guards
羽毛球分组比赛记分
小程序二维码

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

小夜