dsh-plugin-subagent-roster:用结构约束把子代理委派做实

前言

在 DeepSeek Harness(DSH)里用内置的 subagent 工具做任务拆分,常见结果是:子代理带着父代理的人设去干窄任务、输出形态随模型心情变化;你只想读文件,子代理却握着 shell;要的是评审,它却改了代码。批量抽取和设计决策也往往挤在同一档、通常也是最贵的模型上。这些不是「提示词写得不够严」就能根治的——父身份、全量工具集和统一模型路由是结构自带的。

dsh-plugin-subagent-roster(维护者 121212165,分类:工作流)把系统提示、能力范围和模型档位从「请模型自觉」改成插件侧的结构约束,并按任务形态区分批量线与团队协作线。下面介绍它解决什么问题、如何安装,以及两种典型入口。

这是什么

一句话:面向 DSH 的受约束子代理名册——每个角色固定 persona(子系统提示)、toolFilter.allow 能力白名单、agentOptions 模型档位;父代理只多一个 delegate 工具,其 role 枚举覆盖整份名册,避免为二十个角色付二十套 schema。

仓库:121212165/dsh-plugin-subagent-roster(MIT,当前包版本 0.2.2)。社区目录页:SkillHub 插件条目。DSH 生态主张「一切皆插件」;SkillHub 等目录为社区站点,与 DeepSeek / 幻方无官方从属关系。

内置 subagent 的三类泄漏与对应机制

README 把失败模式归纳为三列约束,效果如下(机制均来自插件实现,非口头约定):

约束 机制 效果
身份 委派时带上角色 persona,成为子代理的 persona-prefix 身份由角色定义,不由父代理带入
能力 请求上的 toolFilter.allow 例如评审角色没有写工具,无法改代码
模型 请求上的 agentOptions 批量用便宜档,评审用够用档,协作用最强调档
深度 maxDepth: 1,且过滤器不授予 subagent* 角色子代理为叶子,避免递归扇出

两条任务线

名册按「工具形态」区分两类工作方式:

  1. 批量线(Bulk) — 每次调用处理一项,可并行;子代理完全没有工具。适合逐条字段抽取、逐条校验、逐条改写等。
  2. 团队线(Team) — 规划、构建、评审、检索、组装等岗位;各角色能力范围不同,且不能互相顶替。

内置二十个角色的说明见仓库文档 roles.en.md 与 roles.zh.md。

安装与启用

安装命令以 README 原文为准(<your-profile> 换成你的 profile 名,<owner> 为 GitHub 用户名 121212165):

# 从 GitHub 安装(源码即产物,无需构建授权)
dsh plugin --profile <your-profile> add github:121212165/dsh-plugin-subagent-roster

# 或从本地目录安装
dsh plugin --profile <your-profile> add /path/to/dsh-plugin-subagent-roster

bundle 会写入一行插件配置;父代理获得上述单个 delegate 工具。可用下面命令确认是否出现 subagent-roster 行:

dsh --profile <name> --dump-config

环境要求(package.json / README):DSH >=0.2.0-rc.2 <0.3.0,Node >=22.18;纯 ESM,无构建步骤。

插件市场索引(可选):仓库提供 format: 1 官方索引格式,订阅地址:

https://121212165.github.io/dsh-plugin-subagent-roster/market/index.json

在 DSH 中先开启 Experimental plugins 下的「Custom plugin market」,再在 Plugins → Discover → Add index source 粘贴该 URL。索引中的版本来自 commit 固定 的 git 源(README 记载为 24f55f2),确认对话框里看到的源与安装内容一致。

安装前请自行阅读仓库源码与 MIT 许可证;插件随当前 dsh 进程权限运行,与本地 shell 对文件的访问能力同级。

插件配置与模型档位

插件 settings(cordis 中配置,字段以 README 为准):

字段 默认 含义
mode advisory advisory 仅警告;strict 拒绝加载自相矛盾的名册
provider deepseek-official 各 tier 解析所用的 provider
allowedModels [] 非空时,任一 tier 解析到列表外模型即违规
routingGuidance true 是否把 bulk / team 路由说明注册进父代理提示

