OpenClaw 多 Agent 子任务分发:sessions_spawn 实战

🧬 一个 Agent 不够用?让父 Agent 自动拆解任务、生成子 Agent、并行执行、汇总结果。sessions_spawn 把 OpenClaw 从"单兵作战"升级为"指挥部模式"

📑 文章目录

  1. 为什么需要子任务分发:单 Agent 的天花板
  2. sessions_spawn 30 秒速懂:Agent 的 fork()
  3. sessions_spawn vs 多 Agent 路由:两种"多 Agent"有什么不同
  4. 核心机制:父子 Agent 的生命周期
  5. 实战一:架构规划 + 代码实现的两阶段分发
  6. 实战二:并行代码生成——同时写五个模块
  7. 社区案例:Patch——Telegram 协调 20 个并行 Agent
  8. 任务分解策略设计:什么任务该拆,怎么拆
  9. 子 Agent 权限隔离与安全配置
  10. 结果汇总:子 Agent 怎么把活儿交回来
  11. 调优与调试:Token 成本、超时、失败处理
  12. 完整配置 & 总结

1. 为什么需要子任务分发:单 Agent 的天花板

用 OpenClaw 干过大活的人都遇到过这个瓶颈:

💬 你:帮我重构整个项目,从 Express 迁移到 Hono,
      包括路由层、中间件、数据库层、测试,全部迁移。

🤖 Agent(单兵作战模式):
  好的,让我开始...
  
  [重构 routes/auth.ts]          ← 45 分钟
  [重构 routes/users.ts]         ← 30 分钟
  [重构 middleware/cors.ts]      ← 15 分钟
  [重构 middleware/auth.ts]      ← 20 分钟
  [重构 db/connection.ts]        ← 25 分钟
  [重构 tests/auth.test.ts]     ← 40 分钟
  ...
  
  ⚠️ 到第 4 个文件时上下文已经 120K Token
  ⚠️ Compaction 触发,丢失了前面的迁移细节
  ⚠️ 测试文件的改动跟路由文件不一致
  
  总耗时:3.5 小时
  总成本:$18
  质量:后半段明显退化

问题出在哪?

三大瓶颈

瓶颈一:串行执行

单 Agent 一次只能干一件事。五个互不依赖的文件重构,它必须一个接一个地做——即使这些任务完全可以并行。

瓶颈二:上下文污染

一个 Agent 在同一个 Session 中做所有事,路由重构的上下文(Hono 语法、中间件迁移方案)会和测试重构的上下文(vitest 配置、mock 策略)混在一起。上下文越来越大,质量越来越差。

瓶颈三:能力错配

架构规划需要深度思考(高 thinking budget),批量文件改写只需要快速执行(低 thinking budget)。单 Agent 只有一套模型配置,无法针对子任务动态调整。

sessions_spawn 解决的就是这三个问题:拆任务、给专人、并行跑。


2. sessions_spawn 30 秒速懂:Agent 的 fork()

类比理解

如果你写过 Unix/Linux 程序,你一定知道 fork() 系统调用——父进程创建一个子进程,子进程继承父进程的环境但独立运行。

sessions_spawn 就是 OpenClaw Agent 的 fork()

Unix 世界:
  父进程 → fork() → 子进程(独立 PID、独立内存空间)
  
OpenClaw 世界:
  父 Agent → sessions_spawn → 子 Agent(独立 Session、独立上下文、独立 workspace)

💡 一句话定义sessions_spawn 是 OpenClaw Agent 的一个内置工具,允许父 Agent 将复杂目标分解为子任务,并生成专门的子 Agent 来处理。每个子 Agent 运行在自己的 Session 中,有独立的上下文窗口,执行完毕后将结果返回给父 Agent。

它解决了什么

问题 sessions_spawn 的解法
串行瓶颈 多个子 Agent 并行执行,互不等待
上下文污染 每个子 Agent 有独立的 Session 和上下文
能力错配 每个子 Agent 可以使用不同的模型和 thinking budget
结果汇总 父 Agent 收集所有子 Agent 的结果,统一整合

3. sessions_spawn vs 多 Agent 路由:两种"多 Agent"有什么不同

OpenClaw 有两种"多 Agent"机制,新手容易混淆:

维度 多 Agent 路由(上篇文章) sessions_spawn(本文)
谁创建 Agent 你(人类)在 openclaw.json 中预定义 父 Agent 在运行时动态创建
触发方式 不同渠道 / /agent <name> 手动切换 父 Agent 调用 sessions_spawn 工具自动生成
生命周期 常驻(Gateway 运行期间始终存在) 临时(任务完成后子 Agent 销毁)
典型用途 不同角色处理不同类型的任务 一个大任务拆成多个并行子任务
Session 独立长期 Session 子 Session,结果回传给父 Session
类比 公司里不同部门(研发部、行政部) 项目经理临时组建专项攻坚小组
多 Agent 路由:
  
  你 ──→ Telegram Bot A ──→ work Agent(常驻)
  你 ──→ Telegram Bot B ──→ life Agent(常驻)
  
  不同入口 → 不同固定 Agent

sessions_spawn:

  你 ──→ 父 Agent(接收大任务)
              │
              ├── spawn → 子 Agent 1(规划架构)  ← 临时
              ├── spawn → 子 Agent 2(写路由)    ← 临时
              ├── spawn → 子 Agent 3(写测试)    ← 临时
              │
              └── 汇总子 Agent 结果 → 返回给你

一句话总结:路由是"静态分工",spawn 是"动态派遣"。两者互补,不是替代。


4. 核心机制:父子 Agent 的生命周期

4.1 完整生命周期

Phase 1: 父 Agent 接收任务
┌─────────────────────────────────────────┐
│ 💬 你:"重构整个项目,从 Express 到 Hono" │
│                                          │
│ 🤖 父 Agent(main):                    │
│    分析任务 → 决定拆分为 3 个子任务       │
└─────────────────────────────────────────┘
                    │
                    ▼
Phase 2: 父 Agent 调用 sessions_spawn
┌─────────────────────────────────────────┐
│ 父 Agent 调用 sessions_spawn 三次:      │
│                                          │
│  spawn({                                 │
│    prompt: "规划 Express→Hono 迁移架构", │
│    model: "opus-4",                      │
│    thinkingBudget: 20000                 │
│  }) → 子 Agent A (架构师)                │
│                                          │
│  spawn({                                 │
│    prompt: "重构路由层和中间件",           │
│    model: "sonnet-4.5",                  │
│    thinkingBudget: 5000                  │
│  }) → 子 Agent B (编码)                  │
│                                          │
│  spawn({                                 │
│    prompt: "重写所有测试",                │
│    model: "sonnet-4.5",                  │
│    thinkingBudget: 3000                  │
│  }) → 子 Agent C (测试)                  │
└─────────────────────────────────────────┘
                    │
                    ▼
Phase 3: 子 Agent 并行执行
┌──────────┐  ┌──────────┐  ┌──────────┐
│ 子 Agent A│  │ 子 Agent B│  │ 子 Agent C│
│ (架构师)  │  │ (编码)    │  │ (测试)    │
│ Opus 4    │  │ Sonnet    │  │ Sonnet    │
│           │  │           │  │           │
│ 独立      │  │ 独立      │  │ 独立      │
│ Session   │  │ Session   │  │ Session   │
│ 独立      │  │ 独立      │  │ 独立      │
│ 上下文    │  │ 上下文    │  │ 上下文    │
│           │  │           │  │           │
│ 输出:     │  │ 输出:     │  │ 输出:     │
│ 架构方案   │  │ 重构代码   │  │ 测试代码   │
└──────┬───┘  └──────┬───┘  └──────┬───┘
       │             │             │
       ▼             ▼             ▼
Phase 4: 结果汇总
┌─────────────────────────────────────────┐
│ 🤖 父 Agent 收集三个子 Agent 的结果:    │
│                                          │
│  子 A 返回:架构方案 + 文件变更计划       │
│  子 B 返回:重构后的路由和中间件代码       │
│  子 C 返回:重写后的测试文件              │
│                                          │
│  父 Agent 整合 → 检查一致性 → 返回给你   │
└─────────────────────────────────────────┘
                    │
                    ▼
Phase 5: 子 Agent 销毁
  子 Session 关闭,资源释放
  父 Agent 继续在原 Session 中工作

