跟着 OpenClaw Gateway 读显式 sessionKey 路由
以下是便于跟读的控制流摘要,不是源码复制。前提是 Gateway agent RPC 的请求带显式 sessionKey;不覆盖其他入口或参数组合。
agentRunHandler先检查调用者 authority 是否仍有效,用validateAgentParams验证 RPC 参数,再执行 preflight 并调用startTurn()。其中任一步失败,后续路由不执行。HandlerstartTurn()调prepareAgentRequestRouting();路由阶段先规范化可选agentId,对不在配置列表中的 Agent 返回INVALID_REQUEST。显式sessionKey优先于从to推断的 Agent key,接着交给resolveRequestedSessionAgentId()判定 owner。接线 · 参数选择resolveRequestedSessionAgentId()拒绝 malformed agent key、未知显式 Agent、key 前缀与显式 Agent 冲突、retired store owner 冲突;某些未限定 key 需要通过存储归属、兼容 owner 或唯一 Agent 推断,仍不能推断时要求调用者指定 Agent。全局主会话别名另有特殊处理,不能简化成字符串前缀判断。输入与 owner 判定- 选出
requestedSessionKey后,路由阶段检查expectedExistingSessionId约束、不可用会话和特定 exec 审批后续绑定;然后以目标 key/Agent 保留去重标识,读取已有会话并绑定 canonical key 与 sessionId。任何早期拒绝都会在此停止,不进入 agent run。路由后半段 · 约束 startTurn()仍会进行内容、reset 等准备。本篇只继续跟显式 key 的关键点:prepareAgentSession()得到canonicalSessionKey和sessionAgentId后,再对规范化目标做 session creation 与 mutation 授权。授权失败发失败响应并返回。规范化与授权- 后续
prepareAgentRunDispatch()还可能因为 admission、生命周期或去重结果停止;返回准备结果之后,startAgentRunExecution()才被调度。这些属于另一层运行时控制,不能把“路由通过”说成“模型已经运行”。调度边界
text
agent RPC(sessionKey, agentId?)
→ 参数/preflight
→ 从 key 和 agentId 解析 owner;冲突或无效则拒绝
→ 检查目标约束与可用性,保留去重标识
→ prepareAgentSession 得到 canonicalKey / canonicalSessionAgentId
→ 对规范化目标授权;失败则停止
→ 交给后续 admission/dispatch(不代表已执行)证据等级和未知
上述调用点和分支来自固定提交的源码静态核对。本篇没有启动 Gateway、模拟不同 client principal 或构造并发 RPC,因此不验证这些守卫在所有配置、重连或竞态下的实际效果。权限错误被准确返回给客户端、去重能否覆盖所有重试、全局 scope 别名和渠道入站是否收敛于同一路由,也需单独测试或章节核对。
在线预览稿:书稿仍在校稿,系统篇以文内固定源码版本为准;静态阅读不等于运行验收。