专栏定位:OpenClaw 从入门到精通(第 11 章)
适读人群:开发者、技术爱好者、AI应用创业者

摘要

当面对一个需要数小时才能完成的复杂任务时,单线程处理会让整个系统阻塞。OpenClaw 的 Subagent(子 Agent)机制允许你将复杂任务分解为多个并行的子任务,让多个 Agent 同时工作,大幅提升处理效率。本章将深入探讨 sessions_spawn(启动子任务)、sessions_send(跨会话通信)、sessions_list / sessions_history(会话追踪)的用法,以及如何设计任务分解策略(map-reduce、流水线)。学完本章,你将能够构建多线程并行内容创作、分布式数据处理等高级工作流。

SEO 摘要

OpenClaw Subagent 子 Agent 机制、sessions_spawn 会话管理、sessions_send 跨会话通信、sessions_list 会话追踪、map-reduce 任务分解策略。

目录

  • 为什么需要 Subagent
  • 会话管理核心 API
  • sessions_spawn:启动子任务
  • sessions_send:跨会话通信
  • 任务分解策略
  • 实战:多线程内容创作
  • 常见错误与避坑指南
  • 术语注释
  • 面试高频问答
  • 深度扩展
  • 附录
  • 系列总结(第 01-11 章)
  • 版权声明

开篇

想象这样一个场景:你需要为一家公司生成一年的内容营销计划,包括 52 篇博客文章、100 条社交媒体帖子、12 个月度通讯。

如果用传统方式,一个一个生成,需要几十个小时。但如果你这样思考:

主 Agent(规划)
    ↓
┌─────────────────────────────────────────┐
│  子 Agent 1: 博客文章生成               │
│  子 Agent 2: 社交媒体帖子生成           │
│  子 Agent 3: 月度通讯生成               │
└─────────────────────────────────────────┘
    ↓
主 Agent(整合与审查)

三个子 Agent 同时工作,处理时间从几十小时缩短到几十分钟。这就是 Subagent 的威力。

核心知识点

1. 为什么需要 Subagent

1.1 单 Agent 的局限性
用户请求
    ↓
Agent 正在处理复杂任务(30 分钟)
    ↓
用户发送第二条消息
    ↓
??? 阻塞 or 排队 or 忽略 ???

单 Agent 的问题:

  • 阻塞:当前任务没完成,无法响应新请求
  • 上下文膨胀:多任务混合导致上下文污染
  • 效率低下:一个任务等待 I/O 时,CPU 闲置
1.2 Subagent 的价值
主会话
    ↓ 用户请求
    ↓ 拆解任务
┌────────────────────────────────────────┐
│  子 Agent A:处理任务 1                 │
│  子 Agent B:处理任务 2                 │
│  子 Agent C:处理任务 3                 │
│  (并行执行,互不干扰)                  │
└────────────────────────────────────────┘
    ↓ 完成
主会话(整合结果,返回用户)

Subagent 的优势:

  • 并行处理:多个任务同时执行
  • 隔离性:每个子任务有独立上下文
  • 可扩展:根据任务复杂度动态增减子 Agent
1.3 适用场景
场景不用 Subagent用 Subagent
生成 10 篇文章串行,1 小时并行,10 分钟
处理 100 个文件逐个处理分批并行
多语言翻译逐语言等待同时翻译
代码审查多个 PR逐个审查同时审查

2. 会话管理核心 API

OpenClaw 提供以下会话管理工具:

API功能返回值
sessions_spawn启动新的子会话session_id
sessions_send向指定会话发送消息response
sessions_list列出所有会话会话列表
sessions_history获取会话历史历史消息
sessions_yield让出控制权-
sessions_kill终止会话-

3. sessions_spawn:启动子任务

3.1 基本语法
sessions_spawn(
    prompt="任务描述",
    name="agent-name",           # 可选,会话名称
    model="anthropic/claude-3-5-sonnet",  # 可选,指定模型
    runtime="standard"           # 可选,standard 或 acp
)

返回:

{
  "session_id": "sess_abc123def456",
  "name": "blog-writer-1",
  "status": "running"
}
3.2 完整示例
# 启动一个子 Agent 生成博客文章
sessions_spawn(
    prompt="为一家 AI 创业公司写一篇关于 LLM 应用前景的博客文章。

要求:
- 字数:2000-3000 字
- 风格:专业但易懂,面向技术决策者
- 结构:引言、3-4 个核心观点、结论
- 包含具体案例和数据

输出格式:
# 文章标题

## 引言
...

## [核心观点 1]
...

## [核心观点 2]
...

...(以此类推)

## 结论
...
",
    name="blog-writer",
    model="qwen/qwen-plus",
    timeout=300000  # 5 分钟超时
)
3.3 spawn 参数详解
参数类型必填说明
promptstring子 Agent 的任务描述
namestring会话名称,便于追踪
modelstring指定使用的模型
timeoutnumber超时时间(毫秒)
runtimestringstandard(默认)或 acp(ACP 协议)
contextobject传递给子 Agent 的额外上下文
3.4 等待子 Agent 完成
# 启动子 Agent
sessions_spawn(
    prompt="帮我写一篇博客文章",
    name="blog-writer",
    runtime="standard"
)
# 返回 session_id: "sess_abc123"

# 轮询等待完成
process(action="poll", sessionId="sess_abc123", timeout=300000)

# 获取结果
sessions_history(sessionId="sess_abc123")

4. sessions_send:跨会话通信

4.1 向子会话发送消息
# 向已存在的会话发送消息
sessions_send(
    sessionId="sess_abc123",
    message="请修改文章,语气更正式一些"
)
4.2 获取会话历史
# 获取指定会话的完整历史
sessions_history(sessionId="sess_abc123")

# 只获取最近的消息
sessions_history(sessionId="sess_abc123", limit=10)
4.3 列出所有会话
# 列出所有会话
sessions_list()

# 返回示例:
# [
#   {"session_id": "sess_main", "name": "main", "status": "active", "created": "..."},
#   {"session_id": "sess_abc123", "name": "blog-writer", "status": "running"},
#   {"session_id": "sess_def456", "name": "social-post", "status": "completed"}
# ]
4.4 终止会话
# 终止一个正在运行的会话
sessions_kill(sessionId="sess_abc123")

5. 任务分解策略

5.1 Map-Reduce 模式

Map 阶段:将大任务分解为多个小任务,并行处理:

# 主 Agent
"""
用户要求:为我们的产品生成多语言描述(中文、英文、日文、韩文)

将任务分解为三个子任务:
1. 中文描述生成
2. 英文描述生成
3. 日韩文描述生成

并行启动三个子 Agent。
"""

# 启动三个子 Agent
session_zh = sessions_spawn(
    prompt="生成产品的中文描述...",
    name="desc-zh"
)

session_en = sessions_spawn(
    prompt="Generate product description in English...",
    name="desc-en"
)

session_jp = sessions_spawn(
    prompt="产品的日本語説明文を生成...",
    name="desc-jp"
)

# 等待所有完成
# ... (polling)

# Reduce 阶段:整合结果
"""
整合三个子 Agent 的输出,生成最终的多语言产品描述文档。
"""

完整示例:

# 主 Agent 执行
sessions_spawn(
    prompt="
你是一个内容创作团队的主编。

任务:为一篇关于「远程办公效率提升」的文章生成 5 个社交媒体帖子。

请按以下步骤执行:

1. 首先理解文章的核心观点(主要讨论异步沟通、工具选择、工作节奏)

2. 然后启动 5 个并行的子 Agent,每个生成一个帖子:
   - 子 Agent 1:Twitter/X 帖子(140-280字)
   - 子 Agent 2:LinkedIn 帖子(专业风格)
   - 子 Agent 3:微博帖子(轻松风格)
   - 子 Agent 4:微信公众号摘要(简短有力)
   - 子 Agent 5:知乎回答风格的帖子(深度分析)

3. 每个子 Agent 使用 sessions_spawn 启动

4. 等待所有子 Agent 完成后,整合结果

输出格式:
## 帖子 1:Twitter/X
[内容]

---

## 帖子 2:LinkedIn
[内容]

...(以此类推)
"
)
5.2 流水线模式

流水线模式:每个子 Agent 的输出是下一个子 Agent 的输入:

任务 A → 子 Agent 1 → 输出 A
                      ↓
任务 B → 子 Agent 2 → 输出 B
                      ↓
