jixiaxue 知识库
research / OpenClaw学习框架

OpenClaw 学习框架

12 个章节 · 0 条产出 · 0 条证据

OpenClaw 学习框架

状态:🟢 已完成 日期:2026-03-22 驱动问题:如何系统性地理解和学习 OpenClaw 这个自托管多通道 AI 网关? 方法论:系统架构分层学习法 + 组件分解法 数据来源:https://deepwiki.com/openclaw/openclaw 全部 12 大章节 + 20+ 子章节


结论摘要

  1. OpenClaw 是一个自托管的多通道 AI 网关,将 20+ 消息平台(WhatsApp/Telegram/Discord/Signal/iMessage/Slack 等)统一连接到 AI 个人助理,采用 Hub-and-Spoke 架构
  2. 核心是 Gateway + Pi Agent Runtime 双引擎:Gateway 负责连接管理/路由/认证,Agent Runtime 负责 LLM 调用/工具执行/上下文管理
  3. 高度模块化设计:Skills 系统(SKILL.md 格式)+ Plugin SDK(Channel/Auth/Tool 三类插件)+ 原生客户端(iOS/Android/macOS)
  4. 安全模型基于”单一可信运营者”假设,通过 9 层工具策略级联、SSRF 防护、沙箱隔离、设备配对等实现多层安全
  5. 学习路径建议:概念 → 架构 → Gateway → Agent Runtime → Skills/Channels → 高级特性(Cron/多 Agent/安全)

详细论证 → findings.md


方法论如何指导本次调研

系统架构分层学习法 定义了学习维度:

  • 第 0 层:概念与定位(是什么、解决什么问题)→ 0-概念与定位.md
  • 第 1 层:系统架构(Hub-and-Spoke、数据流、组件关系)→ 1-系统架构.md
  • 第 2 层:核心引擎(Gateway + Agent Runtime 深入)→ 2-Gateway核心.md, 3-Agent-Runtime核心.md
  • 第 3 层:扩展系统(Channels/Skills/Plugins)→ 4-消息通道与Skills.md
  • 第 4 层:高级特性(Cron/多 Agent/原生客户端/安全)→ 5-高级特性.md

组件分解法 指导每个层级的学习:

  • 每个组件拆解为:职责 → 接口 → 数据流 → 配置 → 安全边界
  • 组件间关系通过数据流串联

调研框架

OpenClaw学习框架/
├── _brief.md                    ← 你在这里(调研地图)
├── 0-概念与定位.md               ← 第 0 层:是什么、为什么、核心术语
├── 1-系统架构.md                 ← 第 1 层:整体架构、数据流、存储
├── 2-Gateway核心.md              ← 第 2 层-A:网关协议/认证/配置/会话/路由
├── 3-Agent-Runtime核心.md        ← 第 2 层-B:执行管线/工具系统/上下文压缩
├── 4-消息通道与Skills.md         ← 第 3 层:Channels + Skills + Plugin SDK
├── 5-高级特性.md                 ← 第 4 层:Cron/原生客户端/安全/开发
└── findings.md                  ← 收敛:学习路径推荐 + 关键洞察

关联调研

调研章节

0 OpenClaw — 概念与定位

OpenClaw — 概念与定位

📍 位置:OpenClaw学习框架 / 第 0 层 📌 核心发现:OpenClaw 是自托管多通道 AI 网关,将消息平台统一接入 AI 助理 📥 输入:DeepWiki Overview / Getting Started / Core Concepts / Glossary 📤 流向:→ findings.md [定位与价值判断]


一句话定义

OpenClaw is a self-hosted multi-channel AI gateway that connects messaging platforms to personal AI assistants.

关键词拆解:

关键词含义
Self-hosted运行在个人硬件上(macOS/Linux/WSL2),本地优先,数据不经第三方
Multi-channel同时服务 20+ 消息平台(WhatsApp、Telegram、Discord、Signal、iMessage、Slack、Matrix…)
AI Gateway中心化网关,统一管理所有通道→Agent 的连接、路由、认证
Personal Assistant面向个人使用场景,非企业多租户

解决什么问题

没有 OpenClaw 之前:

  • 想在 Telegram 用 AI 助理?写一个 Bot
  • 想在 Discord 也用?再写一个
  • WhatsApp 也要?又一个
  • 每个都要单独管理会话、配置 API Key、设置工具权限……

有了 OpenClaw 之后:

  • 一个 Gateway 进程统一管理所有通道
  • 一套会话系统跨平台隔离
  • 一套工具/技能体系所有通道共享
  • 一套安全策略统一管控

核心特性一览

特性说明
多通道20+ 消息平台,DM + 群聊 + 线程
多 Agent单 Gateway 可承载多个隔离的 Agent,各自独立工作区/人格/工具
多模型支持 Anthropic、OpenAI、Google、Ollama 等,自动故障转移
工具系统exec(命令执行)、文件操作、网络搜索、记忆检索等,策略级联管控
Skills模块化能力扩展,SKILL.md 声明式格式
Cron定时自动化任务,支持 cron 表达式/固定间隔/一次性
原生客户端iOS/Android/macOS 原生 App,摄像头/录屏/语音唤醒等设备能力
Plugin SDK第三方扩展:自定义 Channel、Auth、Tool 插件
本地优先配置/会话/凭证全部存储在 ~/.openclaw/

核心术语表

架构层

术语定义
Gateway中央控制面,管理通道连接、会话持久化、Agent 编排
Agent隔离的 AI 执行单元,拥有独立工作区、人格、配置
Pi Agent / Pi EmbeddedAgent 的具体执行环境,处理系统提示词、工具调用、模型回退
Channel连接 Gateway 到外部消息平台的插件
Node原生客户端设备(iOS/Android/macOS),提供设备本地能力
Session对话线程,包含隔离的聊天历史和执行状态
SessionKey会话唯一标识,格式 channel:account:peer

数据与配置层

