DeepSeek Harness 工具抽屉插件

前言

DeepSeek Harness(DSH)的插件体系可以安装上百个工具,但工具表会持续膨胀。每轮对话中,模型都要读取所有工具的说明,即使真正用到的工具可能不到一半。这会占用大量上下文,并增加首字延迟。工具抽屉(Tool Drawer)处理的就是这件事:把平时用不上的工具组收起来,在需要时再放出来。

插件定位

  • 名称:dsh-tool-drawer(工具抽屉)
  • 维护者:kmyy350234-dz
  • 分类:工作流
  • 定位:按需收起工具组,避免不必要的 token 消耗

插件通过 DSH 的工具注册表接口 restrict({ deny: [...] }) 隐藏工具,只在需要时解除限制。整个过程不引入代理进程、向量检索或包装器,真实调用仍为原生调用。

核心功能

按组收敛

插件支持将工具按功能分成若干组,默认收起不活跃的组。每组包含以下字段:

  • id:组 id,用于工具调用
  • match:匹配式数组,普通字符串按 glob 处理(* 通配、整串锚定),re: 开头按正则处理
  • keep:有意保留可见的工具名,不会被判定为「漏网」
  • expect:该组应有的工具数量;对不上时 health 会警告
  • defaultOn:false 表示默认收起
  • autoHints:关键词表;用户消息中出现这些词时,在模型读取消息之前打开该组
  • title / hint:供 status 展示的标签

自动分组

autoGroups 模式让插件按工具名前缀自动建组。支持三种模式:

  • off:完全不动
  • suggest(默认):只在 lazy_tools_scan 里给建议,不改任何东西
  • on:自动建组,并按规则默认收起

建组规则包括:

  • 按 __ 或 _ 切段;子族合计覆盖 ≥80% 才往下切,否则保留整族
  • 同一前缀 ≥ minTools(默认 3)个才建组
  • 已被现有组覆盖 ≥80% 的前缀跳过
  • 核心工具永不入组(read / write / edit / pwsh / grep / glob / skill / todo_write / lazy_tools_* 等)
  • 只在会话开始时算一次,整场不变
  • 自动组 id 带 auto- 前缀,lazy_tools_status 里可见,lazy_tools_disable auto-xxx 可解散

工具列表

插件提供八个工具:

  • lazy_tools_status:查看每组状态(开关、模式、匹配数量、可见数量、是否热、上次使用时间)
  • lazy_tools_enable:打开一组;only: ['名字'] 只放指定工具,其余保持收起;groups: [...] 批量打开
  • lazy_tools_disable:收起一组,同时清除 only 白名单
  • lazy_tools_list:列出组内工具,包含当前被隐藏的
  • lazy_tools_resolve:只知工具名时使用:按名称或片段定位所属组,只放出该工具
  • lazy_tools_mode:仅修改当前会话策略;reset 回全局,collapse 立即清空
  • lazy_tools_scan:按名字前缀对可见工具分桶,便于编写新的组匹配式
  • lazy_tools_health:自检四个宿主契约,并输出 warnings、漏网工具、自动打开次数、自愈次数

healthy: true 表示四个契约均通过,无错误,无警告。

设置页

插件提供设置页,配置项包括:

  • level:收敛力度,默认 medium(中档,7 天)
  • presets:三档各自的天数,可修改,默认 {14,7,3}
  • idleDays:跟随 level,手动指定天数;0 表示不按时间收敛
  • minTools:工具数量少于此值的组不处理,默认 3
  • showDock:在输入框上方显示档位按钮,默认 false
  • showClear:在输入框上方显示独立的「立刻清空」按钮,默认 false

两个界面开关互相独立。控件按对话挂载,勾选后需切换一次对话(或刷新页面)才会出现。

组定义保留在 bundle 的 patch 中。设置页写入的策略保存在 ~/.dsh/lazy-tools.policy.json,优先级高于 YAML 默认值;删除该文件即回到默认。

安装与启用

插件以 bundle 形式提供,包含宿主半边和设置页的客户端半边。两种安装方式任选其一。

从 GitHub 直接安装:

dsh plugin --profile web add github:kmyy350234-dz/dsh-tool-drawer

或者 clone 到任意位置,使用插件管理器安装:

plugin_manager install_bundle  target: /你的路径/dsh-tool-drawer

bundle 自带的 patch 已配好四组:

组 收起数量 保留(永不收起)
桌面·看 19 无
桌面·点 37 无
浏览器·重 28 open / content / a11y / click / type / wait
视觉·重 8 describe / ocr / crop / bootstrap / materialize / present

改组成员可修改 cordis.patch.yml,配置改动重载生效;改宿主代码需要重启进程。

典型用法

查看当前各组状态:

lazy_tools_status

手动打开一组:

lazy_tools_enable 桌面·看

只放指定工具:

lazy_tools_enable only: ['read', 'write']

按片段定位并只放该工具:

lazy_tools_resolve read

自检插件健康状态:

lazy_tools_health

适用场景与注意

  • 适合工具数量较多、经常需要频繁切换任务场景的用户
  • 插件以当前 dsh 进程权限运行,安装前建议检查源码与许可证
  • 插件在会话开始时执行一次收敛决策,运行期间不重排,以避免打断前缀缓存
  • 只能隐藏全局工具,注册在 agent 作用域中的工具无法隐藏
  • 按名字分组,工具改名可能导致漏配
  • 界面双语,工具描述在启动时注册一次,可能仍为中文

局限

  1. 只能隐藏全局工具
  2. 按名字分组,改名可能导致漏配
  3. 开关会打断前缀缓存,尽量保持,需要反复切换时优先使用 only:
  4. 自动收敛只在会话开始
  5. 失败方向是放开:契约异常或文件不可读时,工具全部回到可见状态
  6. 自愈只对「存在但被隐藏」的工具有效
  7. 界面双语,工具描述不是

退场条件

DSH 若实现原生按需加载,这个项目应当退场,而不是继续并行维护。

总结

工具抽屉通过按组收敛、自动分组、用量账本、关键词预开和自愈机制,在保持原生调用链路的前提下减少不必要的 token 占用。适合需要管理大量工具的 DSH 用户。

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

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

小夜