任务 C → 子 Agent 3 → 输出 C
# Step 1: 子 Agent 1 - 研究阶段
session1 = sessions_spawn(
    prompt="研究 AI 在教育行业的最新应用趋势,输出 5 个关键发现...",
    name="research"
)
# 等待完成,获取结果

# Step 2: 子 Agent 2 - 写作阶段
session2 = sessions_spawn(
    prompt="基于以下研究结果,写一篇博客文章...\n\n[研究结果:{session1_result}]",
    name="writer"
)
# 等待完成,获取结果

# Step 3: 子 Agent 3 - 审查阶段
session3 = sessions_spawn(
    prompt="审查以下文章,给出修改建议...\n\n[文章内容:{session2_result}]",
    name="reviewer"
)
5.3 树形分解模式

树形模式:一个任务分解为多个子任务,子任务再分解:

           主 Agent
              ↓
    ┌─────────┴─────────┐
    ↓                   ↓
子 Agent A              子 Agent B
    ↓                   ↓
┌───┴───┐           ┌───┴───┐
↓       ↓           ↓       ↓
A1     A2          B1      B2
# 主 Agent
"""
用户要求:为一个软件开发项目创建完整的技术文档。

分解任务:
1. 架构文档(子 Agent A)
   - 系统概览(A1)
   - 模块设计(A2)
2. API 文档(子 Agent B)
   - 认证 API(B1)
   - 数据 API(B2)

先生成架构文档和 API 文档的子任务,
完成后进行整合和格式化。
"""

# 启动第一层
session_arch = sessions_spawn(prompt="生成架构文档...", name="arch")
session_api = sessions_spawn(prompt="生成 API 文档...", name="api")

# 等待完成...

# 整合
"""
整合架构文档和 API 文档,生成完整的技术文档包。
"""

6. 实战:多线程内容创作

6.1 需求

为一个科技博客生成以下内容(并行):

  • 1 篇深度长文(3000 字)
  • 3 篇短文(各 800 字)
  • 5 条社交媒体帖子
6.2 完整代码
# 主 Agent 发起任务
sessions_spawn(
    prompt="
你是内容创作团队的负责人。用户的任务是:为一篇关于「AI Agent 如何改变工作方式」的文章生成内容矩阵。

请执行以下步骤:

## Step 1: 规划内容结构

基于主题,规划:
- 1 篇深度长文的核心观点和结构
- 3 篇短文的切入角度
- 5 条社交媒体帖子的核心信息点

## Step 2: 并行生成内容

启动 9 个子 Agent 同时工作:

【长文生成】× 1
- 子 Agent L1:生成 3000 字的深度长文

【短文生成】× 3
- 子 Agent S1:短文 1 - AI Agent 概念解释
- 子 Agent S2:短文 2 - 具体应用案例
- 子 Agent S3:短文 3 - 未来趋势展望

【社交帖子生成】× 5
- 子 Agent P1:Twitter 帖子
- 子 Agent P2:LinkedIn 帖子
- 子 Agent P3:微博帖子
- 子 Agent P4:微信公众号摘要
- 子 Agent P5:知乎回答

## Step 3: 整合输出

所有子 Agent 完成后,按照以下格式整合:

# 【长文】
[内容]

# 【短文 1】
[标题]
[内容]

# 【短文 2】
...

# 【社交媒体矩阵】
## Twitter
[帖子内容]

## LinkedIn
[帖子内容]

...(以此类推)

---

提示:使用 sessions_spawn 启动每个子 Agent,
每个子 Agent 使用 runtime='standard'。
",
    name="content-creator",
    timeout=600000
)
6.3 进阶:监控进度
# 主 Agent 启动多个子 Agent

# 定期检查子 Agent 状态
sessions_list()
# 返回:
# [
#   {session_id: "sess_L1", name: "long-form", status: "completed"},
#   {session_id: "sess_S1", name: "short-1", status: "completed"},
#   {session_id: "sess_S2", name: "short-2", status: "running"},
#   ...
# ]

# 查看已完成的内容
sessions_history(sessionId="sess_L1")
sessions_history(sessionId="sess_S1")

# 向正在运行的子 Agent 发送消息
sessions_send(
    sessionId="sess_S2",
    message="请注意,字数控制在 800 字以内"
)
6.4 结果整合
# 整合所有子 Agent 的输出

