dsh-swarm-orchestrator:DSH 并行子代理集群插件

前言

在 DSH 里做较大改动时,常见做法是让主对话里的代理按步骤串行改文件:一轮只推进一块,总耗时随任务面线性拉长。若把目标拆成互不重叠的切片,再同时派出多个独立子代理各自写代码,理论上可以缩短墙钟时间,但难点在于切片如何派发、并发如何控、重复调用会不会把整轮任务又跑一遍,以及运行时每个子代理在干什么难以一眼看清。

下面介绍社区插件 dsh-swarm-orchestrator(维护者 zhuchuovo):它在 host 平面注册全局工具,由母代理给出目标与切片清单后按配置并发驱动子代理,并在会话输入框上方提供实时看板;分类属于 DSH 生态目录中的「工作流」。插件以 MIT 许可证发布,当前 GitHub 星标为 0;package.json 中版本为 1.1.0。DSH 社区插件目录托管在 SkillHub 等独立站点,与 DeepSeek / 幻方无官方从属关系。

这是什么

dsh-swarm-orchestrator 是 DeepSeek Harness 的常驻插件:母代理把整体目标拆成多个互不重叠的切片,按设置的并发数同时驱动多个独立子代理写代码;全部完成后可选再派一名独立验收代理。会话输入框上方会实时显示每个子代理此刻正在做什么。

插件装在 host 平面 的 profile bundle 一行里。集群状态以调用方 session id 为键、跨会话共享注册表,并消费 host 平面的 subagents 单例,因此不能放进 preset。工具注册在全局 tools 层,所有对话和所有 preset 都能调用;看板则按会话各自独立渲染。

核心功能

模型工具(全局可用)

工具 作用
swarm_run 给出 goal + tasks[],按并发数同时派发子代理;wait:false 可转后台。幂等:同一目标 + 同一批切片重复调用不会重新派发
swarm_status 罗列进行项:每个子代理的切片、状态、模型、此刻的工具与目标、耗时、触及文件、交付摘要
swarm_control cancel_all / cancel_unit / cancel_queued / clear

幂等护栏

每轮集群会计算「项目指纹」(goal + 切片清单)。重复调用 swarm_run 时按指纹判定,避免模型重试或上游续轮导致整轮切片从零再跑一遍:

情况 行为
同一个项目正在跑 搭上那一轮,返回它的结果(绝不重启)
同一个项目已成功结束 直接复用已有报告,不新建任何子代理
同一个项目上次失败/被取消 放行,允许重试
目标或切片清单变了 放行,视为另一个项目
显式传 rerun: true 跳过护栏,强制重跑

只改并发数或验收开关不算新项目,仍会复用;要重跑需传 rerun: true,或用 swarm_control 的 clear 清记录后再调用。

界面与配置

  • 看板(conversation.input.dock,id swarm-board):每个子代理一行,含状态灯、切片名、模型、此刻的工具与目标文件、步数/工具次数、最近自述、耗时、进度条;点行可打开该子代理会话。当前会话没有集群任务时不占位。
  • 设置页(settings.section,id swarm):并发数 1–8、验收代理开关、子代理后端(fork / spawn / 自动)、逐切片模型分配(从已有运营商取供应商与模型列表)。

配置持久化在 $DSH_HOME/swarm-orchestrator.json(默认 ~/.dsh/),重启后保留;host 日志中可能出现 [swarm] config loaded from … 表示读回成功。

安装与启用

安装方式是在 profile 的 bundle 列表里追加插件名,装完后需重启 profile(必要时刷新页面)。组合在启动时读取,不重启不会生效。

在 dsh.profile.bundles 里追加:

// dsh.profile.bundles 里追加
"dsh-swarm-orchestrator"

客户端半边由 package.json 的 dsh.client 声明装配,host 半边由 bundle patch 插入一行。

重启后建议按 README 顺序自检:

  1. dsh --profile web --dump-config 输出中应含 - id: swarm-orchestrator。
  2. 任意对话里应能看到 swarm_run、swarm_status、swarm_control 三个工具(切换会话同样在)。
  3. 设置里出现「并行子代理集群」页;改并发数保存后,$DSH_HOME/swarm-orchestrator.json 应出现。
  4. 派发一个 2 切片任务:输入框上方出现看板,两行同时「运行中」;点行能跳进子代理会话。
  5. 重启 DSH 后确认第 3 步的文件是否被读回。

典型用法

母代理在对话中调用 swarm_run,传入整体 goal 与 tasks[] 切片列表;插件按设置页的并发数同时派发子代理。需要异步时可设 wait:false 转后台,再用 swarm_status 查看各子代理状态,或用 swarm_control 取消或清理。

子代理后端从 subagents.list() 中可用名字选取,优先 fork(继承父代理已完成轮次上下文);验收代理优先 spawn(全新会话)。单次最多 8 个切片,并发上限 8。全部子代理完成后,若开启验收代理,会再派一名独立代理做验收。

递归由 maxDepth: 1 结构性限制:孙代理会被子代理服务拒绝。工具虽在全局层注册,若 preset 使用 tools.restrict({ allow: [...] }) 收窄全局工具,swarm_* 也可能被一并挡掉,那是 preset 自身的选择。

适用场景与注意

适合:目标可拆成互不重叠切片、且希望并行改代码、又需要在主会话里实时看到每个子代理进展的 DSH 用户;与工作流类「编排多代理」需求一致。

注意:

  • 插件在 host 平面 运行,依赖 host 的 subagents;不能作为 preset 内 bundle 使用。
  • 取消整轮会 abort 该轮所有子代理;wait:false 的后台集群由插件持有 AbortController,不受单次工具调用返回影响。
  • 安装前请自行查看 GitHub 源码 与 MIT 许可证;插件以当前 DSH 进程权限运行,安装即表示信任维护者与代码行为。

链接

经过上面的步骤,你可以在 DSH 里用母代理拆切片、并发子代理写代码,并通过输入框上方看板掌握每一行的实时状态;并发与各切片模型在设置页调整,幂等护栏则降低重复派发整轮任务的风险。

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

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

Xiaoye