dsh-experts:把专家团写成数据目录,自动注册为 dsh 可路由的 skill

前言

做智能体编排时常见的麻烦是:专家的人设、分工和上报规则散落在提示词和代码里,想换一个评审阵容就得改引擎。dsh(DeepSeek Harness)的理念是「一切皆插件」,libinyam/dsh-experts 沿着这个思路把「专家团」做成了用户可写的数据目录:每个团队自动注册为模型可路由的 skill(experts-<团队名>),引擎与阵容分离。下面介绍它的设计、安装和用法。

这是什么

dsh-experts 是 libinyam 维护的 dsh 多专家插件,MIT 协议。一句话定位:把专家人设清单变成 dsh 原生 skills——团队发现、校验和工作流协议在插件里,专家人设与升级路由在团队目录里。设计参照 Qoder 专家团 / WorkBuddy Expert Teams 的产品形态,协作协议继承自作者此前的 github-project-review-skill(升级路由矩阵、数据门控决策、分层输出深度),改建于 dsh 原生能力(skills provider、可继续 child、嵌套 subagent、消息和 report 通道)之上。

工作原理

插件按 rank 分层扫描团队目录,同名团队就近覆盖:

1、项目 .dsh/experts/(rank 100)
2、config.teamDirs(rank 300)
3、<dshHome>/experts(rank 400)
4、随包 teams/(rank 600,示例团队)

发现之后对每个团队的 team.json 做严格校验(fail loud),通过后组装工作流模板、花名册、人设卡与升级矩阵,skill 目录出现 experts-<团队名>,模型即可路由到该团队。

运行期的动作分两步:当前会话先启动真实的 lead child,lead 再按任务动态启动 specialist child——相关的专家才启动,并且可以继续或追加派遣。

想魔改官方示例,标准动作是把随包示例目录拷到 <dshHome>/experts/ 下改,项目层的同名团队会自动遮蔽随包版本。

团队目录怎么写

一个团队就是一个目录:

my-team/
├── team.json     # 机器接线:名称/描述/工作流/专家/升级路由
├── TEAM.md       # 团队级约定(可选,注入技能 body)
└── experts/      # 人设卡,由 lead 在 specialist prompt 中全文注入
    ├── lead.md
    └── coder.md

team.json 里的几个关键字段:

  • experts[]:1-8 位专家,{id, role: coordinator|specialist, card, modelHint?},恰好一位 coordinator 作为 lead child 启动;
  • escalations[]:升级路由 {from, to, when, priority(P0|P1|P2)},from/to 必须引用专家 id 且不许自指;
  • TEAM.md:团队级约定,可选,注入技能 body;experts/*.md 人设卡由 lead 在 specialist prompt 中全文注入;
  • reportLanguagezh(默认)或 en

校验是 fail loud 的,下面这些都会被直接拒绝:未知字段、路径逃逸(../、绝对路径、盘符、符号链接出目录、NUL)、悬空升级引用、多位协调者、自由文本含换行或管道符(防 markdown 结构注入)、卡片含 4+ 反引号围栏、TEAM.md 超 64KB 等。错误消息带精确文件路径与字段名。同名团队先按名字去重再对胜者全量校验——有效的低 rank 团队可以遮蔽同名的坏团队;没有遮蔽时,任何一个坏团队都会让本提供方整体报错,修复该团队即恢复。

安装与启用

推荐方式是加入 dsh profile:在 profile 的 package.json 中把本包加入 dependencies 与 bundles。

{
  "dependencies": {
    "dsh-experts": "github:libinyam/dsh-experts"
  },
  "dsh": {
    "profile": {
      "bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "dsh-experts"]
    }
  }
}

本地开发可用 "dsh-experts": "file:<到本仓库的路径>"

方式二是手动放置:克隆本仓库到 profile 的 node_modules/dsh-experts,并把 "dsh-experts" 追加进 bundles 列表。插件无外部依赖,无需安装步骤。

环境要求:Node ≥18;零运行时依赖、零 devDependencies;plain ESM JavaScript,无构建步骤。

典型用法

安装后 skill 目录会出现内置示例团队 experts-web-review(5 位专家:协调者 tech-lead + 前端 + 后端 + 测试 + 安全)。对 dsh 说:

用 experts-web-review 评估 owner/repo 的推广就绪度

创建自己的团队,用配套脚本从内置 web-review 复制:

node node_modules/dsh-experts/scripts/new-team.mjs --name my-team

默认复制到 <dshHome>/experts/my-team。编辑 my-team/team.json(描述、专家、升级路由)和 experts/*.md 人设卡,然后离线校验:

node node_modules/dsh-experts/scripts/validate-team.mjs <dshHome>/experts/my-team

校验通过后,skill 目录会自动多出 experts-my-team。注意 v0.1 没有文件 watcher,新增或修改团队后需要重载插件刷新目录。

开发侧的常用命令:

npm test                                  # 全量测试(单元 + 守护)
npm run guard                             # 只跑宪法守护测试
npm run validate-team teams/web-review    # 校验内置示例团队

配置

配置写在 cordis.patch.yml,全部可选:

默认 说明
providerName dsh-experts skills 注册表中的提供方名
includeDefaultRoots true 是否扫描项目/用户根(关闭后仅 teamDirs + 随包)
dshHome $DSH_HOME~/.dsh 覆盖 dsh 主目录
teamDirs [] 额外团队根(rank 300)
includeBundledTeams true 是否暴露随包示例团队

等价的环境变量:DSH_EXPERTS_PROVIDER_NAMEDSH_EXPERTS_INCLUDE_DEFAULT_ROOTS=0DSH_HOMEDSH_EXPERTS_TEAM_DIRS(分号/逗号分隔)、DSH_EXPERTS_INCLUDE_BUNDLED_TEAMS=0

已知问题(v0.1)

  • 无文件 watcher:新增/修改团队需重载插件。
  • 每次 list() 全量重扫并重校验所有团队(无缓存),团队数量上千时目录刷新开销可观。
  • review 工作流模板;develop 模板(patch 化输出 + 绿灯门禁 + 人工 PR)在路线图上。
  • 未扫描 .agents 系根目录。
  • modelHint 只是模板提示,不强制路由模型。

适用场景与注意事项

适合需要在 dsh 里搭多专家评审流程、希望阵容像数据一样可版本化可魔改、不想为换人设改引擎的智能体开发者。

用之前留意几点:

  • 一个坏团队(且无低 rank 同名遮蔽)会让本提供方整体报错,这是 fail loud 设计,按错误消息修复即恢复。
  • 无 subagent 或 report 工具时,插件会明确标记团队运行时不可用,不会伪装成专家已经工作。
  • 排查入口:dsh 控制台日志看 skills.registerProvider 相关错误,或跑 scripts/validate-team.mjs <目录> 离线定位。
  • 插件以当前 dsh 进程权限运行,安装前建议自行检查源码与许可证(MIT)。

结语

dsh-experts 的价值在于把「换阵容」从改代码变成改目录:严格校验兜住低级错误,rank 分层支持就地覆盖,skill 自动注册让模型按需路由。仓库与目录页:

  • GitHub:https://github.com/libinyam/dsh-experts
  • 目录页:https://www.skillhub.cn/plugins/libinyam/dsh-experts(社区站点,与 DeepSeek / 幻方无官方从属关系)
羽毛球分组比赛记分
小程序二维码

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

小夜