前言¶
DSH 的理念是「一切皆插件」,但裝的東西一多,一個現實問題就擺在面前:每個插件、每個 MCP 服務器都會向每次模型請求貢獻一批工具 schema。列表越長,重複的工具前綴成本越高,模型在一長串工具裏挑對目標也越難。
DeepSeek Harness Tool Palette 的做法相反:每個 Agent 啓動時只帶一個 tool_search 加一份部署選定的基礎工具,其餘已安裝的全局工具先隱藏,等模型搜索到對應能力時再解鎖,供後續步驟使用。下面介紹這個插件的具體機制、安裝方式和使用邊界。
這是什麼¶
Tool Palette 由 lizhecome 維護,npm 包名爲 @lizhecome/dsh-tool-palette,當前版本 0.1.0,許可證 MIT。一句話定位:爲 DSH 提供漸進式工具發現與按 Agent 的解鎖。
它做兩件事:
1、爲每個活躍 Agent 維持一份精簡的工具面板;
2、向模型暴露 tool_search 工具,搜索可以預覽或解鎖最匹配的已安裝工具。
核心功能¶
tool_search 的參數¶
query:非空的能力、操作、工具名或參數搜索詞;unlock:默認true;設爲false時只返回匹配結果,不改變當前面板。
解鎖生效後,可見 schema 集合從下一步起改變,解鎖的工具進入後續步驟。
確定性詞法排序¶
匹配是確定性詞法搜索,不是 embeddings,也不調用 LLM。排序順序固定:
1、精確工具名;
2、名稱片段;
3、完整描述匹配;
4、參數文本;
5、單個查詢單詞。
默認 bundle 配置¶
自帶的 cordis.patch.yml 在任何搜索發生前保持這些標準 DSH 工具可見:
alwaysVisible:
- read
- glob
- grep
- exit_plan_mode
- todo_write
maxResults: 8
maxQueryChars: 400
descriptionMaxChars: 240
tool_search 始終包含,不得在 alwaysVisible 裏重複出現。配置的基礎工具名會在 Agent 被採用時校驗,缺失名稱會顯式報錯,而不是悄悄縮小面板。
每個 Agent 一條可逆限制¶
每個活躍 Agent 擁有一條可逆的允許列表限制。子 Agent 解鎖某個隱藏的全局工具時,會同時放寬相交的祖先限制,使該工具可達;兄弟 Agent 保持隔離,不會因此獲得這個工具。Agent 自身作用域內註冊的工具在其作用域內本來就可見,不屬於目錄搜索結果。
生命週期¶
插件加載時接管已存在的 Agent,並監聽後續的 agent/created 事件;Agent 銷燬時清理對應狀態;插件卸載或熱重載前解除所有限制,恢復原有工具面。
解鎖狀態是進程內且 advisory 的:不寫入 Session 日誌,Agent 或插件重建後會重置。
Code Mode¶
Code Mode 下,保留的 run_code 傳輸始終可見。解鎖後,下一次生成的 tools SDK 會包含該工具;原生函數調用則經普通 schema 遵循同一份面板。
資源與安全邊界¶
插件不發起網絡請求、不讀文件、不啓動子進程、不存儲憑據;目錄搜索只檢查 ToolRuntime 的分離全局 schema,輸出受 maxResults 和 descriptionMaxChars 限制。
需要明確的是:工具隱藏是漸進披露,不是權限邊界。解鎖不會繞過 tools/pre-execute、單調守衛、審批、沙箱、文件系統觀察、截止時間或工具自身的校驗。
安裝與啓用¶
倉庫爲私有,需要用已認證的 GitHub CLI 會話克隆,再把 checkout 安裝進 DSH profile:
gh repo clone lizhecome/deepseek-harness-tool-palette
cd deepseek-harness-tool-palette
dsh plugin --profile web add --ignore-workspace-root-check .
--profile web 可以按需換成 headless 等其他 profile。bundle 會被追加到 profile 現有 bundle 之後。
典型用法¶
先看兩個 README 給出的模型請求示例。這一句讓模型先找工具再幹活,默認解鎖:
Find a tool that can write a file, then create notes.txt.
即查找可寫文件的工具並創建 notes.txt。
這一句只搜索、不解鎖,對應 unlock: false 的行爲——返回匹配,面板不變:
Search the installed tools for subagent delegation without unlocking anything.
即只搜索子代理委派能力、不解鎖任何工具。
如果想要最小面板,在 profile patch 中覆蓋 bundle 行:
- id: tool-palette
config:
alwaysVisible: []
maxResults: 6
maxQueryChars: 300
descriptionMaxChars: 180
適用場景與注意¶
適合的部署:插件與 MCP 服務器裝得多、每次請求都拖着一長串工具 schema;多個 Agent 並存、希望工具面互相隔離。
使用前把這幾條邊界弄清楚:
1、搜索只覆蓋全局 ToolRuntime schema,Agent 本地工具不在目錄結果裏;
2、解鎖不持久,Agent 或插件重建後重置;
3、可見 schema 集合從下一步起改變模型請求前綴,provider 的 KV-cache 複用只能通過前面的公共前綴繼續;
4、隱藏不是防護,安全決策仍應交給守衛、審批、沙箱等既有機制;
5、插件以當前 dsh 進程的權限運行,安裝前應檢查源碼與許可證(MIT)。
本地開發¶
本地構建與驗證需要 Node.js 24 和 pnpm 10.15.0:
pnpm install --frozen-lockfile
pnpm run check
npm pack --dry-run
小結¶
Tool Palette 用一個 tool_search 和固定規則的詞法排序,把「全量工具隨每次請求下發」換成「基礎面板 + 按需解鎖」,同時保持 Agent 間隔離與可清理的生命週期。工具裝得多的 DSH 部署值得試一試。
- 社區目錄頁:https://www.skillhub.cn/plugins/lizhecome/deepseek-harness-tool-palette
- GitHub 倉庫:https://github.com/lizhecome/deepseek-harness-tool-palette
skillhub.cn 是獨立的社區目錄站點,與 DeepSeek、幻方沒有官方從屬關係。