[子代理不再继承调用者账户] - Agents/channels: route cross-agent subagent spawns through the target agent's bound channel account while preserving peer and workspace/role-scoped bindings, so child sessions no longer inherit the caller's account in shared rooms, workspaces, or multi-account setups.
OpenClaw v2026.4.19-beta.1 中引入的修复问题排查指南。
症状
如果您在 Matrix(或其他 channel 插件)上运行多 Agent 部署,可能会观察到以下情况:
- 代表另一个 Agent 派生的子会话使用调用者身份发帖,而非目标 Agent 绑定的账户。
- 在共享房间或工作区中,发言者归属显示错误——子 Agent 的消息看起来像是来自派生它的 Agent。
- 当 Agent 绑定到不同账户(按房间或对等上下文区分)时,子 Agent 不遵循按房间绑定,而是使用首次解析到的账户。
- 在多账户设置中,本应以其绑定身份运行的子 Agent 最终却在调用者账户下操作。
根因分析
当父会话为不同的目标 Agent 派生子 Agent 时,路由逻辑未正确解析目标绑定的账户。相反,deliveryContext.accountId 在查询目标绑定之前就被填充了调用者的账户。
resolveFirstBoundAccountId 辅助函数最初仅按 channel + agent 匹配,意味着绑定到多个房间或对等方的 Agent 采用"首个绑定获胜"语义,而不考虑活动房间或对等上下文。这导致了共享房间场景中的不确定行为和错误的发言者身份。
此外,交付目标的前缀解析(如 room:<id>、channel:<id>、conversation:<id>)在各个 channel 插件间不一致,导致提取正确的对等标识符进行查询时失败。
逐步修复
1. 升级到修复版本
升级到 v2026.4.19-beta.1 或更高版本。此版本引入:
src/agents/subagent-spawn.ts中的resolveRequesterOriginForChild(...),优先使用目标 Agent 绑定的账户而非调用者的。src/routing/bound-account-read.ts中resolveFirstBoundAccountId的四级优先级模型,支持对等感知匹配。
2. 验证交付目标前缀处理
确保您的 channel 配置使用规范化的交付目标前缀。修复会通用地剥离以下前缀:
// Generic prefix peeler (matches patterns like `room:`, `channel:`, `conversation:`, etc.)
const rawPeerId = agentTo.replace(/^[a-z][a-z0-9_-]*:/, '');
如果您的 channel 插件使用自定义的两段式前缀(如 line:group:<id>),请确保插件的 inferTargetChatType 已实现以消除歧义。否则,剥离器仅剥离第一个前缀并从第二段推断类型。
3. 重新配置多房间绑定(如适用)
如果某个 Agent 之前绑定到多个房间并使用单个备用账户,新的优先级模型现在会按对等方选择。请确保每个房间的绑定都已明确配置:
// Example: agent bound to different accounts per room
agent: {
bindings: [
{ channel: "matrix", agent: "agent-id", peer: "room-id-1", accountId: "account-1" },
{ channel: "matrix", agent: "agent-id", peer: "room-id-2", accountId: "account-2" }
]
}
验证
升级后,通过运行生命周期测试套件确认修复:
pnpm test:changed src/agents/openclaw-tools.subagents.sessions-spawn.lifecycle.test.ts
所有 15 个生命周期测试应通过。具体验证以下场景:
- 使用目标 Agent 绑定的账户 — 在共享房间中为另一个 Agent 派生子 Agent 时使用目标的账户,而非调用者的。
- 同 Agent 派生保留调用者 — 为同一 Agent 派生子 Agent 时仍使用调用者的账户(无需重新解析)。
- 前缀剥离正常工作 —
room:<id>或conversation:<id>等目标正确解析到对等绑定。 - 嵌入式标记的类型推断 — Matrix 风格的目标如
room:@user:server正确分类为direct。
要进行实时验证,请在绑定的 Matrix 房间中派生一个子 Agent,并确认它以目标 Agent 的身份发帖。
常见陷阱
channel 插件中缺少
inferTargetChatType:如果您的 channel 插件未实现inferTargetChatType,则修复依赖前缀推导的类型推断。请确保任何两段式前缀都被识别,或实现该钩子函数。多房间 Agent 缺少显式对等绑定:绑定到多个房间的 Agent 如果不存在特定对等绑定,可能会回退到仅限 channel 的绑定。请为每个房间添加显式对等绑定以避免歧义。
类型等价:
group和channel类型在通配符匹配中被视为等价(与resolve-route.ts中的peerKindMatches一致)。请确保您的绑定使用一致的类型标签。无对等的调用者(cron 交付):辅助函数保持向后兼容——不传递
peerId/peerKind的调用者通过无对等回退层获得与之前相同的绑定。
相关错误
如果在日志中看到以下内容,升级应该可以解决:
- Matrix 房间中父子会话间
deliveryContext.accountId不匹配 - 共享房间部署中子 Agent 消息归属到错误的发送者
- “首个绑定获胜"行为导致跨房间账户选择不确定
参考: PR #67508 — Route cross-agent subagent spawns through target agent’s bound channel account
版本: v2026.4.19-beta.1