OpenClaw 设计与实现

附录 C:对比表速查

作者 杨艺韬 · 4,242 字 · 发布于 · 更新于

本附录汇总本专栏各章散落的对比表,方便横向查阅。每个表格均标注来源章节。

关于横向对比的一点说明

原先本附录里有大量"OpenClaw vs LangChain vs AutoGPT vs CrewAI vs Semantic Kernel vs Dify"式的逐项打勾表。这类表格有两个无法回避的问题:其一,这些项目迭代极快,任何一格"❌"都可能在几周内失效;其二,本专栏能逐行核对源码的只有 OpenClaw 一家,其余各家的能力边界只能靠印象填写——而靠印象填出来的表格,看起来越整齐,误导性越强。

因此本附录做了取舍:

  • 保留并核实所有 OpenClaw 内部的对比(不同机制之间的取舍、不同接口的信任级别、不同部署形态的差异)——这些都能对着 v2026.3.31(commit 213a704)的源码逐条核。
  • 保留架构范式层面的定性对比(框架模式 vs 网关模式、模块化单体 vs 微服务、管线 vs 观察者)——这些讨论的是设计取向,不依赖某个具体项目的当前实现。
  • 把"OpenClaw 有哪些能力"从对比表改写成能力清单,每一项附上源码出处,读者可以拿它去对照自己手边的任何方案。

C.1 架构范式对比

C.1.1 框架模式 vs 网关模式(来源:第 2 章)

这是本专栏最重要的一组对比——它解释了 OpenClaw 为什么长成现在这样。

维度 框架模式(你写代码调用库) 网关模式(OpenClaw)
进程生命周期 由你的应用管理 自管理的常驻守护进程
通道连接 你自己写适配器 插件化:9 个内置通道 ID + 扩展共 22 个
会话状态 通常在内存,进程退出即丢 持久化到 sessions.json,重启后恢复
安全策略 你自己实现 内置工具策略管线、exec 审批、安全审计
配置变更 重启应用 热重载(gateway.reload.mode 四档)
定时任务 外部 cron + 你的应用 内置调度器 + 心跳
你写的东西 应用代码 配置文件 + Markdown 技能

通道数口径:src/channels/ids.ts 的 CHAT_CHANNEL_ORDER 有 9 个内置 ID(telegram、whatsapp、discord、irc、googlechat、slack、signal、imessage、line);extensions/ 下声明了 channels 的插件共 22 个,即另有 13 个只以扩展形式提供(matrix、mattermost、msteams、feishu、nostr、qqbot、tlon、twitch、zalo 等)。

C.1.2 模块化单体 vs 微服务(来源:第 2 章)

维度 模块化单体(OpenClaw 的选择) 微服务
模块间调用 进程内函数调用 网络往返
部署复杂度 一个进程 N 个服务 + 服务发现 + 消息队列
状态共享 直接引用 需要序列化传输
适合团队规模 个人 ~ 小团队 大团队
水平扩展 受限(单运营者假设) 可独立扩展各服务

C.1.3 管线模式 vs 观察者模式(来源:第 17 章)

维度 管线 观察者
执行顺序 确定性的 不确定的
数据流向 线性、可追踪 扇出、难追踪
调试难度 低(从头到尾跟踪) 高("谁处理了这个事件?")
安全审计 容易(可记录管线每一步) 困难(观察者可能注册在任何地方)

OpenClaw 在安全关键路径(工具策略)上选管线,在生命周期通知上用事件——按第 17 章的分析,这一取舍看重的是确定性与可审计性,而不是风格偏好。

C.1.4 注入式插件 vs 注册式插件(来源:第 9 章)

维度 注入式 注册式(OpenClaw)
数据流 插件拉取宿主内部状态 插件注册到宿主提供的接口
耦合度 紧——依赖内部 API 松——只依赖注册 API 与 SDK 子路径
冲突处理 覆盖(后写入者胜出) 诊断(记录冲突,不崩溃)
升级兼容 脆弱——内部一变插件就坏 较稳——只要注册 API 不变,插件不受内部重构影响
安全边界 插件可访问一切 同样可访问一切:原生插件在网关进程内运行、没有沙箱,与宿主同 OS 权限(SECURITY.md「Plugin Trust Boundary」);防线是安装扫描、allow/deny 与信任

C.1.5 代码扩展 vs 文件技能(来源:第 16 章)

维度 代码形态的扩展(OpenClaw 插件,第 9 章) 文件技能(SKILL.md,第 16 章)
创建门槛 需要 TypeScript 编程能力 只需会写 Markdown
部署方式 安装并加载进进程 放文件 + 热重载
版本管理 包管理器 就是文件,git 跟踪即可
覆盖方式 fork + 改代码 同名文件按来源优先级覆盖
上下文成本 工具定义常驻上下文 目录常驻,正文按需 read
适用场景 需要运行时逻辑、有状态连接 操作知识、流程指导

