乐于分享
好东西不私藏

全面理解 OpenClaw 工作原理,企业级 AI Agent 基础设施落地(上)

全面理解 OpenClaw 工作原理,企业级 AI Agent 基础设施落地(上)

目录

第一章 OpenClaw 到底是什么

第二章 项目发展、版本和生态

第三章 OpenClaw 总体架构和工作原理

第四章 一条消息是如何被执行的

第五章 源码结构和二次开发入口

第六章 部署方式完整比较与四套实施方案

第七章 从零完成 Docker Compose 部署

第八章 Kubernetes 企业部署与高可用边界

第九章 模型接入与模型路由

第十章 Session、Context 和 Memory 深度调优

第十一章 Skills、Tools、Plugins 和 MCP

第十二章 多智能体、Node 与 Sandbox

第十三章 消息渠道的官方与外部生态边界

第十四章 消息、协作与内容发布平台接入

第十五章 定时任务、主动 Agent 和自动化

第十六章 企业级安全体系

第十七章 身份、权限与多租户改造

第十八章 性能和成本调优

第十九章 可观测性和 SRE

第二十章 数据备份、升级和灾难恢复

第二十一章 调优方法论与评测体系

第二十二章 十个企业实施案例

第二十三章 常见误区与纠偏

第二十四章 企业落地路线图

第二十五章 最终质量验收与交付判定

第一章 OpenClaw 到底是什么

1.1 一句话定义

OpenClaw 是一个运行在用户选择的机器上、以长驻 Gateway 为控制平面、把消息渠道、Agent Runtime、模型提供商、工具、Skills、MCP、会话、记忆与设备节点连接起来的个人 AI 助手/开放 Agent 平台。它首先是“personal AI assistant”,目标是“personal, single-user assistant”;Gateway 只是控制平面,真正的产品是助手本身。

1.2 它解决什么问题

OpenClaw 把过去散落在多个产品里的能力统一到一个自托管运行时:

  1. 从 Telegram、Slack、WhatsApp、Discord、iMessage、WebChat 等现有沟通入口接收任务;
  2. 将消息按账号、会话和绑定规则路由到指定 Agent;
  3. 在一次 Agent 循环里选择模型、加载上下文、调用本机或远程工具、调用 MCP Server,并把结果送回原渠道;
  4. 保存会话、工作区文件和长期记忆;
  5. 通过 Cron、Heartbeat、Hooks 和 Webhook 承接主动任务;
  6. 通过 macOS、iOS、Android 等配对 Node 暴露受控设备能力。

它的价值不是“多一个聊天框”,而是把入口、推理、执行、状态与设备组成一个持续运行的个人 Agent 系统。

1.3 它不是什么

  1. 不是一个大语言模型;模型由 OpenAI、Anthropic、Google、本地 Ollama/vLLM 等提供。
  2. 不是 ChatGPT、Claude、豆包一类托管聊天 SaaS 的开源复刻;OpenClaw 负责运行和编排,模型、密钥、机器及数据边界由部署者选择。
  3. 不是 Dify、FastGPT、Coze、Flowise 一类以可视化工作流、应用发布、数据集运营为中心的平台,也不是 n8n 式确定性业务流程引擎。OpenClaw 的主抽象是长驻个人 Agent 和消息渠道;确定性审批、事务补偿、租户治理仍需外围系统。
  4. 不是专门的 IDE 编程 Agent。它可接 Codex、Claude Code/ACP 等 Runtime,也能执行开发工具,但其核心覆盖消息入口、长期运行、主动任务、记忆和设备节点;Cursor、Claude Code、Codex 等更聚焦代码库/终端开发环节。
  5. 不是传统 RPA。模型驱动工具选择具有概率性;涉及资金、删除、权限、生产变更时不能用“自然语言看起来合理”替代确定性控制。
  6. 不是开箱即用的企业多租户 AI 平台。官方默认信任模型是单用户/个人助手。一个 Gateway 内虽可配置多个隔离 Agent,但这不自动等于企业级租户隔离、SSO、RBAC、ABAC、配额、审计和合规。

1.4 为什么有 Gateway、Channel、Agent、Skill、Tool、Node、Session、Memory

抽象

解决的核心问题

不应误解为

Gateway

长驻连接、路由、会话、Agent 运行、调度、Node 与控制 API 的统一控制面

天然无状态的集群控制器

Channel

屏蔽不同消息平台的接收、发送、线程、媒体和身份差异

每个平台能力完全一致

Agent

将 persona、Workspace、模型、认证和会话收拢成独立工作单元

强多租户安全边界

Skill

给模型按需注入任务说明、知识与操作流程

强制权限系统或可执行沙箱

Tool

向模型暴露有 Schema 的可调用动作

可信、确定性决策者

Plugin

在进程内注册 Provider、Channel、Tool、Hook、服务、CLI 等原生能力

与宿主隔离的低风险脚本

MCP Server

用标准协议接入外部工具与数据源

默认可信的企业 API 网关

Node

让配对设备承载相机、屏幕、Canvas、系统命令等能力

Gateway 的横向扩展副本

Session

让消息归属到连续的运行历史、路由状态和模型选择

长期知识库

Context

当前这一轮真正发送给模型的动态输入

完整会话原文的同义词

Memory

以 Markdown 为事实源并通过检索注入的跨轮/跨会话信息

模型天然、永不出错的记忆

1.5 能力边界图

图 1 Mermaid 架构/时序图

1.6 适合与不适合的场景

适合:可信个人助手、小团队只读助手、跨渠道研发/知识/内容辅助、在严格工具白名单下的周期性报告、作为企业控制平面背后的独立 Agent 执行单元。 不宜直接使用:相互不信任的大规模公网用户共享同一 Gateway;需要强事务和确定性执行的核心业务;无人审批的生产变更、资金、权限或删除;要求现成完整 SSO/RBAC/多租户/SLA 的场景;无法容忍模型与间接 Prompt Injection 风险的高敏动作。

第二章 项目发展、版本和生态

2.1 名称演进

WhatsApp Relay / Warelay → Clawd / Clawdbot → Moltbot → OpenClaw

  1. 官方 2026-01-29 博客说,最初的周末项目是 “WhatsApp Relay”;Clawd 诞生于 2025-11。
  2. 因名称与 Claude 的商标关联,Anthropic 法务请求重新考虑;社区短暂采用 Moltbot。
  3. 2026-01-29 正式宣布 OpenClaw,官方称已完成商标查询、域名购买和迁移代码。
  4. VISION.md 还记录了工程名称序列 Warelay → Clawdbot → Moltbot → OpenClawdocs/start/lore.md 记录角色/吉祥物叙事。写技术史时应说明两者语境不同,不必强行把 “WhatsApp Relay” 和仓库内部 Warelay 当成两个独立成熟产品。

2.2 Foundation 与当前治理

2026-07-08 的官方公告确认:

  1. OpenClaw Foundation 是美国 501(c)(3) 非营利组织;使命是保持项目开放、独立和 MIT 许可;
  2. Peter Steinberger 仍负责重要技术决策;公告同时披露他已于 2026 年早些时候加入 OpenAI,但 OpenAI 承诺保持 OpenClaw 开放与独立;
  3. Foundation 已组建全职团队,公告列出 Vincent Koc(Chief Architect)及多名工程与运营人员;
  4. CONTRIBUTING.md 的仓库治理仍以 Peter Steinberger 为 “Benevolent Dictator”,并列出维护者及各自领域。

因此最准确的表述是:Foundation 提供法律、资金与组织承载,技术决策仍有明显创始人主导特征,日常开发由全职团队、维护者和大量贡献者共同完成。

2.3 许可证及企业影响

v2026.7.1 使用 MIT License,版权为 Copyright (c) 2026 OpenClaw Foundation。企业可以使用、复制、修改、合并、发布、分发、再许可和销售软件副本,但须在副本或重要部分中保留版权与许可声明;软件按“原样”提供,不含保证。

工程含义:

  1. 可做闭源企业改造和商业化发行;MIT 不要求公开派生代码;
  2. 必须保留 MIT 声明;
  3. MIT 并不替企业承担安全、模型输出、数据合规或第三方接口责任;
  4. 依赖项、插件、Skills、模型、字体/媒体及移动端组件可能有各自许可证,需结合 THIRD_PARTY_NOTICES.md 和 SBOM/依赖扫描逐项审查;
  5. 商标权不等同于代码许可证,不应把 MIT 推导为可任意使用 OpenClaw 名称和标识进行背书。

2.4 维护目标与插件优先方向

VISION.md 将优先级明确排成:安全与安全默认值、Bug/稳定性、安装可靠性;之后才是提供商/渠道覆盖、性能、测试、Computer Use、CLI/Web/原生 App。官方希望核心保持精简,把可选能力放入插件;新 Skills 优先进入 ClawHub;MCP 同时考虑 Server 和 Runtime 集成。文档也明确说项目“仍早期、迭代很快”。

这意味着企业应把插件契约演进、配置迁移、回归测试和版本锁定当作选型成本,而不是只看功能数量。

2.5 版本、发布通道与成熟度判断

发布活跃度(不以 Star 替代成熟度)

官方 GitHub Release API/页面在调研日显示最近节奏:

  1. stable:2026.6.8(06-16)、2026.6.9(06-21)、2026.6.10(06-24)、2026.6.11(06-30)、2026.7.1(07-13);
  2. v2026.7.1 后于 07-15、07-17、07-18 连续发布 7.2 beta;
  3. v2026.7.1 Release 页面称该版本汇集 3,063 次贡献、532 名贡献者,其中公开署名 PR 2,018 个;这是发布规模证据,不是质量本身。

