jixiaxue 知识库
blog / openclaw-blog · 2026-04-04-deepwiki-openclaw

2026-04-04-deepwiki-openclaw

8 个章节 · 0 条产出 · 0 条证据
2026-04-04

https://deepwiki.com/openclaw/openclaw/1-overview

https://deepwiki.com/openclaw/openclaw/1-overview

OpenClaw:多平台 AI Gateway(网关)概览

根据 DeepWiki 文档,OpenClaw 是”一个具有可扩展消息集成的多平台 AI Gateway”,作为自托管控制平面,将消息渠道连接到 AI 编程 Agent(代理)。

核心架构

系统由三个主要层次组成:

Gateway 控制平面 - 一个 Node.js WebSocket 服务器,管理 Session(会话)、认证和 Agent 路由。它协调客户端(CLI、原生应用、Web UI)与 Agent 运行时之间的通信。

Agent 运行时 - 由 Pi Agent Core 驱动,执行对话逻辑,可访问网页搜索、文件操作和浏览器自动化等 Tool(工具)。

消息渠道 - Telegram、WhatsApp、Discord、Slack 及其他平台的 Plugin(插件),将用户消息传输到 Gateway。

核心概念

Session 跟踪对话状态,支持灵活的作用域(全局、按用户或按渠道用户)。Agent 是独立的执行上下文,拥有专属工作区,包含个性定义和 Tool 配置。Tool 提供系统命令执行和记忆搜索等能力,而 Skill(技能)是注入特定提示词和环境变量的模块化扩展。

多平台支持

架构涵盖:

  • 适用于 Linux、macOS 和 Windows 的 Node.js Gateway
  • 基于 Swift 和 SwiftUI 构建的原生 iOS/macOS 应用
  • 使用 Kotlin 和 Jetpack Compose 开发的 Android 应用
  • 通过 openclaw.mjs 提供的 CLI 界面

安全模型

OpenClaw 采用”个人助理信任模型”运行,假定存在单一可信操作者。保护机制包括:基于 Schema 的配置验证、日志中敏感数据的脱敏处理,以及针对不可信代码执行的可选沙箱机制。

快速开始

安装通过 openclaw onboard 向导进行,配置 Gateway、工作区、模型提供商和消息渠道。设置支持 QuickStart(安全默认值)和 Advanced(精细控制)两种模式。


https://deepwiki.com/openclaw/openclaw/1.1-getting-started

快速开始

OpenClaw 是一个运行在自有硬件上的个人 AI 助手系统,作为消息应用与 AI Agent 之间的多平台 AI Gateway。本页面指导你完成 OpenClaw 的安装,并使用引导向导进行初始配置。


前置条件

OpenClaw 需要 Node.js 24(推荐)Node.js 22.16+

系统设计运行于 macOS、Linux 和 Windows(通过 WSL2)。强烈建议 Windows 用户使用 WSL2,以确保与 Agent 运行时和 Tool 执行环境的兼容性。


安装

主要发行方式通过 Shell 安装脚本或 npm 进行。这将安装 openclaw CLI,作为所有管理任务的入口点。

# 推荐安装方式
curl -fsSL https://openclaw.ai/install.sh | bash

# 或通过 npm 安装
npm install -g openclaw@latest

引导向导

推荐的设置路径是 openclaw onboard 命令。此交互式向导将引导你完成 Gateway、工作区、模型提供商和消息渠道的配置。

运行引导

要执行包含后台服务(daemon)安装的完整设置:

openclaw onboard --install-daemon

向导支持两种主要流程:

  • QuickStart:使用安全默认值(loopback 绑定、端口 18789、自动生成的 token 认证)。
  • Advanced:提供对每项设置的精细控制,包括自定义端口、网络绑定(LAN/Tailscale)和特定认证模式。

向导实现与数据流

引导过程是一个多步骤管线,从用户输入过渡到持久化配置。系统处理自动化设置,同时交互式提示引导手动配置。


模型提供商配置

在引导过程中,你必须连接至少一个 LLM 提供商。OpenClaw 使用复杂的提供商规范化层来处理不同的认证方案。

认证选项

向导按提供商分组展示认证选项(例如 OpenAI、Anthropic、Google、DeepSeek)。这些选项从核心和已安装的 Plugin 中动态解析。

选项类别实现细节
API Key存储为 Secret 引用(环境变量或文件)或通过 credential 对象以明文形式存储。
OAuth触发设备流程或基于浏览器的登录。
Custom API允许手动输入 base URL 和 model ID。

模型目录管理

配置提供商后,系统将本地配置与提供商的可用模型进行同步。这涉及将 Plugin 目录合并到模型提供商配置中。


工作区配置

Workspace(工作区)是 Agent 运行的目录,包含 Agent 的个性和状态。

  1. BOOTSTRAP.md:Agent 的主要系统提示指令。
  2. AGENTS.md:定义 Agent 的角色和指导方针。
  3. Auth Profiles:存储在 Agent 目录中的 auth-profiles.json 文件。

默认位置通常在设置过程中自动解析。


Gateway 与 Daemon 设置

Gateway 是控制平面。消息渠道或 Web UI 要正常运行,Gateway 必须处于运行状态。

服务管理

--install-daemon 标志将 OpenClaw 注册为用户级服务:

  • macOS:通过 launchd 注册为 LaunchAgent
  • Linux/WSL2:注册为 systemd 用户单元。

连接验证

设置完成后,可以验证 Gateway 状态:

openclaw status
openclaw gateway status

健康的 Gateway 将报告 RPC 探测成功。如果 Gateway 启动失败,openclaw doctor 命令可以诊断常见问题,如端口冲突或缺少配置键。


首次交互

设置完成后,有三种方式与 Agent 交互:

1. Control UI(控制面板)

基于浏览器的管理界面。默认访问地址为 http://127.0.0.1:18789/

2. CLI Agent

使用 agent 命令进行直接的终端交互。

3. 消息渠道

如果你配置了渠道(如 Telegram 或 Discord),只需向你的机器人发送消息。Gateway 将消息路由到 Agent 并返回响应。


https://deepwiki.com/openclaw/openclaw/1.2-core-concepts

核心概念

本页面介绍 OpenClaw 的基本构建块:Gateway、Agent、Session、Channel(渠道)、Tool、Skill 以及个人助理信任模型。


Gateway

Gateway 是 OpenClaw 的核心控制平面——一个 WebSocket 服务器,协调客户端、渠道、Agent 和 Tool 之间的所有通信。它作为单一进程运行(通常在端口 18789),并提供 WebSocket 和 RPC 接口。

Gateway 架构

Gateway 充当流量控制器,将来自各平台适配器的入站消息路由到适当的 Agent 运行时。

Gateway 的核心职责:

职责实现参考
WebSocket RPC使用 ConnectFrameRequestFrame 的协议 v3docs/docs.json
认证Token/密码/无认证模式docs/help/faq.md
诊断通过 openclaw doctor 修复/迁移配置docs/help/faq.md
状态报告Gateway/Agent 健康状态快照docs/help/faq.md

Agent

Agent 是由 Pi Agent Core 驱动的独立运行时上下文。它管理自己的工作区、模型和 Tool 执行管线。OpenClaw 支持多 Agent 路由,不同渠道或发送者可以绑定到不同的 Agent。

Agent 配置特性:

特性描述实现
模型选择支持主模型和备用模型src/agents/subagent-spawn.ts
子 Agent为特定任务派生子 Agentsrc/agents/subagent-spawn.ts
ACP用于编排的 Agent Control Protocoldocs/.generated/config-baseline.json
Lane专用执行路径(例如子 Agent lane)src/agents/subagent-spawn.ts

Session

Session 是对话状态的边界。OpenClaw 使用灵活的 Session 作用域模型。Session 通过唯一键标识,并以逐字稿形式持久化。

Session 作用域

OpenClaw 支持多种 Session 作用域模式:

  • main:单一全局 Session。
  • per-peer:按用户 ID 隔离的 Session。
  • per-channel-peer:同时按渠道和用户隔离的 Session。

Session 管理: Session 通过 SessionStore 管理。当 Session 增长过大时,会触发 delegateCompactionToRuntime,根据 tokenBudget 修剪历史记录。


模型提供商

OpenClaw 连接各种 LLM 提供商。提供商 Plugin 拥有模型目录、认证和请求规范化的逻辑。

提供商主要特性来源
OpenAIGPT-5.4 备用,Codex 支持docs/concepts/model-providers.md
AnthropicClaude 4.6 备用,prompt-cache TTLdocs/concepts/model-providers.md
GitHub Copilot设备登录,运行时 token 交换docs/concepts/model-providers.md
Google GeminiGemini 3.1 备用,OAuth CLIdocs/concepts/model-providers.md

API Key 轮换: OpenClaw 支持轮换多个密钥(例如 PROVIDER_API_KEYS)以处理速率限制(429 错误)。


Tool 与 Skill

Tool

Tool 是 Agent 能力的主要机制,允许 Agent 与宿主系统或外部 API 交互。

  • Bash/进程: exec 和后台进程管理
  • 子 Agent: sessions_spawn Tool 用于委托任务
  • 记忆: memory_search 使用混合向量/全文搜索

Skill

Skill 是模块化能力定义,以 SKILL.md 文件形式存储在 Agent 工作区中。它们允许在不同 Agent 之间复用提示词和 Tool 配置。


信任模型

OpenClaw 设计为个人 AI 助手,在单操作者信任模型下运行。

  1. 单一可信操作者: 运行 Gateway 的人拥有完全控制权。身份通常通过 Tailscale 或安全 token 验证。
  2. 渠道安全: 来自公共渠道(Telegram 等)的入站消息通过 allowFrom 列表和 pairing 流程进行过滤。
  3. 执行安全:
    • 审批: 敏感 Tool(如 exec)可通过聊天要求明确审批。
    • 沙箱: 危险操作可限制在隔离环境中执行。
    • Secret 脱敏: isSecretRef 标识敏感配置值,防止意外泄露。

https://deepwiki.com/openclaw/openclaw/1.3-platform-architecture

平台架构

目的与范围

本文档提供 OpenClaw 的高层架构概览,解释主要子系统如何协同工作,以提供自托管多平台 AI Gateway。涵盖核心 Node.js Gateway、原生客户端(iOS/Android/macOS)、基于 Docker 的沙箱,以及跨平台构建系统。

OpenClaw 设计为**中心辐射(hub-and-spoke)**系统,中央 Gateway 协调 Agent 执行、消息渠道和原生设备节点。


架构概览

架构以 Gateway 控制平面为中心,管理各种客户端与 Agent 运行时之间的状态、路由和通信。

系统组件图

下图将高层系统组件映射到代码库中的对应实体。

graph TB
 subgraph "外部客户端与节点"
 CLI["CLI 命令<br/>(openclaw.mjs)"]
 WebUI["Control UI<br/>(ui/src/)"]
 Channels["Channel Plugin<br/>(src/channels/)"]
 iOS["iOS 应用<br/>(apps/ios/)"]
 Android["Android 应用<br/>(apps/android/)"]
 end
 
 subgraph "Gateway 控制平面 (Node.js)"
 Server["GatewayServer<br/>(src/gateway/server.impl.js)"]
 Protocol["Gateway 协议 v3<br/>(src/gateway/protocol/)"]
 Router["Agent Router<br/>(src/gateway/router.ts)"]
 Auth["认证系统<br/>(src/gateway/auth.ts)"]
 end
 
 subgraph "Agent 运行时 (Pi Agent Core)"
 AgentRuntime["Agent 执行<br/>(@mariozechner/pi-agent-core)"]
 ToolRegistry["Tool 注册表<br/>(src/agents/tools/)"]
 Sandbox["沙箱后端<br/>(src/agents/sandbox.ts)"]
 end
 
 subgraph "持久化与状态"
 Config["配置<br/>(openclaw.json)"]
 Sessions["Session Store<br/>(~/.openclaw/agents/)"]
 Memory["记忆索引<br/>(sqlite-vec)"]
 end
 
 CLI --> Server
 WebUI --> Server
 Channels --> Server
 iOS --> Server
 Android --> Server
 
 Server --> Protocol
 Protocol --> Auth
 Auth --> Router
 
 Router --> AgentRuntime
 AgentRuntime --> ToolRegistry
 ToolRegistry --> Sandbox
 
 Config --> Server
 AgentRuntime --> Sessions
 AgentRuntime --> Memory

核心平台子系统

1. Gateway 控制平面

Gateway 是基于 WebSocket 的 RPC 服务器,作为 Session 和配置的单一数据源。它实现 Gateway 协议 v3,使用 RequestFrameResponseFrameEventFrame 进行双向通信。

  • 绑定: Gateway 动态解析其绑定 URL 和端口。
  • 认证: 支持 tokenpassworddevice 配对模式。配对适配器处理审批通知。
  • 路由: 使用多层绑定系统将渠道 peer 映射到特定 Agent。

2. 原生客户端(iOS / macOS / Android)

OpenClaw 提供原生应用,作为设备节点(Device Node)。这些节点连接到 Gateway,为 AI Agent 提供硬件级能力(摄像头、位置、通知)。

  • iOS/macOS: 使用 Swift 和 SwiftUI 构建。项目包含 Sharing、Watch 连接和 Live Activities 扩展。
  • Android: 使用 Kotlin 和 Jetpack Compose 开发。采用多风格构建系统(play vs thirdParty)处理 SMS 和通话记录等受限权限。
  • 协议生成: 协议的 Swift 代码从 TypeScript Schema 生成,确保跨平台类型安全。

3. Plugin 与能力系统

OpenClaw 的可扩展性由基于能力的 Plugin 模型驱动。Plugin 注册特定功能,如文本推理、语音或网页搜索。

能力注册 API
Providerapi.registerProvider
Speechapi.registerSpeechProvider
Web Searchapi.registerWebSearchProvider
Channelapi.registerChannel

构建与发布系统

OpenClaw 使用统一的构建管线为所有支持平台生成制品,Node.js 使用 tsdown,原生应用使用平台专用工具。

graph LR
 Source["TypeScript 源代码"]
 
 subgraph "Node.js 构建"
 TSDown["tsdown"]
 NPM["npm publish"]
 end
 
 subgraph "容器构建"
 DF["Dockerfile"]
 DBuild["docker buildx"]
 GHCR["ghcr.io"]
 end
 
 subgraph "移动端构建"
 XCG["XcodeGen (iOS)"]
 GRL["Gradle (Android)"]
 end
 
 Source --> TSDown
 TSDown --> NPM
 
 Source --> DF
 DF --> DBuild
 DBuild --> GHCR
 
 Source --> XCG
 Source --> GRL

容器化(Docker)

OpenClaw 提供基于 node:24-bookworm 的多阶段 Dockerfile,生成最小化运行时镜像。

  • 持久化: Docker Compose 将配置和工作区目录绑定挂载到 /home/node/.openclaw
  • 健康检查: 包含内置的存活(/healthz)和就绪(/readyz)探针。
  • 沙箱: Agent 沙箱使用 Docker 进行隔离,无论 Gateway 本身是否容器化。

原生应用分发

  • iOS: 通过 XcodeGen 管理,项目规范位于 project.yml
  • Android: 发布构建需要签名属性,如 OPENCLAW_ANDROID_STORE_FILE。构建系统根据版本、风格和构建类型重命名 APK。
  • macOS 打包: 使用 lipo 合并 arm64x86_64 架构,处理通用二进制文件创建。

数据流:原生节点调用

当 Agent 需要访问设备硬件时,请求从 Gateway 流向原生客户端(设备节点)。

sequenceDiagram
 participant G as Gateway (Node.js)
 participant NM as NodeAppModel (Swift/Kotlin)
 participant CR as CapabilityRouter
 participant HW as 硬件 (摄像头/GPS)
 
 G->>NM: node.invoke("camera.capture", {quality: "high"})
 NM->>CR: routeRequest(payload)
 CR->>HW: accessHardware()
 HW-->>CR: 数据 (图像/缓冲区)
 CR-->>NM: 编码响应
 NM-->>G: ResponseFrame

关键实现细节:

  • 能力路由: 原生客户端将请求分发到特定服务处理器。
  • 权限处理: 原生客户端管理平台特定权限(摄像头、位置、麦克风),在 macOS/iOS 的 Info.plist 中定义。
  • 配置 Schema: Gateway 使用生成的基础 Schema 验证配置。

https://deepwiki.com/openclaw/openclaw/2-gateway

https://deepwiki.com/openclaw/openclaw/2-gateway

Gateway(网关)

Gateway 是 OpenClaw 的中央控制平面,负责管理 WebSocket 连接、分发 RPC(远程过程调用)方法、协调消息通道、编排 Agent(智能体)运行,以及维护系统状态。

Gateway 在系统中的角色

Gateway 作为以下方面的唯一权威来源:

  • 协议连接:WebSocket 客户端连接用于 RPC 和事件通信
  • 通道路由:管理来自 Telegram、WhatsApp、Discord 等平台的入站消息
  • Agent 编排:Gateway 调用 Agent 运行并将结果流式回传到通道
  • 配置管理:运行时配置的加载、验证和热重载
  • Session(会话)状态:会话的管理与持久化
  • 设备配对:节点配对(iOS、Android、macOS)和设备认证

核心职责

1. WebSocket 协议处理

Gateway 通过 WebSocket 实现基于 JSON 的 RPC 协议(版本 3)。每个客户端必须先发送 ConnectFrame,收到包含系统快照的 HelloOk 响应后,再发出 RequestFrame 消息。

关键协议组件:

  • ConnectParams:客户端握手,包含角色、权限范围和设备身份信息
  • RequestFrame:带参数的 RPC 方法调用
  • ResponseFrame:带载荷的成功/错误响应
  • EventFrame:异步通知(Agent 事件、会话变更等)

2. RPC 方法分发

Gateway 暴露 30+ 个按领域组织的 RPC 方法。方法处理器通过 WebSocket 运行时注册并分发。

方法分类:

  • agent.*:Agent 执行和身份管理
  • config.*:配置的增删改查及 Schema 查找
  • sessions.*:Session 生命周期(列表、更新、重置、压缩)
  • node.*:移动节点配对和远程工具调用
  • cron.*:定时自动化任务的管理

3. HTTP 与 Web 服务

除 WebSocket 外,Gateway 还提供多个 HTTP 接口:

  • 控制台 UI:浏览器仪表板的静态资源和 API
  • Webhooks:接收外部服务(如 Slack、Mattermost)入站 Hook 的端点
  • 健康探针:供容器编排器使用的 /health/ready 端点
  • A2UI Canvas:托管”Live Canvas”渲染协议的服务

总结

Gateway:

  • 为所有客户端实现 WebSocket 协议 v3
  • 基于权限范围的授权(如 ADMIN_SCOPE)分发 RPC 方法
  • 提供控制台 UI 并通过 HTTP 处理入站 Webhook
  • 将消息路由到 Agent 并以 JSONL 格式将对话历史持久化到逐字稿文件
  • 管理定时任务和移动节点配对的生命周期

https://deepwiki.com/openclaw/openclaw/2.1-websocket-protocol-and-rpc

WebSocket 协议与 RPC

协议架构

Gateway WebSocket 协议是一个双向的基于 JSON 的 RPC 系统,包含四种核心消息类型:连接帧(客户端握手)、请求帧(客户端→服务端)、响应帧(服务端→客户端),以及事件帧(服务端→客户端推送通知)。所有消息均通过 Zod Schema 进行验证。

系统架构与代码实体

协议实现将概念映射到具体的代码实体:

  • 协议定义src/gateway/protocol/index.ts
  • 消息处理器src/gateway/server/ws-connection/message-handler.ts
  • Chat 方法src/gateway/server-methods/chat.ts
  • Agent 方法src/gateway/server-methods/agent.ts

帧类型

ConnectParams(握手)

客户端建立 WebSocket 连接后发送的初始消息:

字段类型是否必填说明
minProtocolnumber支持的最低协议版本
maxProtocolnumber支持的最高协议版本
clientobject元数据:名称、版本、平台
authobject凭证:token、密码或 authDeviceToken
rolestring请求的角色:“operator” 或 “node”
scopesstring[]请求的权限范围(如 operator.admin)

RequestFrame(RPC 调用)

客户端使用唯一 id 调用服务端方法,用于关联响应。

ResponseFrame(RPC 结果)

服务端对 RequestFrame 的响应,通过 id 关联。

EventFrame(服务端推送)

服务端主动发起的消息,用于流式传输或状态更新,包含序列号 seq 用于排序。

连接与握手流程

attachGatewayWsMessageHandler 管理连接生命周期,包括身份验证解析和握手状态跟踪。流程从初始连接,经过身份验证,到达活跃消息处理状态。

RPC 方法

Gateway 暴露 30+ 个核心 RPC 方法,按功能领域组织:

领域方法说明
Agentagent, agent.wait, agent.identity.get执行 Agent 运行、等待终态、获取身份信息
Chatchat.send, chat.history, chat.abort发送消息、获取历史、中止活跃运行
Devicesdevices.list, devices.pair.request, devices.pair.approve管理配对设备和 Token
Sessionssessions.list, sessions.patch, sessions.compact管理对话历史和指令
Nodesnode.pair.request, node.invoke控制和配对远程设备节点

方法授权

授权会验证客户端角色和权限范围与请求方法是否匹配:

  1. 角色权限范围listEffectivePairedDeviceRoles 解析活跃角色(operator、node)
  2. 管理员访问:敏感方法需要 ADMIN_SCOPE
  3. 幂等性:Agent 执行使用 idempotencyKey 防止重试时重复运行

Swift 代码生成

协议通过 Swift 代码生成与原生客户端保持一致:

  • 文件:生成于 apps/macos/Sources/OpenClawProtocol/GatewayModels.swift
  • Codable 支持:所有 struct 均实现 CodableSendable
  • 协议版本:Swift 和 TypeScript 均定义 GATEWAY_PROTOCOL_VERSION = 3

错误处理

响应中返回的标准错误格式:

字段类型说明
codeErrorCode机器可读的错误码(如 INVALID_REQUEST、AGENT_TIMEOUT)
messagestring人类可读的错误描述
detailsany方法特定的错误元数据

https://deepwiki.com/openclaw/openclaw/2.2-authentication-and-authorization

身份验证与授权

概述

OpenClaw 实现了多层访问控制系统:

  1. 传输层身份验证:通过 Token、密码、设备配对或网络信任在连接层进行身份验证
  2. 协议握手:在 WebSocket ConnectFrame 交换期间验证客户端身份、角色和权限范围
  3. 方法授权:使用角色(operator/node)和权限范围(READ/WRITE/ADMIN/PAIRING/APPROVALS)进行 RPC 访问控制
  4. 速率限制:防止暴力攻击和控制平面资源耗尽

身份验证模式

Gateway 支持四种主要身份验证模式:

模式说明配置
tokenBearer Token 身份验证gateway.auth.tokenOPENCLAW_GATEWAY_TOKEN
password基于密码的身份验证gateway.auth.passwordOPENCLAW_GATEWAY_PASSWORD
trusted-proxy信任来自已配置代理的 X-Forwarded-Forgateway.auth.mode="trusted-proxy" + gateway.trustedProxies
none无需身份验证gateway.auth.mode="none" 或未配置凭证

Gateway 优先使用环境变量而非配置文件。如果配置了多种模式,则应用确定性优先级层次结构。


授权权限范围

经过身份验证的客户端在其 ConnectParams 中声明权限范围。每次 RPC 方法调用都会根据这些范围进行评估。

权限范围用途示例方法
operator.read只读状态访问config.get, sessions.list, logs.tail
operator.write交互和修改agent, send, sessions.patch
operator.admin绕过所有权限范围检查所有方法
operator.pairing管理设备/节点配对device.pair.approve, node.pair.approve
operator.approvals管理工具执行审批exec.approval.resolve

attachGatewayWsMessageHandler 函数在消息处理器层面验证客户端角色和权限范围与请求方法是否匹配,强制执行授权。


速率限制与暴力攻击防护

身份验证速率限制

通过 AuthRateLimiter 进行每 IP 跟踪,防止对 Token 或密码的暴力攻击。

  • 握手守卫UnauthorizedFloodGuard 防止来自单个对端的过多失败连接尝试
  • 浏览器来源检查browserRateLimiter 专门针对基于来源的身份验证尝试

设备签名时间偏差

设备签名通过 DEVICE_SIGNATURE_SKEW_MS 在严格时间窗口(默认 2 分钟)内验证,以防止重放攻击。


工具执行授权

当通过 /v1/chat/completions 等 HTTP 端点调用工具时,会经过多步策略检查:

  1. Gateway 认证:通过 resolveGatewayRequestContext 使用标准 Gateway 身份验证验证 HTTP 请求
  2. 工具策略:根据发送者是否为所有者(senderIsOwner)应用策略
  3. SSRF 防护:Web 抓取和搜索工具使用运行时元数据限制访问

设备与节点配对

设备配对(控制台 UI)

控制台 UI 使用 WebCrypto 密钥对建立 deviceId。未知设备触发 requestDevicePairing 流程,现有 operator 必须调用 approveDevicePairing 来授予访问权限。

节点配对(原生客户端)

原生 iOS/Android/macOS 应用使用 Node 角色。它们通过基于代码的握手进行配对,并通过 updatePairedNodeMetadata 更新元数据。配对后,它们被限制在节点命令策略中定义的方法范围内。


https://deepwiki.com/openclaw/openclaw/2.3-configuration-system

配置系统

配置系统为 OpenClaw Gateway 及其所有子系统提供运行时配置加载、验证、热重载和管理功能。它以 JSON5 格式从 ~/.openclaw/openclaw.json 读取配置,针对严格的 Zod Schema 进行验证,解析 Secret(密钥)和 Include(引用),并向所有 Gateway 组件暴露运行时快照。

架构概述

配置系统作为多阶段管道运行,将原始 JSON5 文件转换为所有 Gateway 子系统使用的经过验证、已解析的运行时快照。

配置加载管道

系统遵循以下阶段:

  1. JSON5 解析,支持环境变量替换(${VAR_NAME} 语法)
  2. Include 解析,支持最多 10 层嵌套 Include
  3. Secret 引用解析,用于 { source, provider, id } 模式
  4. Zod Schema 验证,严格模式拒绝未知键
  5. 运行时快照缓存,供 Gateway 组件使用

核心配置模块

配置 I/O 与加载

主入口点是 loadConfig(),它读取 ~/.openclaw/openclaw.json,通过管道对其进行验证,并缓存结果。系统维护 config-audit.jsonl 用于跟踪所有配置变更。

函数用途关键实现
loadConfig()完整配置加载 + 缓存返回缓存快照或重新解析文件
parseConfigJson5()JSON5 解析 + 环境变量替换在字符串中支持 ${VAR_NAME} 语法
OpenClawSchema.parse()Zod 验证所有对象上带 .strict() 的根 Schema
migrateLegacyConfig()Schema 迁移自动升级已弃用的字段路径
resolveConfigIncludes()$include 合并支持最多 10 层嵌套 Include
resolveSecretsInConfig()SecretRef 解析解析 { source, provider, id } 模式

使用 Zod 进行验证

所有配置均针对 OpenClawSchema 进行验证。Schema 默认为严格模式——未知键会导致验证失败,所有字段类型在解析时强制执行。

关键 Schema 特性:

  • 严格模式:所有对象 Schema 上的 .strict() 拒绝未知键(根部 $schema 除外)
  • 敏感字段标记.register(sensitive) 标记 Secret 以进行日志脱敏
  • 自定义强制转换:从字符串解析时间和字节大小(如 “2h”、“50mb”)
  • Provider 特定处理:Schema 处理复杂的 Provider 特定验证,包括 WhatsApp 和 Telegram 的账户级别覆盖

SecretRef 模式

SecretRef 系统允许配置值引用存储在配置文件之外的 Secret(环境变量、文件或可执行程序输出)。支持 SecretRef 的字段使用 SecretInputSchema

解析流程:

  1. 配置以 { source, provider, id } 的形式引用 Secret
  2. 运行时解析器查询环境或文件来源
  3. 解析的值在启动时注入
  4. 敏感值从日志中脱敏

热重载系统

Gateway 监听 ~/.openclaw/openclaw.json,自动应用变更,无需手动重启。

模式行为
hybrid立即热应用安全变更;关键变更自动重启
hot仅热应用安全变更;关键变更记录警告
restart任何配置变更时重启
off完全禁用文件监听

$include 指令

配置文件可以使用 $include 指令进行拆分和组合,支持单文件替换和多文件深度合并。

语义:

  • 单文件{ "$include": "./file.json5" } 替换包含该指令的对象
  • 文件数组{ "$include": ["a.json5", "b.json5"] } 按顺序深度合并(后者优先)
  • 嵌套 Include:支持最多 10 层,带循环依赖保护

Schema 生成与 UI 集成

配置系统包含丰富的元数据,用于控制台 UI 渲染、CLI 帮助文本和验证诊断。元数据在 FIELD_LABELSFIELD_HELP 中定义,支持:

  • 控制台 UI 中的动态表单生成
  • 上下文感知的 CLI 帮助文本
  • 带修复提示的验证错误消息

有关这些 Schema 如何驱动控制台 UI 的详细信息,请参阅 Schema 生成与 UI 集成文档。

关键要点

  1. 严格验证:配置必须完全匹配 Zod Schema;未知键会导致启动失败
  2. SecretRef 无处不在:使用 { source, provider, id } 将 Secret 排除在配置文件之外
  3. $include 组合:通过深度合并将大型配置拆分为专注的文件
  4. 迁移安全:遗留配置在读取时自动迁移;openclaw doctor 修复问题
  5. 运行时快照:所有子系统使用已缓存、已验证的配置——热路径中无文件 I/O

https://deepwiki.com/openclaw/openclaw/2.3.1-configuration-reference

配置参考

本文档为 ~/.openclaw/openclaw.json 中所有可用配置键提供全面的技术参考,涵盖类型、默认值、验证规则和子系统影响。

OpenClaw 使用基于 JSON5Zod 构建的集中式配置系统,在提供严格类型安全的同时,允许在配置文件中使用注释和尾部逗号。

配置架构

配置系统组织为层次结构,将基础设施、运行时和 Agent 特定设置分开管理。

顶层组织

配置遵循”自然语言空间”到”代码实体空间”的层次结构,将设置从面向用户的基础设施一路组织到 Agent 特定的执行参数。

来源: src/config/zod-schema.ts, docs/gateway/configuration-reference.md, src/config/schema.labels.ts

Schema 验证系统

OpenClaw 采用严格验证。如果配置不匹配 Schema(未知键或格式错误的类型),Gateway 将拒绝启动,以防止未定义的行为。

Zod Schema 管道

OpenClawSchema 是聚合所有子系统 Schema 的根 Zod 对象。它执行严格验证,并在整个代码库中提供类型安全的配置访问。

字段元数据与 UI 提示

系统通过 FIELD_HELPFIELD_LABELS 将内部 Zod 路径映射到人类可读的标签和帮助文本。

元数据实体文件用途
FIELD_HELPsrc/config/schema.help.ts工具提示中使用的配置键详细描述
FIELD_LABELSsrc/config/schema.labels.tsUI 字段的人类可读名称
OpenClawSchemasrc/config/zod-schema.ts类型和结构的权威来源

Gateway 子系统参考

gateway 块控制网络接口、身份验证模式和健康监控。

类型默认值效果
gateway.portnumber18789WebSocket/HTTP API 的 TCP 端口
gateway.bindstring”auto”网络接口绑定(loopback、lan、tailnet、自定义)
gateway.auth.modestring”token”认证策略:token、password、none 或 tailscale
gateway.channelHealthCheckMinutesnumber5监控通道状态的间隔时间
gateway.tls.enabledbooleanfalse为 Gateway 监听器启用 HTTPS/WSS

来源: src/config/schema.help.ts, src/config/schema.labels.ts

Agent 运行时与压缩

agents 部分定义核心 LLM 参数和上下文管理策略。运行器使用 runEmbeddedPiAgent 执行 Agent 轮次。

执行管道逻辑

Agent 执行由基于通道的队列系统(enqueueCommandInLane)管理,以确保会话和全局隔离。

压缩参数

OpenClaw 使用压缩系统管理上下文窗口限制,当 Token 超过 contextTokens 时触发。

类型默认值效果
agents.defaults.contextTokensnumber200000Agent 的总上下文窗口大小
agents.defaults.imageMaxDimensionPxnumber1200控制图像缩放以节省视觉 Token
agents.defaults.compaction.safeguardbooleantrue防止在可能丢失关键上下文时压缩

来源: src/agents/pi-embedded-runner/compact.ts, src/agents/pi-embedded-runner/run/attempt.ts

通道配置参考

通道代表外部消息平台。所有通道继承标准的 dmPolicygroupPolicy 模式。

DM 和群组策略

策略行为
dmPolicy”pairing”未知发送者收到一次性配对码供所有者审批
dmPolicy”allowlist”只有 allowFrom 中的 ID 才能向机器人发消息
groupPolicy”allowlist”机器人仅在特定群组 ID 中响应
requireMentionboolean为 true 时,机器人忽略未 @提及它的群组消息

平台特定示例

平台关键配置
TelegrambotTokenstreaming(off/partial/block/progress)、reactionNotifications
WhatsAppsendReadReceiptsmediaMaxMbaccounts(多账户支持)
DiscordbotTokenguildsapplicationIdstreaming

来源: docs/gateway/configuration-reference.md, src/config/zod-schema.providers-core.ts

工具与沙盒

tools 配置管理 Agent 能力,包括文件系统访问和执行策略。

类型默认值效果
tools.exec.hostbooleanfalse允许 Agent 直接在宿主机上执行命令
tools.media.image.enabledbooleantrue启用视觉/图像理解能力
tools.web.searchstring”brave”默认搜索提供商(Brave、Perplexity、Tavily 等)
tools.loopDetection.enabledbooleantrue防止工具调用递归的保护机制

来源: src/agents/pi-tools.ts, src/config/schema.labels.ts


https://deepwiki.com/openclaw/openclaw/2.3.2-schema-generation-and-ui-integration

Schema 生成与 UI 集成

概述

OpenClaw 构建、缓存并合并配置 Schema 与 Plugin(插件)扩展,以驱动控制台 UI 中的动态表单。系统将静态 Zod 定义转换为用于验证和可视化渲染的交互式 JSON SchemaUI Hints(UI 提示)

Schema 生成管道

OpenClaw 使用多阶段管道将运行时 Zod Schema 转换为前端所需的结构化元数据。

架构概述

该管道弥合了静态 TypeScript/Zod 定义与前端所需的动态 JSON 配置之间的差距。

JSON Schema 生成与缓存

核心配置使用 Zod 定义。为使前端和外部工具可以访问,它被转换为 JSON Schema Draft-07

基础 Schema 生成

系统为核心配置字段使用自动生成的基线,以确保性能和一致性。GENERATED_BASE_CONFIG_SCHEMA 包含整个 openclaw.json 树的结构定义。

验证集成

验证逻辑使用这些 Schema 提供详细的错误消息。函数 lookupJsonSchemaNode 使用路径段遍历 Schema 树,以查找特定配置键的相关验证规则。

Plugin 与通道集成

OpenClaw 允许 Plugin 和消息通道扩展全局配置 Schema。这通过在运行时基于 Plugin 清单进行动态对象合并来实现。

Schema 合并逻辑

当发现 Plugin 时,loadPluginManifestRegistry 读取其 openclaw.plugin.json 清单。如果清单包含 configSchema,它将被合并到全局配置的 plugins.entries.[id] 路径中。