术语定义
Workspace持久化文件系统目录(默认 ~/.openclaw/workspace),存放 SOUL.md、AGENTS.md、Skills
SOUL.mdAgent 的人格/行为指令文件
AGENTS.md多 Agent 路由配置文件
SecretRef安全引用系统,从环境变量或文件解析密钥,避免明文存储
TranscriptPolicy对话历史发送给 LLM 前的处理规则(过滤、格式化)
Compaction自动总结长对话以适应模型上下文窗口
CalVer版本号格式 YYYY.M.D(如 2026.3.14

扩展层

术语定义
Skill模块化工具+提示词包,SKILL.md 格式
PluginGateway 级扩展(Channel/Auth/Tool),通过 Plugin SDK 开发
A2UIAgent-to-User Interface,Canvas 和交互元素渲染格式
SwabblemacOS 语音唤醒守护进程
Binding将特定通道/用户映射到特定 Agent 的配置
Subagent主 Agent 派生的子 Agent,权限受限
Hook插件定义的回调函数,在 Agent 生命周期特定点执行

环境要求

项目要求
Node.jsv24(推荐)或 v22.16+
系统macOS / Linux / Windows (WSL2)
包管理npm / pnpm / bun
当前版本2026.3.14 (CalVer)

快速启动

# 1. 安装
npm install -g openclaw@latest

# 2. 引导向导(配置模型 API Key、Gateway、通道)
openclaw onboard

# 3. 启动网关
openclaw gateway start

# 4. 打开控制台
openclaw dashboard

# 5. 诊断检查
openclaw doctor

引导向导两种模式:

  • QuickStart:最少交互,默认端口 18789、token 认证、pairing 模式
  • Advanced:逐项手动配置

存储布局

~/.openclaw/
├── openclaw.json                    # 主配置(JSON5 格式)
├── credentials/                     # OAuth/API Key 凭证
├── agents/
│   └── <agentId>/
│       ├── agent/
│       │   ├── auth-profiles.json   # 模型供应商凭证
│       │   └── models.json          # 模型注册表
│       └── sessions/
│           ├── sessions.json        # 会话注册表
│           └── *.jsonl              # 对话记录
├── workspace/                       # 默认工作区
│   ├── SOUL.md                      # Agent 人格
│   ├── AGENTS.md                    # 多 Agent 配置
│   └── skills/                      # 技能目录
├── skills/                          # 全局共享技能
├── cron/
│   ├── jobs.json                    # 定时任务定义
│   └── runs.jsonl                   # 执行日志
└── workspace-<agentId>/             # 多 Agent 独立工作区

与类似产品的定位差异

维度OpenClaw类似产品(如 Botpress/Rasa/Dify)
部署模型个人自托管企业/云端
用户模型单一可信运营者多租户
通道覆盖20+ 统一网关通常 3-5 个
Agent 运行时内嵌 Pi Agent + 工具执行通常调用外部 API
扩展方式Skills (SKILL.md) + Plugin SDK通常 GUI 配置
原生客户端iOS/Android/macOS App通常仅 Web
1 OpenClaw 架构总览

OpenClaw 架构总览

项目定位

本地运行的开源 AI 助手框架,通过 20+ 消息平台(WhatsApp、Telegram、Slack、Discord 等)作为交互界面,支持多 Agent、多模型、插件化扩展。

技术栈:TypeScript / Node.js / pnpm monorepo

架构层级图

┌─────────────────────────────────────────────────────────────┐
│                     用户交互层                                │
│  macOS 菜单栏 App │ iOS App │ Android App │ WebChat │ CLI    │
└────────────────────────┬────────────────────────────────────┘
                         │ WebSocket RPC
┌────────────────────────▼────────────────────────────────────┐
│                   Gateway 控制面板                            │
│  src/gateway/server.impl.ts                                  │
│  ┌──────────┬──────────┬──────────┬──────────┬────────────┐ │
│  │ 会话管理  │ 凭证管理  │ 插件生命  │ Cron    │ 安全/配对  │ │
│  │ Sessions │ Creds    │ 周期     │ 调度    │ DM Pairing │ │
│  └──────────┴──────────┴──────────┴──────────┴────────────┘ │
└────────────────────────┬────────────────────────────────────┘

        ┌────────────────┼────────────────┐
        ▼                ▼                ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────────┐
│  Channel 层   │ │  Agent 运行时  │ │  Plugin 系统      │
│  20+ 消息渠道  │ │  Pi Runner   │ │  extensions/      │
│  src/channels│ │  src/agents/  │ │  src/plugin-sdk/  │
└──────────────┘ └──────┬───────┘ └──────────────────┘

        ┌───────────────┼───────────────┐
        ▼               ▼               ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│  工具系统     │ │  记忆系统     │ │  文档系统     │
│  Browser     │ │  Memory      │ │  SOUL.md     │
│  Canvas      │ │  Search      │ │  IDENTITY.md │
│  Nodes       │ │  src/memory/ │ │  AGENTS.md   │
│  Skills      │ │              │ │  等 9 类文档   │
└──────────────┘ └──────────────┘ └──────────────┘

核心模块一览

模块路径职责
Gatewaysrc/gateway/ (270 files)中心控制面板,WebSocket RPC 服务,路由所有消息
Agent 运行时src/agents/ (612 files)Agent 进程管理、工具调用、模型交互
Channel 层src/channels/ + extensions/统一消息抽象,20+ 渠道适配
CLIsrc/cli/ (180 files)终端命令入口与交互
记忆系统src/memory/ (108 files)向量搜索、记忆索引、时间衰减
配置系统src/config/ (225 files)YAML 配置加载、热更新
Plugin SDKsrc/plugin-sdk/ (206 files)插件开发契约(Channel / Provider / Skill)
安全src/security/ + src/pairing/DM 配对、SSRF 防护、执行审批
媒体管道src/media/ (46 files)图片/音频/视频处理
浏览器控制src/browser/ (135 files)Chrome 自动化
Skillsskills/ (50+)预装技能(Apple Notes、1Password、GitHub 等)
原生 Appapps/macOS / iOS / Android 客户端

数据流

用户消息 → Channel 适配器 → Gateway 路由 → Session 匹配
→ Agent Runtime (加载文档 + 记忆) → LLM 调用 → 工具执行
→ 响应格式化 → Channel 适配器 → 用户

入口文件

用途路径
CLI 入口openclaw.mjssrc/entry.tssrc/cli/run-main.ts
Gateway 服务src/gateway/server.impl.ts
Agent 调用核心src/gateway/call.ts
库导出src/library.ts
1 OpenClaw — 系统架构

OpenClaw — 系统架构

📍 位置:OpenClaw学习框架 / 第 1 层 📌 核心发现:Hub-and-Spoke 架构,Gateway 为中心,所有接口通过 WebSocket/HTTP 连接 📥 输入:DeepWiki System Architecture / Protocol / Configuration 📤 流向:→ findings.md [架构理解与设计决策]


整体架构:Hub-and-Spoke

                    ┌─────────────────────────────────────────────┐
                    │              Gateway (Hub)                   │
                    │         Node.js / Port 18789                │
                    │                                             │
                    │  ┌───────────┐  ┌──────────────┐           │
                    │  │ Session   │  │ Channel      │           │
                    │  │ Manager   │  │ Manager      │           │
                    │  └───────────┘  └──────────────┘           │
                    │  ┌───────────┐  ┌──────────────┐           │
                    │  │ Agent     │  │ Tool Policy  │           │
                    │  │ Executor  │  │ Pipeline     │           │
                    │  └───────────┘  └──────────────┘           │
                    │  ┌───────────┐  ┌──────────────┐           │
                    │  │ Cron      │  │ Config       │           │
                    │  │ Service   │  │ System       │           │
                    │  └───────────┘  └──────────────┘           │
                    └──────────┬───────────┬──────────────────────┘
                               │           │
              ┌────────────────┼───────────┼─────────────────┐
              │                │           │                 │
     ┌────────▼──────┐  ┌─────▼───┐  ┌────▼────┐   ┌───────▼──────┐
     │  Messaging     │  │  CLI    │  │ Control │   │  Native      │
     │  Channels      │  │         │  │   UI    │   │  Clients     │
     │  (Spokes)      │  │         │  │  (SPA)  │   │  (Nodes)     │
     ├────────────────┤  └─────────┘  └─────────┘   ├──────────────┤
     │ Telegram       │                              │ iOS          │
     │ Discord        │                              │ Android      │
     │ WhatsApp       │                              │ macOS        │
     │ Slack          │                              └──────────────┘
     │ Signal         │
     │ iMessage       │
     │ Matrix         │
     │ Feishu         │
     │ ...20+         │
     └────────────────┘

核心设计决策:

  • 单进程、单端口:所有服务(WebSocket RPC、HTTP、静态文件)复用同一端口
  • Gateway 是唯一控制面:所有接口必须通过 Gateway 交互
  • 无外部依赖:不需要 Redis/PostgreSQL,纯文件系统存储

数据流:从用户消息到 Agent 响应

用户在 Telegram 发消息


① Channel Plugin (Telegram) 接收


② dmPolicy 安全门控
   ├── pairing → 要求审批码
   ├── allowlist → 检查白名单
   └── open → 直接通过


③ resolveSessionKey() → 确定会话标识
   格式:agent:<agentId>:<provider>:<peerId>


④ resolveAgentIdFromSessionKey() → 路由到目标 Agent
   优先级:精确 peer → 父级 peer → Guild → Account → 默认


⑤ 加载会话历史(JSONL transcript)


⑥ runEmbeddedPiAgent() → 执行 Agent 回合
   ├── 组装系统提示词(Identity + Tools + Skills + Context)
   ├── 解析指令(/think, /model 等)
   ├── 选择模型 + 解析 Auth Profile
   ├── 调用 LLM API(支持故障转移)
   ├── 工具调用循环(策略过滤 → 执行 → 返回结果)
   └── 上下文压缩(超 85% token 限制时触发)


⑦ 持久化更新的 transcript (JSONL)


⑧ 通过 Channel Plugin 回送响应到 Telegram

WebSocket 帧协议

Gateway 使用 WebSocket 协议 v3,基于 JSON 帧通信:

帧类型方向用途
ConnectParamsClient → Server握手:协议版本协商、认证、客户端元数据
HelloOkServer → Client握手响应:协商结果、系统快照、授权策略
RequestFrameClient → ServerRPC 调用:方法名 + 参数 + 唯一 ID
ResponseFrameServer → ClientRPC 响应:ok/error + payload,按 ID 匹配
EventFrameServer → Client异步事件推送(流式输出、状态变更、cron 完成等)

所有帧通过 Ajv 进行 JSON Schema 校验。

关键 RPC 方法:

方法用途
agent执行 Agent 推理
config.get / config.apply / config.patch配置管理
sessions.list会话列表
channels.status通道健康检查
cron.add / cron.run / cron.list定时任务管理
gateway.health / gateway.status网关诊断
device.pair.*设备配对

配置系统

配置管道

openclaw.json (JSON5)


JSON5 解析 + 环境变量替换 (${VAR_NAME})


$include 合并(支持外部配置片段)


Zod Schema 严格校验(拒绝未知字段)


SecretRef 解析(env: / file: → 实际值)


运行时快照(供所有子系统消费)

热重载模式

模式行为
hybrid(默认)安全变更热加载,关键变更(端口)触发重启
hot全部就地热加载,需要重启时仅记日志
restart任何变更直接重启 Gateway
off关闭文件监听

SecretRef 示例

{
  "gateway": {
    "auth": {
      "token": { "source": "env", "id": "OPENCLAW_GATEWAY_TOKEN" }
    }
  }
}

存储架构

数据类型格式路径
主配置JSON5~/.openclaw/openclaw.json
Agent 凭证JSON~/.openclaw/agents/<id>/agent/auth-profiles.json
模型注册表JSON~/.openclaw/agents/<id>/agent/models.json
会话注册表JSON~/.openclaw/agents/<id>/sessions/sessions.json
对话记录JSONL~/.openclaw/agents/<id>/sessions/*.jsonl
定时任务JSON~/.openclaw/cron/jobs.json
执行日志JSONL~/.openclaw/cron/runs.jsonl
OAuth 凭证文件~/.openclaw/credentials/

关键设计:

  • 全部基于文件系统,无外部数据库依赖
  • JSONL 格式用于追加写(会话记录、cron 日志)
  • JSON 格式用于结构化状态(配置、注册表)
  • 原子写入:先写临时文件 → fs.rename() 原子替换

跨平台 Daemon 管理

平台技术配置路径
macOSlaunchd~/Library/LaunchAgents/ai.openclaw.gateway.plist
Linuxsystemd~/.config/systemd/user/openclaw-gateway.service
WindowsTask Scheduler生成 gateway.cmd 包装器

统一 CLI 命令抽象平台差异:openclaw gateway install/start/stop/status


Vendored 组件

组件用途位置
A2UIAgent-to-User Interface,Canvas/交互 UI 渲染vendor/a2ui
SwabblemacOS 语音唤醒守护进程Swabble/
clawdbot/moltbot历史兼容性垫片packages/

关键设计决策总结

决策理由
单进程单端口简化部署,个人使用无需分布式
文件系统存储本地优先,无外部依赖,便于备份
Hub-and-Spoke统一控制面,所有通道/客户端平等接入
WebSocket + JSON 帧双向实时通信,支持流式输出
Zod 严格校验启动时拒绝无效配置,防止运行时错误
CalVer 版本直觉性强,适合持续发布
2 Agent 文档系统

Agent 文档系统

每个 Agent 拥有 9 类文档,存储在 workspace 目录中,按不同规则加载进 LLM 上下文。

文档总览

文档用途自动创建加载范围
SOUL.md人格哲学主会话 + 子 Agent
IDENTITY.md身份元数据主会话 + 子 Agent
USER.md用户画像主会话 + 子 Agent
AGENTS.md行为规则所有会话(最高优先级)
TOOLS.md工具配置所有会话
HEARTBEAT.md心跳任务主会话(子 Agent 过滤)
MEMORY.md长期记忆仅主私聊会话
BOOTSTRAP.md首次引导仅一次仅首次运行
memory/YYYY-MM-DD.md每日日志按需通过记忆搜索访问

各文档详解

SOUL.md — 人格灵魂

存储内容:Agent 的核心人格、哲学、语调、边界、连续性指令

文件路径~/.openclaw/workspace/SOUL.md

加载行为:系统提示词中检测到 SOUL.md 时,指示 LLM “embody its persona and tone” (源码:src/agents/system-prompt.ts:611-620

示例内容

You are a thoughtful, curious assistant who speaks with warmth...
Core truths: ...
Boundaries: ...

IDENTITY.md — 身份卡片

存储内容:名称、生物类型、语调标签、emoji 签名、头像路径

文件路径~/.openclaw/workspace/IDENTITY.md

文件格式:YAML 风格 frontmatter

name: Claw
creature: lobster
vibe: curious, warm
emoji: 🦞
avatar: ./avatar.png

USER.md — 用户画像

存储内容:用户姓名、代词、时区、项目背景、偏好

文件路径~/.openclaw/workspace/USER.md

设计意图:让 Agent 了解”我在帮助谁”,个性化响应

AGENTS.md — 行为规则(最高优先级)

存储内容:会话启动清单、行为红线、群聊规则、工具使用策略、心跳指令

文件路径~/.openclaw/workspace/AGENTS.md

特殊机制

  • 上下文压缩后,H2/H3 章节(如 Session StartupRed Lines)会被重新注入
  • 可通过 postCompactionSections 配置要保留的章节
  • 源码:src/config/types.agent-defaults.ts:337-338

TOOLS.md — 工具本地配置

存储内容:摄像头名称、SSH 主机、TTS 语音偏好、设备昵称等环境特定信息

文件路径~/.openclaw/workspace/TOOLS.md

设计理念:Skills 定义工具”怎么用”,TOOLS.md 定义”你的”具体参数

HEARTBEAT.md — 心跳任务清单

存储内容:定期后台轮询时要执行的检查项

文件路径~/.openclaw/workspace/HEARTBEAT.md

格式:Markdown 清单

MEMORY.md — 长期策展记忆

存储内容:蒸馏后的重要记忆、决策、教训、重大事件

文件路径~/.openclaw/workspace/MEMORY.md(大小写不敏感,MEMORY.md 优先于 memory.md

安全设计仅在私聊主会话加载,群聊和子 Agent 中不加载,防止个人信息泄露 (源码:src/agents/workspace.ts:467-485

BOOTSTRAP.md — 首次引导

文件路径~/.openclaw/workspace/BOOTSTRAP.md

行为:仅在全新 workspace 首次运行时加载,用后应删除

memory/YYYY-MM-DD.md — 每日日志

文件路径~/.openclaw/workspace/memory/YYYY-MM-DD.md

设计理念:“Write it down — no mental notes!” 文件跨会话持久化,大脑不会

上下文加载机制

加载流程

workspace.ts:loadWorkspaceBootstrapFiles()
  → bootstrap-files.ts:resolveBootstrapContextForRun()
    → pi-embedded-helpers/bootstrap.ts:buildBootstrapContextFiles()
      → system-prompt.ts (注入为 "# Project Context")

关键源码路径

功能文件
文档发现与加载src/agents/workspace.ts:487-547
上下文组装src/agents/bootstrap-files.ts:98-118
Token 预算与截断src/agents/pi-embedded-helpers/bootstrap.ts:198-257
系统提示词注入src/agents/system-prompt.ts:604-627
压缩后重注入配置src/config/types.agent-defaults.ts:333-338
子 Agent 白名单src/agents/workspace.ts:549-565

Token 预算管理

  • 单文件上限:20,000 字符
  • 总上限:150,000 字符
  • 截断策略:头部 70% + 标记 + 尾部 20%
  • 按文件身份缓存(inode/dev/size/mtime)

子 Agent 加载白名单

子 Agent 只加载以下文档(MINIMAL_BOOTSTRAP_ALLOWLIST):

✅ AGENTS.md, TOOLS.md, SOUL.md, IDENTITY.md, USER.md
❌ MEMORY.md, HEARTBEAT.md, BOOTSTRAP.md

文档模板位置

所有文档的参考模板:docs/reference/templates/

docs/reference/templates/
├── SOUL.md
├── IDENTITY.md
├── USER.md
├── AGENTS.md
├── TOOLS.md
├── HEARTBEAT.md
└── BOOTSTRAP.md
2 OpenClaw — Gateway 核心

OpenClaw — Gateway 核心

📍 位置:OpenClaw学习框架 / 第 2 层-A 📌 核心发现:Gateway 是中央控制面,管理认证/路由/会话/配置,是理解 OpenClaw 的关键枢纽 📥 输入:DeepWiki Section 2(Gateway 及其 6 个子章节) 📤 流向:→ findings.md [Gateway 设计理解]


Gateway 职责全景

Gateway (GatewayServer) 是 OpenClaw 的心脏,负责:

┌─────────────────────────────────────────────────────────┐
│                    Gateway 职责                           │
├─────────────┬─────────────┬──────────────┬──────────────┤
│  认证授权    │  消息路由    │  会话管理     │  配置管理    │
│  Auth &     │  Multi-Agent │  Session     │  Config      │
│  RBAC       │  Routing     │  Lifecycle   │  Pipeline    │
├─────────────┼─────────────┼──────────────┼──────────────┤
│  通道管理    │  Agent 编排  │  诊断监控     │  Cron 调度   │
│  Channel    │  Agent       │  Health &    │  Scheduled   │
│  Manager    │  Execution   │  Doctor      │  Jobs        │
└─────────────┴─────────────┴──────────────┴──────────────┘

2.1 认证与授权

认证方式

方式场景说明
TokenCLI、Web UIBearer 风格令牌,safeEqualSecret 防时序攻击
PasswordWeb UI 登录用户凭证认证
Device Pairing原生客户端非对称加密挑战-响应,Ed25519 签名
Trusted ProxyTailscale 等代理层委托认证,接受身份头

角色模型(RBAC)

角色说明权限范围
operator人类用户 / CLI所有方法(按 scope 细分)
node原生客户端设备仅限 node 特定方法

Operator 权限作用域

Scope能力
operator.admin配置变更、系统重启
operator.read查看会话、日志
operator.write发送消息、触发 Agent
operator.approvals命令执行审批
operator.pairing设备配对审批

安全防护

  • 暴力破解防护:跟踪失败认证,IP 级冷却
  • RPC 限流:控制面写操作限速(如 config.apply 限 3 次/60 秒)
  • HTTP 工具调用/tools/invoke 端点验证 bearer token + SSRF 防护

2.2 会话管理

会话隔离模式(dmScope)

模式行为适用场景
main所有 DM 共享一个全局会话单人使用
per-peer按发送者隔离(跨通道)多人但不分通道
per-channel-peer按通道+发送者隔离推荐,最安全

SessionKey 格式

agent:<agentId>:main                              # 主会话
agent:<agentId>:<provider>:group:<groupId>         # 群组会话
agent:<agentId>:<provider>:<chatId>:thread:<tid>   # 线程会话

会话生命周期

创建 → 活跃对话 → 自动新鲜度重置 → 上下文压缩 → 过期清理
                    │                    │              │
            idleMinutes/           token > 85%     pruneAfter
            dailyReset                             (30 天)
  • 存储:JSONL 追加写,sessions.json 为注册表
  • 线程分叉:子线程继承父上下文但不修改原始记录
  • 并发安全:Promise 链互斥锁防止竞态写入
  • 路径安全validateSessionId 防目录穿越攻击

2.3 多 Agent 路由

Agent 隔离模型

每个 Agent 拥有完全独立的资源:

~/.openclaw/
├── agents/
│   ├── main/              # 默认 Agent
│   │   ├── agent/         # auth-profiles.json, models.json
│   │   └── sessions/      # 独立会话存储
│   └── work/              # 第二个 Agent
│       ├── agent/
│       └── sessions/
├── workspace/             # main Agent 的工作区
└── workspace-work/        # work Agent 的工作区

路由优先级(从高到低)

  1. 精确 peer 匹配:直接消息/群组 ID 绑定
  2. 父级 peer 匹配:线程继承
  3. Guild/Team ID:Discord 服务器/Slack 工作区
  4. Account ID:特定通道登录账号
  5. 默认 Agent 兜底:通常是 main

模型选择优先级

  1. 消息内联指令(/model claude-opus
  2. 会话级别覆盖
  3. Agent 配置中的主模型
  4. 全局默认模型

Subagent 路由

  • 主 Agent 派生子 Agent → 通过 requesterSessionKey 追踪
  • 结果通过 DeliveryContext(通道、账号、收件人)路由回原始对话
  • 内部标记防止子 Agent 输出触发外部投递

2.4 服务生命周期

启动模式

模式说明
ForegroundCLI 直接调用
Daemon平台 daemon 管理(launchd/systemd)
Embedded内嵌在原生应用中

状态机

Starting → Running → Shutting Down → Stopped
   │          │           │
   │          │      SIGTERM/SIGINT
   │          │      30 秒排空
   │     处理请求

加载插件
初始化通道
绑定端口

特殊信号:
SIGHUP  → 配置重载(不重启)
SIGUSR1 → 强制重启(破坏性变更时)

安全约束

非回环地址绑定时必须启用认证(token 或 password),否则拒绝启动。

诊断工具

openclaw doctor

  • 校验配置 Schema 完整性
  • 检查 API Key / OAuth Token 有效性
  • 测试 Gateway RPC 端口连通性
  • 检测环境变量覆盖和遗留设置
  • 提供自动修复建议

健康端点

  • gateway.health:运行时间、内存、通道状态、配置有效性
  • gateway.status:模式、服务列表、通道连接状态
  • gateway.probe:远程 Gateway 可达性检查

关键源文件

文件职责
src/gateway/gateway.ts主服务
src/gateway/rpc-server.tsWebSocket 协议处理
src/gateway/server.impl.ts服务器实现
src/gateway/config-reload.ts配置热重载
src/gateway/server/readiness.ts就绪检查
src/commands/doctor.ts诊断命令
src/daemon/launchd.tsmacOS daemon
src/daemon/systemd.tsLinux daemon
3 记忆隔离与分层

记忆隔离与分层

先搞清几个核心概念

Channel ≠ Session

概念是什么类比
Channel消息平台适配器(Telegram、Slack、Discord…)电话线路
Session一段持续的对话上下文,有完整的聊天记录一通电话

一个 Channel 上可以有多个 Session(跟 Alice 的私聊是一个 Session,跟 Bob 的是另一个,群聊又是一个)。Session 跨消息持久化——关闭 App 再回来,还是同一个 Session。

sessionKey 是什么

sessionKey 是 Session 的唯一标识符,由 Channel + 聊天类型 + 对方 ID 拼接而成。

格式agent:{agentId}:{路由部分}

实际例子

场景sessionKey
默认主会话(CLI)agent:main:main
Telegram 跟 Alice 私聊agent:main:telegram:direct:alice123
Telegram 跟 Bob 私聊agent:main:telegram:direct:bob456
Slack 群聊 #engineeringagent:main:slack:ws-id:group:C12345
Discord 频道 #generalagent:main:discord:guild-id:channel:ch789
子 Agent 派生agent:main:subagent:thread-xxx:rest
定时任务agent:main:cron:daily-digest:run:exec-id

源码:src/routing/session-key.ts:53-186

Session 文件是什么

每个 Session 对应一个 JSONL 文件(每行一个 JSON 对象),存储完整的对话记录。

路径~/.openclaw/agents/{agentId}/sessions/{sessionId}.jsonl

如果有 topic/thread:{sessionId}-topic-{topicId}.jsonl

文件内容(每行一个 JSON):

{"type":"session","sessionId":"main","createdAt":"2026-03-20T10:00:00Z"}
{"type":"message","message":{"role":"user","content":"你好"}}
{"type":"message","message":{"role":"assistant","content":"你好!有什么可以帮你的?"}}
{"type":"message","message":{"role":"user","content":"帮我查一下明天的天气"}}
{"type":"message","message":{"role":"assistant","content":"...","toolCalls":[...]}}
{"type":"compaction","summary":"用户询问天气,助手使用了天气工具..."}
{"type":"message","message":{"role":"user","content":"谢谢"}}

包含:用户消息、助手回复、工具调用、压缩摘要等。

Pairing 是什么

Pairing 是访问控制机制——决定”谁有资格跟 Agent 说话”。

问题:你的 Telegram Bot 是公开的,任何人都能给它发消息。你不想让陌生人使用你的 Agent。

流程

陌生人发消息 → Bot 检查 allowFrom 白名单 → 不在名单中
  → 生成 8 位配对码(如 ABCD1234)→ 存入 pending
  → Bot 回复"请等待主人审批"
  → 消息不会被处理

你在终端:
  $ openclaw pairing list telegram     # 查看待审批
  $ openclaw pairing approve telegram ABCD1234  # 批准

批准后 → 对方 ID 写入 allowFrom.json → 后续消息正常处理

存储文件

  • 待审批:~/.openclaw/credentials/{channel}-pairing.json
  • 白名单:~/.openclaw/credentials/{channel}-allowFrom.json

Pairing 和 Session 的关系:Pairing 管”能不能说话”(门卫),Session 管”说了什么”(笔记本)。通过 Pairing 后,才会创建/复用 Session。

源码:src/pairing/pairing-store.ts

memory_search 的工作原理

是的,是语义搜索(向量搜索)。

工作原理:

  1. MEMORY.md + memory/*.md 被切成小块(400 tokens/块,80 tokens 重叠)
  2. 每个块通过 Embedding 模型转为向量,存入 SQLite(sqlite-vec 扩展)
  3. 搜索时,query 也转为向量,做余弦相似度匹配
  4. 可选混合搜索:向量 70% + BM25 全文 30%

Embedding 模型来源(自动检测顺序):

优先级Provider是否本地
1本地 GGUF 模型(node-llama-cpp)✅ 本地
2Ollama✅ 本地
3OpenAI text-embedding-3-small❌ 远程
4Google Gemini❌ 远程
5Voyage AI❌ 远程
6Mistral❌ 远程

所以可以完全本地运行(用 GGUF 或 Ollama),也可以用远程 API。

引用标注(Citation)是什么

Agent 回复时,如果引用了记忆中的内容,会标注出处:

助手回复:"你之前提到过你更喜欢用 TypeScript..."

Source: memory/2026-03-20.md#L10-L15

格式文件路径#L起始行-L结束行

为什么群聊中要隐藏:你的 MEMORY.md 里可能有私人信息(“用户是 XX 公司的 CTO”),在群聊中暴露引用路径会泄露这些信息的存在。

配置

  • citations: "on" — 始终显示
  • citations: "off" — 始终隐藏
  • citations: "auto" — 私聊显示,群聊隐藏(默认)

QMD 是什么

QMD 是 OpenClaw 的可选高级记忆后端(替代默认的 SQLite)。

默认 (builtin)QMD
存储SQLite + sqlite-vec独立侧车进程
搜索纯向量搜索BM25 + 向量 + 重排序
Embedding需要外部 API 或本地模型内置本地模型(GGUF)
适合轻量使用大量记忆、高质量检索

QMD Scope 就是 QMD 后端的访问控制——规定哪些类型的会话可以使用 QMD 搜索。默认只允许私聊使用。


隔离层级总览

┌─────────────────────────────────────────────────────┐
│  第 0 层:Pairing(访问控制)                          │
│  陌生人 → 配对审批 → 才能进入下面的层级                  │
├─────────────────────────────────────────────────────┤
│  第 1 层:Agent 隔离                                  │
│  每个 Agent 有独立的 workspace / 记忆索引 / 人格         │
│                                                      │
│  ┌─────────────────────────────────────────────────┐ │
│  │  第 2 层:Session 隔离                            │ │
│  │  同一 Agent 内,不同对话有独立的 sessionKey           │ │
│  │  对话记录(JSONL)按 Session 独立存储                 │ │
│  │                                                   │ │
│  │  ┌───────────────────────────────────────────┐   │ │
│  │  │  第 3 层:文档加载隔离                       │   │ │
│  │  │  主会话 vs 子Agent vs 定时任务                │   │ │
│  │  │  加载不同的文档子集                           │   │ │
│  │  │  + 引用标注的显隐控制                         │   │ │
│  │  └───────────────────────────────────────────┘   │ │
│  └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘

第 1 层:Agent 隔离

每个 Agent 完全独立,记忆不跨 Agent。

AgentWorkspace记忆索引
默认~/.openclaw/workspace/~/.openclaw/memory/main.sqlite
alpha~/.openclaw/agents/alpha/~/.openclaw/memory/alpha.sqlite
beta~/.openclaw/agents/beta/~/.openclaw/memory/beta.sqlite

可以把不同 Channel 路由到不同 Agent:

Telegram DM  ──→  Agent "personal"  (个人助手,有私人记忆)
Slack #work  ──→  Agent "work"      (工作助手,有工作记忆)
Discord      ──→  Agent "gaming"    (游戏伙伴,有游戏记忆)

第 2 层:Session 隔离

同一 Agent 内,不同聊天各有独立 Session,对话记录分开存储。

具体例子

假设你用默认 Agent,同时在 Telegram 群 A、群 B、和跟 Alice 私聊:

~/.openclaw/agents/main/sessions/
├── sessions.json                           # 所有 Session 的索引
├── main.jsonl                              # CLI 主会话记录
├── tg-direct-alice123.jsonl                # Telegram 跟 Alice 私聊记录
├── tg-group-groupA-id.jsonl               # Telegram 群 A 记录
├── tg-group-groupB-id.jsonl               # Telegram 群 B 记录
└── tg-group-groupA-id-topic-thread1.jsonl # 群 A 中某个 topic 的记录

每个 Session 的记忆是完全隔离的

  • 群 A 里聊的内容,Agent 在群 B 里不会知道
  • 私聊的内容,Agent 在群聊里不会提到

第 3 层:文档加载隔离

不同运行场景加载不同的文档子集。

过滤条件是 Session 类型(不是 chatType):

文档普通会话(私聊+群聊)子 Agent定时任务(Cron)
AGENTS.md
TOOLS.md
SOUL.md
IDENTITY.md
USER.md
HEARTBEAT.md
MEMORY.md
BOOTSTRAP.md✅(首次)

注意:MEMORY.md 在普通会话中私聊和群聊都会加载到上下文。群聊中的保护不是”不加载 MEMORY.md”,而是隐藏引用标注(citations: auto)和 QMD scope 限制搜索访问

源码:src/agents/workspace.ts:557-565


完整数据流示例

场景:你在 Telegram 群 A 聊了,又在群 B 聊了,还跟 Alice 1v1 聊了。第二天继续对话。

第一天

你在群 A 发消息 "明天开会几点?"

1. Channel 层:Telegram 适配器接收消息
2. Pairing 检查:群 A 在白名单中 → 通过
3. Session 路由:sessionKey = "agent:main:telegram:group:groupA-id"
   → 查 sessions.json,找到/创建对应 Session
   → 打开 tg-group-groupA-id.jsonl
4. 文档加载:加载 AGENTS.md + SOUL.md + IDENTITY.md + USER.md + TOOLS.md + MEMORY.md
5. 上下文构建:
   - 系统提示词(含上述文档)
   - JSONL 中的历史消息(全部加载到内存)
   - 当前消息 "明天开会几点?"
6. LLM 调用 → 生成回复
7. 回复写入 tg-group-groupA-id.jsonl
8. 通过 Telegram 发送回复
你在群 B 发消息 "推荐个餐厅"

同样流程,但 sessionKey = "agent:main:telegram:group:groupB-id"
→ 打开的是 tg-group-groupB-id.jsonl(不同文件)
→ Agent 完全不知道群 A 里聊了什么
你跟 Alice 私聊 "帮我总结一下今天的工作"

sessionKey = "agent:main:telegram:direct:alice123"
→ 打开 tg-direct-alice123.jsonl
→ Agent 可以调用 memory_search 搜索记忆
→ 回复中会带引用标注(citations: auto → 私聊显示)

第二天,继续在群 A 聊天

你在群 A 发消息 "昨天说的会议,确认时间了吗?"

1. sessionKey = "agent:main:telegram:group:groupA-id"(同一个 key)
2. 打开 tg-group-groupA-id.jsonl(同一个文件)
3. 加载昨天的完整对话历史
   → Agent 知道昨天聊了"明天开会几点"
4. 如果历史太长(超出上下文窗口),触发 Compaction:
   - 先执行 Memory Flush:把重要信息写入 memory/2026-03-22.md
   - 然后压缩旧消息为摘要,写入 JSONL 的 compaction 条目
   - 后续只加载:摘要 + 最近消息

Session 恢复时的数据加载流程

新消息到达

SessionManager.open(sessionFile)

读取整个 JSONL 文件到内存

构建消息树(含分支、压缩摘要)

拼接上下文:系统提示词 + 文档 + 历史消息 + 新消息

检查 token 数是否超出窗口
  ├─ 未超出 → 直接发送给 LLM
  └─ 超出 → Pruning(裁剪旧工具结果)→ 仍超出 → Compaction(压缩旧消息)

关键点:Session 恢复时是完整加载 JSONL,不是只靠 memory_search 搜索。memory_search 搜索的是 MEMORY.mdmemory/*.md 里的策展记忆,不是 Session 对话记录。


关键源码索引

功能文件路径
sessionKey 构建src/routing/session-key.ts:53-186
Session 文件路径src/config/sessions/paths.ts:247-250
Session JSONL 解析src/memory/session-files.ts:74-131
Session 完整加载src/agents/pi-embedded-runner/run/attempt.ts:2030
Pairing 存储src/pairing/pairing-store.ts
Pairing 适配器接口src/channels/plugins/types.adapters.ts:335
Agent workspace 解析src/agents/agent-scope.ts:262-278
记忆管理器缓存隔离src/memory/manager.ts:38-59
QMD scope 规则src/memory/qmd-scope.ts:10-51
引用标注格式化src/agents/tools/memory-tool.ts:227-233
引用显隐判断src/agents/tools/memory-tool.ts:280-293
文档加载过滤src/agents/workspace.ts:557-565
Compaction 触发src/agents/pi-embedded-runner/run/attempt.ts
Memory Flushsrc/auto-reply/reply/memory-flush.ts
3 OpenClaw — Agent Runtime 核心

OpenClaw — Agent Runtime 核心

📍 位置:OpenClaw学习框架 / 第 2 层-B 📌 核心发现:Pi Agent Runtime 是执行引擎,管理 LLM 调用→工具执行→上下文压缩的完整循环 📥 输入:DeepWiki Section 3(Agent Runtime 及其 6 个子章节) 📤 流向:→ findings.md [Agent 执行模型理解]


Agent Runtime 职责

Agent Runtime(Pi Agent)编排一次 AI 助理回合的完整生命周期:

消息输入 → 指令解析 → 模型选择 → 提示词组装 → LLM 调用 → 工具循环 → 响应输出
                                                              ↑      │
                                                              └──────┘
                                                            (工具结果反馈)

3.1 执行管线(7 个阶段)

Stage 1: 输入处理

  • parseReplyDirectives():提取内联指令(/think/model/verbose
  • detectCommand():识别独立命令(/status/reset/new
  • 独立命令走快速路径,直接返回,不经过模型

Stage 2: 模型解析

  • resolveModel():按优先级选择模型(指令 > 会话覆盖 > Agent 配置 > 全局默认)
  • resolveAuthProfileOrder():解析 Auth Profile 链
  • 支持动态模型 ID(resolveDynamicModel 处理未来模型如 GPT-5、Claude 4)

Stage 3: 系统提示词组装

buildEmbeddedSystemPrompt() 从多个模块组装:

模块内容
Identity核心人格 + 安全护栏
Tools允许的工具描述
Skills来自 .skill 文件的动态指令
Context注入的 SOUL.md、AGENTS.md 等
RuntimeShell、OS、沙箱环境信息

三种提示词模式优化 token 使用:

  • full(默认):完整提示词
  • minimal:子 Agent 使用,精简版
  • none:仅基础身份

Stage 4: 执行

嵌套函数调用链:

runReplyAgent()
  → runAgentTurnWithFallback()
    → runEmbeddedPiAgent()
      → runEmbeddedAttempt()

Stage 5: 工具调度

  • createOpenClawCodingTools():组装可用工具集
  • isToolAllowedByPolicies():策略过滤
  • 工具调用 → 结果返回 → 继续推理(循环直到无工具调用)

Stage 6: 响应处理

  • subscribeEmbeddedPiSession():流式 delta 输出
  • 文本分块投递到通道

Stage 7: 状态管理

  • updateSessionStoreEntry():更新会话元数据
  • compactEmbeddedPiSession():触发上下文压缩(如需要)

并发控制

  • Lane 序列化:每个会话同时只运行一个回合
  • 全局并发限制:限制同时进行的 LLM 调用数

Auth Profile 轮换

尝试 Profile A → 速率限制/认证错误


markAuthProfileFailure(A)


尝试 Profile B → 成功 ✓

3.2 Transcript 处理

不同 LLM 供应商对消息格式有不兼容要求,系统自动适配:

供应商关键处理
OpenAI最少清洗,保留工具调用 ID
Anthropic删除 thinking blocks,校验轮次结构
Google严格 ID 清洗,强制 user 消息开头(不允许 assistant 先说)
Mistral工具 ID 必须 9 字符字母数字

其他处理:

  • 孤立消息修复:删除没有对应 tool_usetool_result
  • 图片约束:Anthropic 有最大尺寸/字节限制,自动缩放
  • 内容块过滤:移除某些端点拒绝的 thinking block

3.3 模型供应商与认证

支持的供应商

Anthropic、OpenAI、Google Gemini、Ollama、Minimax、Moonshot/Kimi、Qwen、Volcengine、Amazon Bedrock 等

Auth Profile 存储

// ~/.openclaw/agents/<id>/agent/auth-profiles.json
{
  "anthropic:default": {
    "type": "apiKey",
    "apiKey": "sk-ant-..."           // 明文
  },
  "openai:default": {
    "type": "apiKey",
    "apiKey": { "source": "env", "id": "OPENAI_API_KEY" }  // SecretRef
  },
  "openai-codex:user@example.com": {
    "type": "oauth",
    "accessToken": "...",
    "refreshToken": "..."
  }
}

隐式供应商发现

自动注册三个阶段:

  1. API Key 供应商(Minimax、Moonshot、Kimi)
  2. OAuth Profile 供应商(Qwen-portal、OpenAI-codex)
  3. 配对供应商(Volcengine、Byteplus)

特殊:Ollama 通过 API 发现本地模型


3.4 工具系统

工具组装管线

Pi Agent 基础工具


OpenClaw 替换/增强
(read/write/edit → 工作区隔离版本,bash → exec)


策略过滤(8 层级联)


供应商适配
(Gemini 去掉 minLength/pattern,xAI 去掉 web_search 等)


安全包装
(循环检测 + 中止信号)


最终 AnyAgentTool[] → 传给 LLM API

工具清单

工具组包含工具
group:runtimeexec(命令执行), process(后台进程管理)
group:fsread, write, edit, apply_patch
group:sessionssessions_list, sessions_history, sessions_send, sessions_spawn
group:memorymemory_search, memory_get
group:webweb_search, web_fetch
group:uibrowser, canvas
group:automationcron, gateway
group:messagingmessage
Channel 工具telegram_react, discord_thread

工具策略级联(8 层,从低到高优先级)

① 全局 tools.allow/deny

② 工具 Profile(minimal/coding/messaging/full)

③ 供应商特定约束

④ Agent 级配置

⑤ Agent + 供应商组合覆盖

⑥ 通道群组策略

⑦ 发送者级别限制

⑧ 运行时沙箱 + 子 Agent 继承

工具 Profile 预设:

Profile可用工具
minimalsession_status
codinggroup:fs + group:runtime + group:sessions + group:memory
messaginggroup:messaging + session 工具
full无限制

Owner-Only 工具(需 senderIsOwner: true):

  • crongatewaynodeswhatsapp_login

Exec 工具

参数说明
command要执行的 shell 命令(必需)
background立即后台运行
yieldMs超时后自动后台化(默认 10 秒)
timeout超时终止(默认 30 分钟)
pty分配伪终端

安全措施:

  • Shell 注入检测:检查 $VAR_NAME 出现在脚本文件中的模式
  • 审批流程:allowlist + safe binaries(lsgit 等)+ skill 关联工具
  • 进程隔离:按 scopeKey 隔离,防跨 Agent 干扰

工作区隔离

tools.fs.workspaceOnly: true 时,文件操作工具强制路径守卫,拒绝访问工作区外的系统文件。


3.5 命令与指令

独立命令(快速路径)

命令用途
/status显示模型、token 用量、上下文窗口、缓存统计等
/reset重置会话
/new新建会话
/think <level>控制推理深度
/model <name>切换模型

内联指令

指令用途
/think <level>推理深度
/verbose <level>输出详细度
/elevated <level>权限提升
/reasoning <mode>推理模式
/exec <params>执行参数
/queue <mode>队列行为

授权模型

  • 默认拒绝:所有命令需通过 CommandAuthorized 检查
  • 优先级:commands.allowFrom > 通道白名单 + 配对系统 > commands.useAccessGroups
  • bashconfigdebug 三个特殊命令需要显式配置标志

3.6 上下文压缩(Compaction)

触发条件

estimateTokens(messages + prompt) > contextWindow × 0.85

阈值:硬最低 8,192 tokens,警告 32,768 tokens

压缩流程

Token 超限检测


Memory Flush(如需要)
  └── tokens > 75% 且本轮未 flush → 持久化到记忆存储


获取会话写锁(防 transcript 损坏)


加载完整 JSONL transcript


调用 LLM 压缩(runEmbeddedAttempt + 特殊指令)
  └── 模型可配置:agents.defaults.compaction.model


替换旧消息为生成的摘要


广播诊断事件


后压缩同步(memory 重索引)
  └── off / async(默认)/ await

超时保护

  • 单次压缩超时:180 秒
  • 累计重试超时:防止无限循环

错误恢复

  • 压缩失败 → resetSessionAfterCompactionFailure():生成新 sessionId,清空 transcript
  • 轮次校验 → validateAnthropicTurns() / validateGeminiTurns():确保符合供应商要求

诊断追踪

每次压缩生成:

  • 诊断 ID:ovf-{timestamp36}-{random4}
  • 指标:消息数、字符总量、工具结果大小、top 贡献者

3.7 记忆与搜索

双后端架构

后端技术特点
Built-in (SQLite)sqlite-vec + FTS5向量相似度 + 关键词搜索
QMD (Quick Markdown)外部 qmd CLI大规模集合优化

嵌入模型支持

  • OpenAI text-embedding-3-small
  • Google Gemini text-embedding-004
  • Voyage voyage-3
  • Ollama(用户自定义)

混合搜索评分

FinalScore = (VectorScore × VectorWeight) + (KeywordScore × KeywordWeight)

CLI 命令

  • memory status:索引健康状态和 chunk 数
  • memory index:强制重新扫描工作区
  • memory search:测试查询

关键源文件

文件职责
src/agents/pi-tools.ts工具组装入口
src/agents/tool-policy.ts策略解析
src/agents/tool-policy-pipeline.ts策略管线
src/agents/openclaw-tools.ts原生工具定义
src/agents/bash-tools.tsExec/Process 实现
4 记忆文件设计与存储

记忆文件设计与存储

记忆的两层结构

OpenClaw 的记忆采用 Markdown 文件为唯一数据源 的设计,分两层:

策展层(Curated)          日志层(Daily Logs)
┌──────────────┐          ┌──────────────────┐
│  MEMORY.md   │          │ memory/           │
│  手动策展     │          │ ├── 2026-03-20.md │
│  长期有效     │          │ ├── 2026-03-21.md │
│  无时间衰减   │          │ └── projects.md   │
└──────────────┘          └──────────────────┘
层级文件写入方式时间衰减
策展层MEMORY.md人工编辑无(常青)
日志层memory/YYYY-MM-DD.mdAgent 自动追加有(可配置半衰期)
子记忆memory/xxx.md(非日期命名)人工编辑无(常青)

文件格式

所有记忆文件均为纯 Markdown(.md),无特殊 frontmatter 要求。

日期文件命名必须严格遵循:YYYY-MM-DD.md(不支持 YYYY-MM-DD-HHMM.md 等变体)

磁盘目录结构

~/.openclaw/
├── workspace/                          # 默认 Agent 的 workspace
│   ├── MEMORY.md                      # 主策展记忆(优先)
│   ├── memory.md                      # 备选(MEMORY.md 不存在时使用)
│   ├── memory/
│   │   ├── 2026-03-20.md             # 每日日志(有时间衰减)
│   │   ├── 2026-03-21.md
│   │   └── projects.md               # 非日期子记忆(无衰减)
│   ├── SOUL.md
│   ├── IDENTITY.md
│   └── ...

├── memory/                            # 向量索引存储
│   ├── main.sqlite                    # 默认 Agent 索引
│   └── alpha.sqlite                   # 其他 Agent 索引

├── agents/<agentId>/
│   ├── sessions/                      # 会话转录
│   │   └── *.jsonl                    # JSONL 格式
│   └── qmd/                          # QMD 后端数据(如启用)

└── sessions/                          # 全局会话日志

索引数据库设计(SQLite)

记忆文件被分块索引到 SQLite,支持向量搜索和 BM25 全文搜索。

核心表结构

-- 元数据表:跟踪 provider/model 指纹,指纹变化时强制重建索引
CREATE TABLE meta (
  key TEXT PRIMARY KEY,
  value TEXT NOT NULL
);

-- 文件表:跟踪已索引文件的状态
CREATE TABLE files (
  path TEXT PRIMARY KEY,     -- "MEMORY.md" 或 "memory/2026-03-20.md"
  source TEXT,               -- "memory" 或 "sessions"
  hash TEXT,                 -- 内容哈希,检测变更
  mtime INTEGER,
  size INTEGER
);

-- 分块表:记忆被切分成的片段
CREATE TABLE chunks (
  id TEXT PRIMARY KEY,
  path TEXT,                 -- 来源文件
  source TEXT,               -- "memory" 或 "sessions"
  start_line INTEGER,        -- 起始行号
  end_line INTEGER,          -- 结束行号
  hash TEXT,                 -- 块内容哈希
  model TEXT,                -- 使用的 embedding 模型
  text TEXT,                 -- 原文
  embedding TEXT,            -- JSON 数组(向量)
  updated_at INTEGER
);

-- 全文搜索索引(BM25)
CREATE VIRTUAL TABLE chunks_fts USING fts5(
  text, id UNINDEXED, path UNINDEXED
);

-- Embedding 缓存:避免重复调用 API
CREATE TABLE embedding_cache (
  provider TEXT,
  model TEXT,
  provider_key TEXT,
  hash TEXT PRIMARY KEY,
  embedding TEXT,
  dims INTEGER,
  updated_at INTEGER
);

分块参数

  • 块大小:400 tokens
  • 重叠:80 tokens
  • 最大缓存条目:50,000

记忆源类型

type MemorySource = "memory" | "sessions";
来源说明存储格式
memoryworkspace 下的 Markdown 文件.md
sessions会话转录.jsonl

搜索结果结构

type MemorySearchResult = {
  path: string;          // "memory/2026-03-20.md" 或 "MEMORY.md"
  startLine: number;
  endLine: number;
  score: number;         // 0-1,经混合排序和后处理
  snippet: string;       // 最长 ~700 字符
  source: MemorySource;  // "memory" 或 "sessions"
  citation?: string;     // "memory/2026-03-20.md#L10-L15"
};

Agent 可用的记忆工具

工具功能
memory_search(query, maxResults?, minScore?, sessionKey?)语义搜索,返回评分片段
memory_get(path, from?, lines?)读取指定文件的指定行范围

CLI 命令

openclaw memory status [--agent <id>] [--deep] [--json]  # 查看索引状态
openclaw memory index [--agent <id>] [--force]            # 手动触发索引
openclaw memory search <query> [--agent <id>] [--max-results N] [--json]  # 搜索

关键源码路径

功能文件
记忆文件类型定义src/memory/types.ts
数据库 Schemasrc/memory/memory-schema.ts
索引管理器src/memory/manager.ts:150-200
同步操作src/memory/manager-sync-ops.ts:97-175
记忆工具实现src/agents/tools/memory-tool.ts
内部索引逻辑src/memory/internal.ts:74-83
4 OpenClaw — 消息通道与 Skills

OpenClaw — 消息通道与 Skills

📍 位置:OpenClaw学习框架 / 第 3 层 📌 核心发现:Channel 插件化 + Skills 声明式扩展 + Plugin SDK 第三方集成,三层扩展体系 📥 输入:DeepWiki Section 4(Messaging Channels)、Section 5(Skills)、Section 9(Plugin SDK) 📤 流向:→ findings.md [扩展体系理解]


一、消息通道(Channels)

架构模型

每个消息平台通过 ChannelPlugin 接口实现,注册配置 Schema、设置适配器和路由逻辑。

支持平台

类别平台
内置Telegram (grammY)、Discord (discord.js)、Slack (Socket Mode)、WhatsApp (Baileys)、Signal (signal-cli)、iMessage、Matrix
扩展包Feishu(飞书)、Mattermost、Google Chat、IRC、LINE、Nextcloud Talk 等

总计 20+ 平台

消息流转

入站流程

外部平台消息


Channel Plugin 接收


DM 安全门控 ─────────────────────┐
  ├── pairing → 发送审批码        │
  ├── allowlist → 检查白名单       │
  ├── open → 直接通过             │
  └── disabled → 拒绝             │
      │                          │
      ▼                          │
Group 策略过滤 ←──────────────────┘


路由到 Agent + Session


Agent 执行

出站流程

Agent 响应


平台适配器
  ├── sendMessageTelegram()
  ├── sendMessageDiscord()
  ├── sendMessageSlack()
  └── ...


外部平台显示

通道配置

每个通道在 openclaw.jsonchannels.<provider> 下配置,通过 Zod Schema 校验:

字段说明
enabled启用/禁用
dmPolicyDM 访问策略(pairing/allowlist/open/disabled)
groupPolicy群聊限制
streaming回复投递模式(流式/一次性)

多账号支持:同一平台可配置多个登录,通过账号特定配置合并。

通道能力

  • 消息发送与反应
  • 卡片/按钮渲染(平台支持时)
  • 线程回复和管理操作(踢出/封禁,需信任要求)
  • 输入状态指示器和确认反应

二、Skills 系统

定义

Skill = 模块化的工具 + 提示词包,以 SKILL.md 文件声明。

Skill 发现与加载

系统扫描多个位置构建注册表,优先级从高到低

优先级位置说明
1<workspace>/skillsAgent 工作区 Skills(per-agent 隔离)
2~/.openclaw/skills全局共享 Managed Skills
3内置 Skills随 OpenClaw 发行
4插件提供的 Skills活跃插件注入

同名 Skill 高优先级覆盖低优先级。

SKILL.md 格式

---
name: my-skill
description: 一句话说明
version: 1.0.0
os: [darwin, linux]        # 平台限制
requirements:
  binaries: [git, curl]    # 系统工具依赖
  env: [MY_API_KEY]        # 环境变量依赖
  config: [some.config.path]  # 配置路径依赖
---

# 技能指令

这里写给 Agent 的使用说明...

需求门控

Skill 只有满足所有需求时才被标记为”eligible”:

需求类型检查方式示例
BinarieshasBinary(bin)gitcurl
EnvironmentisEnvSatisfied(envName)OPENAI_API_KEY
ConfigisConfigPathTruthy()channels.telegram.enabled
OSentry.metadata.osdarwinlinux

安装管线

根据宿主环境选择包管理器(优先级从高到低):

  1. Homebrew(如 preferBrew 设置)
  2. uv (Python)
  3. Node.js (npm/pnpm/bun)
  4. Go
  5. Direct Download

多 Agent 隔离

Agent 工作区中的 Skills(~/.openclaw/workspace-<agentId>/skills)对其他 Agent 不可见,确保人格和工具隔离。


三、Plugin SDK

定位

Plugin SDK 与 Skills 互补:

维度Plugin SDKSkills 系统
作用域Gateway 基础设施(Channel、Auth)Agent 能力(工具、知识)
分发npm 包,放在 extensions/目录,放在 workspace/managed
加载包元数据发现文件系统路径扫描
开发语言TypeScriptMarkdown (SKILL.md)

插件类型

类型用途示例
Channel Plugin集成新消息平台WhatsApp、Signal、Feishu
Auth Plugin自定义认证流程OAuth、企业 SSO
Tool Plugin扩展 Agent 工具能力自定义 API 集成

SDK 包结构

openclaw/plugin-sdk                      # 主入口
openclaw/plugin-sdk/telegram             # Telegram 特定工具
openclaw/plugin-sdk/discord              # Discord 特定工具
openclaw/plugin-sdk/slack                # Slack 特定工具

插件开发流程

1. extensions/<name>/ 目录下创建
2. package.json 添加 openclaw.extensions 元数据
3. 实现入口,导出插件实例
4. pnpm 构建 → dist/plugin-sdk/

插件发现与加载

package.json 中的 openclaw 元数据


Manifest 注册表扫描


动态 import 加载


生命周期管理(Gateway 启动/关闭事件挂载)

关键导出函数

  • buildTokenChannelStatusSummary():Telegram/WhatsApp 状态摘要
  • discordSetupAdapter()slackSetupAdapter():平台设置适配器
  • feishuPlugin()matrixPlugin():平台插件实例
  • 路由和策略执行工具函数

扩展体系关系图

                    ┌─────────────────────┐
                    │     Plugin SDK       │
                    │  (Gateway 级扩展)     │
                    │  Channel / Auth / Tool│
                    └──────────┬──────────┘


┌──────────────────────────────────────────────────┐
│                    Gateway                         │
│                                                    │
│   ┌─────────────┐    ┌─────────────────────┐      │
│   │  Channels    │    │  Agent Runtime       │      │
│   │  (Plugin)    │    │                     │      │
│   │              │    │   ┌──────────────┐  │      │
│   │  Telegram    │    │   │  Skills      │  │      │
│   │  Discord     │    │   │  (SKILL.md)  │  │      │
│   │  WhatsApp    │    │   │              │  │      │
│   │  Slack       │    │   │  工具 + 提示词 │  │      │
│   │  ...20+      │    │   └──────────────┘  │      │
│   └─────────────┘    └─────────────────────┘      │
└──────────────────────────────────────────────────┘
5 记忆配置指南

记忆配置指南

配置结构总览

记忆配置分两个层级:全局记忆后端Agent 级记忆搜索

{
  "memory": { ... },           // 全局记忆后端配置
  "agents": {
    "defaults": {
      "memorySearch": { ... }  // 所有 Agent 的默认搜索配置
    },
    "list": [{
      "id": "alpha",
      "memorySearch": { ... }  // 单个 Agent 的覆盖配置
    }]
  }
}

完整配置参考

全局记忆后端

{
  "memory": {
    "backend": "builtin",        // "builtin"(SQLite) 或 "qmd"(高级后端)
    "citations": "auto"          // "auto" | "on" | "off" — 记忆引用标注
  }
}
效果
backend: "builtin"SQLite 向量存储,轻量,默认选项
backend: "qmd"QMD 侧车进程,支持 BM25 + 向量 + 重排序
citations: "auto"私聊显示引用,群聊隐藏
citations: "on"始终显示
citations: "off"始终隐藏

Agent 级记忆搜索配置

{
  "memorySearch": {
    "enabled": true,
    "provider": "auto",
    "model": "text-embedding-3-small",
    "sources": ["memory", "sessions"],

    "chunking": {
      "tokens": 400,
      "overlap": 80
    },

    "sync": {
      "onSessionStart": true,
      "onSearch": true,
      "watch": true,
      "watchDebounceMs": 1500,
      "intervalMinutes": 0,
      "sessions": {
        "deltaBytes": 100000,
        "deltaMessages": 50,
        "postCompactionForce": true
      }
    },

    "query": {
      "maxResults": 6,
      "minScore": 0.35,
      "hybrid": {
        "enabled": true,
        "vectorWeight": 0.7,
        "textWeight": 0.3,
        "candidateMultiplier": 4,
        "mmr": {
          "enabled": false,
          "lambda": 0.7
        },
        "temporalDecay": {
          "enabled": false,
          "halfLifeDays": 30
        }
      }
    },

    "cache": {
      "enabled": true,
      "maxEntries": 50000
    },

    "store": {
      "driver": "sqlite",
      "path": "~/.openclaw/memory/{agentId}.sqlite",
      "vector": { "enabled": true }
    }
  }
}

场景化配置指南

场景 1:我想让 Agent 记住更久以前的事

问题:旧记忆搜索评分太低,被新记忆淹没

方案:关闭时间衰减(默认已关闭),或加大半衰期

{
  "query": {
    "hybrid": {
      "temporalDecay": {
        "enabled": false       // 关闭 = 所有记忆同等权重
      }
    }
  }
}

场景 2:我想让 Agent 优先记住最近的事

问题:希望近期记忆更容易被召回

方案:开启时间衰减,设置半衰期

{
  "query": {
    "hybrid": {
      "temporalDecay": {
        "enabled": true,
        "halfLifeDays": 14     // 14 天后评分降至 50%
      }
    }
  }
}

衰减公式:score × e^(-ln2/halfLifeDays × ageInDays)

仅影响 memory/YYYY-MM-DD.md 格式的文件,MEMORY.md 和非日期文件不受影响。

场景 3:搜索结果太相似,缺乏多样性

方案:开启 MMR(最大边际相关性)

{
  "query": {
    "hybrid": {
      "mmr": {
        "enabled": true,
        "lambda": 0.5          // 0=最大多样性, 1=纯相关性, 默认0.7
      }
    }
  }
}

场景 4:搜索结果不够精准

方案:调高向量权重,降低最低分阈值

{
  "query": {
    "minScore": 0.2,
    "maxResults": 10,
    "hybrid": {
      "vectorWeight": 0.85,
      "textWeight": 0.15
    }
  }
}

场景 5:我想让会话记录也能被搜索到

方案:确保 sources 包含 sessions,调整同步阈值

{
  "sources": ["memory", "sessions"],
  "sync": {
    "sessions": {
      "deltaBytes": 50000,       // 更频繁地索引会话(50KB 触发)
      "deltaMessages": 25,       // 或 25 条消息触发
      "postCompactionForce": true // 压缩后强制同步
    }
  }
}

场景 6:群聊中不想暴露个人记忆

方案:默认行为已满足(MEMORY.md 不加载),可进一步用 QMD scope 限制

{
  "memory": {
    "qmd": {
      "scope": {
        "default": "deny",
        "rules": [
          { "action": "allow", "match": { "chatType": "direct" } }
        ]
      }
    }
  }
}

场景 7:Embedding 提供商选择

provider 自动选择顺序:local → OpenAI → Gemini → Voyage → Mistral → 禁用

{
  "provider": "openai",                    // 指定提供商
  "model": "text-embedding-3-large"        // 指定模型
}
Provider模型示例特点
local本地模型无 API 调用,隐私最佳
openaitext-embedding-3-small/large质量高,需 API key
geminiembedding-002支持多模态(图片/音频)
voyagevoyage-2长文本优化
ollama本地 Ollama 模型自托管

场景 8:索引多模态文件(图片/音频)

需要 Gemini embedding 提供商:

{
  "provider": "gemini",
  "extraPaths": [
    { "path": "~/photos/important", "pattern": "*.jpg" }
  ]
}

支持格式:.jpg .jpeg .png .webp .gif .heic .mp3 .wav .ogg .opus .m4a .aac .flac

记忆刷写(Memory Flush)

上下文接近窗口限制时,自动触发 Agent 将重要内容写入 memory/YYYY-MM-DD.md

{
  "agents": {
    "defaults": {
      "compaction": {
        "memoryFlush": {
          "enabled": true,
          "softThresholdTokens": 4000
        }
      }
    }
  }
}

源码:src/auto-reply/reply/memory-flush.ts

Embedding 提供商配置

{
  "memorySearch": {
    "provider": "auto",
    "model": "text-embedding-3-small"
  }
}

源码:src/agents/memory-search.ts:15-89src/memory/backend-config.ts

关键源码路径

功能文件
记忆搜索配置 Schemasrc/config/zod-schema.agent-defaults.ts
后端配置src/memory/backend-config.ts
混合搜索src/memory/hybrid.ts
MMR 重排序src/memory/mmr.ts
时间衰减src/memory/temporal-decay.ts
记忆刷写src/auto-reply/reply/memory-flush.ts
配置文档docs/reference/memory-config.md
概念文档docs/concepts/memory.md
5 OpenClaw — 高级特性

OpenClaw — 高级特性

📍 位置:OpenClaw学习框架 / 第 4 层 📌 核心发现:Cron 自动化、原生客户端设备能力、多层安全模型、开发者生态 📥 输入:DeepWiki Section 6(Cron)、7(Control UI)、8(Native Clients)、10(Security)、11(Development) 📤 流向:→ findings.md [高级能力与安全模型]


一、Cron 定时自动化

核心架构

CronService 实现基于定时器的状态机,管理任务存储、定时器和并发控制。

调度类型

类型字段行为
atISO 8601 时间戳一次性执行
everyeveryMs + 可选 anchorMs固定间隔循环
cronCron 表达式 + 可选时区/错开标准 Cron 调度

会话目标

目标行为
main向主会话发 systemEvent
isolated全新隔离会话(forceNew: true
current复用现有会话状态
session:key指定具名会话

执行生命周期(隔离任务)

准备(Agent 配置 + 工作区 + 会话 Key)
  → 模型选择(检查 subagents.model + hook 覆盖)
  → 提示词构建(安全边界包装 + 投递指令)
  → Agent 执行(模型回退 + 中间确认检测 + 续写)
  → 投递(直接通道 → 回退 webhook → 抑制 HEARTBEAT_OK)

投递机制

  • channel='last':查询会话最近使用的通道/收件人
  • 显式通道:直接使用配置的 delivery.channeldelivery.to
  • bestEffort=true:投递失败返回 ok 而非错误
  • 消息工具抑制:Agent 已通过 message 工具投递时跳过重复投递
  • Webhook:SSRF 防护(阻止私有 IP)

错误处理与重试

退避策略:

连续错误延迟
130 秒
21 分钟
35 分钟
415 分钟
5+60 分钟

自动识别的瞬态错误(重试最多 3 次):速率限制、过载、网络错误、超时、5xx

连续 3 次调度错误 → 自动禁用任务 + 系统事件通知

高级特性

  • Stagger 逻辑sha256(jobId) % staggerMs 确定性错开
  • 启动时遗漏恢复:识别过期任务,错开执行(默认间隔 5 秒,最多 5 个)
  • 会话清理器:每 5 分钟清理 cron/hook 会话(默认保留 7 天)
  • 子 Agent 等待:隔离任务等待派生的子 Agent 完成后再投递

RPC 方法

cron_addcron_updatecron_removecron_runcron_listcron_list_pagecron_status


二、Control UI(Web 仪表盘)

技术栈

  • 框架:Lit Web Components(无 Shadow DOM,全局样式)
  • 构建:Vite
  • 布局:CSS Grid + CSS Variables 主题
  • 状态@state() 反应式属性 + localStorage 持久化
  • 通信:WebSocket RPC

视图

视图功能
Chat交互式对话,流式输出,工具执行可视化
Sessions浏览管理会话记录,预览面板
Configurationopenclaw.json 在线编辑器 + Schema 校验
AgentsAgent 创建/编辑,工作区文件管理
Cron定时任务调度和监控
Nodes/Devices已配对设备管理,配对请求审批
Logs实时日志流,级别过滤

关键特性

  • 流式响应:delta/final/aborted 状态转换
  • 工具执行卡片:可展开查看输入/输出/思考内容
  • Exec 审批弹窗:approve/deny/always-allow,60 秒过期
  • URL 参数认证?token=...&session=...

三、原生客户端(Nodes)

什么是 Node

Node = 设备本地执行表面,向 Gateway 宣告自身能力(摄像头、录屏、通知等)。

平台支持

平台技术特有能力
iOSSwiftUIShare Extension、Live Activities、watchOS 伴侣、摄像头、录屏、语音唤醒、位置
AndroidCameraX、DNS-SD通话记录搜索、SMS、多 ABI(arm64-v8a, x86_64)
macOSSwiftUI + SparkleAppleScript、Shell 执行、系统通知、自动更新

发现机制

  1. Bonjour/mDNS_openclaw-gw._tcp 局域网发现
  2. Wide-Area DNS-SD:Tailscale tailnet 发现(dnsjava)
  3. Tailscale Servewss://<peer>.ts.net 远程连接
  4. 手动 URL:直接 WebSocket 输入

设备配对流程

Gateway 发送 connect.challenge(随机 nonce)


Node 用私钥签名 challenge


Node 在 connect 参数中包含签名


Gateway 验证签名 → 允许访问

权限模型

平台机制
iOS/macOSTCC(Info.plist 使用描述)
Android运行时权限(AndroidManifest.xml)

node.describe RPC 返回权限状态:granteddeniednot_determinedrestricted

构建系统

  • iOS:XcodeGen(YAML → Xcode 项目)
  • Android:Gradle + Kotlin DSL
  • macOS:Xcode + Sparkle delta 更新
  • 全部 CalVer 版本

四、安全模型

核心假设

单一可信运营者模型:一个 Gateway = 一个可信运营者。 能修改 ~/.openclaw 的人 = 可信运营者。 明确不支持恶意多租户场景。

安全层级全景

┌─────────────────────────────────────────────┐
│ 第 1 层:网络访问控制                          │
│   非回环绑定强制认证 / 暴力破解防护             │
├─────────────────────────────────────────────┤
│ 第 2 层:身份认证                              │
│   Token / Password / Device Pairing / Proxy  │
├─────────────────────────────────────────────┤
│ 第 3 层:角色授权(RBAC)                      │
│   operator / node + scope 权限               │
├─────────────────────────────────────────────┤
│ 第 4 层:DM/Group 策略                        │
│   pairing / allowlist / open / disabled       │
├─────────────────────────────────────────────┤
│ 第 5 层:工具策略级联(8 层)                   │
│   Profile → Provider → Global → Agent → ...   │
├─────────────────────────────────────────────┤
│ 第 6 层:Exec 安全                            │
│   full / safeBins / off + 审批流程             │
├─────────────────────────────────────────────┤
│ 第 7 层:文件系统隔离                          │
│   workspaceOnly + 路径校验                    │
├─────────────────────────────────────────────┤
│ 第 8 层:SSRF 防护                            │
│   主机名黑名单 / 私有 IP 阻断 / DNS 重绑防护   │
├─────────────────────────────────────────────┤
│ 第 9 层:凭证管理                              │
│   SecretRef / env/file 引用 / 不明文存储       │
└─────────────────────────────────────────────┘

SSRF 防护细节

  • 预取校验:阻断 localhost*.internal*.local
  • 私有 IP 阻断:RFC1918、RFC6598、link-local
  • DNS 解析守卫:防 rebinding 攻击
  • 重定向拦截:重新校验
  • 跨域头剥离:Authorization、Cookie、X-Api-Key

安全审计命令

openclaw security audit --deep --fix

检查项:Gateway 暴露/认证模式、DM/Group 策略、小模型风险(≤300B 无沙箱)、Webhook token 复用、Docker 沙箱配置、插件完整性、文件权限(目标 600)。

--fix 自动修复安全问题(权限、策略)。

最佳实践

  • 使用 token 认证(不用 password)
  • DM scope 用 per-channel-peer
  • 不信任的 Agent 启用沙箱:agents[].sandbox.enabled: true
  • 沙箱中拒绝危险工具:sandbox.tools.deny: ["gateway", "cron", "nodes"]
  • 文件系统限制:tools.fs.workspaceOnly: true
  • Exec 限制环境用 safeBins

五、开发者生态

技术栈

  • TypeScript(ESM only)+ Node.js 22+
  • pnpm monorepo
  • Oxlint + Oxfmt 代码质量
  • Vitest + V8 覆盖率(70% 门槛)
  • GitHub Actions CI/CD

代码规范

  • 单文件 < 700 行
  • 禁止 any 类型和 @ts-nocheck
  • 动态 import 使用 *.runtime.ts 边界
  • American English 拼写

版本与发布

渠道格式npm 标签
stablevYYYY.M.Dlatest
betavYYYY.M.D-beta.Nbeta
devHEAD不发布

多 Agent 协作安全规则

  • 禁止:创建/删除 git stash、创建 worktree、切换分支
  • 允许:使用 scripts/committer 进行作用域暂存
  • 假设其他 Agent 在并发工作

安全敏感路径(需 Code Owner 审查)

SECURITY.mdsrc/security/src/secrets/、认证和沙箱文件、发布工作流

6 OpenClaw 扩展点全景

OpenClaw 扩展点全景

OpenClaw 采用 Plugin-First 架构——核心只做调度,所有能力都通过插件注入。共有 13 类扩展点

扩展点总览

┌─────────────────────────────────────────────────────────┐
│                    用户可扩展的层级                        │
├──────────┬──────────┬──────────┬──────────┬─────────────┤
│ Channel  │ Provider │  Skill   │  Tool    │   Hook      │
│ 消息渠道  │ 模型提供  │ 技能教学  │ 函数调用  │  事件钩子   │
├──────────┴──────────┴──────────┴──────────┴─────────────┤
│                    Plugin SDK 层                         │
│     definePluginEntry() → api.registerXxx()              │
├──────────┬──────────┬──────────┬──────────┬─────────────┤
│ Webhook  │  Cron    │ Service  │  Node    │ Context     │
│ HTTP入口  │ 定时任务  │ 后台服务  │ 设备节点  │ Engine      │
├──────────┴──────────┴──────────┴──────────┴─────────────┤
│ CLI Command │ Config Schema │ 兼容层(Codex/Cursor/Claude)│
└─────────────────────────────────────────────────────────┘

1. Plugin — 一等公民扩展框架

所有扩展都通过 Plugin 注册。 一个 Plugin 可同时注册多种能力。

文件结构

my-plugin/
├── package.json              # name, version, "openclaw" 字段
├── openclaw.plugin.json      # 清单:id, name, description, configSchema, skills
└── index.ts                  # 入口:definePluginEntry()

入口模板

import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";

export default definePluginEntry({
  id: "my-plugin",
  name: "My Plugin",
  register(api) {
    api.registerProvider(...);      // LLM 提供商
    api.registerChannel(...);       // 消息渠道
    api.registerTool(...);          // Agent 工具
    api.registerHook(...);          // 事件钩子
    api.registerHttpRoute(...);     // Webhook 路由
    api.registerService(...);       // 后台服务
    api.registerCommand(...);       // CLI 命令
    api.registerSpeechProvider(...);
    api.registerMediaUnderstandingProvider(...);
    api.registerImageGenerationProvider(...);
    api.registerWebSearchProvider(...);
    api.registerContextEngine(...);
  },
});

发现与加载顺序(高→低)

优先级来源路径
1配置指定plugins.load.paths
2Workspace<workspace>/.openclaw/extensions/
3全局~/.openclaw/extensions/
4内置随 OpenClaw 发行

安装方式

openclaw plugins install @myorg/my-plugin     # npm 包
openclaw plugins install ./my-plugin           # 本地目录
openclaw plugins install ./my-plugin.tgz       # 压缩包
openclaw plugins install -l ./my-plugin        # 开发模式(软链接)

关键源码

文件职责
src/plugin-sdk/plugin-entry.ts入口定义
src/plugins/types.tsOpenClawPluginApi 类型
src/plugins/loader.ts发现与加载
docs/plugins/building-plugins.md完整指南
docs/plugins/manifest.md清单 Schema

2. Channel — 接入消息平台

让 Agent 通过新的消息平台与用户交互。

注册方式

api.registerChannel({
  id: "my-channel",
  label: "My Channel",
  plugin: ChannelPlugin,          // 实现收发消息
  setRuntime: (runtime) => { ... }
});

快捷构建器(聊天类渠道)

import { createChatChannelPlugin } from "openclaw/plugin-sdk/core";
// 自动处理 DM 安全、配对、线程、打字状态

SDK 子路径

路径功能
plugin-sdk/coreChannel 入口构建器
plugin-sdk/channel-setup配置向导
plugin-sdk/channel-pairingDM 配对
plugin-sdk/channel-reply-pipeline回复管道
plugin-sdk/channel-policy安全策略

已有渠道参考

extensions/discord/ · extensions/slack/ · extensions/telegram/ · extensions/matrix/ · extensions/imessage/ · extensions/whatsapp/


3. Skill — 教 Agent 新技能

Skill 是 Markdown 文件,教 Agent 何时、如何使用某个工具。无需写代码。

文件格式

---
name: my_skill
description: 一句话描述
metadata:
  {
    "openclaw": {
      "requires": {
        "bins": ["tool-name"],    # 依赖的二进制
        "env": ["API_KEY"],       # 依赖的环境变量
        "config": ["x.enabled"]   # 依赖的配置项
      }
    }
  }
user-invocable: true
command-dispatch: tool
command-tool: my_tool_name
---

这里写给 Agent 的指令,告诉它何时以及如何使用这个工具。

存放位置(高→低)

优先级路径
1<workspace>/skills/
2~/.openclaw/skills/
3Plugin 的 openclaw.plugin.json 中声明
4内置 skills/

门控机制

Skill 只在依赖满足时才会加载(二进制存在、环境变量设置、配置启用)。

关键源码

src/hooks/frontmatter.ts(解析)· src/hooks/loader.ts(发现与加载)


4. Tool — Agent 可调用的函数

注册方式

import { Type } from "@sinclair/typebox";

api.registerTool({
  name: "my_tool",
  description: "工具描述",
  parameters: Type.Object({
    input: Type.String(),
    count: Type.Optional(Type.Number())
  }),
  async execute(id, params) {
    return { content: [{ type: "text", text: "结果" }] };
  }
}, { optional: true });  // optional 需用户在 tools.allow 中启用

关键源码

src/agents/tools/ — 内置工具实现


5. Provider — 接入 LLM / Embedding / TTS

注册方法能力
registerProvider()文本推理(LLM)
registerSpeechProvider()TTS / STT
registerMediaUnderstandingProvider()图片/音频/视频分析
registerImageGenerationProvider()图片生成
registerWebSearchProvider()网页搜索

Provider 生命周期钩子

  • prepareAuth — 准备凭证
  • prepareExtraParams — 附加模型参数
  • wrapStream — 自定义流处理
  • normalizeModel — 模型 ID 标准化

认证方式

api_key · oauth(PKCE) · device_code · token · custom

SDK 子路径

plugin-sdk/provider-auth · plugin-sdk/provider-catalog · plugin-sdk/provider-stream · plugin-sdk/speech · plugin-sdk/image-generation

已有 Provider 参考

extensions/openai/ · extensions/anthropic/ · extensions/google/ · extensions/elevenlabs/ · extensions/mistral/


6. Hook — 事件钩子

在 Agent 生命周期关键节点插入自定义逻辑。

可监听事件

事件时机
before_model_resolve模型选择前(可覆盖模型/Provider)
before_prompt_build提示词生成前
session:start会话启动
command:new/new 命令执行

文件格式

---
name: my_hook
metadata:
  { "openclaw": { "events": ["before_model_resolve"] } }
---
# Hook 说明

配套 handler.ts 实现逻辑。

关键源码

src/hooks/types.ts · src/hooks/loader.ts · src/hooks/plugin-hooks.ts


7. Webhook — HTTP 入口

让外部服务通过 HTTP 调用 Agent。

api.registerHttpRoute({
  method: "POST",
  path: "/webhooks/my-service",
  handler: async (req, res) => {
    res.writeHead(200);
    res.end("OK");
  }
});

安全辅助

SDK 路径功能
plugin-sdk/webhook-ingress主 API
plugin-sdk/webhook-request-guards请求校验、限流
plugin-sdk/webhook-memory-guards内存安全

8. Cron — 定时任务

{
  "cron": {
    "jobs": [{
      "name": "daily_digest",
      "schedule": "0 9 * * *",
      "target": { "channel": "discord", "groupId": "xxx" },
      "prompt": "总结今日新闻"
    }]
  }
}

关键源码:src/cron/ · src/cron/isolated-agent/


9. Service — 后台服务

注册随 Gateway 启停的长驻进程。

api.registerService({
  name: "my-service",
  start: async () => { /* 初始化 */ },
  stop: async () => { /* 清理 */ }
});

