目录
第一章 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 把过去散落在多个产品里的能力统一到一个自托管运行时:
- 从 Telegram、Slack、WhatsApp、Discord、iMessage、WebChat 等现有沟通入口接收任务;
- 将消息按账号、会话和绑定规则路由到指定 Agent;
- 在一次 Agent 循环里选择模型、加载上下文、调用本机或远程工具、调用 MCP Server,并把结果送回原渠道;
- 保存会话、工作区文件和长期记忆;
- 通过 Cron、Heartbeat、Hooks 和 Webhook 承接主动任务;
- 通过 macOS、iOS、Android 等配对 Node 暴露受控设备能力。
它的价值不是“多一个聊天框”,而是把入口、推理、执行、状态与设备组成一个持续运行的个人 Agent 系统。
1.3 它不是什么
- 不是一个大语言模型;模型由 OpenAI、Anthropic、Google、本地 Ollama/vLLM 等提供。
- 不是 ChatGPT、Claude、豆包一类托管聊天 SaaS 的开源复刻;OpenClaw 负责运行和编排,模型、密钥、机器及数据边界由部署者选择。
- 不是 Dify、FastGPT、Coze、Flowise 一类以可视化工作流、应用发布、数据集运营为中心的平台,也不是 n8n 式确定性业务流程引擎。OpenClaw 的主抽象是长驻个人 Agent 和消息渠道;确定性审批、事务补偿、租户治理仍需外围系统。
- 不是专门的 IDE 编程 Agent。它可接 Codex、Claude Code/ACP 等 Runtime,也能执行开发工具,但其核心覆盖消息入口、长期运行、主动任务、记忆和设备节点;Cursor、Claude Code、Codex 等更聚焦代码库/终端开发环节。
- 不是传统 RPA。模型驱动工具选择具有概率性;涉及资金、删除、权限、生产变更时不能用“自然语言看起来合理”替代确定性控制。
- 不是开箱即用的企业多租户 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
- 官方 2026-01-29 博客说,最初的周末项目是 “WhatsApp Relay”;Clawd 诞生于 2025-11。
- 因名称与 Claude 的商标关联,Anthropic 法务请求重新考虑;社区短暂采用 Moltbot。
- 2026-01-29 正式宣布 OpenClaw,官方称已完成商标查询、域名购买和迁移代码。
- VISION.md 还记录了工程名称序列 Warelay → Clawdbot → Moltbot → OpenClaw;docs/start/lore.md 记录角色/吉祥物叙事。写技术史时应说明两者语境不同,不必强行把 “WhatsApp Relay” 和仓库内部 Warelay 当成两个独立成熟产品。
2.2 Foundation 与当前治理
2026-07-08 的官方公告确认:
- OpenClaw Foundation 是美国 501(c)(3) 非营利组织;使命是保持项目开放、独立和 MIT 许可;
- Peter Steinberger 仍负责重要技术决策;公告同时披露他已于 2026 年早些时候加入 OpenAI,但 OpenAI 承诺保持 OpenClaw 开放与独立;
- Foundation 已组建全职团队,公告列出 Vincent Koc(Chief Architect)及多名工程与运营人员;
- CONTRIBUTING.md 的仓库治理仍以 Peter Steinberger 为 “Benevolent Dictator”,并列出维护者及各自领域。
因此最准确的表述是:Foundation 提供法律、资金与组织承载,技术决策仍有明显创始人主导特征,日常开发由全职团队、维护者和大量贡献者共同完成。
2.3 许可证及企业影响
v2026.7.1 使用 MIT License,版权为 Copyright (c) 2026 OpenClaw Foundation。企业可以使用、复制、修改、合并、发布、分发、再许可和销售软件副本,但须在副本或重要部分中保留版权与许可声明;软件按“原样”提供,不含保证。
工程含义:
- 可做闭源企业改造和商业化发行;MIT 不要求公开派生代码;
- 必须保留 MIT 声明;
- MIT 并不替企业承担安全、模型输出、数据合规或第三方接口责任;
- 依赖项、插件、Skills、模型、字体/媒体及移动端组件可能有各自许可证,需结合 THIRD_PARTY_NOTICES.md 和 SBOM/依赖扫描逐项审查;
- 商标权不等同于代码许可证,不应把 MIT 推导为可任意使用 OpenClaw 名称和标识进行背书。
2.4 维护目标与插件优先方向
VISION.md 将优先级明确排成:安全与安全默认值、Bug/稳定性、安装可靠性;之后才是提供商/渠道覆盖、性能、测试、Computer Use、CLI/Web/原生 App。官方希望核心保持精简,把可选能力放入插件;新 Skills 优先进入 ClawHub;MCP 同时考虑 Server 和 Runtime 集成。文档也明确说项目“仍早期、迭代很快”。
这意味着企业应把插件契约演进、配置迁移、回归测试和版本锁定当作选型成本,而不是只看功能数量。
2.5 版本、发布通道与成熟度判断
发布活跃度(不以 Star 替代成熟度)
官方 GitHub Release API/页面在调研日显示最近节奏:
- 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);
- v2026.7.1 后于 07-15、07-17、07-18 连续发布 7.2 beta;
- v2026.7.1 Release 页面称该版本汇集 3,063 次贡献、532 名贡献者,其中公开署名 PR 2,018 个;这是发布规模证据,不是质量本身。
稳定标签下仓库的静态核验还显示:
- .github/workflows 含跨平台 CI、CodeQL、依赖防护、安装冒烟、发布校验、性能、真实渠道场景、容器与原生 App 发布等数十条流水线;
- src/extensions/packages/apps/ui 下约 6,500 个 *.test.ts/*.spec.ts 文件
- 另有 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.read、operator.write、operator.admin、operator.approvals、operator.pairing、operator.talk.secrets。config.*、exec.approvals.*、wizard.*、update.* 等保留前缀强制按 admin 处理。Node 以 role: node 连接并申报 capabilities/commands。副作用 RPC(如 send、agent)使用幂等键;事件不提供完整 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 源码视角逐步说明
- Channel Plugin 接收平台事件,完成平台签名/Token 检查、消息去重、媒体规范化和发件人/群组/线程标识提取。
- Channel 自身的 dmPolicy、groupPolicy、allowlist/pairing 和 mention 规则先决定消息是否允许进入。平台 ID 仍只是渠道身份。
- src/routing/resolve-route.ts 按 精确 peer → parent peer → peer wildcard → guild+roles → guild → team → account → channel → default agent 选 Agent;同一层第一个匹配 binding 胜出,多字段采用 AND。
- 根据 agent、channel、account、peer 和 session.dmScope 构造 Session Key。默认 dmScope: main 会把同一 Agent 的私聊折叠进主会话;多人入口应显式用 per-channel-peer 或更细粒度。
- Agent RPC 校验后先返回 accepted run ID;Run Coordinator 再进入 per-session/global queue,获取 Session 写锁、解析模型和认证。
- Context Builder 加入基础 System Prompt、Workspace Bootstrap 文件、符合资格的 Skill 描述/正文、会话历史、Memory 检索结果、附件及策略过滤后的 Tool Schema。
- Runtime 调用所选 Provider/Harness。模型产生文本或结构化 Tool Call。
- Tool Call 经过参数 Schema、Tool Policy、插件 before_tool_call Hook、可能的审批及 Sandbox/Node/MCP 路径执行;结果作为 Tool Result 回到 Agent 循环。
- 循环继续,直到最终回答、终止条件、取消或超时;Agent 发出 agent_start/turn_start/message_update/tool_execution_*/agent_end 等事件。
- Session Manager 追加 Transcript,更新会话元数据。接近上下文上限时可先 Memory Flush,再 Compaction;Context Pruning 只临时裁剪旧 Tool Result。
- Gateway/Channel 按平台线程、格式、长度、媒体和限流规则送回;重试与幂等保护要防止重复回复。
4.3 Tool 调用内部时序