系统还专门处理捆绑通道配置。GENERATED_BUNDLED_CHANNEL_CONFIG_METADATA 为 Telegram 或 Discord 等核心通道提供预制 Schema。

UI Hints 与表单元数据

控制台 UI 使用 UI Hints 创建用户友好的体验,将原始 Schema 路径映射到人类可读的元数据。

配置基线

config-baseline.json 文件作为控制台 UI 使用的 UI 标签、帮助文本和标签的权威来源。

属性说明示例
path点分隔的配置路径acp.maxConcurrentSessions
label人类可读的名称”ACP Max Concurrent Sessions”
help工具提示/描述”Maximum concurrently active ACP sessions…”
tagsUI 分组/行为["performance", "storage"]

敏感数据与 SecretRef

OpenClaw 为凭证使用专门的 SecretRef 系统。支持环境变量解析或外部 Secret 文件的字段使用 coerceSecretRef 进行验证。验证引擎专门检查 unsupportedSecretRefConfigCandidates,以确保 Secret 不被放置在不安全的配置接口中。

验证与枚举恢复

为提供高质量的 UI 体验,验证系统即使在验证失败时也能从 JSON Schema 中恢复”允许的值”(枚举)。

允许值提取

函数 collectAllowedValuesFromIssue 及其辅助函数遍历与验证错误关联的 Schema 节点,向用户建议正确的值。

该逻辑支持复杂的 JSON Schema 结构,包括 anyOfoneOf 和布尔类型。

关键实体摘要

实体角色位置
OpenClawSchema主要 Zod 配置定义src/config/validation.ts
GENERATED_BASE_CONFIG_SCHEMA核心配置的静态 JSON Schemasrc/config/schema.base.generated.ts
config-baseline.jsonUI 元数据(标签、帮助、标签)docs/.generated/config-baseline.json
lookupJsonSchemaNode按路径查找 Schema 定义的工具函数src/config/validation.ts
loadPluginManifestRegistry发现 Plugin 提供的配置 Schemasrc/plugins/manifest-registry.ts

https://deepwiki.com/openclaw/openclaw/2.4-session-and-state-management

Session 与状态管理

本页面记录 OpenClaw 的 Session 和状态管理系统,包括 Session 作用域模型、存储格式、目录组织和生命周期管理。

Session 作用域模型

OpenClaw 支持多种 Session 作用域策略来控制对话隔离:

模式行为使用场景
main所有通道和对端共享单一 Session单用户、个人助手
per-peer每个发送者一个 Session,跨通道共享多用户、与通道无关的身份
per-channel-peer按通道+发送者对隔离多用户且有通道分隔(推荐)
per-account-channel-peer按账户+通道+发送者隔离多账户部署

系统为每条入站消息解析唯一的 sessionKey 以确定加载哪个逐字稿。直接消息默认折叠到 Agent 的 main 键,除非另外配置了 dmScope。群聊根据群组/通道 ID 维护不同的键。

Session 存储(JSONL)

Session 以 JSONL(JSON Lines)文件形式持久化,其中每行是一个独立的 JSON 对象,表示一条消息或 Session 事件。

文件位置: ~/.openclaw/agents/{agentId}/sessions/{sessionId}.jsonl

元数据索引(sessions.json):sessionKey 映射到包含运行时状态的 SessionEntry 对象。

字段说明
sessionIdSession 文件的唯一 UUID
updatedAt最后一次交互的时间戳
model活跃的模型 Provider/ID 覆盖
inputTokens累计使用的输入 Token 数
outputTokens累计使用的输出 Token 数
estimatedCostUsdSession 的计算成本

状态目录组织

OpenClaw 在中央目录下(默认 ~/.openclaw/)组织状态,按 Agent 隔离数据。状态目录可通过 OPENCLAW_STATE_DIR 环境变量覆盖。

Session 生命周期

Session 生命周期由 Gateway 和 Pi Agent Core 运行时管理。

初始化流程

当消息通过 Gateway 到达时:

  1. 解析键:使用 resolveSessionKeyFromResolveParams 确定 sessionKey
  2. 加载存储:通过 loadSessionStore 读取 sessions.json 以查找已有的 SessionEntry
  3. 运行时检查:通过 isEmbeddedPiRunActive 确保没有现有运行处于活跃状态
  4. 更新存储:通过 updateSessionStore 记录交互时间和模型使用情况

Session 重置与归档

Session 可以重置以清除历史记录,同时保留 sessionKey

  • 归档:在删除前通过 archiveSessionTranscriptsDetailed 将逐字稿移至 archive/ 子目录
  • 清理:通过 abortEmbeddedPiRun 中止活跃运行,并通过 closeTrackedBrowserTabsForSessions 关闭浏览器标签
  • 钩子:重置触发 session_endsession_start Plugin 钩子

隔离 Session 与 Cron Session

Cron 任务和隔离的 Agent 轮次使用专门的生命周期管理:

  • Session 键:Cron Session 使用带 cron: 前缀的键(如 cron:job-1),由 resolveCronAgentSessionKey 解析
  • 交付契约:隔离运行可以是 cron-owned(交付由运行器处理)或 shared
  • 尽力而为:通过 resolveCronDeliveryBestEffort 标记为 bestEffort 的交付允许任务在通知失败时仍视为成功
  • 去重:系统在 COMPLETED_DIRECT_CRON_DELIVERIES 中跟踪已完成的交付,以防止重复通知

Session 管理 RPC

Gateway 为 UI 客户端提供 RPC 方法来远程管理 Session:

RPC 方法用途
sessions.list列出 Agent 的所有 Session 及其元数据
sessions.reset归档逐字稿并清除 Session 状态
sessions.patch更新元数据,如 displayNamemodel
sessions.delete永久删除 Session 和逐字稿
sessions.abort停止 Session 的活跃 Agent 运行
sessions.resolve从通道/对端参数解析 Session 键

https://deepwiki.com/openclaw/openclaw/2.5-multi-agent-routing

多 Agent 路由

目的与范围

OpenClaw 的多 Agent 路由系统使单个 Gateway 进程能够托管多个隔离的 AI 助手。每个 Agent 维护独立的工作空间、Session 历史、身份验证配置和模型配置。路由使用确定性优先级机制,根据可配置的绑定和结构化 Session 键,将消息通道的入站消息映射到适当的 Agent。

Agent 隔离模型

每个 Agent 都是具有自己文件系统资源的独立逻辑实体,确保工具、内存和凭证保持隔离:

资源路径模式用途
工作空间~/.openclaw/workspace-<agentId>工具和本地 Skill 的文件系统上下文
Agent 目录~/.openclaw/agents/<agentId>/agent/Agent 特定配置,包括 auth-profiles.jsonmodels.json
Session 存储~/.openclaw/agents/<agentId>/sessions/store.json所有对话元数据的索引
Session 逐字稿~/.openclaw/agents/<agentId>/sessions/<uuid>.jsonl只追加的对话历史(JSONL)

Session 键结构

路由信息通过 parseAgentSessionKeynormalizeAgentId 直接编码到 Session 键中:

格式示例Agent ID作用域
显式 Agentagent:work:mainworkmain
默认 Agentmainmainmain
子 Agentagent:main:subagent:abcmainsubagent:abc

Gateway 使用 isSubagentSessionKey 识别内部请求者 Session(如子 Agent)。

路由与模型选择

当 Agent 被解析时,它使用自己的模型配置。OpenClaw 支持复杂的模型解析,包括通过 normalizeModelRefparseModelRef 函数进行别名和 Provider 特定规范化,根据 Agent 特定配置和默认值确定最终模型。

子 Agent 路由与控制

OpenClaw 支持递归多 Agent 模型,“控制器” Agent 可以在隔离 Session 中生成”子 Agent”,同时仍受请求者控制:

  1. 控制器解析resolveSubagentController 识别调用者是否有权控制特定子 Agent Session
  2. 消息分发sendControlledSubagentMessage 通过 Gateway RPC 将消息路由到子 Agent
  3. 状态跟踪:系统跟踪子 Agent 状态(运行中、完成、失败)和运行时指标

注册表与生命周期管理

subagent-registry.ts 作为所有活跃子 Agent 运行的中央协调点:

  • 持久化:通过 persistSubagentRunsToDisk 将运行持久化到磁盘,以便在 Gateway 重启后恢复
  • 生命周期钩子:子 Agent 完成时触发钩子,允许自动清理或通知
  • 错误处理:为瞬态生命周期错误实现宽限期,以防止过早报告失败

https://deepwiki.com/openclaw/openclaw/2.6-service-lifecycle-and-diagnostics

https://deepwiki.com/openclaw/openclaw/2.6-service-lifecycle-and-diagnostics

服务生命周期与诊断

概述

Gateway(网关)是 OpenClaw 的中央控制平面,负责管理会话、路由、Channel(通道)以及 Agent(代理)调用。本文档涵盖 Gateway 在 macOS、Linux 和 Windows 平台上的生命周期、健康监控以及诊断工具。

Gateway 启动序列

Gateway 以三种模式运行:

  • 前台模式:通过 openclaw gateway 直接进行 CLI 调用
  • 守护进程模式:由平台原生服务(launchd、systemd、schtasks)进行监管
  • 内嵌模式:打包在原生应用或移动节点中

端口绑定与认证校验

系统在启动时强制执行安全检查:

条件执行方式
配置无效openclaw.json 格式错误则阻止启动
端口被占用通过 inspectPortUsage 进行监控
远程模式但缺少 URLremoteUrlMissing 标志阻止启动

健康检查与监控

采用多层次方法,将本地进程检查与远程 RPC(远程过程调用)探针结合使用。

Status 命令

openclaw status 命令提供全面的健康快照。它通过 scanStatusJsonCore 聚合数据,并测量以下指标:

  • Gateway 可达性:通过 resolveGatewayProbeSnapshot 检测连接状态和延迟
  • 服务状态:守护进程的安装、加载及运行时状态
  • 认证健康:通过 checkTokenDrift 对 CLI token 进行校验
  • 内存健康:通过 resolveMemoryStatusSnapshot 检测向量搜索可用性

Doctor 命令与诊断

openclaw doctor 命令通过 loadAndMaybeMigrateDoctorConfig 提供自动化故障排查和配置修复功能。

配置分析

执行的诊断检查项:

检查项实现方式
遗留配置通过 applyLegacyCompatibilityStep 处理迁移过渡
插件自动启用根据环境检测缺失的插件
Matrix 修复处理 Matrix 插件账户迁移
未知键识别并移除无法识别的配置项

安全审计

  • 可变允许列表scanMutableAllowlistEntries 识别危险的基于名称的匹配
  • Secret 解析resolveCommandSecretRefsViaGateway 确保安全的 secret 检索

守护进程管理

OpenClaw 通过 src/daemon 子系统使用平台原生的进程监管器来管理后台服务。

平台实现

平台监管器配置文件
macOSlaunchctl~/Library/LaunchAgents/[label].plist
Linuxsystemctl~/.config/systemd/user/[name].service
Windowsschtasks.exeTask Scheduler 中的 gateway.cmd

macOS (launchd)

  • 引导:通过 launchctl bootstrap 在 GUI 域中注册服务
  • 日志:将 stdout/stderr 重定向到专用日志目录
  • 切换:通过 scheduleDetachedLaunchdRestartHandoff 支持分离式重启

Linux (systemd)

  • 可用性:通过 isSystemdUserServiceAvailable 检查用户总线可达性
  • 持久化:可通过 enableSystemdUserLinger 启用持久服务

Windows (schtasks)

  • 运行时状态:使用数字状态码解析 schtasks /query 输出
  • 启动:通过 resolveStartupEntryPath 将 Windows 启动文件夹作为备用方案

服务生命周期 RPC

客户端通过 Gateway 协议远程管理服务生命周期:

方法描述
channels.status返回活跃消息 Channel 的运行时状态
gateway.probe轻量级连接和认证校验检查

https://deepwiki.com/openclaw/openclaw/2.7-control-ui-and-webchat

控制 UI 与 WebChat

概述

OpenClaw Gateway 提供基于浏览器的控制 UI(用户界面),作为系统的主要管理和交互界面。它包含完整的聊天界面、设置管理、会话视图和实时监控功能。

控制 UI 是一个使用 Vite + Lit 构建的单页应用(SPA),由 Gateway 的内部 HTTP 服务器直接提供服务。它通过 WebSocket 协议和 RPC 与 Gateway 通信,执行发送消息、更新配置、管理 Agent 生命周期等操作。

实现架构

UI 遵循控制器-视图模式,视图负责可视化布局,控制器通过 GatewayBrowserClient 处理数据获取和状态变更。

组件职责
应用外壳(App Shell)主布局、导航和主题管理
控制器(Controllers)特定领域的逻辑(聊天、配置、会话)
视图(Views)用于渲染特定标签页的 Lit 模板
懒加载(Lazy Loading)延迟加载视图模块以最小化包体积

聊天界面

聊天界面是与 AI Agent 交互的主要入口,支持实时流式传输、工具执行可视化和会话管理。

消息处理流程

用户通过 UI 发送消息时,遵循如下 Pipeline(处理管线):

  1. 输入处理handleSendChat 函数捕获输入和附件
  2. RPC 请求:客户端通过 WebSocket 调用 chat.send 方法(非阻塞,返回 runId
  3. Gateway 路由:Gateway 解析会话键并将消息路由到相应的 Agent
  4. 事件反馈:Gateway 向 UI 广播 chat.segment(用于流式传输)和 chat.tool 事件

聊天 UI 组件

聊天渲染包含多个交互元素:

  • 会话选择器:允许在不同聊天会话间切换
  • 聊天控件:用于切换”思考”显示、工具调用可见性和专注模式的选项
  • 消息输入框:支持斜杠命令和附件的文本区域
  • 斜杠命令:客户端执行 /model/think/reset 等命令
  • 消息分组:按发送者分组消息并进行视觉组织
  • 压缩/回退指示器:上下文压缩和模型回退事件的视觉提示

会话管理

UI 提供专用视图用于管理会话生命周期,允许用户查看历史、重命名会话或删除会话。

关键函数

  • 列表loadSessions 获取会话列表;subscribeSessions 监听更新
  • 重命名/更新patchSession 更新会话元数据,如 displayName
  • 删除deleteSessionsAndRefresh 移除会话数据并刷新 UI 列表

会话键结构

会话由 sessionKey 标识,通常遵循 agent:{agentId}:{mainKey} 格式。UI 通过 switchChatSession 处理会话切换。

控制 UI 静态资源服务

Gateway 实现了专用的 HTTP 处理器,用于安全地提供 SPA 及其静态资源。

静态资源解析

Gateway 使用 resolveControlUiRootSyncui/dist 目录中检查资源。若资源缺失,则返回 503 错误。

头像代理

Gateway 代理 Agent 头像以避免 CORS(跨域资源共享)问题。handleControlUiAvatarRequest 函数将工作区相对路径解析为 base64 数据 URL 或安全地提供本地文件。它支持 ?meta=1 标志以获取头像元数据。

用于内嵌的 WebChat 协议

Gateway 支持”webchat”模式,允许将聊天界面用作简化版客户端。

配置

WebChat 客户端通过 GatewayBrowserClient 构造函数中的 mode: "webchat" 参数进行标识。

  • 认证:支持基于 token、密码或设备身份的认证
  • 标识:使用唯一的 instanceId(UUID)来标识浏览器会话

工具执行与监控

WebChat 界面渲染实时工具输出卡片和流式片段。它监控系统事件(如 GATEWAY_EVENT_UPDATE_AVAILABLE),以便在有待处理的服务器更新时通知用户。


https://deepwiki.com/openclaw/openclaw/3-agent-runtime

Agent 运行时

Agent 运行时(Agent Runtime)是 OpenClaw 用于 AI Agent 交互的执行引擎。它在多个 Provider(提供方,包括 OpenAI、Anthropic、Google 等)之间协调模型调用、工具执行、上下文管理和会话状态。

架构概述

Agent 运行时由多个相互关联的系统组成,将高层 Agent 逻辑与底层模型 Provider 及本地系统工具桥接起来。它通过 resolveSessionLaneresolveGlobalLane 使用基于通道(lane-based)的执行模型来管理并发。

核心组件

执行 Pipeline:管理 Agent 交互的高层生命周期,包括模型选择、认证 Profile 轮换和错误处理。它通过 enqueueCommandInLane 使用内部队列确保会话级别的一致性。

重试与故障转移:系统使用 classifyFailoverReason 对错误进行分类(例如账单错误、速率限制或上下文溢出),并通过 resolveRunFailoverDecision 决定是重试、轮换 Profile 还是触发压缩。

认证解析:OpenClaw 通过包含环境变量、models.json 和托管的 auth-profiles.json 在内的层级结构,经由 resolveAuthProfileOrder 解析凭证。

系统提示与上下文

OpenClaw 根据会话类型和环境合并模块化片段,动态构建系统提示。

  • 提示模式:系统通过 resolvePromptModeForSession 支持 full(完整)、minimal(最小)和 none(无)三种模式
  • 模块化片段:提示由 buildSkillsPromptForRunbuildTtsSystemPromptHint 等片段构建
  • 引导文件AGENTS.md 等文件的内容通过 resolveBootstrapContextForRun 自动注入到提示上下文中

模型 Provider 与认证

OpenClaw 支持多种 Provider,包括 OpenAI、Anthropic(含 Vertex AI)、Google Gemini 和 Ollama。

  • Provider 规范化normalizeProviderIdresolveDefaultModelForAgent 负责将模型名称映射到特定的 Provider 端点。
  • 认证 Profile:凭证通过 resolveModelAuthModecreateEmbeddedRunAuthController 进行管理,支持 Profile 轮换和回退模型选择。

工具系统

工具系统为 Agent 提供与文件系统交互、执行代码、搜索网页和控制浏览器的能力。

  • 工具创建createOpenClawCodingTools 将标准编码工具与 memory_searchsubagents 等扩展工具聚合在一起。
  • 工具策略:工具访问权限通过配置中的 ToolsSchema 控制,其中定义了允许/拒绝列表。
  • Provider 适配:工具会针对特定需求进行适配,例如为 Gemini 模型使用 sanitizeToolsForGoogle

命令与自动回复

OpenClaw 具有完善的命令系统,可拦截以 / 开头的用户消息,并在其到达 AI Agent 之前进行处理。

  • 命令检测:Gateway 检测 /model/approve 等命令
  • 自动回复逻辑runReplyAgent 管理从接收消息到生成响应的过渡,包括处理”思考”块和状态更新。

上下文压缩

当会话历史对于模型的上下文窗口来说过大时,运行时会触发压缩系统来总结历史记录。

  • 压缩触发:当超过 DEFAULT_CONTEXT_TOKENS 或发生上下文溢出错误时,由 compactEmbeddedPiSession 触发。
  • 压缩后同步:压缩完成后,运行时调用 runPostCompactionSideEffects,确保 Agent 能感知到已总结的状态。

自动化与编排

运行时通过内置的调度和子 Agent 管理支持复杂的编排。

  • 自动化与 Cron:任务使用特定的调度语法进行管理,可以投递到主会话或隔离会话
  • ACP 与子 Agent:Agent 控制协议(ACP,Agent Control Protocol)允许通过工具进行子 Agent 编排,并使用 isSubagentSessionKey 进行追踪

https://deepwiki.com/openclaw/openclaw/3.1-execution-pipeline

执行 Pipeline

Agent 执行 Pipeline 通过一系列不同的处理阶段,将入站消息转换为模型响应。

执行阶段

Pipeline 包含七个关键阶段:

阶段函数职责
输入处理parseReplyDirectivesdetectCommand解析指令并检测命令
模型解析resolveModelAsyncrunWithModelFallback选择模型并处理故障转移
系统提示buildEmbeddedSystemPrompt从工作区组装系统提示
执行runReplyAgentrunEmbeddedPiAgent协调回合生命周期
工具分发createOpenClawCodingTools创建工具并执行策略
响应处理subscribeEmbeddedPiSessionbuildReplyPayloads流式传输增量并投递回复
状态管理updateSessionStoreEntrycompactEmbeddedPiSession更新元数据并压缩上下文

Pipeline 调用链

执行流程经过四个嵌套层级:

L1:runReplyAgent — 队列策略、后处理、用量上报

L2:runAgentTurnWithFallback — 针对压缩和瞬态错误的重试循环

L3:runEmbeddedPiAgent — 通道排队、模型解析、认证 Profile 迭代

L4:runEmbeddedAttempt — 工作区设置、工具创建、单次模型调用

错误分类

Pipeline 将原始 Provider 错误映射到内部类型:

  • 上下文溢出:通过 “isContextOverflowError” 触发自动压缩
  • 账单错误:致命错误,停止重试
  • 速率限制:触发认证 Profile 轮换
  • 超时:通过重试逻辑检测和处理

认证 Profile 轮换

当一个模型失败时,系统会遍历可用的认证 Profile:

  1. Profile 发现:获取该模型的已排序 Profile
  2. 冷却检查:除非必要,跳过处于冷却期的 Profile
  3. 执行:使用特定的 authProfileId 调用 runEmbeddedAttempt
  4. 反馈:记录失败情况并更新 Profile 状态

上下文溢出与压缩

当会话超出模型的上下文窗口时:

  1. 检测:模型错误匹配溢出模式
  2. 压缩compactEmbeddedPiSession 总结历史记录并截断逐字稿
  3. 保护applyPiAutoCompactionGuard 在预算耗尽时阻止运行
  4. 截断truncateOversizedToolResultsInSession 主动移除过大的工具输出

系统维护自动上下文管理,以防止压缩后立即再次溢出。


https://deepwiki.com/openclaw/openclaw/3.2-system-prompt-and-context

系统提示与上下文

本页说明 OpenClaw 如何为每次 Agent 运行构建系统提示。提示由模块化片段组装而成,基于配置、会话状态和运行时上下文。同时也涵盖动态上下文注入逻辑、提示模式(full/minimal/none)以及引导文件处理。


概述

OpenClaw 为每次 Agent 运行构建自定义系统提示,而非使用静态默认值。构建过程主要由 src/agents/system-prompt.ts:189-681 中的 buildAgentSystemPrompt() 函数控制。这种模块化方法允许系统根据特定 Channel、可用工具和工作区配置为 Agent 定制指令。

来源: src/agents/system-prompt.ts:189-681src/agents/pi-embedded-runner/run/attempt.ts:125-127


系统提示构建 Pipeline

系统提示的构建涉及解析运行时参数、调用插件钩子以及组装模块化文本块。runEmbeddedPiAgent 函数通过 buildSystemPromptParams 收集所有必要上下文来启动此过程。

提示组装流程

来源: src/agents/pi-embedded-runner/run.ts:95-175src/agents/system-prompt.ts:189-681src/agents/pi-embedded-runner/run/attempt.ts:94-95


提示模式

OpenClaw 支持 PromptMode 类型(src/agents/system-prompt.ts:18)中定义的三种提示模式。这些模式控制系统提示中包含哪些片段,以优化 token 使用并使 Agent 专注于特定任务。

模式包含的片段主要用途
"full"所有片段(默认)主 Agent 会话、面向用户的私信
"minimal"工具、工作区、运行时、安全、Skills子 Agent、Cron 任务、隔离任务
"none"仅基础身份标识行特殊内部任务

提示模式通过 resolvePromptModeForSessionsrc/agents/pi-embedded-runner/run/attempt.ts:144)解析。子 Agent 会话(通过 isSubagentSessionKey 检测)和 Cron 会话默认为 minimal 模式,以节省上下文预算(src/agents/pi-embedded-runner/compact.ts:28)。

来源: src/agents/system-prompt.ts:13-18src/agents/pi-embedded-runner/run/attempt.ts:144src/agents/system-prompt.test.ts:96-133


模块化片段

系统提示由离散的片段组装而成。在 full 模式下,所有片段均处于激活状态;在 minimal 模式下,部分片段会被移除。

片段构建函数用途
SkillsbuildSkillsSection用于选择和读取 SKILL.md 文件的指令
内存(Memory)buildMemorySectionmemory_search 和混合检索的使用指南
已授权发送者buildUserIdentitySection列出允许列表中的用户 ID,可选哈希处理
当前时间buildTimeSection用于调度的动态时区和日期注入
回复标签(Reply Tags)buildReplyTagsSection在支持的平台上使用 [[reply_to_current]] 的语法
消息(Messaging)buildMessagingSectionsessions_sendsubagents 工具的使用指南
文档(Documentation)buildDocsSection指向本地和远程 OpenClaw 文档
语音(Voice/TTS)buildVoiceSection启用语音功能时的 TTS(文字转语音)使用提示

来源: src/agents/system-prompt.ts:21-174src/agents/system-prompt.test.ts:96-133


工作区上下文与引导注入

OpenClaw 会自动将工作区中的特定文件注入到提示中,以提供即时的项目特定上下文。此功能由 resolveBootstrapContextForRun()src/agents/pi-embedded-runner/run/attempt.ts:46)处理。

注入文件

以下文件被优先注入到 # Project Context 部分:

  • AGENTS.mdSOUL.mdTOOLS.mdIDENTITY.mdUSER.mdHEARTBEAT.md
  • MEMORY.md(或回退到 memory.md
  • BOOTSTRAP.md(主要用于新工作区)

预算与截断

为防止上下文溢出,注入受 OpenClawConfig 中的限制约束:

  • 单文件限制agents.defaults.bootstrapMaxCharssrc/agents/pi-embedded-helpers.ts:67
  • 总量限制agents.defaults.bootstrapTotalMaxCharssrc/agents/pi-embedded-helpers.ts:69

若文件超出这些限制,将被截断,并通过 buildBootstrapPromptWarningsrc/agents/bootstrap-budget.ts:41)注入警告。

引导数据流

来源: src/agents/pi-embedded-runner/run/attempt.ts:40-46src/agents/pi-embedded-helpers.ts:67-69src/agents/bootstrap-budget.ts:40-45


Skills 与提示压缩

当可用的 Skills 数量较多时,OpenClaw 采用分层压缩策略,在不超出模型上下文窗口的情况下将它们纳入提示。

  1. 完整格式:包含 Skill 名称、位置和完整描述。
  2. 紧凑格式:若完整格式超过 maxSkillsPromptChars,OpenClaw 切换到 formatSkillsCompact,省略描述,仅包含 <name><location>src/agents/skills/compact-format.test.ts:49-55)。
  3. 截断:若即使是紧凑格式也过大,则执行二分搜索,尽可能多地包含 Skills,并添加类似 included X of Y skills 的警告(src/agents/skills/compact-format.test.ts:104-114)。

来源: src/agents/skills/compact-format.test.ts:78-163src/agents/skills/workspace.js:8-11


动态上下文与身份标识

时间处理

提示包含用户时区和当前日期。OpenClaw 通过 buildTimeSectionsrc/agents/system-prompt.ts:84-89)注入时区字符串。

所有者身份与哈希

已授权发送者列于 ## Authorized Senders 部分。

  • 原始模式:显示字面 ID(例如手机号码)。
  • 哈希模式:显示 12 字符的 HMAC-SHA256 哈希(src/agents/system-prompt.ts:60-66)。
  • 稳定哈希:若提供了 ownerDisplaySecret,则使用密钥 HMAC,确保 ID 在不同会话中保持稳定,同时保护隐私(src/agents/system-prompt.test.ts:71-94)。

来源: src/agents/system-prompt.ts:60-89src/agents/system-prompt.test.ts:7-69


上下文压缩与摘要

当会话历史增长过大时,OpenClaw 执行**压缩(Compaction)**操作。这涉及对旧消息进行摘要,为新回合释放上下文空间。

  • Token 估算:使用 estimateMessagesTokens 计算当前上下文使用量(src/agents/compaction.ts:99-103)。
  • 安全剥离:在将消息发送给 LLM(大语言模型)进行摘要之前,stripToolResultDetails 会移除冗长的工具输出(如大型文件内容),以节省 token 并提升摘要质量(src/agents/compaction.ts:101)。
  • 标识符保留:摘要提示包含严格指令,要求精确保留 UUID、文件名和 API 密钥(src/agents/compaction.ts:34-36)。
  • 重试逻辑:摘要调用被包装在带指数退避的 retryAsync 中,以处理瞬态模型错误(src/agents/compaction.retry.test.ts:75-88)。

来源: src/agents/compaction.ts:34-103src/agents/compaction.retry.test.ts:71-170


https://deepwiki.com/openclaw/openclaw/3.3-model-providers-and-authentication

模型 Provider 与认证

本文档描述 OpenClaw 如何管理 AI 模型 Provider 配置、处理认证凭证,以及在 Agent 执行期间解析 Provider 详情。涵盖 openclaw.json 配置与运行时 models.json 文件之间的交互,以及凭证发现层级。

有关 Gateway 级别认证(WebSocket token、密码、Tailscale),请参阅认证与授权章节。有关完整配置 Schema 详情,请参阅配置参考章节。


认证 Profile 与凭证存储

模型 Provider 的凭证存储在 auth-profiles.json 中,位于每个 Agent 的状态目录(~/.openclaw/agents/<agentId>/agent/auth-profiles.json)。AuthProfileStore 逻辑负责管理此存储。

Profile ID 结构