10. Node — 设备节点

将 iOS/Android/macOS 设备配对为”节点”,提供硬件能力。

命令空间能力
canvas.*WebView 操作、截图
camera.*拍照、录像
screen.record录屏
device.*设备状态、通知
system.run在节点设备上执行命令

关键源码:src/node-host/ · src/pairing/


11. Context Engine — 自定义记忆引擎

替换默认的记忆检索实现。

api.registerContextEngine({ id: "my-memory", label: "..." });

配置插槽:

{ "plugins": { "slots": { "contextEngine": "memory-lancedb" } } }

已有实现:memory-core(默认 SQLite)· extensions/memory-lancedb/(向量搜索)


12. CLI Command — 自定义命令

api.registerCommand({
  name: "my-cmd",
  description: "描述",
  action: async (opts) => { ... }
});

13. 兼容层

OpenClaw 自动检测并加载其他工具的插件格式:

  • .codex-plugin/plugin.json
  • .claude-plugin/plugin.json
  • .cursor-plugin/plugin.json

插件配置

{
  "plugins": {
    "enabled": true,
    "allow": ["voice-call"],
    "deny": [],
    "load": { "paths": ["~/my-plugin"] },
    "entries": {
      "my-plugin": {
        "enabled": true,
        "config": { "apiKey": "..." }
      }
    },
    "slots": {
      "memory": "memory-lancedb",
      "contextEngine": "legacy"
    }
  }
}