C.2 OpenClaw 能力清单

以下几张表把"OpenClaw 有什么"讲清楚,每项都给出源码出处,可直接拿去对照任何其他方案。

C.2.1 Gateway(来源:第 3 章)

能力 实现 出处
单端口复用 WS + HTTP 共用 gateway.port(默认 18789) src/gateway/server-http.ts
绑定策略 auto / lan / loopback / tailnet / custom,默认 loopback src/config/types.gateway.ts
认证模式 none / token / password / trusted-proxy + 失败限速 src/gateway/auth.ts
热重载 off / restart / hot / hybrid,默认 hybrid,300ms 防抖 src/gateway/config-reload.ts
存活/就绪分离 /healthz、/health 恒 200;/readyz、/ready 反映真实就绪 src/gateway/server-http.ts
优雅重启 发信号前最多等 5 分钟排空在途工作 + 收到信号后 90 秒排空超时;重复请求合并,距上次重启不足 30 秒则顺延 src/infra/restart.ts、src/cli/gateway-cli/run-loop.ts
跨平台服务 systemd / launchd / schtasks 统一接口 src/daemon/service.ts
通道健康监控 5 分钟巡检、30 分钟静默阈值、每小时最多 10 次重启 src/gateway/channel-health-monitor.ts
配置变更审计 config.patch / config.apply 记录变更路径(diffConfigPaths)+ actor / device / ip src/gateway/server-methods/config.ts、src/gateway/control-plane-audit.ts
OpenAI 兼容端点 /v1/chat/completions、/v1/responses(均默认关闭,需显式开启) gateway.http.endpoints.*

C.2.2 会话与上下文(来源:第 5 章)

能力 实现 出处
结构化 Session Key 通道 + 对话 + 发送者派生 src/routing/session-key.ts
分组策略 scope(per-sender / global)、dmScope(4 档) src/config/types.base.ts
重置策略 daily(定点)/ idle(滑窗),可按会话类型分别覆盖 session.reset / session.resetByType
上下文封顶 agents.defaults.contextTokens,小于模型窗口时生效 src/agents/context-window-guard.ts
上下文压缩 超限时摘要历史 src/agents/compaction.ts
并发隔离 会话写锁,单会话内串行 src/agents/session-write-lock.ts
存储维护 30 天裁剪、500 条上限、10MB 轮转,可设磁盘预算;默认 mode: "warn" 只告警,设为 enforce 才真正执行 session.maintenance.*、src/config/sessions/store-maintenance.ts
父会话分叉保护 父会话超 100,000 token 则不继承其历史 session.parentForkMaxTokens

C.2.3 工具与安全(来源:第 10、13 章)

能力 实现 出处
工具基线档位 minimal / coding / messaging / full tools.profile
工具分组 group:runtime / fs / sessions / memory / web / ui / automation / messaging / nodes / agents / media / openclaw,另有 group:plugins(插件工具) src/agents/tool-catalog.ts、src/agents/tool-policy.ts
允许/拒绝 支持通配,deny 优先 tools.allow / tools.deny
Exec 安全档位 deny / allowlist / full;未配置时按主机分流(沙箱 deny,网关/节点 allowlist);host=sandbox 时命令直接在容器里执行,不走档位与审批 tools.exec.security
Exec 审批 off / on-miss / always,默认 on-miss tools.exec.ask
SafeBins 仅读 stdin 的流过滤器可免 allowlist,但每条须有参数 profile,无 profile 的条目被忽略并告警 tools.exec.safeBins
内联求值加固 python -c / node -e 每次显式审批,不被"始终允许"持久化 tools.exec.strictInlineEval
提权 exec 开关未设即启用,但发送者须列在 allowFrom(按通道)中,未列出即无人可提权 tools.elevated
SSRF 防护 IPv4/IPv6 分类拒绝 + DNS 重绑定防护 + 畸形字面量 fail closed src/infra/net/ssrf.ts
凭证引用 SecretRef 三种来源:env / file / exec src/config/types.secrets.ts
安全审计 多个审计模块合计上百个检查项(checkId),--fix 自动修复 src/security/audit*.ts
沙箱 Docker / SSH / OpenShell 三种后端,可只读根 + 丢弃全部 capability agents.defaults.sandbox

C.2.4 CLI 与 TUI(来源:第 14 章)

