OpenClaw 源码全链路拆解:从本地网关到 AI 智能体执行闭环 Best Partners TV 2026-03-12

本地网关启动:系统运行的数字底座

最近 AI 领域最火的概念无疑非 OpenClaw 莫属,男女老少纷纷投入到“养龙虾”的热潮中。但当我们给 OpenClaw 发送一句最简单的“你好”时,从按下发送键到屏幕上看到回复,其背后的实现逻辑极具工程深度。整个流程的起点与大模型无关,而是从网关的启动开始。很多人以为 OpenClaw 的核心是聊天框,但本质上它首先是一个本地优先网关平台(Local-first Gateway: 优先在本地运行并管理数据的接入层)。只有先建立起统一的会话管理、渠道管理、工具管理和事件分发能力,来自不同渠道的消息才能被汇总处理。

整个网关启动的核心逻辑位于 auto-reply/monitor.ts 源码中,通过执行 monitorWebChannel 函数完成。启动过程首先检查网络连接,随后加载 openclaw.json 总配置文件,该文件包含了智能体(Agent: 能够感知环境并执行任务的 AI 实体)、渠道、鉴权信息及模型配置等核心字段。接下来,系统会解析当前使用的账号(如 WhatsApp),并进入一个持续循环:创建消息处理器、启动渠道监听器、设置心跳机制和看门狗定时器,并处理连接的重连。只有这套流程全部完成,网关成功启动,OpenClaw 才算正式进入随时准备接收消息的状态。没有这一层网关的支撑,后续所有的智能能力都无从谈起。

消息接入与标准化:从原始噪声到结构化事件

当网关成功启动后,一条来自外部平台的消息并不会直接转发给大模型,而是进入专门的消息监听与接入层。在 inbound/monitor.ts 文件中,系统通过 sock.ev.on("messages.upsert") 事件监听器持续监听新消息。一旦消息到达,系统会执行去重和高频消息合并。在真实的即时通讯环境中,平台常有重复推送,用户也可能短时间内连发多条消息;去重和合并步骤就是为了过滤噪声,确保后续流程拿到的是干净、完整的需求。

随后,系统进行权限和合法性检查,判断消息是否来自允许的用户或群组,以及是否满足预设触发规则。若不符合,消息会被直接过滤。如果消息包含图片或文件等媒体附件,系统会自动将其下载到本地工作目录,以便后续智能体推理时直接访问。处理完成后,系统将消息标记为已读,并将格式千差万别的原始消息统一封装成标准化的 WebInboundMessage 对象。这种标准化(Standardization: 将非规范数据转化为统一格式的过程)的本质,是将外部混乱的非标准信号转化为系统内部可以识别、调度并处理的标准事件,最后放入防抖队列以触发网关的回调函数。

动态路由与上下文:精准任务分流的逻辑

在消息完成标准化处理后,系统进入路由模块,源码对应 auto-reply/monitor/on-message.ts。OpenClaw 的设计并非将所有消息送往同一个模型,而是根据任务类型分配给不同的智能体。系统通过 createWebOnMessageHandler 创建入口,并重新读取最新的系统配置。这里有一个关键细节:OpenClaw 支持配置的动态调整,每次处理消息时都会重新读取规则,确保智能体绑定关系和权限实时生效。

系统会解析消息方向(私聊或群聊)并确定发送者的唯一 ID。在群聊场景中,系统需判断机器人是否被 @ 或满足触发条件。确认来源后,进入智能体路由决策阶段,根据 openclaw.json 里的 bindings 设置,通过 resolveAgentRoute 函数判断负责处理的智能体。紧接着,系统通过 buildGroupHistoryKey 为会话生成唯一的历史记录键值。这个键值是实现上下文关联(Context Association: 将当前对话与历史记忆挂钩的技术)的核心,确保在每次推理前能将对应的历史记录加载到提示词中。在完成 Same-phone 模式判断和回声追踪(过滤掉机器人自己发送的消息)后,消息才会进入真正的核心处理函数 processMessage

准备环境与状态初始化:推理前的最后装配

