dsh-tool-deny: Hide or Deny Specified Tools by Agent Preset

前言

在 DeepSeek Harness(DSH)里,挂在 profile 根上的插件会把工具注册成全局可见,每个 agent preset 都会继承。preset 可以再加插件,却没有「从列表里拿掉某个全局工具」的内建开关。其它插件若强行给所有 preset 挂上搜索、翻译、删库之类能力,既占上下文 token,也可能和「极简对话」「只读审查」等角色设定冲突。

dsh-tool-deny 用几行 YAML 补上这块缺口:按 preset 从模型侧工具列表里移除指定工具,或在保留列表的前提下拒绝调用,还可以 blank 掉插件写入的全局 system prompt 段落。

这是什么

dsh-tool-deny 是社区维护的 DSH 插件(维护者 hhuangpanda,分类 admin-security),发布在 npm,源码在 GitHub。它不改变其它插件是否加载,只控制「当前 agent 能看到哪些工具定义」以及「哪些 tool call 会在执行层被拒绝」,从而减轻因多余工具定义带来的 context 膨胀。

核心功能

配置项与作用如下(与 README 一致):

配置项 配置位置 作用
hideByPreset profile 根插件行 映射 preset id → 工具名列表,从该 preset 的模型工具列表中移除
hide 某个 preset 的 plugins 行 对挂载该行的 preset 做同上移除
deny 某个 preset 的 plugins 行 工具仍出现在列表中,但每次调用被拒绝
hideSections 根或 preset 按段落名 blank 全局 system prompt 中的对应 section

根行若设置了 hideByPreset,同行的 hide / deny 会被忽略并打 warning。被 hide 的工具定义不会发给模型,不消耗相关 token;其它 preset 不受影响。子 agent、自动化运行与恢复会话也在覆盖范围内。

hide 与 deny 怎么选: 优先 hide——模型看不到工具,也省 token。对通过 agent.ctx 在每个 agent 上直接注册、hide 够不着的那类工具,用 deny;调用时返回类似 "工具名" is not available to this agent. 的拒绝信息。

hideSections: 部分插件会向 system prompt 追加全局段落;可用段落名(由注册该段的插件定义,例如 my-plugin:notes)对同一批 agent 清空内容。

安装与启用

环境要求:package.json 标明 Node >=22,DSH >=0.2.1-rc.1 <0.3.0-0;README 写明在 dsh 0.2.1-rc.4 上测试。许可证 MIT。

安装命令(profile 示例为 web,请换成你的 profile 名):

dsh plugin --profile web add dsh-tool-deny

安装后若不写配置,插件不会生效。修改 cordis.patch.yml 后需重启 dsh。

典型用法

在 profile 根按 preset 隐藏工具

假设某插件全局注册了 image_search 与 translate,希望 minimal 两个都不要,reviewer 只要去掉 translate:

- insert:
    - id: tool-deny-root
      name: dsh-tool-deny
      config:
        hideByPreset:
          minimal:
            - image_search
            - translate
          reviewer:
            - translate

重启后,新开的 minimal 会话看不到上述工具;reviewer 看不到 translate;其它 preset 仍保留两者。

多个 preset 共用同一列表时,可用 YAML anchor:

hideByPreset:
  minimal: &extra-tools
    - image_search
    - translate
  reviewer: *extra-tools

在 preset 内使用 hide / deny

适合规则只跟某个 preset 走,或需要 deny 的场景。把插件行加进该 preset 的 plugins:

- id: tool-deny
  name: dsh-tool-deny
  config:
    hide:
      - image_search
    deny:
      - delete_records

image_search 从列表消失;delete_records 仍可见但不可调用。

同时隐藏工具与 prompt 段落

config:
  hideByPreset:
    minimal:
      - image_search
  hideSections:
    - my-plugin:notes

在根配置里,hideSections 会作用于 hideByPreset 里列出的每个 preset。

适用场景与注意

适合谁: 已在 profile 根装入了「全家桶」类插件,但希望部分 preset 保持工具面极简;或需要让危险工具对模型可见(便于 UI/日志)却在执行层硬拒绝的场景。

机制简述(便于排查): 根模式下插件监听 agent/created 与 agent-preset/selected,按 preset 对 agent 调用 ctx.tools.restrict({ deny });dsh 组装工具列表时过滤 hide 项。deny 走 ctx.tools.guard,在执行时拦截。

局限(README 原文要点):

  1. 失败较「安静」——删掉配置行或插件未加载时工具会回来且无报错,不宜作为敏感 agent 的唯一安全边界。
  2. 列表按工具名匹配;插件升级新增工具名需手动补进配置。
  3. hide / hideByPreset 里不存在的工具名会 warning 后忽略;deny 里拼错的名字无 warning、也不会匹配,需自行核对拼写。
  4. 隐藏的是工具,不是插件进程;插件若还通过 provider 等方式起作用,不受 hide 影响。
  5. preset 切换可能导致个别工具(如 subagent)丢失,属 dsh 行为;新开 session 可恢复。

插件以当前 dsh 进程的权限运行;安装前建议阅读源码与 LICENSE,确认符合你的安全策略。

结尾

dsh-tool-deny 用 YAML 把「全局插件带来的工具」收束到 preset 粒度,hide 省 token,deny 兜住 ctx 直挂的工具,hideSections 可顺带减掉多余的 system 段落。

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

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

Xiaoye