用 dsh-agent-teams 把 DeepSeek Harness 会话编排成智能体团队

前言

DeepSeek Harness(dsh)把模型、工具、会话、子智能体和界面都做成可替换插件,官方说法是「一切皆插件」。标准能力里已经能 spawn / fork 子 Agent,但一次复杂目标往往还缺几件事:谁当队长、任务之间谁先谁后、成员空闲了能不能自动接下一项、中途打断后会不会把旧结果盖到新进度上。

dsh-agent-teams 补的就是这一层。它不另起一套 workflow 引擎,而是把当前会话变成队长,按角色拉可续聊的子 Agent,把目标拆成带依赖的任务,再用持久化邮箱和共享调度器把人串起来。本文按社区目录页、GitHub 仓库 README、docs/usage.mdpackage.json 核对后整理:它是什么、装哪条命令、怎么用、边界在哪。

社区插件目录 deepseek-harness-plugin.com 是独立站点,和 DeepSeek / 幻方没有官方从属关系。官方发现渠道仍是 GitHub 的 dsh-plugin 话题。目录页方便检索和复制安装命令,真正的行为以仓库源码为准。

这是什么

dsh-agent-teams 是 DeepSeek Harness 的工作流与自动化插件,GitHub 仓库为 NanmiCoder/dsh-agent-teams,维护者是 NanmiCoder(package.json 作者字段写的是程序员阿江 Relakkes)。许可证 MIT,主要语言 TypeScript,npm 包名 @nanmicoder/dsh-agent-teams。截至 2026-08-17,GitHub 显示 421 星;社区目录页当时写的是 291,星标以仓库为准。

它解决的问题可以收成一句话:用自然语言提出目标,当前 dsh 会话成为队长,把多个可续聊子 Agent 编成一支有任务依赖、有直达消息、状态落盘的团队。

仓库 README 写明,插件提供团队协议、10 个协作工具、持久化状态、自动共享任务调度,以及 Web 界面上的实时活动面板。package.json 里客户端声明 platformweb,活动面板走 Web UI;使用前需要已经装好 DeepSeek Harness。Node 引擎要求是 ^22.19.0 || >=24。当前 npm 版本为 0.1.6(以 package.json 为准)。

核心功能

队长、成员、任务、邮箱

工作方式按 README 可以拆成六步:

  1. 当前会话创建团队,自己成为队长。一个队长同一时间只能带一个活动团队。
  2. 队长按角色添加成员。成员是 DSH 的可续聊子 Agent(startContinuable),不是一次性跑完就丢的子进程。
  3. 目标被拆成任务,带负责人和显式依赖。
  4. 共享调度器按成员真实的 running / idle / ready 状态,给每个空闲成员原子领取一项就绪任务并唤醒;中断或进程重启后若仍持有开放任务,会生成新的 attempt 再跑。
  5. 成员更新任务时必须带当前 attempt_id。转派或队长接管会先让旧 attempt 失效、等原成员安静,再开新 attempt,迟到的旧结果盖不住新进度。
  6. 队长汇总结果,调用结束接口把整支队伍归档,而不是直接删掉历史。

任务状态机在 docs/usage.md 里写得很清楚:pending → claimed → in_progress → completed | failed | cancelled。依赖没完成不能领取,一个成员也不能同时占两个未完成任务。

团队状态落在工作区目录里,面板读的是磁盘上的这份真相:

<workspace>/.agent-teams/<teamId>/
├── team.json
└── inbox/
    ├── captain.jsonl
    └── <member>.jsonl

成员之间发消息走各自的 JSONL 邮箱,直接投递给对方并唤醒,不经过队长转发。暂时送不出去的消息会留在邮箱里,等后续状态边界再投。

十个协作工具

插件往 ctx.tools 注册 10 个 agent_teams_* 工具,和 DSH 自带的 tool-workflow 走同一条注册路径。模型按提示段里的协议调用,用户通常只要说目标,不必自己记工具名。工具职责如下:

工具 作用
agent_teams_create 建团队,调用者成为队长
agent_teams_add_member 拉成员(可续聊子 Agent + persona)
agent_teams_remove_member 安全移除:撤 attempt、回收未完成任务、再调度
agent_teams_create_task 建任务,可声明 dependenciesassignee
agent_teams_reassign_task 原子转派;assignee=captain 表示队长接管
agent_teams_claim_task 领取任务(先校验依赖)
agent_teams_update_task attempt_id 推进状态,拒绝旧 attempt 覆盖
agent_teams_send_message 成员直达队友或队长,拒绝冒名 from
agent_teams_status 全景:成员活动、任务、邮箱未读
agent_teams_delete 结束并归档,目录挪到 archive/

拉成员默认是零交互:插件会快照队长当前这一步真正在用的 LLM provider、model 和思考强度,后续续跑仍用这份快照。只有你明确说「后端用 A 家的模型 X、前端用 B 家的模型 Y」时,才会给该成员传 provider + model。不会逐个弹窗选模型。

这里有个容易混的名字:配置项 memberProvider 指子 Agent 运行后端(spawn / fork),不是 LLM 供应商。跨模型路由走的是 agent_teams_add_member 的可选 provider + model

Web 活动面板

装进 Web profile 之后,团队创建会在右上角展开活动面板(body portal 浮层):队长信息、分段进度、可折叠成员树、可交互的任务 DAG。DAG 用 SVG 连依赖,悬停或键盘聚焦能看上下游,点选节点会显示负责人、未满足的前置和下游解锁情况。成员行带角色、实时状态和当前任务,点击可打开该成员的子会话。

