
前言
OpenClaw的Agent体系设计挺巧的,但「正式注册Agent」「子Agent」「ACP Agent」这三个概念经常把人绕进去。我当初就被绕进去过——它们都能跑任务,但完全不是一回事,混用就会踩坑。
这篇文章来自实际踩坑,把三个概念掰开揉碎讲,配上配置示例和避坑指南。
一、三个核心概念
1.1 正式注册Agent(Multi-Agent Routing)
正式Agent是配置文件里注册过的「常驻型」选手,每个都有自己独立的:
- Workspace:独立工作目录,里面放着
SOUL.md、AGENTS.md、USER.md这些定义人格的文件 - agentDir:独立状态目录,存认证凭证、模型配置
- Session Store:独立会话历史,存在
~/.openclaw/agents/<agentId>/sessions/
认证是严格隔离的——每个Agent只读自己agentDir下的auth-profiles.json,主Agent的凭证不会自动共享给别的Agent。如果需要共享,得手动把文件复制过去。
~/.openclaw/
├── agents/
│ ├── main/ # 主Agent
│ │ ├── agent/
│ │ │ └── auth-profiles.json
│ │ └── sessions/
│ ├── work/ # 工作Agent
│ │ ├── agent/
│ │ │ └── auth-profiles.json # 跟main的是独立的
│ │ └── sessions/
│ └── coding/ # 编程Agent
│ ├── agent/
│ └── sessions/
└── workspaces/
├── workspace-main/
├── workspace-work/
└── workspace-coding/
路由机制:消息通过bindings规则路由到对应Agent,遵循「最具体匹配优先」原则:
peer匹配(精确的DM/群组/频道ID)parentPeer匹配(线程继承)guildId + roles(飞书组织角色路由)guildId(飞书企业级别)accountId匹配- 降级到默认Agent
{
agents: {
list: [
{ id: "main", default: true, workspace: "~/.openclaw/workspace-main" },
{ id: "work", workspace: "~/.openclaw/workspace-work" },
{ id: "coding", workspace: "~/.openclaw/workspace-coding" },
]
},
bindings: [
// 飞书工作台 → main
{ agentId: "main", match: { channel: "feishu", accountId: "personal" } },
// 飞书企业版 → work
{ agentId: "work", match: { channel: "feishu", accountId: "enterprise" } },
// 第二个飞书机器人 → coding
{ agentId: "coding", match: { channel: "feishu", accountId: "coding-bot" } },
// 同一个飞书里,特定群组 → work
{
agentId: "work",
match: {
channel: "feishu",
accountId: "personal",
peer: { kind: "group", id: "oc-xxxxx-work-team" }
}
}
]
}
典型用途:
- 家庭Bot / 工作Bot / 私人助理完全隔离
- 不同飞书机器人账号、不同部门群组路由
- 不同能力侧重路由到不同人格Agent
1.2 子Agent(Sub-Agent via sessions_spawn)
子Agent是「临时工」——从主Agent会话里派生出来,在后台独立跑任务,完事儿了自动汇报结果。
会话Key格式:agent:<agentId>:subagent:<uuid>
主会话:agent:main:main
子Agent:agent:main:subagent:3d8f2b1c-...
核心工作流:
- 主Agent调用
sessions_spawn启动子Agent - 子Agent在独立会话里跑,不阻塞主会话
- 跑完了通过
announce机制把结果推送回主会话
// 启动一个子Agent
sessions_spawn({
task: "帮我调研竞品A的最新动态,整理成摘要",
label: "竞品调研",
model: "minimax-m2.1", // 可以指定更便宜的模型
runTimeoutSeconds: 900 // 15分钟超时
})
announce机制:子Agent不是简单返回结果,而是通过OpenClaw内部的announce步骤把结果投递到主会话的聊天频道。主会话收到的是运行时生成的结构化事件,包含:
Result:子Agent的回复文本或最后的工具结果Status:completed successfully/failed/timed out- 运行时长和Token统计
- 会话Key和转录文件路径
工具策略(Tool Policy):子Agent默认拿到除会话工具外的全部工具,即:
- 可用:
read、write、edit、exec、process等 - 禁用:
sessions_list、sessions_history、sessions_send、sessions_spawn
除非开启maxSpawnDepth >= 2让子Agent当「编排器」,它才能管理自己的子子Agent。
嵌套深度控制:
| 深度 | 会话Key | 角色 | 能spawn子Agent? |
|---|---|---|---|
| 0 | agent:<id>:main |
主Agent | 始终可以 |


969

被折叠的 条评论
为什么被折叠?