各 tier 的模型 id 从环境变量解析,同一包可服务多套部署:

变量 用途
ROSTER_PROVIDER 四个 tier 共用的 provider 路由
ROSTER_BATCH_MODEL / ROSTER_BUILD_MODEL / ROSTER_REVIEW_MODEL / ROSTER_TEAM_MODEL 各档模型 id
ROSTER_BATCH_MAX_TOKENS 等 各档输出 token 上限

也可在 profile 的 cordis.patch.yml 里按 id 覆盖单行配置。

运维页与 roles.json

profile 运行期间,插件在本机提供运维页(默认端口由 pagePort 决定,0 表示关闭):

http://127.0.0.1:4317/

可在页面上增删角色、调整顺序、气质、tier、能力范围,并直接编辑 persona(子代理系统提示)。保存后立即生效,无需重启;若新名册挂载失败会回滚到上一版。

角色数据位于 $DSH_HOME/subagent-roster/roles.json,首次启动从内置二十角色种子生成,也支持手改。保存时整表校验:id 为 kebab-case、tier / capability / line 取值合法、角色不变量(例如评审不能带写能力)等;校验失败不会覆盖文件。

安全注意:页面无认证,仅绑定 127.0.0.1;不要暴露到其他网卡。它具备与本地 shell 相当的文件权限。

典型用法

1. 在对话里用 delegate

父代理通过唯一的 delegate 工具选择 role 枚举中的角色委派。具体角色能力以 roles.json 与文档为准;routingGuidance 为 true 时,父提示中会包含 bulk / team 路由说明。

2. 确定性批量入口(roster-fanout)

README 记载:让父模型自行决定「要不要委派」在免费模型上不可靠(见仓库 test-report.md §3)。批量场景可把决策移到入口脚本,按条目数量驱动:

node bin/roster-fanout.mjs \
  --profile <your-profile> \
  --role batch-exact \
  --items-file items.json \
  --contract 'one JSON object {"text": <the item>}' \
  --expect-json \
  --concurrency 3 \
  --out results.jsonl

要点:

  • N 条输入对应 N 次子角色调用,形状由调用方式决定,不依赖父模型临场判断。
  • 每条结果从子代理的 tool_result 事件读取,不用父代理转述。
  • --expect-json 校验契约;子代理报错、无返回或 JSON 非法则该条失败。
  • 任一条失败则进程非零退出,便于脚本或 CI 门禁。

契约由 --expect-json 强制执行,契约文案在子任务内部下发(子代理在任务外看不到)。README 称在最便宜 bulk tier 上测得 8/8 合规;失败即失败项,不会用散文冒充成功。

(若已全局安装插件,也可使用包内 bin 名 roster-fanout,见 package.json。)

验证与延伸阅读

仓库自带无模型调用的单元测试与可选 bench:

npm test                          # README:18 个单元测试
node bench/run.mjs --repeat 1     # 需本地 OpenAI 兼容网关

bench 结论来自网关请求日志(实际 persona、模型是否等于 tier、工具数量是否等于角色授权、负例是否未动工作区等),而非仅看回答文本。

设计说明、测试报告与评审文档:docs/design.md、docs/test-report.md、docs/review.md。

适用场景与注意

更适合:需要把「评审只读」「批量无工具」「岗位用不同模型」写进结构而非提示词的团队;有 CI / 脚本门禁的批量 JSON 抽取或校验;希望通过运维页或 roles.json 自定义名册的 DSH 用户。

务必注意:

  • 插件以当前 DSH 进程权限运行;安装前检查源码与 MIT 许可证。
  • 运维页等同本机高权限配置入口,勿对公网暴露。
  • 版本与 DSH 处于 0.2.x RC 区间,升级 DSH 时需对照 README 的 compatibility 范围。

结尾

dsh-plugin-subagent-roster 把子代理委派里的身份、能力与模型三件事钉在角色名册与 delegate / roster-fanout 入口上,用 bulk 与 team 两种工具形态区分批量项工作与多角色协作。若要进一步了解参数与角色表,可从 GitHub 仓库 与 SkillHub 目录页 入手。

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

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

小夜