OpenClaw 架构解析

这篇是给想深入了解 OpenClaw 工作原理的同学看的。不懂代码也没关系,我会用人话解释。


先从整体说起:OpenClaw 是怎么工作的?

一句话解释

OpenClaw = 消息搬运工 + AI 大脑

它的工作流程很简单:

你发消息 → OpenClaw 收到 → 交给 AI 思考 → 把 AI 的回复发回给你

形象比喻:餐厅点餐

想象你去餐厅吃饭:

角色对应 OpenClaw餐厅比喻
Channel微信/Telegram服务员
Gateway消息路由器前台
Pi AgentAI 大脑厨师
Memory记忆系统服务员的记事本
Tool工具厨房设备

点餐流程

  1. 你跟服务员说”来份宫保鸡丁”
  2. 服务员记下来,送到前台
  3. 前台把单子传给厨师
  4. 厨师做好了,端出来
  5. 服务员把菜送到你桌上

OpenClaw 的流程

  1. 你在 Telegram 发消息”帮我查下天气”
  2. Channel(适配器)把消息收进来
  3. Gateway(网关)统一处理,查询记忆
  4. Pi Agent(AI)处理请求,决定回复什么
  5. Tool Executor(工具)可能需要调用工具
  6. 格式化输出,原路返回给你

架构图解

分层架构

┌─────────────────────────────────────────────────────────┐
│                    渠道层 (Channel Layer)               │
│        Discord 适配器 │ Telegram 适配器 │ 微信适配器    │
└────────────────────────────┬────────────────────────────┘
                             │
                             ▼
┌─────────────────────────────────────────────────────────┐
│                    网关层 (Gateway Layer)                 │
│         消息路由 │ 会话管理 │ 记忆注入 │ 流量控制      │
└────────────────────────────┬────────────────────────────┘
                             │
                             ▼
┌─────────────────────────────────────────────────────────┐
│                    运行时层 (Runtime Layer)              │
│              Pi Agent SDK │ 工具执行器 │ 记忆管理器      │
└────────────────────────────┬────────────────────────────┘
                             │
                             ▼
┌─────────────────────────────────────────────────────────┐
│                    模型层 (Model Layer)                 │
│                  多模型路由器 │ API 适配器              │
└─────────────────────────────────────────────────────────┘

数据流

用户发消息
    │
    ▼
┌──────────────────────────────────────────┐
│  Channel Adapter(渠道适配器)            │
│  把各平台的"方言"翻译成统一格式          │
└─────────────────┬──────────────────────┘
                  │
                  ▼
┌──────────────────────────────────────────┐
│  Gateway(网关)                         │
│  1. 鉴权(是不是合法用户)               │
│  2. 查询记忆(AI 认识这个人吗)          │
│  3. 路由到对应的 Agent                   │
└─────────────────┬──────────────────────┘
                  │
                  ▼
┌──────────────────────────────────────────┐
│  Pi Agent(AI 大脑)                    │
│  1. 构建上下文(系统提示 + 记忆 + 消息)│
│  2. 调用 LLM(GPT/Claude)              │
│  3. 决定是否需要调用工具                 │
└─────────────────┬──────────────────────┘
                  │
                  ▼
         ┌───────┴───────┐
         │               │
         ▼               ▼
┌─────────────┐   ┌─────────────┐
│ 直接回复     │   │ 调用工具    │
│ (聊天)     │   │ (查天气等)│
└──────┬──────┘   └──────┬──────┘
        │                  │
        ▼                  ▼
┌─────────────┐   ┌─────────────┐
│ 格式化输出  │   │ 执行工具    │
└──────┬──────┘   └──────┬──────┘
        │                  │
        └────────┬─────────┘
                 │
                 ▼
┌──────────────────────────────────────────┐
│  返回给用户                               │
└──────────────────────────────────────────┘

核心组件详解

1. Channel(渠道适配器)

作用:把各平台的”方言”翻译成 OpenClaw 统一能理解的语言。

举个例子

  • Telegram 说”有个用户发了消息,内容是 xxx”
  • Discord 说”频道 123 里有个叫 John 的发了 xxx”
  • 微信说”有人@你了,消息内容是 xxx”

Channel 适配器把这些都转成:

{
  "platform": "telegram",
  "user_id": "123456",
  "chat_id": "789012",
  "content": "xxx"
}

支持的平台适配器

  • TelegramAdapter - 电报
  • DiscordAdapter - DC
  • WhatsAppAdapter - WA
  • SlackAdapter - Slack
  • MatrixAdapter - Matrix
  • 等等……

2. Gateway(网关)

作用:中央枢纽,所有消息都要经过这里。

核心职责

职责说明
协议转换把各平台的消息格式统一
消息路由决定消息去哪个 Agent
会话管理维护每个用户的对话状态
记忆注入把相关记忆塞到上下文里
流量控制限流、并发控制、防滥用

工作原理(伪代码):

async def handle_message(message):
    # 1. 验证用户是否合法
    if not is_allowed_user(message.user_id):
        return "你没有权限使用这个 Bot"
 
    # 2. 获取或创建会话
    session = await get_or_create_session(message)
 
    # 3. 检索相关记忆
    memories = await memory_manager.retrieve(
        query=message.content,
        user_id=message.user_id
    )
 
    # 4. 构建上下文
    context = {
        "session": session,
        "memories": memories,
        "system_prompt": system_config.prompt
    }
 
    # 5. 扔给 AI 处理
    response = await pi_agent.process(context)
 
    # 6. 保存新记忆
    await memory_manager.store(session, response)
 
    # 7. 发回去
    return response

3. Pi Agent(AI 大脑)

作用:真正”思考”的地方。