4.2 sessions_spawn 工具参数

// sessions_spawn 的调用参数
{
  "tool": "sessions_spawn",
  "arguments": {
    // 必填:给子 Agent 的指令
    "prompt": "规划 Express 到 Hono 的迁移架构方案...",
    
    // 可选:子 Agent 使用的模型(不指定则继承父 Agent)
    "model": "anthropic/claude-opus-4",
    
    // 可选:子 Agent 的 thinking budget
    "thinkingBudget": 20000,
    
    // 可选:子 Agent 可使用的工具
    "allowedTools": ["read_file", "exec", "browser"],
    
    // 可选:子 Agent 的工作目录
    "workingDirectory": "~/workspace/work/src/routes"
  }
}

4.3 关键特性

特性 说明
独立 Session 子 Agent 运行在全新的 Session 中,上下文是干净的
独立上下文 子 Agent 的上下文不会污染父 Agent
模型可覆盖 子 Agent 可以用跟父 Agent 不同的模型
工具可限制 可以限制子 Agent 能使用哪些工具
结果回传 子 Agent 完成后,输出自动返回给父 Agent
并行执行 多个 spawn 可以同时运行

5. 实战一:架构规划 + 代码实现的两阶段分发

5.1 场景描述

你想把一个 Express.js 项目迁移到 Hono。这需要两个阶段:

  1. 架构规划(需要深度思考,用 Opus)
  2. 代码实现(需要快速编写,用 Sonnet)

5.2 让父 Agent 自动分发

💬 你:帮我把这个 Express 项目迁移到 Hono。
      先做架构规划,确认方案后再实施。

🤖 父 Agent (main, Sonnet 4.5):
  好的,我来分析项目结构...
  
  [读取 package.json, src/ 目录结构]
  
  项目包含:
  - 12 个路由文件
  - 5 个中间件
  - 3 个数据库模型
  - 28 个测试文件
  
  我会分两个阶段来处理:

  === 阶段一:架构规划 ===
  
  [调用 sessions_spawn]
  生成子 Agent: architect (Opus 4, thinking: 20K)
  指令:"分析以下 Express.js 项目结构,规划到 Hono 的完整迁移方案。
        重点关注:路由迁移策略、中间件兼容性、数据库层是否需要改动、
        测试迁移策略。输出为结构化的迁移计划文档。"
  
  ⏳ 子 Agent (architect) 正在工作...
  
  [子 Agent 返回] 迁移计划:
  1. 路由层:Express.Router → Hono.app.route(),12 个文件
  2. 中间件:cors/helmet 用 Hono 原生替代,auth 需重写
  3. 数据库层:无需改动(已用 Repository 模式解耦)
  4. 测试:supertest → @hono/testing,需更新所有测试
  5. 风险点:Express 的 req.ip 在 Hono 中行为不同
  
  === 阶段二:并行实施 ===
  
  方案看起来很好,我开始并行实施:
  
  [调用 sessions_spawn × 3]
  
  子 Agent B (Sonnet 4.5, thinking: 5K):
    "按照以下迁移计划,重构 src/routes/ 下的所有路由文件..."
  
  子 Agent C (Sonnet 4.5, thinking: 5K):
    "按照以下迁移计划,重构 src/middleware/ 下的所有中间件..."
  
  子 Agent D (Sonnet 4.5, thinking: 3K):
    "按照以下迁移计划,更新所有测试文件从 supertest 到 @hono/testing..."
  
  ⏳ 三个子 Agent 并行执行中...
  
  [子 Agent B 完成] 路由层重构完成,12 个文件已更新
  [子 Agent C 完成] 中间件重构完成,5 个文件已更新
  [子 Agent D 完成] 测试更新完成,28 个文件已更新
  
  === 汇总 ===
  
  所有子任务完成。我来做最终整合检查...
  [运行 npm test]
  ✅ 27/28 测试通过
  ⚠️ 1 个测试失败:tests/auth.test.ts(req.ip 行为差异)
  
  让我修复这个问题...
  [修复 auth.test.ts]
  [运行 npm test]
  ✅ 28/28 测试全部通过
  
  迁移完成!总结:
  - 45 个文件已修改
  - 使用了 4 个子 Agent(1 架构 + 3 实施)
  - 总耗时:25 分钟(串行需要 3+ 小时)