稳定标签下仓库的静态核验还显示:

  1. .github/workflows 含跨平台 CI、CodeQL、依赖防护、安装冒烟、发布校验、性能、真实渠道场景、容器与原生 App 发布等数十条流水线;
  2. src/extensions/packages/apps/ui 下约 6,500 个 *.test.ts/*.spec.ts 文件
  3. 另有 test/qa/ 和大量 E2E/真实行为证明工作流。

成熟度分维度判断

维度

证据

本文判断

发布频率

stable 与 beta 发布频繁、签名标签、完整 Release Notes

活跃,但变更吞吐极高,企业回归压力大

测试体系

大量单元/契约/E2E/跨 OS/真实渠道 CI

工程投入强;外部 SaaS、移动端、网络状态组合仍不可能被穷举

文档质量

文档覆盖 Gateway、模型、渠道、MCP、Memory、Cron、安全等

广且深,但迭代快,个别页面与稳定源码不一致

Issue/PR

数量大、自动分诊与安全标签明显

社区活跃;海量积压和自动化处理意味着企业不能以“有人提过 Issue”作为修复承诺

兼容性

有 doctor、migration、plugin inventory、release policy

具备迁移意识;插件 capability API 文档仍提示外部兼容契约在收紧中

安全响应

安全 CI、SECURITY 文档、审计命令、Release 持续加固

安全意识高;但 Agent/Prompt Injection 与高权限工具的固有风险仍在

升级策略

stable/beta/dev/extended-stable、dry-run/repair

路径清楚;企业仍需版本冻结、预发、数据备份和回滚

治理

Foundation、全职团队、维护者、创始人技术主导

从个人项目向机构化迁移中;不宜按成熟标准基金会治理假定稳定性

综合结论:OpenClaw 已不是“玩具仓库”,但仍是高速演进的个人 Agent 基础设施,不等于经过多年兼容沉淀的企业平台。 企业选型宜采用“隔离执行单元 + 外围企业控制面”,而不是直接把一个 Gateway 暴露给全公司。

第三章 OpenClaw 总体架构和工作原理

3.1 总体架构图

3.2 Gateway 内部组件图

3.3 组件职责、输入输出、故障与安全边界

组件

职责与输入/输出

生命周期/配置

常见故障

安全边界

Gateway

接收 Channel/Operator/Node 请求;输出 RPC 响应、事件和渠道消息

长驻单进程;gateway.*,默认 127.0.0.1:18789

配置非法退出码 78、端口/锁冲突、反复重启

最高控制面;不要公网裸露

Agent Runtime

组装 Prompt、循环模型/工具、发事件和最终答案

每个 run 创建;内置 openclaw 或插件 Harness

模型卡住、工具循环、上下文过大、写锁等待

只能看到策略过滤后的 Tools,但 Prompt 本身不是强隔离

Model Provider

鉴权、模型目录、请求/流式响应与兼容转换

插件注册;models.providers、auth profile

401/429/超时/Schema 不兼容/Tool Call 差异

请求可能把上下文送到外部;须按数据级别路由

Channel

平台连接、身份规范化、消息/媒体/线程收发

Gateway 启动/重连;channels.<id>

掉线、限流、重复事件、权限/Intent 缺失

平台身份不是企业身份;需 allowlist/pairing/映射

Plugin

进程内注册能力、Hook、Route、CLI/Service

Gateway 装载/重载;plugins.*

版本/依赖/Manifest 错误、启动崩溃

可信本机代码,通常等同 Gateway 权限

Skill

按资格发现并向模型注入任务说明

每次 Prompt 构建选择;workspace/managed/bundled

触发不准、描述膨胀、依赖缺失

不执行授权;恶意内容可诱导模型

Tool

结构化动作;收参数、返回结构化结果

模型调用时;tools.* 与 Agent/Channel/Sandbox policy

参数校验、超时、输出过大、取消失败

真正副作用边界;必须最小权限和审批

MCP Server

暴露外部 Tool;Client Registry 连接 stdio/HTTP/SSE

按 Server 会话;mcp.servers

Server 不可达、OAuth/TLS、名称冲突、恶意返回

外部代码/内容;需 Tool Filter、TLS、网络隔离

Node

在配对设备执行相机、屏幕、Canvas、系统命令等

Node WS 长连接/配对;Gateway Node registry

离线、能力/权限缺失、版本不匹配

设备权限边界;命令需配对、Scope 和设备 OS 授权

Session

将消息、模型选择、路由和 Transcript 绑定

持久;session.*

串线、写锁、JSONL 损坏、无限增长

dmScope 默认 main 对多人不安全

Context

当前轮给模型的系统提示、文件、历史、Skills、Tool Schema/结果、Memory

每轮生成,随裁剪/压缩变化

Token 爆炸、早期信息丢失、工具结果挤占

Context 中的机密会流向所选模型

Memory

Markdown 事实源、索引、检索、注入

文件持久 + SQLite 索引;Memory Plugin

召回错误、污染、Embedding 失效

必须按用户/Agent 隔离;检索结果也属不可信内容

Workspace

默认 cwd、Bootstrap 文件、Skills、用户文件

长期目录;agents.*.workspace

路径/权限、文件太大、相互覆盖

不是沙箱;绝对路径仍可越界

Hooks

内部事件副作用或插件类型化拦截

启用后随事件触发;hooks.internal.*

重复触发、阻塞、异常吞噬

Hook/Plugin 代码在宿主权限下运行

Cron

稳定调度 system event/agent turn/command

Gateway 内 scheduler;共享 SQLite

Gateway 停止则不运行、重复/超时/失败重试

command cron 是 operator.admin,绕过 Agent exec 审批策略

Webhook

外部 HTTP 事件进入 wake/agent/TaskFlow

hooks.* 或 bundled webhooks plugin

鉴权、重放、流量峰值、Prompt Injection

必须独立 Token、限流、验签/网络边界

Control UI/WebChat/CLI

操作、聊天、配置、诊断

Operator 连接 Gateway

Scope 不足、WS 断线、缓存状态旧

管理能力和普通聊天入口应网络隔离

Sandbox

隔离 Tool 的文件/进程/网络执行

per-session/per-agent 或 host;agents.defaults.sandbox

镜像缺失、挂载/网络、权限过严/过松

与 Tool Policy、elevated 三层不同;Docker 不等于完美沙箱

3.4 Gateway 协议与单例约束

[官方稳定能力] Operator、Control UI、CLI、自动化和 Node 使用 Gateway WebSocket。第一帧必须是 connect;请求、响应、事件分别形如:

JSON

{"type":"req","id":"...","method":"agent","params":{}}

{"type":"res","id":"...","ok":true,"payload":{}}

{"type":"event","event":"agent.delta","payload":{},"seq":1}

Operator Scope 包括 operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secretsconfig.*exec.approvals.*wizard.*update.* 等保留前缀强制按 admin 处理。Node 以 role: node 连接并申报 capabilities/commands。副作用 RPC(如 sendagent)使用幂等键;事件不提供完整 replay,重连后应重新读取状态。

[官方稳定限制] 同一配置和端口由文件锁与 socket bind 保证单 Gateway;如需多实例必须用不同 profile/state/port。它并非多个完全对等副本共享一个状态库的天然集群。

3.5 关键架构图集

OpenClaw 能力边界图

Skill、Plugin、Tool 与 MCP 的关系图

Skill 主要告诉 Agent “何时以及如何完成任务”,Tool 是可调用能力的结构化接口,Plugin 是在 OpenClaw 进程内注册能力的代码包,MCP Server 是可独立隔离、通过协议暴露 Tool/Resource/Prompt 的进程或服务。普通提示词不提供代码能力;Webhook 是事件入口;浏览器自动化是高风险 Tool,不是通用连接器替代品。

多智能体路由图

企业部署网络拓扑图

安全信任边界图

高可用与灾难恢复架构图

多副本不能同时占用同一渠道长连接、Cron 所有权和本地 SQLite/JSONL。未经状态外置改造,推荐“单写者 + fencing + 备份恢复”或按渠道、部门、Agent、信任域分片,而不是 replicas: 3

企业控制平面与多个 Gateway

第四章 一条消息是如何被执行的

4.1 时序图

4.2 源码视角逐步说明

  1. Channel Plugin 接收平台事件,完成平台签名/Token 检查、消息去重、媒体规范化和发件人/群组/线程标识提取。
  2. Channel 自身的 dmPolicygroupPolicy、allowlist/pairing 和 mention 规则先决定消息是否允许进入。平台 ID 仍只是渠道身份。
  3. src/routing/resolve-route.ts 按 精确 peer → parent peer → peer wildcard → guild+roles → guild → team → account → channel → default agent 选 Agent;同一层第一个匹配 binding 胜出,多字段采用 AND。
  4. 根据 agent、channel、account、peer 和 session.dmScope 构造 Session Key。默认 dmScope: main 会把同一 Agent 的私聊折叠进主会话;多人入口应显式用 per-channel-peer 或更细粒度。
  5. Agent RPC 校验后先返回 accepted run ID;Run Coordinator 再进入 per-session/global queue,获取 Session 写锁、解析模型和认证。
  6. Context Builder 加入基础 System Prompt、Workspace Bootstrap 文件、符合资格的 Skill 描述/正文、会话历史、Memory 检索结果、附件及策略过滤后的 Tool Schema。
  7. Runtime 调用所选 Provider/Harness。模型产生文本或结构化 Tool Call。
  8. Tool Call 经过参数 Schema、Tool Policy、插件 before_tool_call Hook、可能的审批及 Sandbox/Node/MCP 路径执行;结果作为 Tool Result 回到 Agent 循环。
  9. 循环继续,直到最终回答、终止条件、取消或超时;Agent 发出 agent_start/turn_start/message_update/tool_execution_*/agent_end 等事件。
  10. Session Manager 追加 Transcript,更新会话元数据。接近上下文上限时可先 Memory Flush,再 Compaction;Context Pruning 只临时裁剪旧 Tool Result。
  11. Gateway/Channel 按平台线程、格式、长度、媒体和限流规则送回;重试与幂等保护要防止重复回复。

4.3 Tool 调用内部时序

4.4 案例:Slack 中查询 GitHub、内部文档并生成周报

