前言¶
在 DeepSeek Harness(DSH)里,工具调用往往需要你在审批卡里点「允许」或「拒绝」。原生卡片只有这两种结论:拒绝等于一次否定,模型收不到你心里的约束——例如「别整盘遍历」「别动系统文件」「先说明你要做什么」。模型只能根据上下文猜下一步,常见结果是换工具、换目录,或去碰更敏感的路径。这不是恶意,是信息不够。
下面介绍的 approval-note-card 由社区维护者 SilverCrossing 发布,在拒绝前增加一个输入框,把你写的说明作为用户消息送进当前对话,再执行拒绝。说明以用户级权重送达,模型更容易按你的方向调整,而不是自行脑补。
这是什么¶
approval-note-card 是纯客户端 DSH 插件:宿主侧入口为空实现,界面在 client.js 里注册到 conversation.composer。它不改变「只拒绝这一次调用」的语义,只是在拒绝前多一步——把短说明通过 session.prompt(content, 'steer') 写入当前这一轮。
- 维护者:SilverCrossing
- 仓库:GitHub · SilverCrossing/approval-note-card
- 社区目录:skillhub.cn · approval-note-card
- 许可证:MIT(见仓库
package.json) - 引擎要求:
dsh>= 0.2.0
DSH 生态主张「一切皆插件」;skillhub 等目录是独立社区站点,与 DeepSeek / 幻方无官方从属关系。安装前请自行查看源码与许可证——插件随当前 DSH 进程权限运行。
核心功能¶
拒绝时的两种路径¶
与原生审批卡对齐的操作包括:
- 拒绝:只否定本次调用,行为与官方一致。
- 允许一次:与原生一致。
- 拒绝并说明:先把输入框文字作为用户消息发给模型,再拒绝。输入框为空时该按钮不可用。
说明内容可以是任意短句,例如约束工具用法、禁止访问某类路径、要求先解释计划等。消息是用户消息而非工具错误文本,模型默认会当作你的意图处理。
输入与快捷键¶
- Enter:发送说明(在「拒绝并说明」流程中使用)。
- Shift+Enter:换行。
- 中文输入法 composing 期间不会误触发 Enter 发送。
失败与回退¶
- 在
/plugins中禁用或卸载本插件后,官方ui-approval仍在,界面退回原生审批卡。 - 待审批对象形状不符合预期(
kind/answer/answerable等不满足)时,select返回null,同样退回原生卡。 - 说明发送失败时,卡片保持打开并显示错误,不会出现「已拒绝但没把说明送出去」的静默状态。
安装与启用¶
安装命令以仓库 README 为准,需指定 commit(将 <commit> 换成目标提交的 hash):
dsh plugin --profile desktop add github:SilverCrossing/approval-note-card#<commit>
上述命令针对 --profile desktop 配置;添加后按你平时的 DSH 插件启用流程即可。当前 package 版本为 0.1.0,以仓库 tag / commit 为准核对。
典型用法¶
- 模型发起需要你审批的工具调用,界面出现本插件扩展后的审批卡。
- 若仅不同意本次调用、无需补充说明,点 拒绝 或 允许一次,与原生相同。
- 若希望模型知道「为什么不行」,在输入框写好约束或方向,点 拒绝并说明(或 Enter 发送说明)。说明会先作为 steer 类用户消息进入当前轮,再完成拒绝。
- 观察模型后续是否按说明调整;若守卫或会话策略有变,见下一节注意事项。
README 中给出的说明示例包括:「别用遍历」「别动系统文件」「先解释你要做什么」——可按你的项目规范写更具体的规则。
适用场景与注意¶
适合谁¶
- 经常在 DSH 对话里审批 Shell、文件、网络等工具调用的开发者。
- 希望拒绝时给出可执行的约束,减少模型猜错方向、反复试探敏感路径的情况。
与守卫配置的关系(必读)¶
说明经 session.prompt(content, 'steer') 进入当前这一轮。若宿主侧守卫在拒绝时取消整轮(onReject: turn),inbox 会被清空,说明会丢失。
- 守卫保持
onReject: call(拒绝但不停本轮)→ 说明可正常送达。 - 守卫为
onReject: turn→ 本插件这条通道失效,需改走宿主侧旁路或其它机制。
安装前请确认你的 DSH 守卫与审批策略与上述行为一致。
已知限制(仓库 README)¶
- 未接入
conversation.approval.detail槽,卡片内看不到 Tool 详情 / diff;守卫提供的displayReason通常已含路径或命令,一般够用。 - Enter 在 textarea 上通过
stopPropagation拦截;若页面把 Enter 绑定为「允许」,是否与该拦截完全兼容需在实际页面实测。 - 客户端 UI 需在浏览器环境中点击验证,无法在纯无 UI 环境完整自测。
结尾¶
approval-note-card 在原生「允许 / 拒绝」之上补了一格:拒绝时把理由当用户消息交给模型,减轻「只说不行、不说怎样才行」带来的猜测成本。使用前核对守卫的 onReject 策略,并从仓库阅读最新 README。