生命不息,折腾不止。前面六篇攒下的钩子、事件流、压缩、目标、后台任务、子代理,今天全串成一支会自己分工干活的队伍。

进阶系列写了六篇,从写钩子插件拦截 Agent,到监听事件流出日报,再到上下文压缩、目标续跑、后台任务,最后是 subagent 招「手下」。眼尖的朋友可能发现了:subagent 那一套是父子关系——你派一个子代理出去,它干完汇报,仅此而已,子代理之间互不搭话,也没有一块共享的记工板。

今天收尾,我们把牌桌上最后一副牌翻开:Agent Teams。这是 DeepSeek Harness 官方仓库 packages/experimental/ 里一个实验性多智能体协作模块——一个会话变成一个「主编」,它能招几个有名字的「研究员」队友,互相发消息、共用一块任务板,还能崩溃重启后接着干。前面六件套,在这里各就各位。

一、前六篇攒下的六块积木

先回头看我们攒了什么,不然组队就是空中楼阁:

积木 文章 在队伍里干什么
钩子插件 第 1 篇 主编/研究员动手前统一拦截、审批
事件流 第 2 篇 干活全程留痕,收工时自动出日报
上下文压缩 第 3 篇 长任务跑久了不崩,上下文涨满就压
目标(goal) 第 4 篇 给主编立个总目标,自动续跑
后台任务 第 5 篇 好几天的大活丢后台,按进度回收
子代理 第 6 篇 单个研究员的后端(spawn/fork)

前六篇都在解决「单打独斗」的问题,而团队解决的是「如何让好几个 Agent 并肩、互相通气、共享本子」。它和 subagent 最大的区别就一句话:subagent 是家长里短的父子,team 是平级协作的同事——每个队友都有独立会话、独立上下文,互相靠消息和任务板沟通,而不是往同一个越来越长的对话里塞。

二、官方实验包:一个会话就是一支队伍

Agent Teams 在官方仓库里的定位是「实验性」——能把一个 coding 会话变成一支小队:会话本身的 Agent 自动当 Lead(主编),它可以创建带名字的 teammate(研究员),互相发持久消息,在一块共享任务板上记任务。消息和任务状态能扛住崩溃、重载、中断,研究员「掉线」后再醒来还会收到之前排队的消息。

它由三个包组成,最小装配长这样(这是 SDK/自定义组合的写法):

1
2
3
4
# 最小团队装配:持久会话存储 + 两个 Team 包
- name: '@deepseek-ai/dsh-session-persistence-jsonl'
- name: '@deepseek-ai/dsh-experimental-agent-team'
- name: '@deepseek-ai/dsh-experimental-tool-agent-team'

注意三点:agent-team 包只负责领域模型(身份、花名册、邮箱、任务板),不带任何工具;真正给模型派活的是配对的 tool-agent-team 包;而必须要持久会话存储,团队功能才会激活(这就是为什么第 3 篇的落盘能力在这里是地基)。

不过你大概率用不到上面这种手工装配。官方其实发了一个一键 profile 层 @deepseek-ai/dsh-experimental-agent-team-profile,装完就把上面的组合、配置、工具全铺好了(还会顺手把容易混淆的旧 subagent 委派控件关掉)。三条命令就能装/卸:

1
2
3
4
5
# 前置:profile 里得有 @deepseek-ai/dsh-base
npx @deepseek-ai/dsh plugin --profile web add @deepseek-ai/dsh-experimental-agent-team-profile

# 不用了再卸掉(名字换成你的 profile)
npx @deepseek-ai/dsh plugin --profile web remove @deepseek-ai/dsh-experimental-agent-team-profile

或者在 Web 侧边栏的 Plugins 页面直接开关——它是 dsh 安装时自带的可选 bundle,默认不启用,开关一下重启即可(具体开关项名以你装的那版 UI 为准)。

装好后,会话就会多出一组 Team 工具:spawn_teammate、send_message、list_agents、interrupt_agent、wait_agent,以及一组 team_task_* 任务板工具。

三、上手三步:装 → 派活 → 看花名册

第一步:装完重启。 上面装/卸完,重启 dsh web 进程并刷新浏览器。

第二步:给主编派活。 不用教它「请用 Agent Teams」这类咒语,直接自然语言下总目标,让主编自己去拆:

1
2
3
写一份《DeepSeek Harness 多智能体选型对照》:先查 subagent、Agent Teams、
社区 agent-team 插件三者的机制差异,再据此写一份带结论的报告,最后附一段
能跑通 spawn_teammate 的最小演示代码。

主编收到后,会先规划,再自己调用 spawn_teammate 招人。它实际调用的入参形状大概是这样的(供你理解,不用手敲):

1
2
3
4
5
6
{
"name": "researcher-data",
"description": "资料研究员,负责查证三套多智能体机制的官方文档",
"prompt": "去官方 README 和源码里核实 Agent Teams 的工具清单与限制,整理成要点。",
"context": "fresh"
}

