前言¶
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:工具数量少于此值的组不处理,默认 3showDock:在输入框上方显示档位按钮,默认falseshowClear:在输入框上方显示独立的「立刻清空」按钮,默认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 作用域中的工具无法隐藏
- 按名字分组,工具改名可能导致漏配
- 界面双语,工具描述在启动时注册一次,可能仍为中文
局限¶
- 只能隐藏全局工具
- 按名字分组,改名可能导致漏配
- 开关会打断前缀缓存,尽量保持,需要反复切换时优先使用
only: - 自动收敛只在会话开始
- 失败方向是放开:契约异常或文件不可读时,工具全部回到可见状态
- 自愈只对「存在但被隐藏」的工具有效
- 界面双语,工具描述不是
退场条件¶
DSH 若实现原生按需加载,这个项目应当退场,而不是继续并行维护。
总结¶
工具抽屉通过按组收敛、自动分组、用量账本、关键词预开和自愈机制,在保持原生调用链路的前提下减少不必要的 token 占用。适合需要管理大量工具的 DSH 用户。