OpenClaw 子 Agent run/session 模式源码分析
OpenClaw 子 Agent run/session 模式源码分析
分析时间:2026 年 3 月 28 日
源码版本:OpenClaw v2026.2.24
一、核心源码文件路径
| 文件 | 路径 |
|---|---|
| sessions-spawn-tool.ts | /opt/openclaw/src/agents/tools/sessions-spawn-tool.ts |
| subagent-spawn.ts | /opt/openclaw/src/agents/subagent-spawn.ts |
| subagent-registry.ts | /opt/openclaw/src/agents/subagent-registry.ts |
| sessions-send-tool.ts | /opt/openclaw/src/agents/tools/sessions-send-tool.ts |
二、sessions_spawn 实现流程
1 | sessions_spawn 调用 |
三、run vs session 模式核心差异
3.1 模式定义
1 | function resolveSpawnMode(params: { |
3.2 生命周期对比
| 维度 | run 模式 | session 模式 |
|---|---|---|
| 设计目标 | 一次性任务执行 | 持久化线程内协作 |
| thread 绑定 | 不需要 | 必须 (thread=true) |
| 生命周期 | 短暂 (默认 60 分钟归档) | 持久 (无归档时间) |
| 清理策略 | 可配置 | 固定 keep |
| 后续交互 | ❌ 不支持 | ✅ 支持 follow-up |
| 适用场景 | 独立任务、批处理 | 持续对话、复杂工作流 |
3.3 关键代码片段
1 | // mode="session" 强制要求 thread=true |
四、thread=true 限制原因
4.1 技术原因
thread=true 仅在支持线程绑定的渠道可用,目前仅 Discord 支持。
4.2 实现逻辑
1 | async function ensureThreadBindingForSubagentSpawn(params: {...}) { |
4.3 渠道支持情况
| 渠道 | thread=true 支持 | 原因 |
|---|---|---|
| Discord | ✅ 支持 | 实现了 subagent_spawning 钩子 |
| Dingtalk | ❌ 不支持 | 未实现线程绑定钩子 |
| Telegram | ❌ 不支持 | 未实现线程绑定钩子 |
| ❌ 不支持 | 未实现线程绑定钩子 |
五、sessions_send 消息投递机制
5.1 执行流程
1 | sessions_send 调用 |
5.2 两种模式下的行为
| 场景 | run 模式子 Agent | session 模式子 Agent |
|---|---|---|
| 发送时机 | 子 Agent 运行中或已完成 | 子 Agent 持续活跃 |
| 消息处理 | 正常处理,追加到对话历史 | 正常处理,作为线程内 follow-up |
| 超时行为 | timeoutSeconds 超时后返回 | 可持续接收消息 |
| 通知流 | 触发 A2A 通知 | 不触发完成通知(保持活跃) |
5.3 关键参数
1 | await callGateway({ |
六、子 Agent 消息处理机制
6.1 系统提示结构
1 | export function buildSubagentSystemPrompt(params: {...}) { |
6.2 完成通知流程
1 | 子 Agent 完成 |
七、决策矩阵:如何选择模式
| 需求 | 推荐模式 | 关键参数 |
|---|---|---|
| 一次性任务 | run |
mode: "run" |
| 多轮对话 | session |
mode: "session", thread: true |
| 并行处理 | run |
mode: "run"(多次调用) |
| Discord 线程助手 | session |
mode: "session", thread: true |
| 后台批处理 | run |
mode: "run" |
| 长期项目协作 | session |
mode: "session", cleanup: "keep" |
八、注意事项
- 深度限制:默认最大派生深度为 2 级(
maxSpawnDepth=2) - 子 Agent 数量限制:默认每个会话最多 5 个活跃子 Agent(
maxChildrenPerAgent=5) - 超时控制:可通过
runTimeoutSeconds参数设置子 Agent 运行超时 - 线程绑定依赖:
session模式依赖 channel plugin 实现subagent_spawninghook - 跨 Agent 通信:需要显式配置
tools.agentToAgent.enabled=true才能跨 Agent 发送消息
九、总结
核心差异
- run 模式:一次性任务执行,完成后自动归档,适合独立任务和批处理
- session 模式:持久化线程内协作,需要 thread=true,适合多轮对话和复杂工作流
thread=true 限制
- 依赖渠道插件实现
subagent_spawning钩子 - 目前仅 Discord 渠道支持
- dingtalk/Telegram/QQ 等渠道暂不支持
sessions_send 机制
- 通过 Gateway
agent方法内部注入消息 - 使用
AGENT_LANE_NESTED车道 deliver=false不对外投递- 触发 A2A 通知流
分析完成时间:2026-03-28T11:07:00+08:00