一、为什么需要子代理
回想第八章的"早报"工作流:
1. 抓天气
2. 抓邮件
3. 抓微信
4. 抓日程
5. 抓新闻
6. 汇总
如果一步步串行跑,6 步合计 50 秒。如果前 5 步并行,总耗时 = max(5 步) ≈ 12 秒。
更大的问题是:复杂任务里"贵的脑子"和"便宜的手"应该分开。例如:
- 主代理(贵脑子,DeepSeek-Reasoner / Claude Sonnet)做规划:决定要分几路、每路问什么;
- 子代理(便宜手,DeepSeek-Chat / 本地 Qwen3-8b)执行:抓数据、做翻译、做提取。
子代理是"做大事 + 省钱"的关键基础设施。
二、子代理的本质
子代理 = 从主代理派生出去的、独立会话、独立模型、独立超时的"小型 OpenClaw"。
关键属性:
| 属性 | 说明 |
|---|---|
| 独立会话 | 子代理看不到主代理的对话历史 |
| 独立模型 | 主代理用 Claude,子代理可以用 DeepSeek,省钱 |
| 独立工具 | 默认拿不到主代理的全部 Skills,要显式声明 |
| 独立超时 | 简单任务给 60 秒,复杂任务给 600 秒 |
| 并行 | 可以同时跑多个,最多默认 5 个 |
| 必须自包含 | 主代理必须把所有上下文塞进 instruction 里 |
| 完成后回报 | 通过 onComplete 把结果回传给主代理 |
三、第一个子代理:3 行代码
在 OpenClaw 的 tui 或 web 界面,主代理可以这样调用:
sessions_spawn({
instruction: "查一下今天杭州的天气,输出一句话总结,含温度区间和是否需要带伞",
model: "deepseek/deepseek-chat",
timeout: 60
})
它会立刻派生一个子代理在后台跑,60 秒后把结果返回。
完整参数:
sessions_spawn({
instruction: "<必填> 子代理的任务描述,要自包含所有上下文",
model: "deepseek/deepseek-chat", // 用什么模型
skills: ["weather-cn"], // 显式赋予哪些工具
timeout: 60, // 最大执行时间(秒)
thinking: false, // 是否启用"深度思考"模式
onComplete: "总结结果给主代理", // 完成后做什么
onError: "abort" // 报错时怎么办:abort/retry/skip
})
四、并行:让 4 个子代理同时干
最大威力的玩法。例:早报场景
// 在主代理里
const tasks = [
{
instruction: "用 weather-cn 查今天杭州天气,输出一句话总结",
skills: ["weather-cn"],
model: "deepseek/deepseek-chat"
},
{
instruction: "用 gmail-assistant 拉过去 24 小时的邮件,按紧急/重要/常规分类,每类不超过 3 条",
skills: ["gmail-assistant"],
model: "deepseek/deepseek-chat"
},
{
instruction: "用 wechat-bridge 抓所有 @我 的群消息和重要私聊,最多 5 条",
skills: ["wechat-bridge"],
model: "deepseek/deepseek-chat"
},
{
instruction: "用 calendar-sync 列今天日程,按时间排,最多 5 条",
skills: ["calendar-sync"],
model: "deepseek/deepseek-chat"
}
];
const results = await Promise.all(tasks.map(t => sessions_spawn(t)));
注意:默认最多 5 个子代理并行。超过会被排队,避免速率限制。
主代理拿到 4 份返回,做最后的"汇总成一份早报"——这一步用贵的脑子(DeepSeek-Reasoner / Claude Sonnet)。
成本估算:4 个子代理 × DeepSeek-Chat(便宜)+ 1 个主代理 × DeepSeek-Reasoner(贵)= 每天 0.05 元,每月 1.5 元。
五、用斜杠命令直接玩
不写 JS 代码,在 tui / web 界面直接发:
/subagents spawn --model deepseek/deepseek-chat --timeout 60
帮我查 https://hacker-news.firebaseio.com 上最新 10 条头条,输出标题中文翻译。
OpenClaw 立刻给你弹出子代理 ID:#sa-7f3a9b2。
/subagents list # 列出所有运行中的子代理
/subagents info sa-7f3a9b2 # 查看一个子代理的状态
/subagents kill sa-7f3a9b2 # 杀掉
/subagents wait sa-7f3a9b2 # 阻塞主代理等它跑完
六、模型搭配的最佳实践
三档分配
任务难度 推荐模型 超时 并行数
───────────── ─────────────────── ──────── ──────
简单任务 本地 qwen3-8b / 60s 4-5 个
(查询/分类) DeepSeek-Chat
───────────── ─────────────────── ──────── ──────
中等任务 DeepSeek-Chat / 180s 3-4 个
(总结/起草) GPT-4.1-mini
───────────── ─────────────────── ──────── ──────
复杂任务 DeepSeek-Reasoner / 600s 1-2 个
(决策/写代码) Claude Sonnet 4.6
在工作流里如何用
工作流配置里可以直接声明:
- name: 派 4 个子代理并行抓数据
parallel:
- skill: subagent
args:
instruction: "查天气..."
model: deepseek/deepseek-chat
timeout: 60
- skill: subagent
args:
instruction: "拉邮件..."
model: deepseek/deepseek-chat
timeout: 60
- skill: subagent
args:
instruction: "查日历..."
model: deepseek/deepseek-chat
timeout: 60
- skill: subagent
args:
instruction: "找新闻..."
model: deepseek/deepseek-chat
timeout: 60
output: data_pack
- name: 主代理汇总
prompt: ./prompts/morning-brief.md
inputs: { data: "{{data_pack}}" }
model: deepseek/deepseek-reasoner
output: brief
七、嵌套:编排者 + 工人
更复杂的场景里,你需要"主代理 → 编排者 → 工人"三层结构。
启用嵌套
默认 maxSpawnDepth: 1(子代理不能再派生子代理)。在 ~/.openclaw/openclaw.json:
{
"subagents": {
"maxSpawnDepth": 2,
"maxParallel": 5,
"defaultTimeout": 120
}
}
用法示意
例:写一份"行业研究报告"
主代理(你)
↓ 派生
研究编排者(subagent)
↓ 派生 5 个工人
├─ 工人 1:抓厂商 A 的官网
├─ 工人 2:抓厂商 B 的官网
├─ 工人 3:抓行业新闻
├─ 工人 4:抓券商研报
└─ 工人 5:抓 Twitter / 知乎评论
↓
编排者汇总成一份初稿
↓
主代理审稿、润色、出最终版
完整示例代码(在主代理里):
sessions_spawn({
instruction: `
你是一名行业研究编排者。请按以下步骤执行:
1. 派生 5 个工人子代理,分别抓取:
- 厂商 A 官网产品页
- 厂商 B 官网产品页
- 36氪 / 虎嗅最近一个月相关文章
- 雪球研报
- 推特 / 知乎舆情
2. 等所有工人返回,汇总成"行业研究初稿",包含:
- 市场规模
- 主要玩家与定位
- 用户口碑
- 价格趋势
- 风险与机会
3. 输出 Markdown 格式,5000 字内。
`,
model: "deepseek/deepseek-chat",
timeout: 600,
thinking: false
});
八、子代理的 5 大注意事项
1. 必须把上下文塞进 instruction
子代理看不到主代理的 memory、看不到用户的桌面文件,所有需要的它都得自己拿到。
错例:
sessions_spawn({ instruction: "请按上面提到的格式输出" }) // ❌ "上面提到的"它不知道
正例:
sessions_spawn({
instruction: `
请按以下格式输出:
| 序号 | 内容 | 评分 |
任务:分析 ~/Desktop/反馈.csv
`
})
2. 并行别超过 5 个
更多会被外部 API 限流,反而更慢。
3. 简单任务不要用子代理
主代理自己就能算 2+3,再派子代理纯属浪费。
4. 永远设 timeout
不设的话死循环就把你的 API 余额烧空了。
5. 关键决策不要全权交子代理
子代理可以"做",但"决定要不要做"应该留给主代理(甚至留给你)。
九、什么时候不该用子代理
不要为了用而用。下列场景别用子代理:
- 任务总耗时 < 5 秒(启动子代理本身就有开销)
- 子任务之间有强依赖(必须 A 完成再做 B),子代理只擅长并行
- 任务本身就是模型能直接回答的(像"翻译这一句话")
- 你的总预算 < 1 元/天(子代理虽然便宜但是会调多次)
十、实战:让 4 个 AI"一起选房"
需求:你和女朋友想在杭州滨江租一套房,想让 AI 替你24 小时盯各大平台,每天早上给一份"今日新房推荐"。
工作流
name: rent-hunt
schedule: "0 8 * * *"
context:
city: 杭州
district: 滨江
budget_max: 6000
must_have: [独立卫浴, 通燃气, 公寓楼/电梯, 近地铁1km内]
avoid: [一楼, 顶楼, 朝北]
steps:
- name: 派 4 个子代理抓不同平台
parallel:
- { skill: subagent, args: {
instruction: "用 browser-pilot 抓贝壳 {{city}} {{district}} 不超过 {{budget_max}} 元的最新 50 条租房,输出 JSON 列表",
skills: [browser-pilot],
model: deepseek/deepseek-chat,
timeout: 120
}, output: beike }
- { skill: subagent, args: {
instruction: "抓自如",
skills: [browser-pilot],
model: deepseek/deepseek-chat,
timeout: 120
}, output: ziru }
- { skill: subagent, args: {
instruction: "抓蛋壳/相寓",
skills: [browser-pilot],
model: deepseek/deepseek-chat,
timeout: 120
}, output: danke }
- { skill: subagent, args: {
instruction: "抓闲鱼/豆瓣租房小组(个人房东)",
skills: [browser-pilot],
model: deepseek/deepseek-chat,
timeout: 120
}, output: c2c }
- name: 主代理筛选+排序
prompt: |
综合 4 路数据:
贝壳 {{beike}}
自如 {{ziru}}
蛋壳 {{danke}}
闲鱼 {{c2c}}
1. 去重(地址相似度 > 80% 视为同一套)
2. 必须满足:{{must_have}}
3. 排除:{{avoid}}
4. 综合评分(位置/性价比/装修/通勤)
5. 输出 Top 10
model: deepseek/deepseek-reasoner
output: top10
- name: 推送
skill: notify-bridge
args:
target: wechat:女朋友
content: "{{top10}}"
跑一周,真正合适的房子会被打捞出来,你和女朋友只看 Top10。
十一、子代理成本测算
以"早报 + 周报 + 租房 + 演唱会监控"4 个工作流为例:
| 工作流 | 频率 | 子代理用量 | 单次成本 | 月成本 |
|---|---|---|---|---|
| 早报 | 每天 1 次 | 4 子 + 1 主 | ¥0.05 | ¥1.5 |
| 周报 | 每周 1 次 | 4 子 + 1 主 | ¥0.10 | ¥0.4 |
| 租房 | 每天 1 次 | 4 子 + 1 主 | ¥0.30 | ¥9 |
| 演唱会监控 | 每分钟 1 次 | 1 子 | ¥0.001 | ¥45(注意!) |
注意演唱会监控这种"高频"任务,别开子代理——直接用 browser-pilot 即可,主代理调度就好。本表是对照警示。
合理设计,4 个常用工作流月成本可以 < 15 元。
十二、本章你应该完成的
- 在 tui 里跑一次
sessions_spawn,体验子代理是怎么"派出去 + 回来"的 - 改造你的"个人早报"工作流,把抓数据 4 步并行化
- 至少看一次
openclaw workflow stats,确认成本在预算内 - 关闭你不再需要的子代理,避免后台积压
本章一图回顾
主代理(贵脑子,做决策)
│
sessions_spawn()
│
┌──────────┼──────────┬──────────┬──────────┐
↓ ↓ ↓ ↓ ↓
子1 子2 子3 子4 子5
(便宜手)(便宜手)(便宜手)(便宜手)(便宜手)
↓ ↓ ↓ ↓ ↓
Promise.all 等所有人完成
↓
主代理汇总,输出最终结果
下章预告
权力越大、责任越大。一个能动手的 AI 同时也是一个能"误伤"的 AI。下一章 第十章 安全与隐私 我们认真讨论:怎么把 OpenClaw 用得安全、API Key 不被偷、敏感数据不泄露、Prompt Injection 攻击不能得逞。