DeepSeek Harness Tool Palette:渐进式工具发现与按 Agent 解锁

前言

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 工具,搜索可以预览或解锁最匹配的已安装工具。

核心功能

  • 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,输出受 maxResultsdescriptionMaxChars 限制。

需要明确的是:工具隐藏是渐进披露,不是权限边界。解锁不会绕过 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、幻方没有官方从属关系。

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

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

小夜