# 获取所有已完成会话的结果
long_form = sessions_history(sessionId="sess_L1")
short_1 = sessions_history(sessionId="sess_S1")
short_2 = sessions_history(sessionId="sess_S2")
short_3 = sessions_history(sessionId="sess_S3")
posts = [
    sessions_history(sessionId="sess_P1"),
    sessions_history(sessionId="sess_P2"),
    sessions_history(sessionId="sess_P3"),
    sessions_history(sessionId="sess_P4"),
    sessions_history(sessionId="sess_P5")
]

# 主 Agent 生成最终整合输出
整合提示 = f"""
请将以下内容整合成一份完整的内容创作输出:

【长文】{long_form}
【短文 1{short_1}
【短文 2{short_2}
【短文 3{short_3}
【社交帖子】{posts}

格式要求:
- 清晰的层次结构
- 每个内容块有标题标注
- 检查内容一致性
- 如有重复或矛盾,进行调和
"""

7. 常见错误与避坑指南

错误 1:子 Agent 启动后没有获取结果

症状: sessions_spawn 返回了 session_id,但之后无法获取结果

原因: 会话可能在后台运行,需要用 process 或 polling 获取

解决:

# 启动时指定等待模式
sessions_spawn(
    prompt="...",
    yieldMs=30000  # 30 秒后自动返回 session_id
)

# 或使用 process 轮询
process(action="poll", sessionId="sess_xxx", timeout=300000)

错误 2:子 Agent 之间的上下文不共享

症状: 子 Agent 1 的输出无法直接传给子 Agent 2

原因: 默认情况下,每个子 Agent 有独立的上下文

解决:

# 方式一:主 Agent 获取结果后传给下一个子 Agent
result1 = sessions_history(sessionId="sess_1")
sessions_spawn(
    prompt=f"基于以下内容继续工作:\n{result1}",
    name="continuation"
)

# 方式二:使用 context 参数传递
sessions_spawn(
    prompt="继续上一步的工作",
    context={"previous_result": "..."}
)

错误 3:太多子 Agent 导致资源耗尽

症状: 启动大量子 Agent 后,系统变慢或崩溃

原因: 每个子 Agent 都会消耗内存和 API 调用配额

解决:

# 限制并发数量
MAX_CONCURRENT = 5

# 分批启动
for i in range(10):
    if current_running >= MAX_CONCURRENT:
        wait_for_completion()
    spawn_agent(task[i])

错误 4:子 Agent 超时没有处理

症状: 子 Agent 超时中断,内容丢失

解决:

# 设置合理的超时时间
sessions_spawn(
    prompt="...",
    timeout=600000  # 10 分钟超时
)

# 实现重试机制
def spawn_with_retry(prompt, max_retries=3):
    for attempt in range(max_retries):
        try:
            result = sessions_spawn(prompt=prompt, timeout=300000)
            return result
        except TimeoutError:
            if attempt == max_retries - 1:
                raise
            continue

错误 5:忘记终止已完成但仍在运行的会话

症状: 会话列表越来越长,资源浪费

解决:

# 完成后主动终止
sessions_kill(sessionId="sess_xxx")

# 或者定期清理
sessions_list()  # 查看所有会话
for session in sessions_list():
    if session.status == "completed":
        sessions_kill(session.session_id)

术语注释

术语英文解释
Subagent子 Agent从主 Agent 派生的独立工作单元
Session会话一次完整的对话上下文
sessions_spawn启动子会话创建新的子 Agent 会话
sessions_send发送消息向指定会话发送消息
Map-Reduce映射归约分解-并行-整合的任务处理模式
Pipeline流水线串联多个处理阶段的任务模式
Yield让出控制交出执行权,等待结果返回

面试高频问答

Q1:Subagent 和普通的函数调用有什么区别?

回答:本质区别在于自主性上下文隔离。普通函数调用是同步的,你调用它,它执行,返回结果,整个过程在同一个上下文中。Subagent 是一个独立的 Agent,有自己完整的上下文、可以多轮交互、可以使用工具、超时机制等。你可以把它想象成雇佣了一个独立的小助手,而不是调用了一个函数。另一个关键区别是并行性:多个 Subagent 可以同时运行,互不干扰,而普通函数调用通常是串行的。

Q2:如何设计一个好的任务分解策略?

