Contents

OpenClaw 代码深度剖析 第一篇:20万 Star 背后的架构

OpenClaw 拥有 20 万+ GitHub star、一个维基百科词条,创始人刚刚加入了 OpenAI。但抛开叙事,一个根本问题浮现:代码到底做了什么?

我们克隆了仓库并阅读了源码。这个三篇系列将带你深入 209,000 行 TypeScript 代码。


仓库概览

OpenClaw 是一个基于 pnpm 的 monorepo,目标运行环境为 Node.js 22+(纯 ESM,TypeScript 5.9 严格模式)。

目录 用途 规模
src/ 核心运行时 ~50 个子目录,~800 个文件
extensions/ Channel 适配器、memory 后端、auth 提供者 37 个 plugin
skills/ 内置技能定义(Markdown 文件) 52 个技能
apps/ macOS、iOS、Android 伴侣应用 3 个应用
packages/ 旧名称兼容层(Clawdbot、Moltbot) 2 个包
ui/ 基于 React 的 Web 界面(A2UI) 1 个包

核心依赖:Express 5.2、Zod 4.3、Vitest 4.0、oxlint、sharp、grammy(Telegram)、@slack/bolt、discord.js、@whiskeysockets/baileys(WhatsApp)、playwright-core。

75+ 个直接依赖,通过 pnpm workspaces 组织管理。


最重要的发现:OpenClaw 没有实现自己的 Agent 循环

这是最关键的架构洞察。

核心的 LLM 交互循环 — prompt 构建、流式输出、工具执行、错误恢复 — 完全委托给了 @mariozechner/pi-agent-core,这是一个来自独立仓库(github.com/badlogic/pi-mono,作者 Mario Zechner)的 pre-1.0 包。

OpenClaw 使用了 pi-mono 的四个包:

包名 版本 用途
pi-agent-core 0.53.0 有状态 agent 循环、工具执行、事件流
pi-ai 0.53.0 统一 LLM API,支持 17+ 供应商
pi-coding-agent 0.53.0 文件操作、shell 工具、grep/find
pi-tui 0.53.0 终端 UI

Agent 生命周期通过 pi-agent-core 流转:

agent_start → turn_start → message_start → message_update* → message_end
  → [tool_execution_start → tool_execution_update* → tool_execution_end]*
  → turn_end → agent_end

steer()(运行中中断)、followUp()(排队任务)、abort()、思考预算、工具错误自修复 — 全部来自 pi-agent-core。

那 OpenClaw 到底构建了什么? 围绕这个循环的一切基础设施:路由、channels、skills、memory、沙箱和 gateway。

/images/openclaw-code-deep-dive.svg


Gateway:161 个文件构成的控制平面

一切流量都经过 WebSocket + HTTP 服务器。默认绑定:ws://127.0.0.1:18789(仅本地回环)。

认证(4 种模式)

src/gateway/auth.ts → authorizeGatewayConnect()
模式 使用场景
none 仅开发环境
token Bearer token 匹配
password 密码认证
trusted-proxy 代理头验证

所有密钥匹配使用常量时间比较(safeEqualSecret())。速率限制按 IP 配置。Tailscale 集成提供安全的局域网访问。

Chat 会话管理

三个注册表驱动聊天系统:

  • ChatRunRegistry — 将 session ID 映射到活跃的聊天运行(队列式)。
  • ChatRunState — 聚合缓冲区、delta 时序和中止追踪。
  • ToolEventRecipientRegistry — 追踪接收工具事件的 WebSocket 客户端(TTL 制,默认 10 分钟)。

文本 delta 以最小 150ms 间隔节流。心跳抑制防止后台操作中的频繁 UI 更新。dropIfSlow 背压机制保护慢消费者。

启动序列

Gateway 启动时读取工作区中的 BOOT.md 文件,将其作为 agent prompt 执行 — 用于自动化启动任务(发送通知、检查状态等)。启动过程创建临时会话(boot-{timestamp}-{uuid}),运行 agent,然后恢复原始会话映射。


路由:8 级优先级

来自 channels 的消息命中 src/routing/resolve-route.ts 中的分层路由系统:

优先级 匹配类型 示例
1 直接对等绑定 Thread/DM → 特定 agent
2 父级对等继承 回复到父线程的 agent
3 Guild + 角色 Discord guild + 成员角色
4 仅 Guild Discord guild,任意角色
5 团队绑定 Slack workspace
6 账户模式 账户级路由
7 Channel 默认 每个 channel 的通配符
8 全局默认 配置的兜底方案

每条路由产生两个 session key:

  • sessionKey — 完整上下文(peer、account、channel)
  • mainSessionKey — 简化版 key,用于直接聊天合并

Session 追踪模型覆盖、推理深度、发送策略和完整对话历史。持久化使用基于文件的存储,配合原子写入。


这意味着什么

OpenClaw 的架构是一个 hub-and-spoke gateway 模式:

  1. Channel 通过 extension 接入(37 个适配器)。
  2. Gateway 进行认证、限流和路由。
  3. 路由引擎决定哪个 agent 处理消息。
  4. Agent 运行时(pi-agent-core)完成 LLM 工作。
  5. 响应通过 gateway 回流到原始 channel。

这更接近 AI agent 的 Nginx 而非独立的 AI 框架。Gateway 的工程质量很高 — 认证、会话管理、事件广播和背压处理都是生产级的模式。

但最关键的部分 — agent 循环本身 — 依赖于一个 pre-1.0 的外部依赖。


下一篇:第二篇 — Skills、Memory 与 Tools 涵盖 SKILL.md 系统、混合 memory 搜索、70 个 agent 工具以及 plugin hook 架构。

分析基于 OpenClaw v2026.2.18。源码:github.com/openclaw/openclaw