架构图
读图要点(和代码对齐)
| 块 | 含义 |
|---|---|
| 进线层 | 每条渠道各自收消息,最后都汇到统一的路由 + 上下文格式。 |
| 路由 | 决定「这条消息 → 哪个 agent、哪条 session」,配置 bindings 在这里生效。 |
| Gateway | 进程里跑 HTTP/WSS、渠道生命周期、与 agent 管线共存的控制面(startGatewayServer 一带)。 |
| 自动回复管线 | 从「进线上下文」到「发起一轮 getReply」的中间层;队列保证同会话不乱序。 |
| Agent | 真正「调模型 + 执行 tool」的循环;「模型返回 → 动作」 主要是 tool call 路由,不是单独再画一层「命令解释器」。 |
| 出线 | 把最终回复按渠道发回用户。 |
按你那张架构图,从外到内、先竖切再扩面的顺序最省时间。下面是一条可直接照做的路线(每阶段都有明确「读完能解释什么」)。
阶段 0:固定心智模型(半天)
- 能默画那张图:渠道 → 路由 → 会话/上下文 → 自动回复 → Agent+模型+Tool → 回渠道;Gateway 是长驻进程,CLI 是控制面。
- 读:docs/concepts/agent-loop.md(只读「Entry points」+「How it works」两节即可)。
Agent Loop (OpenClaw)
An agentic loop is the full “real” run of an agent: intake → context assembly → model inference → tool execution → streaming replies → persistence. It’s the authoritative path that turns a message into actions and a final reply, while keeping session state consistent.
intake ->输入 context assembly ->上下文组装 model inference->模型推理 tool execution -> 工具调用 streaming replies → 流式回复 persistence -> 持久化
阶段 1:路由与会话(1~2 天)
目标:说清楚「这条消息为什么进这个 agent、为什么是这个 sessionKey」。
- src/routing/resolve-route.ts(抓 resolveAgentRoute、buildAgentSessionKey 思路即可)
- docs/concepts/session.md(若有)或配置里 bindings 相关文档:docs/gateway/configuration-reference.md 里搜 bindings / session
- 插件/SDK 侧对照:src/plugin-sdk/routing.ts(看对外暴露了什么)
阶段 2:进线竖切一条渠道(2~3 天)
目标:从「收到一条消息」跟到「调用 dispatch / getReply」。
- 任选 一个 你最熟的渠道:
- 内置:例如 src/telegram 或 src/discord 里搜 resolveAgentRoute / dispatchReply
- 或挑一个简单扩展:extensions/twitch(之前搜到过典型调用链)
- 顺藤摸到:src/auto-reply/reply/dispatch-from-config.ts 入口附近(不必通读 800 行,只看「谁调了 getReply」)。
阶段 3:队列与多消息(1 天)
目标:解释「连发多条消息时为什么不会乱」。
- docs/concepts/queue.md
- src/process/command-queue.ts(看 enqueue、gatewayDraining、resetAllLanes 注释)
- 与 agent 衔接:docs/concepts/agent-loop.md 里 Queueing 小节
阶段 4:Agent 与 Tool(3~5 天)
目标:说清楚「模型输出如何变成动作」——主要是 tool call。
- docs/concepts/agent-loop.md 全文
- 代码:src/agents/pi-embedded.js 一带 + 搜 runEmbeddedPiAgent 的调用栈(从 src/auto-reply/reply/followup-runner.ts 进)
- 工具面:docs/tools/index.md + 任选一个内置 tool 实现路径(不必全看完)
阶段 5:Gateway 进程壳(2~3 天)
目标:知道「Gateway 进程起什么、关什么」,不通读 server.impl.ts。
- src/cli/gateway-cli/run.ts → run-loop.ts → startGatewayServer 签名与返回的 close
- src/gateway/server.impl.ts:只读 createGatewayRuntimeState 调用块附近 + 文件末尾 return { close }
- docs/gateway/protocol.md(控制面/RPC 语义)
阶段 6:插件与自定义(并行或压轴,持续)
目标:能自己加能力且不动坏边界。
- docs/plugins/architecture.md
- docs/plugins/building-plugins.md + docs/plugins/manifest.md
- 对照一个最小扩展:extensions/* 里任选一个 openclaw.plugin.json + index.ts
- 必读边界:src/plugin-sdk/AGENTS.md、AGENTS.md 里插件/channel 规则
建议节奏
- 每天只推进一个阶段的主线;卡住就回到阶段 0 那张图,标出「卡在第几条箭头」。
- server.impl.ts 不要按行啃;需要哪块(HTTP、WS、渠道)再局部搜函数名。
- 每阶段结束用一句话自检:例如阶段 1 结束应能回答「sessionKey 由哪些输入算出来」。