DSH Tool Router:用按需揭示工具 schema 降低 prefill 成本

前言

在 DeepSeek Harness(DSH)里给智能体挂载一批工具时,默认做法往往是在会话一开始就把所有工具的 JSON Schema 一并塞进模型的 prefill。工具越多,首 token 之前的 prompt 评估时间越长,上下文窗口里还没开始干活就先占掉一大块预算。小模型还要同时「记住」十几条互不相关的工具约束,出错率也容易上去。

下面介绍社区插件 DSH Tool Router(维护者 residenthiago2011),它把「整架工具栏 upfront 暴露」改成「只注册一个 find_tool,需要哪把工具再揭示那一个 schema」,并通过独立的 decision model API(POST /v1/systemone)做选型。插件归类为工作流,可在 SkillHub 目录页 查看条目;源码与说明见 GitHub 仓库。

这是什么

DSH Tool Router(npm 包名 @local/dsh-tool-router,当前资料中的版本为 1.1.0,许可证 MIT)面向 DSH 的懒加载式工具发现:在 prefill 阶段不向模型发送每一个已挂载工具的 schema,只保留一个较小的 find_tool schema;当模型需要调用工具时,由路由插件经决策接口选出(或短列表提示)恰好一个工具,再临时揭示其 JSON Schema。

与 DSH Standard 预设相比,README 在「新会话、首条消息」场景下给出了平台侧报告的对比(同一测量后端):Standard 约 6,559 prefill tokens、系统提示约 5,816 字符、 upfront 26 个工具 schema;启用本插件 bundle 的 no-prefill 预设约 283 prefill tokens、系统提示约 372 字符、 upfront 1 个 schema(find_tool)。README 同时写明:若会话后期几乎用遍所有工具,差距会缩小;未使用的工具栏一半仍会在默认配置里从第一句话起计费。

核心功能

三阶段路由

插件在 index.js 中注册 find_tool,并对其余工具按 agent 做掩码,整体流程分三阶段(资料原文表述):

  1. Stage 0(全量候选面) — 对每个已挂载工具(默认 Standard 配置下 README 举例为 ≤24 个)附带约 160 字符的 criterion,并按去停用词后的词法排序;排序主要用于约束异常大的挂载规模。
  2. Stage 1(决策请求) — 向决策模型 API 发送一次 POST /v1/systemone,得到 bestTool 选择;另有 usable 字段仅作遥测。README 称在设备上约 235–500 tokens、约 6–7 s。
  3. Stage 2(接受或短列表) — 当 confidence >= 0.70 时返回胜出工具的 JSON Schema,并只揭示这一个工具;否则返回按概率排序的短列表,理由中会点名最接近的匹配,便于模型用精确工具名重试(或发空请求获取完整目录)。若请求里已是精确工具名,则跳过决策调用并立即揭示。

Bundle 补丁内容

选择插件 bundle 时会应用 cordis.patch.yml,主要包括:

  • preset-no-prefill:仅由 persona + dsh-tool-router 组成的 agent 预设;persona 要求模型先调用 find_tool,若结果不带 schema,则用精确工具名或空请求重试,而不是直接放弃。
  • 启用若干 host 工具行:如 tool-bash、tool-fs、tool-fs-search、tool-todo、tool-web 等设为 disabled: false,并插入 present 行;发现机制需要工具在宿主侧存在,预设范围内的注册会遮蔽 host 侧同名项,其他预设不受影响。瘦预设下 Agent Presets 页面主要只展示 find_tool。

配套文件

文件 作用
index.js 注册 find_tool、掩码其他工具、执行三阶段决策
cordis.patch.yml 预设声明与 host 工具启用
tool-registry.json Stage 0 标签与 Stage 1 准则(README 称 25 个工具,含 bash 等 shell)

README 还强调:find_tool 须用标准 JSON Schema(type/properties/required/additionalProperties)注册,否则模型可能以 {} 调用。

安装与启用

环境要求

  • DSH 0.2.0-rc.2 及以上(需支持 dsh.bundle.patch 的 bundles 机制)。
  • 可访问的 decision model API,协议为 POST /v1/systemone。默认地址为 http://127.0.0.1:8081/v1/systemone;改 host 或端口需编辑 index.js 中的 ROUTER_BASE。
  • 运行 DSH 的主机 PATH 上有 pnpm(插件管理器通过 pnpm 安装,CLI 会转发 pnpm 参数)。

安装命令

从 GitHub 安装(README 推荐) — 在 Plugins → install → spec 中填写:

git+https://github.com/residenthiago2011/DSH-Tool-Router.git

或使用 CLI(将 <profile> 换成你的 profile 名):

dsh plugin --profile <profile> add git+https://github.com/residenthiago2011/DSH-Tool-Router.git

从预构建 tarball — 在 Releases 下载 dsh-tool-router.tgz 后:

dsh plugin --profile <profile> add /path/to/dsh-tool-router.tgz

安装后于 Plugins 页面选择对应 bundle(安装后默认启用);若 profile 未开 HMR,需重启 DSH。

卸载

在 Plugins 页面取消选择或移除 bundle;预设行与 host 工具翻转会随 patch 撤销,其他预设不变。

典型用法

启用 no-prefill bundle 后,智能体侧的使用模式由 persona 约定,而不是再直接看到整排工具 schema:

  1. 模型先调用 find_tool,用自然语言或任务描述表达「想用什么能力」。
  2. 路由插件完成 Stage 0–2;置信度足够时返回单个工具的 schema,模型再按该 schema 发起真正的工具调用。
  3. 若返回短列表或无 schema,按 README:用短列表中的精确工具名再次请求,或发空请求获取目录提示;精确工具名路径会跳过决策 API,立即揭示。

本地验证时,仓库提供测试脚本(需决策端点在 127.0.0.1:8081 时跑通 e2e):

node router-import-test.mjs   # 模块结构(无外部依赖)
node rank-sim.mjs             # Stage 0 排序(依赖 tool-registry.json)
node router-e2e-test.mjs      # 全流程;期望输出 ALL_PASS

适用场景与注意

更适合:工具栏较大、但单轮对话往往只用到少数几个工具;关心首字延迟和 context 预算;愿意在本地或内网部署 SystemOne 风格的 POST /v1/systemone 决策服务。

需要接受的成本:每次通过 find_tool 选型(非精确工具名快路径)会多一次决策 API 往返;README 给出的量级约为数百 tokens 与数秒级延迟。没有决策端点时,Stage 1 无法按设计工作。

安全与合规:DSH 插件以当前 dsh 进程权限运行。安装前请自行阅读 GitHub 源码 与 MIT 许可证,确认 ROUTER_BASE、bundle 启用的 host 工具与决策服务暴露范围符合你的环境策略。SkillHub 等社区目录与 DeepSeek / 幻方无官方从属关系,插件来源以维护者仓库为准。

结尾

DSH Tool Router 把「26 个 schema 先灌进 prefill」换成「一个 find_tool + 按需揭示」,在 README 记录的 Standard 对比下,首条消息 prefill 可从约 6.5k tokens 降到约 283 tokens,并把工具选择交给 POST /v1/systemone 决策链。若你正在 DSH 上堆工作流类工具且被 prefill 拖慢,可按上文命令安装 bundle,并准备好决策 API 与 pnpm 环境。

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

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

Xiaoye