dsh-tool-deny:按 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 段落。

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

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

小夜