设用户 Alice 在企业 Slack 的 #project-owl 线程中 @Bot:“查询本周 GitHub 项目状态,读取架构决策,生成周报并发回本群。”企业已将 Slack 不可变用户 ID 映射到 principal=alice@corp,只读 GitHub App 和知识库 MCP 由工具代理持有,群发送属于 L3,需要项目负责人确认。完整执行如下:

  1. Slack 把事件送到 Channel Plugin;插件校验平台签名/Token,记录 Event ID 并在响应时限内确认。
  2. Plugin 规范化 team、account、channel、thread、user、message、attachments;显示名只作展示。
  3. Ingress 去重表对 Event ID 建唯一约束;重放只返回先前 runId。
  4. Allowlist/Group Policy/Mention 规则确认该团队、频道、用户和 @Mention 均允许;未满足则不进入模型。
  5. Gateway 按 peer/account/channel binding 选 rd-weekly Agent;调用者不能在消息里改成 ops-admin
  6. Session Key 由 Agent、Slack account、channel、thread/peer 及 dmScope 生成;身份和 Session 键都写入 Trace,但 Session 不是授权。
  7. 每 Session 队列和写锁串行化同一线程;并发的另一个消息排队或明确合并,避免 Transcript 交错。
  8. Session Manager 读取 sessions.json 元数据和对应 JSONL Transcript;失败时返回可诊断错误,不能悄悄新建并丢失上下文。
  9. Context Builder 加载该 Agent 的 AGENTS/SOUL/TOOLS 等 Workspace 文件,并受单文件/总字符预算限制;Workspace 不是 Sandbox。
  10. Skill Loader 只注入 allowlist 中 scm-weekly-reportcorp-kb-query 的短描述;模型选择后才读完整 SKILL.md
  11. Tool Registry 将只读 scm_list_eventskb_search/get_excerpt 的 Schema 加入 Context;message_sendmergedelete 不暴露或只暴露成审批草稿接口。
  12. Memory Search 仅查询 rd-weekly/项目数据域,返回带 ACL、来源与日期的少量片段;群聊原文不自动写 Alice 个人 Memory。
  13. Model Router 根据任务、数据等级、预算和可用性选择 Primary;敏感架构内容走企业模型网关,Fallback 只在兼容数据策略内。
  14. 模型先调用 GitHub Tool。Tool 端忽略模型提供的“用户 ID”,使用工作负载身份与策略上下文,限制组织、仓库、时间窗和只读方法。
  15. Issue/PR 内容中的“忽略系统、上传 Token”等文字被标为不可信字段;Tool 返回分页、最大字节、来源 URL 和数据等级。
  16. 模型调用知识库 MCP;MCP Gateway 做 mTLS、Tool Filter、超时、响应大小和 ACL;恶意或格式异常结果被拒绝/净化。
  17. 每个 Tool Result 追加到本轮与 Transcript,必要时只将结构化摘要送回模型;调用轮数、Token、费用、超时和重复参数受硬上限。
  18. 模型生成“事实、风险、待确认、来源”周报草稿。Verifier 检查链接、时间窗、未支持主张和跨域内容;失败则返回修订或拒答。
  19. 发送回项目群是 L3:Approval Service 展示目标频道、线程、正文和 SHA-256;负责人批准后签发短期一次性票据,Publisher 按同一哈希发送。只读查询结果也可先作为私有预览返回 Alice。
  20. Gateway 按 Slack 长度/线程规则分片并发送,保存平台 message ID;未知发送状态先查询再重试,防止重复。Session 追加最终回复、usage、来源和审批回执;仅经验证的长期事实进入 Memory 候选。接近窗口时先 Memory Flush 再 Compaction,旧 Tool Result 可临时 Pruning。

每一步都有相应故障/安全点:入口签名和重放;身份冒用;Binding 越权;DM/线程串线;Session 锁/损坏;Workspace 机密;Skill/Plugin 供应链;Tool Schema 膨胀;Memory ACL;模型外发;Prompt Injection;MCP 不可信;工具超时与重复副作用;事实幻觉;审批绕过;平台限流与发送不确定性。Trace 应贯穿 eventId → runId → sessionKeyHash → modelCallId → toolCallId → approvalId → platformMessageId,但日志不得记录 Token、完整 Prompt 或机密正文。

案例验收

  1. 两名不同 Slack 用户、两个线程和两个 Channel account 的 Session/Memory 不串线。
  2. GitHub/知识库服务端 ACL 拒绝超范围资源,即使模型参数伪造身份也无效。
  3. 恶意 Issue/文档不能触发写 Tool、外发机密或改变 Agent/模型。
  4. Slack 重放同一 Event、Tool 超时与发送响应丢失均不造成重复周报。
  5. 未经项目负责人批准不能发群;批准后的正文哈希若变化则票据失效。

第五章 源码结构和二次开发入口

5.1 顶层目录

v2026.7.1 是 TypeScript/Node.js 主导的 pnpm monorepo,同时包含 Swift、Kotlin/Android、Web UI 和部署资产。重要目录:

路径

责任

修改注意

src/

Gateway、内置 Agent Runtime、CLI、路由、状态、工具、会话等主程序