SDK 导入规则

始终从子路径导入,不要导入根路径:

// ✅ 正确
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import { createChatChannelPlugin } from "openclaw/plugin-sdk/core";

// ❌ 错误
import { definePluginEntry } from "openclaw/plugin-sdk";

调研发现

OpenClaw 学习框架 — 调研发现

收敛自:0-概念与定位.md、1-系统架构.md、2-Gateway核心.md、3-Agent-Runtime核心.md、4-消息通道与Skills.md、5-高级特性.md 数据来源:DeepWiki 全部 12 大章节 + 20+ 子章节深度阅读


Key Findings

  1. OpenClaw 是目前最完整的自托管 AI 网关方案 — 20+ 消息平台统一接入、多 Agent 隔离、多模型故障转移、原生客户端三端覆盖、从 Cron 自动化到安全审计的完整工具链
  2. Hub-and-Spoke 单进程架构是核心设计选择 — 简化部署(个人使用无需分布式),但也意味着单点故障和性能瓶颈在同一进程
  3. 工具策略 8 层级联是安全基石 — 从全局 Profile 到运行时沙箱,每层可独立配置,实现了精细化工具权限控制
  4. Skills 系统(SKILL.md)是最易上手的扩展点 — 纯 Markdown 声明式,无需编写代码即可扩展 Agent 能力
  5. “单一可信运营者”假设贯穿整个安全模型 — 不适用于多租户/企业场景,但为个人使用提供了合理的安全-便利平衡