能力 实现 出处
双组件架构 CLI 管控制面,TUI 作为一等对话入口(不是通道插件,而是以 ui 模式连 Gateway 的 WebSocket 客户端) src/cli/、src/tui/
三模式输入 ! 本地 Shell(带一次性授权)/ / TUI 命令 / 纯文本发给 Agent src/tui/tui-submit.ts
根级选项预扫描 --dev / --no-color / --profile / --log-level / --container src/infra/cli-root-options.ts
诊断系统 25 个核心步骤(多数是检查,也有收尾步骤),note* 只报告、maybeRepair* 可修复 src/flows/doctor-health-contributions.ts
服务配置审计 入口、运行时、PATH、令牌、平台单元字段 src/daemon/service-audit.ts
OSC 8 超链接 支持则可点,不支持则降级为纯文本 src/tui/osc8-hyperlinks.ts
BTW 旁支问答 临时提问,不写入后续会话上下文 src/agents/btw.ts
模糊搜索选择器 子序列匹配 + 连续/词首加权打分 src/tui/components/fuzzy-filter.ts

C.2.5 部署与运维(来源:第 15 章)

能力 实现 出处
多阶段构建 4 个有实质工作的构建阶段(另有 2 个只选基础镜像的别名阶段),基础镜像按 SHA256 摘要锁定 Dockerfile
双镜像变体 node:24-bookworm 与 node:24-bookworm-slim OPENCLAW_VARIANT
可选组件 浏览器(约 +300MB)、Docker CLI(约 +50MB)均为 build-arg 开关 Dockerfile
非 root 执行 USER node(uid 1000) Dockerfile
供应链加固 可选安装 Docker CLI 时,Docker apt 签名密钥指纹逐字比对,不符即 exit 1 Dockerfile
结构化日志 文件为 JSON Lines(每行一个 tslog 日志对象)+ 控制台按子系统哈希 6 色着色 + 按天滚动 src/logging/logger.ts、src/logging/subsystem.ts
日志脱敏 17 条默认模式(结构性 + 已知前缀 + Telegram token) src/logging/redact.ts
单实例保证 O_EXCL 锁文件 + PID / 启动时间校验 src/infra/gateway-lock.ts
备份 create / verify,归档带 manifest src/infra/backup-create.ts
云平台配置 仓库自带 fly.toml、render.yaml,docs/install/ 下十余种部署路径 仓库根目录

C.2.6 技能系统(来源:第 16 章)

能力 实现 出处
按需加载 提示只放目录,正文靠 read 工具按需读 formatSkillsCompact
六级来源 extra < bundled < managed < personal < project < workspace,完全替换 src/agents/skills/workspace.ts
资格过滤 os / bins / anyBins / env / config 五类声明 shouldIncludeSkill
自适应降级 完整 → 紧凑(去描述)→ 二分截断 applySkillsPromptLimits
预算上限 150 个技能 / 30,000 字符 / 单文件 256KB 等 5 个默认值 src/agents/skills/workspace.ts
热重载 chokidar + 250ms 写入稳定阈值 src/agents/skills/refresh.ts
安装安全扫描 critical 阻断,warn / info 放行并记录;覆盖插件安装与技能依赖安装,openclaw skills install 从 ClawHub 下载的路径不调用 src/plugins/install-security-scan.ts
环境变量注入 引用计数 + 不覆盖既有变量 + 从子进程剥离 src/agents/skills/env-overrides.ts

C.3 安全模型对比

C.3.1 传统应用安全 vs Agent 安全(来源:第 13 章)

维度 传统应用安全 Agent 安全
输入来源 用户输入 用户输入 + 模型推理 + 工具输出 + 外部内容
行为可预测性 确定性(同输入 → 同输出) 概率性(同输入可能 → 不同输出)
攻击向量 SQL 注入、XSS、CSRF 提示注入、间接注入、工具滥用、上下文投毒
安全边界 明确(网络 → 应用 → 数据库) 模糊(Agent 同时是客户端和服务端)
失败模式 可枚举(已知漏洞列表) 不可枚举(创意性滥用)

C.3.2 接口信任级别(来源:第 13 章)

接口 信任级别 主要风险 控制手段
TUI(本地终端) 高 物理访问隐含信任 Bang 模式仍需一次性会话内授权
Gateway HTTP API 中 网络可达 认证 + /tools/invoke 默认拒绝清单
Telegram 私聊 中低 任何知道 Bot 用户名的人 dmPolicy(默认配对)/ allowFrom + 会话隔离
Discord 公共频道 低 任何频道成员 群组策略 + requireMention + 工具限制
开放群组(groupPolicy: "open") 最低 任何能进群的人 群组策略 + 最严的工具限制

C.4 Provider 与降级(来源:第 4 章)

C.4.1 降级触发条件与行为