4.4 案例:Slack 中查询 GitHub、内部文档并生成周报
设用户 Alice 在企业 Slack 的 #project-owl 线程中 @Bot:“查询本周 GitHub 项目状态,读取架构决策,生成周报并发回本群。”企业已将 Slack 不可变用户 ID 映射到 principal=alice@corp,只读 GitHub App 和知识库 MCP 由工具代理持有,群发送属于 L3,需要项目负责人确认。完整执行如下:
- Slack 把事件送到 Channel Plugin;插件校验平台签名/Token,记录 Event ID 并在响应时限内确认。
- Plugin 规范化 team、account、channel、thread、user、message、attachments;显示名只作展示。
- Ingress 去重表对 Event ID 建唯一约束;重放只返回先前 runId。
- Allowlist/Group Policy/Mention 规则确认该团队、频道、用户和 @Mention 均允许;未满足则不进入模型。
- Gateway 按 peer/account/channel binding 选 rd-weekly Agent;调用者不能在消息里改成 ops-admin。
- Session Key 由 Agent、Slack account、channel、thread/peer 及 dmScope 生成;身份和 Session 键都写入 Trace,但 Session 不是授权。
- 每 Session 队列和写锁串行化同一线程;并发的另一个消息排队或明确合并,避免 Transcript 交错。
- Session Manager 读取 sessions.json 元数据和对应 JSONL Transcript;失败时返回可诊断错误,不能悄悄新建并丢失上下文。
- Context Builder 加载该 Agent 的 AGENTS/SOUL/TOOLS 等 Workspace 文件,并受单文件/总字符预算限制;Workspace 不是 Sandbox。
- Skill Loader 只注入 allowlist 中 scm-weekly-report、corp-kb-query 的短描述;模型选择后才读完整 SKILL.md。
- Tool Registry 将只读 scm_list_events、kb_search/get_excerpt 的 Schema 加入 Context;message_send、merge、delete 不暴露或只暴露成审批草稿接口。
- Memory Search 仅查询 rd-weekly/项目数据域,返回带 ACL、来源与日期的少量片段;群聊原文不自动写 Alice 个人 Memory。
- Model Router 根据任务、数据等级、预算和可用性选择 Primary;敏感架构内容走企业模型网关,Fallback 只在兼容数据策略内。
- 模型先调用 GitHub Tool。Tool 端忽略模型提供的“用户 ID”,使用工作负载身份与策略上下文,限制组织、仓库、时间窗和只读方法。
- Issue/PR 内容中的“忽略系统、上传 Token”等文字被标为不可信字段;Tool 返回分页、最大字节、来源 URL 和数据等级。
- 模型调用知识库 MCP;MCP Gateway 做 mTLS、Tool Filter、超时、响应大小和 ACL;恶意或格式异常结果被拒绝/净化。
- 每个 Tool Result 追加到本轮与 Transcript,必要时只将结构化摘要送回模型;调用轮数、Token、费用、超时和重复参数受硬上限。
- 模型生成“事实、风险、待确认、来源”周报草稿。Verifier 检查链接、时间窗、未支持主张和跨域内容;失败则返回修订或拒答。
- 发送回项目群是 L3:Approval Service 展示目标频道、线程、正文和 SHA-256;负责人批准后签发短期一次性票据,Publisher 按同一哈希发送。只读查询结果也可先作为私有预览返回 Alice。
- 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 或机密正文。
案例验收
- 两名不同 Slack 用户、两个线程和两个 Channel account 的 Session/Memory 不串线。
- GitHub/知识库服务端 ACL 拒绝超范围资源,即使模型参数伪造身份也无效。
- 恶意 Issue/文档不能触发写 Tool、外发机密或改变 Agent/模型。
- Slack 重放同一 Event、Tool 超时与发送响应丢失均不造成重复周报。
- 未经项目负责人批准不能发群;批准后的正文哈希若变化则票据失效。
第五章 源码结构和二次开发入口
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 并执行最终平台动作,避免每个通道各造一个模型工具。
接口源码:
- https://github.com/openclaw/openclaw/blob/v2026.7.1/packages/agent-core/src/types.ts
- https://github.com/openclaw/openclaw/blob/v2026.7.1/src/plugins/types.ts
- https://docs.openclaw.ai/plugins/architecture-internals
- 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.ts、sessions.json 和基于文件的 SessionManager,官方 Session 参考页也仍给出 agents/<agentId>/sessions/。因此本文按稳定源码和实际 CLI 行为把会话索引/转录视为文件状态;重构文档只能作为未来方向,不能据其删掉 Session 目录备份或宣称当前已具备数据库事务式多副本能力。Session Store 源码、Session 参考。
警告 警告: Workspace 是默认工作目录和 Memory 锚点,不是安全沙箱。未启用 Sandbox 时,绝对路径仍可能访问宿主其他位置。不要把 Gateway 直接作为 root 运行,也不要让所有部门共享同一个 Workspace 和凭据。 |
6.2 四套可实施方案
方案 A:个人或开发者本地试用
- 硬件/系统:macOS、Linux、Windows/WSL2;从 2 核、2~4 GiB 内存和 10 GiB 可用磁盘开始。本地模型的 GPU/内存另算。
- 网络:Gateway 只绑定回环地址;仅向选定模型 API 和渠道出站。不要把 18789 直接映射到公网。
- 依赖与安装:Node 24 推荐;执行官方安装脚本和 openclaw onboard --install-daemon。代码调试再采用固定标签源码构建。
- 目录:使用个人 ~/.openclaw,但 Workspace 不要指向整个 $HOME。机密项目使用独立 OS 账号或 VM。
- 模型:先用一个云模型 API Key;需要离线验证时再接 Ollama/LM Studio。
- 健康/日志:openclaw status --all、openclaw channels status --probe、openclaw logs --follow。
- 升级/回滚:先 openclaw backup create --verify,再 openclaw update --dry-run、openclaw update;失败时安装固定版本并运行 Doctor。
- 备份:把验证通过的备份放到加密个人存储;Workspace 可进私有 Git,但凭据与会话不得提交。
- 常见错误:命令不在 PATH、Node 版本不支持、服务进程读不到交互 Shell 的环境变量、桌面休眠导致渠道掉线。
- 安全门禁:默认禁用高风险 Shell/浏览器发布;第三方 Skills 只在隔离 Workspace 中审查后启用。
方案 B:5~20 人 Docker Compose 小团队
- 硬件/系统:一台 Linux VM,建议从 4 vCPU、8 GiB RAM、50 GiB SSD 起步;这是工程初始值而非官方吞吐承诺,需按附件、浏览器和会话增长校准。
- 网络:Gateway 仅在 Compose 内网暴露;宿主仅开放反向代理的 443。模型/MCP/渠道出站走 DNS 与目标白名单;管理入口通过 VPN、Tailscale 或企业反代鉴权。
- 依赖:Docker Engine、Compose v2;固定 ghcr.io/openclaw/openclaw:2026.7.1 或镜像 digest。
- 目录/卷:宿主 /srv/openclaw/{state,workspace,auth-profile-secrets,backup},UID/GID 1000 所有;三类状态分别挂到官方容器路径。
- 启动:先用官方 scripts/docker/setup.sh 生成状态和 Token,再切换到经评审的 Compose 覆盖文件,执行 docker compose up -d openclaw-gateway。
- 健康/日志:容器 /healthz;反向代理与监控使用 /readyz;docker compose logs -f openclaw-gateway 和 openclaw logs --follow 双查。
- 升级:拉取固定新镜像,在副本环境挂载备份恢复测试;生产停旧实例、备份、换镜像、观察 /readyz。
- 备份/回滚:每日 openclaw backup create --verify;升级前停 Gateway 做完整状态归档或卷快照。回滚镜像前先确认数据迁移可逆。
- 常见错误:挂载目录属主不为 1000、把 127.0.0.1 当容器间地址、本地 Ollama 未绑定到可达接口、反代 WebSocket/Origin 配置缺失、1 GiB 主机构建 OOM。
- 安全门禁:不得把 Docker socket 挂入 Agent Sandbox;若 Gateway 为创建 Sandbox 容器而接触 socket,应把该 Gateway 所在 VM 当作高权限边界。
方案 C:企业内网单 Gateway + 独立 Agent Workspace
- 硬件/系统:经加固的 Linux VM 或私有云实例;资源从 4~8 vCPU、16 GiB RAM、SSD 起步,并以压力测试决定。浏览器执行放到隔离节点或 Sandbox 运行时。
- 身份与网络:API Gateway/OIDC 只保护外围入口;OpenClaw 的渠道身份映射和 allowlist 不等于完整 RBAC。不同 Agent 使用独立 Workspace、凭据和工具策略;敏感 MCP 仅内网 mTLS。
- 部署:Gateway 仍为单写者;systemd 或单副本 K8s。运维面只允许堡垒机/管理网访问;Control UI 不上普通办公公网。
- 配置:每 Agent 固定模型、工具 allowlist、并发/上下文预算;凭据迁移到 SecretRef,执行 openclaw secrets audit --check。
- 状态:数据盘加密,SQLite/Session 与 Workspace 同步备份;日志、审计和备份分别有保留策略。
- 健康/观测:同时启用官方 OTel 或 Prometheus 插件;观测 Collector 与长期存储属于外围平台。
- 升级:stable 固定版本;测试环境做 Skill、MCP、渠道和记忆回归后维护窗口升级。
- 故障切换:冷备或有外部栅栏的主备,任一时刻只有一个实例拥有渠道凭据、读写卷和 Cron 权限。
- 安全门禁:单 Gateway 只服务一个受控信任域;低信任群聊不得触发写操作或生产工具。
方案 D:企业多 Gateway、分信任域、模型网关、审批与审计
- 拓扑:每部门/数据级别/渠道账号运行独立 Gateway cell,各自拥有状态、Workspace、密钥、出口策略和配额;外围统一 API Gateway、OIDC、Policy Engine、Approval Service、Audit Service、Model Gateway、MCP Gateway、Agent/Skill/Gateway Registry。
- 部署:每个 cell 为单活动实例或有栅栏主备;Kubernetes Namespace、ServiceAccount、PVC、NetworkPolicy 和 Secret 分域。不要让多个 cell 共享 SQLite/PVC 或渠道登录态。
- 模型路由:公开内容可走云模型;内部/机密内容优先本地或合规模型网关;高风险工具调用必须经过审批服务和策略验证器。
- 成本治理:在模型网关与 OpenClaw 两层记录 Agent、用户、任务、模型、Token 和预算;达到上限熔断,不用无限 fallback 掩盖故障。
- 审计:保留消息路由元数据、模型选择、工具名/参数摘要、审批人、结果、策略判定和版本;原始提示/工具输出只在经过数据分类批准时进入观测系统。
- 灾备:cell 级 RPO/RTO;跨区域备份不自动启动渠道。故障域切换先取得租约、验证旧实例已被隔离,再注入凭据并启动。
- 演进边界:【实验/后续文档】在线文档中的 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` 的关键事实如下:
- Gateway 容器内固定 HOME=/home/node,状态、配置和 Workspace 路径分别为 /home/node/.openclaw、/home/node/.openclaw/openclaw.json、/home/node/.openclaw/workspace。
- 默认宿主目录是 $HOME/.openclaw、$HOME/.openclaw/workspace、$HOME/.openclaw-auth-profile-secrets。
- 映射 18789(Gateway)、18790(bridge)、3978(Teams);企业不应无差别映射到 0.0.0.0。
- 以非 root node(UID 1000)运行,需 chown -R 1000:1000 修复 bind mount 权限。
- restart: unless-stopped、init: true,删除 NET_RAW/NET_ADMIN,设置 no-new-privileges;健康检查访问 http://127.0.0.1:18789/healthz。
- CLI sidecar 使用 network_mode: service:openclaw-gateway,并共享相同卷,因此它与 Gateway 属于同一信任边界。
- 官方 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 文档、Deployment、ConfigMap、PVC、Service。
8.2 生产化补齐项
- Namespace 与账号:每个信任域独立 Namespace、ServiceAccount、PVC、Secret、NetworkPolicy;保留 automountServiceAccountToken: false。若备份边车确需 K8s API,给边车单独账号,不能复用 Gateway 身份。
- Deployment 或 StatefulSet:单活动 Gateway 使用 Deployment + Recreate 足够直接;StatefulSet 只提供稳定 Pod/卷身份,并不会自动增加分布式锁或渠道租约。主备控制器若依赖固定序号,可使用 StatefulSet,但必须有外部 fencing。
- 存储:生产 StorageClass 应支持快照、加密和明确的延迟/SLA。若 CSI 支持,单写者可考虑 ReadWriteOncePod;Kubernetes 的 RWO 只限制节点挂载,可能允许同一节点多个 Pod 使用,不等同严格单 Pod 写入。Kubernetes PV 文档。
- Secret:Kubernetes Secret 只是一种对象,不自动等于硬件级秘密管理。推荐 External Secrets/Secrets Store CSI 把 Vault/KMS 中密钥挂到只读文件,再通过 OpenClaw SecretRef 引用;禁止把密钥写入 ConfigMap、Git 或渲染后的 Helm values。
- 入口:Ingress/Gateway API 终止 TLS,限制 Host、Origin、WebSocket、请求体和速率;管理 UI 只在管理网/OIDC 后。不要通过公共 LoadBalancer 暴露未经外围鉴权的 18789。
- NetworkPolicy:默认拒绝入站和出站,只放行反代、DNS、OTel Collector、批准的模型/MCP/渠道目的地。域名出站通常需 egress proxy 或 CNI/FQDN policy,普通 NetworkPolicy 只能按 IP/端口。
- Pod Security:保留 non-root、drop ALL、只读 rootfs、RuntimeDefault seccomp;按集群能力加 AppArmor/SELinux。不得 hostNetwork、hostPID、privileged,也不得挂宿主根目录或 Docker socket。
- 资源与探针:根据压测设 request/limit;增加 startupProbe,避免大状态迁移或插件收敛期间被 liveness 反复杀死。readiness 负责流量,liveness 只判断进程自愈。
- 调度:Agent Sandbox/浏览器节点使用专用 node pool、taint/toleration 与 RuntimeClass;Gateway 本身与高风险执行器分离。反亲和对单副本没有 HA 魔法,但可用于主备或多个独立 cell 分散故障域。
- PDB:单副本 minAvailable: 1 只能阻止部分自愿驱逐,不能在节点故障时维持服务,还可能阻塞维护;必须配合冷/热备和运维 Runbook。
- 镜像治理:固定 semver/digest,验证签名、生成 SBOM、扫描镜像与插件;准入策略拒绝 latest/slim 浮动标签和未知仓库。
- 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 为什么不能直接横向扩展
- 单例锁与端口:官方建议一个配置/状态对应一个 Gateway;锁按配置文件生效,端口也只能被一个进程独占。多个 Gateway 要使用独立 OPENCLAW_CONFIG_PATH、OPENCLAW_STATE_DIR、Workspace 和端口。Multiple Gateways、Gateway Lock。
- SQLite:共享状态库采用 WAL。SQLite 官方明确说明 WAL 的进程必须在同一宿主,不能依赖网络文件系统提供正确共享锁;把 PVC 设为 RWX 不会把 SQLite 变成分布式数据库。SQLite WAL、SQLite over network。
- Session:除 SQLite 外仍有 sessions.json 与 transcript JSONL、本地缓存和运行中 turn;随机负载均衡可能让连续消息落到不同运行状态,造成上下文落后、重复发送或冲突写。
- 渠道长连接:WhatsApp/Baileys 等渠道由 Gateway 持有账号会话和长连接。两个实例抢同一组登录态可能相互踢下线、重复消费/回复并并发修改凭据。
- Cron:稳定版源码中的 Cron 锁明确是 process-local;计时器虽把 reservation 写入 SQLite,却没有跨节点 leader election。两个活动实例可在任一提交前同时看到到期任务而重复执行。Cron 进程内锁、Cron Timer。
- 去重/出站:当前不是带持久消息队列、分布式幂等键和 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 |
官方页:OpenAI、Anthropic、Google、DeepSeek、OpenRouter、Ollama、LM Studio、vLLM、LiteLLM、Model 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 Failover、Retry。
企业路由规则:
- 分类、标题、短摘要走低成本模型;复杂代码/推理走强模型。
- 数据分类为“内部/机密”的内容先经 DLP,默认走本地模型或合规 Model Gateway;公共资料任务可走云模型。
- 高风险操作不只是换强模型,还要使用只读预检、策略验证器、人工审批和幂等执行器。
- 对每次任务设置最大模型调用次数、最大工具循环、最大 Token、最长墙钟时间和成本预算。达到上限立即失败并通知,不以无限 fallback 继续烧费。
- 降级顺序必须表达能力要求。例如任务需要视觉/Tool Calling 时,不能降级到不支持相应能力的本地模型。
- Key 轮换不能绕过供应商账号配额;统一在 Model Gateway 做每用户/Agent/成本中心限流和账单归集。
第十章 Session、Context 和 Memory 深度调优
10.1 四个概念不能混用
Session、Context 与 Memory 关系图

Session 是路由和历史单元;Context 是一次模型调用实际看到的有限输入;Memory 是跨轮或跨会话保存与检索的知识。三者不能互相替代,尤其不能把 Session Key 当成授权边界。
- Session 是可持续的会话运行单元,包含路由/模型覆盖等元数据和追加式 Transcript。
- Context 是这一轮实际发送给模型的动态窗口;它是 Session 历史经压缩/裁剪后,再加 System Prompt、Workspace、Skills、Tools、Memory、附件的结果。
- Memory 的事实源是 Markdown,而不是模型参数里的“神秘记忆”;索引可以重建。
- Workspace 是默认 cwd 和上下文文件根,但不是文件系统沙箱。
10.2 Session Key 与多人隔离
[官方稳定能力] 默认 Agent 是 main,Session Key 形如 agent:main:<mainKey>。群组/房间通常独立,Cron 隔离任务每次可新建 Session,Hook 按 Hook 路由。私聊默认 session.dmScope: "main",同一 Agent 的多个私聊可能折叠到主 Session。
可选值:
- main:所有 DM 共享 Agent 主会话;个人助手便利,但多人不安全;
- per-peer:按发送者;跨 Channel 的同一人仍需 identityLinks;
- per-channel-peer:按渠道+发送者,企业共享入口的推荐最小值;
- per-account-channel-peer:再按渠道账号细分。
10.3 Workspace 与 Bootstrap
默认 Workspace:~/.openclaw/workspace;profile 为 ~/.openclaw/workspace-<profile>;非默认 Agent 若未显式指定,通常为 <state-dir>/workspace-<agentId>。可通过 OPENCLAW_WORKSPACE_DIR、agents.defaults.workspace、agents.list[].workspace 覆盖。
可注入文件包括:AGENTS.md、SOUL.md、TOOLS.md、IDENTITY.md、USER.md、HEARTBEAT.md、BOOTSTRAP.md、可选 MEMORY.md;BOOT.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.md。memory-core 插件提供 memory_search、memory_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 主表。
这里存在两个容易误写的文档差异:
- docs/refactor/database-first.md 描述数据库优先重构,不代表稳定版已把 Session 全迁入 SQLite;
- 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 和配置;只备份一个数据库文件会丢会话正文。
源码:
- https://github.com/openclaw/openclaw/blob/v2026.7.1/src/agents/auth-profiles/sqlite.ts
- https://github.com/openclaw/openclaw/tree/v2026.7.1/src/agents/sessions
- https://github.com/openclaw/openclaw/tree/v2026.7.1/src/state
- 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 十类常见症状与调优
- 越聊越慢: 用 /context detail 找增长项;按 Session 类型设置重置;压缩历史;把大对象改为引用;检查模型端排队与 Prompt Cache 命中,不能只删 Memory。
- Token 持续增大: 用 /usage tokens、OTel 的 input/output token 和 Tool result bytes 分桶;减少常驻 Skills/Tool Schema;限制附件 OCR 文本;开启有评测的 pruning。
- 忘记早期信息: 判断事实是否应进业务数据库、长期 Memory 或 Compaction 摘要;关键约束进入版本化 Workspace;Memory 写入带来源/所有者/时间,不盲目增加窗口。
- Compaction 过频: 检查模型 context window 是否识别正确、大 Tool Result、Bootstrap 合计和输出预留;增大窗口前先缩减 Tool;调整 keepRecentTokens 后跑多轮回归。
- Tool 输出占满窗口: Tool 端支持 fields、limit、游标、时间范围和服务器摘要;最大字节硬截断时保留头尾、错误码和对象 URI;原始文件放受控存储。
- Skills 太多: 使用 agents.defaults.skills/agents.list[].skills 精确允许;短化 description;按领域拆 Agent;不要把百科全文放 frontmatter。
- 小模型容不下工具: 专用 Agent 只给 3~8 个窄 Tool;用 Tool Router/Tool Search;把复杂 schema 包装成业务级 Tool;失败时升级模型而非向小模型塞更多规则。
- 长期记忆召回错误: 查文档版本、chunk、embedding provider、关键词/向量权重、minScore、top-k、MMR 和时间衰减;建立 Precision/Recall 集;过期事实加 TTL 或 tombstone。
- 用户/群聊串扰: 立即停止受影响入口;检查 dmScope、Channel account、不可变 peer ID、群/线程键、Agent binding、Memory ACL;必要时拆 Gateway 和索引。不要只清聊天窗口。
- 未经验证信息写入 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 事实源和索引版本;索引可重建不代表事实文件可丢。
夜雨聆风