5.3 配置父 Agent 的 SOUL.md 来引导分发策略

# SOUL.md — 支持 sessions_spawn 的父 Agent

## 任务分解策略

当收到一个大型任务(涉及 5+ 个文件或 3+ 个独立步骤)时:

1. **先分析**:读取项目结构,理解任务范围
2. **判断是否需要拆分**:
   - 子任务之间是否独立?→ 拆分并行
   - 需要不同深度的思考?→ 拆分用不同模型
   - 单 Agent 上下文能否容纳?→ 超过 50K 就拆
3. **制定分发计划**:告诉用户你打算怎么拆,等确认后再执行
4. **使用 sessions_spawn**:
   - 架构/设计类任务 → 高 thinking budget (15K-20K)
   - 编码/实现类任务 → 中 thinking budget (3K-5K)
   - 格式化/清理类任务 → 低 thinking budget (1K)
5. **汇总和验证**:所有子 Agent 完成后,整合结果并运行测试

## sessions_spawn 使用规则
- 每次 spawn 前告诉用户你在做什么
- 子 Agent 的 prompt 必须包含足够的上下文(不要假设子 Agent 知道之前的对话)
- 子 Agent 完成后,检查输出的一致性
- 如果子 Agent 失败,报告失败原因并决定是重试还是回退

6. 实战二:并行代码生成——同时写五个模块

6.1 场景

你在开发一个新功能,需要同时创建五个模块:API 路由、数据模型、业务逻辑、验证层、测试。

6.2 父 Agent 的分发策略

💬 你:创建一个"用户邀请"功能,包括:
      1. POST /api/invites 路由
      2. Invite 数据模型(PostgreSQL)
      3. InviteService 业务逻辑
      4. 输入验证(zod schema)
      5. 完整的测试套件

🤖 父 Agent:
  这是一个五模块并行开发任务。我来拆分:

  [分析现有代码风格和项目约定]
  [读取 CLAUDE.md 了解编码规范]

  我会先生成一个共享的接口定义,然后让 5 个子 Agent 并行工作:

  === 预备工作(父 Agent 自己做)===
  
  创建 src/types/invite.ts:

  export interface Invite {
    id: string;
    email: string;
    role: 'admin' | 'member' | 'viewer';
    invitedBy: string;
    expiresAt: Date;
    status: 'pending' | 'accepted' | 'expired';
    createdAt: Date;
  }

  
  === 并行分发 ===
  
  [spawn × 5 并行]
  
  子 Agent 1: "创建 src/routes/invites.ts — POST /api/invites 路由
    参考 src/routes/users.ts 的风格。类型定义见 src/types/invite.ts"
  
  子 Agent 2: "创建 src/models/invite.model.ts — PostgreSQL 模型
    参考 src/models/user.model.ts 的风格。Schema 定义见类型文件"
  
  子 Agent 3: "创建 src/services/invite.service.ts — 业务逻辑
    包含:createInvite, acceptInvite, expireInvite, listInvites"
  
  子 Agent 4: "创建 src/validators/invite.validator.ts — zod schema
    参考 src/validators/user.validator.ts 的风格"
  
  子 Agent 5: "创建 tests/invite.test.ts — 完整测试
    覆盖:创建邀请、接受邀请、过期处理、权限检查"

6.3 关键技巧:共享上下文注入

子 Agent 不能读取父 Agent 的上下文,所以父 Agent 必须在 spawn 的 prompt 中注入足够的上下文

❌ 错误做法(子 Agent 收到一个没有上下文的指令):
  spawn({ prompt: "创建 invite 路由" })
  → 子 Agent:"什么框架?什么风格?什么类型?"

✅ 正确做法(在 prompt 中注入完整上下文):
  spawn({
    prompt: `
      创建 src/routes/invites.ts — POST /api/invites 路由。
      
      项目使用 Hono 框架 + TypeScript strict mode。
      参考现有路由风格(src/routes/users.ts 的内容如下):
      ${usersRouteContent}
      
      Invite 类型定义(src/types/invite.ts):
      ${inviteTypeContent}
      
      编码规范:
      - JSDoc 注释
      - Result<T,E> 错误处理
      - zod 验证在 middleware 层
    `
  })