推荐学习路径

路径 A:快速上手(1-2 小时)

0-概念与定位.md(15 分钟)
  ├── 理解:是什么、解决什么问题、核心术语
  └── 动手:npm install -g openclaw → openclaw onboard → openclaw gateway start

1-系统架构.md(20 分钟)
  ├── 理解:Hub-and-Spoke、数据流、存储布局
  └── 动手:浏览 ~/.openclaw/ 目录结构

4-消息通道与Skills.md → Skills 部分(15 分钟)
  ├── 理解:SKILL.md 格式、Skills 发现优先级
  └── 动手:在 workspace/skills/ 创建第一个 Skill

Control UI 探索(10 分钟)
  └── 动手:openclaw dashboard → 浏览 Chat/Sessions/Configuration 视图

路径 B:深入理解架构(3-5 小时)

路径 A 全部内容


2-Gateway核心.md(40 分钟)
  ├── 理解:认证模型、会话隔离、多 Agent 路由
  └── 重点:WebSocket 帧协议、SessionKey 格式、路由优先级

3-Agent-Runtime核心.md(60 分钟)
  ├── 理解:执行管线 7 阶段、工具系统、上下文压缩
  └── 重点:工具策略 8 层级联、Exec 安全模式、Compaction 触发条件

5-高级特性.md → 安全部分(30 分钟)
  ├── 理解:9 层安全模型、SSRF 防护
  └── 动手:openclaw security audit

