前言¶
DeepSeek Harness(dsh)把模型、工具、会话、子智能体和界面都做成可替换插件,官方说法是「一切皆插件」。标准能力里已经能 spawn / fork 子 Agent,但一次复杂目标往往还缺几件事:谁当队长、任务之间谁先谁后、成员空闲了能不能自动接下一项、中途打断后会不会把旧结果盖到新进度上。
dsh-agent-teams 补的就是这一层。它不另起一套 workflow 引擎,而是把当前会话变成队长,按角色拉可续聊的子 Agent,把目标拆成带依赖的任务,再用持久化邮箱和共享调度器把人串起来。本文按社区目录页、GitHub 仓库 README、docs/usage.md 和 package.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 里客户端声明 platform 为 web,活动面板走 Web UI;使用前需要已经装好 DeepSeek Harness。Node 引擎要求是 ^22.19.0 || >=24。当前 npm 版本为 0.1.6(以 package.json 为准)。
核心功能¶
队长、成员、任务、邮箱¶
工作方式按 README 可以拆成六步:
- 当前会话创建团队,自己成为队长。一个队长同一时间只能带一个活动团队。
- 队长按角色添加成员。成员是 DSH 的可续聊子 Agent(
startContinuable),不是一次性跑完就丢的子进程。 - 目标被拆成任务,带负责人和显式依赖。
- 共享调度器按成员真实的
running / idle / ready状态,给每个空闲成员原子领取一项就绪任务并唤醒;中断或进程重启后若仍持有开放任务,会生成新的attempt再跑。 - 成员更新任务时必须带当前
attempt_id。转派或队长接管会先让旧 attempt 失效、等原成员安静,再开新 attempt,迟到的旧结果盖不住新进度。 - 队长汇总结果,调用结束接口把整支队伍归档,而不是直接删掉历史。
任务状态机在 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 |
建任务,可声明 dependencies 和 assignee |
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-teamsmemberProvider:spawn或fork,不是 LLM 名memberModel:全体成员的模型默认值;成员自己带了provider/model时优先生效memberMaxDepth:成员再委派深度,0表示禁止maxMembers:人数上限,示例为 8
生效顺序是:成员显式 provider + model → memberModel → 队长当前路由。思考强度默认继承队长;目标 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 latest(0.0.1-rc.1)用 ctx.httpServer / ctx.workspace,后续 next(rc.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