Profile 使用标识符格式 <provider>:<name>

  • API 密钥:通常使用 default 名称(示例:anthropic:default
  • OAuth:通常以用户邮件地址为键(示例:openai-codex:user@example.com

凭证类型

系统通过 Provider secret 解析处理多种凭证格式:

类型描述用途
api_key标准 API 密钥Anthropic、OpenAI 和 xAI 等 Provider
oauth基于 token 的流程需要刷新的服务(Codex、Copilot、Gemini CLI)
SecretRef间接引用对环境变量的引用(例如 ${OPENAI_API_KEY}

Provider 配置与发现

OpenClaw 实现两层配置系统:openclaw.json 中的显式设置,以及供 Agent 运行时使用的生成型 models.json

models.json Pipeline

ensureOpenClawModelsJson 函数通过将显式用户配置与自动发现的 Provider 合并并应用规范化步骤,来协调 Agent 模型清单的生成。

隐式发现与自动发现

当 OpenClaw 检测到有效凭证或可用的本地服务时,会自动启用 Provider:

  • 本地 Provider:通过 API 探测(/api/tags)和基础 URL 解析发现 Ollama 模型
  • 云端发现:处理 Amazon Bedrock 等 Provider 的隐式解析
  • 规范化normalizeProviders Pipeline 确保 Provider ID 和基础 URL 的一致性

有关发现 Pipeline 的详细信息,请参阅 Provider 规范化章节。


运行时认证与额外参数

当 Agent 发起请求时,resolveModel Pipeline 确定认证方式以及要传输的参数。

Provider 运行时钩子

系统使用 ProviderRuntimeHooks 将认证和规范化逻辑委托给插件。

额外参数解析

resolveExtraParams 函数合并来自三个层级的参数(temperature、maxTokens 等):

  1. 全局默认值openclaw.json 中的 agents.defaults.params
  2. 模型特定:特定 Provider/模型键的参数
  3. Agent 特定:单个 Agent 列表条目中的参数

高级传输方式(WebSocket)

对于 OpenAI 等 Provider,OpenClaw 通过 OpenAIWebSocketManager 支持持久的 WebSocket 连接。这可实现增量工具结果回合并降低延迟。若 WebSocket 连接失败,系统会自动回退到标准 HTTP streamSimple

有关特定 OAuth 和自定义 Provider 实现的详细信息,请参阅 OAuth 与自定义 Provider 章节。


模型选择与别名

模型使用 <provider>/<model-id> 语法进行引用。

规范化与覆盖

系统应用 normalizeResolvedModel,确保所有必填字段(如 input: ["text"])均存在。它还允许 Provider 级别覆盖 baseUrlapi 类型。

模型别名

用户可以定义短名称别名以简化交互。这些别名通过 buildModelAliasLines 处理。


https://deepwiki.com/openclaw/openclaw/3.3.1-provider-normalization

Provider 规范化

概述

Provider 规范化是 OpenClaw 将来自各种来源(配置文件、环境变量和插件)的模型 Provider 定义转换为 Agent 运行时所使用的标准格式的过程。

规范化 Pipeline

该过程分两个主要阶段进行:

阶段一:显式 Provider 规范化

normalizeProviders 函数处理配置中 models.providers 部分显式定义的 Provider。关键规范化步骤包括:

  1. 基础 URL 规范化:去除空白并确保 Provider 端点尾部斜杠行为的一致性。

  2. API 密钥解析:识别密钥是否为 Secret Marker(环境变量或安全存储引用),并解析配置字符串中的 ${ENV_VAR} 语法。

  3. 模型兼容性:根据 Provider 类型自动应用兼容性标志。例如,applyNativeStreamingUsageCompat 确保 Moonshot 等 Provider 在流式响应期间正确上报 token 使用量。

  4. Secret 管理:追踪由 SecretRef(外部 secret)管理的 Provider,通过 enforceSourceManagedProviderSecrets 防止在配置更新时被明文覆盖。

阶段二:隐式 Provider 发现

resolveImplicitProviders 函数无需显式配置,即可发现通过环境或活跃认证 Profile 可用的 Provider。

按类别划分的发现逻辑:

Provider 类别发现逻辑
本地/自托管通过 resolveOllamaApiBase 发现 Ollama
云平台使用环境凭证和 AWS SDK 发现 Amazon Bedrock
托管服务GitHub Copilot token 解析和模型列举
基于插件通过插件 SDK 注册的自定义 Provider(Google Gemini、Qwen Portal)

Copilot 与 Bedrock 发现

  • GitHub Copilot:通过查找活跃的 GitHub CLI 会话或特定环境变量来发现,然后映射到 OpenAI 兼容接口。

  • Amazon Bedrock:使用 AWS SDK 列出已配置区域(如 us-east-1)中可用的基础模型,并使用 bedrock-converse-stream 映射到标准模型配置格式。

Models.json 同步

Pipeline 的最终步骤将规范化后的状态持久化到 Agent 工作区,确保 Agent 运行时拥有预计算好的可用模型清单。

planOpenClawModelsJson 函数

该函数将新规范化的 Provider 映射与磁盘上已有的 models.json 进行比较,并生成包含三种可能结果的执行计划:

  • skip:无需更改,文件已是最新
  • noop:配置已更改但生成的模型列表完全相同
  • write:必须持久化新的 models.json

原子写入与锁定

为防止并发配置更改期间发生损坏:

  1. 进程内锁定withModelsJsonWriteLock 确保在 Node.js 进程中,同一目标路径同时只有一次写入操作。

  2. 原子重命名writeModelsFileAtomic 先写入 .tmp 临时文件,然后使用 fs.rename 替换目标文件。

  3. 权限强制:通过 ensureModelsFileMode 将文件限制为仅所有者可读(0o600)。


https://deepwiki.com/openclaw/openclaw/3.3.2-oauth-and-custom-providers

OAuth 与自定义 Provider

OpenClaw 提供了超越 API 密钥的可扩展认证机制,包括 OAuth 2.0(开放授权)流程、基于设备的认证,以及通过其插件系统进行的自定义 Provider 发现。

认证模式

OpenClaw 支持五种主要认证策略:

  • API 密钥:标准 Bearer token 认证
  • OAuth:带托管访问和刷新 token 的完整 OAuth 2.0 流程
  • 设备码(Device Code):交互式设备配对流程(例如 Qwen Portal)
  • Token:临时会话或设置 token(例如 Anthropic setup-token
  • 自定义:插件定义的认证逻辑

认证 Profile 系统

AuthProfileStore 作为凭证的中央存储库,通常持久化在 Agent 的状态目录中。

实体角色
AuthProfileCredential涵盖 API 密钥、OAuth 及其他凭证变体的联合类型
OAuthCredential专门处理 accessrefreshexpires 字段
ProviderAuthResult认证方法返回的标准载荷,包含 Profile 和配置补丁
buildOauthProviderAuthResult用于为基于 OAuth 的登录构建标准结果的辅助函数

OAuth 与 Provider 运行时架构

OpenClaw 使用插件驱动的运行时模型,将模型请求桥接到底层凭证。ProviderPlugin 接口定义了 Provider 如何处理认证和模型发现。

主要实现

Google Gemini CLI 集成 Google Provider 通过 createGoogleThinkingPayloadWrapper 支持复杂的认证和载荷包装,与 providerRuntimeDeps 集成以进行流式函数包装。

OpenAI Codex 与 OAuth 流程 openai-codex Provider 是 OAuth 集成的典型示例:

  • 基础 URL 默认为 https://chatgpt.com/backend-api
  • 传输规范化为 openai-codex-responses API
  • 通过 resolveCodexAuthIdentity 从访问 token 解析身份标识

Venice AI 发现 Venice AI 通过 venice-models.ts 使用专门的模型发现逻辑,确保为 OpenClaw Gateway 进行正确的规范化处理。

自定义 Provider 发现

OpenClaw 允许扩展注册自定义 Provider,使第三方插件能够将新的 LLM 后端注入到运行时注册表中。

插件 Provider 注册

插件使用 ProviderPlugin 接口注册能力。providerContractRegistry 缓存条目以优化 Agent 初始化期间的模型发现。

能力契约

Provider 按其能力进行分类,以确保正确的路由和流式包装器应用:

API 类型标识符示例包装器
OpenAI WSopenai-websocketOpenAIWebSocketManager
AnthropicanthropiccreateAnthropicBetaHeadersWrapper
OllamaollamacreateConfiguredOllamaCompatNumCtxWrapper
X.AIxaicreateTestXaiFastModeWrapper

运行时参数管理

OpenClaw 使用集中式 resolveExtraParams 逻辑合并来自多个来源的参数:

  1. 默认值cfg.agents.defaults.params
  2. 模型特定cfg.agents.defaults.models[provider/modelId].params
  3. Agent 特定:活跃 Agent ID 的 agent.params
  4. 净化:移除 __proto__constructor 等内部属性

此参数合并机制确保灵活的层级化配置,同时通过防止属性注入来规避安全漏洞。

https://deepwiki.com/openclaw/openclaw/3.4-tools-system

https://deepwiki.com/openclaw/openclaw/3.4-tools-system

工具系统(Tools System)

OpenClaw 中的工具系统(Tools System)使 Agent 能够通过调用称为”工具(Tool)“的结构化、带类型的函数,将自身能力扩展到文本生成之外。这些工具允许 Agent 与文件交互、运行 Shell 命令、管理子进程、自动化浏览器(Browser)、处理消息等。工具的使用受一套完整的策略管道(Policy Pipeline)管控,以确保上下文的合理性和安全性。

本页面对工具系统进行高层概述,涵盖工具集的创建与规范化、基于策略的过滤、针对特定提供商的适配,以及工具执行。详细的技术讨论和使用示例请参见下方链接的子页面。

相关页面:


工具组装管道(Tool Assembly Pipeline)

OpenClaw 通过构建一个有序的 AnyAgentTool 对象数组,来为 Agent 的每一轮运行组装可用工具。该组装过程由 Agent 配置和当前执行上下文共同管控。

组装过程遵循以下关键阶段:

  1. 工具来源(Tool Sourcing):基础工具从多个来源获取:
    • 来自 @mariozechner/pi-coding-agent 的基础 codingTools
    • 通过 createOpenClawTools 按功能组织的 OpenClaw 原生工具
    • 由频道插件(Channel Plugin)通过 listChannelAgentTools 贡献的额外工具
    • 专用工具,如 execprocessapply_patch
  2. 基础工具替换(Base Tool Mutation):某些基础工具会被替换或移除:
    • 文件系统工具 readwriteedit 会根据选项被替换为 OpenClaw 版本或沙箱变体(createSandboxedReadTool 等)
    • bash 工具被移除,由 exec 工具取代
  3. 策略过滤(Policy Filtering):完整的工具列表会通过分层策略过滤管道(applyToolPolicyPipeline),根据全局策略、Agent 特定限制、频道组、沙箱模式和子 Agent 深度限制,有选择地允许或拒绝工具
  4. 后处理(Post-Processing):工具会经过针对特定提供商的 Schema 规范化(例如,为兼容语言模型 API 而执行 cleanToolSchemaForGemini),并应用执行包装器以强制执行循环检测(wrapToolWithBeforeToolCallHook)和中止信号

工具创建流程(Tool Creation Flow)


工具清单与来源(Tool Inventory and Sources)

OpenClaw 的 Agent 工具集由以下部分组成:

1. 基础编码工具(Base Coding Tools)

从上游 @mariozechner/pi-coding-agent 包导入,这些工具主要提供文件系统读/写/编辑能力。

工具替换或移除方式OpenClaw 源文件
read替换为 createOpenClawReadTool() 或沙箱变体src/agents/pi-tools.read.ts
write替换为 createHostWorkspaceWriteTool() 或沙箱变体src/agents/pi-tools.read.ts
edit替换为 createHostWorkspaceEditTool() 或沙箱变体src/agents/pi-tools.read.ts
bash移除(由 exec 工具取代)src/agents/pi-tools.ts

2. OpenClaw 原生工具(OpenClaw-Native Tools)

src/agents/openclaw-tools.ts 中的 createOpenClawTools() 创建,这些工具按运行时(Runtime)、文件系统(Filesystem)、会话(Sessions)、内存(Memory)、网页(Web)、UI、自动化(Automation)、消息(Messaging)和设备节点(Device Nodes)等逻辑分组组织。

分组工具
Runtime(运行时)exec, process
Filesystem(文件系统)read, write, edit, apply_patch
Sessions(会话)sessions_list, sessions_spawn, sessions_yield, session_status
Memory(内存)memory_search, memory_get
Web(网页)web_search, web_fetch
Media/UI(媒体/界面)browser, canvas, image, pdf, tts
Automation(自动化)cron, gateway
Nodes(节点)nodes

基于策略的工具过滤(Policy-Based Tool Filtering)

工具可用性由多层策略系统过滤。该系统聚合来自全局设置、Agent 特定限制、提供商级别覆盖和子 Agent 深度限制的策略。

策略解析与应用(Policy Resolution and Application)

工具 Profile(Tool Profiles)

工具 Profile 定义完整的允许列表(Allowlist)。Profile 可全局设置,也可按提供商或 Agent 进行覆盖。

Profile包含工具用途
minimalsession_status高度限制的最小集
coding文件系统、运行时、会话、内存和图像工具用于编码、工作区操作
messaging消息工具和会话工具用于聊天、以消息为主的场景
full允许所有工具默认设置

工作区隔离与沙箱(Workspace Containment and Sandboxing)

为保证安全,当 tools.fs.workspaceOnly 启用或在沙箱内运行时,OpenClaw 会对文件系统工具强制执行工作区隔离。

工作区守卫应用(Workspace Guard Application)


针对特定提供商的适配(Provider-Specific Adaptations)

工具在通过 normalizeToolParameters 交付给模型 API 之前,会进行适配以兼容各种提供商。

提供商调整方式
OpenAI标准规范化
Gemini通过 cleanToolSchemaForGemini 移除 minLengthpattern 及其他不兼容关键字
Claude应用 patchToolSchemaForClaudeCompatibility 进行 Schema 结构调整

工具执行拦截器(Tool Execution Interceptors)

两个关键包装器拦截所有工具执行:

  1. 循环检测包装器(wrapToolWithBeforeToolCallHook:应用运行时循环检测(可在 tools.loopDetection 中配置)。检测重复工具调用和乒乓(ping-pong)模式
  2. 中止信号包装器(wrapToolWithAbortSignal:监听外部 AbortSignal,若触发则取消工具执行

关键代码实体汇总(Summary of Key Code Entities)

符号文件描述
createOpenClawToolssrc/agents/openclaw-tools.ts组装 OpenClaw 原生工具集
AnyAgentToolsrc/agents/pi-tools.types.ts所有 Agent 可调用工具的类型定义
applyToolPolicyPipelinesrc/agents/tool-policy-pipeline.ts按有序管道步骤应用工具过滤
normalizeToolParameterssrc/agents/pi-tools.schema.ts规范化工具 JSON Schema 以确保兼容性
resolveExecConfigsrc/agents/pi-tools.ts合并各 Agent 和全局 exec 工具配置

https://deepwiki.com/openclaw/openclaw/3.4.1-tool-policies-and-filtering

工具策略与过滤(Tool Policies & Filtering)

概述

OpenClaw 实现了分层的工具策略解析方式,根据全局设置、Agent 配置、Profile 规则和所有权边界来控制哪些工具被允许使用。该系统还会根据消息提供商、模型提供商和执行上下文执行额外的过滤。

策略解析层级(Policy Resolution Hierarchy)

有效工具策略通过合并多个作用域的设置来确定:

  1. 全局配置(Global Configuration):来自 config.tools 的基础工具权限
  2. Agent 级设置(Agent-Level Settings):来自 agents[].tools 的每个 Agent 的覆盖配置
  3. Profile 过滤(Profile Filtering):通过 resolveToolProfilePolicy 执行基于 Auth Profile 的限制
  4. 所有者限制(Owner Restrictions):通过 applyOwnerOnlyToolPolicy 强制执行仅限所有者的工具

负责编排此解析过程的关键函数:

  • resolveEffectiveToolPolicy - 合并全局和 Agent 策略
  • resolveToolProfilePolicy - 应用基于 Profile 的过滤
  • applyOwnerOnlyToolPolicy - 将特权工具限制为仅会话所有者可用
  • isToolAllowedByPolicies - 根据合并后的策略验证工具

该系统执行工具策略管道(buildDefaultToolPolicyPipelineSteps),在 Agent 初始化期间按顺序运行验证步骤。

仅限所有者及特权限制(Owner-Only & Privileged Restrictions)

某些工具被标记为 ownerOnly,将执行权限限制为仅会话操作者。这可防止群聊中的非所有者执行特权操作,例如修改 gateway 或访问宿主文件系统。

执行机制:

  • applyOwnerOnlyToolPolicy 函数在工具过滤期间强制执行限制
  • 特权工具(例如 gateway、某些 exec 配置)通常以此方式进行限制
  • isSubagentSessionKey 检查用于为嵌套会话解析子 Agent 专属的工具策略

Exec 审批与宿主策略(Exec Approvals & Host Policy)

OpenClaw 区分沙箱工具执行和宿主系统执行。宿主执行(exec 工具)需要一个额外的安全层,称为 Exec 审批(Exec Approvals)

Exec 工具配置(Exec Tool Configuration)

resolveExecConfig 确定运行时参数:

  • 宿主访问(Host Access):通过工具配置中的 host 设置控制
  • 安全 Profile(Security Profiles)safeBinssafeBinProfiles 限制可用的二进制文件
  • 审批(Approvals):用于人工确认的 ask 要求配置

Exec 审批工作流(Exec Approvals Workflow)

当工具请求宿主执行时,evaluateExecAllowlist 根据以下内容验证命令:

  1. 手动允许列表(Manual Allowlist):已批准二进制路径的 Glob 模式
  2. 安全二进制文件(Safe Bins):在 Profile 约束范围内无需审批即可运行的二进制文件
  3. Skill 二进制文件(Skill Bins):来自已安装 Skill 的二进制文件(如果启用了 autoAllowSkills

该系统通过 isDangerousHostEnvVarName 强制执行环境变量清理,以过滤敏感变量。

针对特定提供商的过滤(Provider-Specific Filtering)

OpenClaw 根据当前消息或模型提供商动态过滤工具。

消息提供商过滤(Message Provider Filtering)

applyMessageProviderToolPolicy 移除与传入频道不兼容的工具。例如,当消息提供商是语音时,文本转语音(TTS)工具会被拒绝。

模型提供商过滤(Model Provider Filtering)

applyModelProviderToolPolicy 防止与模型原生能力冲突。当模型提供商原生支持网页搜索时,OpenClaw 的内部 web_search 工具会被抑制以避免冲突。

插件工具集成(Plugin Tool Integration)

插件(Plugin)贡献的工具会集成到 Agent 工具集中,并受同一策略框架约束。

集成过程:

  1. 发现(Discovery):通过 getPluginToolMeta 识别插件工具
  2. 收集(Collection)createOpenClawTools 聚合核心工具和插件工具
  3. 规范化(Normalization):使用针对特定提供商的 Schema 清理器对参数进行规范化
  4. 最终处理(Finalization)applyToolPolicyPipeline 执行验证步骤
代码实体作用
AnyAgentTool受策略约束的工具的类型定义
TOOL_DENY_BY_MESSAGE_PROVIDER针对特定提供商阻止的静态映射表
resolveToolLoopDetectionConfig防止递归工具执行循环
evaluateExecAllowlist宿主命令验证的主入口
isDangerousHostEnvVarName过滤敏感环境变量

https://deepwiki.com/openclaw/openclaw/3.4.2-exec-and-background-processes

执行与后台进程(Exec & Background Processes)

概述

OpenClaw 的 Exec 工具(execProcess 工具(process 支持以两种模式执行 Shell 命令:

  • 前台模式(Foreground mode):阻塞执行直至命令完成
  • 后台模式(Background mode):立即返回并附带会话 ID,用于异步追踪

两个工具都使用共享的内存进程注册表(Process Registry),负责追踪运行中和已完成的会话、缓冲输出流、管理生命周期状态转换,并强制执行会话作用域隔离以隔离 Agent 进程。

工具生命周期与数据流(Tool Lifecycle and Data Flow)

通过 exec 提交的命令会作为子进程生成。如果在自动后台化超时(backgroundMs)之前完成,结果会同步返回。否则,进程通过 markBackgrounded 转换为后台状态。process 工具允许客户端轮询、列出或控制正在运行的会话。进程退出后,会话在 TTL 到期前保留在内存中,之后进行清理。

Exec 工具参数(Exec Tool Parameters)

参数类型默认值描述
commandstring必填要执行的 Shell 命令
backgroundMsnumber10000 ms自动后台化阈值延迟
backgroundbooleanfalse是否立即以后台模式运行
timeoutSecnumber1800执行超时终止时间
hoststring”sandbox”执行宿主(“sandbox”、“gateway” 或 “node”)
securitystring取决于配置安全模式(“deny”、“allowlist” 或 “full”)

进程注册表(Process Registry)

进程注册表在内存中维护所有活跃和已完成的会话,包含输出缓冲区和元数据。

会话状态机(Session State Machine)

注册表追踪 ProcessSession 对象(运行中或后台化的)和 FinishedSession 对象(在 TTL 期间保留的已终止会话)。

输出缓冲策略(Output Buffering Strategy)

  • 待处理缓冲区(Pending Buffers):分别收集输出流,直到由 process 工具通过 drainSession 清空
  • 聚合输出(Aggregated Output):所有输出的单一字符串,上限为 maxOutputChars
  • 尾部缓冲区(Tail Buffer):存储最后 2000 个字符的输出,用于快速预览

宿主执行与审批(Host Execution & Approvals)

当命令在 gatewaynode 宿主上运行时,会受到 Exec 审批系统的约束。

关键安全组件(Key Security Components)

  1. 允许列表评估(Allowlist Evaluation):检查命令是否与审批策略中的模式匹配
  2. 安全二进制文件(Safe Bins):允许特定的仅限 stdin 的二进制文件(例如 jqgrep)在满足严格条件时无需显式允许列表即可运行
  3. 可变文件绑定(Mutable File Binding):对于脚本,OpenClaw 在审批时绑定文件操作数的 SHA256 哈希值;如果文件在执行前发生变化,则拒绝运行
  4. 严格内联求值(Strict Inline Eval):启用后,即使二进制文件在允许列表中,node -epython -c 等解释器也需要显式审批

进程环境与加固(Process Environment & Hardening)

执行环境受到严格控制以防止沙箱逃逸:

  • 环境变量清理(Env Sanitization):剥离危险变量,如 LD_PRELOADDYLD_INSERT_LIBRARIESNODE_OPTIONS
  • Windows 加固(Windows Hardening):在 Windows 上为 runCommandWithTimeout 禁用 Shell 执行,以防止 cmd.exe 注入
  • 子进程桥接(Child Process Bridge):确保 SIGTERM 等信号正确转发,并在退出时清理监听器

配置参考(Configuration Reference)

Exec 工具配置(tools.exec

类型描述
securitystring”deny”、“allowlist” 或 “full”
askstring”off”、“on-miss” 或 “always”
autoAllowSkillsboolean自动允许来自已安装 Skill 的二进制文件
safeBinsstring[]允许的仅限 stdin 二进制文件列表
strictInlineEvalboolean将内联代码求值视为仅需审批

https://deepwiki.com/openclaw/openclaw/3.4.3-memory-and-search

内存与搜索(Memory & Search)

架构概述(Architecture Overview)

内存系统将 Agent 工作区和会话逐字稿中的 Markdown 文件索引到一个带有向量嵌入和全文搜索(Full-Text Search)能力的 SQLite 数据库中。Agent 通过两个主要工具与索引内存交互:

  • memory_search:使用混合向量/FTS 对索引块进行语义搜索。
  • memory_get:有针对性地读取特定文件或行范围。

MemoryIndexManager 与状态管理

内存系统的运行时状态通过 memory-state.ts 管理,负责追踪已注册的运行时(Runtime)、刷新计划和提示词(Prompt)部分。

插件注册(Plugin Registration)

插件可以在其 register 阶段注册内存专属能力:

  • registerMemoryRuntime:定义索引和检索的核心逻辑
  • registerMemoryEmbeddingProvider:添加新的嵌入模型(例如 OpenAI、本地 Llama)
  • registerMemoryFlushPlanResolver:确定何时应持久化或压缩内存

内存状态管理函数(Memory State Management Functions)

函数作用
getMemoryRuntime()根据配置槽解析当前活跃的内存实现
resolveMemoryFlushPlan()根据消息数量或 Token 限制计算是否需要内存刷新
buildMemoryPromptSection()生成动态”内存(Memory)“块,注入到 Agent 的系统提示词中

混合搜索实现(Hybrid Search Implementation)

该系统使用 sqlite-vec 进行向量操作,使用标准 SQLite FTS5 进行关键字匹配。

向量搜索在查询嵌入与 chunks_vec 表之间执行余弦相似度计算。

  • sqlite-vec 已加载且嵌入提供商处于活跃状态时启用
  • 使用 embedding_cache 避免对相同查询的冗余 API 调用。

全文搜索(Full-Text Search,FTS)

FTS5 提供回退和精细化层。

  • 使用 BM25 算法对结果进行排序。
  • 对于嵌入可能模糊的特定标识符(例如 UUID、函数名)的查找至关重要。

混合合并(Hybrid Merge)

结果使用加权组合合并:Score = (VectorWeight * VectorScore) + (FtsWeight * FtsScore)

同步与文件监视器(Sync and File Watchers)

MemoryIndexManager 通过基于 chokidar 的文件监视器和会话事件监听器维护索引的新鲜度。

同步触发器(Sync Triggers)

  1. 文件监视器(File Watcher):监控 MEMORY.mdmemory/ 目录以检测手动编辑
  2. 会话同步(Session Sync):监听 AgentMessage 事件。当会话达到增量阈值(例如 4 条新消息)时,触发增量索引更新。
  3. 定时同步(Interval Sync):后台定时器(默认 30 分钟)确保外部变更的最终一致性。

将”自然语言空间”桥接到”代码实体空间”(Bridging “Natural Language Space” to “Code Entity Space”)

图示:内存运行时解析(Diagram: Memory Runtime Resolution)

此图展示”内存(Memory)“的自然语言概念如何映射到具体的代码类和注册键。

图示:搜索工具执行流程(Diagram: Search Tool Execution Flow)

此图追踪搜索请求从 memory_search 工具到内部提供商架构的完整路径。


https://deepwiki.com/openclaw/openclaw/3.4.4-browser-automation

浏览器自动化(Browser Automation)

核心目的(Core Purpose)

浏览器自动化使 Agent 能够在完全隔离的会话中”对基于 Chromium 的浏览器(Chrome、Brave、Edge、Chromium)进行 Agent 驱动的控制”。该系统为 Agent 创建了一条专用的”安全通道”,不会干扰用户的个人浏览。

架构亮点(Architecture Highlights)

Profile 管理(Profile Management):OpenClaw 维护多个隔离的浏览器 Profile,具有三种操作模式:

  • openclaw:由 OpenClaw 自行管理
  • clawd:由 OpenClaw 守护进程管理
  • existing-session:通过 MCP Transport 附加到真实用户的浏览器会话

控制服务(Control Service):作为本地服务运行在环回端口上(默认 18791),管理 Profile 启动、标签页生命周期和命令分发。系统通过 BrowserSsrFPolicyConfig 包含 SSRF(服务端请求伪造)防护以验证导航目标。

关键组件(Key Components)

传输协议(Transport Protocols)

  • CDP(Chrome DevTools Protocol,Chrome 开发者工具协议):用于通过 WebSocket/REST API 管理托管 Profile
  • Chrome MCP(Managed Chrome Protocol,托管 Chrome 协议):用于通过扩展中继访问现有用户会话

标签页操作(Tab Operations):Agent 可使用 browserOpenTab、browserCloseTab 和 browserFocusTab 命令打开、关闭和聚焦标签页。

交互方式(Interaction Methods):该系统通过 browserAct 工具支持类似用户的操作,包括点击、输入、拖拽和滚动。

观察工具(Observation Tools):Agent 可通过 DOM/Aria 树(browserSnapshot)、视觉截图或 PDF 导出来捕获页面状态。

安全注意事项(Security Considerations)

该子系统强制执行导航守卫以防止 SSRF 攻击。配置选项包括:

  • dangerouslyAllowPrivateNetwork:控制对 localhost/内部 IP 的访问
  • hostnameAllowlist:支持通配符的显式域名白名单
  • 通过 --no-sandbox 标志为容器化环境切换 Linux 沙箱

远程节点支持(Remote Node Support)

部署在远程节点上的 Agent 可以通过节点代理路由(Node Proxy Routing)使用本地浏览器实例,从而允许基于云的 Gateway 控制本地桌面机器上的浏览器。

常见问题(Common Issues)

在 Linux 系统上,基于 Snap 的 Chromium 面临 AppArmor 约束限制。解决方案包括安装官方 Google Chrome 包,或配置 attachOnly: true 并使用 --remote-debugging-port=18800 手动启动浏览器。


https://deepwiki.com/openclaw/openclaw/3.4.5-web-search-and-fetch

网页搜索与抓取(Web Search & Fetch)

本节记录 OpenClaw Agent 运行时中网页搜索和抓取工具的集成情况。

概述

OpenClaw 在 group:web 工具组下提供内置网页工具:

  • web_search:跨多个提供商执行查询,提供结构化结果或带引用的 AI 合成答案
  • web_fetch:抓取原始 HTTP 内容,可选择提取为 Markdown 或纯文本,并包含 SSRF 防护

这些工具是对 browser 工具的补充,后者用于处理动态 JavaScript 驱动的网页上更繁重的交互。

要点:

  • 工具访问由 tools.allowtools.deny 列表控制
  • 搜索提供商根据可用的 API Key 自动检测
  • 网页抓取操作经过严格验证以防止私有网络访问

网页搜索工具集成(Web Search Tool Integration)

支持的提供商与特性(Supported Providers & Features)

提供商结果风格API Key 要求
Brave Search结构化摘要BRAVE_API_KEY
Firecrawl结构化摘要FIRECRAWL_API_KEY
GeminiAI 合成 + 引用GEMINI_API_KEY
Grok (xAI)AI 合成 + 引用XAI_API_KEY
Kimi (Moonshot)AI 合成 + 引用KIMI_API_KEY
Perplexity结构化摘要PERPLEXITY_API_KEY
Tavily结构化摘要TAVILY_API_KEY

实现与数据流(Implementation and Data Flow)

网页搜索工具通过 createOpenClawCodingTools 管道集成。工具使用的 Schema 已针对特定提供商(如 Claude)进行修补以确保兼容性。

网页抓取工具与 SSRF 防护(Web Fetch Tool & SSRF Protection)

目的与特性(Purpose and Features)

web_fetch 工具从指定 URL 检索内容,并通过安全防护措施防止服务端请求伪造(SSRF)。

关键防护措施:

  • 路径验证(Path Validation):请求不会逃出预期边界
  • SSRF 防护(SSRF Protection):防止从 localhost、内部 IP 范围(10.0.0.0/8、192.168.0.0/16)或云元数据端点(169.254.169.254)抓取内容
  • 资源限制(Resource Limits):抓取的内容受大小约束,以防止上下文溢出

实现细节(Implementation Details)

抓取逻辑使用以安全为核心的工具与工作区交互:

  • 符号链接拒绝(Symlink Rejection):防止通过符号链接攻击读取工作区外的文件
  • 硬链接拒绝(Hardlink Rejection):可选地拒绝具有多个硬链接的路径
  • 原子验证(Atomic Verification):对已打开的文件句柄使用 fstat,确保在检查和读取之间文件身份的一致性

自适应读取与上下文管理(Adaptive Reading and Context Management)

OpenClaw 使用**自适应分页(Adaptive Paging)**来确保内容适合模型的上下文窗口。

  • 动态限制(Dynamic Limits)resolveAdaptiveReadMaxBytes 函数根据 modelContextWindowTokens 计算最优读取大小
  • 截断处理(Truncation Handling):大文件提供带偏移量指令的 ReadTruncationDetails,用于继续读取
  • MIME 检测(MIME Detection):使用 detectMime 分析抓取的内容以确定呈现格式

配置与工具策略(Configuration and Tool Policies)

网页工具受全局和每个 Agent 的工具策略管控。用户可以通过配置限制特定 Agent 或提供商的网页访问。


https://deepwiki.com/openclaw/openclaw/3.4.6-image-and-media-tools

图像与媒体工具(Image & Media Tools)

概述

本页面记录 OpenClaw 中实现的图像和媒体工具,涵盖图像生成与理解的基础设施、PDF 处理,以及处理音频、视频和图像输入的更广泛媒体理解管道。此外,还记录了文本转语音(TTS)和语音能力。

1. 目的与范围(Purpose and Scope)

OpenClaw 提供一套全面的系统,用于在 AI Agent 工作流中处理媒体输入,包括图像、音频、视频和文档。图像和媒体工具的目的是:

  • 通过 AI 模型提供图像生成能力(例如 OpenAI DALL-E、Fal.ai)
  • 使用视觉模型(VLM,Vision Language Model)理解和生成图像的文字描述
  • 使用原生 PDF 支持或 OCR 从 PDF 和其他文档类型中提取信息
  • 将音频转录为文本并理解视频内容
  • 集成多个第三方提供商和 CLI 工具以支持回退和尽力操作
  • 将媒体理解结果(逐字稿/描述)整合到 Agent 的自然语言上下文中

2. 图像工具(Image Tools)

图像工具提供两项主要功能:图像生成(Image Generation)(从提示词创建图像)和图像理解(Image Understanding)(描述现有图像)。

2.1 核心实现(Core Implementation)

createImageTool 函数构建 Agent 使用的图像工具。它通过委托给具备视觉能力的模型来处理图像内容描述。

模型选择(Model Selection)resolveImageModelConfigForTool 确定有效的视觉模型。它优先使用 agents.defaults.imageModel 中的显式配置,或尝试将主模型与同一提供商的视觉模型配对(例如,将 MiniMax 文本模型与 MiniMax-VL-01 配对)。

提示词检测(Prompt Detection):使用 detectImageReferences 检测用户提示词中的图像引用,扫描文件路径(绝对路径、相对路径或家目录路径)以及 [Image: source: ...] 等消息式注释。

加载与清理(Loading & Sanitization):图像通过遵守 SandboxFsBridge 边界的 loadImageFromRef 加载。加载的图像通过 sanitizeImageBlocks 进行大小和数量清理。

2.2 媒体理解提供商集成(Media Understanding Provider Integration)

图像工具使用 MediaUnderstandingProvider 接口来集成 OpenAI、Anthropic 和 MiniMax 等后端。

  • 注册表通过 buildProviderRegistry 构建
  • runImagePrompt 执行视觉请求,如果提供商实现了 describeImages 则支持多张图像,否则通过 describeImage 逐一处理
  • 回退逻辑(Fallback Logic)runWithImageModelFallback 在主视觉模型失败时提供跨不同视觉模型的重试机制

2.3 桥接:语言空间到代码实体(Bridge: Language Space to Code Entities)

图像工具将自然语言提示词桥接到具体的视觉模型调用,使 Agent 能够在其执行管道中分析和描述图像。

3. PDF 处理(PDF Processing)

OpenClaw 支持通过提取文本或在可用时使用原生 PDF 视觉能力(例如 Claude 3.5 Sonnet)来分析 PDF 文档。

3.1 实现(Implementation)

PDF 工具通过 createPdfTool 构建。它允许 Agent 通过指定文件路径和可选提示词来”读取”文档。

页面范围解析(Page Range Parsing)parsePageRange 将 “1,3,5-7” 等字符串转换为页码数组,并以最大页数限制为上限。

原生 vs OCR(Native vs. OCR)providerSupportsNativePdf 检查模型是否能直接处理 PDF。如果不能,工具会回退到使用 pdf-extract 工具进行文本提取。

模型选择(Model Selection)resolvePdfModelConfigForTool 遵循与图像工具类似的配对逻辑,优先使用以文档处理见长的模型,例如 anthropic/claude-opus-4-6

4. 媒体理解管道(Media Understanding Pipeline)

媒体理解管道在 Agent 生成回复之前自动处理入站媒体(音频、视频、图像)。

4.1 关键组件(Key Components)

  • 附件规范化(Attachment Normalization):入站媒体元数据通过 normalizeBase64Payload 规范化为标准格式
  • 沙箱化(Sandboxing)resolveSandboxedMediaSource 确保工具或用户提供的媒体路径在沙箱根目录或允许的临时目录内解析,防止路径遍历攻击
  • 操作执行器(Action Runner)runMessageAction 处理媒体相关操作的分发,例如将附件发送到消息频道

4.2 入站媒体的数据流(Data Flow for Inbound Media)

媒体通过标准化的附件参数在系统中流转,在每个阶段都强制执行安全边界以防止未授权的文件访问。

5. TTS 与语音能力(TTS & Voice Capabilities)

OpenClaw 提供文本转语音(TTS)功能,允许 Agent 在支持语音的频道(例如 Telegram、iOS 原生客户端)中”说话”。

5.1 架构(Architecture)

TTS 系统通过 src/tts/tts.ts 进行抽象,后者重新导出 speech-runtime 实现。

  • 提供商(Providers):支持 OpenAI、ElevenLabs 和 Microsoft Edge TTS。提供商通过 getTtsProvider 选择
  • 合成(Synthesis)synthesizeSpeech 根据解析后的 TtsConfig 将文本转换为音频缓冲区
  • 懒加载(Lazy Loading):TTS 核心在首次运行时访问时懒加载,以减少启动开销

5.2 命令集成(Command Integration)

talk-voice 插件提供列出和设置语音的命令。

  • 状态(Status):显示当前提供商和 voiceId
  • 列出(List):使用 api.runtime.tts.listVoices 从提供商获取可用语音,并通过 formatVoiceList 格式化
  • 设置(Set):使用选定的 voiceId 或名称更新 Gateway 配置。内部 Gateway 调用者需要 operator.admin 权限范围

5.3 TTS 配置映射(TTS Configuration Mapping)

设置项来源目的
providertalk.provider活跃的 TTS 后端(例如 elevenlabs
voiceIdtalk.voiceId要使用的具体语音 ID
autotalk.auto自动 TTS 模式(offalwaysinboundtagged

6. 图像生成(Image Generation)

图像生成由实现 generateImage 能力的提供商插件(例如 OpenAI、Fal)处理。

  • OpenAI 实现(OpenAI Implementation)buildOpenAIImageGenerationProvider/v1/images/generations 端点提交提示词。当提供了 inputImages 时,还支持通过 /v1/images/edits 端点进行图像编辑
  • Payload 处理(Payload Handling)hydrateAttachmentPayload 确保生成的图像在发送到频道之前被正确编码为 base64 并分配文件名
  • SSRF 防护(SSRF Protection):使用 loadWebMedia 从远程 URL 获取生成的图像,同时应用 maxBytes 限制和安全检查
  • 安全(Security):自定义 Base URL 的私有网络路由被阻止,以防止内部网络扫描

https://deepwiki.com/openclaw/openclaw/3.5-commands-and-auto-reply

命令与自动回复(Commands & Auto-Reply)

本页面记录 OpenClaw 的命令系统和自动回复逻辑,使用户能够通过独立消息(如 /status/help)调用功能,同时管控 Gateway 如何检测命令、授权发送者、处理指令和编排响应。

命令系统概述(Command System Overview)

OpenClaw 支持灵活可扩展的命令架构,包含以下组件:

  • 命令注册表(Command Registry):所有命令集中注册,包含文本别名、参数定义、作用域和分类
  • 命令检测(Command Detection):传入消息经规范化和解析以识别命令,支持精确别名匹配和正则模式
  • 命令处理器管道(Command Handler Pipeline):命令经过异步处理器(例如 handleConfigCommandhandleAllowlistCommand)处理请求、生成回复或阻止进一步处理

命令注册表结构(Command Registry Structure)

注册表使用详细的元数据定义命令,用于解析和 UI 集成。别名支持灵活调用(例如 /new/reset)。处理器在执行前使用 rejectUnauthorizedCommandrequireCommandFlagEnabled 执行授权检查。

文本命令 vs 原生命令(Text vs Native Commands)

作用域描述示例
text仅限文本命令/compact, /bash
native平台原生斜杠命令capabilities.nativeCommands
both两种方式均注册/status, /help

Discord、Telegram 和 Slack 插件支持原生命令。频道插件通过定义 capabilities 来表明支持 nativeCommands

命令检测管道(Command Detection Pipeline)

  • 通过修剪和处理平台特定语法(例如 Telegram 机器人提及)来规范化命令
  • 专用解析器提取操作和作用域(例如用于 list/add/remove 的 parseAllowlistCommand
  • 配置命令使用基于路径的解析来获取/设置 openclaw.json 中的键

会话命令概览(Session Commands Overview)

命令目的处理逻辑
/new开始新会话,清除历史记录command:new 事件
/reset/new 的别名command:reset 事件
/stop中止当前 Agent 运行command:stop 事件

重置命令流程(Reset Command Flow):命令触发内部钩子,这些钩子可以执行自动化任务,例如在清除前保存会话历史记录。session-memory 钩子监听 command:newcommand:reset 事件。

选项与指令(Options & Directives)

指令(Directive)是修改 Agent 行为的特殊内联提示,在 getReplyFromConfig 管道中处理。

  • 内联指令(Inline directives):影响当前轮次(例如更改模型或详细程度)
  • 持久化(Persistence):指令可以保存到会话状态以影响后续轮次

状态与指令(Status & Directives)

状态消息提供当前 Agent 上下文的反馈,包括 Token 使用量、模型选择和工作区详情。

指令影响 Agent 的推理风格和运行时行为:

  • 模型覆盖(Model Overrides):用户通过 /model 为某一轮次或会话切换模型
  • 详细程度与思考(Verbosity & Thinking):指令控制可见的”思考(thinking)“或”推理(reasoning)“输出
  • 媒体理解(Media Understanding):指令触发图像或链接的预处理

Gateway 中的自动回复逻辑(Auto-Reply Logic in the Gateway)

Gateway 的消息处理遵循结构化管道:

  1. 预处理(Preprocessing):根据需要应用媒体和链接理解
  2. 钩子执行(Hook Execution):触发 message:receivedmessage:preprocessed 钩子
  3. 命令处理(Command Handling):独立命令被拦截并处理
  4. Agent 执行(Agent Execution):如果没有命令拦截,runPreparedReply 调用 LLM Agent 循环

命令授权流程(Authorization Flow for Commands)

  • 授权通常委托给特定频道适配器(例如 isTelegramExecApprovalAuthorizedSender
  • 特权命令如 /config 需要 Gateway 客户端具备 operator.admin 权限范围

总结

本节展示了 OpenClaw 的命令和自动回复生态系统,通过检测、授权和专用处理器将用户输入桥接到代码实体。子页面提供更深层的技术细节:

  • 命令系统(Command System) — 命令定义、参数解析、原生命令、菜单系统
  • 状态与指令(Status & Directives) — 状态消息构建、指令解析、持久化

https://deepwiki.com/openclaw/openclaw/3.5.1-command-system

https://deepwiki.com/openclaw/openclaw/3.5.1-command-system

Command System(命令系统)- OpenClaw 文档

概述

OpenClaw 的 Command System(命令系统)为系统内所有命令提供了统一、可扩展的接口。它同时支持文本命令(如 /help)和各平台的原生命令(Discord slash commands、Telegram bot commands 等)。

主要特性包括:

  • 集中化的命令定义,支持文本形式和原生形式
  • 使用别名映射和正则匹配实现高效的命令检测
  • 健壮的位置参数解析,支持类型化参数和动态选项
  • 遵守平台约束的原生命令生成
  • 来自 skill 和插件的动态命令
  • 平台特定的命令覆盖

Command 定义结构

ChatCommandDefinition

命令由 ChatCommandDefinition 类型表示,定义了:

  • 内部命令 key
  • 文本别名和原生别名
  • 带类型和描述的参数
  • Scope(作用域,文本、原生或两者兼有)
  • 用于组织的分类 Category

Command Scopes(命令作用域)

Scope描述示例
text仅文本命令/compact
native仅原生 slash 命令Discord 语音命令
both文本和原生均可用/help/status

Command Categories(命令分类)

命令按分类组织,包括:

  • status(help、commands、status)
  • options(model、think、fast)
  • session(stop、reset、compact)
  • tools(skill)

Command Registry(命令注册表)

构建注册表

Command Registry 在加载时构建一次并缓存。它合并了:

  • 代码中定义的静态核心命令
  • 来自 Channel 插件的 Dock 命令
  • 从用户可调用的 skill 动态构建的 Skill 命令

核心命令

KeyNative Name文本别名分类
helphelp/helpstatus
commandscommands/commandsstatus
statusstatus/statusstatus
skillskill/skilltools
modelmodel/model, /modelsoptions
thinkthink/think, /thinking, /toptions

动态命令

Skill 命令: 用户可调用的 skill 会暴露为命令。Skill 名称会被清洗以符合平台限制,并转换为带文本别名的命令 key。

插件命令: 插件可通过 registerPluginCommand 动态注册命令,支持自定义处理器、原生命令名称和进度消息。

命令检测与规范化

检测流水线

传入消息通过以下方式解析以检测命令:

  1. 使用规范化别名的 Set 进行精确匹配
  2. 带参数命令的正则模式匹配

normalizeCommandBody 函数

该函数通过以下方式规范化命令输入:

  • 裁剪空白至第一行
  • 移除命令后的可选冒号(如 /think: high/think high
  • 如适用则去除 Telegram @bot 提及
  • 将文本别名解析为规范命令

转换示例:

  • /t high/think high
  • /help@openclaw/help

文本别名映射

别名解析使用一个从所有命令文本别名构建的映射,缓存规范化的小写形式到其内部规范 key。

命令检测 Set 与正则

两种互补机制实现检测:

策略实现使用场景
精确匹配规范化别名的 Set快速检测(如 /help
正则匹配从所有别名编译的正则带参数的命令检测

命令参数

CommandArgDefinition

命令可定义位置参数,包含:

  • 类型(string、number、choice 等)
  • 描述
  • 可选性(必填/可选)
  • 静态或动态选项列表

位置参数解析

参数从原始命令字符串中按以下方式提取:

  1. 按空白拆分
  2. 按定义顺序分配 token
  3. 使用 captureRemaining 消费剩余输入

参数格式化器

命令可定义自定义格式化器,将参数值序列化回字符串,用于显示或重新下发命令。

命令参数菜单

原生命令支持在 Discord 和 Telegram 等平台上的交互式选项菜单。示例:不带参数的 /tts 显示含 onoffstatusprovider 等选项的菜单。

原生命令集成

平台特定的原生命令名称覆盖

某些命令使用平台特定名称(如 Discord 使用 /voice 替代 /tts)。

原生命令 Spec 生成

原生命令从 ChatCommandDefinition 条目生成。流水线应用平台特定验证:

平台命令名格式最大参数数每参数最大选项数
Discord[a-z0-9_-]{1,32}2525
Telegram无严格限制不限不限
Slack[a-z0-9_-]+自定义自定义

动态选项解析

命令参数选项可以是静态列表,也可以根据上下文(provider、model 等)动态计算。例如,/think 命令的思考级别因 model/provider 而异。

命令授权

授权流程

系统按如下方式计算命令授权:

  • 若设置了 commands.allowFrom,则由其专门控制谁可以发出命令
  • 否则,授权来自 Channel 配对和带 commands.useAccessGroups 的允许列表
  • 内联快捷方式(/help/commands/status/whoami)绕过消息要求

实现细节

注册表缓存

命令列表和别名映射被缓存,仅在活跃插件注册表变更时刷新。

命令体解析

解析涉及三个步骤:

  1. 使用 normalizeCommandBody() 规范化输入
  2. 使用别名映射查找规范命令
  3. 将参数解析为结构化的 CommandArgs

Skill 命令清洗

Skill 名称会被清洗以符合原生命令命名规则:

  • 转换为小写
  • 将非字母数字字符替换为下划线
  • 截断至 32 个字符
  • 对冲突追加后缀(_2_3 等)

总结

OpenClaw 的命令系统通过以下方式统一了文本平台和原生平台的处理:

  • 支持多种暴露形式的单一定义
  • 高效的检测和别名解析
  • 带动态选项的类型化位置参数解析
  • 遵守平台约束的自动生成原生命令
  • 无缝的 skill 和插件命令集成
  • 与 Channel 策略集成的授权

该设计确保命令在 OpenClaw 的多平台环境中保持一致、可扩展且安全。


https://deepwiki.com/openclaw/openclaw/3.5.2-status-and-directives

Status & Directives(状态与指令)

目的与范围

本页面记录了 OpenClaw 中的状态消息系统内联指令。状态消息提供关于当前 Session(会话)、model 配置、token 用量及相关运行时参数的运行时信息。内联指令如 /think/verbose/reasoning 为用户提供了一种在聊天消息内部修改 agent 行为的方式,无需发起完整命令。指令的持久化、授权和解析逻辑也在本页面涵盖。

对于独立 slash 命令(如 /help/stop),请参见 Command System (3.5.1)


状态消息

状态消息呈现当前 Session 的详细运行时信息,包括版本、model 配置、fallback 状态、token 用量、费用估算、缓存统计、上下文窗口利用率、provider 使用配额,以及当前队列/激活状态。

状态消息构建流水线

函数 buildStatusMessage()(定义于 src/auto-reply/status.ts)编排状态消息的完整构建。它组合了各种数据源,如 Session 条目、配置默认值和实时 provider 用量,以渲染用于回复或工具中显示的完整多行文本状态。

关键内部辅助函数解析各个组件——例如,resolveSelectedAndActiveModel() 确定当前活跃的 model 与已选择的 model。

状态消息触发时机

状态消息通常在响应特殊命令或工具时生成:

  • /status 命令调用
  • agent 的 session_status 工具调用
  • Control UI 状态仪表盘查询

这将状态显示逻辑统一到多个 Gateway 组件中。

读取 Transcript 用量以获取精确 Token 计数

当启用 includeTranscriptUsage 时,系统从 Session 的 JSONL transcript 文件中读取最后 8KB。该内容被解析以获取用量条目,从而得到精确的 token 计数和缓存统计,然后与 Session 存储数据结合以报告最准确的 token 用量。

此方法支持精确的上下文窗口报告和费用估算。


Directives(指令)概述

Directive(指令) 是嵌入在聊天消息中的内联命令类注解,用于动态控制 agent 行为,而无需触发完整的 slash 命令。它们在 prompt 发送给 model 之前被剥除,因此 directive 不会出现在补全上下文中。

Directive 与 Command 的对比

方面DirectiveCommand
语法/think high(内联)/status(独立)
位置内联或仅文本仅独立消息
持久性条件性(仅指令消息)不适用
Model 视角发送给 model 前被剥除不适用(命令不传给 model)
授权需要已授权的发送者按命令 scope

仅指令消息 vs 内联行为

消息处理器区分消息是仅含指令还是指令与文本混合。

示例 1:仅指令消息(持久化)

输入:  /think high /verbose on
结果: 设置保存到 Session
回复: "✓ Think: high • Verbose: on"

示例 2:内联指令(临时性)

输入:  /think low explain the codebase
结果: Think 级别仅对本轮有效
Model 收到: "explain the codebase"

该设计允许用户即时更改 agent 行为,无论是否持久化设置。

指令授权

只有当发送者在 Channel 中被授权执行命令时,指令才会被执行。否则,指令 token 将被视为普通文本,未经修改地发送给 model。

授权评估考虑:

  • 指令允许列表的 commands.allowFrom 配置
  • 否则,Channel 配对、允许列表和 commands.useAccessGroups

未授权的尝试不会报错;指令只是被忽略。


指令类型及其效果

以下是主要内联指令及其典型用法和持久化行为:

指令描述持久性SessionEntry 字段
/think设置推理深度(offminimallowmediumhighxhigh仅指令消息持久化thinkingLevel
/verbose控制工具输出详情级别(offonfull仅指令持久化verboseLevel
/reasoning控制 model 推理是否作为独立消息输出仅指令持久化reasoningLevel
/elevated控制 exec 工具审批行为(offonaskfull仅指令持久化elevatedLevel
/fast启用/禁用 fast mode(加速响应)仅指令持久化fastMode
/model覆盖 Session 的 model仅指令持久化providerOverridemodelOverride
/exec配置 exec 工具主机/安全/审批仅指令持久化execOverrides
/queue配置消息队列(防抖/上限/丢弃)仅指令持久化perMessageQueueMode

指令处理流水线

消息处理器中的指令处理机制按以下步骤执行:

  1. 分词:解析消息文本以提取指令 token(如 /think high
  2. 授权检查:验证发送者具有命令授权
  3. 解析:将 token 转换为结构化指令对象
  4. 持久化决策:判断消息是仅指令还是内联
  5. 应用:将指令应用到当前 Session 状态或请求上下文
  6. 剥除:从发送给 model 的文本中移除指令 token
  7. 响应:生成确认或为本轮应用临时变更

Sub-Agent(子代理)状态集成

状态消息还包含关于活跃 Sub-Agent 和任务的信息。listControlledSubagentRuns() 检索由当前 Session 管理的运行。

状态行包括:

  • 活跃 Sub-Agent 运行数量
  • 每个受控 Sub-Agent 的任务状态
  • 如适用则包含资源消耗

状态消息与指令 Session 状态

状态行和指令设置都通过 SessionEntry 数据结构同步:

SessionEntry 字段指令控制?状态显示行
thinkingLevelThink: {level}
verboseLevelverbose 或 verbose:full
reasoningLevelReasoning: {level}
elevatedLevelelevated 或 elevated:{level}
fastModeFast mode: on/off
providerOverrideModel 行
modelOverrideModel 行
contextTokensContext 行:已用 token/限制
inputTokensToken 用量显示
outputTokensToken 用量显示
compactionCount上下文压缩次数

连接自然语言与代码实体的图示

1. 状态消息组件与代码函数

状态消息构建流水线集成了多个数据源:

  • Session 状态 → 来自 store 的 SessionEntry 对象
  • Model 信息resolveSelectedAndActiveModel() 解析
  • Token 用量 → Transcript 解析和聚合
  • Provider 配额 → 实时 API 用量指标
  • 格式化输出formatUsageString() 和显示辅助函数

2. 内联指令处理流程与关键函数

指令流程依次经过:

  1. getReplyDirectives() - 主提取点
  2. parseDirectiveTokens() - 分词逻辑
  3. applyDirectives() - Session 状态修改
  4. stripDirectivesFromText() - model 输入准备
  5. persistDirectiveSettings() - 仅指令消息的条件存储

https://deepwiki.com/openclaw/openclaw/3.6-context-compaction

上下文压缩(Context Compaction)- OpenClaw

概述

上下文压缩是 OpenClaw 中的一个关键机制,旨在当 Session token 数量接近 model 限制时,通过摘要和压缩冗长的对话历史来管理 AI agent 的内存使用。

主要特性

自动溢出检测 运行时监控 token 用量,当上下文 token 超过预定阈值(最小容量 8192,警告阈值 32768)时异步触发压缩。

有保障的执行 压缩在严格的安全控制下运行,包括:

  • 可配置超时的时间限制执行
  • 防止无限循环的最大重试次数限制
  • 良性中止的取消原因(用户取消、token 不足)

Model 驱动的摘要 系统不是简单截断,而是向 LLM model 发出摘要调用,这些 model 可以是专为该任务优化的专用或更小的 model。

内存完整性

  • 缓冲的工具输出在压缩前被刷新到持久内存
  • 压缩后,内存索引被刷新以维持准确的搜索能力

压缩生命周期

  1. 检测:Token 计数监控在超过阈值时触发
  2. 预刷新:异步缓冲的工具结果被保存
  3. 摘要:LLM 生成对话历史的简洁摘要
  4. 截断:Session transcript 被物理重写,旧消息替换为摘要
  5. 同步:内存搜索索引更新以反映压缩后的内容

Model 选择

系统支持灵活的压缩 model 选择:

  • 通过 agents.defaults.compaction.model 显式覆盖
  • Provider 变更会清除缓存的认证以触发新的凭证解析
  • 若未指定覆盖则回退到 Session 当前 model

安全保证

“压缩需要对 Session 文件进行独占锁定,以防止在重写和后续内存索引期间发生并发修改。“

可扩展性

OpenClaw 在压缩生命周期中暴露了可组合的 hook:

  • before_compaction:在压缩前运行;可检查或取消
  • after_compaction:在成功压缩后运行
  • session:在压缩后 Session 状态更新时触发

这些使插件能够注入验证、指标收集或增强的压缩策略。


https://deepwiki.com/openclaw/openclaw/3.7-automation-and-cron

自动化与 Cron - OpenClaw 文档

概述

OpenClaw 内置了一个自动化引擎,围绕 CronService 管理计划任务、周期性 agent 轮次和主动的”心跳”交互。

1. Cron 作业架构

1.1 作业类型与 Session 目标

作业按 sessionTarget 分类,决定执行上下文和工作区隔离:

Session 目标用途Payload描述
main主 agent SessionsystemEvent系统级事件;仅默认 agent
isolated唯一临时 SessionagentTurn与主状态隔离,用于后台任务
current活跃 SessionagentTurn使用活跃 Session key
session:<key>命名 SessionagentTurn目标特定 Session 标识符

1.2 调度语法

支持两种调度机制:

  • Cron 表达式:标准 5 字段 crontab 语法(如 "0 * * * *" 表示每小时)
  • Every 间隔:每隔 N 毫秒重复一次,可选择锚定到基准时间戳

错峰:为避免同时执行导致的峰值,使用 SHA-256 和取模运算确定性地计算每个作业在”错峰窗口”内的稳定偏移,确保作业在错峰间隔内均匀分布。

1.3 数据流:作业执行

执行流水线:

  • 到期时,作业以并发和超时策略执行
  • main 作业将系统事件入队以触发 agent 处理
  • Isolated 作业通过 runCronIsolatedAgentTurn 直接运行
  • 结果通过 webhook 或消息 Channel 出站适配器投递

2. 隔离 Agent 运行器

隔离 Session Cron 作业使用唯一 Session 来促进后台 agent 任务,避免污染主对话内存。

2.1 执行生命周期

  1. Session 解析:通过 resolveCronAgentSessionKey 分配独特 Session key
  2. 配置加载:解析 agent 配置、工作区目录、授权档案和 model fallback
  3. 运行 Agent 轮次:通过 runCronIsolatedAgentTurn 核心执行
  4. 输出提取:选择最后一个非空文本作为有意义的输出
  5. 投递分发:通过 dispatchCronDelivery 分发消息

2.2 投递模式

Cron 输出可以以不同模式投递:

  • None:输出仅记录在作业 Session transcript 中
  • Webhook:输出以 JSON 格式 POST 到指定 URL
  • Announce:出站消息公开发送到 Channel
  • Direct:类似 Announce 但用于一对一消息

投递目标以尽力而为的方式处理;根据作业配置,瞬时故障可能被重试或抑制。

3. 心跳集成

3.1 与 Cron 的关系

HeartbeatRunner 处理周期性的 agent 唤醒。Cron 作业可指定 "wakeMode": "next-heartbeat" 以推迟执行到下一个心跳周期,从而同步任务运行。

3.2 心跳工作流与配置

心跳系统监控 agent 状态、系统事件队列和调度以触发唤醒周期:

  • 心跳间隔和提示可按 agent 配置或使用默认值
  • 运行整合系统事件和过期的 Cron 作业
  • 回复经过结构化处理,可根据配置截断响应

4. Cron 工具 API

Agent 通过内置的 cron 工具以编程方式管理 Cron 作业。

4.1 暴露的操作

  • list:返回 Cron 作业列表
  • add:创建带调度和投递选项的新 Cron 作业
  • update:编辑现有作业,允许重新调度
  • remove:删除 Cron 作业
  • run:触发手动执行

4.2 提醒上下文注入

使用 contextMessages 参数 > 0 创建作业时,工具从 Session 历史中获取最近 N 条消息。这些消息附加到 Cron 作业 payload 中,使 agent 在执行提醒时能够回忆背景上下文。

5. 可靠性与错误处理

5.1 重试策略

CronService 实现了精细的重试机制:

  • 使用正则模式分析错误以识别可重试类别(速率限制、网络问题、超时)
  • 指数退避,默认调度:30 秒、1 分钟、5 分钟、15 分钟、60 分钟
  • 最大重试次数可配置;超过重试次数后发送故障告警

5.2 启动追赶流程

Gateway 启动时,runMissedJobs 扫描停机期间错过的计划运行。为避免同时爆发,错过的作业在重新调度时以短暂延迟错开。


关键源文件

  • src/cron/service.ts - CronService 核心实现
  • src/cron/service/jobs.ts - 作业类型和调度
  • src/cron/service/timer.ts - 计时器、重试、执行
  • src/cron/isolated-agent/run.ts - 隔离 agent 执行
  • src/cron/isolated-agent/delivery-dispatch.ts - 投递机制
  • src/infra/heartbeat-runner.ts - 心跳集成
  • src/agents/tools/cron-tool.ts - Cron 工具 API

https://deepwiki.com/openclaw/openclaw/3.8-acp-and-sub-agents

ACP 与 Sub-Agent(子代理)

Agent Control Protocol(ACP,代理控制协议)Sub-Agent(子代理) 系统为在 OpenClaw 内编排多代理工作流提供了框架。这允许父 agent 将任务委派给在隔离 Session 中执行的子 agent。

Agent Control Protocol(ACP)

ACP 是一个用于涉及外部 AI CLI 工具(如 Codex 或 Claude Code)的复杂多 Session 编排的运行时框架。

主要特性

  • Session 恢复:通过 ID 恢复现有 ACP Session,而不是启动新的,对有状态集成至关重要
  • 流式目标:通过 streamTo 参数选择性地将输出路由到父 agent 或 UI
  • 框架集成:对带协议特定命令的外部 AI CLI 工具编排的原生支持

ACP 翻译器(AcpGatewayAgent

AcpGatewayAgent 通过将请求转换为 RPC 调用并将 Gateway 事件映射回 ACP 响应,桥接 ACP 运行时和 OpenClaw Gateway。

主要职责:

  • 将 ACP 请求(promptnewSessionloadSession)转换为 Gateway 调用
  • 将 Gateway 事件映射到 ACP PromptResponse 事件
  • 处理 Session 管理和配置
  • 管理新 Session 的速率限制
  • 优雅处理瞬时 Gateway 断线

Session 配置选项:

  • thought_level:控制 agent 思考的详细程度
  • fast_mode:启用更快的响应
  • verbose_level:设置输出详细程度
  • reasoning_level:配置推理显示
  • response_usage:在响应中包含 token 用量
  • elevated_level:控制提升权限

Sub-Agent 系统架构

Sub-Agent 是由父 agent 启动的隔离 agent Session,用于实现并行、后台或层级任务执行。每个 Sub-Agent 在自己的 Session 中运行,命名为:

agent:<agentId>:subagent:<uuid>

Sub-Agent 生命周期

  1. 调用:父 agent 调用 sessions_spawn 工具
  2. 初始化:新建 Session 并构建带工作区继承的上下文
  3. 注册表追踪:运行以元数据注册到 subagentRuns Map 中
  4. 执行:Sub-Agent 在隔离工作区中异步运行
  5. 公告:结果通过投递流水线公告回父 agent/请求者

Sub-Agent 注册表

subagent-registry.ts 模块管理活跃和已归档运行的状态与生命周期。

实体描述
subagentRunsMap<string, SubagentRunRecord>,在内存中保存活跃/已完成的运行
persistSubagentRunsToDisk()定期将注册表状态刷新到磁盘
resolveSubagentSessionStatus()将内部状态转换为用户可见的标签
生命周期事件发射器确保运行开始/结束/终止时的一致事件

技术数据流:从 Spawn 到 Announce

该流程确保任务委派、Session 隔离、结果合成,以及最终将结果广播回发起 Channel 或 agent。幂等键和重试逻辑保证在瞬时故障下的投递。

投递分发与持久化

公告逻辑

完成后,Sub-Agent 通过健壮流程报告结果:

  • 幂等公告:从 Session/运行标识符派生的确定性幂等键确保恰好一次投递
  • 指数退避重试:在投递失败时采用有上限的重试策略和退避延迟;通过辅助函数识别瞬时错误
  • 格式化和内容提取:公告 payload 包含完成文本、状态和资源用量;内部 token/嵌入被剥除

持久化绑定(Thread 绑定)

某些 Channel 支持持久的线程绑定 Sub-Agent:

  • Thread 绑定 Session:使用 thread: true 时,Sub-Agent 绑定到 Channel 特定的 thread,将消息路由到相同上下文
  • 手动焦点控制:用户使用 /focus/unfocus 命令绑定/释放 Session,通过持久绑定控制路由

代码实体映射:sessions_spawn 工具

sessions_spawn 工具参数映射:

参数类型默认值描述
runtimeEnumsubagent选择标准 Sub-Agent 或 ACP 框架
modeEnumrunrun 为一次性;session 为持久
threadBooleanfalse启用 thread 绑定(需要 mode: session
sandboxEnuminheritDocker 隔离模式(inheritrequire
resumeSessionIdStringundefined仅 ACP:恢复现有 Session
streamToEnumundefined仅 ACP:输出流目标
attachmentsArrayundefined工作区实例化的内联附件

ACP 运行时管理

AcpSessionManager 编排 ACP 运行时实例并处理 Gateway 交互。

AcpSessionManager 概述

关键函数:

  • resolveSession(params):确定 Session 状态(ready、stale、none)
  • initializeSession(params):确保 ACP 运行时可用;调用 AcpRuntime.ensureSession
  • runTurn(params):执行一个轮次;通过 SessionActorQueue 获取锁;流式传回事件
  • closeSession(params):优雅关闭 ACP Session
  • ensureRuntime(params):获取/创建带缓存的 AcpRuntime 实例
  • SessionActorQueue:管理并发访问;确保每个 Session 同时只有一个活跃轮次
  • RuntimeCache:缓存实例;管理空闲超时和驱逐

ACPX Runtime(AcpxRuntime

AcpxRuntime 实现 AcpRuntime,用于与 acpx CLI 工具交互。

主要职责:

  • ensureSession(input):启动/连接到 acpx 进程
  • runTurn(input):发送 prompt;流式传回事件;解析 JSONL 输出
  • cancel(handle):发送取消信号
  • close(handle):终止 acpx 进程
  • getCapabilities():报告运行时能力
  • checkHealth():验证可执行文件版本/功能
  • buildMcpProxyAgentCommand():构建将 acpx 作为 MCP 代理运行的命令

AcpxRuntime 还管理权限模式(approve-readsapprove-alldeny-all)和非交互式策略(denyfail),用于文件系统和资源访问。

总结

ACP 和 Sub-Agent 系统构成了一个全面的编排层,使高级 agent 工作流成为可能。ACP 为外部 CLI AI 服务提供健壮的 Session 恢复和流式传输。Sub-Agent 框架实现了带生命周期追踪、持久 thread 支持和弹性结果分发的隔离后台任务执行——全部通过 sessions_spawn 工具暴露。

它们共同支持构建复杂的并行化 AI 助手流,具有明确的职责划分、隔离性和结果投递。


https://deepwiki.com/openclaw/openclaw/4-messaging-channels

消息频道(Messaging Channels)- OpenClaw 文档

概述

OpenClaw 的消息 Channel(频道)系统将外部平台(Telegram、Discord、Slack、Signal、WhatsApp、iMessage、Matrix、Feishu 及其他)桥接到 Gateway 和 Agent Runtime。系统将消息规范化为通用格式,应用访问控制策略,并将其路由到 agent Session。

Channel 架构

OpenClaw 使用provider 监控模式,每个消息平台作为长期运行的进程运行。该设计将平台特定的复杂性抽象为统一的 ChannelPlugin 接口。每个平台实现处理:

  • 平台特定的连接和认证
  • 事件监听和消息规范化
  • Channel 特定的消息操作(发送、回应、置顶、回复)

消息规范化与工具化

每个 Channel 导出一个 ChannelMessageActionAdapter,定义 agent 如何执行平台特定操作。例如:

  • Feishu 支持带操作按钮的富卡片
  • Mattermost 支持交互按钮和回应
  • Agent Runtime 通过 describeMessageTool 等工具在各平台上一致交互

平台集成

OpenClaw 为每个平台提供专用扩展:

  • Telegram (grammY):处理对话/聊天 ID 规范化和多线程消息
  • Discord (discord.js):需要 ViewChannelSendMessages 权限;支持公会和 Channel 级别的允许列表
  • Slack (@slack/bolt):支持 Socket Mode 和 Events API,具有线程感知路由
  • WhatsApp (Baileys):管理 WebSocket 和多设备特性,支持群组提及和回应
  • Mattermost:使用持久 WebSocket 连接,支持回应和交互按钮
  • Feishu/Lark:支持富卡片、企业消息和账户生命周期管理
  • iMessage:通过本地桥接服务集成,具有 handle/chat GUID 规范化
  • LINE:支持富视觉消息,包括 Quick Replies、Location 和 Flex 卡片

策略与访问控制

DM 与群组策略

DM 策略包括:

  • pairing:新用户审批机制
  • allowlist:受限用户列表
  • open:不受限访问

群组策略管理消息接受:

  • requireMention:仅在被标记时响应
  • always:响应所有消息

安全解析器在 Channel 级别规范化条目并执行策略。

消息流与投递

出站路由与 Session Key

agent 发送的消息使用由 buildOutboundBaseSessionKey 构建的唯一 Session key,封装了 agent ID、Channel、账户和对等标识符。线程感知路由通过 resolveThreadSessionKeys 支持平台线程化。

投递逻辑

  • 分块:使用 chunkTextForOutbound 等工具智能拆分消息
  • 媒体附件:Channel 特定的发送选项支持媒体 URL、本地根目录和静默投递标志
  • 去重:检查入站更新以防止重复处理

相关文档

有关详细信息,请参见子页面:


https://deepwiki.com/openclaw/openclaw/4.1-channel-architecture

Channel 架构

概述

OpenClaw 的 Channel 架构通过统一的基于插件的系统实现与多个消息平台(Telegram、Discord、Slack、WhatsApp、Signal、iMessage 及其他)的连接。每个 Channel 实现了用于连接管理、消息规范化、安全策略和出站投递的标准化接口。

Channel 插件架构

Channel 遵循 Plugin SDK 中定义的共享插件架构。每个消息平台实现 ChannelPlugin 接口,包含以下关键组件:

  • ChannelMeta:Channel 标识和文档
  • Setup:配置适配器和 UI 向导
  • Security:DM 和群组访问控制策略
  • Messaging:目标规范化和 Session 路由
  • Outbound:消息分块和投递函数
  • Status:账户和 Channel 健康监控

每个 Channel 插件通常位于自己的扩展目录中(如 extensions/telegram/src/channel.ts)。

Provider 入口点和监控器

每个 Channel 导出一个维护连接和事件处理的监控函数:

Channel监控函数文件
TelegrammonitorTelegramProviderextensions/telegram/src/channel.ts
DiscordloadDiscordProviderRuntimeextensions/discord/src/channel.ts
SlackgetSlackRuntimeextensions/slack/src/channel.ts
WhatsApploadWhatsAppChannelRuntimeextensions/whatsapp/src/channel.ts
MattermostmonitorMattermostProviderextensions/mattermost/src/channel.ts

这些监控器处理连接设置、认证、事件轮询/WebSocket 监听,并调用规范化和路由逻辑。

消息处理流水线

入站规范化与路由

当平台事件到达时,Channel 监控器:

  1. 解析发送者和对话的平台特定标识符
  2. 使用 normalizeTarget 函数规范化消息目标
  3. 通过 buildOutboundBaseSessionKey() 构建唯一 Session key
  4. 通过 resolveThreadSessionKeys 等函数处理线程化

关键函数:

  • buildOutboundBaseSessionKey:构建用于路由的唯一对话 key
  • normalizeTarget:将平台特定目标转换为规范形式
  • resolveThreadSessionKeys:将线程化对话映射到复合 Session key

多账户与 Provider 解析

许多 Channel 支持多个并发账户。每账户凭证动态解析:

  • createScopedChannelConfigAdapter() 构建账户感知的配置解析器
  • resolveTelegramAccount() 等解析函数返回结构化账户信息
  • 使下游组件能够选择正确的 API token 和消息限制

安全与访问控制策略

Channel 集成了执行 DM 和群组策略的安全解析器:

策略类型选项描述
DM 策略openpairingallowlistdisabled控制私信访问
群组策略openallowlistdisabled控制群组消息访问
需要提及Boolean在群组中需要明确提及

createScopedDmSecurityResolver() 等标准接口涵盖策略查找和用户允许列表验证。createAllowlistProviderGroupPolicyWarningCollector 等审计辅助函数警告不安全配置。

出站投递与消息操作

消息操作适配器

ChannelMessageActionAdapter 接口使 agent 能够调用平台 UI 元素(回应、置顶、交互按钮)。示例:Mattermost 支持”send”和”react”操作。

投递机制

Channel 提供 sendText()sendMedia() 实现,并使用分块器按照平台限制拆分消息:

  1. Payload 规范化:Channel 特定规则通过 normalizePayload 准备消息
  2. 分块:长消息通过 Channel 的 chunker() 按平台限制切片
  3. 发送:调用平台特定的发送函数(如 sendMessageTelegram

平台特定实现处理文本限制(如 Signal 4000 字符限制)和媒体投递。


https://deepwiki.com/openclaw/openclaw/4.2-platform-integrations

平台集成 - OpenClaw 文档

概述

OpenClaw 通过专用 provider 实现与多个消息平台集成。每个平台都有独特的特性、认证流程和能力,被抽象到通用的消息处理流水线中。

支持的平台

平台库/驱动协议认证实时模式
TelegramgrammYTelegram Bot APIBot Token长轮询/Webhook
Discorddiscord.jsDiscord GatewayBot TokenWebSocket Gateway
Slack@slack/boltSlack Events APIBot Token + App TokenSocket Mode/HTTP
WhatsAppBaileysWhatsApp WebQR Code 配对WebSocket
Signalsignal-cliSignal Protocol账户注册SSE 流
BlueBubblesREST APIiMessage服务器密码/GUIDWebhook/轮询
FeishuCustom/SDKLark Open APIApp ID + App SecretWebhook/事件
Zalo (Bot)Custom/SDKZalo Bot APIAccess TokenWebhook
Zalo (User)zalo-jsZalo User APIQR 登录/Cookie事件监听器

Feishu(飞书/Lark)集成

Feishu 集成支持官方 Bot API 和带流式更新的复杂交互卡片,具有全面的媒体支持和基于事件的实时消息。

主要特性:

  • 带 bot 提及检测的消息解析
  • 通过 resolveAgentRoute() 进行 agent 路由
  • 通过 createFeishuReplyDispatcher() 进行回复分发
  • 使用 FeishuStreamingSession 类的流式响应
  • 通过消息回应实现的输入指示器
  • image_keyfile_key API 调用的媒体处理

Telegram 集成(grammY)

Telegram 使用 grammY 库进行 bot 操作,支持私信和群聊,具有完整的消息规范化和 Session 路由。

架构组件:

  • 通过 bot token 配置进行认证
  • 通过 grammY 更新处理器处理消息
  • 从聊天和 thread 标识符计算 Session key
  • 访问控制策略:pairingallowlistopen
  • 完整媒体支持(照片、音频、文档)
  • 带输入通知的分块消息发送

Discord 集成(discord.js)

Discord 支持使用连接到 Discord Gateway API 的官方 discord.js 库,提供复杂的路由、语音和命令集成。

Provider 特性:

  • 实时 WebSocket 连接用于事件处理
  • 带线程感知的公会和私信路由
  • 语音 Channel 操作管理
  • 原生 slash 命令集成
  • 内部排队的速率限制感知
  • 可选的 presence intent 集成
  • Sub-Agent 编排的 ACP 生命周期 hook

Slack 集成(Bolt)

Slack 集成使用 @slack/bolt 框架,原生支持 Events API 和 Socket Mode。

能力:

  • Bot 和应用级 token 认证
  • DM 和 Channel 消息监听
  • Block kit 交互性支持
  • 原生消息响应和按钮交互
  • 流式和回退消息实践

WhatsApp 集成(Baileys)

WhatsApp 使用 Baileys 库,提供 WhatsApp Web 客户端接口。

特性:

  • 基于 QR 码的 Session 认证
  • 带媒体支持的双向消息流
  • 图片、音频和文档上传/下载
  • Token 刷新和 Session 持久化

Signal 集成(signal-cli)

Signal 集成基于 signal-cli,使用其 CLI 或守护进程发送和接收安全消息。

实现:

  • 基于加密密钥的账户注册
  • 服务器发送事件(SSE)用于实时入站更新
  • 消息发送的 CLI 命令包装
  • 配对和有状态 Session key 管理

BlueBubbles(iMessage)

BlueBubbles 连接到作为网关的 iMessage 服务器。

特性:

  • 基于 Webhook 的消息接收
  • 将 iMessage 数据转换为 OpenClaw 格式
  • 基于共享密钥或 GUID 的认证

Zalo 集成

Zalo(Bot API): 稳定的 bot 接口,支持群组和私信聊天。

ZaloUser(User API): 带 QR 登录和事件监听器的类用户自动化。

媒体下载与上传

每个平台使用平台特定方案处理媒体传输:

  • Feishu: image_keyfile_key,通过带重试和超时的 API 调用包装上传/下载
  • Telegram/Discord: 带上传/下载辅助函数的原生文件 API
  • BlueBubbles: 通过专用 HTTP 客户端以 GUID URL 下载

回复分发流水线

OpenClaw 采用通用回复分发流水线,包括:

  • 输入指示器信号
  • 遵守平台限制的分块消息发送
  • 协调的媒体附件投递
  • 支持带渐进内容渲染的流式更新

平台特定策略与访问控制

平台策略机制关键函数
Feishu群组成员检查和提及门控isFeishuGroupAllowed()
ZaloDM 安全和允许列表控制平台特定验证
BlueBubbles基于 handle 的允许列表和密码验证访问控制检查
Mattermost提及门控和允许列表基于提及的授权

通过 PluginRuntime 进行运行时访问

平台插件通过标准化的 PluginRuntime 抽象访问 OpenClaw 核心服务,支持:

  • 日志和诊断
  • 配置访问
  • Agent 执行生命周期
  • Sub-Agent 编排
  • 媒体上传/下载
  • 语音/文字转语音转换
  • 网络搜索能力
  • 工具执行
  • 状态和 Session 管理
  • Channel 消息和事件处理
  • 认证和 model 凭证访问

总结

OpenClaw 将平台特定的消息集成封装在专用 Channel provider 中,每个 provider 基于原生 SDK 或协议驱动构建,并通过 PluginRuntime 暴露一致的编程模型。这些集成支持高级消息特性:流式回复、输入指示器、媒体处理、多代理 Session 路由和细粒度访问控制,使 OpenClaw 能够作为个人 AI 助手网关,无缝跨越多个通信 Channel。

https://deepwiki.com/openclaw/openclaw/4.3-policy-and-access-control

https://deepwiki.com/openclaw/openclaw/4.3-policy-and-access-control

策略与访问控制(Policy & Access Control)

概述

OpenClaw 实现了一套分层策略系统,用于管理跨平台的消息频道访问权限,涵盖 Telegram、Discord、Slack、Signal、WhatsApp 等平台。该设计区分了私信(DM)和群组/频道消息,以便应用适当的默认行为和按上下文自定义的配置。

关键策略组件包括:

  • DM 策略(DM Policies):指定对未知私信发送者的处理方式,支持 pairing(配对)、allowlist(白名单)、open(开放)或 disabled(禁用)等模式
  • 群组策略(Group Policies):规定群组/频道消息的准入条件,支持 @提及要求和白名单过滤
  • 白名单(Allowlists)allowFromgroupAllowFrom):强制执行显式发送者白名单的配置列表
  • 频道级别覆盖(Channel-Specific Overrides):支持按群组、话题/线程或账号进行策略配置

DM 策略模式(DM Policy Modes)

dmPolicy 设置控制网关在一对一对话中对未知发送者的响应方式:

模式行为适用场景
pairing未知发送者会收到一个配对码,需要在 CLI 手动批准后才能处理消息个人助手的默认推荐模式
allowlist仅处理 allowFrom 中明确列出的发送者已知联系人的严格访问控制
open不论发送者是谁,所有传入的私信均被处理公开机器人、演示或测试环境
disabled忽略/屏蔽所有来自未知发送者的私信仅限群组操作

策略解析遵循分层优先级模型,依次考虑从最具体到最通用的范围:话题/线程级别 → 群组级别 → 账号级别配置。

群组与频道策略(Group & Channel Policies)

群组策略规定群组或频道消息是否被处理以及在何种条件下处理:

模式行为适用场景
open允许群组中任意成员触发机器人;@提及控制激活条件宽松的群组交互
allowlist消息发送者必须出现在 groupAllowFrom 中,或回退到 allowFrom严格的群组交互
disabled完全屏蔽/忽略所有群组消息在群组中关闭 Agent

@提及要求(Mention Requirements)

默认情况下,群组模式要求消息 @提及机器人才能触发响应,验证方式包括:

  1. 使用平台特定语法的显式 @提及(例如 Discord 和 Slack 上的 <@botId>
  2. 将消息文本与配置的提及正则表达式模式进行匹配
  3. 回复或回应机器人之前的消息(线程/回复识别)

白名单与发送者标识符(Allowlists and Sender Identifiers)

白名单通过 allowFromgroupAllowFrom 配置明确控制哪些用户可以与助手交互:

平台私信发送者 ID 格式群组/频道 ID 格式
Telegram数字用户 ID(如 8734062810负数 Chat ID(如 -1001234567890
Discord字符串用户 ID(如 "123456789"字符串 Guild/Channel ID
Slack字符串用户 ID(如 "U123ABC"字符串频道 ID(如 "C123ABC"
WhatsAppE.164 格式电话号码(如 "+15551234567"群组 JID
SignalE.164 格式电话号码(如 "+15551234567"群组 ID
iMessageHandle(如 "+15551234567""email@example.com"Chat ID、Chat GUID 或 Chat Identifier
Mattermost用户 ID(如 "userId"频道 ID(如 "channelId"
Feishu用户 ID(如 "ou_xxxxxxxx"Chat ID(如 "oc_xxxxxxxx"
MS Teams用户 ID(如 "userId"对话 ID(如 "conversationId"
LINE用户 ID(如 "Uxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"群组 ID 或房间 ID
Google Chat用户 ID(如 "users/123456789"Space ID(如 "spaces/123456789"

关键细节

  • allowFrom 是私信的主要白名单
  • groupAllowFrom 可选用于群组发送者;若未设置,则回退到 allowFrom
  • 白名单中的通配符 "*" 表示该上下文的策略实际上为”开放”
  • 白名单条目会经过平台特定的规范化和验证

执行审批策略(Exec Approval Policy)

对于调用可能执行命令的 Agent 工具的敏感操作,OpenClaw 实现了执行审批系统:

  • 审批请求被分发到已配置的 targetdmchannelboth
  • approvers 列表控制谁有权授予批准
  • 可选的 agentFiltersessionFilter 可限制需要审批的执行范围
  • 审批提示和工作流集成到消息频道中,在执行前要求明确的同意

平台特定细节(Platform-Specific Nuances)

Telegram

  • 支持在启用论坛功能的群组中按**话题(per-topic)**设置精细策略
  • 在个人号码模式(自我聊天)下,特殊逻辑会禁用已读回执并强制执行配对以确保安全
  • 白名单条目的 ID 通常为数字用户 ID,群组 ID 为较大的负数 Chat ID
  • dmPolicypairing 时,配对过程会通过私信向未知发送者发送审批码

Discord

  • 需要特权**消息内容意图(Message Content Intent)**才能查看消息文本并执行策略
  • 允许在 Guild 内使用扩展白名单类型按用户和角色 ID 进行过滤
  • 支持与 Telegram 和 Slack 类似的自定义群组策略和 @提及控制
  • 用户和频道使用字符串 ID

Slack

  • 支持 Socket Mode 和传统 HTTP API;在 HTTP 模式下,请求必须在策略执行前验证 signingSecret
  • 拥有与其他平台一致的 dmPolicyallowFrom 概念
  • 支持由已批准用户控制的交互式回复和按钮
  • 白名单由 Slack 用户和频道 ID 组成,规范化时会去除 user: 等前缀

WhatsApp

  • 使用全球电话号码(E.164 格式)来标识允许的发送者
  • 使用群组 JID 进行群组消息识别
  • 支持带回退规则的 DM 策略和白名单
  • 拥有提及去除正则表达式和群组介绍提示以辅助 @提及控制

https://deepwiki.com/openclaw/openclaw/4.4-message-flow-and-delivery

消息流与投递(Message Flow & Delivery)

概述

OpenClaw 的消息投递架构清晰地将消息意图与平台特定的实现细节分离。出站分发遵循一个流水线,从 Agent 消息动作调用经过分层解析,最终到达平台特定的投递。

基本阶段为:

  1. 动作发起(Action Initiation):Agent 通过 message-tool 或内部自动回复机制调用出站消息动作。
  2. 目标解析(Target Resolution):将人类可读的标识符或用户/频道 ID 转换为具体的频道-账号-消息目标。
  3. 会话路由(Session Routing):系统计算或确认适当的会话键(session key),以保持对话连续性和历史关联。
  4. 投递执行(Delivery Execution):有效负载被分块、净化,并通过消息频道特定的出站适配器进行分发。

出站投递流水线(Outbound Delivery Pipeline)

发送消息的入口函数是 deliverOutboundPayloads。它封装了出站有效负载的组装、针对频道的适当分块、利用投递钩子、加入可靠投递队列,以及调用频道适配器进行最终分发。

出站流水线管理每条消息的异步生命周期,包括重试和错误处理。

消息动作流程(Message Action Flow)

Agent 主要通过 runMessageAction() 调用出站消息动作。流程如下:

  • message-tool.execute() 是 Agent 发出带参数(如 send、reply、react)消息命令的接口。
  • runMessageAction() 编排通过 resolveOutboundTarget() 解析目标频道和地址的过程。
  • resolveOutboundSessionRoute() 确保消息绑定到会话键,用于历史记录和对话追踪。
  • deliverOutboundPayloads() 管理分块、净化,并通过频道适配器的 sendTextsendMedia 方法进行分发。

会话键生成与路由(Session Key Generation & Routing)

会话键唯一标识对话,对于在消息轮次、设备和平台间维护一致的对话状态至关重要。

会话键格式(Session Key Formation)

会话键通常遵循以下模式:

agent:{agentId}:{channel}:{scope}:{peerId}
  • agentId:处理对话的 Agent
  • channel:消息平台(telegram、slack 等)
  • scope:会话范围,如 “main” 或 “thread”
  • peerId:对话对端的标识符(用户 ID、频道 ID、群组 ID)

会话键将平台细节抽象为代表对话线程的单一引用。

出站会话解析(Outbound Session Resolution)

发送消息时,OpenClaw 解析 OutboundSessionRoute 以将目标与会话关联:

  • 它解析并规范化目标字符串。
  • 根据已解析的元数据或频道插件能力推断对端类型(directgroupchannel)。
  • 使用 buildAgentSessionKey 构建基础会话键。
  • 构建包含 sessionKeybaseSessionKeypeer 和路由地址的完整路由数据。

如果平台特定的解析器不可用,系统支持回退解析。

平台目标解析详情会话范围示例
Telegram解析用户或群组 ID;支持各种聊天类型directgroupchannel
Slack处理频道类型(immpimchanneldmgroupchannel
WhatsApp规范化 JID;支持私聊或群聊directgroup
Signal通过 Signal 协议地址解析收件人directgroup

已解析的会话路由包含 fromto 等字段,用于指导出站消息寻址。

消息处理:更新水印与去重(Message Processing: Update Watermarking & Deduplication)

为防止多次处理同一传入更新,OpenClaw 维护更新水印和去重缓存:

  • 去重缓存(Deduplication Cache):对于 Telegram 等轮询频道,消息 ID 使用 DirectoryCache 等结构进行缓存,以跳过重复处理。该缓存在 TTL 后淘汰条目,并使用 LRU 策略管理容量。
  • 水印持久化(Watermark Persistence):存储当前已处理的最高更新 ID。恢复期间,OpenClaw 计算进行中投递的最小水印,确保即使崩溃后也不会出现消息空缺。

这些机制为入站更新保证了”恰好一次”的处理语义和有序的消息处理。

投递队列(The Delivery Queue)

OpenClaw 实现了一个投递队列目录结构,出站消息被序列化为 JSON 文件,代表等待传输的已入队投递。

  • 入队(Enqueue):消息分发时,使用 enqueueDelivery 将其入队,存储为指定投递队列目录中的 JSON 文件。
  • 确认/失败(Ack/Fail):投递成功或失败时,调用 ackDeliveryfailDelivery 来确认或标记失败的投递。
  • 重试(Retry):系统支持在网关重启时恢复待处理的投递以进行重试。

这种基于存储的队列设计支持出站消息的可靠性和容错性。

消息动作与工具(Message Actions & Tools)

Agent 主要通过 message-tool 与消息交互,该工具:

  • 暴露出站消息动作,如 sendreplyreactpoll
  • 根据活跃频道的插件和当前配置动态构建能力。
  • 实现参数验证、回复线程以及反应和交互式投票等高级功能。
动作描述参数
send发送新消息messagemediaUrlsilent
reply对消息进行线程或引用回复messagereplyTo
react为消息添加表情符号反应emojimessageId
poll创建交互式投票questionoptions

跨上下文标记(Cross-Context Markers)

系统支持”跨上下文标记(Cross-Context Markers)“,这些标记将跨会话或上下文边界链接消息动作的元数据应用其中。它以关于原始上下文/工具的信息丰富入站或出站消息,便于线程回复和上下文感知处理。

技术数据流:回复投递(Technical Data Flow: Reply Delivery)

以下序列表示从 Agent 生成回复到消息通过频道插件基础设施投递的流程:

该流水线确保每个生成的 Agent 回复都被正确分块、入队,并通过正确的频道适配器发送,同时记录投递元数据用于审计和重试。

总结

OpenClaw 中的消息流与投递涉及 Agent 工具、会话管理、出站路由、更新去重和可靠投递队列之间的复杂协调。关键代码实体包括:

  • message-tool(面向 Agent 的接口)
  • runMessageAction()(编排消息投递)
  • resolveOutboundTarget()resolveOutboundSessionRoute()(目标和会话路由)
  • deliverOutboundPayloads()(核心投递流水线)
  • enqueueDelivery()ackDelivery()(基于文件的投递队列系统)
  • 频道出站适配器(Channel Outbound Adapters)(最终平台特定投递)

这个模块化流水线支持跨消息频道的可扩展性、通过会话键实现并发,以及通过持久队列和去重实现高可靠性。


https://deepwiki.com/openclaw/openclaw/5-extensions

扩展(Extensions)

扩展提供了 OpenClaw 在不修改核心源代码的情况下添加新能力的主要机制。OpenClaw 支持两种主要的扩展类型:

  • Plugins(插件) — 注册运行时能力(如模型提供者、工具、钩子和频道)的模块化 TypeScript/JavaScript 包。
  • Skills(技能) — 基于 Markdown 的 Agent 能力定义,为 Agent 行为提供指令、示例和引导上下文。

本页提供这些扩展类型、其架构及与系统集成的高级概述。


扩展类型(Extension Types)

扩展类型格式用途分发示例
PluginsTypeScript/JavaScript 模块或包添加提供者、工具、钩子、频道等捆绑包(extensions/*)、工作区(.openclaw/extensions)或 npm 包
Skills名为 SKILL.md 的 Markdown 文件通过指令定义 Agent 能力ClawHub(社区集合)、工作区技能文件夹(.openclaw/workspace/skills)或托管安装

Plugins 是深度集成到 OpenClaw 运行时系统的代码驱动扩展,而 Skills 则通过自然语言指令和示例增强 Agent 行为。


Plugin 系统架构(Plugin System Architecture)

OpenClaw 按优先级顺序搜索路径来发现 Plugin(先找到者优先):

  1. plugins.load.paths 中配置的显式路径。
  2. 当前工作区内的工作区扩展文件夹 .openclaw/extensions/
  3. 用户全局扩展文件夹 ~/.openclaw/extensions/
  4. 随 OpenClaw Gateway 一起发布的捆绑 Plugin。

发现和加载机制会缓存注册表以提高效率。


Plugin SDK 与运行时集成(Plugin SDK and Runtime Integration)

OpenClaw 提供一个类型化的 Plugin SDK,定义了 Plugin 与 Gateway 核心之间的接口,支持:

组件角色
Loader(加载器)管理 Plugin 的发现、加载和缓存
Registry(注册表)保存活跃的 Plugin 实例及其注册的能力(提供者、工具)
Manifest Registry(清单注册表)从 Plugin 读取静态元数据(无需加载代码)
Runtime(运行时)传递给 Plugin 模块的执行上下文,暴露注册能力的 API

Plugin 在具有特定 API 面的隔离运行时中运行,以注册能力,从而降低风险并提高稳定性。


Plugin 注册流程(Plugin Registration Flow)

Plugin 实现由运行时暴露的 register(api: OpenClawPluginApi) 方法,允许它们注册:

  • Providers(提供者):LLM、语音、图像生成、网络搜索和媒体理解提供者。
  • Tools(工具):Agent 工具,包括可选和必需的 Agent 代码工具。
  • Hooks(钩子):用于提示注入、事件处理和生命周期的系统钩子。
  • Channels(频道):处理入站和出站消息的消息平台集成。

Plugin 插槽(Plugin Slots,独占类别)

OpenClaw 将某些 Plugin 角色作为独占”插槽(slots)“管理,即该类别中一次只能有一个 Plugin 处于活跃状态。这在 plugins.slots 配置部分进行设置。

插槽用途默认 Plugin
memory长期记忆实现memory-core
contextEngine上下文引擎/提示管理器legacy

插槽通过防止关键扩展类别中的冲突来确保行为一致性。


Skills 系统概述(Skills System Overview)

Skills 是以 Markdown 格式 SKILL.md 文件表达的自然语言驱动的 Agent 能力。这些文件描述新的 Agent 行为、指令、示例和演示。

与基于代码的 Plugin 不同,Skills 纯粹通过受技能元数据和内容控制的提示工程来扩展 Agent。

ClawHub 集成(ClawHub Integration)

ClawHub 是 OpenClaw 的社区技能存储库和分发平台:

  • Agent 可以动态地从 ClawHub 发现和建议技能。
  • 技能被安装到工作区本地技能文件夹(.openclaw/workspace/skills/)。
  • 在 Agent 运行时,技能被加载并有选择地注入到系统提示中,以增强 Agent 的理解和行为。

该系统通过无需开发工作即可快速共享和部署 Agent 能力来增强可扩展性。


扩展示例(Extension Examples)

OpenClaw 包含几个有代表性的扩展,展示了可扩展性模型:

  • Lobster:一个工作流运行时扩展,允许在 Agent 对话中实现可恢复的审批门控和多步骤工具序列。
  • Memory Plugins(记忆插件):核心记忆实现,如 @openclaw/memory-core(随 OpenClaw 捆绑)和 memory-lancedb(基于向量的长期记忆),支持可插拔的记忆后端。
  • Channel Plugins(频道插件):各种消息平台的集成,如 Discord、Telegram、Matrix、Tlon 和 Google Chat。
  • Context Engine Plugins(上下文引擎插件):Plugin 可以注册自定义上下文引擎,如 legacy 引擎或管理 Agent 对话历史如何组装和压缩的自定义实现。
  • ACPX Plugin@openclaw/acpx Plugin 提供 ACP 运行时后端,演示了 Plugin 如何扩展核心协议实现。

这些示例展示了 OpenClaw 扩展框架的广度和多功能性。


https://deepwiki.com/openclaw/openclaw/5.1-plugin-architecture

Plugin 架构(Plugin Architecture)

OpenClaw 的 Plugin 系统通过模块化的发现和注册框架,在模型提供者、工具、消息频道和身份验证机制方面实现了可扩展性。

概述

Plugin 架构以 PluginRegistry 为核心,它跨以下扩展点管理 Plugin 生命周期:

  • Model Providers(模型提供者):具有身份验证和模型目录的 AI 推理引擎
  • OAuth Flows(OAuth 流程):基于 Web 或设备的身份验证机制
  • Tools(工具):Agent 的功能能力
  • Hooks(钩子):生命周期事件订阅
  • Channels(频道):消息平台集成
  • Memory Backends(记忆后端):替代存储引擎

Plugin 发现与加载(Plugin Discovery and Loading)

发现顺序和优先级(Discovery Order and Precedence)

OpenClaw 按分层顺序定位 Plugin,先找到者具有优先权:

  1. 显式配置路径(Explicit Config Paths):如 plugins.load.paths 中声明的
  2. 工作区扩展(Workspace Extensions):位于 <workspace>/.openclaw/extensions/
  3. 全局扩展(Global Extensions):位于 ~/.openclaw/extensions/
  4. 捆绑 Plugin(Bundled Plugins):随 OpenClaw 打包的默认 Plugin

加载与运行时隔离(Loading and Runtime Isolation)

PluginLoader 使用 jiti 模块加载器动态加载 Plugin,原生支持 TypeScript/JavaScript。每个 Plugin 执行其 register(api) 入口函数,接收一个 OpenClawPluginApi 实例用于注册能力。

每个 Plugin 获得一个 PluginRuntime 隔离上下文,用于与 Gateway 服务交互,从而实现沙箱化和版本独立性。

Plugin SDK API(Plugin SDK API)

Plugin SDK 通过 openclaw/plugin-sdk 的子路径导出提供类型化模块:

子路径用途
openclaw/plugin-sdk/core核心类型、基类、辅助函数
openclaw/plugin-sdk/plugin-entryPlugin 注册入口点
openclaw/plugin-sdk/provider-setupAI 提供者和身份验证注册
openclaw/plugin-sdk/channel-setup消息频道注册
openclaw/plugin-sdk/runtime运行时接口和状态
openclaw/plugin-sdk/sandbox沙箱环境交互
openclaw/plugin-sdk/webhook-ingressWebhook 输入处理
openclaw/plugin-sdk/testing测试工具

注册 API(OpenClawPluginApi

当 Plugin 的 register() 方法执行时,它接收一个暴露扩展方法的 API 对象:

方法描述
registerProvider(spec)注册带身份验证和模型的 AI 模型提供者
registerTool(tool, opts?)注册 Agent 工具;对 Agent 可选
registerHook(hook)附加生命周期或事件钩子
registerChannel(channel)添加消息频道实现
registerService(service)启动绑定到 Plugin 生命周期的后台服务
registerGatewayRoute(route)在 Gateway 服务器上注册 HTTP 路由
registerInteractiveHandler(handler)注册 CLI 交互处理程序

Plugin 导出与提供者(Plugin Exports and Providers)

模型提供者(Model Providers)

模型提供者代表与 AI 后端的连接,暴露身份验证、模型发现和推理流接口。PluginProviderRegistration 类型定义了提供者元数据、身份验证方法、模型和请求钩子。

OAuth 身份验证流程实现 ProviderAuthMethod Plugin,通过上下文对象与用户交互,上下文对象暴露 openUrl() 用于浏览器身份验证,prompter.prompt() 用于用户输入。

工具与工厂(Tools and Factories)

工具以工厂(OpenClawPluginToolFactory)的形式实现 Agent 能力,实例化工具时包含以下上下文:

  • sessionId:当前会话标识符
  • agentId:调用工具的 Agent
  • workspaceDir:执行工作区

钩子与事件(Hooks and Events)

钩子允许 Plugin 订阅生命周期时刻,例如:

  • Agent 生命周期(Agent Lifecycle)agent.beforeRunagent.afterRun
  • 系统事件(System Events):配置更改或诊断事件
  • 提示注入(Prompt Injection):在 LLM 调用前动态修改提示

Plugin 配置与验证(Plugin Configuration and Validation)

每个 Plugin 可以使用类似 JSON Schema 的定义定义一个 OpenClawPluginConfigSchema,描述预期的配置属性。该 Schema 支持:

  1. 验证(Validation)openclaw.json 文件在启动时针对活跃 Plugin Schema 进行验证
  2. UI 生成(UI Generation):控制 UI 读取 Schema 和 uiHints 以动态生成设置表单

Plugin 插槽(Plugin Slots)

某些 Plugin 归类为独占插槽,每个插槽最多一个 Plugin 处于启用状态:

  • memory 插槽 — 用于长期记忆后端
  • contextEngine 插槽 — 用于对话上下文管理

Plugin 发现与优先级总结(Plugin Discovery & Precedence Summary)

特性描述
清单文件(Manifest File)Plugin 使用包含元数据和配置 Schema 的 openclaw.plugin.json 来描述
捆绑目录(Bundled Directory)环境变量 OPENCLAW_BUNDLED_PLUGINS_DIR 指向捆绑核心 Plugin 的位置
Plugin 状态(Plugin Status States)Plugin 可以具有 loadeddisablederror 等状态
格式支持(Format Support)支持 Native(Node.js/TypeScript)和 Bundle(兼容 Codex/Claude)格式

结论

OpenClaw 的 Plugin 架构为跨提供者、工具、消息频道和身份验证机制的可扩展性提供了一个强大的模块化系统。其发现流程支持多个覆盖层,确保灵活的 Plugin 管理。Plugin SDK 提供类型化接口用于可信的 Plugin 开发,而运行时隔离和生命周期集成则保证稳定的扩展无缝扩展 OpenClaw 的能力。


https://deepwiki.com/openclaw/openclaw/5.2-skills-system

Skills 系统(Skills System)

OpenClaw 中的 Skills 系统通过提供打包为目录形式的模块化指令集和工具定义来扩展 Agent 能力。每个 Skill 定义了 Agent 应如何使用特定的二进制文件、API 或本地脚本,并包含用于环境注入和依赖检查的元数据。

SKILL.md 格式与元数据(SKILL.md Format and Metadata)

一个 Skill 被组织为包含 SKILL.md 文件的目录。该文件将用于配置的 YAML frontmatter 与提供给 Agent 的丰富指令的 Markdown 混合在一起。

技术规范(Technical Specification)

OpenClaw 实现了 AgentSkills.io 规范,其解析器要求 单行(single-line) frontmatter 值,确保与嵌入式 Pi Agent 运行时的兼容性。

YAML frontmatter 定义了基本的 Skill 元数据,而 Markdown 主体包含了塑造 Agent 行为的详细指令。

字段类型描述
namestringSkill 的唯一标识符
descriptionstring提示构建期间使用的摘要
metadata.openclawobjectOpenClaw 特定扩展(frontmatter 中序列化的 JSON 字符串)
metadata.openclaw.requiresobject需求门控规则,例如二进制文件、环境变量和配置路径
metadata.openclaw.installarray带有方法详情的安装说明(brew、node、uv、go、download)

系统强制要求所有 frontmatter 值为单行字符串,以确保确定性的解析和提示包含。

需求评估(Requirement Evaluation)

OpenClaw 通过检查以下需求来验证 Skill 的资格:

  • OS 匹配(OS Matching):Skills 可以指定支持的操作系统(如 darwinlinuxwin32)。
  • 二进制可用性(Binary Availability):Skills 可以声明必须在 PATH 上存在的二进制文件(hasBinary 检测)。
  • 环境变量(Environment Variables):必须存在所需的环境变量。
  • 配置路径(Configuration Paths):Skills 可能需要启用某些 openclaw.json 配置标志。

此评估决定了 Skill 是否有资格进行提示注入。

Skill 安装与来源(Skill Installation and Sources)

OpenClaw 支持来自多个来源的 Skills,优先级如下。当同名 Skills 存在于不同层级时,优先级更高的来源会覆盖较低的来源。

来源类型位置范围优先级
工作区 Skills(Workspace Skills)<workspace>/skills/每个 Agent最高
托管 Skills(Managed Skills)~/.openclaw/skills/主机范围中等
捆绑 Skills(Bundled Skills)内置于 OpenClaw 包中主机范围最低
额外目录(Extra Directories)通过 skills.load.extraDirs 配置灵活最低

工作区 Skills(Workspace Skills)

位于每个 Agent 的工作区目录中,这些 Skills 提供隔离的、项目特定的功能。工作区 Skills 会覆盖同名的托管和捆绑 Skills。

托管 Skills(Managed Skills)

安装到用户的全局 OpenClaw 配置目录中,托管 Skills 可以在同一主机上的 Agent 之间共享。

捆绑 Skills(Bundled Skills)

这些是随 OpenClaw 本身一起打包的内部内置 Skills。它们作为默认值或回退,可以被工作区或托管 Skills 禁用或覆盖。

额外目录(Extra Directories)

管理员可以通过 OpenClaw 配置键 skills.load.extraDirs 指定额外的目录来加载 Skills。

安装程序选择逻辑(Installer Selection Logic)

Skills 可以在 metadata.openclaw.install 下指定多个安装程序,每个安装程序描述不同的安装方法(如 brew 公式、node 包、下载存档)。

OpenClaw 使用 selectPreferredInstallSpec 根据环境能力和用户偏好选择最佳安装方法:

优先级安装程序类型条件/偏好
1brew如果 preferBrew 为 true 且 brew 二进制文件在 PATH 上
2uv始终优先用于通过 uv 管理的 Python 包
3node使用工作区或全局 nodeManager(npm/pnpm/bun)
4go需要 PATH 中有 go 二进制文件
5download没有包管理器的二进制存档的回退安装程序

此优先级确保用户获得最原生且集成度最高的可用安装体验。

Skill 执行与提示注入(Skill Execution and Prompt Injection)

从静态 Skill 文件到实时 Agent 执行的桥梁,核心是生成动态提示和注入环境变量。

数据流:从 Skill 文件到 Agent 运行时(Data Flow: From Skill Files to Agent Runtime)

系统编译一个 SkillStatusReport,聚合以下信息:

  • 所有发现的 Skills 及其元数据。
  • 资格和缺失的需求。
  • 适用的安装选项。

此报告被 Agent 运行时使用,以构建技能提示片段并正确配置环境。

环境与 API 密钥注入(Environment & API Key Injection)

Skills 可以通过 metadata.openclaw.requires.env 声明它们所需的环境变量,或定义 primaryEnv,表示持有 API 密钥的特定环境变量。

OpenClaw 按以下顺序解析这些变量:

  1. Node.js process.env 中存在的环境变量。
  2. 在工作区或全局 openclaw.jsonskills.entries.<skill_key>.env 下配置的自定义环境变量。
  3. 通过 skills.entries.<skill_key>.apiKeyprimaryEnv 关联的 API 密钥。

此环境注入便于为访问外部 API 的 Skills 传递凭证和工具配置。

工作区 Skills 与托管 Skills 对比(Workspace Skills vs Managed Skills)

OpenClaw 支持多个 Skill 来源,以适应具有隔离或共享能力的多 Agent 设置。

特性工作区 Skills托管 Skills
位置<workspace>/skills/(每个 Agent 工作区)~/.openclaw/skills/(主机范围共享)
隔离专用于特定 Agent 工作区在主机上的所有 Agent 之间共享
覆盖行为覆盖同名的托管和捆绑 Skills覆盖捆绑 Skills
预期用途项目特定或私有自定义工具常用工具(如 web_search

会话快照(Session Snapshotting)

为在交互会话期间保持提示一致性,符合条件的 Skills 在会话开始时被快照。此快照保留:

  • Skill 指令提示。
  • 资格状态。
  • 会话期间固定的 Skill 列表。

这可以防止在编辑 Skill 文件后出现会话中途更改的情况,除非启用了 skills.load.watch

快照数据驻留在 .openclaw/state/<agent_id>/skills-snapshot.json 中,并支持确定性的提示行为。

总结

Skills 系统是通过将能力模块化为可共享、可配置的 Skill 包来扩展 OpenClaw Agent 的核心机制。它确保了对 Skill 元数据、需求门控、安装策略和无缝集成到 Agent 提示周期的强大处理。工作区隔离与托管托管支持强大的多 Agent 部署场景。

延伸阅读参考(References for Further Reading)

  • docs/tools/creating-skills.md — Skill 格式定义和开发者指南
  • src/agents/skills-status.ts — 核心 Skill 扫描、状态评估、安装逻辑和快照
  • src/agents/skills.resolveskillspromptforrun.test.ts — Skill 提示构建和环境注入
  • src/agents/skills/workspace.ts — 工作区 Skill 管理
  • src/agents/skills/source.ts — Skill 来源解析
  • src/agents/skills-install.download.test.ts — Skill 下载和提取安全性
  • src/agents/skills.buildworkspaceskillstatus.test.ts — Skill 状态报告和资格
  • src/cli/skills-cli.formatting.test.ts — Skill 信息的 CLI 格式化

https://deepwiki.com/openclaw/openclaw/5.3-plugin-examples

Plugin 示例(Plugin Examples)

概述

本文档通过具体示例展示 OpenClaw Plugin 的实现,重点介绍 OAuth 提供者集成和配置模式。

Plugin 结构(Plugin Structure)

Plugin 遵循标准化的目录布局:

extensions/<plugin-name>/
├── index.ts          # 入口点和提供者注册
├── oauth.ts          # 身份验证流程(如果基于 OAuth)
├── README.md         # 用户文档
└── package.json      # 元数据和依赖

每个 Plugin 导出一个带有 register() 钩子的清单,该钩子接收 OpenClawPluginApi,暴露以下方法:

  • registerProvider() — 注册带身份验证方法的模型提供者
  • registerTool() — 注册 Agent 可调用的工具
  • registerHook() — 添加生命周期或消息钩子

OAuth Plugin 示例:Google Gemini CLI

提供者注册(Provider Registration)

Google Plugin 展示了带有交互式登录的完整 OAuth 集成:

关键属性:

  • Provider ID"google-gemini-cli"
  • Auth Kind"oauth",用于带浏览器重定向的标准 OAuth
  • 环境变量(Environment Variables):可选提示,如 GOOGLE_API_KEY

OAuth 方法实现了一个 run 函数,接收带有 UI 辅助工具(prompter)、环境标志(isRemote)和 openUrl 等工具的 ProviderAuthContext

流程实现(Flow Implementation)

Gemini CLI OAuth 使用 PKCE 和本地 HTTP 回调服务器:

  1. 凭证发现(Credential discovery) — 尝试本地环境密钥或从已安装的包中提取客户端 ID
  2. PKCE 支持(PKCE support) — 生成用于授权安全的验证器/挑战对
  3. 回调服务器(Callback server) — 在 localhost(默认端口 8085)监听 OAuth 回调
  4. Remote/WSL2 支持 — 当 localhost 不可达时回退到手动代码输入

设备码 OAuth 示例:Qwen Portal

与标准 OAuth 的比较(Comparison with Standard OAuth)

方面标准 OAuth设备码(Device Code)
用户交互浏览器重定向终端代码输入
回调方法HTTP 服务器轮询令牌端点
网络要求本地 HTTP 服务器
适用场景桌面无头/远程

轮询详情(Polling Details)

  • 初始等待遵循服务器建议的 interval
  • slow_down 错误触发自适应间隔乘法(如 1.5 倍)
  • 循环持续直到成功或过期

配置与密钥运行时(Configuration and Secrets Runtime)

密钥解析(Secrets Resolution)

OpenClaw 提供一个专用的密钥运行时,合并配置文件引用、环境变量和运行时覆盖:

  • prepareSecretsRuntimeSnapshot() — 初始化组合 env 和配置的密钥快照
  • getActiveRuntimeWebToolsMetadata() — 检索带凭证的活跃 Web 提供者元数据
  • resolveSetupSecretInputString() — 在入职期间安全提示输入 API 密钥

这集中了密钥访问,防止 Plugin 直接读取环境变量,同时支持在配置文件或配置文件中无缝存储。

入职集成(Onboarding Integration)

入职向导(openclaw onboard)动态发现已注册的 Plugin 数据,以提示输入凭证并启用 Plugin。

网络搜索提供者示例(Web Search Providers Example)

  1. 提供者检测(Provider detection) — 调用 resolveSearchProviderOptions() 查询已注册的网络搜索 Plugin(brave、Google Gemini、perplexity 等)
  2. 用户确认(User confirmation) — 提示确认启用所选提供者/工具
  3. 凭证输入(Credential entry) — 使用 resolveSetupSecretInputString() 安全提示输入 API 密钥,带有遮罩输入和多种密钥输入模式

实现检查清单(Implementation Checklist)

组件用途关键文件
Plugin 入口(Plugin Entry)实现绑定提供者、工具、钩子的 register()extensions/google/index.ts
清单(Manifest)提供带 configSchemaopenclaw.plugin.jsonPlugin 包目录
SDK 用法(SDK Usage)使用 openclaw/plugin-sdk/* 的导入跨 Plugin 的 SDK
模型提供者(Model Providers)注册带正确 idauth 方法和模型src/plugins/contracts/registry.ts
OAuth 方法(OAuth Methods)使用 ProviderAuthContext 实现 run 函数extensions/google/oauth.ts
轮询流程(Polling Flows)实现带错误处理的自适应轮询extensions/qwen/oauth.ts
密钥运行时(Secrets Runtime)使用密钥运行时进行 API 密钥解析src/secrets/runtime.ts
入职向导(Onboarding Wizard)集成配置提示和密钥输入模式src/commands/configure.wizard.ts

遵循此模式可确保 Plugin 与 OpenClaw 的模块化运行时、授权系统和用户入职设施的顺畅集成。


https://deepwiki.com/openclaw/openclaw/6-native-clients-and-nodes

原生客户端与节点(Native Clients & Nodes)

本文档介绍 OpenClaw 适用于 iOS、macOS 和 Android 的原生客户端应用程序。这些平台特定的应用程序有双重用途:它们既是通过 WebSocket 连接到 Gateway 服务器的 Gateway 客户端(Gateway clients),也是通过 node.invoke RPC 方法向 Agent 运行时暴露设备特定能力(摄像头、屏幕截图、通知、位置)的 Device Node(设备节点)

概述

原生客户端与 CLI 和控制 UI 有三个关键区别:

  1. 平台集成(Platform Integration):它们访问平台特定的 API(Android 上的 CameraX、iOS 上的 AVFoundation、macOS 上的 ScreenCaptureKit),而这些 API 对基于 Node.js 或浏览器的客户端不可用。
  2. Device Node 协议(Device Node Protocol):它们注册为设备节点,并通过 node.invoke RPC 方法暴露 camera.capturescreen.snapshotnotifications.sendlocation.get 等工具。
  3. 原生 UI(Native UI):它们提供平台原生体验(iOS/macOS 上的 SwiftUI,Android 上的 Jetpack Compose),以及分享扩展、小组件和后台任务等操作系统级集成。

所有原生客户端共享一个从 Gateway 的 TypeScript 协议定义生成的通用协议层,确保跨平台的类型安全通信。

多平台架构(Multi-Platform Architecture)

原生客户端架构

原生客户端生态系统由以下部分组成:

  • iOS App:带有分享扩展和活动小组件的主 iPhone/iPad 应用。
  • macOS App:带有通过 appcast.xml 进行 Sparkle 自动更新集成的菜单栏应用。
  • Android App:带有 Jetpack Compose UI 的主 Android 应用。

所有客户端使用**代码生成的协议模型(code-generated protocol models)**以确保类型安全。流水线运行 scripts/protocol-gen-swift.ts 将协议 Schema 转换为平台特定的 Swift 代码。

Device Node 协议(Device Node Protocol)

当原生客户端连接到 Gateway 时,它可以通过在 ConnectParams 中提供设备能力来注册为设备节点(device node)。Gateway 跟踪可用节点并将 node.invoke RPC 调用路由到适当的设备。

设备节点调用流程(Device Node Invocation Flow)

协议为节点通信定义了标准错误码,如 NOT_PAIREDUNAVAILABLE。设备配对遵循用户扫描二维码的引导流程;最近的更新将 Android 入职切换到 Google Code Scanner 以提高可靠性。iOS 中的 NodeAppModel 处理传入的 BridgeInvokeRequest,并将它们分发到适当的能力服务,例如用于摄像头操作的 CameraController 或用于屏幕操作的 ScreenController

协议代码生成(Protocol Code Generation)

Gateway 的协议定义以 TypeScript 配合 TypeBox/Zod Schema 的形式存在。这些被转换为 Swift 和 Kotlin 代码:

组件职责输出路径
scripts/protocol-gen-swift.ts生成 Swift Codable 模型apps/macos/Sources/OpenClawProtocol/GatewayModels.swift
GatewayModels.swift定义 ConnectParamsRequestFrameResponseFrameapps/macos/Sources/OpenClawProtocol/GatewayModels.swift
PresenceEntry跟踪设备状态、版本和平台apps/macos/Sources/OpenClawProtocol/GatewayModels.swift

生成的代码包含 GATEWAY_PROTOCOL_VERSION(当前为 3),以确保客户端和服务器之间的兼容性。

iOS 与 macOS 生态系统(iOS & macOS Ecosystem)

iOS 和 macOS 应用通过 OpenClawKit Swift Package 共享代码。

iOS 应用结构(iOS App Structure)

iOS 应用包括主应用程序、分享扩展和活动小组件。最近的入职改进添加了首次运行欢迎分页器和 /pair qr 指令。NodeAppModel 管理应用程序状态,包括 Gateway 连接、Agent 选择和处理深度链接。RootCanvas 是主 SwiftUI 视图,负责展示 UI、管理表单(设置、聊天、快速设置)和处理入职流程。

macOS 应用结构(macOS App Structure)

macOS 应用是一个菜单栏应用(OpenClaw),包含:

  • Sparkle 自动更新(Sparkle Auto-Update):使用 appcast.xml 管理发布
  • OpenClawIPC:进程间通信库
  • OpenClawDiscovery:处理本地网络上的 Gateway 发现

Android 生态系统(Android Ecosystem)

Android 应用使用 Gradle 和 Jetpack Compose 构建。

构建配置(Build Configuration)

构建系统管理签名和依赖。apps/android/app/build.gradle.kts 文件定义了构建过程,包括 namespacecompileSdkminSdktargetSdkversionCodeversionName。它还处理发布签名配置,确保发布构建使用适当的 keystore 信息进行签名,该信息从 Gradle 属性加载以将敏感数据保留在仓库之外。最近的更新重新设计了聊天设置表单,并刷新了 Connect 和 Voice 标签页以实现更密集的移动布局。

Android 特定功能(Android-Specific Features)

  • Google Code Scanner:用于可靠的入职二维码扫描
  • 媒体部分(Media Sections):聊天设置中分组的设备和媒体部分
  • Jetpack Compose UI:UI 使用 Jetpack Compose 构建,如 buildFeatures 中的 compose = true 标志和 activity-compose 依赖所示
  • Flavor Dimensions(变体维度):应用使用产品变体(playthirdParty)根据分发渠道启用或禁用 SMS 和通话记录访问等某些功能

总结

原生客户端将 OpenClaw 的 Agent 运行时与平台特定的设备能力连接起来。它们提供:

  • 类型安全协议(Type-Safe Protocol):从 Gateway Schema 代码生成的模型。
  • 平台集成(Platform Integration):摄像头、屏幕和通知的深度操作系统集成。
  • 原生 UX(Native UX):SwiftUI 和 Jetpack Compose 界面。

https://deepwiki.com/openclaw/openclaw/6.1-platform-overview

平台概述(Platform Overview)

目的与范围(Purpose and Scope)

本文档详细介绍了 OpenClaw 在 iOS、macOS 和 Android 平台上的原生客户端架构。它解释了多平台构建系统设计、Swift 和 Kotlin 代码库,以及从 Gateway 协议 Schema 自动生成代码的流水线。本页阐明了原生客户端如何通过类型安全、版本化的 WebSocket 协议与 Gateway 服务器进行通信。


多平台架构(Multi-Platform Architecture)

OpenClaw 在三个主要平台上提供第一方原生客户端应用程序:

  • iOS/iPadOS/watchOS:使用声明式 SwiftUI 以 Swift 构建,包括分享扩展、Live Activity 小组件和 watchOS 伴侣应用。Xcode 项目定义和目标使用 XcodeGen 管理

  • macOS:基于 Swift 的菜单栏应用,设计为无干扰地运行在菜单栏(LSUIElement),专注于系统集成和自动化

  • Android:使用 Kotlin 构建的应用程序,使用 Jetpack Compose UI,通过 Gradle Kotlin DSL 构建脚本管理

所有这些平台与 Gateway 服务器共享基于带 JSON 帧的 WebSocket RPC 的通用通信协议,称为 Gateway Protocol v3。该协议以 TypeScript 正式定义,并代码生成到 Swift/Kotlin 模型中,以确保类型安全和一致的版本控制。


Gateway 协议代码生成(Gateway Protocol Code Generation)

OpenClaw 的 Gateway 协议被定义为描述 RPC 方法、帧和数据结构的 TypeScript JSON Schema。这些 Schema 驱动为原生平台自动生成强类型数据模型和客户端代码。这种方法保证了协议版本控制的一致性,并减少了手动编码错误。

Swift 代码生成由 scripts/protocol-gen-swift.ts 脚本处理,它将 TypeScript Schema 转换为带有 Codable 一致性的 Swift struct,用于 JSON 序列化/反序列化。类似地,Kotlin 代码生成由 scripts/protocol-gen-kotlin.ts 处理,用于 Android。

代码生成流程(Code Generation Flow)

生成的 Swift 代码包括:

  • 核心协议帧的 struct 定义:ConnectParamsHelloOkRequestFrameResponseFrameEventFrame
  • 用于标准化错误报告的 enum ErrorCode
  • 符合 Swift 的 CodableSendable 协议,用于并发和编码
  • 用于版本匹配的 GATEWAY_PROTOCOL_VERSION 等常量

生成的 Kotlin 代码包括:

  • 核心协议帧的 data class 定义,使用 @Serializable 注解进行 JSON 序列化/反序列化
  • 用于标准化错误报告的 enum class ErrorCode
  • GATEWAY_PROTOCOL_VERSION 等常量

关键协议帧结构(Key Protocol Frame Structures)

帧类型用途Swift 类型Kotlin 类型
ConnectParams客户端握手请求参数struct ConnectParamsdata class ConnectParams
HelloOk服务器握手/确认struct HelloOkdata class HelloOk
RequestFrameRPC 方法调用请求struct RequestFramedata class RequestFrame
ResponseFrameRPC 方法响应帧struct ResponseFramedata class ResponseFrame
EventFrame异步服务器到客户端事件struct EventFramedata class EventFrame
PresenceEntry设备存在元数据struct PresenceEntrydata class PresenceEntry
ErrorCode枚举错误常量enum ErrorCodeenum class ErrorCode

原生代码库概述(Native Codebases Overview)

iOS / macOS Swift 代码库(iOS / macOS Swift Codebases)

  • Swift 原生客户端被组织到由 XcodeGen 管理的多个目标中:

    • iOS 主应用(iOS Main App):带有 SwiftUI 界面和 Gateway 通信
    • 分享扩展(Share Extension):用于 iOS 系统范围分享操作
    • Live Activity 小组件(Live Activity Widget)
    • **watchOS 应用(watchOS App)**伴侣
    • macOS 应用(macOS App):带有菜单栏任务和系统服务集成
  • iOS 和 macOS 应用都利用共享的 Swift 包 OpenClawKit,其中包括生成的 Gateway 协议模型、聊天 UI 组件和工具抽象

  • Swift 并发特性如 @MainActorSendable 被广泛使用,以提供 UI 响应性和安全的多线程通信

  • 客户端通过精心实现的原生服务和 UI 绑定管理 Agent 会话、远程 Gateway 连接、语音唤醒和丰富媒体交互

Android Kotlin 代码库(Android Kotlin Codebase)

  • Android 客户端使用现代 Kotlin 代码库:

    • Jetpack Compose 用于 UI
    • 基于 Coroutine(协程)的异步和响应式模式
    • 通过 Android API 集成的语音识别和 TTS
    • 封装在 GatewaySession 类中的 Gateway 会话和聊天管理
  • 构建系统利用 Gradle Kotlin DSL,支持发布签名、多 ABI 原生库和 Compose BOM 管理

  • Android TalkModeManager 用于语音交互,以平台特定的适配方式镜像 iOS 功能


原生客户端到 Gateway 的数据流(Native Client to Gateway Data Flow)

连接与消息交换(Connection and Message Exchange)

  1. 连接设置(Connection Setup) 原生客户端发起到 Gateway 的 WebSocket 连接。发送带有客户端能力、设备身份、身份验证令牌和区域设置信息的 ConnectParams

  2. 握手响应(Handshake Response) Gateway 响应 HelloOk,提供服务器元数据、功能、会话状态快照和策略信息

  3. RPC 方法使用(RPC Method Usage) 原生客户端发送 RequestFrame 消息调用 Gateway RPC 方法(如 agent.identity.getchat.send),包括作为 JSON 编码有效负载的参数

  4. 响应和事件帧(Response and Event Frames) Gateway 发回 ResponseFrame 消息回复 RPC 调用,或发送异步 EventFrame 用于状态更新、通知或 Agent 事件


总结

OpenClaw 原生客户端通过以下关键功能提供凝聚力强的多平台体验:

  • 统一协议(Unified Protocol):单一的 Gateway Protocol v3,使用基于 WebSocket RPC 的 JSON 帧模型,以 TypeScript 描述并自动生成到 Swift 和 Kotlin 模型中,确保强类型安全和协议兼容性

  • Swift iOS/macOS 客户端(Swift iOS/macOS clients):组织在多个目标应用/扩展中,通过 OpenClawKit 包共享核心 Gateway 模型和 UI 组件

  • Kotlin Android 客户端(Kotlin Android client):使用 Coroutine、Jetpack Compose UI 和原生语音基础设施的现代 Android 应用

  • 自动化代码生成流水线(Automated Code Generation Pipeline):纯粹由 TypeScript Schema 驱动,以保持跨原生平台的一致性并减少重复/错误

此架构在确保与 Gateway 服务器进行健壮且安全的通信的同时,支持可扩展的客户端开发。


https://deepwiki.com/openclaw/openclaw/6.2-device-node-protocol

Device Node 协议(Device Node Protocol)

协议概述(Protocol Overview)

Device Node(设备节点)使用带有专用 role 参数的标准 WebSocket 协议(v3)连接到 Gateway。与操作员客户端不同,节点的 RPC 方法访问权限有限,主要响应来自 Gateway 的调用请求。

节点连接流程(Node Connection Flow)

来源:src/gateway/server/ws-connection/message-handler.ts(第 147-180 行)


节点角色与授权(Node Role & Authorization)

节点以 role: "node" 连接,可以访问由 Gateway 根据角色和范围验证的一组受限 RPC 方法。

节点角色方法用途方向
node.invoke.result返回命令执行结果节点 → Gateway
node.event发送异步事件节点 → Gateway
node.pending.drain获取已排队的命令节点 → Gateway
node.pending.pull轮询新命令节点 → Gateway
node.pending.ack确认已处理的项目节点 → Gateway
skills.bins下载 Skill 二进制文件白名单节点 → Gateway

skills.bins 方法允许节点主机在启用 autoAllowSkills 时将 Skill 提供的二进制文件作为隐式允许,提高了节点主机调用的安全性。


节点配对系统(Node Pairing System)

节点在接收命令之前必须先完成配对。Gateway 通过持久化的 DevicePairingPendingRequestPairedDevice 状态以及相应的审批流程来管理配对。

配对状态模型(Pairing State Model)

配对状态通过两个 JSON 文件持久化:待处理请求和已批准的已配对设备。

每个 PairedDevice 保存设备身份、角色、范围、用于身份验证的令牌以及创建和批准的时间戳等详细信息。

配对流程步骤(Pairing Flow Steps)

  1. 请求配对(Request Pairing):节点发送 node.pair.request RPC,创建一个持久化为待批准的 DevicePairingPendingRequest。这由 requestDevicePairing 处理。

  2. 操作员审批(Operator Approval):操作员通过 CLI 或控制 UI 批准请求,将设备移入已配对列表并生成身份验证令牌。approveDevicePairing 函数执行此操作。

  3. 验证(Verification):节点通过提交带有其 ID 和令牌的 node.pair.verify 来验证其配对;只有这样才能获得完整的协议访问权限。这由 verifyDeviceToken 处理。

此模型支持灵活的角色和范围分配,用于细粒度的权限控制。


节点调用协议(Node Invocation Protocol,node.invoke

设备控制的关键方法是 node.invoke,允许 Agent 或 Gateway 向由 nodeId 标识的节点发送命令。

节点主机中的调用处理(Invocation Handling in Node Host)

节点监听 node.invoke.request 事件。收到请求后,有效负载被强制转换并分发给本地处理程序。

handleInvoke 函数在节点主机上处理命令。

系统运行(Exec)命令(System Run (Exec) Commands)

system.run 命令允许在节点主机上执行具有重要安全控制的 shell 命令:

  • 安全模式(Security Modes)

    • deny:不允许任何命令
    • allowlist:仅允许明确允许的命令
    • full:不受限制
  • 询问策略(Ask Policy)

    • off:无需审批
    • on-miss:仅对未知命令提示审批
    • always:始终需要审批
  • 白名单匹配(Allowlist Matching):命令被拆分为段,并进行精确匹配或通过安全的仅 stdin 二进制文件匹配。

  • 审批请求(Approval Requests):如果命令不在白名单中且策略要求,则通过伴侣应用请求用户审批。

  • TOCTOU 绑定(Binding for TOCTOU):使用当前状态的快照和文件绑定,防止检查时间到使用时间(time-of-check to time-of-use)的不一致性。


节点特定工具(Node-Specific Tools,nodes 工具)

Agent 通过 nodes 工具与设备交互,该工具将设备能力抽象为映射到 node.invoke RPC 命令的高级操作。

Nodes 工具动作映射(Nodes Tool Action Map)

动作协议命令描述
camera_snapcamera.snap拍摄静止照片
camera_clipcamera.clip录制短视频片段
screen_recordscreen.record录制屏幕活动
notifications_listnotifications.list列出当前通知
notifications_actionnotifications.action执行通知操作
device_statusdevice.status查询设备状态信息
device_infodevice.info检索常规设备信息
device_permissionsdevice.permissions检查设备权限状态
device_healthdevice.health获取设备健康指标
runsystem.run远程执行 shell 命令
invoke自定义调用命令调用任意节点命令

示例:camera_snap 动作触发带有 camera.snap 命令的 node.invoke

通过 Gateway 的内部调用(Internal Invocation via Gateway)

工具通过解析目标节点来实现命令调用,然后调用 Gateway 的 node.invoke RPC 方法。

这确保了通过 Gateway 的统一接口和集中的安全执行。


设备命令策略与审批(Device Command Policies & Approvals)

为控制安全性,某些节点命令(尤其是 system.run)需要审批流程和细粒度的白名单。

执行审批与白名单(Exec Approvals and Allowlist)

  • 命令被解析为段并与白名单进行匹配。
  • 如果缺失且 ask=on-miss,则发送用户审批请求。
  • 批准后,系统建立一个包含文件和 CWD 绑定的安全计划。
  • 失败或不匹配则拒绝执行。

此拒绝或审批过程在允许操作员控制的同时防止潜在有害命令。


总结

Device Node 协议通过 Gateway 实现了 AI Agent 对用户设备的安全、灵活且可扩展的控制。关键要素包括:

  • 严格的节点角色和方法授权。
  • 具有操作员审批的强大配对系统,强制执行信任边界。
  • 用于转发设备命令的 node.invoke RPC 命令。
  • 将摄像头、屏幕录制和通知等设备能力抽象的节点特定工具。
  • 针对敏感节点命令(system.run)的安全策略和审批工作流。

这些组件共同允许 OpenClaw 系统安全有效地利用强大的原生设备能力。


https://deepwiki.com/openclaw/openclaw/6.3-ios-and-macos-apps

iOS 与 macOS 应用(iOS & macOS Apps)

OpenClaw 为 iOS、watchOS 和 macOS 提供原生 Swift 应用程序,这些应用程序作为通过 WebSocket 连接到 Gateway 的设备节点。这些应用通过 node.invoke 协议暴露设备能力,并为聊天、语音交互和 Agent 管理提供平台原生界面。

iOS 应用结构(iOS App Structure)

iOS 应用包含四个主要目标,均通过 XcodeGen 配置:

目标类型用途
OpenClawApplication带有聊天、语音、画布和设备服务的主 iOS 应用
OpenClawShareExtensionApp Extension用于文本、URL、图像和视频的系统分享表单
OpenClawActivityWidgetApp Extension显示 Agent 状态的 Live Activity 小组件
OpenClawWatchApp + OpenClawWatchExtensionwatchOS App用于快速交互的 Apple Watch 伴侣

所有目标使用包 ID 前缀 ai.openclaw.ios.*,版本由 OPENCLAW_MARKETING_VERSIONOPENCLAW_BUILD_VERSION 构建设置管理。

分享扩展(Share Extension)

用户可以通过系统分享表单将其他应用的内容直接分享到 OpenClaw。支持的内容类型包括文本、单个 URL、最多 10 张图像和一个视频。ShareViewController 打包此内容并使用标准 GatewayNodeSession 协议将其转发到 Gateway。扩展在其 Info.plist 配置中声明激活能力。

Watch 应用(Watch App)

watchOS 伴侣由两个目标组成:OpenClawWatchApp(容器)和 OpenClawWatchExtension(SwiftUI 界面)。它提供以语音查询、状态显示和通过 watch 与 iOS 应用之间的 WatchConnectivity 消息中继为重点的最小功能。Gateway 命令仅限于语音和聊天能力。

活动小组件(Activity Widget)

活动小组件利用 ActivityKit 显示 Live Activities,展示长时间运行的 Agent 任务进度和状态。它使用 OpenClawActivityAttributes 在主应用和小组件之间定义共享数据结构。

macOS 应用结构(macOS App Structure)

macOS 应用是一个为无干扰的 Agent 交互和 Gateway 管理而设计的菜单栏工具。

关键组件(Key Components)

组件描述
菜单栏图标(Menu Bar Icon)显示连接状态、Agent 选择和快速操作
聊天窗口(Chat Window)显示消息历史记录和输入的浮动界面
Gateway 设置(Gateway Settings)连接/断开 Gateway 和身份验证的 UI
语音唤醒(Voice Wake)通过 Swabble 集成实现的始终开启的唤醒词检测
执行审批(Exec Approvals)执行请求审批的原生系统提示

应用使用包标识符 ai.openclaw.mac,与 iOS 共享 CalVer 版本控制,并通过 LSUIElement = true 不显示 Dock 图标运行。

执行审批提示(Exec Approval Prompts)

macOS 应用为来自 Agent 的 system.run 执行请求显示原生模态对话框。它遵循 Agent 特定的 tools.exec.approvals.enabled 配置。如果原生 UI 审批不可用,则应用回退白名单策略。

Sparkle 自动更新(Sparkle Auto-Update,macOS)

OpenClaw 使用 Sparkle 框架实现无缝的 macOS 应用更新。appcast.xml 从 GitHub 仓库的主分支提供服务,并使用 Ed25519 密钥签名以确保完整性。发布构建在发布前获得 Developer ID 签名和公证。

iOS 应用架构(iOS App Architecture)

iOS 应用维护与 Gateway 的两个并发 WebSocket 连接:

连接角色用途
nodeGatewaynode接收入站 node.invoke 命令;注册设备能力
operatorGatewayoperator发送用于聊天、talk、语音唤醒和配置的出站 RPC 调用

两个连接都作为 GatewayNodeSession 实例由 NodeAppModel 管理。

NodeAppModel

NodeAppModel 是协调 iOS 应用状态和通信的主要 @Observable 类。其核心职责包括:

  • 管理两个 Gateway WebSocket 会话
  • 维护连接生命周期、后台状态抑制和重连逻辑
  • 拥有设备/本地服务控制器,如 VoiceWakeManagerTalkModeManagerScreenController
  • 构建分发传入 node.invoke 命令的 NodeCapabilityRouter
  • 维护 Gateway 服务器信息、Agent 选择、连接状态和分享事件的可观察 UI 状态

nodeGateway 上收到的所有 node.invoke 请求都被转发到 NodeAppModel 中的 handleInvoke(),它在通过能力路由器分发之前强制执行权限和后台化规则。

GatewayConnectionController

GatewayConnectionController 管理到 Gateway 服务器的发现、连接、TLS 信任和自动重连。它使用 GatewayDiscoveryModel 进行 Bonjour/mDNS 本地网络 Gateway 服务发现,并根据应用场景阶段处理暂停/恢复。

控制器使用 SHA-256 指纹实现 TOFU(Trust On First Use,首次使用信任)TLS 证书固定。当连接到启用了 TLS 且没有存储指纹的新 Gateway 时,它会探测 TLS 公钥指纹,显示 TrustPrompt UI 供用户审批,并将指纹存储在 GatewayTLSStore 中用于未来验证。后续连接会根据存储的数据验证证书指纹,防止回退到未加密的连接。

TalkModeManager

TalkModeManager 提供双向语音对话支持,将语音识别和文本转语音与 Gateway 集成。

语音转文本(Speech-to-Text):使用 SFSpeechRecognizer 配合 AVAudioEngine 捕获麦克风音频。音频缓冲区馈送到 SFSpeechAudioBufferRecognitionRequest,生成实时转录。系统包含带有可配置超时的静音检测,并支持多种捕获模式:.idle.continuous.pushToTalk

文本转语音(Text-to-Speech):TTS 播放由外部 Gateway 处理,通常使用 ElevenLabs TTS API。流式音频(PCM 或 MP3)通过 PCMStreamingAudioPlayer 和/或 StreamingAudioPlayer 播放。语音配置在连接期间从 Gateway 获取。

VoiceWakeManager 与 Swabble 集成(VoiceWakeManager and Swabble Integration)

VoiceWakeManager 使用 AVAudioEngine tap 在 iOS 上运行始终开启的唤醒词检测,将音频缓冲区馈送到自定义识别流水线。缓冲区入队到 AudioBufferQueue,异步排空到语音识别器。唤醒词检测依赖 SwabbleKit 守护进程集成进行高效音频处理。检测触发通过 Gateway 连接路由的语音唤醒事件。

ScreenController 与 A2UI 画布渲染(ScreenController & A2UI Canvas Rendering)

ScreenController 管理用于 Agent 交互和 UI 展示的 WKWebView 画布界面。画布支持加载默认的脚手架 HTML 或导航到外部 URL。滚动交互仅对外部 URL 启用;默认脚手架禁用滚动并传递原始触摸事件。

应用使用 A2UI 开放标准进行声明式 UI 渲染。A2UI bundle(index.html 和相关 JS/CSS)由 scripts/bundle-a2ui.sh 工具生成,结合来自 vendor/a2ui/renderers/litapps/shared/OpenClawKit/Tools/CanvasA2UI 的源。

构建系统与 XcodeGen(Build System & XcodeGen)

OpenClaw 使用 XcodeGen 声明式地定义 iOS 应用项目及其目标。apps/ios/project.yml 的项目文件定义了多个目标和依赖的设置。它强制执行 Swift 6.0、并发严格性、bundle 打包、签名配置和部署目标。系统集成了 SwiftLint 和 SwiftFormat 作为预构建脚本用于代码风格执行,并与 OpenClawKitSwabble Swift 包共享包依赖。

Android 和 macOS 应用分别使用独立的 Gradle 和 SwiftPM 构建系统。

总结

OpenClaw 的 iOS 和 macOS 原生应用构成了一个集成的、多目标生态系统,提供:通过安全的首次使用信任 TLS 实现无缝的 Gateway 发现和连接管理;通过持续唤醒词检测和双向语音处理实现语音能力;通过系统级分享扩展和 watch 应用伴侣实现多设备体验;通过高效 WKWebView 托管的 A2UI 画布实现响应式 Agent 驱动 UI;以及通过 XcodeGen(iOS)和 Sparkle 自动更新(macOS)实现的现代构建和分发桥接。此架构使 OpenClaw 能够提供与原生设备能力紧密耦合的强大个人 AI 助手体验。

https://deepwiki.com/openclaw/openclaw/6.4-android-app

https://deepwiki.com/openclaw/openclaw/6.4-android-app

Android 应用文档

概述

Android 应用是使用原生 Kotlin 实现的,作为 OpenClaw 的设备节点(Device Node)。它实现了设备节点协议(Device Node Protocol),通过 Gateway 将 Android 特有功能(摄像头、屏幕截图、通知、短信、通话记录)暴露给代理运行时。UI 使用 Jetpack Compose 和 Material 3 组件,应用通过 WebSocket 连接,并支持便捷的二维码扫码初始化流程。

构建系统

构建配置:

  • 应用 ID:ai.openclaw.app
  • 编译 SDK:36
  • 最低 SDK:31(Android 12)
  • 目标 SDK:36
  • 版本:2026.3.27
  • 支持的 ABI:armeabi-v7aarm64-v8ax86x86_64

产品变体(Product Flavors):

变体短信通话记录使用场景
playGoogle Play Store
thirdParty侧载/F-Droid

条件编译可避免违反 Google Play 政策中对敏感权限的限制。

构建类型:

  • Debug(调试):无代码混淆,未签名
  • Release(发布):R8 代码混淆、资源压缩、密钥库签名

发布签名配置需要来自 ~/.gradle/gradle.properties 的 Gradle 属性(密钥库路径、密码),以避免在源码中暴露凭据。

应用架构

单 Activity Compose 设计:

  • 入口点:MainActivity
  • UI:Material3 Compose 组件
  • 通信:与 Gateway 保持持久化 WebSocket 连接
  • Node RPC:实现 node.invoke 处理器
  • 平台服务:CameraX、MediaProjection、通知
  • 二维码扫描:Google Play Services
  • DNS-SD 发现:DNSJava 库

核心依赖

用途
androidx.compose:compose-bom:2026.02.00Jetpack Compose
androidx.compose.material3:material3Material Design 3
com.squareup.okhttp3:okhttp:5.3.2WebSocket 客户端
dnsjava:dnsjava:3.6.4DNS-SD 发现
androidx.camera:camera-lifecycle:1.5.2CameraX 支持
com.google.android.gms:play-services-code-scanner:16.1.0二维码扫描

Android 设备节点功能

应用处理 node.invoke RPC 调用,暴露 Android 功能:

命令示例备注
canvas.*canvas.presentcanvas.evalWebView canvas/A2UI
camera.*camera.listcamera.snap摄像头访问(危险权限)
screen.record屏幕录制危险命令
location.get设备位置位置访问
notifications.*列出、管理通知系统集成
device.*信息、状态查询设备元数据
contacts.*搜索、添加联系人添加操作较危险
calendar.*事件、添加条目添加操作较危险
callLog.search查询通话记录通话记录访问
sms.*搜索、发送消息sms.send 较危险
photos.latest获取最新照片照片访问
motion.*活动、计步器数据传感器数据
system.*通知、命令系统集成

Gateway 策略控制允许执行的命令;危险命令需要用户明确授权。

Gateway 连接与初始化

WebSocket 安全:

  • Tailscale/公网主机需要安全的 wss:// 连接
  • 仅以下情况允许明文 ws://:私有局域网地址、.local 主机、localhost127.0.0.1、Android 模拟器(10.0.2.2
  • 前台服务在应用后台运行时维持连接

连接方式:

  1. 二维码设置:

    • 扫描 openclaw qr CLI 命令生成的二维码
    • 包含 base64url 编码的 JSON,内含 Gateway URL 和 bootstrap token(启动令牌)
    • GatewayConfigResolver.decodeGatewaySetupCode 解码载荷
    • OnboardingFlow.GatewayStep 使用 GmsBarcodeScanning
  2. 手动输入:

    • 用户手动输入主机、端口、TLS 设置
    • GatewayConfigResolver.parseGatewayEndpointResult 进行验证
    • GatewayHostSecurity 检查是否允许明文连接

TLS 信任验证:

  • 首次连接时提示用户验证 Gateway 的 TLS SHA-256 指纹
  • NodeRuntime 中的 pendingGatewayTrust 状态管理此流程
  • 信任提示显示在 ConnectTabScreen 的 AlertDialog 中

认证方式:

  • 基于令牌(Token)
  • 基于密码(Password)
  • Bootstrap token(来自设置码)
  • NodeRuntime.resolveGatewayConnectAuth 确定认证方式;设置认证优先级最高

Lint 与代码质量

  • ktlint:强制执行 Kotlin 代码风格,违规时构建失败
  • Android Lint:将警告视为错误,配置了特定规则的例外
  • 维持较高的代码和资源质量标准

资源优化

从 APK 中排除:

  • 许可证文件(AL2.0、LGPL2.1)
  • 版本元数据
  • Kotlin 工具文件
  • 重复的 BouncyCastle 属性文件

共享资源:

  • 集成 OpenClawKit 共享目录,用于跨平台协议模型和资源
  • 资源添加到主源码集的 assets 目录,供运行时访问

https://deepwiki.com/openclaw/openclaw/7-security

安全性

本页面对 OpenClaw 的安全模型和实现进行高层概述。介绍了 OpenClaw 设计的核心信任假设、纵深防御审计系统、沙盒(Sandbox)机制以及密钥管理方案。


信任模型与范围

OpenClaw 采用个人助手信任模型。这意味着每个 Gateway 实例预期只有一个受信任的操作者。核心假设包括:

  • 受信任的主机与配置:OpenClaw 主机环境及其配置文件(例如 ~/.openclaw/openclaw.json)必须受到控制并被信任。任何能够修改此状态的人都被视为受信任的操作者。
  • 受信任的 Gateway 认证:已认证到 Gateway API(通过令牌、密码或设备配对)的调用方是受信任的操作者,拥有控制面(control-plane)权限。
  • Session Key 用于路由而非认证sessionKey 仅用于消息路由和上下文选择,不作为每用户的授权机制。
  • 不支持多租户对抗性隔离:不支持为多个互不信任或存在敌意的用户运行单一 Gateway。如需此类隔离,必须使用独立的 Gateway 实例(最好在不同的 OS 用户或主机上)。
  • 操作者信任边界:在 Gateway 内部,经过认证的操作者可以按设计查看所有会话元数据和历史记录。

此信任模型不声称具备强多租户安全保证,而是专注于在可信边界内实现有意识的最小访问权限。


安全审计系统

OpenClaw 纵深防御方法的基石是通过 CLI 命令 openclaw security audit 暴露的自动化安全审计功能。此命令对配置进行静态分析,检查文件系统状态,评估插件代码安全性,还可选择性地执行实时 Gateway 连通性探测。它能提醒操作者注意常见风险,如暴露的 Gateway 端点、宽松的文件系统权限、不安全的沙盒配置以及工具策略配置错误。

审计系统按严重级别(critical(严重)、warn(警告)、info(信息))对发现的问题进行分类,并提供修复建议。还可以使用 --fix 标志尝试自动修复某些问题。

发现类别与示例

审计系统检查 OpenClaw 配置和环境的各个方面。发现类别示例包括:

类别前缀示例检查
文件系统fs.*fs.state_dir.perms_world_writablefs.config.perms_writable
Gatewaygateway.*gateway.bind_no_authgateway.tailscale_funnel
沙盒sandbox.*sandbox.dangerous_bind_mountsandbox.dangerous_network_mode
工具tools.*tools.exec.host_sandbox_no_sandbox_defaults
频道channels.*channels.telegram.no_token
日志logging.*logging.redact_off

操作者可以定期运行审计,尤其是在配置更改或暴露网络接口之后,以维持安全态势。


沙盒与隔离

为降低执行任意工具和命令的风险,OpenClaw 采用具有分层安全验证和限制的 Docker 沙盒容器。这包括审查 Docker bind mount(绑定挂载)、验证网络配置,以及检查 seccomp 和 AppArmor 配置文件。

validateSandboxSecurity() 函数是此过程的核心,确保容器配置符合安全最佳实践。例如,validateBindMounts() 检查被阻止的主机路径(如 /etc/var/run/docker.sock),以防止权限提升或容器逃逸。类似地,validateNetworkMode() 会标记危险的网络设置,例如 host 模式或加入另一个容器的网络命名空间。还会检查 seccomp 和 AppArmor 配置文件,确保沙盒不会以不受约束(unconfined)的权限运行。

这种分层验证方法符合 OpenClaw 环境中容器隔离的推荐最佳实践。


密钥管理

OpenClaw 使用专用的 SecretRef 机制来安全管理敏感凭据。该系统允许将密钥(如 API token)存储在主配置文件之外,并在运行时动态引用。

SecretRef 系统支持环境变量风格的引用(例如 ${TELEGRAM_BOT_TOKEN}),在运行时进行解析。被识别为密钥的配置输入会在启用 logging.redactSensitive 时自动在日志中脱敏,防止意外泄露。此外,按代理或提供商管理的认证配置文件(Auth Profile)支持隔离的凭据管理和凭据轮换,进一步增强安全性。


摘要与后续步骤

OpenClaw 的安全性建立在单一受信任操作者边界的概念之上。其纵深防御方法利用配置验证、代码安全检查、沙盒容器隔离和密钥管理来降低风险。

有关安全模型的详细说明、配置指南和操作安全工具,请参阅以下子页面:

  • 安全模型与信任边界——详细的威胁模型假设、范围和信任边界说明。
  • 安全审计系统——审计 CLI、类别、严重级别指定和自动修复功能的完整文档。
  • 沙盒与隔离——深入介绍 Docker 沙盒设置、seccomp、AppArmor、挂载验证和网络隔离保障。
  • 密钥管理——全面介绍 SecretRef 系统、环境变量解析、Auth Profile 加密和凭据存储安全。

https://deepwiki.com/openclaw/openclaw/7.1-security-model-and-trust-boundaries

安全模型与信任边界

概述

OpenClaw 采用个人助手安全模型,“每个 Gateway 实例一个受信任的操作者边界”,管理可能包含多个代理的环境。它明确设计为多租户对抗性隔离系统。

核心信任假设

边界信任级别说明
Gateway 配置/状态(~/.openclaw受信任修改配置文件即获得有效的 Gateway 控制权
Gateway 已认证调用方受信任认证提供操作者级别的访问权限,无每用户隔离
Session Key路由上下文仅用于路由上下文选择,不作为授权
Channel 消息不受信任的输入可能包含提示词注入或社会工程学攻击
插件/扩展受信任代码在进程内以完整操作者权限执行
Skill受信任代码工作区 Skill 被视为受信任的操作者代码
记忆文件受信任状态明文记忆被视为受信任的操作者状态

信任边界定义

操作者信任边界

任何能够修改 Gateway 主机配置和状态目录、成功通过 Gateway API 认证或调用经认证的 RPC 的人,都共享同等的完整操作者信任级别。在互不信任的用户之间共享单一 Gateway 实例是不被支持且不安全的。对于对抗性多租户需求,必须为每个信任边界使用独立的 Gateway 实例。

Gateway 与 Node 信任概念

OpenClaw 在单一信任边界内区分两种角色:

  • Gateway: 管理认证、消息路由、工具策略和代理生命周期的控制面
  • Node: 执行命令和特权功能的远程执行接口(例如设备节点)

操作者认证适用于 Gateway 范围。配对流程和执行审批在相同的操作者信任范围内协调 Node 控制。执行审批提供有意识的操作者意图验证,而非对抗性多租户隔离。

安全审计系统

openclaw security audit 命令对配置问题、暴露风险和常见安全隐患进行自动化检查。

审计检查类别

类别关注点实现方式
文件系统状态/配置文件权限、符号链接权限和所有权验证
Gateway认证暴露、HTTP API 访问配置分析
沙盒Docker 配置、网络模式危险配置检测
频道DM/群组消息策略、允许列表访问控制验证
Skill代码安全性和权限工作区权限检查

沙盒与隔离

OpenClaw 使用基于 Docker 的沙盒(支持可插拔后端),通过纵深防御方式进行工具执行隔离:

  • Bind Mount 验证: getBlockedBindReason() 阻止挂载危险或敏感的主机目录
  • 网络模式: isDangerousNetworkMode() 验证安全的隔离设置
  • Seccomp/AppArmor: 通过 resolveSandboxConfigForAgent() 使用配置的配置文件限制系统调用访问

有针对性的拒绝列表阻止将敏感主机目录(凭据、系统文件)挂载到沙盒中。

访问控制层级

Gateway 认证

resolveGatewayAuth 函数根据配置确定活跃的认证模式:

  1. 通过 gateway.auth.mode 配置的显式模式(token、password、none)
  2. 若配置了 gateway.auth.token 则为隐式令牌模式
  3. 若设置了 gateway.auth.password 但未设置令牌模式,则为密码模式
  4. 若启用了 gateway.auth.allowTailscale,则使用 Tailscale 身份

Channel 访问控制

DM 策略行为
pairing(默认)未知发送方收到配对码,需操作者审批
allowlist只有 allowFrom 中明确列出的发送方才能发送消息
open接受所有入站消息(需要显式设置 allowFrom = ["*"]
disabled忽略入站 DM

工具策略解析

多层策略解析包括全局 Gateway 工具列表、代理特定策略、对敏感工具的仅限所有者访问限制,以及通过 resolveToolProfilePolicy()isToolAllowedByPolicies() 作出决策。

配置安全

危险配置标志

dangerousdangerouslyAllow 开头的配置键代表操作者的有意覆盖。示例包括 dangerousAllowUnsafeExecdangerouslyAllowAllToolsdangerousBrowserControl。操作者应仔细审查这些配置。

密钥管理

敏感值使用 SecretRef 环境变量或配置引用。hasConfiguredSecretInput 函数验证正确的密钥管理,防止意外暴露。

超出范围

以下模式在 OpenClaw 的信任模型中不属于安全漏洞:

模式理由
仅提示词注入不会破坏认证、执行审批或沙盒边界
多租户假设Gateway 不是多租户隔离边界
Session Key 用作认证令牌sessionKey 是路由上下文,不是授权凭据
已授权的本地操作已授权的操作者操作在设计上是受信任的
OpenAI 兼容的 HTTP 端点POST /v1/chat/completionsPOST /v1/responsesPOST /tools/invoke 提供完整操作者访问权限;x-openclaw-scopes 请求头被忽略

需要多用户对抗性隔离的操作者必须通过不同的 Gateway 实例、独立的 OS 用户或主机来物理强制执行信任边界。

摘要表格

信任边界描述由谁强制执行
操作者边界每个 Gateway 一个受信任用户Gateway 认证、OS 用户访问
Session Key路由上下文,不作为认证Gateway 路由
插件与 Skill 代码受信任的本地操作者代码文件系统访问、所有者控制
沙盒工具Docker/OS 工具执行沙盒Seccomp、网络模式、bind mount
Channel 访问按配置的允许列表设定 DM/群组策略DMPolicy、allowFrom 设置

结论

OpenClaw 假设单一受信任操作者控制每个 Gateway 实例及其主机环境。安全边界存在于 Gateway 认证层和文件系统/配置所有权层面。系统不在单一 Gateway 内提供对抗性多租户隔离。

纵深防御使用沙盒(Docker、seccomp、工作区约束)、分层工具策略强制执行和 Channel 允许列表来降低风险。定期使用 openclaw security audit 有助于发现配置错误和操作者常见失误,维持安全部署。


https://deepwiki.com/openclaw/openclaw/7.2-security-audit-system

安全审计系统

OpenClaw 的安全审计系统执行自动化安全检查,评估部署配置和运行时状态,以识别风险、配置错误和潜在漏洞。

命令接口

安全审计系统通过 CLI 命令调用:

  • 无标志(--deep/--fix/--json):运行专注于配置和文件系统检查的基础审计。
  • --deep:添加对 Gateway 的实时探测以及对 Docker 容器的检查,进行扩展分析。
  • --fix:尝试对特定类别的安全问题进行安全的自动修复。
  • --json:生成适合自动化或持续集成(CI/CD)使用的机器可读 JSON 报告。

严重级别与报告结构

审计系统将发现的问题分为三个主要严重级别:

严重级别描述
critical需要立即处理的紧急风险问题
warn应当被解决的重要安全问题
info供了解的信息性消息

每个 SecurityAuditFinding 包含:

  • checkId:检查项的唯一字符串标识符。
  • severity:三个严重级别之一。
  • title:简短的人类可读摘要。
  • detail:发现问题的详细说明。
  • 可选的 remediation:建议的修复操作或建议。

发现类别

1. Gateway 暴露检查

验证 Gateway 进程的网络暴露和访问控制配置。

关键检查项:

  • gateway.bind_no_auth:检测 Gateway 绑定到非回环接口但未启用认证的情况
  • gateway.loopback_no_auth:识别启用了 Control UI 但未启用认证的危险回环绑定
  • gateway.control_ui.allowed_origins_required:若 Control UI 暴露在回环之外,要求显式配置 CORS 允许来源
  • gateway.tailscale_funnel:若 Tailscale Funnel 在无限制的情况下公开暴露 Gateway 则发出警告
  • gateway.tools_invoke_http.dangerous_allow:检测通过未加密 HTTP 危险启用特权工具的情况

2. 文件系统权限检查

确保 OpenClaw 的状态和配置文件具有适当的访问控制。

详细方法:

  • POSIX 系统上,通过 stat() 模式位检查权限,确保状态目录(推荐 700)和配置文件(600)对组或其他用户不可访问。
  • Windows 上,解析 icacls 命令输出以验证访问控制列表(ACL),阻止 BUILTIN\Users 等通用组,只允许所有者和 SYSTEM

3. 沙盒与 Docker 安全检查

检查代理运行时的沙盒配置,以检测不安全的 bind mount、不安全的网络模式和不受约束的配置文件。

关键阻止或警告的条件:

  • Bind mount:禁止挂载关键系统目录(/etc/proc/sys/dev/root/boot)和 Docker socket
  • 网络模式:始终禁止 host 网络;加入另一个容器的命名空间需要显式的危险允许标志
  • Seccomp 和 AppArmor 配置文件:不受约束或缺失的配置文件会触发严重警告
  • 浏览器沙盒:若容器使用不受限制的 Chrome DevTools Protocol(CDP)桥接则发出警告

4. 工具策略与暴露检查

检查工具允许策略及其与 Channel 安全的交叉关系。

识别的危险场景包括:

  • 配置为 groupPolicy: "open" 并结合 tools.elevated.enabled: true 的 Channel 会产生严重的提示词注入和命令执行风险
  • 没有沙盒或工作区隔离的情况下,开放群组策略与运行时或文件系统工具共同暴露
  • 代理将全局最小工具配置文件覆盖为更高风险的配置文件会触发警告
  • 具有宽松工具策略的可访问插件会产生关于权限提升风险的警告

5. Channel 安全检查

关注消息 Channel 的访问控制策略,确保只有授权用户才能发送消息或调用工具。

特别需要注意:

  • 开放 DM 策略,因为它允许任何用户向代理发送消息
  • 开放群组策略,标记为信息级别但仍存在风险
  • 使用通配符(*)的 allowFrom 列表,可能意外允许大范围访问
  • 在允许列表中使用可变名称而非稳定唯一 ID
Channel稳定 ID可变名称
Discord用户 ID(123456789012345678用户名(@username
Slack用户 ID(U01234567显示名称
Google Chat用户 ID(users/123456789012345678邮箱
MS TeamsAAD 对象 IDUPN / 邮箱

6. 模型卫生与小模型风险

分析已配置的语言模型,检测使用遗留或小容量模型的情况,这些情况会增加提示词注入风险。

重点:

  • 遗留模型(例如 GPT-3.5、Claude 2)由于已知限制会收到警告
  • 参数估计 ≤300B 的模型被视为”小模型”,面临更大的提示词注入风险
  • 无沙盒且结合高风险工具运行的小模型会生成严重警告
  • 沙盒配置更好的小模型标记为信息级别

审计架构

高层收集器管道

runSecurityAudit 函数协调一系列收集器(collector),部分为同步方式仅分析配置数据,其他为异步方式执行 I/O 检查和实时探测,最终汇总为统一的 SecurityAuditReport

  • 同步收集器提供快速的配置级输出。
  • 异步收集器需要文件系统或网络访问。
  • Deep 模式启用 WebSocket 探测 Gateway 和 Docker 容器运行时数据。

自动修复系统

使用 --fix 调用时,审计系统尝试通过 fixSecurityFootguns() 函数对某些常见安全隐患进行安全的确定性修复。

自动修复策略:

  1. 配置重写: 系统读取 openclaw.json,修改已识别的漏洞设置,然后回写配置,保留格式和注释。
  2. 文件系统权限: 在 POSIX 上使用 chmod,在 Windows 上使用 icacls,收紧主状态目录、主配置文件、代理凭据存储和会话文件的访问权限。
  3. WhatsApp 允许列表迁移:groupPolicyopen 改为 allowlist,则从旧版 allowFrom 列表中填充 groupAllowFrom,实现平滑迁移。
  4. 有限范围: 修复专注于安全的确定性更改,不改变手动自定义内容。

摘要

OpenClaw 的安全审计系统是一个重要工具,可持续评估多个领域的配置和运行时状态安全健康状况:Gateway 网络暴露、主机文件系统控制、沙盒、工具访问策略和消息 Channel 控制。它为操作者提供结构化的、按严重级别分级的报告,并支持针对常见问题的自动修复。模块化收集器设计便于扩展和进行更深入的检查。


https://deepwiki.com/openclaw/openclaw/7.3-sandboxing-and-isolation

沙盒与隔离

OpenClaw 采用全面的沙盒和隔离系统,主要利用 Docker 容器在隔离环境中安全运行代理工具执行。此架构通过对工具执行任务进行沙盒化,并严格控制文件系统和网络访问,将不受信任的模型生成代码带来的潜在风险降至最低。


沙盒架构概述

OpenClaw 支持多种沙盒后端,包括 Docker(默认本地后端)、基于 SSH 的远程沙盒和 OpenShell 管理的环境。沙盒功能为可选项,通过 agents.defaults.sandbox 或每个代理的沙盒设置进行配置。

核心组件与数据流

组件角色代码实体与位置
Sandbox Backend Manager(沙盒后端管理器)协调沙盒生命周期和后端选择getSandboxBackendManager() src/agents/sandbox/index.ts
Sandbox Context(沙盒上下文)存储沙盒状态、工作区路径和选项SandboxContext 类型 src/agents/sandbox/types.ts
Tool Policy(工具策略)强制执行哪些工具可以在沙盒中运行的规则resolveSandboxToolPolicyForAgent() src/agents/sandbox/tool-policy.ts
Filesystem Bridge(文件系统桥)跨边界抽象文件系统操作SandboxFsBridge 接口及实现 src/agents/sandbox/fs-bridge.ts
Docker Backend(Docker 后端)实现 Docker 容器沙盒运行时包括 buildSandboxCreateArgs 在内的各函数 src/agents/sandbox/docker.ts
Browser Sandbox(浏览器沙盒)管理带 CDP 端口的隔离浏览器容器ensureSandboxBrowser() src/agents/sandbox/browser.ts

沙盒模式与范围

OpenClaw 提供灵活的模式和范围策略,以精细调整隔离级别。

沙盒模式

agents.defaults.sandbox.mode 控制:

  • off:无沙盒;工具执行在主机上进行。
  • non-main (默认):仅对非主会话(例如群聊)的工具执行进行沙盒化。
  • all:无论会话如何,所有工具执行都在沙盒中运行。

沙盒范围

通过 agents.defaults.sandbox.scope 配置,控制沙盒容器的复用:

范围描述隔离级别
session每个独立会话 key 一个容器(最大隔离)
agent给定代理的所有会话共享一个容器
shared所有沙盒会话全局共享一个容器

这有助于在资源使用和隔离保证之间取得平衡。


Docker 沙盒实现细节

主要沙盒后端使用 Docker Engine 运行临时的、经过加固的容器,工具在其中执行。

容器创建与加固标志

Docker 容器创建过程在 buildSandboxCreateArgs() 中实现,该函数生成 docker createdocker run 命令的参数。关键安全配置包括:

  • 权限(Capability)丢弃:除明确所需的之外,丢弃所有 Linux capabilities。例如,丢弃 NET_RAWSYS_ADMIN 等,以限制网络和系统访问。
  • 禁止新特权--security-opt no-new-privileges=true 禁止容器内的权限提升。
  • 只读文件系统:可选设置,将容器文件系统挂载为只读。
  • 资源限制:可设置 CPU、内存限制和进程数限制(pids-limit),以缓解资源耗尽。

Bind Mount 验证

OpenClaw 在将 bind mount 应用到沙盒容器之前进行验证,以防止容器逃逸。

Bind Mount 验证步骤

  • 被阻止的路径包括关键系统目录,如 /etc/proc/sys/dev/var/run/docker.sock/root,这些目录被禁止作为 bind 源。
  • 工作区目录和显式允许的 bind mount 源被允许。

网络隔离与危险标志

默认网络模式

沙盒容器默认使用 Docker 的 network: "none" 模式,以阻止任何外部网络访问并防止数据泄露。

允许的网络模式

网络模式描述安全级别
none无网络访问(默认,最安全)最高隔离
bridge标准 Docker bridge 网络中等隔离
host主机网络(不允许)被禁止

主机网络被显式阻止,通过 schema 验证和运行时检查实现,以防止沙盒访问 Gateway 的本地服务和私有网络。

高级用途的危险标志(需主动开启)

  • dangerouslyAllowExternalBindSources:允许在 OpenClaw 配置的工作区根目录之外进行 bind mount——若挂载路径敏感则可能不安全。
  • dangerouslyAllowReservedContainerTargets:允许挂载到保留的容器路径,如 /workspace 或其他内部挂载点。
  • dangerouslyAllowContainerNamespaceJoin:允许沙盒容器加入其他容器的网络命名空间,实现跨容器通信。

这些标志面向了解风险的专家用户,适用于需要对默认隔离策略进行更精细控制或例外处理的场景。


Docker 与 Gateway 容器配置

OpenClaw Gateway 本身可以在 Docker 中运行。官方 Docker Compose 文件 docker-compose.yml 包含必要的环境变量、卷和安全选项。

Docker Compose 配置要点

  • Gateway 容器挂载:
    • 主机配置目录到 /home/node/.openclaw
    • 工作区目录到 /home/node/.openclaw/workspace
  • Docker socket 挂载和组权限为可选项,用于从容器内启用沙盒(通过嵌套 Docker 命令)。默认出于安全原因禁用。
  • 健康检查端点 /healthz 使 Docker 和编排器能够监控容器存活状态。
  • CLI 容器与 Gateway 共享网络命名空间,但为了加固安全性,禁用了原始网络能力。

浏览器沙盒与隔离

OpenClaw 支持在 Docker 容器中运行沙盒化浏览器,使代理具备浏览能力,同时不会使主机面临暴露风险。

功能特性

  • 专用 Docker 网络(通常为 openclaw-sandbox-browser)将浏览器流量与主 bridge 网络隔离。
  • CDP 来源范围限制:Chrome DevTools Protocol 端口的受控入站规则,限制允许连接的 IP 范围。
  • noVNC 查看器认证:Web VNC 访问通过密码或短效令牌保护,令牌以安全方式通过 URL 片段传递,防止凭据泄露到日志中。
  • 镜像验证:系统在启动前验证沙盒浏览器镜像是否可用,若缺失则指示管理员重新构建。

SSH 与远程沙盒后端

除 Docker 外,OpenClaw 还支持远程 SSH 沙盒后端(backend: "ssh"),允许在远程机器上执行。

特点

  • 远程文件系统为规范工作区:初始 seeding 之后,远程文件系统具有权威性。seed 后主机文件的更改在沙盒重建前不可见。
  • 凭据注入:支持通过文件路径或内联密钥(SecretRefs)传递 SSH 密钥。在会话期间,使用严格权限(0600)创建临时文件来保护密钥。
  • 工作区 Seeding:沙盒创建或重建时,将主机工作区一次性复制到远程工作区根目录。

摘要表格

功能后端支持默认设置补充说明
工具执行沙盒Docker、SSH、OpenShellagents.defaults.sandbox.mode = "non-main"除 OpenShell 外均需要安装脚本或配置
Bind Mount 验证仅 Docker严格验证,阻止敏感路径验证拒绝挂载 /etc/proc/dev
网络隔离仅 Dockernetwork: "none"禁止主机网络;命名空间隔离
浏览器沙盒仅 Docker默认禁用,需显式启用支持专用 Docker 网络、CDP 入站过滤
危险标志仅 Docker默认禁用可选标志启用非标准功能

https://deepwiki.com/openclaw/openclaw/7.4-secret-management

OpenClaw 中的密钥管理

OpenClaw 实现了一套复杂的密钥管理系统,将凭据引用与实际敏感值解耦,支持多种后端,包括环境变量、文件和可执行文件。

核心 SecretRef 抽象

系统使用一种叫做 SecretRef 的可辨别联合(discriminated union)类型来定义密钥的来源。这种严格验证的方法支持三种来源类型:

  • env:引用使用经过验证的正则表达式模式的环境变量
  • file:使用可选的 JSON 指针从 JSON 文件中提取密钥
  • exec:通过执行经过绝对路径验证的命令来生成密钥

SecretInput 可以是明文,也可以是包含 source 字段、id(键/路径)和可选 provider 别名的 SecretRef 对象。

密钥解析管道

解析时,系统启动一个带有记忆化(memoized)的管道来获取实际值,防止冗余 I/O。prepareSecretsRuntimeSnapshot 函数从配置和 Auth Profile 中收集所有密钥赋值,然后通过特定来源的实现解析其值。

实现细节:

  • 环境变量通过 process.env 解析
  • 基于文件的密钥使用 readJsonPointer 进行结构化提取
  • 可执行文件密钥通过 isSafeExecutableValue 安全检查后生成子进程

Auth Profile 与凭据优先级

OpenClaw 通过存储在 auth-profiles.json 中的 Auth Profile 管理模型提供商凭据。系统支持 ApiKeyCredentialTokenCredentialOAuthCredential 类型。

凭据解析遵循以下优先级:

  1. 显式配置(models.json 中的 apiKey/token
  2. auth-profiles.json 中的 Auth Profile
  3. 隐式环境变量(例如 OPENAI_API_KEY

安全措施

文件系统安全: 系统通过 assertSecurePath 强制执行严格保护:

  • 所有文件/可执行密钥必须使用绝对路径
  • 文件不能对所有人可读
  • 可执行文件限制在特定的安全目录中

环境变量清理: 执行本地命令时,Gateway 会剥离敏感变量,如 NODE_OPTIONSLD_PRELOADSSLKEYLOGFILE,并防止不受信任的输入覆盖 HOMEPATH 等关键变量。

审计集成: 密钥管理与安全审计系统集成。redactConfigSnapshot 函数使用 REDACTED_SENTINEL 占位符从配置快照中删除敏感信息,防止意外在日志中暴露。

审计发现

安全审计会识别以下密钥相关风险:

  • 存储在全局可读文件中的密钥
  • openclaw.json 中的明文密钥(应使用 SecretRef
  • 即将过期的 OAuth token(在过期前 24 小时发出警告)

https://deepwiki.com/openclaw/openclaw/8-build-and-release

构建与发布

目的与范围

OpenClaw 跨多个平台和渠道构建和发布软件制品,以支持多样化的部署目标:

  • Node.js 包(npm 上的 openclaw):CLI 和 Gateway 服务器运行时
  • Docker 镜像(托管在 GitHub Container Registry,即 GHCR):多架构支持(amd64、arm64)
  • macOS 应用:带有基于 Sparkle 自动更新的菜单栏应用
  • iOS/watchOS 应用:原生移动端和可穿戴设备客户端
  • Android 应用:通过 APK/AAB 分发的原生 Android 客户端

构建系统:

  1. 将 TypeScript 源码编译为针对 Node.js 和 Docker 运行时优化的 JavaScript 包
  2. 为 iOS/macOS(Swift/Xcode 构建)和 Android(Kotlin/Gradle 构建)生成原生应用二进制文件
  3. 打包并导出插件 SDK 子路径,供第三方扩展使用
  4. 在发布前验证构建和发布制品
  5. 支持通过智能代码范围检测进行增量 CI/CD 构建

8.1 多平台构建系统

使用 tsdown 的 Node.js 构建

核心 Node.js 运行时使用 tsdown 将主应用源码、插件 SDK 子路径导出以及捆绑的插件入口点编译为统一的可分发 JavaScript 依赖图。这确保了配置注册表等运行时单例在整个代码库中正确共享。

关键方面:

  • 入口点涵盖核心运行时(indexentry)、内部兼容性 shim 和插件 SDK 导出
  • 插件 SDK 导出动态将子路径(如 openclaw/plugin-sdk/compat)映射到源文件
  • 捆绑扩展发现自动包含 extensions/* 目录下的扩展

iOS/macOS 和 Android 原生构建

  • iOS/macOS:使用 XcodeGen 从 YAML 配置生成 Xcode 项目。发布构建生成通用二进制文件
  • Android:使用 Gradle Kotlin DSL(Kotlin 领域特定语言)。采用灵感来自 CalVer(日历版本)的 versionCode 格式 YYYYMMDDNN,构建多 ABI 输出

8.2 CI/CD 流水线

GitHub Actions 工作流结合自定义脚本,提供智能的构建和测试编排。

工作流概述

关键要素:

  • 智能范围检测preflight 任务运行 scripts/ci-changed-scope.mjs 以检测哪些区域发生了变化(Node、macOS、Android、Windows),允许 CI/CD 跳过不相关的任务。detectChangedScope 函数根据文件变化确定要运行哪些构建通道。

  • 测试分片:Linux Node 测试被拆分为多个分片以提高吞吐量

  • 发布验证release-check 任务验证 npm pack 的内容,确保 dist/control-ui/index.html 等必需文件存在,且解包大小在预算范围内


8.3 发布流程

OpenClaw 采用 CalVer 版本方案(YYYY.M.D),并发布到多个分发渠道。

版本控制

稳定版采用 CalVer(YYYY.M.D)方案,预发布版使用 -beta.N,稳定版修正使用 -N

发布渠道

  1. npm:通过 OpenClaw NPM Release 工作流发布。稳定版默认使用 beta npm dist-tag,可显式提升为 latest

  2. Docker:构建多架构镜像(amd64arm64)并推送到 GHCR。通过 OPENCLAW_VARIANT=slim 构建参数提供 “slim” 精简变体。

  3. macOS:通过 GitHub Releases 分发,Sparkle 的 appcast.xml 管理自动更新版本。


8.4 测试策略

OpenClaw 遵循全面的测试方法,整合了快速单元测试和基于虚拟机的端到端冒烟测试。

  • Vitest:Node.js 和插件逻辑的主要测试运行器

  • 安装脚本冒烟测试:在纯净环境中验证 install.sh 和 Dockerfile 构建,确保初始化功能正常运行

  • E2E 冒烟测试:CI/CD 中的 runChangedSmoke 标志指示变更是否影响安装或打包流程,从而触发特定的冒烟测试


https://deepwiki.com/openclaw/openclaw/8.1-multi-platform-build-system

多平台构建系统

本文档描述 OpenClaw 在 Node.js、iOS/macOS、Android 和 Docker 平台上的构建基础设施,使用 tsdownXcodeGen、SwiftPM 和 Gradle 等专用工具。

构建目标矩阵

平台构建工具主要语言输出制品关键配置文件
Node.js/CLItsdownTypeScriptdist/tsdown.config.ts
iOSXcodeGenSwift 6.0.ipa 归档apps/ios/project.yml
macOSSwiftPM + ShellSwift 6.0.appscripts/package-mac-app.sh
AndroidGradleKotlin.apk.aabapps/android/app/build.gradle.kts
DockerbuildxNode.js多架构镜像package.json

Node.js 构建管道:tsdown

概述

Node.js 核心使用 tsdown,这是一个针对 Node.js 优化的 TypeScript 打包工具。它将核心逻辑、Plugin SDK 和捆绑扩展编译为统一的依赖图,确保配置注册表等运行时单例被正确共享。

配置逻辑

  • 平台定向: 强制使用 platform: "node" 并禁用固定扩展名,以兼容 Node ESM 加载器
  • 入口点: 动态构建核心逻辑(index.tsentry.ts)、Plugin SDK 子路径以及在 src/hooks/bundled 中发现的捆绑钩子的入口映射
  • 警告抑制: 抑制来自遗留依赖项(例如 protobufjsbottleneck)的特定 EVAL 警告

发布验证

scripts/release-check.ts 工具执行构建后验证:

  • 大小预算: 强制执行解包大小限制(约 190 MiB),防止在低内存设备上出现内存溢出(OOM)
  • 制品完整性: 验证关键文件,如 dist/index.jsdist/build-info.json 和 control-ui 资源
  • 禁止路径: 阻止意外包含 node_modules 和内部构建目录(如 dist-runtime/

iOS/macOS 构建系统

面向 iOS 的 XcodeGen

iOS 项目管理使用 XcodeGenapps/ios/project.yml 生成 .xcodeproj 文件:

  • 目标: 定义主 OpenClaw 应用、OpenClawShareExtensionOpenClawWatchAppOpenClawActivityWidget
  • 签名: 使用 Signing.xcconfigLocalSigning.xcconfig 配置开发团队和包 ID
  • 构建脚本: 在构建前阶段注入 SwiftFormatSwiftLint 以保证代码质量

macOS 通用包打包

scripts/package-mac-app.sh 脚本协调从原始二进制文件到已签名 .app 包的转换过程:

  • 多架构支持: 同时为 arm64x86_64 编译,使用 lipo 创建通用 fat 二进制文件
  • Sparkle 集成: 将自动更新元数据(SUFeedURLSUPublicEDKey)注入最终的 Info.plist
  • 版本管理: 使用 scripts/sparkle-build.ts 从 CalVer 字符串派生数字 CFBundleVersion

Android 构建系统:Gradle

构建变体

  • 产品变体: 支持 play(符合 Google Play 规范)和 thirdParty(为侧载启用短信/通话记录等敏感权限)
  • 签名逻辑: 自动检测 ~/.gradle/gradle.properties 中是否存在发布签名属性;若缺失则提前失败并给出描述性错误

优化

  • 代码混淆: 发布构建启用 R8/ProGuard 代码混淆和资源压缩以减小 APK 大小
  • ABI 过滤: 包含 armeabi-v7aarm64-v8ax86x86_64 的原生库
  • 版本管理:defaultConfig 中设置 versionCodeversionName;使用 versionName 构造输出 APK 文件名

构建制品摘要

制品源位置职责
dist/index.jssrc/index.tsNode.js Gateway 的主入口点
dist/plugin-sdk/src/plugin-sdk/*面向外部插件的暴露 API 接口
OpenClaw.appapps/macos/macOS 通用应用包
openclaw-*.apkapps/android/Android 应用包(Play/ThirdParty)

https://deepwiki.com/openclaw/openclaw/8.2-cicd-pipeline

CI/CD 流水线

目的与范围

本文档描述 OpenClaw 的持续集成和部署基础设施,包括 GitHub Actions 工作流、用于优化任务执行的智能范围检测、测试分片策略、平台特定验证以及发布自动化。流水线通过条件执行和测试并行化,在 Node.js、Android、iOS 和 macOS 组件之间维持质量,同时最大限度地缩短构建时间。

概述

OpenClaw CI/CD 流水线在每次向 main 的推送和所有 PR 时激活。它采用多阶段模型,其中轻量级的”门控”任务决定是否应执行资源密集型的平台特定任务。

关键工作流:

  • CI(ci.yml:运行包括 lint、测试、构建和平台特定测试在内的验证
  • 安装冒烟测试(install-smoke.yml:对 Docker 构建和安装脚本进行冒烟测试
  • Docker 发布(docker-release.yml:创建并发布多架构 Docker 镜像
  • 自动响应(auto-response.yml:使用标签自动化 issue 和 PR 分类
  • CodeQL(codeql.yml:跨语言的安全漏洞静态分析

范围检测系统

OpenClaw 实现了两阶段检测系统,以节省资源并减少周转时间,区分仅文档变更和代码变更,并确定影响的系统部分。

第一阶段:Docs-Scope 任务

preflight 任务分析修改的文件。若仅检测到文档变更,流水线将 docs_only 设置为 true,从而阻止执行昂贵的平台任务。

第二阶段:Changed-Scope 任务

scripts/ci-changed-scope.mjs 脚本计算平台范围:

  • Node.js(run_node:由 src/test/extensions/ 中的变更触发
  • 原生 macOS(run_macos:由 apps/macos/Swabble/ 变更触发
  • Android(run_android:由 apps/android/ 变更触发
  • Python Skills(run_skills_python:由 skills/pyproject.toml 变更触发
  • 安装冒烟测试(run_changed_smoke:由 scripts/install.sh 或 Dockerfile 变更触发

测试分片与并行化

OpenClaw 使用 scripts/test-parallel.mjs 管理跨环境的测试执行。

基于规划器的执行

该脚本提供:

  1. 测试面选择:按 unitextensionschannelscontractsgateway 过滤测试
  2. 执行计划:运行前生成计划,允许使用 --plan 进行诊断性干跑
  3. 失败策略:支持 fail-fast(快速失败)或 collect-all(收集所有)模式

隔离与固定

  • 线程固定src/commands/backup.test.ts 等测试被固定到线程以提高性能
  • Fork 隔离:Discord 和 WhatsApp 监控测试在 fork 的通道中隔离,防止 mock 污染
  • 内存热点:高 RSS 测试移至专属通道以允许内存回收

平台特定验证

Windows 分片

Windows 验证在 blacksmith-32vcpu-windows-2025 运行器上运行。测试分布在 6 个分片中以管理资源约束。

macOS 和 iOS

macos 任务在 macos-latest 上运行,执行:

  1. pnpm test 用于 Node.js 逻辑
  2. swiftlintswiftformat 用于原生代码质量
  3. macOS 应用和共享框架的原生构建

Android

android 任务验证 Jetpack Compose UI 和 Gradle 构建系统。为保证 Android SDK 稳定性,强制使用 JDK 17。

发布与部署流水线

Docker 多架构发布

docker-release.yml 工作流生成 linux/amd64linux/arm64 镜像。

  • 变体:支持 defaultslim(通过 OPENCLAW_VARIANT=slim
  • 注册中心:推送到 GitHub Container Registry(ghcr.io
  • 版本控制:使用 CalVer(例如 v2026.3.22

安装冒烟测试

使用 Docker 验证安装生命周期:

  • CLI 冒烟测试:确保容器中 openclaw --version 可以正常运行
  • 扩展冒烟测试:验证捆绑扩展的运行时依赖项已正确镜像
  • 安装脚本冒烟测试:在 Docker 中为各种场景(包括非 root 安装)构建并测试 install.sh 脚本

维护自动化

自动响应与标签

auto-response.ymllabeler.yml 工作流管理社区互动:

  • 大小标签:自动应用 XS(<50 行)到 XL(>1000 行)的标签
  • Skill 重定向:添加 Skill 的 PR 自动关闭并指向 Clawhub
  • 停滞管理:7 天无活动后将 Issue 标记为停滞,再过 5 天后关闭

https://deepwiki.com/openclaw/openclaw/8.3-release-process

发布流程

概述

本文档描述 OpenClaw 的版本控制策略、发布验证以及针对 npm、Docker 和原生平台(macOS、iOS、Android)的分发流程。

CalVer 版本控制方案

OpenClaw 使用基于日历的版本控制(CalVer),格式为 YYYY.M.D[-beta.N]

  • 稳定版YYYY.M.D(例如 2026.3.13)——月份和日期从不补零
  • 修正版YYYY.M.D-N 用于稳定版热修复
  • Beta 版YYYY.M.D-beta.N 用于预发布测试

发布通道:

通道Git 标签npm 标签描述
稳定版vYYYY.M.Dlatest生产就绪的版本
Beta 版vYYYY.M.D-beta.Nbeta经过验证的预发布版
Dev 版(无)devmain 分支的滚动头

发布验证流水线

预检与范围确定

CI/CD 流水线根据文件变更检测哪些平台需要测试:

  • 仅文档变更:跳过所有功能测试
  • 仅原生变更:若仅有 .swift.kt 文件变更,则跳过 Node.js 测试

npm 发布检查

scripts/openclaw-npm-release-check.ts 脚本执行严格的结构性验证:

  • 元数据:验证 package.json 包含正确的名称(openclaw)、许可证(MIT)和仓库 URL
  • 载荷:若 dist/control-ui/index.html 或资源缺失则失败
  • CalVer 逻辑:验证版本字符串中的发布日期在当前 UTC 日期的 2 天以内

Docker 发布流程

镜像变体

  1. 默认版:基于 node:24-bookworm
  2. 精简版(Slim):基于 node:24-bookworm-slim,体积更小

构建与 Manifest 工作流

该流程并行为 linux/amd64linux/arm64 构建特定架构的镜像,然后将其合并为单一的多架构 manifest。

原生平台发布

macOS 和 iOS

  • macOS 更新:通过 Sparkle 分发,需要 .zip.dmg.dSYM.zip 制品
  • Appcastmain 分支上的 appcast.xml 在发布后使用 scripts/make_appcast.sh 更新,指向新的稳定版 ZIP
  • 版本位置:在所有目标的 package.json、macOS Info.plist 和 iOS Info.plist 文件中维护

Android

  • 构建系统:使用 Gradle 生成制品
  • 签名:发布构建需要 Gradle 属性(OPENCLAW_ANDROID_STORE_FILEOPENCLAW_ANDROID_STORE_PASSWORDOPENCLAW_ANDROID_KEY_ALIASOPENCLAW_ANDROID_KEY_PASSWORD
  • 版本命名:在 build.gradle.ktsdefaultConfig 中设置 versionCodeversionName
  • 输出命名:APK 文件名自定义,包含版本、变体和构建类型(例如 openclaw-2026.4.3-play-release.apk

自动化与维护

发布环境包括:

  • Labeler(标签器):根据行数变更应用 PR 大小标签(XS 到 XL)
  • 自动响应:自动关闭超过活跃限制(每用户 10 个)或涉及无关第三方扩展的 PR
  • 停滞管理:7 天后将 Issue 标记为停滞,5 天后将 PR 标记为停滞

https://deepwiki.com/openclaw/openclaw/8.4-testing-strategy

测试策略

OpenClaw 采用多层测试策略,涵盖单元测试、集成测试、平台特定验证和端到端(E2E)冒烟测试。该策略由一个自定义并行执行包装器管理,专为高内存本地开发和资源受限的 CI/CD 环境进行了优化。


测试框架与配置

OpenClaw 使用 Vitest 作为主要测试框架。测试套件分为三个主要层次:单元/集成测试、E2E 测试和实时提供商测试。

核心测试配置

配置文件用途
vitest.unit.config.ts核心逻辑的单元测试配置
vitest.e2e.config.tsGateway 冒烟测试(多实例 WS/HTTP/node pairing)
vitest.live.config.ts真实提供商/模型验证(需要 API 密钥)
scripts/test-parallel.mjs用于分片和内存管理的基于规划器的执行包装器

运行时行为

  • 进程隔离:大多数测试套件默认使用 Vitest forks 进行确定性的跨文件隔离
  • 模块缓存:使用带有通道本地路径的 OPENCLAW_VITEST_FS_MODULE_CACHE,防止并发执行期间的竞态条件
  • 自适应 Worker:E2E 测试根据环境调整 worker 数量(CI/CD:最多 2 个,本地:默认 1 个)

测试组织与执行流程

测试架构通过 test-parallel.mjs 包装器和行为清单,将自然语言需求(如”运行单元测试”)桥接到具体代码实体。

基于通道的调度

并行运行器根据签入的行为清单将测试分类到通道中:

  • 线程固定:经测量在线程中比 fork 更快或更稳定的文件(例如 src/commands/backup.test.ts
  • 隔离通道:使用 hoist mock 或修改全局状态的文件被隔离在专用 fork 通道中,防止污染(Discord 和 WhatsApp 监控测试中常见)
  • 高内存热点:RSS 增长较高(接近 1.0 GiB)的文件被剥离到专用通道,以允许内存回收

CI/CD 测试流水线

CI/CD 流水线使用基于清单的方法在 GitHub Actions 运行器之间分片工作,同时保持确定性结果。

CI/CD Manifest 生成

包装器可以通过 --ci-manifest 为 CI/CD 分片生成 JSON manifest。这允许 CI/CD 将特定测试通道分布到多台机器上。

致命输出守卫

OpenClaw 实现了”致命守卫”(Fatal Guard)来捕获可能以代码 0 退出的 V8 内存不足(OOM)错误。

  • hasFatalTestRunOutput:扫描日志中的”JavaScript heap out of memory”或”FATAL ERROR”
  • resolveTestRunExitCode:若在捕获的输出中检测到致命错误,则强制返回非零退出码

E2E 与冒烟测试

Parallels 虚拟机冒烟测试

OpenClaw 使用 Parallels 虚拟机(VM)验证 macOS、Windows 和 Linux 上的原生平台行为。这些测试覆盖”全新安装”和”升级路径”场景。

平台入口点关键验证
macOSpnpm test:parallels:macos安装脚本一致性、dashboard 加载、Safari 本地连接
Windowspnpm test:parallels:windowsPowerShell 运行器、.cmd shim 验证、Gateway token 不匹配检查
Linuxpnpm test:parallels:linuxUbuntu ARM64 引导、--local 代理执行
升级pnpm test:parallels:npm-update从 npm latest 升级到当前 main 分支 tgz

实时提供商探测

实时测试(pnpm test:live)验证 OpenClaw Gateway 与真实 LLM 提供商之间的集成。

探测机制

  • 工具探测:验证模型能否使用 nonce(一次性随机数)正确触发系统工具并读取返回结果
  • 图像探测:使用 renderCatNoncePngBase64 通过要求模型描述动态生成的图像来验证视觉功能
  • 重试:针对速率限制和计费错误(例如 isAnthropicRateLimitError)实现特定的重试逻辑

基准测试

OpenClaw 包含用于性能回归测试的专用脚本:

  • 模型延迟scripts/bench-model.ts 测量不同提供商的中位数、p50 和 p95 延迟
  • CLI 启动scripts/bench-cli-startup.ts 验证 statushealth 等核心命令保持响应
  • 计时更新pnpm test:perf:update-timings 刷新 test-timings.unit.json 清单,确保并行调度器拥有准确的权重数据

https://deepwiki.com/openclaw/openclaw/9-development

开发

本页面介绍 OpenClaw 贡献的高层指南、仓库组织以及标准开发工作流。OpenClaw 是一个使用现代工具的多平台 TypeScript monorepo(单一代码仓库)。

贡献

OpenClaw 欢迎从 bug 修复到新功能的各类贡献。项目遵循”仁慈独裁者”模式,核心维护者监督特定子系统。

  • 工作流: 贡献者应使用 PR 模板并确保本地检查通过。仅重构的 PR 一般不被接受,除非维护者明确要求。
  • AI 辅助审查: 项目使用 Codex 进行自动化代码审查。贡献者应在人工审查之前解决或回应机器人的对话。
  • 标签: 完善的标签系统按大小(size: XSsize: XL)和子系统(例如 channel:telegramapp:ios)对 PR 进行分类。

有关详细的贡献指南和维护者列表,请参阅”贡献”页面。

项目结构

仓库组织为 pnpm workspace monorepo,将核心 Gateway 逻辑与平台特定客户端和可扩展插件隔离开来。

核心布局

目录用途
src/核心 TypeScript 源码:Gateway、CLI 和内置 channel
extensions/插件包(例如 googlechatmemory-lancedb
ui/基于 Lit 构建的浏览器 Control UI
packages/共享内部工具和兼容性 shim
apps/iOS、macOS 和 Android 的原生客户端源码

依赖管理

OpenClaw 强制执行严格的导入边界。扩展必须通过 openclaw/plugin-sdk 与核心交互,而不是直接从 src/ 导入。这确保了内部实现演进时的稳定性。扩展在各自的 package.json 文件中声明依赖项,除非核心也使用这些依赖,否则应避免添加到根 package.json 中。

开发工作流

OpenClaw 使用 oxlint 进行 lint 检查和 vitest 进行测试,优先提供”快速失败”的本地开发体验。

标准流水线

  1. 安装: pnpm install 链接工作区包并安装外部依赖
  2. 执行: 使用 pnpm devpnpm openclaw 通过 Bun 运行 CLI/Gateway 进行快速迭代
  3. 验证: 运行 pnpm check 执行 Oxlint、Oxfmt 和 TypeScript 类型检查(pnpm tsgo
  4. 测试: 使用 pnpm test 运行完整套件,或使用 pnpm test:extension <name> 进行针对性插件测试

系统组件映射

高层系统职责映射到具体代码入口点:

  • Control UI 位于 ui/package.json,是基于浏览器的仪表盘
  • Plugin SDKsrc/plugin-sdk/core.ts 中定义,用于扩展性
  • 核心服务 组织在 src/ 中,Gateway、CLI 和 channel 之间有清晰的边界
  • 扩展包 位于 extensions/,提供专业功能而不修改核心

有关详细的安装说明、调试技巧和测试最佳实践,请参阅”开发工作流”页面。


https://deepwiki.com/openclaw/openclaw/9.1-contributing

贡献

本页面介绍 OpenClaw 项目的贡献指南、PR 工作流、标签系统和代码审查流程。

概述

OpenClaw 欢迎以下类别的贡献:

  1. Bug 修复与小修改:直接开 PR
  2. 新功能 / 架构变更:先开 GitHub Discussion 或在 Discord 中沟通
  3. 仅重构或仅测试/CI/CD 的 PR:除非明确要求,否则不要开
  4. 问题:使用 Discord 的 #help#users-helping-users

新 Skill 应发布到 Clawhub,而不是提交到核心仓库。

维护者与负责区域

OpenClaw 由一个核心维护者团队领导,各人负责特定子系统:

维护者GitHub负责领域
Peter Steinberger@steipete仁慈独裁者
Shadow@thewilloftheshadowDiscord、Clawhub、社区
Vignesh@vignesh07记忆(QMD)、TUI、IRC、Lobster
Jos@joshp123Telegram、API、Nix 模式
Ayaan Zaidi@obviyusTelegram、Android 应用
Tyler Yust@tyler6204代理、Cron、BlueBubbles、macOS 应用
Mariano Belinky@mbelinkyiOS 应用、安全性
Nimrod Gutman@ngutmaniOS/macOS 应用、Crustacean 功能
Vincent Koc@vincentkoc代理、遥测、钩子、安全性
Val Alexander@BunsDevUI/UX、文档、Agent DevX
Seb Slight@sebslight文档、代理可靠性、加固
Christoph Nakazawa@cpojerJS 基础设施
Gustavo Madeira Santana@gumadeiras多代理、插件、Matrix
Onur Solmaz@onutc代理、ACP、MS Teams
Josh Avant@joshavant核心、CLI、Gateway、安全性
Jonathan Taylor@visionikACP、Gateway、CLI 工具
Josh Lehman@jalehmanCompaction(压缩)、Tlon/Urbit
Radek Sienkiewicz@velvet-shark文档、Control UI
Muhammed Mukhthar@mukhtharcmMattermost、CLI
Altay@altaywtf代理、CLI、错误处理
Robin Waslander@hydro13安全性、PR 分类、Bug 修复
Tengji (George) Zhang@odysseus0中国模型 API、云、树莓派

PR 提交指南

提交前检查清单

提交 PR 前,确保已完成:

  • 本地测试:使用你自己的 OpenClaw 实例进行测试
  • 验证套件:运行 pnpm build && pnpm check && pnpm test
  • 扩展测试:若修改扩展,运行 pnpm test:extension <id>
  • 契约测试:若更改了共享插件/channel 接口,运行 pnpm test:contracts
  • Codex 审查:若有权限,在本地运行 codex review --base origin/main
  • PR 专注性:每个 PR 只专注于一个关注点
  • 截图:对于任何 UI 变更,包含”之前”和”之后”截图
  • 语言:所有代码、注释和文档使用美式英语

审查对话所有权

PR 作者应主动管理审查对话:

  • 一旦问题得到解决,自行解决该对话
  • 只有在需要维护者判断时,才回复并保持对话开放
  • 不要留下”已修复”的注释让维护者来解决

CI/CD 流水线与范围确定

CI/CD 使用智能范围检测跳过昂贵的任务。它检测 docs_only 变更并将修改的文件映射到特定平台运行器。

  • Preflight(预检):建立路由真值和变更矩阵
  • Security Fast(快速安全检查):并行运行 SCM 检查
  • 本地通道:对于扩展,使用 pnpm test:extension <extension-name> 匹配 CI/CD 的快速路径

标签与自动化系统

OpenClaw 使用严格的标签系统来管理大量 PR 和 Issue。

PR 大小标签

系统根据变更行数(排除锁文件和文档)自动计算 PR 大小:

  • size: XS:< 50 行
  • size: S:< 200 行
  • size: M:< 500 行
  • size: L:< 1000 行
  • size: XL:> 1000 行

自动响应触发器

r: 前缀的标签触发自动关闭:

  • r: skill:重定向到 Clawhub
  • r: support:重定向到 Discord
  • r: no-ci-pr:关闭仅尝试修复 main 分支测试失败的 PR
  • r: too-many-prs:将作者限制为 10 个活跃 PR

Bug 分类

Issue 根据表单值打标签:

  • regression:以前正常运行但现在失败的功能
  • bug:crash:进程/应用退出或挂起
  • bug:behavior:不正确的输出/状态,但没有崩溃

Parallels E2E 冒烟测试

项目使用 Parallels Desktop 虚拟机验证 macOS、Windows 和 Linux 上的端到端体验。

平台流程矩阵

平台脚本快照要求关键验证
macOSparallels-macos-smoke.shmacOS 26.3.1 latestDashboard 加载、Safari TCP 连接、带令牌 URL 解析
Windowsparallels-windows-smoke.shpre-openclaw-native-e2e-2026-03-12托管 Gateway 重启、通过 prlctl exec --current-user 的 PowerShell 传输
Linuxparallels-linux-smoke.sh全新 Ubuntu 基线HOME=/root 导出、OPENAI_API_KEY 环境变量传递

受限接口(CODEOWNERS)

为维护系统完整性和安全性,某些路径受到限制。除非所有者要求,否则不要编辑这些文件:

  • 安全接口:任何涉及认证、密钥处理或沙盒配置的内容。这些路径由 @openclaw/secops 负责
  • Codeowners 规则:将 CODEOWNERS 覆盖的路径视为受限接口
  • i18ndocs/zh-CN/** 是自动生成的,不要直接编辑。请更新英文文档和词汇表

开发约束

  • 导入边界:扩展代码必须使用 openclaw/plugin-sdk/*。绝不直接导入核心 src/** 或其他扩展的 src/**
  • 依赖项:仅插件使用的依赖项属于扩展的 package.json。避免在生产 dependencies 中使用 workspace:*

CI/CD 流水线快速失败顺序

CI/CD 流水线通过分层执行模型设计为尽早捕获错误。


https://deepwiki.com/openclaw/openclaw/9.2-project-structure

项目结构

OpenClaw 组织为 pnpm monorepo,在单一仓库中协调多个包和扩展。结构包括根 openclaw 包、一个 Web UI、兼容性 shim、40 余个插件扩展和供应商代码。

Monorepo 组织

工作区由 pnpm-lock.yaml 定义,包含:

  • 根包(.:主 openclaw npm 包,含 CLI 二进制文件和核心 API
  • ui/:基于 Web 的 Control UI 前端
  • packages/*:兼容性 shim,如 clawdbot
  • extensions/*:40 余个插件包(channel、记忆、工具)
  • vendor/:第三方和开放标准代码(A2UI 实现)

根包结构

openclaw 包包含:

  • 源码(src/:CLI 连接、命令和基础设施
  • 构建输出(dist/:编译后的 JavaScript 入口点和捆绑 SDK
  • Plugin SDK:精心策划的公共子路径,用于插件开发
  • 版本:使用 CalVer 方案(例如 2026.4.3
  • 模块类型:ES modules("type": "module"
  • CLI 入口bin 字段指向 openclaw.mjs

Plugin SDK 与子路径导出

Plugin SDK 提供插件与核心之间的类型契约。关键子路径可防止循环依赖并维持启动性能:

  • plugin-sdk/core:注册方法,如 definePluginEntry
  • plugin-sdk/agent-runtime:代理工作区和身份帮助函数
  • plugin-sdk/channel-runtime:消息管道和线程

入口点在 scripts/lib/plugin-sdk-entrypoints.json 中定义。

扩展布局

扩展位于 extensions/* 下作为工作区包。每个扩展将 openclaw/plugin-sdk/* 视为其公共接口。

插件类型:

  • Channel 插件:实现 ChannelPlugin 接口
  • Provider 插件:通过 api.registerProvider 注册
  • 记忆插件:向量和全文搜索后端

示例包括 extensions/telegramextensions/discordextensions/memory-lancedbextensions/acpx

专用组件

Vendor/A2UI

vendor/a2ui 目录包含 Agent-to-User Interface 开放标准实现,提供交互式 UI 呈现的 canvas 渲染逻辑。

Swabble 唤醒词守护进程

Swabble 是与 iOS 和 macOS 客户端集成的唤醒词检测守护进程,支持始终监听功能,在检测到唤醒词时触发 Gateway。

Clawdbot 兼容性 Shim

packages/clawdbot 工作区为旧版集成提供兼容性,允许较旧的机器人和工具与现代 OpenClaw Gateway 协议交互。

仓库布局

代码库通过一致的模式将系统名称映射到代码实体:

  • 配置 schema 生成与 src/config/schema.base.generated.ts 关联
  • 工具定义集中在 src/agents/pi-tools.ts
  • Channel 实现嵌套在 src/channels/plugins/
  • 原生应用按平台特定结构组织在 apps/

这种组织方式支持核心功能、插件和原生客户端的并行开发,同时维持类型安全和清晰的依赖边界。


https://deepwiki.com/openclaw/openclaw/9.3-development-workflow

开发工作流

本地开发安装

OpenClaw 使用基于现代 TypeScript 的 JavaScript 工具链,以 pnpm 作为主要包管理器。开发和测试支持 Node.js 和 Bun 两种运行时。

运行时要求

  • Node.js: 需要 22 或更高版本才能运行 OpenClaw
  • Bun: 可选的 JavaScript 运行时,因更快的 TypeScript 执行速度而受到青睐
  • pnpm: 管理 monorepo 和工作区依赖的主要包管理器

在开发模式下运行 Gateway

CLI 执行

OpenClaw CLI 可以使用 Bun 直接从 TypeScript 源码运行,在活跃开发期间无需完整的构建步骤。

Gateway 更新与版本控制

开发期间,你可能需要模拟或测试更新工作流。update 命令处理 gitpackage 安装类型之间的过渡。

  • 更新通道: 支持的通道包括 stable(稳定)、beta(测试版)和 dev(开发版)
  • 演练运行: 使用 openclaw update --dry-run 在不修改本地安装的情况下预览更改

测试基础设施

OpenClaw 采用复杂的测试策略,涵盖从单元测试到多平台虚拟机冒烟测试。

并行测试运行器(test-parallel.mjs

主要测试入口点是 scripts/test-parallel.mjs。该脚本充当 Vitest 的基于规划器的包装器,管理测试分片和隔离策略。

关键标志:

  • --surface <name>:选择特定测试面:unitextensionschannelscontractsgateway
  • --plan:打印已解析的执行计划而不运行测试
  • --explain <file>:解释特定测试文件的分类和隔离方式
  • --failure-policy <fail-fast|collect-all>:确定测试失败时的行为

该脚本使用 scripts/test-planner/planner.mjs 基于请求的测试面、运行时能力和测试文件分类构建执行计划。然后使用 scripts/test-planner/executor.mjs 执行此计划(可能并行执行)并收集结果。

测试隔离与行为

某些测试由于全局状态污染或高资源使用而需要隔离(fork)。这些在 test/fixtures/test-parallel.behavior.json 中定义。

  • 线程固定: 在线程中运行更快或更稳定的测试
  • 隔离: 必须在独立进程 fork 中运行的测试,以避免模块 mock 泄漏,Discord 和 WhatsApp channel 测试中常见

vitest.config.ts 定义全局 Vitest 设置,包括 pool: "forks" 作为默认值、基于 CI/本地环境的 maxWorkers,以及用于缓存失效的 forceRerunTriggers

多平台冒烟测试(Parallels)

对于跨 macOS、Windows 和 Linux 的 E2E 验证,OpenClaw 使用 Parallels Desktop 自动化。用于验证安装脚本和升级路径。

  • macOS: scripts/e2e/parallels-macos-smoke.sh
  • Windows: scripts/e2e/parallels-windows-smoke.sh
  • Linux: scripts/e2e/parallels-linux-smoke.sh

这些脚本处理快照还原、现场安装程序执行和 Gateway 健康验证(gateway status --deep)。

调试与最佳实践

提交前门控

“门控”是 PR 所需的验证标准。

  • 本地开发门控: pnpm check + 范围测试(例如 pnpm test:extension <id>
  • 合并门控: pnpm checkpnpm testpnpm build

日志与诊断

  • 使用 openclaw gateway status --deep 进行健康检查
  • 对于更新问题,检查 doctor 命令:openclaw doctor
  • 虚拟机冒烟测试的诊断日志存储在 /tmp/openclaw-parallels-*
  • scripts/test-parallel.mjs 脚本可以为失败的运行生成详细报告,包括日志和元数据,存储在临时制品目录中。可通过设置 OPENCLAW_TEST_KEEP_TEMP_ARTIFACTS=1 保留这些制品

禁止操作

  • 仅重构 PR: 除非明确要求,否则不接受
  • 修复主分支失败: 不要提交针对维护者已跟踪的已知 main 分支失败的测试/CI 修复
  • 安全路径: 未经维护者明确批准,不要编辑 CODEOWNERS 涵盖的文件(安全相关)

https://deepwiki.com/openclaw/openclaw/10-glossary

OpenClaw 词汇表

词汇表

本页面为 OpenClaw 系统中使用的代码库特定术语、架构组件和技术术语提供全面参考。


核心系统实体

Gateway(网关)

OpenClaw 的中央控制面。管理消息 channel、代理运行时和基于 WebSocket 的 RPC 协议的生命周期。负责将来自外部平台(如 Telegram 或 WhatsApp)的消息路由到相应的代理会话。

  • 实现:提供 Control UI 并处理 Gateway 协议 v3 的 Node.js 进程
  • 关键函数runGateway 入口点;WebSocket handleIncomingFrame 和协议分发器
  • 数据流:来自 Channel 的入站事件 -> Gateway -> 代理运行时 -> 模型提供商 -> 工具执行 -> 通过 Channel 回复

Agent(代理)

由 Pi Agent Core(pi-embedded-runner)驱动的自主 AI 运行时,能够理解自然语言、运行工具和管理对话。

  • 实现:由 runEmbeddedPiAgent 封装
  • 数据流:处理来自 Gateway 的消息,调用模型提供商和工具,处理流式输出,管理指令,更新会话历史
  • 关键类runEmbeddedPiAgentcompactEmbeddedPiSessionapplyExtraParamsToAgent

Channel(频道)

将 OpenClaw 连接到 Telegram、WhatsApp、Discord、Slack、Signal 等外部消息平台的适配器集成。

  • 实现:每个 channel 位于 extensions/src/channels/,规范化入站消息/事件,强制执行 DM/群组策略
  • 关键逻辑:DM 策略(pairing/allowlist/open/disabled)、群组策略、消息去重、将消息路由到正确代理

Node(节点)

运行 OpenClaw 原生客户端软件的物理设备(iOS、Android、macOS 应用或 Swabble 守护进程)。

  • 角色:节点提供平台特定功能,如摄像头访问、语音输入、通知,运行节点特定工具
  • 协议:通过设备节点协议使用 node.invoke RPC 与 Gateway 通信

Session(会话)

用户与代理之间持久化的对话上下文。会话维护消息历史、记忆状态和系统提示词。

  • 标识:会话通过 sessionKey 字符串键标识,结合 channel、对端和可选主题
  • 存储:以 JSONL 转录文件形式持久化在工作区或配置的会话存储中
  • 会话通道:区分推理或流式输出的独立通道,将思维过程与最终回复分开

Workspace(工作区)

绑定到代理的主机文件系统目录。提供 Skill、文件和执行操作的沙盒环境。

  • 功能:包含 Skill 安装、用户文件、临时运行时数据;工具在工作区根目录内读写
  • 解析:工作区在每个代理或 agents.defaults.workspace 中全局配置

架构与数据流

自然语言到代码实体

此图说明用户输入如何从自然语言事件遍历到代码实体并返回。


技术术语与缩写

A2UI

Assistant-to-UI(助手到 UI)。一种渲染标准,允许助手生成交互式 canvas UI 元素,超越基于文本的回复。

  • 支持直接从助手响应生成自适应的交互式 UI
  • 在原生 macOS/iOS 应用中广泛使用

ACP(Agent Control Protocol,代理控制协议)

用于协调子代理和子会话的协议。

  • 允许主代理运行时为复杂的多任务处理生成专业化的子代理(子会话)
  • 管理交付分发、子代理注册表、持久绑定

Auth Profile(认证配置文件)

用于模型提供商或 API 的命名可配置凭据集。

  • 支持 API 密钥、OAuth token、轮换方案
  • 配置文件根据运行时结果标记为良好、已使用或失败

BTW(By The Way,顺便说一句)

/btw 命令,允许快速提问。

  • 用于向代理提问而不影响主会话上下文
  • 返回明确的可关闭答案,不使用工具

CalVer(Calendar Versioning,日历版本控制)

用于发布标签和版本控制的日历版本控制方案。

  • 格式:YYYY.M.D(年.月.日)
  • 简化发布和升级跟踪

ClawHub 与 Lobster

  • ClawHub:Skill 和插件的官方集中注册表和目录
  • Lobster:吉祥物/内部项目品牌名称,出现在徽标和 UI 资源中

Compaction(压缩)

将会话转录摘要化以适应模型上下文窗口的过程。

  • 通过生成压缩摘要或删除不太重要的上下文来减少旧消息历史
  • 关键函数compactEmbeddedPiSession
  • 支持防止无限压缩循环的保障措施

DM Policy(私信策略)

控制谁可以在给定 channel 上向助手发送私信的访问策略。

  • pairing(配对):未知发送方收到配对码,必须获得批准
  • allowlist(允许列表):只有 allowFrom 或配对存储中的发送方
  • open(开放):任何人都可以向机器人发送私信
  • disabled(禁用):不处理入站私信
  • 对安全性至关重要;通常默认为 pairing

Directive(指令)

嵌入在消息或系统提示词中的特殊内联指令。

  • 示例:/think/verbose/reasoning/exec
  • 控制该轮的代理推理、详细程度、流式传输或工具行为

Fast Lane / Session Lane(快速通道 / 会话通道)

用于优先处理某些消息 channel 或内部推理的消息处理范式。

  • 推理通道等会话通道允许将内部”思考”消息与最终回复分开流式传输
  • 快速通道通常指交互式轮次的高优先级执行队列

Heartbeat(心跳)

Gateway 定期发送到 channel 或记录用于健康监控的状态消息。

  • 表示 Gateway 和已连接的 channel 存活且响应
  • 每个 channel 的默认值可配置

Plugin Slot(插件槽)

独占插件类别,一次只能有一个插件处于活跃状态。

  • 示例包括 memory(记忆)和 contextEngine(上下文引擎)槽
  • 系统强制只有一个插件处理槽职责

Sandbox(沙盒)

用于执行需要提升权限或系统访问的工具的隔离运行时环境。

  • 可以是 Docker 容器、SSH 沙盒或原生 OS 隔离
  • 为进程安全提供 seccomp 和 AppArmor 配置文件

SecretRef(密钥引用)

API token 或凭据等敏感数据的运行时引用。

  • 从环境变量或加密存储动态解析
  • 防止密钥以明文泄露到配置文件中

Skill(技能)

一组专注于特定能力或任务的提示词、工具和配置包。

  • 安装到工作区或通过 ClawHub 管理
  • SKILL.md 格式指定,带版本控制

SSRF Protection(服务端请求伪造保护)

针对 Web fetch 或 HTTP 工具的服务端请求伪造防护。

  • 防止代理访问内部或私有 IP 地址
  • 由 Playwright 路由处理器强制执行

Swabble

OpenClaw 原生客户端使用的唤醒词检测和音频处理守护进程。

  • 支持 iOS/macOS/Android 上的始终监听
  • 与 Gateway 通信以处理语音命令

Tool Result Guard(工具结果守卫)

包装工具输出、在将结果返回给代理之前验证其有效性的安全机制。

  • 防止幻觉或无效的工具输出进入代理的上下文
  • guardSessionManager 强制执行

Block Reply(块回复)

作为单一回复块处理的消息或输出单元的原子组合。

  • 用于将响应批量传输或流式传输到客户端或消息 channel

Cron(定时任务)

Gateway 内置的自动化作业调度器。

  • 支持多种作业类型,包括主会话、隔离会话和自定义会话
  • 可以触发消息、运行命令或发送 webhook

Capability Model(能力模型)

详述代理/工具能力和使用策略的正式模型。

  • 定义代理可以使用哪些工具以及在何种条件下使用(例如 owner-only(仅限所有者))

附加术语

术语描述
Pairing(配对)未知用户收到一次性码以授权其身份的流程
LobsterOpenClaw 吉祥物和品牌图标
Tool Result Guard(工具结果守卫)确保工具输出安全有效
SecretRef(密钥引用)密钥的安全引用,动态解析
BTW/btw 命令,用于无上下文的快速旁问

OpenClaw DeepWiki 中文翻译

OpenClaw DeepWiki 中文翻译

来源: https://deepwiki.com/openclaw/openclaw 翻译日期: 2026-04-04 说明: 全部 56 个页面的完整中文翻译,保留原文结构,技术术语保留英文

目录

01-概览.md

  • 1 Overview — OpenClaw 概览
  • 1.1 Getting Started — 快速开始
  • 1.2 Core Concepts — 核心概念
  • 1.3 Platform Architecture — 平台架构

02-网关.md

  • 2 Gateway — 网关
  • 2.1 WebSocket Protocol & RPC — WebSocket 协议与 RPC
  • 2.2 Authentication & Authorization — 身份验证与授权
  • 2.3 Configuration System — 配置系统
  • 2.3.1 Configuration Reference — 配置参考
  • 2.3.2 Schema Generation & UI Integration — Schema 生成与 UI 集成
  • 2.4 Session & State Management — Session 与状态管理
  • 2.5 Multi-Agent Routing — 多 Agent 路由

03-网关续与Agent运行时.md

  • 2.6 Service Lifecycle & Diagnostics — 服务生命周期与诊断
  • 2.7 Control UI & WebChat — 控制 UI 与 WebChat
  • 3 Agent Runtime — Agent 运行时
  • 3.1 Execution Pipeline — 执行 Pipeline
  • 3.2 System Prompt & Context — 系统提示与上下文
  • 3.3 Model Providers & Authentication — 模型 Provider 与认证
  • 3.3.1 Provider Normalization — Provider 规范化
  • 3.3.2 OAuth & Custom Providers — OAuth 与自定义 Provider

04-工具系统.md

  • 3.4 Tools System — 工具系统
  • 3.4.1 Tool Policies & Filtering — 工具策略与过滤
  • 3.4.2 Exec & Background Processes — 执行与后台进程
  • 3.4.3 Memory & Search — 内存与搜索
  • 3.4.4 Browser Automation — 浏览器自动化
  • 3.4.5 Web Search & Fetch — 网页搜索与抓取
  • 3.4.6 Image & Media Tools — 图像与媒体工具
  • 3.5 Commands & Auto-Reply — 命令与自动回复

05-命令系统与消息频道.md

  • 3.5.1 Command System — 命令系统
  • 3.5.2 Status & Directives — 状态与指令
  • 3.6 Context Compaction — 上下文压缩
  • 3.7 Automation & Cron — 自动化与定时任务
  • 3.8 ACP & Sub-Agents — ACP 与子代理
  • 4 Messaging Channels — 消息频道
  • 4.1 Channel Architecture — 频道架构
  • 4.2 Platform Integrations — 平台集成

06-扩展与原生客户端.md

  • 4.3 Policy & Access Control — 策略与访问控制
  • 4.4 Message Flow & Delivery — 消息流与投递
  • 5 Extensions — 扩展
  • 5.1 Plugin Architecture — Plugin 架构
  • 5.2 Skills System — Skills 系统
  • 5.3 Plugin Examples — Plugin 示例
  • 6 Native Clients & Nodes — 原生客户端与节点
  • 6.1 Platform Overview — 平台概述
  • 6.2 Device Node Protocol — 设备节点协议
  • 6.3 iOS & macOS Apps — iOS 与 macOS 应用

07-安全构建与开发.md

  • 6.4 Android App — Android 应用
  • 7 Security — 安全性
  • 7.1 Security Model & Trust Boundaries — 安全模型与信任边界
  • 7.2 Security Audit System — 安全审计系统
  • 7.3 Sandboxing & Isolation — 沙盒与隔离
  • 7.4 Secret Management — 密钥管理
  • 8 Build & Release — 构建与发布
  • 8.1 Multi-Platform Build System — 多平台构建系统
  • 8.2 CI/CD Pipeline — CI/CD 流水线
  • 8.3 Release Process — 发布流程
  • 8.4 Testing Strategy — 测试策略
  • 9 Development — 开发
  • 9.1 Contributing — 贡献
  • 9.2 Project Structure — 项目结构
  • 9.3 Development Workflow — 开发工作流
  • 10 Glossary — 词汇表