7. 社区案例:Patch——Telegram 协调 20 个并行 Agent

7.1 Patch 是什么

社区中有一个叫"Patch"的项目,它是一个运行在 OpenClaw 上的主管 Agent(Supervisor)。Patch 通过 Telegram 接收用户的高层指令,然后将任务分解为多个子任务,通过 sessions_spawn 生成 5-20 个并行的子 Agent 来执行。

7.2 Patch 的工作方式

用户 → Telegram → Patch (主管 Agent)
                      │
                      │  分析任务,制定计划
                      │
                      ├── spawn → 子 Agent 1 (重构模块 A)
                      ├── spawn → 子 Agent 2 (重构模块 B)
                      ├── spawn → 子 Agent 3 (重构模块 C)
                      ├── spawn → 子 Agent 4 (写测试)
                      ├── spawn → 子 Agent 5 (更新文档)
                      ├── spawn → 子 Agent 6 ...
                      ├── ...
                      └── spawn → 子 Agent 20
                      
                      所有子 Agent 并行执行
                      
                      │
                      ▼
                  Patch 收集结果
                  运行集成测试
                  生成总结报告
                  │
                  ▼
              通过 Telegram 返回给用户:
              "✅ 20 个子任务完成。18 个成功,2 个需要人工审查。
               集成测试 95% 通过,3 个 flaky test 需要关注。"

7.3 Patch 的配置思路

# Patch 的 SOUL.md(简化版)

## 身份
你是 Patch,一个项目协调员。你的工作不是亲自写代码,
而是将大型任务分解、分发给专门的子 Agent,并确保质量。

## 工作流程
1. 收到任务后,先花 2 分钟分析范围
2. 列出所有子任务和依赖关系
3. 将无依赖的任务并行 spawn
4. 有依赖的任务等前置完成后再 spawn
5. 所有子任务完成后,运行集成测试
6. 生成报告:成功/失败/需人工审查

## 子 Agent 分配策略
- 架构决策:Opus 4, thinking 20K
- 常规编码:Sonnet 4.5, thinking 5K
- 文档/格式:Haiku 3.5, thinking 1K
- 测试编写:Sonnet 4.5, thinking 3K

## 并行限制
- 最多同时 10 个子 Agent(避免 API rate limit)
- 如果任务超过 10 个,分批执行

## 失败处理
- 子 Agent 失败:重试一次,仍失败则标记为"需人工审查"
- 集成测试失败:分析失败原因,尝试自动修复(最多 2 轮)

7.4 关键收获

Patch 的作者分享的经验:

  • 并行 20 个 Agent 比串行快 8 倍:原本 4 小时的工作,30 分钟完成
  • Token 成本增加约 30%:因为每个子 Agent 都需要注入上下文,有重复。但时间节省值得这个代价
  • 子 Agent 质量更高:每个子 Agent 的上下文是干净的,专注于一个任务,不会被其他任务的信息干扰
  • 最大挑战是结果整合:20 个子 Agent 的输出如果有冲突(比如两个人改了同一个文件),父 Agent 需要智能合并

8. 任务分解策略设计:什么任务该拆,怎么拆

8.1 决策树:该不该用 sessions_spawn

你收到的任务 →
  │
  ├── 涉及几个独立步骤?
  │     │
  │     ├── 1-2 个 → 不拆,单 Agent 搞定
  │     │
  │     └── 3+ 个 → 继续判断 ↓
  │
  ├── 步骤之间有依赖吗?
  │     │
  │     ├── 全部有依赖(A→B→C)→ 不拆,串行更安全
  │     │
  │     ├── 部分有依赖 → 拆成依赖组:
  │     │     Phase 1: [A, B] 并行
  │     │     Phase 2: [C(依赖A), D(依赖B)] 并行
  │     │
  │     └── 完全独立 → 全部并行 spawn
  │
  ├── 需要不同深度的思考吗?
  │     │
  │     ├── 是(如:设计+实现)→ 拆,用不同模型
  │     │
  │     └── 否(同质任务)→ 拆只为并行加速
  │
  └── 单 Agent 上下文能容纳吗?
        │
        ├── 是(< 50K Token)→ 可以不拆
        │
        └── 否(> 50K Token)→ 必须拆,避免 compaction 导致质量下降