面板只显示当前会话的团队(按 captainSessionId 匹配)。新建会话时面板收起,切回原会话再展开。结束团队时 agent_teams_delete 做的是归档:成员、任务、依赖图和邮箱完整留在 archive/,打开历史会话还能看到当时的成员树和 DAG。

docs/usage.md 也写了限制:面板按磁盘状态 1 秒轮询渲染;模型有时做完活却没调用 agent_teams_update_task,这时面板不会「脑补」完成,队长应以 agent_teams_status 和文件为准。

安装与启用

目录页给出的安装命令是:

dsh plugin add github:NanmiCoder/dsh-agent-teams

需要可复现安装时,目录页要求固定 commit:

dsh plugin add github:NanmiCoder/dsh-agent-teams#<commit>

<commit> 换成仓库里的完整哈希,不要用浮动的分支名当锁定依据。

仓库 README 面向 Web 界面,写的是 npm 包安装(注意 profile):

dsh plugin --profile web add @nanmicoder/dsh-agent-teams

活动面板依赖 Web UI。只装进默认 profile、不启 web,工具协议仍可能挂上,但 README 验证步骤是检查 web 配置并启动 Web:

dsh --profile web --dump-config
dsh web

从源码安装(改插件或跟最新提交时):

git clone https://github.com/NanmiCoder/dsh-agent-teams.git
cd dsh-agent-teams
pnpm install
pnpm build
dsh plugin --profile web add .

改源码后要再跑一次 pnpm build。本地安装会链到当前检出目录。

目录页和仓库都提醒:插件以当前 dsh 进程的权限运行,安装时可能执行代码。装之前应阅读源码和 MIT 许可证,确认仓库就是 NanmiCoder/dsh-agent-teams

典型用法

装好并重启 Web 之后,不必先手写 YAML。README 的示例是直接用自然语言:

使用 AgentTeams 审查 v0.5.3 之后的提交,分别从性能、安全和产品角度分工,最后输出一份汇总报告。

按协议,模型会:建团队 → 按角色拉成员 → 拆任务并声明依赖 → 调度器给空闲成员领任务并唤醒 → 队长盯进度,阻塞时转派或接管 → 汇总后 agent_teams_delete 归档。

默认配置可以不改。若要在受信任的 profile 里覆盖成员行为,仓库给出的示例是写在 cordis.patch.yml

- id: agent-teams
  config:
    stateDir: .agent-teams
    memberProvider: spawn
    memberModel: deepseek-v4
    memberMaxDepth: 1
    maxMembers: 8

含义按文档:

  • stateDir:工作区下的状态目录名,默认 .agent-teams
  • memberProviderspawnfork,不是 LLM 名
  • memberModel:全体成员的模型默认值;成员自己带了 provider/model 时优先生效
  • memberMaxDepth:成员再委派深度,0 表示禁止
  • maxMembers:人数上限,示例为 8

生效顺序是:成员显式 provider + modelmemberModel → 队长当前路由。思考强度默认继承队长;目标 provider/model 不兼容时,成员创建会失败,而不是悄悄降级。最终生效的 provider、model、思考强度会写入 team.json,供查询和冷恢复使用。

更细的工具参数、UI 行为和验证步骤见仓库 docs/usage.md。同一仓库还附带一份面向插件开发的 Agent Skill dsh-plugin-development,和团队编排不是同一件事,需要写 DSH 插件时再单独看。

适用场景与注意事项

更适合目标能按角色切开、步骤之间有先后依赖、又希望过程可看、可续、可归档的工作。官方示例本身就是多视角代码审查再汇总。成员是可续聊子 Agent,适合一轮做不完、需要带着上下文被再次唤醒的任务。

不适合的情况文档也写了,不要略过:

  • 一个队长同时只能有一个活动团队。要开新队,先结束并归档当前队。
  • 调度是事件驱动,不是常驻轮询。队长离线时不能给成员做冷恢复;任务和消息留在磁盘,等队长回来或调用状态工具后再投递。
  • 状态是文件级持久化,同一 dsh 进程内有锁串行化;多个进程同时改同一团队不保证一致。
  • 成员 persona 会替换默认 persona,但成员仍持有 bash、文件系统、联网等完整工具集,权限面和队长同一进程。
  • 活动面板反映磁盘真相;模型漏调更新工具时,界面上的任务可能仍停在旧状态。
  • 插件以当前 dsh 进程权限运行。安装前检查源码、许可证和仓库地址;生产或共享工作区建议用 #<commit> 钉死版本。

docs/usage.md 还提到内测版本里服务键有过一次更名:npm latest0.0.1-rc.1)用 ctx.httpServer / ctx.workspace,后续 nextrc.2)改为 ctx.webServer / ctx.workspaceRegistry。插件对两组键都做了探测,新键优先、旧键回退。若面板路由没挂上,先核对 DSH 版本和 --dump-config 里是否真的装进了 web profile。

小结

dsh-agent-teams 把 DSH 已有的子 Agent 能力收成可观察的团队:队长在当前会话,成员可续聊,任务带依赖,消息走邮箱,状态写在 .agent-teams/,Web 上能看到 DAG 和进度。它不是官方应用商店里的「官方插件」,而是 NanmiCoder 维护的 MIT 社区项目;目录页只负责收录和给出安装命令。

目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-agent-teams/

GitHub:https://github.com/NanmiCoder/dsh-agent-teams

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

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

小夜