审批卡 · 拒绝说明(approval-note-card):拒绝工具调用时把理由交给模型

前言

在 DeepSeek Harness(DSH)里,工具调用往往需要你在审批卡里点「允许」或「拒绝」。原生卡片只有这两种结论:拒绝等于一次否定,模型收不到你心里的约束——例如「别整盘遍历」「别动系统文件」「先说明你要做什么」。模型只能根据上下文猜下一步,常见结果是换工具、换目录,或去碰更敏感的路径。这不是恶意,是信息不够。

下面介绍的 approval-note-card 由社区维护者 SilverCrossing 发布,在拒绝前增加一个输入框,把你写的说明作为用户消息送进当前对话,再执行拒绝。说明以用户级权重送达,模型更容易按你的方向调整,而不是自行脑补。

这是什么

approval-note-card 是纯客户端 DSH 插件:宿主侧入口为空实现,界面在 client.js 里注册到 conversation.composer。它不改变「只拒绝这一次调用」的语义,只是在拒绝前多一步——把短说明通过 session.prompt(content, 'steer') 写入当前这一轮。

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 为准核对。

典型用法

  1. 模型发起需要你审批的工具调用,界面出现本插件扩展后的审批卡。
  2. 若仅不同意本次调用、无需补充说明,点 拒绝 或 允许一次,与原生相同。
  3. 若希望模型知道「为什么不行」,在输入框写好约束或方向,点 拒绝并说明(或 Enter 发送说明)。说明会先作为 steer 类用户消息进入当前轮,再完成拒绝。
  4. 观察模型后续是否按说明调整;若守卫或会话策略有变,见下一节注意事项。

README 中给出的说明示例包括:「别用遍历」「别动系统文件」「先解释你要做什么」——可按你的项目规范写更具体的规则。

适用场景与注意

适合谁

  • 经常在 DSH 对话里审批 Shell、文件、网络等工具调用的开发者。
  • 希望拒绝时给出可执行的约束,减少模型猜错方向、反复试探敏感路径的情况。

与守卫配置的关系(必读)

说明经 session.prompt(content, 'steer') 进入当前这一轮。若宿主侧守卫在拒绝时取消整轮(onReject: turn),inbox 会被清空,说明会丢失。

  • 守卫保持 onReject: call(拒绝但不停本轮)→ 说明可正常送达。
  • 守卫为 onReject: turn → 本插件这条通道失效,需改走宿主侧旁路或其它机制。

安装前请确认你的 DSH 守卫与审批策略与上述行为一致。

已知限制(仓库 README)

  1. 未接入 conversation.approval.detail 槽,卡片内看不到 Tool 详情 / diff;守卫提供的 displayReason 通常已含路径或命令,一般够用。
  2. Enter 在 textarea 上通过 stopPropagation 拦截;若页面把 Enter 绑定为「允许」,是否与该拦截完全兼容需在实际页面实测。
  3. 客户端 UI 需在浏览器环境中点击验证,无法在纯无 UI 环境完整自测。

结尾

approval-note-card 在原生「允许 / 拒绝」之上补了一格:拒绝时把理由当用户消息交给模型,减轻「只说不行、不说怎样才行」带来的猜测成本。使用前核对守卫的 onReject 策略,并从仓库阅读最新 README。

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

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

Xiaoye