8.2 分解模式

模式 A:阶段分解(串行 spawn)

Phase 1: spawn(架构师) → 输出架构方案
                ↓ 方案作为输入
Phase 2: spawn(编码者) → 输出代码
                ↓ 代码作为输入  
Phase 3: spawn(测试者) → 输出测试

适用场景:后一步依赖前一步的输出。

模式 B:并行分解(并发 spawn)

spawn(模块A编码) ─┐
spawn(模块B编码) ─┤
spawn(模块C编码) ─┼── 全部完成后汇总
spawn(模块D编码) ─┤
spawn(模块E编码) ─┘

适用场景:多个独立模块的同类任务。

模式 C:混合分解(分阶段 + 并行)

Phase 1: spawn(架构师) → 输出方案
              ↓
Phase 2: spawn(路由) ─┐
         spawn(模型) ─┼── 并行执行
         spawn(测试) ─┘
              ↓
Phase 3: spawn(集成测试) → 验证

适用场景:大型项目,先规划再并行实施最后验证。这是最常用的模式。

8.3 prompt 工程:怎么给子 Agent 写指令

子 Agent 的 prompt 必须是"自包含的"——
它不能假设子 Agent 知道之前的对话。

一个好的子 Agent prompt 包含:

1. 【目标】你要做什么(一句话)
2. 【背景】项目用什么技术栈,当前处于什么阶段
3. 【规范】编码风格、命名约定、错误处理模式
4. 【参考】现有代码的示例(直接粘贴,不要说"参考 xxx 文件")
5. 【输出】期望的输出格式(文件路径 + 内容)
6. 【约束】不要做什么(如"不要修改其他文件")

9. 子 Agent 权限隔离与安全配置

9.1 为什么需要权限隔离

子 Agent 继承父 Agent 的基础权限,但你可能不想给所有子 Agent 相同的权限。例如:

  • 架构师子 Agent 只需要读取文件,不需要写入
  • 编码子 Agent 需要写入特定目录,但不需要执行命令
  • 测试子 Agent 需要执行命令(运行测试),但不需要写入源代码

9.2 在 spawn 中限制工具

// 架构师:只读
{
  "tool": "sessions_spawn",
  "arguments": {
    "prompt": "分析项目架构...",
    "allowedTools": ["read_file", "list_directory", "browser"]
  }
}

// 编码者:读写特定目录
{
  "tool": "sessions_spawn",
  "arguments": {
    "prompt": "实现路由模块...",
    "allowedTools": ["read_file", "write_file", "list_directory"],
    "workingDirectory": "~/workspace/work/src/routes"
  }
}

// 测试者:读写 + 执行测试
{
  "tool": "sessions_spawn",
  "arguments": {
    "prompt": "编写并运行测试...",
    "allowedTools": ["read_file", "write_file", "exec"],
    "workingDirectory": "~/workspace/work/tests"
  }
}

9.3 openclaw.json 中的子 Agent 默认权限

// ~/.openclaw/openclaw.json — 子 Agent 安全配置
{
  "agents": {
    "defaults": {
      "spawn": {
        // 子 Agent 默认继承的安全策略
        "defaultTools": ["read_file", "write_file", "list_directory", "exec"],
        
        // 子 Agent 永远不能使用的工具(即使父 Agent 授权)
        "blockedTools": [
          "browser",
          "mcp.*.delete",
          "mcp.*.create"
        ],
        
        // 子 Agent 的文件操作限制在父 Agent 的 workspace 内
        "inheritWorkspace": true,
        
        // 子 Agent 的 elevated 策略
        "elevated": {
          "mode": "parent-approval"
        },
        
        // 并行限制
        "maxConcurrent": 10,
        
        // 单个子 Agent 的 Token 上限
        "maxTokensPerChild": 200000,
        
        // 子 Agent 的超时(分钟)
        "timeout": 30
      }
    }
  }
}

🚨 安全红线elevated.mode: "parent-approval" 意味着子 Agent 要执行高权限操作时,审批请求会传递给父 Agent(而不是直接弹窗给用户)。父 Agent 根据自己的策略决定是否批准。这避免了 20 个子 Agent 同时弹 20 个审批窗口的混乱。


