第 3 章

核心概念全景:Gateway / Pi / Skills / Plugin / Memory 的关系图

第三章:核心概念全景:Gateway / Pi / Skills / Plugin / Memory 的关系图

3.1 五大核心组件概览

在深入每个组件之前,先用一句话定义每个组件的职责边界。这一精确定义将帮助你在后续实践中做出正确的架构决策。

组件 一句话定义
Gateway 统一的消息入口和出口,负责将外部平台的消息转换为内部标准格式,并将响应送回对应平台
Pi Agent 的大脑,负责理解消息意图、选择工具、执行推理循环、生成响应
Skills 可复用的能力包,定义 Pi 在特定场景下可以执行什么任务,以配置文件而非代码为主要表达形式
Plugin 扩展 Gateway 能力的代码模块,用于添加新的 Channel Bridge、自定义中间件或扩展 Plugin Registry
Memory 持久化上下文存储系统,管理短期对话历史、长期用户画像和共享 Workspace 知识库

这五个组件共同构成了 OpenClaw 的完整运行时。它们之间的关系不是线性的层级,而是围绕 Pi 的星形结构,由 Gateway 负责边界通信。

3.2 完整数据流:从 WhatsApp 到用户

理解数据流是理解 OpenClaw 架构的最直接方式。下面是一条 WhatsApp 消息从到达到响应的完整链路:

用户 (WhatsApp)
    │
    ▼ [HTTPS Webhook]
WhatsApp Business API
    │
    ▼ [HTTP POST]
Channel Bridge (whatsapp)
    │  解析原始消息格式,提取文本、附件、发送者信息
    │  转换为统一的 InternalMessage 格式
    ▼
Integration Gateway (Node.js 进程)
    │  Session 解析(按8级优先级匹配 Binding 规则)
    │  Command Queue 调度(写入对应 Lane)
    ▼
Pi Agent Core (嵌入式,非 subprocess)
    │  加载 System Prompt + Session Memory
    │  调用 LLM Provider(Anthropic Claude API)
    │  执行工具调用循环(read/write/edit/bash)
    │  查询/更新 Memory
    ▼
Action Layer
    │  执行外部集成调用(如果 Pi 决定调用 HubSpot、Jira 等)
    │  Human-in-the-loop 审批(高风险动作暂停等待)
    │  工具结果返回给 Pi
    ▼
Pi Agent Core (生成最终响应)
    │
    ▼
Integration Gateway (接收响应)
    │
    ▼
Channel Bridge (whatsapp)
    │  将响应格式化为 WhatsApp 消息格式
    ▼
WhatsApp Business API
    │
    ▼
用户收到回复

这个链路中涉及多次格式转换,但每次转换都有明确的边界和协议。下面我们逐一拆解每个节点。

3.3 Gateway 深度解析

Gateway 的核心职责

Gateway 是整个 OpenClaw 系统的边界进程,是外部世界与内部 Agent 世界的分界线。它以单个 Node.js 进程的形式运行,通过 WebSocket(localhost:18789)与 Pi 进程通信。

Gateway 有四个核心子系统:

1. Channel Bridge 集合

每个消息平台有一个对应的 Channel Bridge。Channel Bridge 负责:

// InternalMessage 的核心结构(简化)
interface InternalMessage {
  id: string;              // 消息唯一ID
  channelId: string;       // 来源 Channel
  senderId: string;        // 发送者在平台上的ID
  content: MessageContent; // 消息内容(文本/附件/位置等)
  metadata: {
    platform: string;      // 'whatsapp' | 'telegram' | 'slack' | ...
    timestamp: number;
    replyTo?: string;      // 引用消息ID(如果有)
    threadId?: string;     // 线程ID(Slack thread 等)
  };
  sessionContext?: SessionContext; // Session 解析结果(由 Gateway 填充)
}

2. Session 管理系统

Session 是 Pi 与特定用户在特定 Channel 上的一次持续对话上下文。Session 解析是 Gateway 的核心逻辑之一。

3. Command Queue

Gateway 内置一个四 Lane 的优先级队列,管理所有发往 Pi 的命令调度。

4. Plugin Registry

维护已安装 Plugin 的注册表,管理 Plugin 的生命周期(加载、启动、停止)。

Single-writer Pattern 的意义

Gateway 使用 Single-writer Pattern:任何时刻,只有一个进程(Gateway)向 SQLite 数据库写入数据,Pi 进程通过 Gateway 的接口访问 Memory,不直接操作数据库。

这个设计解决了以下问题:

Session 解析的 8 级优先级

当一条消息到达时,Gateway 需要确定这条消息属于哪个 Session,进而确定应该由哪个 Agent 处理、使用哪个配置。Session 解析按以下优先级顺序匹配 Binding 规则:

1. peer match      → 消息来自特定的对端标识符(精确的用户ID匹配)
2. parent          → 继承父 Session 的配置(用于多轮对话中的子任务)
3. guild + role    → Discord/Slack 中特定服务器+特定身份的组合
4. guild           → Discord/Slack 中特定服务器的所有用户
5. team            → 组织级别的配置
6. account         → 用户账号级别的配置
7. channel         → Channel 级别的默认配置
8. default         → 全局默认配置

优先级越高(数字越小),匹配越精确。这个机制允许你为不同用户配置不同的 Agent 行为,同时保持一个合理的默认值。

配置示例:

{
  "bindings": [
    {
      "priority": 1,
      "match": { "type": "peer", "peerId": "user:[email protected]" },
      "agent": "vip-agent",
      "config": { "model": "claude-opus-4-5-20251201" }
    },
    {
      "priority": 7,
      "match": { "type": "channel", "channelId": "whatsapp-business" },
      "agent": "support-agent",
      "config": { "model": "claude-haiku-3-5-20251201" }
    }
  ]
}

3.4 Pi 框架深度解析

Pi 的四个核心包

Pi 框架由四个 npm 包组成,每个包有明确的职责:

pi-ai/
  ├── 功能:LLM Provider 适配层
  ├── 职责:统一不同 Provider 的 API 调用接口
  └── 关键接口:LLMProvider, CompletionRequest, CompletionResponse

pi-agent-core/
  ├── 功能:Pi 的核心推理引擎
  ├── 职责:管理推理循环(ReAct 模式),调度工具调用,管理 Session 状态
  └── 关键接口:AgentSession, ToolRegistry, ReasoningLoop

pi-coding-agent/
  ├── 功能:面向编码场景的扩展 Agent
  ├── 职责:扩展 pi-agent-core,增加代码理解、测试生成等专用工具
  └── 关键接口:CodeContext, FileSystem, TestRunner

pi-tui/
  ├── 功能:Terminal UI(TUI 模式的 Control UI)
  ├── 职责:在没有浏览器的环境下提供可视化管理界面
  └── 关键接口:Dashboard, SessionViewer, LogStream

Pi 的四个基础工具

Pi 只暴露 4 个基础工具,这是一个刻意的设计决策,而非功能不足:

工具 描述 参数
read 读取文件或 URL 内容 path: string
write 写入内容到文件 path: string, content: string
edit 对文件进行精确修改(diff 模式) path: string, old: string, new: string
bash 执行 shell 命令 command: string, timeout?: number

业务集成(调用 HubSpot API、查询 Jira 等)不是通过扩展这 4 个工具实现的,而是通过 SkillsAction Layer 实现的。Pi 的工具集保持最小化,让 System Prompt 可以控制在 1000 tokens 以内,这对性能和成本有显著影响。

嵌入式执行 vs Subprocess

Pi 作为 嵌入式模块 运行在 Gateway 进程中,而不是作为独立的子进程。这个设计有重要的性能和架构含义:

子进程模式(传统方式)

Gateway ──IPC/HTTP──► Pi 子进程
  延迟:5-20ms(进程间通信)
  内存:Gateway + Pi 各自独立内存空间
  隔离性:强(进程崩溃不影响对方)

嵌入式模式(OpenClaw 方式)

Gateway [Pi 模块在同一进程内]
  延迟:< 0.1ms(函数调用)
  内存:共享内存空间,Pi 直接访问 Gateway 内部数据结构
  隔离性:弱(但通过 TypeScript 类型系统和模块边界保证接口隔离)

嵌入式模式使 Pi 可以直接读取 Gateway 的 Session 状态、Memory 缓存,无需序列化/反序列化,这对高并发场景(Command Queue 中同时处理多个 Sub-agent 任务)的延迟和吞吐量有显著优势。

3.5 Command Queue 详解

Command Queue 是 Gateway 的任务调度中心,管理所有发往 Pi 的命令执行顺序。它的设计目标是:在保证 Session 内消息有序处理的同时,最大化整体并发吞吐量。

四个 Lane

┌─────────────────────────────────────────────────────────────┐
│                      Command Queue                          │
│                                                             │
│  Global Lane    [====] [====] [====] [====]  max: 4        │
│  Session Lane   [================================]  max: 1  │
│  SubAgent Lane  [=][=][=][=][=][=][=][=]     max: 8        │
│  Cron Lane      [=][=][=][=]...              max: ∞        │
└─────────────────────────────────────────────────────────────┘

Global Lane(并发上限:4):处理需要独占资源的全局任务,如配置重载、Plugin 安装、数据库备份。并发上限为 4 防止资源争用。