进入 get-reply.ts 后,系统依然没有调用大模型,而是在搭建信息完备的运行环境。首先通过 resolveSessionAgentId 再次确认智能体和 AI 模型,随后执行 ensureAgentWorkspace 为智能体准备独立的工作目录,用于存放运行时文件。如果用户发送的是图片或链接,系统会分别通过 applyMediaUnderstandingapplyLinkUnderstanding 进行深度解析,将媒体内容转化为文本,确保智能体在推理前对所有内容有全面理解。

接下来,initSessionState 函数负责将会话历史完整加载。AI 记得之前的话,是因为每次推理前系统都将历史对话重新加载到了上下文里。随后解析 resetmodelverbose回复指令(Directives: 用户通过特定语法对 AI 行为进行的显式控制)。对于一些不需要 AI 推理的简单系统查询,通过 handleInlineActions 即可直接完成。只有当所有准备工作就绪,系统才会调用 runPreparedReply,将打包好的参数(上下文、模型、工具环境、运行配置)交给下一环节。

执行调度与记忆管理:Agent Runner 的生命周期

agent-runner.ts 中,runReplyAgent 负责管理智能体运行的完整生命周期。系统会将消息标记为“正在处理”,并执行 runMemoryFlushIfNeeded。在长对话中,如果上下文长度超过大模型的窗口上限,OpenClaw 会自动对历史内容进行压缩并持久化到记忆文件中。这是其长会话记忆机制的核心实现。

随后进入 runAgentTurnWithFallback,该层内置了失败重试和降级机制。若网络或接口出现限流,系统会尝试切换备用模型后端。在模型生成结果后,系统记录资源使用情况、消耗的 Token 数量并估算成本,同时上报诊断信息到监控系统。最后,通过 typing.markRunComplete() 关闭前端“正在输入”的提示,并执行 finalizeWithFollowup 将回复返回给用户,同时检查队列中是否有后续任务。

核心推理与 Agent Loop:智能生成的终极实现

真正向大模型发起请求的逻辑位于 agents/pi-embedded-runner/run/attempt.ts 中的 runEmbeddedAttempt 函数。在执行前,系统会确定沙箱环境边界,确保文件读写和命令执行在受控区域内,保障系统安全边界。系统会加载智能体技能,并创建包括文件操作、代码编辑和终端命令在内的工具集(部分由 OpenClaw 实现,部分来自 Pi SDK)。

接着,系统构建极长的结构化系统提示词(System Prompt: 预置给 AI 的角色设定与环境说明)。系统会将技能文档、架构文档甚至每日记忆全部注入上下文。虽然这让模型获得了完整信息,但也导致了巨量的 Token 消耗,且可能稀释模型注意力,这是部分用户反馈成本高或产生幻觉的原因。最后,通过 Pi SDK 的 activeSession.prompt 正式发起请求。在 Agent Loop(执行循环: 模型生成内容、调用工具、获取结果、再次推理的闭环)中,系统通过事件订阅机制实现流式输出的“打字机效果”,并将工具执行结果写回会话历史,直到任务完成。生成的碎片化内容经 dispatchReplyWithBufferedBlockDispatcher 整理后,分批通过 WhatsApp 或 Telegram 等渠道推送给用户,完成整个运行闭环。

总结:OpenClaw 的架构核心价值

纵观全链路源码,OpenClaw 的核心价值主要体现在以下四个方面:

  1. 运行时装配体系:它能将用户的一条原始消息,精准地嵌入到一个包含工具、文件、历史和规则的全维度运行环境中。
  2. 工程化的“脏活累活”:它本身不生产智能,而是通过 Pi SDK 调度智能,自己则承担了鉴权、文件管理、上下文装配和异常处理等复杂的工程环节。
  3. 极致的提示词工程:它将所有的运行时环境信息显式地、结构化地翻译进系统提示词,实现了极强的环境感知能力。
  4. 本地优先的消息网关:从架构上看,它是一个前端对接多渠道、中间为控制平面、底层挂载智能体和工具集的网关系统。
📌 文中提及的人物和组织

公司/组织: WhatsApp, Telegram

产品/模型: OpenClaw, Pi-SDK, Claude-Code, Gemini-CLI

关键字: agentic-workflow source-code-analysis gateway-architecture prompt-engineering ai-agent