前言¶
在 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