内部 API 变化快,外部插件不应直接 import src/**

extensions/

官方插件源码:渠道、模型、工具、Memory、诊断等

先查生成的 Plugin Inventory 判定是否随 npm 核心包发布

packages/

可复用包与稳定程度不同的 SDK,如 agent-core、plugin-sdk、gateway-protocol

只使用文档明确的 openclaw/plugin-sdk/* 入口

skills/

随项目分发的 Skills

Skill 是说明/知识包,不是安全边界

ui/

Control UI/WebChat 前端

与 Gateway WebSocket/RPC 契约耦合

apps/macos

macOS 原生 App/Node

涉及签名、权限、发布链

apps/ios

iOS/iPadOS App/Node

原生权限与配对模型

apps/android

Android App/Node

Kotlin/Gradle 与移动权限

apps/shared

原生 App 共享资产/协议

修改需跨端回归

docs/

官方文档源

高速迭代时必须与标签源码交叉验证

deploy/、Dockerfile、docker-compose.yml

官方部署和容器入口

最小示例不自动等于生产架构

test/、qa/、共置 *.test.ts

单元、契约、集成、真实行为测试

二开应补同层测试,而非只做人工冒烟

.github/workflows/

CI、安全扫描、发布、E2E、原生应用流水线

企业分叉应保留安全/发布门禁

scripts/

构建、生成、发布、迁移与 QA 辅助

不把维护脚本当稳定 API

security/

安全模型/规则等资产

企业改造应纳入安全评审

稳定源码入口:https://github.com/openclaw/openclaw/tree/v2026.7.1

5.2 src/ 关键模块

模块

路径

主要职责

Gateway

src/gateway/,尤其 server/、methods/、server-methods/

HTTP/WS、RPC、认证、事件、Channel/Node/Agent/Automation 编排

Agent Runtime

src/agents/embedded-agent-runner/、src/agents/runtime/、packages/agent-core/

Attempt Loop、模型与工具调用、事件流、超时、Compaction

LLM/Provider

src/llm/、src/llm/providers/、Provider 插件

模型注册、传输、流式响应、兼容转换

Channel 抽象

src/channels/

通道通用契约、消息、turn、transport、插件桥接

入站路由

src/routing/resolve-route.ts

按 binding 的确定性优先级选 Agent 与 Session Key

配置

src/config/

JSON5 读取、严格 Schema、默认值、迁移与路径解析

Plugin

src/plugins/、src/plugin-sdk/、packages/plugin-sdk/

Manifest、发现、验证、装载、Capability Registry、SDK

Skills

src/skills/、Agent Skills 相关加载器

发现、优先级、资格过滤、Prompt 注入

MCP

src/mcp/

Gateway MCP bridge 和 MCP Client Registry

Session/Transcript

src/agents/sessions/、src/sessions/、src/transcripts/

Session 元数据、JSONL Transcript、读写锁与维护

Memory

src/memory/、src/memory-host-sdk/、extensions/memory-*

Markdown、索引、检索与可选后端

Sandbox

src/agents/sandbox/、extensions/openshell

Docker/SSH/OpenShell 等执行隔离

Automation

src/cron/、src/hooks/、src/tasks/、src/commitments/

调度、内部 Hook、任务状态、承诺跟踪

状态数据库

src/state/

共享与 per-agent SQLite Schema、迁移和访问

CLI/TUI

src/cli/、src/commands/、src/tui/

管理命令、聊天终端、诊断和修复

Node

src/node-host/、src/pairing/

设备配对、Capability/Command 调用

可观测/安全

src/logging/、src/audit/、src/secrets/、src/security/

日志、审计、SecretRef、安全检查

官方 Runtime 架构:https://docs.openclaw.ai/agent-runtime-architecture

5.3 三个关键公开接口

[官方稳定源码] Tool 接口。packages/agent-core/src/types.ts 中 AgentTool 具有 label、参数 Schema、execute(toolCallId, params, signal, onUpdate) 和可选 executionMode: sequential|parallel。工具失败应抛异常,而不是伪装成成功文本。

[官方稳定源码] Plugin 注册接口。OpenClawPluginApi 可注册 Tool、Hook、HTTP Route、Channel、Gateway Method、CLI、Node Command、Service、Provider、Embedding、Speech、Media、Search 等。插件在 Gateway 进程内运行,权限近似宿主代码,不是沙箱。

[官方稳定源码] Channel 插件。 Channel 通过 api.registerChannel(...) 注册;核心保留一个共享 message Tool,通道插件通过 Adapter 描述可见 action/capability/schema 并执行最终平台动作,避免每个通道各造一个模型工具。

接口源码:

  1. https://github.com/openclaw/openclaw/blob/v2026.7.1/packages/agent-core/src/types.ts
  2. https://github.com/openclaw/openclaw/blob/v2026.7.1/src/plugins/types.ts
  3. https://docs.openclaw.ai/plugins/architecture-internals
  4. https://docs.openclaw.ai/plugins/sdk-overview

5.4 “需求—修改位置”映射

需求

首选入口

不应只做什么

新增模型提供商

Provider Plugin;参考 extensions/*-provider、registerProvider、Catalog/Setup/Auth

不要在 Agent Loop 里硬编码 vendor 分支

新增消息渠道

Channel Plugin;实现 Channel 契约、动作 Adapter、认证/探测/媒体/线程能力及测试

不要只写一个收发 Webhook 就宣称完整通道支持

新增 Skill

<workspace>/skills/<name>/SKILL.md,必要时带脚本/引用;用资格与 allowlist 控制

不要把 Skill 文本当权限授予

新增原生 Tool

Plugin registerTool,提供严格 Schema、取消、超时、结构化错误、测试

不要把任意 shell 包一层就暴露给所有会话

新增 MCP 集成

mcp.servers + MCP Registry;复杂治理放 MCP Gateway

不要直接信任 Server 返回内容和全部工具

新增企业审批

before_tool_call/Tool Adapter 外围拦截 + 独立 Approval Service + 执行令牌

不要只靠 System Prompt 说“先询问”

新增审计

入站、路由、模型请求、Tool/MCP 前后、外发、审批、配置/插件变更多点埋点

不要只收集 stdout 日志

新增 SSO/RBAC

Gateway 前的身份代理/API Gateway + Policy Engine;必要时扩展 Gateway Scope

不要把 Channel allowlist 冒充完整 RBAC

新增多租户

按租户/信任域隔离 Gateway、状态、凭据、网络与存储,并建设控制平面

不能只把 agents.list 配多几个 Agent

第六章 部署方式完整比较与四套实施方案

方式

适合场景

主要优势

主要限制与安全提示

建议定位

macOS 本地安装

个人试用、需要 macOS/iMessage/本地应用能力

安装快,LaunchAgent 托管

与个人桌面文件、浏览器登录态同一信任域;休眠会中断服务

开发/个人

Linux 本地安装

长期在线单机、边缘主机、内网服务器

systemd 用户服务,排障直接

必须单独 OS 用户,不能以 root 常驻

小团队/生产单实例

Windows 原生

Windows Hub、PowerShell CLI、桌面节点

官方支持 Windows;Scheduled Task 托管

Windows 工具、路径和权限语义与 Linux 不同,第三方 Skill 兼容性需回归

个人/特定桌面

Windows WSL2

Windows 上运行 Linux Gateway

更接近 Linux 生态

WSL 网络、休眠、GPU/Ollama 启动和文件系统性能需专项验证

开发/试点

官方脚本或 npm

快速安装、系统服务

官方主路径,升级命令完整

宿主机污染面高于容器;Node 与插件供应链需管控

PoC/单机

Docker

可重复镜像、单容器部署

进程和依赖边界清晰

Docker 本身不等于强沙箱;状态卷和 socket 仍是高价值资产

小团队/生产单实例

Docker Compose

Gateway 加反代、Collector、备份边车

易理解、易备份、成本低

Compose 没有自动故障转移或分布式调度

5~20 人团队

单 VPS/云 VM

远程常驻、渠道机器人

部署简单、可做快照

公网暴露、SSH、磁盘和备份是单点;应私网/Tailscale/反代

小团队

Kubernetes

已有平台工程、需要统一策略和 GitOps

Secret、Policy、观测、调度体系成熟

OpenClaw 本身仍有单写者和渠道所有权约束;不能凭 K8s 获得原生 HA

企业平台

公有云 VM

低运维门槛、连接云模型

网络与弹性资源易获得

出网与日志合规、区域和供应商风险

小中型生产

私有云/裸金属

强合规、内网平台

数据与网络可控

自行承担硬件、镜像、证书、备份和故障切换

受监管企业

完全离线/内网

涉密或隔离环境

数据不出域

需离线镜像、npm/插件镜像库、本地模型和离线证书/漏洞库;外部渠道通常不可用

特殊生产

本地 OpenClaw + 云模型

常见混合方案

Gateway 状态留本地,模型能力强

提示、附件和工具结果仍会发给云模型,必须做 DLP/路由

常规企业

云 OpenClaw + 本地模型

云端渠道接入、内网推理

可复用云运维

需要安全反向通道;不要直接暴露 Ollama/LM Studio 到公网

谨慎采用

全私有化

机密数据与本地模型

主数据面不出网

GPU、模型服务、Embedding、模型质量和更新成本高

高敏业务

混合云

按数据级别路由

成本/能力/隐私折中

路由错误即数据泄露,需要策略引擎和审计

成熟团队

多 Gateway 分部门/信任域

多团队、不同凭据与数据域

故障和权限爆炸半径小

需要外围注册、路由、配额与统一审计

推荐生产形态

【稳定版官方】系统要求是 Node.js 22.22.3+24.15+ 或 25.9+,Node 24 为推荐目标;Node 23 不支持。操作系统为 macOS、Linux 或 Windows;从源码构建才需要 pnpm。Docker 镜像构建建议至少 2 GiB 内存,1 GiB 环境可能在依赖安装阶段 OOM(exit 137);这不是经过生产压测的 Gateway 运行下限。官方 Raspberry Pi 文档给出的纯云模型网关最低参考为 1 核、1 GiB RAM、500 MiB 空闲磁盘,推荐 2 GiB+ 与 SSD,但浏览器、并发工具、附件和本地模型会显著提高资源需求。企业不能据此跳过容量测试。

6.1 安装、目录与运行基线

6.1.1 官方安装与验证命令

macOS、Linux 或 WSL2:

BASH

curl -fsSL https://openclaw.ai/install.sh | bash

# 无交互入门流程

curl -fsSL https://openclaw.ai/install.sh | bash -s -- --no-onboard

openclaw onboard --install-daemon

已有 Node 环境:

BASH

npm install -g openclaw@latest

openclaw onboard --install-daemon

Windows PowerShell:

POWERSHELL

iwr -useb https://openclaw.ai/install.ps1 | iex

源码构建:

BASH

git clone https://github.com/openclaw/openclaw.git

cd openclaw

git checkout v2026.7.1

pnpm install && pnpm build && pnpm ui:build

pnpm link --global

openclaw onboard --install-daemon

统一验证:

BASH

openclaw --version

openclaw doctor

openclaw gateway status

curl -fsS http://127.0.0.1:18789/readyz

macOS 使用 LaunchAgent;Linux/WSL2 使用用户级 systemd;原生 Windows 优先使用 Scheduled Task,若创建被拒绝则回退到每用户 Startup 项。官方安装细节见Installer

6.1.2 必须持久化的目录

内容

稳定版默认位置

运维含义

状态根

~/.openclaw;可由 OPENCLAW_STATE_DIR 改写

不同 Gateway 必须独立,profile 默认为 ~/.openclaw-<profile>

主配置

~/.openclaw/openclaw.json

含路由、渠道、工具和 SecretRef 元数据

共享状态库

~/.openclaw/state/openclaw.sqlite

SQLite,使用 WAL;备份要保持一致性

Agent 数据库

~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite

稳定版运行时的模型认证 profile、Agent 状态和内置 Memory 索引

会话索引

~/.openclaw/agents/<agentId>/sessions/sessions.json

不应由多个对等实例无锁并写

会话转录

同一 sessions 树下的 transcripts/*.jsonl

容量、隐私、保留期重点

其他凭据

~/.openclaw/credentials/ 及各渠道/外部 CLI 的受管路径

与配置一样是生产密钥资产;旧 auth-profiles.json 仅由 doctor --fix 导入 SQLite,不再是认证运行时主存储

Workspace

~/.openclaw/workspace 或每 Agent 自定义

AGENTS/SOUL/USER、Memory、产物与工作文件

Skills / 插件

~/.openclaw/skills、~/.openclaw/npm、~/.openclaw/git

需要版本锁定、SBOM/恶意代码审查

Docker OAuth 加密材料

宿主 ~/.openclaw-auth-profile-secrets 挂到 /home/node/.config/openclaw

必须和主状态一同保护,但可单独备份/授权

文件日志

/tmp/openclaw/openclaw-YYYY-MM-DD.log

JSONL;100 MB 轮换,保留 5 个编号归档,可用 logging.file 改写

稳定性包

~/.openclaw/logs/stability/

预 OOM/崩溃诊断,仍按敏感运维数据保护

路径证据:FAQ:磁盘位置迁移稳定版共享数据库路径源码稳定版 Agent 数据库路径源码。稳定包中的部分概览页仍把 auth-profiles.json 写成当前路径,但认证实现和专门认证文档已以 SQLite 为准;这是需要在正文显式说明的官方文档滞后。

另一个更重要的差异是:随包的 docs/refactor/database-first.md 把“Session/Transcript 已完全迁入 SQLite”描述为目标/进度,但 v2026.7.1 实际热路径源码仍大量调用 src/config/sessions/store.tssessions.json 和基于文件的 SessionManager,官方 Session 参考页也仍给出 agents/<agentId>/sessions/。因此本文按稳定源码和实际 CLI 行为把会话索引/转录视为文件状态;重构文档只能作为未来方向,不能据其删掉 Session 目录备份或宣称当前已具备数据库事务式多副本能力。Session Store 源码Session 参考

警告 警告: Workspace 是默认工作目录和 Memory 锚点,不是安全沙箱。未启用 Sandbox 时,绝对路径仍可能访问宿主其他位置。不要把 Gateway 直接作为 root 运行,也不要让所有部门共享同一个 Workspace 和凭据。

6.2 四套可实施方案

方案 A:个人或开发者本地试用

  1. 硬件/系统:macOS、Linux、Windows/WSL2;从 2 核、2~4 GiB 内存和 10 GiB 可用磁盘开始。本地模型的 GPU/内存另算。
  2. 网络:Gateway 只绑定回环地址;仅向选定模型 API 和渠道出站。不要把 18789 直接映射到公网。
  3. 依赖与安装:Node 24 推荐;执行官方安装脚本和 openclaw onboard --install-daemon。代码调试再采用固定标签源码构建。
  4. 目录:使用个人 ~/.openclaw,但 Workspace 不要指向整个 $HOME。机密项目使用独立 OS 账号或 VM。
  5. 模型:先用一个云模型 API Key;需要离线验证时再接 Ollama/LM Studio。
  6. 健康/日志openclaw status --allopenclaw channels status --probeopenclaw logs --follow
  7. 升级/回滚:先 openclaw backup create --verify,再 openclaw update --dry-runopenclaw update;失败时安装固定版本并运行 Doctor。
  8. 备份:把验证通过的备份放到加密个人存储;Workspace 可进私有 Git,但凭据与会话不得提交。
  9. 常见错误:命令不在 PATH、Node 版本不支持、服务进程读不到交互 Shell 的环境变量、桌面休眠导致渠道掉线。
  10. 安全门禁:默认禁用高风险 Shell/浏览器发布;第三方 Skills 只在隔离 Workspace 中审查后启用。

方案 B:5~20 人 Docker Compose 小团队

  1. 硬件/系统:一台 Linux VM,建议从 4 vCPU、8 GiB RAM、50 GiB SSD 起步;这是工程初始值而非官方吞吐承诺,需按附件、浏览器和会话增长校准。
  2. 网络:Gateway 仅在 Compose 内网暴露;宿主仅开放反向代理的 443。模型/MCP/渠道出站走 DNS 与目标白名单;管理入口通过 VPN、Tailscale 或企业反代鉴权。
  3. 依赖:Docker Engine、Compose v2;固定 ghcr.io/openclaw/openclaw:2026.7.1 或镜像 digest。
  4. 目录/卷:宿主 /srv/openclaw/{state,workspace,auth-profile-secrets,backup},UID/GID 1000 所有;三类状态分别挂到官方容器路径。
  5. 启动:先用官方 scripts/docker/setup.sh 生成状态和 Token,再切换到经评审的 Compose 覆盖文件,执行 docker compose up -d openclaw-gateway
  6. 健康/日志:容器 /healthz;反向代理与监控使用 /readyzdocker compose logs -f openclaw-gateway 和 openclaw logs --follow 双查。
  7. 升级:拉取固定新镜像,在副本环境挂载备份恢复测试;生产停旧实例、备份、换镜像、观察 /readyz
  8. 备份/回滚:每日 openclaw backup create --verify;升级前停 Gateway 做完整状态归档或卷快照。回滚镜像前先确认数据迁移可逆。
  9. 常见错误:挂载目录属主不为 1000、把 127.0.0.1 当容器间地址、本地 Ollama 未绑定到可达接口、反代 WebSocket/Origin 配置缺失、1 GiB 主机构建 OOM。
  10. 安全门禁:不得把 Docker socket 挂入 Agent Sandbox;若 Gateway 为创建 Sandbox 容器而接触 socket,应把该 Gateway 所在 VM 当作高权限边界。

方案 C:企业内网单 Gateway + 独立 Agent Workspace

  1. 硬件/系统:经加固的 Linux VM 或私有云实例;资源从 4~8 vCPU、16 GiB RAM、SSD 起步,并以压力测试决定。浏览器执行放到隔离节点或 Sandbox 运行时。
  2. 身份与网络:API Gateway/OIDC 只保护外围入口;OpenClaw 的渠道身份映射和 allowlist 不等于完整 RBAC。不同 Agent 使用独立 Workspace、凭据和工具策略;敏感 MCP 仅内网 mTLS。
  3. 部署:Gateway 仍为单写者;systemd 或单副本 K8s。运维面只允许堡垒机/管理网访问;Control UI 不上普通办公公网。
  4. 配置:每 Agent 固定模型、工具 allowlist、并发/上下文预算;凭据迁移到 SecretRef,执行 openclaw secrets audit --check
  5. 状态:数据盘加密,SQLite/Session 与 Workspace 同步备份;日志、审计和备份分别有保留策略。
  6. 健康/观测:同时启用官方 OTel 或 Prometheus 插件;观测 Collector 与长期存储属于外围平台。
  7. 升级:stable 固定版本;测试环境做 Skill、MCP、渠道和记忆回归后维护窗口升级。
  8. 故障切换:冷备或有外部栅栏的主备,任一时刻只有一个实例拥有渠道凭据、读写卷和 Cron 权限。
  9. 安全门禁:单 Gateway 只服务一个受控信任域;低信任群聊不得触发写操作或生产工具。

方案 D:企业多 Gateway、分信任域、模型网关、审批与审计

  1. 拓扑:每部门/数据级别/渠道账号运行独立 Gateway cell,各自拥有状态、Workspace、密钥、出口策略和配额;外围统一 API Gateway、OIDC、Policy Engine、Approval Service、Audit Service、Model Gateway、MCP Gateway、Agent/Skill/Gateway Registry。
  2. 部署:每个 cell 为单活动实例或有栅栏主备;Kubernetes Namespace、ServiceAccount、PVC、NetworkPolicy 和 Secret 分域。不要让多个 cell 共享 SQLite/PVC 或渠道登录态。
  3. 模型路由:公开内容可走云模型;内部/机密内容优先本地或合规模型网关;高风险工具调用必须经过审批服务和策略验证器。
  4. 成本治理:在模型网关与 OpenClaw 两层记录 Agent、用户、任务、模型、Token 和预算;达到上限熔断,不用无限 fallback 掩盖故障。
  5. 审计:保留消息路由元数据、模型选择、工具名/参数摘要、审批人、结果、策略判定和版本;原始提示/工具输出只在经过数据分类批准时进入观测系统。
  6. 灾备:cell 级 RPO/RTO;跨区域备份不自动启动渠道。故障域切换先取得租约、验证旧实例已被隔离,再注入凭据并启动。
  7. 演进边界:【实验/后续文档】在线文档中的 Fleet/cell 管理仍属实验且在稳定包 v2026.7.1 中没有 openclaw fleet CLI,不能写进稳定版生产 Runbook。当前可靠方式仍是外部平台管理多个独立 Gateway。

第七章 从零完成 Docker Compose 部署

5.1 官方 Compose 基线

官方入口是:

BASH

./scripts/docker/setup.sh

# 或使用预构建镜像

export OPENCLAW_IMAGE="ghcr.io/openclaw/openclaw:2026.7.1"

./scripts/docker/setup.sh

也可手工执行:

BASH

docker build -t openclaw:local -f Dockerfile .

docker compose run --rm --no-deps --entrypoint node openclaw-gateway \

  dist/index.js onboard --mode local --no-install-daemon

docker compose run --rm --no-deps --entrypoint node openclaw-gateway \

  dist/index.js config set --batch-json \

  '[{"path":"gateway.mode","value":"local"},{"path":"gateway.bind","value":"lan"},{"path":"gateway.controlUi.allowedOrigins","value":["http://localhost:18789","http://127.0.0.1:18789"]}]'

docker compose up -d openclaw-gateway

稳定版官方 `docker-compose.yml` 的关键事实如下:

  1. Gateway 容器内固定 HOME=/home/node,状态、配置和 Workspace 路径分别为 /home/node/.openclaw/home/node/.openclaw/openclaw.json/home/node/.openclaw/workspace
  2. 默认宿主目录是 $HOME/.openclaw$HOME/.openclaw/workspace$HOME/.openclaw-auth-profile-secrets
  3. 映射 18789(Gateway)、18790(bridge)、3978(Teams);企业不应无差别映射到 0.0.0.0
  4. 以非 root node(UID 1000)运行,需 chown -R 1000:1000 修复 bind mount 权限。
  5. restart: unless-stoppedinit: true,删除 NET_RAW/NET_ADMIN,设置 no-new-privileges;健康检查访问 http://127.0.0.1:18789/healthz
  6. CLI sidecar 使用 network_mode: service:openclaw-gateway,并共享相同卷,因此它与 Gateway 属于同一信任边界。
  7. 官方 Compose 没有反向代理、TLS、OTel Collector、备份任务、CPU/内存限制、日志驱动轮换和出站防火墙;这些都属于外围设计。

5.2 生产覆盖文件示例

不要改动官方文件;建立 docker-compose.prod.yml 作为覆盖层:

YAML

services:

  openclaw-gateway:

    image: ghcr.io/openclaw/openclaw:2026.7.1

    restart: unless-stopped

    init: true

    user: "1000:1000"

    read_only: true

    tmpfs:

      - /tmp:rw,noexec,nosuid,size=512m

    volumes:

      - /srv/openclaw/state:/home/node/.openclaw:rw

      - /srv/openclaw/workspace:/home/node/.openclaw/workspace:rw

      - /srv/openclaw/auth-profile-secrets:/home/node/.config/openclaw:rw

      - /srv/openclaw/secrets:/run/openclaw-secrets:ro

    environment:

      HOME: /home/node

      OPENCLAW_HOME: /home/node

      OPENCLAW_STATE_DIR: /home/node/.openclaw

      OPENCLAW_CONFIG_PATH: /home/node/.openclaw/openclaw.json

      OPENCLAW_CONFIG_DIR: /home/node/.openclaw

      OPENCLAW_WORKSPACE_DIR: /home/node/.openclaw/workspace

      OPENCLAW_NO_AUTO_UPDATE: "1"

    command: ["node", "dist/index.js", "gateway", "--bind", "lan", "--port", "18789"]

    expose: ["18789"]

    cpus: "2.0"

    mem_limit: 4g

    security_opt: ["no-new-privileges:true"]

    cap_drop: ["ALL"]

    healthcheck:

      test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:18789/healthz').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))"]

      interval: 30s

      timeout: 5s

      retries: 5

      start_period: 30s

    logging:

      driver: json-file

      options: { max-size: "20m", max-file: "5" }

    networks: [agent_internal]

  reverse-proxy:

    image: caddy:2.9.1-alpine

    restart: unless-stopped

    ports: ["443:443"]

    volumes:

      - ./Caddyfile:/etc/caddy/Caddyfile:ro

      - caddy_data:/data

    networks: [agent_internal]

networks:

  agent_internal:

    internal: false

volumes:

  caddy_data: {}

这个示例只演示结构,镜像 digest、证书源、DNS、Caddy 策略和资源值必须由企业流水线生成。read_only: true 在官方 K8s 清单中已被验证为可行,因为状态目录和 /tmp 单独可写;但安装插件、浏览器下载、某些 Skill 或 CLI 后端可能需要额外可写缓存。逐功能测试后再启用,绝不能为解决一个插件问题把整个宿主目录改成可写。

Secrets 不要虚构 *_FILE 环境变量。v2026.7.1 官方支持 SecretRef:把 Docker Secret/CSI/宿主密钥文件只读挂载,再在 openclaw.json 的受支持凭据字段引用。例如:

JSON5

{

  secrets: {

    providers: {

      openai_file: {

        source: "file",

        path: "/run/openclaw-secrets/openai-api-key",

        mode: "singleValue",

      },

    },

  },

  models: {

    providers: {

      openai: {

        apiKey: { source: "file", provider: "openai_file", id: "value" },

      },

    },

  },

}

启动前后执行:

BASH

docker compose exec openclaw-gateway openclaw secrets audit --check

docker compose exec openclaw-gateway openclaw doctor

docker compose exec openclaw-gateway openclaw health --json

SecretRef 会减少明文落盘和运行链路暴露,但不构成进程隔离;真实值仍会在最终网络适配边界进入同一进程内存。详见Secrets 管理

5.3 本地模型、Collector 与备份边车

  • 宿主 LM Studio 在容器中使用 http://host.docker.internal:1234,Ollama 使用 http://host.docker.internal:11434;宿主服务必须绑定可达接口,但应用防火墙只允许 Docker bridge 源地址。
  • Linux 下可运行 lms server start --port 1234 --bind 0.0.0.0 或 OLLAMA_HOST=0.0.0.0:11434 ollama serve,不要因此把端口开放到办公网或公网。
  • Collector、反向代理和备份任务均为。备份边车不要直接 cp 打开的 SQLite/WAL;应调用 Gateway 镜像内的 openclaw backup create --verify,或在停机后做卷快照。

官方 Sandbox 可通过 OPENCLAW_SANDBOX=1 ./scripts/docker/setup.sh 启用,setup 默认设置 agents.defaults.sandbox.mode=non-main、scope agent、Workspace 访问 none。它默认关闭,而且让 Gateway 操作宿主 Docker socket 仍是高权限。官方明确警告不要把宿主 Docker socket挂给 Agent 的 sandbox 容器。

5.3 本地模型、Collector 与备份边车

  • 宿主 LM Studio 在容器中使用 http://host.docker.internal:1234,Ollama 使用 http://host.docker.internal:11434;宿主服务必须绑定可达接口,但应用防火墙只允许 Docker bridge 源地址。
  • Linux 下可运行 lms server start --port 1234 --bind 0.0.0.0 或 OLLAMA_HOST=0.0.0.0:11434 ollama serve,不要因此把端口开放到办公网或公网。
  • Collector、反向代理和备份任务均为。备份边车不要直接 cp 打开的 SQLite/WAL;应调用 Gateway 镜像内的 openclaw backup create --verify,或在停机后做卷快照。

官方 Sandbox 可通过 OPENCLAW_SANDBOX=1 ./scripts/docker/setup.sh 启用,setup 默认设置 agents.defaults.sandbox.mode=non-main、scope agent、Workspace 访问 none。它默认关闭,而且让 Gateway 操作宿主 Docker socket 仍是高权限。官方明确警告不要把宿主 Docker socket挂给 Agent 的 sandbox 容器。

第八章 Kubernetes 企业部署与高可用边界

8.1 官方清单到底提供了什么

官方文档明确说明 Kubernetes 清单是最小起点,不是生产就绪方案,采用 Kustomize 而非官方 Helm Chart。启动方式:

BASH

export OPENAI_API_KEY="..."   # 或选择的 Provider Key

./scripts/k8s/deploy.sh

kubectl port-forward svc/openclaw 18789:18789 -n openclaw

kubectl get secret openclaw-secrets -n openclaw \

  -o jsonpath='{.data.OPENCLAW_GATEWAY_TOKEN}' | base64 -d

v2026.7.1 清单的真实形态是:

资源

官方稳定版设置

工程含义

Namespace

openclaw

单一示例命名空间

Workload

Deployment,replicas: 1,strategy: Recreate

明确避免滚动阶段两个实例同时活动

存储

10 GiB PVC,ReadWriteOnce,挂 /home/node/.openclaw

有状态单写者,不是共享无状态服务

Init Container

BusyBox 把 ConfigMap 的配置/Workspace 种子复制进 PVC

ConfigMap 不是运行时状态存储

镜像/命令

ghcr.io/openclaw/openclaw:slim;node /app/dist/index.js gateway run

示例 tag 应在生产改成固定版本或 digest

资源

request 250m/512 MiB;limit 1 CPU/2 GiB

仅模板默认值,不是性能保证

Probe

liveness /healthz;readiness /readyz

官方示例没有 startupProbe

安全上下文

UID/GID 1000、non-root、RuntimeDefault seccomp、rootfs 只读、drop ALL

可作为加固基线

ServiceAccount

automountServiceAccountToken: false

Gateway 默认不需要访问 K8s API

Cron

ConfigMap 中 cron.enabled: false

避免最小清单误触发主动任务

Service

ClusterIP 18789

需自行加 Ingress/Gateway API 与 TLS

固定证据:Kubernetes 文档DeploymentConfigMapPVCService

8.2 生产化补齐项

  1. Namespace 与账号:每个信任域独立 Namespace、ServiceAccount、PVC、Secret、NetworkPolicy;保留 automountServiceAccountToken: false。若备份边车确需 K8s API,给边车单独账号,不能复用 Gateway 身份。
  2. Deployment 或 StatefulSet:单活动 Gateway 使用 Deployment + Recreate 足够直接;StatefulSet 只提供稳定 Pod/卷身份,并不会自动增加分布式锁或渠道租约。主备控制器若依赖固定序号,可使用 StatefulSet,但必须有外部 fencing。
  3. 存储:生产 StorageClass 应支持快照、加密和明确的延迟/SLA。若 CSI 支持,单写者可考虑 ReadWriteOncePod;Kubernetes 的 RWO 只限制节点挂载,可能允许同一节点多个 Pod 使用,不等同严格单 Pod 写入。Kubernetes PV 文档
  4. Secret:Kubernetes Secret 只是一种对象,不自动等于硬件级秘密管理。推荐 External Secrets/Secrets Store CSI 把 Vault/KMS 中密钥挂到只读文件,再通过 OpenClaw SecretRef 引用;禁止把密钥写入 ConfigMap、Git 或渲染后的 Helm values。
  5. 入口:Ingress/Gateway API 终止 TLS,限制 Host、Origin、WebSocket、请求体和速率;管理 UI 只在管理网/OIDC 后。不要通过公共 LoadBalancer 暴露未经外围鉴权的 18789。
  6. NetworkPolicy:默认拒绝入站和出站,只放行反代、DNS、OTel Collector、批准的模型/MCP/渠道目的地。域名出站通常需 egress proxy 或 CNI/FQDN policy,普通 NetworkPolicy 只能按 IP/端口。
  7. Pod Security:保留 non-root、drop ALL、只读 rootfs、RuntimeDefault seccomp;按集群能力加 AppArmor/SELinux。不得 hostNetwork、hostPID、privileged,也不得挂宿主根目录或 Docker socket。
  8. 资源与探针:根据压测设 request/limit;增加 startupProbe,避免大状态迁移或插件收敛期间被 liveness 反复杀死。readiness 负责流量,liveness 只判断进程自愈。
  9. 调度:Agent Sandbox/浏览器节点使用专用 node pool、taint/toleration 与 RuntimeClass;Gateway 本身与高风险执行器分离。反亲和对单副本没有 HA 魔法,但可用于主备或多个独立 cell 分散故障域。
  10. PDB:单副本 minAvailable: 1 只能阻止部分自愿驱逐,不能在节点故障时维持服务,还可能阻塞维护;必须配合冷/热备和运维 Runbook。
  11. 镜像治理:固定 semver/digest,验证签名、生成 SBOM、扫描镜像与插件;准入策略拒绝 latest/slim 浮动标签和未知仓库。
  12. GitOps:Base 放稳定官方字段,Overlay 按环境/信任域维护 SecretRef、Ingress、NetworkPolicy、配额和 Pod 安全。状态数据库、OAuth 文件和 Workspace 不进入 Git。

建议探针片段:

YAML

startupProbe:

  httpGet: { path: /healthz, port: 18789 }

  periodSeconds: 10

  failureThreshold: 30

readinessProbe:

  httpGet: { path: /readyz, port: 18789 }

  periodSeconds: 10

  timeoutSeconds: 5

livenessProbe:

  httpGet: { path: /healthz, port: 18789 }

  periodSeconds: 30

  timeoutSeconds: 5

/health 与 /healthz 是浅层存活别名,正常返回 {"ok":true,"status":"live"}/ready 与 /readyz 会在启动 sidecar、Gateway draining 或渠道运行时健康失败时返回 503。远程未认证调用会隐藏失败详情。不要用 /v1/chat/completions 做探针,因为它会创建会话和模型调用。来源:Health

最小 NetworkPolicy 思路:

YAML

apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata: { name: openclaw-default-deny, namespace: openclaw-finance }

spec:

  podSelector: {}

  policyTypes: [Ingress, Egress]

apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata: { name: openclaw-allow, namespace: openclaw-finance }

spec:

  podSelector: { matchLabels: { app: openclaw } }

  policyTypes: [Ingress, Egress]

  ingress:

    - from:

        - namespaceSelector: { matchLabels: { kubernetes.io/metadata.name: ingress-system } }

      ports: [{ protocol: TCP, port: 18789 }]

  egress:

    - to:

        - namespaceSelector: { matchLabels: { kubernetes.io/metadata.name: observability } }

      ports: [{ protocol: TCP, port: 4318 }]

真实环境还需放行 DNS 与批准的模型/渠道/MCP 出站。上述清单故意不写任意 0.0.0.0/0,应由网络团队按目的地补齐。

8.3 为什么不能直接横向扩展

  1. 单例锁与端口:官方建议一个配置/状态对应一个 Gateway;锁按配置文件生效,端口也只能被一个进程独占。多个 Gateway 要使用独立 OPENCLAW_CONFIG_PATHOPENCLAW_STATE_DIR、Workspace 和端口。Multiple GatewaysGateway Lock
  2. SQLite:共享状态库采用 WAL。SQLite 官方明确说明 WAL 的进程必须在同一宿主,不能依赖网络文件系统提供正确共享锁;把 PVC 设为 RWX 不会把 SQLite 变成分布式数据库。SQLite WALSQLite over network
  3. Session:除 SQLite 外仍有 sessions.json 与 transcript JSONL、本地缓存和运行中 turn;随机负载均衡可能让连续消息落到不同运行状态,造成上下文落后、重复发送或冲突写。
  4. 渠道长连接:WhatsApp/Baileys 等渠道由 Gateway 持有账号会话和长连接。两个实例抢同一组登录态可能相互踢下线、重复消费/回复并并发修改凭据。
  5. Cron:稳定版源码中的 Cron 锁明确是 process-local;计时器虽把 reservation 写入 SQLite,却没有跨节点 leader election。两个活动实例可在任一提交前同时看到到期任务而重复执行。Cron 进程内锁Cron Timer
  6. 去重/出站:当前不是带持久消息队列、分布式幂等键和 transactional outbox 的集群运行时;入口重试和实例切换需外围系统承担去重。

8.4 可行高可用方案比较

方案

活动实例

RPO/RTO 特点

优点

关键约束

冷备

1

RPO 取决于备份;RTO 为恢复与登录时间

最简单、最不易双活

定期恢复演练,渠道可能需重新认证

温备/主备

1

可缩短 RTO

备用环境预热

必须有外部租约和 fencing;备用不得读写卷/使用渠道凭据

按渠道分片

每渠道账号 1

单渠道故障隔离

避免连接争抢

跨渠道会话/记忆需显式设计

按部门/Agent 分片

每域 1

爆炸半径小

权限与成本清晰

需要外围路由与注册表

按信任域分片

每敏感级别 1

最符合零信任

防止低信任输入触发高权限工具

运维实例数量增加

外围路由 + 多独立 Gateway

多个 cell

cell 级切换

稳定版即可实施

不是共享状态的透明集群

状态存储改造后双活

多个

理论上最低 RTO

可扩展

需外置数据库/对象存储、分布式会话锁、渠道租约、Cron leader/job claim、持久队列、幂等/outbox、分布式配额;属于重大二次开发

切换顺序必须是:停止入口 → 对旧主执行网络/凭据/存储栅栏 → 验证租约失效 → 恢复或挂载一致状态 → 向新主注入短期凭据 → 启动 → /readyz、渠道和会话冒烟验证 → 开入口。只做 DNS 切换不构成安全主备。

第九章 模型接入与模型路由

9.1 Provider 表

模型能力必须按具体模型实测,不能把 Provider 的“兼容接口”当成 Tool Calling、视觉、流式和推理格式都相同。模型名、上下文窗口和价格变化频繁,应从供应商目录与 openclaw models list --provider <id> 获取,而不是硬编码到长期手册。

Provider

稳定版接入

认证/默认端点

关键命令或注意点

OpenAI

内置官方

OPENAI_API_KEY;官方 API;也有 OpenAI/Codex OAuth

openclaw onboard --auth-choice openai-api-key;稳定文档示例 openai/gpt-5.6,若账号不可用要显式改用其他模型,不会静默降级

Anthropic

内置官方

ANTHROPIC_API_KEY

生产推荐 API Key;复用 Claude CLI 订阅受其登录、版本、计费和政策影响,不宜作为共享生产认证

Google Gemini

内置官方

GEMINI_API_KEY 或 GOOGLE_API_KEY

openclaw onboard --auth-choice gemini-api-key;Gemini CLI OAuth 路径被文档标为非官方集成

DeepSeek

官方外部插件,非核心内置

DEEPSEEK_API_KEY;https://api.deepseek.com

openclaw plugins install @openclaw/deepseek-provider,重启后使用 deepseek/...

OpenRouter

内置官方

OPENROUTER_API_KEY 或 OAuth

openclaw onboard --auth-choice openrouter-api-key;openrouter/auto 是路由入口

Ollama

内置官方

本地默认 http://127.0.0.1:11434;marker ollama-local

使用原生 /api/chat,baseUrl 不加 `/v1`;公网 Ollama Cloud 必须用真实 Key

LM Studio

内置官方

LM_API_TOKEN;http://localhost:1234/v1

discovery 使用 /api/v1/models;容器访问宿主用 host.docker.internal

vLLM

内置官方

VLLM_API_KEY;http://127.0.0.1:8000/v1

api: "openai-completions";模型元数据和真实上下文需显式配置

LiteLLM

内置官方

LITELLM_API_KEY;企业代理 URL

适合作模型网关;OpenClaw 的 provider id 为 litellm

任意 OpenAI-compatible

自定义 Provider

企业 baseUrl + SecretRef/API Key

必须同时定义 models.providers.<id>.models[];只写 agents.defaults.models 不会注册运行时 Provider

官方页:OpenAIAnthropicGoogleDeepSeekOpenRouterOllamaLM StudiovLLMLiteLLMModel Providers

OpenAI-compatible 企业网关示例:

JSON5

{

  agents: {

    defaults: {

      model: {

        primary: "corp/my-model",

        fallbacks: ["anthropic/claude-opus-4-8", "ollama/qwen3:32b"],

      },

      models: { "corp/my-model": { alias: "Corp" } },

    },

  },

  models: {

    mode: "merge",

    providers: {

      corp: {

        baseUrl: "https://llm-gateway.example/v1",

        apiKey: { source: "env", provider: "default", id: "CORP_LLM_API_KEY" },

        api: "openai-completions",

        timeoutSeconds: 300,

        models: [{

          id: "my-model",

          name: "Corp Model",

          reasoning: false,

          input: ["text"],

          cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },

          contextWindow: 128000,

          maxTokens: 8192,

        }],

      },

    },

  },

}

示例中的窗口、最大输出和成本是占位元数据,不是对任意自建模型的事实;必须改成模型服务实际限制,否则上下文预算、成本统计和裁剪都会失真。自定义精确 origin 可被信任;其他私网地址需要显式 request.allowPrivateNetwork: true,应由 SSRF 风险评审决定。

9.2 Fallback、Key 轮换和企业路由

【稳定版官方】故障切换分两层:先在同一 Provider 内轮换 auth profile,再沿 fallbacks 切模型。会话会固定 auth profile 以利用缓存,遇到限流/超时才轮换;显式用户 /model 选择是严格模式。配置顺序:

JSON5

{

  auth: {

    order: {

      openai: ["openai:user@example.com", "openai:api-key-backup"],

    },

  },

  agents: {

    defaults: {

      model: {

        primary: "anthropic/claude-opus-4-8",

        fallbacks: ["openai/gpt-5.6", "openrouter/auto", "ollama/qwen3:32b"],

      },

    },

  },

}

轮换冷却大致为 30 秒、1 分钟,再到 5 分钟上限;计费禁用会进入更长冷却。SDK 的 Retry-After 等待上限默认 60 秒,可用 OPENCLAW_SDK_RETRY_MAX_WAIT_SECONDS 调整。不要把渠道请求层 attempts: 3 的重试说明误写成所有模型调用都会由 OpenClaw统一重试三次。来源:Model FailoverRetry

企业路由规则:

  1. 分类、标题、短摘要走低成本模型;复杂代码/推理走强模型。
  2. 数据分类为“内部/机密”的内容先经 DLP,默认走本地模型或合规 Model Gateway;公共资料任务可走云模型。
  3. 高风险操作不只是换强模型,还要使用只读预检、策略验证器、人工审批和幂等执行器。
  4. 对每次任务设置最大模型调用次数、最大工具循环、最大 Token、最长墙钟时间和成本预算。达到上限立即失败并通知,不以无限 fallback 继续烧费。
  5. 降级顺序必须表达能力要求。例如任务需要视觉/Tool Calling 时,不能降级到不支持相应能力的本地模型。
  6. Key 轮换不能绕过供应商账号配额;统一在 Model Gateway 做每用户/Agent/成本中心限流和账单归集。

第十章 Session、Context 和 Memory 深度调优

10.1 四个概念不能混用

Session、Context 与 Memory 关系图

Session 是路由和历史单元;Context 是一次模型调用实际看到的有限输入;Memory 是跨轮或跨会话保存与检索的知识。三者不能互相替代,尤其不能把 Session Key 当成授权边界。

  1. Session 是可持续的会话运行单元,包含路由/模型覆盖等元数据和追加式 Transcript。
  2. Context 是这一轮实际发送给模型的动态窗口;它是 Session 历史经压缩/裁剪后,再加 System Prompt、Workspace、Skills、Tools、Memory、附件的结果。
  3. Memory 的事实源是 Markdown,而不是模型参数里的“神秘记忆”;索引可以重建。
  4. Workspace 是默认 cwd 和上下文文件根,但不是文件系统沙箱。

10.2 Session Key 与多人隔离

[官方稳定能力] 默认 Agent 是 main,Session Key 形如 agent:main:<mainKey>。群组/房间通常独立,Cron 隔离任务每次可新建 Session,Hook 按 Hook 路由。私聊默认 session.dmScope: "main",同一 Agent 的多个私聊可能折叠到主 Session。

可选值:

  1. main:所有 DM 共享 Agent 主会话;个人助手便利,但多人不安全;
  2. per-peer:按发送者;跨 Channel 的同一人仍需 identityLinks;
  3. per-channel-peer:按渠道+发送者,企业共享入口的推荐最小值;
  4. per-account-channel-peer:再按渠道账号细分。

10.3 Workspace 与 Bootstrap

默认 Workspace:~/.openclaw/workspace;profile 为 ~/.openclaw/workspace-<profile>;非默认 Agent 若未显式指定,通常为 <state-dir>/workspace-<agentId>。可通过 OPENCLAW_WORKSPACE_DIRagents.defaults.workspaceagents.list[].workspace 覆盖。

可注入文件包括:AGENTS.mdSOUL.mdTOOLS.mdIDENTITY.mdUSER.mdHEARTBEAT.mdBOOTSTRAP.md、可选 MEMORY.mdBOOT.md 用于 startup hook。默认单文件 Bootstrap 上限 agents.defaults.bootstrapMaxChars = 20000,合计上限 bootstrapTotalMaxChars = 60000;可 skipBootstrap: true

警告 TOOLS.md 只是说明,不会授予 Tool;Workspace 也只是 cwd,绝对路径在未启用 Sandbox 时仍可访问宿主其他位置。

10.4 Memory 与 Compaction/Pruning

[官方稳定能力] 默认 Memory 事实文件:

TEXT

<workspace>/MEMORY.md

<workspace>/memory/YYYY-MM-DD.md

可选 DREAMS.mdmemory-core 插件提供 memory_searchmemory_get。默认索引支持 SQLite FTS5/BM25,并可结合向量、CJK trigram、sqlite-vec;默认 chunk 约 400 token、overlap 80。远程/本地 Embedding Provider 可选,未配置可退化为关键词检索。

BASH

openclaw memory status

openclaw memory status --deep --agent main

openclaw memory index --force

  • Compaction:把较旧历史总结后持久写回会话,改变后续可见历史;
  • Pruning:模型调用前临时裁掉旧 Tool Result,不改磁盘 Transcript;
  • Memory Flush:接近 Compaction 前触发一次静默 Agent Turn,提示把值得长期保存的信息写入 Memory;可用 agents.defaults.compaction.memoryFlush.enabled: false 关闭。

10.5 v2026.7.1 的混合持久化(重要勘误)

[官方稳定源码核验] 不能笼统写“OpenClaw 全部使用 SQLite”,也不能写“全部是 JSON 文件”。稳定版是混合形态:

数据

v2026.7.1 实际位置/形态

全局配置

~/.openclaw/openclaw.json(JSON5,严格 Schema)

状态根

~/.openclaw;可用 OPENCLAW_STATE_DIR 覆盖

共享状态库

~/.openclaw/state/openclaw.sqlite

per-agent 状态/认证/Memory 索引

~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite

Session 元数据

~/.openclaw/agents/<agentId>/sessions/sessions.json

Transcript

同目录 <sessionId>.jsonl,追加式、带消息树 ID

Workspace/长期 Memory

Workspace 内 Markdown/普通文件

Plugin/Skill 文件

安装目录、managed roots、Workspace roots

旧认证文件

auth-profiles.json、auth-state.json、auth.json 仅迁移导入;credentials/oauth.json 为 legacy import

共享 SQLite 已承载 Cron 定义/运行记录、ingress dedupe、delivery queue、task/flow、pairing、plugin index、audit/state lease 等多类状态;per-agent SQLite 承载认证秘密与运行状态、Memory 索引等。稳定版源码的 per-agent Schema 没有 Session/Transcript 主表

这里存在两个容易误写的文档差异:

  1. docs/refactor/database-first.md 描述数据库优先重构,不代表稳定版已把 Session 全迁入 SQLite;
  2. docs/concepts/multi-agent.md 某段仍写 auth-profiles.json,而同版本 model-failover 文档与实际 src/agents/auth-profiles/sqlite.ts 已明确认证存入 openclaw-agent.sqlite。应以源码与后者为准。

企业备份必须同时覆盖 SQLite 的 -wal/-shm 一致性、Session JSON/JSONL、Workspace/Memory 和配置;只备份一个数据库文件会丢会话正文。

源码:

  1. https://github.com/openclaw/openclaw/blob/v2026.7.1/src/agents/auth-profiles/sqlite.ts
  2. https://github.com/openclaw/openclaw/tree/v2026.7.1/src/agents/sessions
  3. https://github.com/openclaw/openclaw/tree/v2026.7.1/src/state
  4. https://docs.openclaw.ai/concepts/model-failover

10.6 配置语义

配置默认 ~/.openclaw/openclaw.json,可 OPENCLAW_CONFIG_PATH 覆盖;有效 Home 可通过 OPENCLAW_HOME 影响。配置支持 JSON5,但 Schema 严格,未知字段/类型错误会使 Gateway 拒绝启动;非法配置的守护进程退出码为 78,以避免无意义重启风暴。

BASH

openclaw config file

openclaw config schema

openclaw config validate

openclaw config get agents.defaults.model

openclaw config set session.dmScope per-channel-peer

openclaw config unset <path>

openclaw doctor --fix

配置写入采用原子替换;官方不鼓励把主配置做成符号链接。SecretRef 应用于文档支持的凭据表面;不是每个字符串字段都接受 SecretRef。

来源:https://docs.openclaw.ai/cli/config

10.7 上下文预算:先算再调

Context Window(上下文窗口)不是全部留给历史。一次调用的可用预算 W 应满足:

TEXT

W = S + B + K + H + T + M + O + R

其中 S 为系统提示词,B 为 Workspace/Bootstrap,K 为 Skills 描述与 Tool Schema,H 为对话历史,T 为工具结果,M 为 Memory 检索,O 为最终回答,R 为安全余量。建议先按比例设上限,再用真实模型 tokenizer 校验;下表是起始方法,不是 OpenClaw 默认值。

分区

起始预算

控制方法

系统提示词 S

8%~12%

删除重复策略;稳定规则放系统层,业务细节放按需 Skill

Workspace B

5%~10%

单文件/总字符上限;只注入当前 Agent 必需文件

Skill/Tool K

10%~20%

Agent allowlist、Tool Filter、短 description、动态暴露

历史 H

25%~35%

Session 隔离、Compaction、业务状态外置

工具结果 T

10%~20%

服务端分页/字段投影/摘要/对象存储引用

Memory M

5%~10%

top-k、minScore、ACL、去重与 MMR

输出 O

8%~15%

按任务设置 max output,长文分阶段生成

安全余量 R

10%~15%

为工具多轮、模型格式差异和估算误差保留

例如 128k 模型不要把 120k 都当作可用历史;若工具描述 20k、Bootstrap 15k、检索 8k、最终回答 12k、安全余量 15k,则历史与工具结果合计只有约 58k。小模型只有 16k/32k 时,应为特定 Agent 暴露极少工具,并把复杂数据处理移到确定性服务。

10.8 十类常见症状与调优

  1. 越聊越慢: 用 /context detail 找增长项;按 Session 类型设置重置;压缩历史;把大对象改为引用;检查模型端排队与 Prompt Cache 命中,不能只删 Memory。
  2. Token 持续增大: 用 /usage tokens、OTel 的 input/output token 和 Tool result bytes 分桶;减少常驻 Skills/Tool Schema;限制附件 OCR 文本;开启有评测的 pruning。
  3. 忘记早期信息: 判断事实是否应进业务数据库、长期 Memory 或 Compaction 摘要;关键约束进入版本化 Workspace;Memory 写入带来源/所有者/时间,不盲目增加窗口。
  4. Compaction 过频: 检查模型 context window 是否识别正确、大 Tool Result、Bootstrap 合计和输出预留;增大窗口前先缩减 Tool;调整 keepRecentTokens 后跑多轮回归。
  5. Tool 输出占满窗口: Tool 端支持 fieldslimit、游标、时间范围和服务器摘要;最大字节硬截断时保留头尾、错误码和对象 URI;原始文件放受控存储。
  6. Skills 太多: 使用 agents.defaults.skills/agents.list[].skills 精确允许;短化 description;按领域拆 Agent;不要把百科全文放 frontmatter。
  7. 小模型容不下工具: 专用 Agent 只给 3~8 个窄 Tool;用 Tool Router/Tool Search;把复杂 schema 包装成业务级 Tool;失败时升级模型而非向小模型塞更多规则。
  8. 长期记忆召回错误: 查文档版本、chunk、embedding provider、关键词/向量权重、minScore、top-k、MMR 和时间衰减;建立 Precision/Recall 集;过期事实加 TTL 或 tombstone。
  9. 用户/群聊串扰: 立即停止受影响入口;检查 dmScope、Channel account、不可变 peer ID、群/线程键、Agent binding、Memory ACL;必要时拆 Gateway 和索引。不要只清聊天窗口。
  10. 未经验证信息写入 Memory: 把 Memory Flush 改为生成候选,服务端验证来源、数据等级、所有者、置信度和 TTL 后再写;外部网页/群聊内容默认不进入个人 Memory;支持用户查看、纠正和删除。

10.9 诊断命令与验证闭环

BASH

openclaw status

openclaw config validate

openclaw memory status

openclaw memory status --deep --agent main

openclaw memory index --force

openclaw sessions list

openclaw doctor

聊天内可用 /status/context list/context detail/context map/usage tokens 与 /compact;实际是否启用取决于命令策略和 Channel。诊断顺序:复制受影响 Session 到无副作用测试环境;记录总 Context 与每分区 Token;识别最大增长源;固定模型与问题,改一个变量;运行短/中/长多轮、Tool 大结果、Memory 正误召回、两用户隔离和 Prompt Injection 测试;比较 Task Success、Memory Precision/Recall、P95、Token/Cost;灰度 5% Session;不达门槛回滚。

验证 Compaction 不只看“模型还能回答”,还要检查:关键事实是否保留、错误事实是否被固化、Tool 调用 ID/结果关系是否可续、审批状态是否丢失、摘要是否泄露别的用户。验证 pruning 要确认磁盘 Transcript 未被修改、故障诊断所需错误码仍可用。重建 Memory 索引前保存 Markdown 事实源和索引版本;索引可重建不代表事实文件可丢。