路径 C:开发者/贡献者(额外 3-5 小时)

路径 B 全部内容


Plugin SDK 开发(60 分钟)
  ├── 理解:Channel Plugin 接口、插件发现加载
  └── 动手:创建简单 Channel 插件

Cron 系统(30 分钟)
  ├── 理解:调度类型、执行生命周期、错误处理
  └── 动手:配置定时 Agent 任务

源码阅读(90+ 分钟)
  ├── 入口:src/gateway/gateway.ts → src/agents/pi-tools.ts
  ├── 工具系统:src/agents/tool-policy-pipeline.ts
  └── 通道插件:extensions/<channel>/

共识(多个信息源一致确认)

  1. Gateway 是绝对中心 — 所有通道、客户端、CLI 必须通过 Gateway 交互,这是架构不变量
  2. 文件系统是唯一持久层 — 无外部数据库依赖,JSONL + JSON 覆盖所有持久化需求
  3. Zod Schema 严格校验 — 配置错误在启动时拒绝,不进入运行时
  4. CalVer 版本策略YYYY.M.D 格式,适合持续发布节奏

矛盾 / 值得关注的张力

  1. 单进程 vs 可扩展性 — 个人使用足够,但多通道高并发时可能成为瓶颈。Gateway 的 lane 序列化和全局并发限制是缓解措施,不是根本解决方案
  2. 本地优先 vs 远程访问 — 默认绑定 localhost,远程需 Tailscale 或显式配置 + 强制认证。对不熟悉网络配置的用户有门槛
  3. Skills 声明式 vs Plugin SDK 编程式 — 两套扩展体系职责不同(Agent 能力 vs Gateway 基础设施),但开发者可能困惑于何时用哪个