回答:好的任务分解要考虑三个因素。第一,独立性:分解出来的子任务尽可能互相独立,这样才真正能并行执行。第二,粒度适中:子任务太大(比如 10 小时的工作)无法有效并行;太小(比如 1 分钟的工作)则管理开销太大。第三,错误隔离:一个子任务失败不应该导致整体失败。实际建议:从「能不能同时做」的角度思考分解,如果两个任务需要同一个资源或依赖同一个输出,就不适合分解。

Q3:Subagent 适合什么场景,不适合什么场景?

回答:适合的场景包括:多语言内容并行生成(翻译、帖子);多个独立数据源的并行采集;代码库中多个模块的并行分析;需要不同专家视角同时处理的任务。不适合的场景包括:任务之间有强依赖(必须先 A 才能 B);简单的一次性任务(直接做比启动 Subagent 更高效);资源受限的环境(每个 Agent 都有内存和 API 成本)。

深度扩展

深度 1:Subagent 与 Cron 的结合

Subagent 可以与 Cron 结合,实现定时并行任务:

# Cron 触发后启动多个 Subagent
openclaw cron add "0 9 * * *" \
    --name "每日市场报告" \
    --prompt "
今天是周一,请生成本周市场报告。

启动 4 个 Subagent 并行采集数据:
1. Subagent A:采集宏观经济数据
2. Subagent B:采集行业动态
3. Subagent C:采集竞争对手信息
4. Subagent D:采集客户反馈

所有数据采集完成后,
整合成一份完整的市场报告,
发送到飞书群。
"

深度 2:多 Agent 协作框架

更复杂的多 Agent 场景,可以使用主从架构:

┌─────────────────────────────────────────────────────┐
│                    Orchestrator                       │
│                  (主编 Agent)                         │
│  - 理解用户需求                                       │
│  - 分解任务                                           │
│  - 分配给 Specialized Agents                          │
│  - 整合结果                                           │
└─────────────────────────────────────────────────────┘
                          │
        ┌─────────────────┼─────────────────┐
        ↓                 ↓                 ↓
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ Specialized   │ │ Specialized   │ │ Specialized   │
│ Agent A      │ │ Agent B       │ │ Agent C       │
│ (技术专家)    │ │ (市场专家)    │ │ (运营专家)    │
└───────────────┘ └───────────────┘ └───────────────┘

深度 3:Agent 间的通信协议

Subagent 之间可以直接通信(不通过主 Agent):

# Agent A 发现需要 Agent B 的数据,直接请求
sessions_send(
    sessionId="sess_agent_B",
    message="我需要 X 数据,请提供"
)

# Agent B 处理请求
# ...

# Agent B 返回结果给 Agent A
sessions_send(
    sessionId="sess_agent_A",
    message="X 数据如下:..."
)

附录

A.1 sessions API 速查

API用途示例
sessions_spawn启动新会话sessions_spawn(prompt="...")
sessions_send发送消息sessions_send(sessionId="...", message="...")
sessions_list列出所有会话sessions_list()
sessions_history获取历史sessions_history(sessionId="...")
sessions_kill终止会话sessions_kill(sessionId="...")

A.2 会话状态

状态说明
active正在运行
completed已完成
failed执行失败
timeout超时
cancelled被取消

A.3 任务分解模板

## 任务分解模板

### 输入
[原始任务描述]

### 分解方案
1. 子任务 1:[描述] → [子 Agent 名称]
2. 子任务 2:[描述] → [子 Agent 名称]
3. 子任务 3:[描述] → [子 Agent 名称]

### 依赖关系
- 子任务 1 和 2 可并行
- 子任务 3 依赖 1 和 2 的结果

### 整合逻辑
[如何将子任务结果合并]

系列总结(第 01-11 章)

通过前十章(加上本章)的学习,我们已经全面掌握了 OpenClaw 的核心能力:

第 01-10 章: 基础认知、配置体系、人格设计、记忆系统、Skills 架构、核心工具集、编程 Agent、多模型路由、飞书集成、定时任务
第 11 章: Subagent 与会话管理,复杂任务分解执行

现在你已经能够构建复杂的多 Agent 工作流。接下来两章我们将学习安全与权限(生产环境部署指南)以及自定义 Skill 开发。读完这两章,你将能够在生产环境中安全地部署 OpenClaw,并开发自己的 Skills。

版权声明

本文为原创技术实践文章,禁止未经授权的全文转载;引用请注明出处与本文链接。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