Session Lane(并发上限:1):每个活跃 Session 有自己独立的 Session Lane,并发上限为 1。这保证了同一个用户的消息按序处理,不会出现响应乱序的问题。Session Lane 是 Pi 处理用户消息的主要通道。

SubAgent Lane(并发上限:8):当 Pi 在处理一个任务时决定启动子 Agent(例如并行爬取多个网页),子任务通过 SubAgent Lane 调度,最多 8 个并发。这是 OpenClaw 实现 Agent 并发分解(Decomposition)的机制。

Cron Lane(无并发上限):处理定时任务(定期发送报告、定期同步数据等),不限并发,按 cron 表达式触发。

四种处理模式

collect      → 收集所有待处理命令后批量处理,适用于批量导入场景
steer        → 实时处理,每条命令立即进入 Pi 推理循环
followup     → 处理 Pi 推理后的后续动作(发送响应、更新 Memory 等)
steer-backlog → 当 Session Lane 积压时,合并处理多条积压消息

3.6 Skills 深度解析

Skills 不是代码

这是新手最常见的误解之一。Skills 不是你需要编写代码来实现的功能,而是将现有能力(Pi 的工具、Gateway 的集成、外部 API)组合成可复用场景的配置包

一个 Skill 的结构:

# skills/email-summarizer.skill.yaml
id: email-summarizer
name: "Email Summarizer"
version: "1.0.0"
description: "Fetches and summarizes unread emails from Gmail"

triggers:
  - type: command
    pattern: "/summarize-emails"
  - type: schedule
    cron: "0 9 * * MON-FRI"  # 每个工作日早上9点

inputs:
  - name: maxEmails
    type: integer
    default: 10
    description: "Maximum number of emails to summarize"

steps:
  - id: fetch-emails
    action: integration.gmail.listUnread
    params:
      maxResults: "{{ inputs.maxEmails }}"
  
  - id: summarize
    action: pi.prompt
    params:
      prompt: |
        Please summarize the following emails concisely:
        {{ steps.fetch-emails.result | json }}
      model: claude-haiku-3-5-20251201

outputs:
  - name: summary
    value: "{{ steps.summarize.result }}"

这个 Skill 不需要写一行 TypeScript。它通过 YAML 描述了:触发条件、输入参数、执行步骤(调用 Gmail 集成 + 调用 Pi 做摘要)、输出结果。

Skills 市场

官方 Skills 市场(skills.openclaw.ai)提供社区贡献的 Skill 包。安装方式:

# 浏览可用 Skills
openclaw skills search "email"

# 安装 Skill
openclaw skills install [email protected]

# 列出已安装的 Skills
openclaw skills list

# 在 Agent 中启用 Skill
# 编辑 openclaw.json:
{
  "agents": [
    {
      "id": "my-agent",
      "skills": ["email-summarizer"]
    }
  ]
}

3.7 Plugin 深度解析

Plugin 不是 Skills

这是另一个常见误解。Plugin 和 Skills 的区别:

维度 Skills Plugin
实现方式 YAML/JSON 配置 TypeScript 代码
扩展对象 Pi 的能力(做什么) Gateway 的能力(如何通信)
典型用途 定义业务流程 添加新的 Channel Bridge
开发者要求 不需要编程 需要 TypeScript 开发
运行位置 Pi 推理循环内 Gateway 进程内

Plugin 主要用于以下场景:

Plugin 开发使用 plugin-sdk

// plugins/custom-platform/index.ts
import { definePlugin, ChannelBridge, InternalMessage } from '@openclaw/plugin-sdk';

export default definePlugin({
  id: 'custom-platform',
  name: 'Custom Platform Bridge',
  version: '1.0.0',
  
  async setup(registry) {
    registry.registerChannelBridge({
      id: 'custom-platform',
      
      async connect(config) {
        // 建立与自定义平台的连接
      },
      
      async receive(): AsyncIterator<InternalMessage> {
        // 接收来自平台的消息,转换为 InternalMessage
      },
      
      async send(response) {
        // 将响应发送回平台
      }
    });
  }
});

3.8 Memory 系统深度解析

三层 Memory 架构

┌─────────────────────────────────────────────────────────────┐
│                     Memory System                           │
│                                                             │
│  Short-term Memory                                          │
│  └─ 当前 Session 对话历史(最近 N 条,默认50)              │
│  └─ 存储:内存(RAM),Session 结束后可选持久化             │
│  └─ 生命周期:随 Session                                    │
│                                                             │
│  Long-term Memory                                           │
│  └─ 用户画像(偏好、历史决策、关键事实)                    │
│  └─ 存储:SQLite(向量化后,可选 pgvector)                 │
│  └─ 生命周期:持久,跨 Session                              │
│                                                             │
│  Workspace Memory                                           │
│  └─ 团队共享知识库(Markdown 文件 + 语义搜索索引)          │
│  └─ 存储:本地文件系统 + SQLite 向量索引                   │
│  └─ 生命周期:持久,所有 Agent 共享                        │
└─────────────────────────────────────────────────────────────┘