信号(少量来源但密度高)

  1. A2UI(Agent-to-User Interface) — Vendored 组件,暗示 OpenClaw 可能在探索 Agent 控制 UI 渲染的方向,不仅仅是文本对话
  2. Swabble 语音唤醒 — macOS 专属,显示向语音交互发展的意图
  3. Exec Approvals 弹窗 — 60 秒超时的审批流,介于全自动和全手动之间的中间态,暗示对 Agent 安全执行的持续探索
  4. 隐式供应商发现 — 自动注册 Minimax、Moonshot、Kimi 等中国模型供应商,显示对中国市场的关注

空白(文档未覆盖或不够深入)

  1. 性能基准 — 没有关于单 Gateway 支撑多少并发会话/通道的性能数据
  2. 备份与恢复 — 文件系统存储的备份策略、灾难恢复方案未提及
  3. 升级迁移 — CalVer 发布间的数据迁移策略不够详细(openclaw doctor 有迁移功能但细节不明)
  4. 企业部署 — 明确说不支持恶意多租户,但对”小团队共享”场景的指导缺失

架构决策点理解(给开发者的洞察)

决策选择替代方案理由推测
存储文件系统SQLite/PostgreSQL零依赖,~/.openclaw/ 即全部状态,cp 即备份
进程模型单进程微服务个人使用场景,运维成本最小化
通道集成内嵌+插件独立进程/sidecar内存共享高效,插件崩溃隔离通过 try-catch
配置格式JSON5 + ZodYAML/TOMLJSON 生态 + 严格校验,JSON5 允许注释
协议自研 WebSocket 帧gRPC/GraphQL轻量、全双工、适配流式输出
版本CalVerSemVer持续发布,日期直觉性强

与 OpenClaw-Workspace文件规范 的关联

本框架中多处提及的 SOUL.md、AGENTS.md 等工作区文件的具体写法规范,请参考: → OpenClaw-Workspace文件规范

Skills 开发的详细实践,请参考: → Skill编写指南