name 是小写 kebab-case 的唯一名字;prompt 一定写完整——因为这个队友要么 fresh(不继承主编对话的任何记忆),要么 fork(继承主编已完成的轮次)。fresh 就意味着它的 prompt 里必须自带全部前情,别指望它知道你们前面聊了啥。

第三步:拿 list_agents({}) 看花名册。 返回每个成员的名字、角色(lead/teammate)、状态(running/idle/inactive/provisioning/failed)。主编自己始终在列,是那个 role: "lead" 的伪行。

四、主编带仨研究员:一个落地项目

回到上一步那个写作任务,主编最自然的打法是一次招三个研究员,各干一摊,最后自己验收:

研究员名字 分工 context
researcher-data 查三套机制的官方文档、差异点 fresh
researcher-report 按查回来的要点写带结论的报告 fresh
coder-demo 写一份能跑的最小演示代码 fork

他们会共享同一个工作目录,谁改了文件其他人都立刻看得见——这正是团队和子代理的关键差异之一。所以主编要做的就是把任务拆开、分配、等结果、验收:

  • 派活:spawn_teammate 创建三人,再下任务到共享任务板(team_task_* 那套:建任务 → get 读 → claim 认领 → 干完 complete)。
  • 催进度/补充要求:send_message({ target: "researcher-data", message: "..." })。它会在目标最近的步骤边界把消息塞进去;目标要是 inactive,这一发还会顺带把它唤醒开跑。
  • 等结论:wait_agent 等某个队友。⚠️ 它只观察调用之后发生的变化,从不主动唤醒;如果此刻没有别人在跑,它会立刻返回 noProgress。所以等待前先用 list_agents 确认还有人 running/provisioning,需要谁上线就先 send_message 叫醒再等。
  • 中途叫停:interrupt_agent 把某个研究员暂停(不是销毁),回头还能继续。
  • 收尾验收:主编合并三个人的产出,自己最后 review 一遍 diff、跑一遍测试再给你终稿——所以要给主编一个强一点的模型,把「判断和验收」这一层的上下文留给它。

五、工具速查 + 六个必躲的坑

一套工具一句话说清:

工具 干什么
spawn_teammate 创建带名字的持久研究员;只有主编能调
send_message 给主编/某研究员发消息,能唤醒 inactive 目标
list_agents 看花名册(名、角色、状态)
interrupt_agent 暂停某研究员,不销毁、可继续
wait_agent 等待,只观察新变化、不唤醒
team_task_* 共享任务板:建/取/认领/完成

六个坑,全是社区实测出来的,务必背下来:

  1. 名字永久不复用。哪怕创建失败,那个名字也被占着,不能再用——所以别拿临时名乱试。
  2. 只有主编能创建/中断研究员,研究员之间只能靠 send_message 传话。
  3. fresh 不带任何前情。想让研究员知道你聊到哪了,要么 prompt 写全,要么用 fork。
  4. wait_agent 不唤醒人。没人在跑会立刻 noProgress,别傻等,先 send_message 叫醒。
  5. 共享目录不是锁。多人改同一块文件没有强制锁,一旦报 FS_STALE_VERSION,读最新内容、把你改的 rebase 上去再重试;写作用 read/edit/write 套路,Bash/格式化脚本不受版本守卫保护,最后让主编 review 总 diff。
  6. 别用 subagent 组队(Web/Desktop 上尤其要注意)。开启 Team 后旧的 subagent/subagent_fork 控件在 preset 层可能还活着,但用它们派出去的子代理不在 Team 花名册里——list_agents 看不到、send_message 报「找不到这个 teammate」。组队就老老实实用 spawn_teammate,否则容易白转圈。

六、给研究员换便宜模型,省下主编的强模型

组队的最大甜头其实是成本。前面说过 Harness 是「一切皆插件」,Provider 可以随便加,而 Team 里每个研究员都能各用各的模型——这正是 DeepSeek Harness 作为国产框架的卖点:多模型对接 + 价格便宜。

合理分工是:主编用强模型(判断、拆任务、验收,上下文都花在刀刃上),查资料/出代码这类研究员换成便宜的小模型。要省钱,就把研究员的 Provider 指向便宜模型按量付费——比如上一路的中转站(ai.aklibk.com 那种 OpenAI 兼容接口)接个低价小模型,查资料、写初稿用便宜货,主编拿强模型收尾。团队框架 + 便宜模型的组合,才是把「多智能体」真正跑进日常的正解。

如果还想玩点更花的,社区还有 @limuyang2/dsh-agent-team(独立 Agent、共享工作区,每个成员独立模型/技能/MCP 工具)、@nanmicoder/dsh-agent-teams(带 /agent-teams 命令和实时面板)这类选手,思路一致、包装更厚,感兴趣的按需去 DSH 插件库翻了试。

生命不息,折腾不止。进阶系列到此收尾,六件套变成一个能自己招人、分工、验收的团队。下篇开新坑——Claude Code 实战系列,第一课从 0 讲清怎么装、怎么接中转站、怎么在终端里把它当个顺手的小工。