dsh-tool-discovery:用三个入口做 DSH 渐进式工具发现

前言

在 DeepSeek Harness(DSH)里跑智能体时,宿主往往注册了大批工具。若首轮就把每个工具的完整 JSON Schema 全部塞进上下文,即使用不到的定义也会占 token,还会拉长模型首轮阅读成本。更麻烦的是,宿主侧工具升级可能在同一会话中途悄悄改掉模型已经读过的 wire 定义,模型很难判断「我现在看到的参数表」是否还和上一回合一致。

下面介绍社区插件 dsh-tool-discovery(维护者 KouzakiUmi,npm 包名 dsh-tool-discovery,manifest 主线版本 0.5.0)。它用固定的三个控制入口和「按需披露」策略,把首轮上下文压到有界摘要与默认初始集合,其余工具的真实 schema 在模型显式选定后的下一轮才出现;同一缓存周期内已披露内容只增不改,只有成功压缩才会重置周期。

这是什么

dsh-tool-discovery 是 DSH 分类为「工作流」的插件:Progressive tool discovery for DSH——三入口控制协议(tool_list / tool_search / tool_load),内核与宿主解耦(host-independent domain kernel + DSH adapter)。

它不替代 DSH 自身的工具审批、沙箱与权限链;内核不持有工具、也不绕过宿主。渐进式披露解决的是上下文占用与定义稳定性,不是执行速度。

核心功能

首轮只带必要的东西

首轮请求里只有三个固定入口、每类能力的简短摘要,以及默认初始集合的完整 schema:DSH 自带核心工具(手动基线)与当前 agent preset 登记的工具(默认保留)。其它普通工具首轮不披露,不占上下文。

三个入口

入口 回答的问题 改变激活集合?
tool_list 这个类别里有哪些可发现的工具? 否
tool_search 哪个工具适合当前任务? 否
tool_load 我要用这些工具。 是

tool_search 提供 Top-K 候选卡(短用途 + ref/revision);tool_list 提供分页的完整名称。两者都不改变激活集合。

tool_load 不会执行目标工具,只记录选择;真实 schema 的披露发生在下一轮,模型读到的定义与选择一致。未按需加载的普通工具会被拒绝;action: "unload" 会被拒绝,因此两次成功压缩之间已披露集合只增不减。

可通过 tool_load 回执与 view: "state" 投影查看 selected / advertised / invalidated,回答「现在到底激活了哪些工具」。

已披露的不被悄悄改写

健康 native 缓存周期内,已披露内容与顺序只增不改:首次披露时记录的 wire 会持续原样发送,宿主侧工具升级不会在会话中途静默改写模型已读定义。只有成功压缩(手动 /compact 或 DSH 自动压缩,且成功有摘要)才会重置周期。

冻结承诺目前限于 native 路径。同名新 schema 与已冻结定义冲突时,tool_load 返回 COMPACTION_REQUIRED,须等用户或 DSH 成功压缩后再加载。可选 PTC 兼容(ptcCompatibility)不保证 native 式逐字冻结;默认 PTC 旁路。

设置与配置面

安装并启用 bundle 后,在 设置 → 工具发现 可开关功能、管理全局工具目录(按名称筛选、勾选、恢复 DSH 默认),以及高级预算 / 语言字段。配置依赖 peer @deepseek-ai/schemastery;缺少时内核仍可运行,但无 Config 界面,插件记录 ConfigUnavailable。

插件无必需配置;常用扁平根字段示例(节选,完整见仓库 README「配置」节):

{
  "initialToolsEnabled": true,
  "alwaysAllowPresetTools": true,
  "ptcCompatibility": false,
  "locale": "auto"
}

若只希望三个发现入口、尽量少带初始工具,可设 alwaysAllowPresetTools: false 且 initialToolsEnabled: false,或配合 alwaysVisible 与 respectAlwaysVisible(详见 README)。三个入口本身不可删除。

安装与启用

环境要求

  • DSH Core >=0.2.1-alpha.1(dshReleases 中 0.2.1-alpha.1 与 0.2.1-alpha.2 标为 compatible,其它版本未测试)。
  • Node ^22.19.0 || >=24.0.0。
  • 每会话单个活动 agent;单会话内多 agent 并发不受支持。

DSH profile 安装(示例)

文档给出的是公共 CLI 的 Web profile 示例;web 需换成你实际目标 profile。安装时使用 GitHub Release 构建资产,<build-tag> 为提交级标签,例如 build-80216ba3effa:

dsh plugin --profile web add \
  "dsh-tool-discovery@https://github.com/KouzakiUmi/dsh-tool-discovery/releases/download/<build-tag>/dsh-tool-discovery.tgz"

更新已安装副本:

dsh plugin --profile web update \
  "dsh-tool-discovery@https://github.com/KouzakiUmi/dsh-tool-discovery/releases/download/<build-tag>/dsh-tool-discovery.tgz"

Node 项目也可 npm install dsh-tool-discovery(包自 0.2.1 起发布到 npm,当前资料中 npm 版本 badge 与 manifest 0.5.0 以 Release / 清单为准)。

经过上面的步骤:

  1. 安装并启用 bundle,按部署方式重载或重启(仅刷新页面不保证 Host 升级)。
  2. 在设置页按需调整工具目录与配置。
  3. 回到会话,三个入口即生效;每次工具调用仍走 DSH 原有审批与权限链。

桌面用户应使用目标安装提供的 CLI 与 profile,勿照搬文档中的内部 bootstrap 路径;详见 DeepSeek Harness 官方 CLI 插件管理与 Desktop 文档。

典型用法(会话内)

模型侧工作流可概括为:

  1. 用 tool_search 按任务意图检索 Top-K 候选,或 tool_list 分页浏览某类别下的工具名。
  2. 选定后调用 tool_load 登记要用的工具(不立刻执行)。
  3. 下一轮 请求中才会出现对应工具的完整 native schema,再按 DSH 常规范式发起工具调用。

需要确认当前披露状态时,使用 tool_load 的 state 投影查看 selected / advertised / invalidated。

适用场景与注意

适合谁: 工具注册表很大、希望首轮上下文可控、又需要模型在会话内按需「开工具」的 DSH 单用户单 profile 场景。

权限与边界(安装前宜读 README「权限与外部依赖」):

  • 插件不发起出站网络、不执行子进程、不读凭据;持久状态经 @deepseek-ai/dsh-storage-domain 落盘(每会话工具名名单等)。
  • 面向单用户、单 profile 构建与验证,不承诺多租户或共享部署中的隔离边界;会话历史与存储是受信任输入。
  • 插件以当前 DSH 进程权限运行;安装前应查看源码与 MIT 许可证,并钉住你验证过的 Release build-<sha> 标签。

兼容说明: native 为完整披露路径;PTC 默认旁路。开启 ptcCompatibility 时行为与 native 冻结承诺不同,生产环境请按 README「当前实现契约」自行验证。

结尾

dsh-tool-discovery 把「全量 schema 首轮灌入」改成「三入口 + 按需披露 + 周期内冻结 wire」,让大工具集下的 DSH 会话更省上下文、定义更可预期。进一步了解设计与契约见仓库 plugin/docs/。

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

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

小夜