10. 结果汇总:子 Agent 怎么把活儿交回来

10.1 自动回传机制

子 Agent 完成任务后,它的最终输出(最后一条消息)会自动返回给父 Agent,成为父 Agent 上下文中的一条工具结果消息。

父 Agent 的上下文视角:

  [User] "重构整个项目..."
  [Agent] 分析后决定 spawn 3 个子 Agent
  [Tool: sessions_spawn] 子 Agent A 的最终输出:
    "架构方案如下:1. 路由层... 2. 中间件... 3. ..."
  [Tool: sessions_spawn] 子 Agent B 的最终输出:
    "路由层重构完成。修改了 12 个文件:src/routes/auth.ts..."
  [Tool: sessions_spawn] 子 Agent C 的最终输出:
    "测试更新完成。28 个测试文件已更新,运行结果:27/28 通过"
  [Agent] 汇总所有结果...

10.2 设计好的输出格式

为了让父 Agent 高效汇总,子 Agent 的 prompt 应该规定输出格式:

在 spawn prompt 的最后加上:

"完成后,以以下格式汇报:
 
 ## 任务完成报告
 - 状态:成功/部分成功/失败
 - 修改的文件列表(带完整路径)
 - 关键决策说明(如果有偏离预定方案的地方)
 - 发现的问题或风险
 - 建议的后续步骤"

10.3 处理子 Agent 失败

父 Agent 的失败处理逻辑:

子 Agent 返回 →
  │
  ├── 状态: 成功 → 收集结果,继续
  │
  ├── 状态: 部分成功 → 
  │     分析哪些部分完成了
  │     对未完成部分:重新 spawn(加更多上下文)或手动处理
  │
  └── 状态: 失败 →
        分析失败原因
        ├── 可重试错误(超时、API 限流)→ 重试一次
        └── 不可重试错误(任务描述不清、权限不足)→ 报告给用户

11. 调优与调试:Token 成本、超时、失败处理

11.1 Token 成本分析

sessions_spawn 的 Token 开销模型:

总 Token = 父 Agent Token + Σ(子 Agent Token)

父 Agent Token:
  正常对话 + spawn 调用的 prompt + 结果汇总

子 Agent Token:
  每个子 Agent = 系统提示 + 注入的上下文 + 执行过程 + 输出

关键开销点:
  ⚠️ 上下文重复注入:
     如果 5 个子 Agent 都需要知道项目编码规范,
     每个子 Agent 的 prompt 里都要包含这段规范 → 5 倍重复
     
  优化方式:
  1. 提取共享上下文到一个文件,让子 Agent 自己读取
     spawn({ prompt: "先读取 CLAUDE.md 了解规范,然后..." })
  2. 精简注入的上下文,只给每个子 Agent 需要的部分

11.2 成本优化策略

策略 说明 预期节省
子 Agent 用便宜模型 批量编码用 Haiku/Sonnet,只有规划用 Opus 30-60%
精简 prompt 只注入子 Agent 需要的上下文,不是全部 15-25%
限制 thinking 简单子任务设低 thinking budget 20-40%
减少子 Agent 数量 能 3 个做完的不拆成 10 个 上下文重复减少
文件引用代替内联 "先读取 CLAUDE.md" 代替把 CLAUDE.md 内容塞进 prompt 50%+ 上下文节省

11.3 调试技巧

# 查看子 Agent 的 Session 列表
openclaw sessions list --parent main
# PARENT   CHILD_ID     AGENT      STATUS     TOKENS   DURATION
# main     spawn-a1b2   architect  completed  45K      3m 20s
# main     spawn-c3d4   coder-1    completed  32K      2m 10s
# main     spawn-e5f6   coder-2    failed     18K      1m 05s
# main     spawn-g7h8   tester     running    28K      4m 30s

# 查看失败的子 Agent 的日志
openclaw sessions log spawn-e5f6
# [ERROR] Tool 'exec' not allowed for this spawned session
# [ERROR] 子 Agent 尝试运行命令但没有 exec 权限

# 查看父子 Agent 的 Token 消耗
openclaw usage --today --by-session --parent main

