一、OpenClaw 架构概览
表格
核心设计哲学
本地优先(Local-First):所有数据(对话历史、记忆、配置)均以纯文本文件存储在本地机器
消息应用即界面:直接集成到用户日常使用的消息平台(Telegram、Discord、Slack 等)
真正的模型无关(Model-Agnostic):模型被视为可互换的商品化模块
二、消息流转完整链路解析
2.1 阶段一:入站消息接收与协议适配
用户消息 "帮我查一下今天的服务器状态"↓【Channel Adapter 适配器】- 身份验证(Bot Token / 配对码)- 入站解析(提取文字、图片、附件)- 访问控制(白名单检查、群聊 @mention 过滤)- 出站格式化(转换成平台兼容格式)↓【FinalizedMsgContext 标准化消息对象】{channel: 'telegram',accountId: 'bot123456',senderId: 'user789',groupId: null, // 私聊为 nullcontent: '帮我查一下今天的服务器状态',rawMessage: {...},attachments: []}
2.2 阶段二:前置治理(去重、拦截、路由)
2.2.1 去重:防止重复执行
幂等键 = channel:accountId:sender:session:messageId示例:telegram:bot123456:user789:main:msg_456789系统缓存:处理过的幂等键(默认 20 分钟)
2.2.2 拦截:识别控制命令
用户输入:"/stop"↓【控制命令拦截器】识别为控制命令 → 直接触发停止逻辑 → 不进入 AI 处理流程
2.2.3 路由:找对处理 Agent
路由策略优先级(从高到低):1. 精确对等体匹配(channel + account + user/group)2. 服务器 + 角色匹配3. 服务器匹配4. 账户级匹配5. 通道级匹配6. 默认 Agent
2.2.4 生成会话键(SessionKey)
SessionKey 格式示例:- 私聊:assistant:telegram:direct:user789- 群聊:support:telegram:group:-100123456789作用:1. 会话隔离:不同会话完全独立,互不干扰2. 并发控制:相同 SessionKey 的消息串行处理
2.3 阶段三:并发控制(Lane + Queue 机制)
2.3.1 车道限流机制
┌─────────────────────────────────────┐│ 全局 Lane(main/cron/subagent) │ ← 全局并发控制├─────────────────────────────────────┤│ Session Lane(按 sessionKey) │ ← 会话级串行├─────────────────────────────────────┤│ 消息队列(BullMQ) │└─────────────────────────────────────┘规则:- 相同 SessionKey → 串行执行(保证顺序)- 不同 SessionKey → 并行执行(提升吞吐)
2.3.2 队列模式
表格
interrupt | ||
steer | ||
followup | ||
collect |
2.4 阶段四:上下文组装(给模型搭建认知框架)
上下文组装顺序(固定):1. 【系统提示词 System Prompt】← AGENTS.md(职责声明)← SOUL.md(人格设定)← TOOLS.md(工具白名单)2. 【技能提示 Skills Prompt】← 已安装技能的描述和能力声明3. 【对话历史 Conversation History】← 会话中的历史消息← MEMORY.md(长期记忆)← memory/YYYY-MM-DD.md(每日日志)4. 【当前消息 Current Message】← 用户刚刚发送的消息
┌─────────────────────────────────────┐│ 长期记忆(Long-term) ││ MEMORY.md - 终身学习知识 │└─────────────────────────────────────┘↓ RAG 检索┌─────────────────────────────────────┐│ 近端记忆(Proximal) ││ sessions/*.sqlite - 会话存档 │└─────────────────────────────────────┘↓ 上下文注入┌─────────────────────────────────────┐│ 短期记忆(Short-term) ││ 当前对话上下文 - 单次交互 │└─────────────────────────────────────┘
2.5 阶段五:Agent 执行循环(ReAct 模式)
┌─────────────────────────────────────────────────────────────┐│ Agent Loop(ReAct:Reasoning + Acting) │├─────────────────────────────────────────────────────────────┤│ ││ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ││ │ 输入接收 │ → │ 上下文组装 │ → │ 模型调用 │ ││ │ Input │ │ Context │ │ Model │ ││ └─────────────┘ └─────────────┘ └─────────────┘ ││ ↓ ││ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ││ │ 工具执行 │ ← │ 思考分析 │ ← │ 结果反馈 │ ││ │ Tool Exec │ │ Thinking │ │ Feedback │ ││ └─────────────┘ └─────────────┘ └─────────────┘ ││ ↑ ↓ ││ └───────────────── 循环判断 ────────────┘ ││ (需要更多信息?) ││ │ ││ ↓ ││ ┌─────────────┐ ││ │ 回复输出 │ ← 完成或达到最大步数 ││ │ Reply │ ││ └─────────────┘ │└─────────────────────────────────────────────────────────────┘最大步数限制:默认 10 步(可配置)
2.6 阶段六:工具调用与执行
2.6.1 工具调用流程
模型决策:"需要调用 check_disk_usage 工具"↓【工具调用解析器】{tool_name: "check_disk_usage",parameters: {...}}↓【权限验证 Policy Check】- 工具是否在白名单中?- 用户是否有执行权限?- 是否需要人工审批?(exec approvals)↓【参数验证 Param Validation】- 参数类型是否正确?- 参数值是否在合法范围内?↓【执行 Execution】- 本地执行:system.run / browser.action- 远端执行:node.invoke- 技能执行:调用 Skill 脚本↓【结果返回 Result Return】将执行结果注入上下文,返回给模型继续思考
2.6.2 安全边界
┌─────────────────────────────────────┐│ 入口边界 ││ - allowFrom 白名单 ││ - Token 验证 ││ - 配对机制(Pairing) │└─────────────────────────────────────┘↓┌─────────────────────────────────────┐│ 执行边界 ││ - Sandbox 沙箱隔离 ││ - Tool Policy 工具策略 ││ - 执行审批机制(Approvals) │└─────────────────────────────────────┘↓┌─────────────────────────────────────┐│ 审计追踪 ││ - runId 追踪完整执行链路 ││ - 日志记录 ││ - doctor 诊断工具 │└─────────────────────────────────────┘
2.7 阶段七:回复处理与出站发送
2.7.1 流式输出与分块
流式输出流程:1. 模型生成文本块(Token 流)2. 系统实时推送文本块到渠道3. 遵循渠道限制(如 Telegram 消息长度限制)4. 避免拆分代码块(fence code)分块策略:- minChars / maxChars:最小/最大字符数- breakPreference:break 优先级(text_end / message_end)- humanDelay:拟人化延迟(模拟打字速度)
2.7.2 出站格式化
统一格式 → 平台适配Markdown → Telegram MarkdownV2图片/附件 → 上传到平台,获取 URL回复线程 → 设置 reply_to_message_id
2.8 阶段八:会话持久化与记忆更新
完成一轮对话后:↓【会话历史持久化】- 将当前轮次消息追加到 sessions/*.sqlite- 更新记忆索引(RAG Embedding)- 同步到 MEMORY.md(如有重要信息)↓【上下文压缩 Compaction】(可选)- 当会话历史超过模型上下文窗口- 保留关键信息,压缩冗余对话- 使用摘要模型生成对话摘要
三、完整流程图

四、关键技术点深度解析
4.1 WebSocket 协议设计
表格
sessions.listconfig.get | ||
agent.textagent.tool_call | ||
4.2 模型路由与故障转移
OpenClaw 是真正的模型无关系统:
┌─────────────────────────────────────┐│ Provider 配置(openclaw.json) │├─────────────────────────────────────┤│ providers: [ ││ { name: "anthropic", ... }, ││ { name: "openai", ... }, ││ { name: "deepseek", ... } ││ ] │└─────────────────────────────────────┘↓┌─────────────────────────────────────┐│ 模型路由 Router ││ - 根据任务类型选择模型 ││ - 主编排器:Claude/GPT-4 ││ - 子任务:更便宜的模型 │└─────────────────────────────────────┘↓┌─────────────────────────────────────┐│ 故障转移 Failover ││ - 指数退避重试 ││ - 自动切换备用 Provider ││ - 认证配置文件轮换 │└─────────────────────────────────────┘
4.3 技能系统(Skills)
~/.openclaw/skills/my-skill/├── SKILL.md # 技能元数据└── script.ts # 执行脚本SKILL.md 示例:---name: check_disk_usagedescription: Check current disk usage of serverusage: "check disk space", "disk usage"## Tools### get_disk_usage- Description: Returns output of `df -h`- Command: `df -h`
工作区技能(最高)→ 插件技能 → 用户技能 → 系统技能(最低)五、性能优化与安全防护
5.1 Token 使用优化
表格
| 总成本 | 90% |
5.2 安全架构
四层安全防线:1. 【网络层】- 仅绑定 127.0.0.1(默认)- TLS 1.3 加密 WebSocket- IP 白名单2. 【认证层】- Token 验证- 配对机制(Pairing)- 设备 Token 轮换3. 【授权层】- allowFrom 白名单- Tool Policy 工具策略- 执行审批机制4. 【审计层】- 完整日志记录- runId 链路追踪- doctor 诊断工具
六、总结与展望
清晰的分层设计:每层职责明确,易于扩展和维护
强大的并发控制:Lane + Queue 机制保证系统稳定性和可预测性
灵活的记忆系统:三级记忆架构支持从短期到长期的完整信息管理
真正的模型无关:Provider 插件化设计,无供应商锁定
完善的安全防护:四层防线确保系统在生产环境中的安全性
ACP(Agent Communication Protocol)支持多 Agent 协作
MCP(Model Context Protocol)标准化模型接口
更强大的 Context Engine 插件系统
GPU 资源弹性伸缩
夜雨聆风