dsh-loadout:按需加载工具组,控制 DSH 会话里的工具上下文

前言

DeepSeek Harness(DSH)采用「一切皆插件」的架构,工具一多,单次会话里模型每轮都要带上大量工具的完整 JSON schema。已抓取资料里提到:重度配置下工具 schema alone 可占约 73.3K token,甚至超过会话里所有文本内容的一半;token 消耗上升,模型选错工具的概率也会跟着上去。

下面介绍社区插件 dsh-loadout(维护者 YongjianWan,分类 admin-security)。它把工具分成常驻、按需组、观察区与长尾几档,默认只暴露一小撮核心工具,其余按组隐藏,需要时用一句话激活;并提供搜索与代理调用,兼顾准确性与安全边界。社区目录页在 skillhub.cn,源码与说明在 GitHub。目录站为独立社区站点,与 DeepSeek / 幻方无官方从属关系。

这是什么

dsh-loadout 是按需加载工具组的 DSH 插件:保留常驻核心,其余工具按组默认隐藏,需要时激活;并配合模式切换、读外网后切断外联等机制,减轻上下文膨胀、降低误调与外发风险。

2026-10-28 起,控制面主工具由 toolctl 更名为 loadout,配置文件与统计文件同步改为 loadout-*.json;旧文件在首次启动时会自动迁移,不丢配置与历史统计。

解决什么问题

插件把可见工具大致分为四档(资料原文表述):

  1. 常驻:文件读写、bash、搜索、skill、记忆读取等几乎每轮都会用的工具。
  2. 按需组:浏览器、办公、邮件、SSH、B 站、团队协作等,默认隐藏,通过 loadout activate 一句话放出。
  3. 观察区(trial):启动快照之后才出现的未认领工具,默认隐藏;调用满配置次数(默认 3 次)自动转正回可见。
  4. 长尾:没被任何规则认领的工具保持可见,用 tools_search 查找、tools_call 代理调用。

横切能力还包括:模式切换(如 coding / 写材料 / 运维 / 只读审阅,可在 config.modes 扩展);读外网切断外联——浏览器或网页读取类工具一调用,当轮可自动隐藏发邮件、ssh、发消息等外发组(默认关闭,需 cut: true 或面板开启),下一轮或满足条件后恢复,紧急可用 loadout {"action":"release"} 人工解除。

边界原则(资料强调):只藏「有人认领」的工具;隐藏必须由显式规则声明,未命中规则的一律可见,避免控制面工具被误藏导致无法解套。

核心工具

工具 作用
loadout list 看状态;activate / deactivate 开关组;mode / release 模式与切断;stats 调用频率;review 分档建议
tools_search 按关键词搜工具并返回完整 schema,支持中文(内置中英同义词桥接)
tools_call 按名字代理调用;外发、远程执行、删除类一律拒绝
browser 浏览器门面(navigate / click / type 等十二个动作);chrome-devtools 组未激活时的兜底入口

安装与启用

安装命令以 README 为准:

dsh plugin add dsh-loadout

也可在 DSH 插件管理器中安装。插件以当前 dsh 进程权限运行,安装前建议自行查看 仓库源码 与 MIT 许可证。

配置要点

配置文件路径:~/.dsh/loadout-config.json。面板修改即写该文件,保存后立即重新分组,不必重启。

最小示例(字段含义见 README 表格):

{
  "groups": [
    { "name": "email", "desc": "邮件:列信、读信、发送…", "prefixes": ["email_"] },
    { "name": "ops",   "desc": "宿主运维", "names": ["present", "workflow"] },
    { "name": "goal",  "desc": "长目标", "patterns": ["^(create|update|get)_goal$"] }
  ],
  "neverHide": ["loadout", "tools_search", "tools_call"],
  "hiddenGroups": null,
  "idleCalls": 30
}

groups 为 null 时使用插件内置规则;hiddenGroups 为 null 表示新会话默认隐藏全部按需组,写成数组后不在数组里的组默认可见。MCP 工具(mcp__<server>__<tool>)默认按 server 名自动成组,可用 mcpGroups: false 关闭。

插件管理器 → 本插件详情页 → 配置,提供分组、规则、会话、调用频率四个页签,可视化编辑规则与会话级开关。

典型用法

查看当前负载状态:

loadout {"action":"list"}

激活某一工具组(例如邮件):

loadout {"action":"activate","group":"email"}

切换内置模式之一(示例为写代码模式):

loadout {"action":"mode","mode":"coding"}

查看 schema 体量与调用统计(验收用):

loadout {"action":"stats"}

长尾工具可先 tools_search 再 tools_call;组内工具在隐藏状态下若误调,插件会在 UNKNOWN_TOOL 路径上给出自愈引导(仅对已归组且当前隐藏的工具)。

工作机制(摘要)

  • 启动时从 ctx.tools.schemas() 枚举注册表并归组;新 agent 创建时通过 ctx.tools.restrict({ deny }) 隐藏整组,dispose 后恢复。
  • 注册表变动(热装插件、MCP 重连)监听 tools/change 重新归组。
  • 一组激活后,连续 idleCalls 次工具调用未碰到组内工具则自动收回。
  • 全程 fail-open:异常路径优先解除全部隐藏,避免停在半隐藏状态。
  • gatedGroups 中的组(默认含 ssh / email / kimi-cu)激活需用户确认,模型需带 confirm:true 重试;面板上的用户操作不受此闸。

资料中的本机实测(2026-10-27,252 个工具同注册表):顶层会话可见 schema 约 2410 token(deny 210),子代理全量可见约 40053 token,约 16.6 : 1。子代理默认不隐藏(hideInSubagents: false),可按需改为 true。

适用场景与注意

适合: DSH 工具数量到百级、希望压缩每轮 schema、又需要按任务临时放开浏览器 / 邮件 / SSH 等能力的工作流;重视读外网后自动收外发组的安全习惯的用户。

注意:

  • restrict 管不到 agent 自身作用域注册的工具(如部分团队工具),它们会保持可见。
  • 改 hiddenGroups 只影响新会话,已建 agent 的隐藏状态不会因此重算。
  • 面板 state/config 端点要求本机回环与自定义头,经 remote-web-ui 隧道可能无法打开面板。
  • 已知限制与测试命令见 README:node tests/test-grouping.mjs、node tests/smoke.mjs 等。

结尾

dsh-loadout 用分组隐藏、激活、搜索与代理调用,把「全量工具 schema 每轮进上下文」压到可管理的规模,并在 admin-security 方向提供 gated 组、读外网切断外联等可选防线。需要细节时以仓库 README 与 docs/PRD.md 的产品行为规范为准。

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

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

小夜