前言¶
在 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 做掩码,整体流程分三阶段(资料原文表述):
- Stage 0(全量候选面) — 对每个已挂载工具(默认 Standard 配置下 README 举例为 ≤24 个)附带约 160 字符的 criterion,并按去停用词后的词法排序;排序主要用于约束异常大的挂载规模。
- Stage 1(决策请求) — 向决策模型 API 发送一次
POST /v1/systemone,得到bestTool选择;另有usable字段仅作遥测。README 称在设备上约 235–500 tokens、约 6–7 s。 - 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:
- 模型先调用
find_tool,用自然语言或任务描述表达「想用什么能力」。 - 路由插件完成 Stage 0–2;置信度足够时返回单个工具的 schema,模型再按该 schema 发起真正的工具调用。
- 若返回短列表或无 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 环境。