触发条件 具体场景 系统行为
HTTP 429 API 密钥达到速率限制 先轮转 Auth Profile;全部冷却中则降级到下一个模型
HTTP 500/502/503 Provider 服务端故障 按 timeout 类处理(不写入 Auth Profile 冷却):先换下一个 Profile,再不行降级模型
上下文溢出 对话历史超过窗口 由内层 runner 压缩后重试;不会降级换模型——溢出错误抛到降级层会被直接重新抛出(src/agents/model-fallback.ts)
认证失败(401/403) 密钥过期或失效 轮转 Auth Profile;全失败则降级模型
网络超时 超过配置超时时间 尝试下一个候选模型
模型不存在 模型已下线(按报错文本识别,isModelNotFoundErrorMessage();HTTP 状态码表里没有 404 分支) 降级到下一个候选模型

C.4.2 模型路由的四条独立通道

OpenClaw 并不是"一个模型走天下"——它为不同模态各留了一条独立的路由,都支持 { primary, fallbacks } 形式:

配置项 用途 缺省行为
agents.defaults.model 主推理模型 系统默认 anthropic/claude-opus-4-6
agents.defaults.imageModel 视觉理解;主模型不支持图片输入时也走它 —
agents.defaults.imageGenerationModel 图像生成 未配置时按已有凭证尽力推断
agents.defaults.pdfModel PDF 处理 未配置时回落到 imageModel

C.5 部署形态对比(来源:第 15 章)

C.5.1 裸机 vs 系统服务 vs 容器

维度 裸机直接运行 系统服务 容器化
进程管理 无——终端关了就停 开机自启 + 崩溃重启 restart: unless-stopped
环境隔离 无 无 容器级隔离
额外依赖 无 无(用系统自带的服务管理器) Docker / Podman
可重现性 依赖主机环境 依赖主机环境 镜像即环境
升级回滚 手动 手动 切换镜像标签
调试便利性 高 中(看服务日志) 中(需 docker exec)
多实例 靠 --profile 手工隔离 按 profile 生成不同服务名 Compose 原生支持
适合谁 个人开发机、树莓派 个人与小团队的长期部署 生产部署、CI/CD、团队协作

三种形态并存可以看作渐进式复杂度:用户只承担自己实际需要的那一层。

C.5.2 Cron vs 心跳(来源:第 12 章)

维度 Cron 心跳
时间精度 精确("周一早上 9 点") 近似("大约每 30 分钟")
执行保证 总是触发,总是执行 触发后由 Agent 决定是否行动
多任务 每个调度对应一个作业 多项检查合并到一次执行
跳过逻辑 不可跳过 可返回 HEARTBEAT_OK 提前收工
Token 成本 每次都是一次完整模型调用 无事时只需一次轻量推理;HEARTBEAT.md 实际为空时直接跳过、不调模型
用途 报告、备份、定期操作 监控、告警、条件响应

C.5.3 Telegram Long Polling vs Webhook(来源:第 8 章)

考量维度 Long Polling Webhook
部署复杂度 零——只需出站连接 需要公网 HTTPS 端点
NAT 友好 是 否——需要端口转发或反代
消息延迟 接近实时(长轮询挂起等待,有更新即返回) 接近实时(Telegram 主动推送)
资源消耗 持续保持连接 仅在有消息时消耗
可靠性 简单——失败重试即可 复杂——webhook 返回非 2xx 时,Telegram 重试有限次数后放弃
调试难度 低 高——本地开发需要隧道工具

C.6 Token 感知设计(来源:第 17 章)

上下文窗口是 Agent 系统里最稀缺的资源,OpenClaw 在多处为它做了专门设计。下表只列机制与出处——具体能省多少完全取决于负载,本专栏不给凭空的倍数。

模块 Token 感知设计 出处
技能系统 提示中只放目录,正文按需 read src/agents/skills/workspace.ts
技能目录 完整 → 紧凑 → 二分截断的三层降级,默认 30,000 字符预算(skills.limits.maxSkillsPromptChars 可调) applySkillsPromptLimits
技能路径 home 前缀压成 ~,源码注释估算每个技能省 5–6 token compactSkillPaths
浏览器 用无障碍树而非截图或整页 DOM 表示页面 extensions/browser/
上下文压缩 超限时摘要历史,保留关键标识符 src/agents/compaction.ts
上下文守卫 按模型窗口与 contextTokens 双重封顶 src/agents/context-window-guard.ts
工具输出 单个工具结果不超过上下文窗口的 30%(另有 400,000 字符硬上限),超出即截断 src/agents/pi-embedded-runner/tool-result-truncation.ts
用量可观测 单列 cacheRead / cacheWrite,gateway usage-cost 汇总 src/agents/stream-message-shared.ts

使用提示:本附录中的表格为各章内容的汇总快照。如需了解某项对比的详细分析和设计取舍,请参考各表格标注的来源章节。