11.4 常见问题排查

症状 可能原因 解决方案
子 Agent 什么都不做就返回了 prompt 不够清晰 加入具体的步骤和期望输出格式
子 Agent 重复做父 Agent 已做的事 子 Agent 不知道上下文 在 prompt 中说明"以下工作已完成"
子 Agent 修改了不该改的文件 缺少 workingDirectory 限制 设置 workingDirectory + allowedTools
子 Agent 执行超时 任务太大 / thinking budget 太高 进一步拆分子任务或降低 budget
父 Agent 汇总时上下文爆了 子 Agent 返回内容太长 在 prompt 中要求精简输出格式
多个子 Agent 修改了同一文件 任务拆分有重叠 明确每个子 Agent 的文件职责范围
API rate limit 错误 并行太多 降低 maxConcurrent(建议 5-10)

12. 完整配置 & 总结

完整的 openclaw.json(支持 sessions_spawn)

// ~/.openclaw/openclaw.json — sessions_spawn 完整配置
{
  "agents": {
    "defaults": {
      "context": {
        "compactionThreshold": 0.7,
        "preserveRecent": 6
      },
      
      // 子 Agent 默认配置
      "spawn": {
        "defaultTools": ["read_file", "write_file", "list_directory", "exec"],
        "blockedTools": ["browser", "mcp.*.delete"],
        "inheritWorkspace": true,
        "elevated": { "mode": "parent-approval" },
        "maxConcurrent": 10,
        "maxTokensPerChild": 200000,
        "timeout": 30
      }
    },
    
    "list": [
      {
        "name": "main",
        "description": "Primary agent with spawn orchestration capability",
        "model": {
          "primary": "anthropic/claude-sonnet-4-5",
          "thinkingBudget": { "type": "tokens", "maxTokens": 8000 }
        },
        "workspace": "~/workspace/work",
        "soul": "~/.openclaw/agents/main/SOUL.md"
      }
    ]
  },
  
  "tools": {
    "elevated": {
      "mode": "ask",
      "gates": ["exec", "write", "apply_patch"]
    }
  }
}

推荐的 SOUL.md 模板(支持 spawn 的父 Agent)

# SOUL.md — 主管 Agent

## 任务分解策略
当收到大型任务(5+ 文件或 3+ 独立步骤)时:
1. 先分析任务范围,列出所有子任务
2. 识别依赖关系(哪些可以并行,哪些必须串行)
3. 告诉用户你的分发计划,等确认后执行
4. 使用 sessions_spawn 分发子任务

## 子 Agent 模型选择
- 架构/设计:高 thinking budget (15K-20K)
- 常规编码:中 thinking budget (3K-5K)
- 文档/测试:低 thinking budget (1K-3K)

## 子 Agent prompt 规范
每个子 Agent 的 prompt 必须包含:
- 明确的目标(一句话)
- 项目上下文(技术栈、编码规范)
- 参考代码(如果有的话,直接粘贴关键片段)
- 期望的输出格式
- 约束条件(不能做什么)

## 汇总规则
- 所有子 Agent 完成后,运行测试验证
- 如果有冲突,优先以架构师子 Agent 的方案为准
- 子 Agent 失败时:重试一次,仍失败则报告给用户

🎯 五个关键 Takeaway

  1. sessions_spawn 是动态派遣 —— 不同于多 Agent 路由的"静态分工",spawn 让父 Agent 在运行时按需创建临时子 Agent 来处理子任务
  2. 并行是最大价值 —— 5 个独立模块可以同时开发,实测速度提升 3-8 倍,上下文零污染
  3. 子 Agent 的 prompt 必须自包含 —— 子 Agent 看不到父 Agent 的上下文,所有需要的信息必须注入到 spawn prompt 中
  4. 权限隔离不能省 —— 通过 allowedToolsworkingDirectoryblockedTools 限制每个子 Agent 的能力范围
  5. 混合分解模式最实用 —— 先 spawn 一个架构师(串行),再根据方案 spawn 多个编码者(并行),最后汇总验证

📚 参考资料

如果觉得有帮助,欢迎 点赞 👍 收藏 ⭐ 关注 🔔,有问题评论区见!


本文为原创内容,转载请注明出处。

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