系统架构详解

系统架构详解

这篇文章用于建立“全局工程脑图”:当你在日志、事件、配置里遇到问题时,能快速判断自己处在哪一层、该去哪个入口排查。

架构总览(从入口到出口)

OpenClaw 可以理解为一套“多入口 + 单内核”的运行时:

  • 入口层:Channels(WhatsApp/Telegram/Discord…)与自动化入口(Webhooks/Cron…)
  • 控制平面:Gateway(WebSocket/HTTP 服务、鉴权、路由与状态广播)
  • 执行平面:Agent(run/attempt 生命周期、lane/queue 并发、流式输出)
  • 能力层:Tools(Browser/Exec/Web…)与 Providers(模型与回退)
  • 数据层:Sessions、Media、Config、日志与审计

如果你刚跑通安装与向导,建议先把这 3 个入口记住:

关键组件(你会反复遇到的名词)

Gateway(控制平面)

Gateway 是长期运行的核心进程,典型职责包括:

  • 维护与各 Channel/Provider 的连接与生命周期
  • 暴露 WebSocket/HTTP API,处理请求并广播事件
  • 统一鉴权(token / pairing / remote 访问边界)
  • 维护会话与并发(sessionKey / lane / queue)

相关入口:

Channels(消息入口)

Channels 是用户与系统交互的入口;不同平台的连接方式、消息格式与限制不同,但最终都应被收敛到统一的“入站消息 → 路由 → 会话”流程。

相关入口:

Routing + SessionKey(把消息“分桶”)

系统需要把不同来源(私聊/群聊/不同平台/不同账号)的消息稳定地映射到会话:这通常由 sessionKey 完成,它决定了:

  • 哪些消息会串行(同一 sessionKey)
  • 哪些消息可以并行(不同 sessionKey)
  • 如何避免“串线”(群聊/多账号/多通道)

相关入口:

Agent(执行平面:run/attempt)

Agent 接收一次“需要回复/需要执行”的任务,常见链路是:

  1. 入站消息被路由到某个 sessionKey
  2. 进入 lane/queue(同会话串行、跨会话并行)
  3. 触发一次 run,并可能拆成多个 attempt(例如回退/重试)
  4. 期间穿插工具调用(Browser/Exec/Web…)与流式输出
  5. 产出最终回复,再回到 Channel 出站发送

相关入口:

Tools(把“说”变成“做”)

Tools 负责执行有副作用的动作(系统命令、浏览器自动化、网络请求等)。关键不是“能做什么”,而是“如何可控地做”。

相关入口:

Providers(模型与回退)

Providers 负责把“提示词与上下文”变成“模型输出”,并在失败场景里提供可控的回退策略。

相关入口:

一次消息的完整旅程(建议你能在日志里复现)

把一次交互拆成“可观测”的步骤,有利于排障:

  1. 入口:某个 Channel 收到消息(或 Webhook/Cron 触发)
  2. 路由:根据账号/群组/线程等信息生成 sessionKey
  3. 并发:进入 lane/queue(同 sessionKey 串行)
  4. 执行:Agent 运行,可能产生工具调用与流式事件
  5. 出站:回复回到 Channel,发送给用户

最实用的“硬验收”是:你能在 Control UI 或日志中用同一个 runId 追踪上述关键节点(详见 日志)。

安全边界(把风险分层)

建议把安全问题按层处理,而不是“全靠提示词约束”:

  • 入口边界:remote 访问、trusted proxy、token、pairing(谁能连上 Gateway)
  • 执行边界:Sandbox / tool policy / approvals(一次工具调用能做什么)
  • 审计与追踪:日志、诊断与最小可复现链路(出了问题怎么追)

相关入口:

下一步(按你的目标选择)