前言¶
在 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 原文要点):
- 失败较「安静」——删掉配置行或插件未加载时工具会回来且无报错,不宜作为敏感 agent 的唯一安全边界。
- 列表按工具名匹配;插件升级新增工具名需手动补进配置。
- hide / hideByPreset 里不存在的工具名会 warning 后忽略;deny 里拼错的名字无 warning、也不会匹配,需自行核对拼写。
- 隐藏的是工具,不是插件进程;插件若还通过 provider 等方式起作用,不受 hide 影响。
- preset 切换可能导致个别工具(如
subagent)丢失,属 dsh 行为;新开 session 可恢复。
插件以当前 dsh 进程的权限运行;安装前建议阅读源码与 LICENSE,确认符合你的安全策略。
结尾¶
dsh-tool-deny 用 YAML 把「全局插件带来的工具」收束到 preset 粒度,hide 省 token,deny 兜住 ctx 直挂的工具,hideSections 可顺带减掉多余的 system 段落。