Memory 配置示例

{
  "memory": {
    "shortTerm": {
      "maxMessages": 50,
      "persistOnSessionEnd": true
    },
    "longTerm": {
      "enabled": true,
      "storage": "sqlite",
      "embeddingModel": "text-embedding-3-small",
      "embeddingProvider": "openai",
      "maxEntries": 10000
    },
    "workspace": {
      "enabled": true,
      "paths": [
        "~/.openclaw/workspace/",
        "/path/to/company-docs/"
      ],
      "indexOnStartup": true,
      "watchForChanges": true
    }
  }
}

Memory 如何影响 Pi 的推理

在每次 Pi 处理消息之前,Gateway 会自动:

  1. 加载当前 Session 的 Short-term Memory(对话历史)
  2. 根据当前消息内容,从 Long-term Memory 中语义检索相关的用户信息
  3. 将检索到的上下文注入到 System Prompt 的相关部分

这个过程对 Pi 和用户都是透明的,但对对话质量有显著影响:Pi 可以"记住"用户上次说过他不喜欢某种风格、偏好英文回复、曾经提过的项目背景等信息。

3.9 关键术语精确定义

在 OpenClaw 的文档和社区中,以下术语有精确的含义,混淆它们会导致配置错误:

Channel vs Session

Channel:一个持续的消息平台连接配置。例如,一个接入了 Slack 工作区的配置就是一个 Channel。Channel 是静态的,在配置文件中定义,不随时间变化。

Session:用户在 Channel 上的一次具体对话上下文。同一个 Channel 上不同用户的对话对应不同的 Session。Session 是动态的,随用户消息自动创建和管理。

WhatsApp Channel (1个)
  ├── Session: 用户A与 Agent 的对话
  ├── Session: 用户B与 Agent 的对话
  └── Session: 用户C与 Agent 的对话

Binding vs Tool

Binding:将一条传入消息路由到特定 Agent 和配置的规则。Binding 工作在 Gateway 层,发生在消息进入 Pi 之前。

Tool:Pi 在推理过程中可以调用的操作。Tool 工作在 Agent Core 层,发生在 Pi 推理循环内部。

Workspace vs Project

Workspace:OpenClaw 的 Memory 层概念,指共享知识库的存储位置(文件夹路径集合)。

Project:(非 OpenClaw 特定术语)通常指使用 OpenClaw 的一个业务应用。一个 Project 可能包含多个 Agent、多个 Channel、多个 Skill。

3.10 配置驱动 vs 代码驱动的范式差异

OpenClaw 坚持配置驱动范式,这与 LangChain、AutoGen 等框架的代码驱动范式形成鲜明对比。

配置驱动范式的核心思想

配置驱动意味着系统行为由数据(JSON/YAML 文件)描述,而非由代码(TypeScript/Python 函数)描述。

代码驱动(LangChain 风格)

# 每次改变 Agent 行为都需要修改代码
chain = LLMChain(
    llm=ChatAnthropic(model="claude-opus-4-5"),
    prompt=ChatPromptTemplate.from_messages([
        ("system", "You are a customer support agent."),
        ("human", "{input}")
    ])
)
result = chain.invoke({"input": user_message})

配置驱动(OpenClaw 风格)

{
  "agents": [{
    "id": "support-agent",
    "systemPrompt": "You are a customer support agent.",
    "llmProvider": "anthropic-primary"
  }]
}

修改 Agent 行为只需编辑 JSON 文件,无需重新编写和部署代码。这使非开发者可以独立维护 Agent 配置。

范式差异的实际影响

操作 代码驱动(LangChain) 配置驱动(OpenClaw)
修改 System Prompt 编辑代码,重新部署 编辑 JSON,热重载
添加新的消息平台 编写适配器代码 安装 Plugin(或直接用内置的)
调整路由规则 修改路由逻辑代码 编辑 Binding 规则
非开发者维护 几乎不可能 完全可行
版本控制 git diff 难以理解 git diff 清晰可读

小结

本章梳理了 OpenClaw 五大核心组件的职责边界和相互关系:

理解这些组件的边界,是避免常见误解(Skills 不是代码、Plugin 不是 Skills)的关键。在下一章中,我们将通过与 LangChain、AutoGen、CrewAI 的系统比较,进一步明确 OpenClaw 的定位和适用场景。

本章评分
4.8  / 5  (95 评分)

💬 留言讨论