OpenClaw:基于Gateway与AI Agent的智能助手架构解析
1. OpenClaw项目概述
OpenClaw是一个通过Gateway连接即时通讯平台与本地AI Agent的个人助手系统。它不仅仅是一个简单的消息转发器,而是具备完整会话管理、并发控制、记忆检索以及丰富工具支持的复杂Agent运行时环境。这个系统能够24×7持续运行,为用户提供智能化的交互体验。
从技术架构来看,OpenClaw采用了模块化设计,主要包括以下几个核心组件:
- Gateway:作为系统的控制平面,负责与各种消息渠道建立长连接
- Agent:执行核心智能处理功能
- Skills:提供各种专业能力的扩展模块
- Memory:实现短期和长期记忆管理
2. OpenClaw四大核心架构解析
2.1 Gateway架构设计
Gateway是OpenClaw系统的入口和控制中心,主要负责以下功能:
消息接入与分发:
- 通过WebSocket与各类即时通讯平台(如Telegram、Slack等)建立连接
- 接收用户消息并路由到相应的Agent处理
- 将Agent的回复消息发送回原始渠道
会话状态管理:
- 维护所有活跃会话的状态信息
- 处理会话的生命周期(创建、维护、销毁)
定时任务调度:
- 执行系统级的定时任务
- 处理会话超时等事件
Gateway的核心实现是一个HTTP和WebSocket服务,启动时会加载配置并与注册的Channel建立连接。以下是简化的Gateway启动流程代码示例:
export async function startGatewayServer(port=18789, opts:GatewayServerOptions={}): Promise<GatewayServer> { // 1. 设置端口环境变量 process.env.OPENCLAW_GATEWAY_PORT = String(port); // 2. 加载并验证配置 let configSnapshot = await readConfigFileSnapshot(); // 3. 创建WebSocket服务器 const wsServer = new WebSocket.Server({port, host}); // 4. 注册核心处理器 const channelManager = createChannelManager(configSnapshot.config); const agentEventHandler = createAgentEventHandler(configSnapshot.config); const cronService = buildGatewayCronService(configSnapshot.config); // 5. 启动通道连接 await channelManager.startAll(); // 6. 返回close方法用于优雅关闭 return { close: (opts) => shutdownGateway(opts), }; }Gateway通过系统服务管理保持24×7运行,在macOS上使用launchctl,在Linux上使用systemctl进行管理。
2.2 Agent核心架构
Agent是OpenClaw系统的智能处理核心,基于开源的Pi-Agent框架构建,但进行了深度定制。其主要特点包括:
会话管理:
- 使用SessionKey机制唯一标识和路由会话
- 支持私聊、群组等多种会话形式
- 自动管理会话生命周期(每日重置、空闲归档等)
并发控制:
- 会话级别并发控制(同一会话串行处理)
- 全局并发控制(默认并发度4)
- 多种队列模式处理消息竞争
故障转移机制:
- Auth Profile轮换(当API Key遇到速率限制时自动切换)
- 上下文溢出自动压缩
- 思考级别降级(当模型不支持扩展思考模式时自动降级)
Agent的核心执行流程采用ReAct范式,支持工具调用和流式输出。以下是简化的Agent执行循环代码:
export async function runEmbeddedPiAgent(params: RunEmbeddedPiAgentParams): Promise<EmbeddedPiRunResult> { // 会话级别并发控制 const sessionLane = resolveSessionLane(params.sessionKey?.trim() || params.sessionId); // 全局并发控制 const globalLane = resolveGlobalLane(params.lane); return enqueueSession(() => enqueueGlobal(async () => { const started = Date.now(); // 模型解析和上下文窗口验证 const {model, error, authStorage, modelRegistry} = resolveModel(provider, modelId, agentDir, params.config); // 认证配置管理和故障转移 const profileOrder = resolveAuthProfileOrder({ cfg: params.config, store: authStore, provider, preferredProfile: preferredProfileId, }); // 主执行循环,支持故障转移 while (true) { const attempt = await runEmbeddedAttempt({ sessionId: params.sessionId, sessionKey: params.sessionKey, // ... 大量参数 }); // 处理上下文溢出,自动压缩 if (isContextOverflowError(errorText)) { const compactResult = await compactEmbeddedPiSessionDirect({ sessionId: params.sessionId, sessionKey: params.sessionKey, // ... }); if (compactResult.compacted) continue; } // 处理认证/速率限制故障转移 if (shouldRotate) { const rotated = await advanceAuthProfile(); if (rotated) continue; } return { payloads: payloads.length ? payloads : undefined, meta: { durationMs: Date.now() - started, // ... }, }; } })); }2.3 Memory记忆系统
OpenClaw的记忆系统是其长期保持上下文连贯性的关键,主要包括以下组件:
记忆存储:
- 全局长期记忆(MEMORY.md或memory.md)
- 目录记忆(memory/*.md)
- 额外路径配置(memorySearch.extraPaths)
记忆检索:
- 关键词精确搜索
- 向量语义检索
- 混合检索策略(加权得分)
索引管理:
- 文件分块处理
- Embedding计算和缓存
- 本地数据库写入
记忆系统使用Sqlite作为存储后端,支持高效的混合检索。以下是记忆检索工具的示例实现:
export function createMemorySearchTool(options: { config?: OpenClawConfig; agentSessionKey?: string; }): AnyAgentTool | null { return { label: "Memory Search", name: "memory_search", description: "Mandatory recall step: semantically search MEMORY.md + memory/*.md " + "(and optional session transcripts) before answering questions about " + "prior work, decisions, dates, people, preferences, or todos; " + "returns top snippets with path + lines.", parameters: MemorySearchSchema, execute: async (_toolCallId, params) => { const query = readStringParam(params, "query", {required: true}); const maxResults = readNumberParam(params, "maxResults"); const minScore = readNumberParam(params, "minScore"); const {manager, error} = await getMemorySearchManager({cfg, agentId}); if (!manager) { return jsonResult({results: [], disabled: true, error}); } const results = await manager.search(query, { maxResults, minScore, sessionKey: options.agentSessionKey, }); return jsonResult({results, provider: status.provider, model: status.model}); }, }; }记忆管理器执行混合检索的核心逻辑如下:
export class MemoryIndexManager { async search(query: string, opts?: { maxResults?: number; minScore?: number; sessionKey?: string; }): Promise<MemorySearchResult[]> { // 关键词搜索 const keywordResults = hybrid.enabled ? await this.searchKeyword(cleaned, candidates).catch(() => []) : []; // 向量搜索 const queryVec = await this.embedQueryWithTimeout(cleaned); const vectorResults = hasVector ? await this.searchVector(queryVec, candidates).catch(() => []) : []; // 合并结果 if (!hybrid.enabled) { return vectorResults .filter((entry) => entry.score >= minScore) .slice(0, maxResults); } const merged = this.mergeHybridResults({ vector: vectorResults, keyword: keywordResults, vectorWeight: hybrid.vectorWeight, textWeight: hybrid.textWeight, }); return merged .filter((entry) => entry.score >= minScore) .slice(0, maxResults); } }2.4 Skills工具技能系统
OpenClaw提供了丰富的工具技能,主要包括以下几类:
核心工具:
- 文件系统访问
- Shell命令执行
- webSearch工具
自感知能力:
- 获取Gateway状态
- 获取Session状态
插件工具:
- bird(Twitter/X相关功能)
- message(富消息交互)
- browser(网页浏览)
- 天气查询等
Skills从三个位置加载:
- 内置Skills(随安装包发布)
- 托管/本地Skills(~/.openclaw/skills)
- 工作区Skills( /skills)
OpenClaw支持灵活的工具策略配置,可以在多个层级进行定制:
- 全局策略(config.tools)
- 全局按提供商策略(config.tools.byProvider[providerOrModelId])
- Agent策略(config.agents.[agentId].tools)
- Agent按提供商策略(config.agents.[agentId].tools.byProvider[providerOrModelId])
- 群组策略(config.groups.[groupId].tools)
message工具是OpenClaw的特色功能之一,支持以下高级交互:
- 发送多条消息(在最终回复前后发送图片、文件等)
- 富文本与复杂交互(按钮、卡片、投票等)
- 精准引用与回复(回复特定消息ID)
以下是message工具调用的JSON示例:
{ "action": "send", "buttons": "[[{\"text\":\"A. 下午好\", \"callback_data\":\"n5_quiz_wrong\"}, {\"text\":\"B. 再见\", \"callback_data\":\"n5_quiz_correct\"}], [{\"text\":\"C. 谢谢\", \"callback_data\":\"n5_quiz_wrong\"}, {\"text\":\"D. 早上好\", \"callback_data\":\"n5_quiz_wrong\"}]]", "channel": "telegram", "message": "📚 **日语N5练习题**\n\n**さようなら** 的中文意思是什么?", "target": "123456" }3. OpenClaw架构设计亮点
3.1 会话管理机制
OpenClaw的会话管理采用SessionKey机制,能够唯一标识各种复杂的会话场景。SessionKey的格式示例如下:
- 主会话:
agent:main:main - Telegram私聊:
agent:main:telegram:default:dm:123456789 - Telegram群组:
agent:main:telegram:group:1001234567890
会话数据存储在本地文件系统中,路径结构为:
~/.openclaw/agents/<agentId>/sessions/ session.json # 记录所有Session的元数据映射 <sessionId>.jsonl # 存储具体的对话日志(JSON Lines格式)会话生命周期管理包括:
- 每日自动生成新的SessionId(通过检测日期变化)
- 默认60分钟无交互后归档当前Session
- 子Agent的Session同样遵循60分钟自动归档策略
3.2 队列与并发控制
OpenClaw设计了精密的Queue系统来处理消息竞争问题,支持多种队列模式:
collect收集模式(默认):
- 将所有排队的消息合并成单个后续回复
- 示例格式:
[Queued messages while agent was busy] --- Queued #1 [Slack x +1s 2026-02-09 16:58 GMT+8] 算了 [slack message id: x channel: x] [message_id: x] --- Queued #2 [Slack x +4s 2026-02-09 16:58 GMT+8] 查一下天津的 [slack message id: x channel: x] [message_id: x]
steer转向模式:
- 立即注入到当前agent回合中
- 使用pi-agent的steer能力在Agent loop中插入消息
followup跟进模式:
- 当前运行结束后,为下一个agent回合排队
steer-backlog转向+积压模式:
- 现在转向当前回合,然后保留消息用于后续回合
并发控制采用两层结构:
- 会话级别:同一会话内的消息串行处理
- 全局级别:默认并发度为4,允许最多4个会话同时处理
3.3 混合检索技术
OpenClaw的记忆检索采用混合检索方案,结合了:
- 关键词精确搜索
- 向量语义检索
对候选结果计算加权得分,返回最相关的几条。基于本地个人Agent的定位,默认使用Sqlite作为数据库存储(agents.sqlite文件)。
向量检索使用Sqlite-vec扩展执行KNN搜索,示例代码如下:
// 创建向量表 db.exec(`CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[4])`); // 插入数据 const insert = db.prepare(`INSERT INTO vec_items(rowid, embedding) VALUES (?, ?)`); const data = [ [1, [0.1, 0.1, 0.1, 0.1]], [2, [0.2, 0.2, 0.2, 0.2]] ]; for (const [id, vec] of data) { insert.run(BigInt(id), new Float32Array(vec)); } // KNN搜索 const query = new Float32Array([0.15, 0.15, 0.15, 0.15]); const rows = db.prepare(` SELECT rowid, distance FROM vec_items WHERE embedding MATCH ? ORDER BY distance LIMIT 3 `).all(query);3.4 工具技能扩展性
OpenClaw支持丰富的技能扩展方式:
内置Skills:
- 随安装包一起发布
- 如bird、github等常用技能
托管/本地Skills:
- 存储在~/.openclaw/skills目录
- 可通过clawhub命令安装
工作区Skills:
- 存储在 /skills目录
- 支持快速开发和测试新技能
安装Skills的示例命令:
# 技能安装,以artifacts-builder为例 npm i -g clawhub clawhub install artifacts-builder # 插件安装 openclaw plugins list openclaw plugins install @openclaw/voice-call4. OpenClaw架构设计思考
OpenClaw的架构设计体现了几个关键思想:
可靠性优先:
- 完善的故障转移机制
- 上下文溢出自动处理
- 认证配置自动轮换
扩展性设计:
- 模块化的工具技能系统
- 多层次的配置策略
- 支持自定义技能开发
性能考量:
- 精细的并发控制
- 混合检索策略
- 本地化存储设计
用户体验:
- 丰富的交互能力
- 连贯的会话体验
- 个性化的记忆系统
从技术实现来看,OpenClaw虽然基于现有的Pi-Agent框架,但通过精心的定制和扩展,打造了一个完成度极高的本地个人助手系统。其架构设计中的许多思路,特别是可靠性保障和扩展性设计,值得开发者深入研究和借鉴。