Pi Agent 拿到上下文后,做这些事:

  1. 构建提示词:把系统提示 + 记忆 + 用户消息组合起来
  2. 调用 LLM:发送给 GPT/Claude
  3. 解析响应:看 AI 说啥,要不要调用工具
  4. 执行工具:如果需要,就调用相应工具
  5. 返回结果:把最终结果返回

为什么叫 Pi?

  • π 是数学里的无限不循环小数
  • 暗示这个框架简单到极致,但又功能无限

4. Tool Executor(工具执行器)

作用:执行各种工具,比如查天气、搜网页、读写文件。

安全设计

  • 危险操作(如删除文件)会警告
  • 可以配置白名单/黑名单
  • 敏感操作需要二次确认

工作流程

AI 说:"我需要查下北京的天气"
    │
    ▼
Tool Executor 收到工具调用请求
    │
    ├─── 权限检查(这个工具被允许吗?)
    │
    ├─── 参数验证(参数对不对?)
    │
    ├─── 执行(真的去查天气 API)
    │
    └─── 返回结果给 AI

5. Memory Manager(记忆管理器)

作用:管理 AI 的”记忆”。

三层记忆

层次存储位置生命周期用途
Working Memory内存当前会话正在处理的信息
Short Term文件几天最近的对话
Long Term文件永久重要的事实、偏好

检索流程

用户问:"我上次买的那个包怎么样了?"
    │
    ▼
检索记忆
    │
    ├─── 长期记忆:搜"购买"、"包"、"订单"
    │
    ├─── 短期记忆:搜最近的对话
    │
    └─── 工作记忆:当前会话的内容
    │
    ▼
匹配度排序
    │
    ▼
返回最相关的几条记忆
    │
    ▼
塞到 AI 的上下文里

为什么这样设计?

1. 为什么要 Channel 适配器?

因为每个平台的消息格式都不一样:

  • Telegram 用 Markdown
  • Discord 用 Embed
  • Slack 用 Block Kit

适配器模式让核心代码不用管这些差异,新增平台只要写新的适配器就行。

2. 为什么要 Gateway?

想象没有 Gateway 的情况:

  • Telegram 用户 A 跟 Bot 说话
  • Discord 用户 B 跟同一个 Bot 说话
  • Bot 怎么知道哪个回复该发到哪个平台?

Gateway 就是干这个的——统一入口,统一路由

3. 为什么要 Pi 这么”简”?

很多 AI Agent 框架给你 100 个工具,结果:

  • 学起来累
  • 维护成本高
  • 容易出 bug

Pi 只给你 4 个核心工具(read/write/edit/bash),但通过组合,可以完成几乎所有任务。

就像乐高积木,给你的零件越少,发挥空间越大。

4. 为什么要记忆分层?

因为:

  • 不是所有记忆都一样重要
  • 不是所有记忆都需要永久保存
  • 查询性能很重要

分层设计让系统更高效。


消息流转示例

场景:用户问天气

1. 用户在 Telegram 发消息

"北京今天天气怎么样?"

2. TelegramAdapter 收到

{
  "platform": "telegram",
  "user_id": "123456",
  "chat_id": "789012",
  "content": "北京今天天气怎么样?",
  "timestamp": "2026-04-24T10:30:00Z"
}

3. Gateway 处理

  • 检查用户 ID 123456 在白名单里吗? ✅
  • 查询记忆,想起”用户在北京工作”
  • 构建上下文

4. Pi Agent 处理

  • 构建提示词……
  • 调用 Claude API
  • Claude 回复:“需要查下天气” + 调用 weather 工具

5. Tool Executor 执行

  • 调用天气 API
  • 收到:北京今天 22°C,晴

6. 返回结果

🌤️ 北京今天天气:
温度:22°C
天气:晴
空气:良

建议:适合外出,记得防晒!

7. 消息通过 TelegramAdapter 发回给用户

整个过程可能只需要 2-3 秒。


扩展机制

插件怎么接入?

插件 ──→ 工具注册 ──→ Gateway 知道有这个工具
     │
     └──→ 事件订阅 ──→ Gateway 调用钩子函数

比如你写了一个”翻译插件”:

  1. get_tools() 里注册 translate 工具
  2. get_event_handlers() 里订阅 on_message_received
  3. Gateway 就会在收到消息时调用你的插件

多模型路由

OpenClaw 可以同时配置多个 AI 提供商:

llm:
  default: "anthropic"        # 默认用 Claude
  providers:
    anthropic:
      model: "claude-sonnet-4-20250514"
    openai:
      model: "gpt-4-turbo"
    groq:
      model: "llama-3.3-70b-versatile"

路由策略

  • 按任务类型:代码 → OpenAI,分析 → Anthropic
  • 按负载:哪个 API 响应快用哪个
  • 手动指定:用户指定用哪个

性能优化点

1. 上下文压缩

如果对话太长,OpenClaw 会:

  • 自动总结早期对话
  • 删除不重要的消息
  • 保持总 token 在限制内

2. 缓存

  • LLM 响应缓存:同样的问题不用重复调用
  • 记忆向量缓存:不用每次都算 embedding
  • 工具结果缓存:同样的 API 调用结果复用

3. 并发控制

  • 单用户限流:一秒最多处理 N 条消息
  • 全局限流:防止 API 超额
  • 队列:消息太多就排队

下一步

搞懂了架构?继续学习:

教程内容
Pi_Framework深度解析Pi 的设计哲学和实现细节
OpenClaw记忆系统记忆是怎么存储和检索的
OpenClaw插件开发自己写插件扩展功能
OpenClaw高级用法高级技巧和工作流

文档状态:架构解析
更新时间:2026年4月