2026-01-31 · 架构
32
架构 · 2026-01-31

为什么 OpenClaw 用队列而不是 async/await?一次架构解剖

大多数 AI Agent 都在用 async/await,但 OpenClaw 偏偏选择了队列。这不是倒退,而是一次对并发编程的深刻反思。

你以为你懂 AI Agent,其实你只是在用它

如果你是 AI 工程师,你可能已经用过 Claude、ChatGPT,甚至尝试过本地部署的 Clawdbot(现在叫 OpenClaw)。

但有一个问题:你真的理解它的工作原理吗?

大多数人对 AI Agent 的理解停留在"调用 API → 返回结果"这个层面。但真正的 Agent 系统远比这复杂:
- 它如何处理多个并发请求?
- 它如何记住你说过的话?
- 它如何在你的电脑上执行命令?
- 它如何避免竞态条件(Race Condition)?

理解一个系统的底层架构,不仅能让你更好地使用它,更重要的是——你会知道它擅长什么,不擅长什么。

这篇文章源于我对 OpenClaw 内存管理的好奇:它如何记住对话?它的记忆有多可靠?它会不会像金鱼一样,7 秒就忘记你说过的话?

但当我深入源码后,我发现了一个更有趣的问题:为什么 OpenClaw 不用 async/await,而是用队列?

让我们从表象深入本质,看看这个 AI Agent 的真实面目。


OpenClaw 到底是什么?

现象层:一个 CLI 应用

大多数人以为 OpenClaw 是一个 Web 应用,或者某种基于 Python 的 AI 框架。

错了。

OpenClaw 的核心是一个 TypeScript CLI 应用。它:
- 运行在你的本地机器上
- 暴露一个网关服务器(Gateway Server)来处理所有渠道连接(Telegram、WhatsApp、Slack 等)
- 调用 LLM API(Anthropic、OpenAI、本地模型等)
- 在本地执行工具
- 可以在你的电脑上做任何你允许它做的事

这不是 Next.js,不是 Web App,而是一个进程。


架构剖析:从消息到响应的完整路径

当你在 Telegram 上给 OpenClaw 发送一条消息时,会发生什么?

1. Channel Adapter(渠道适配器)

不同的消息平台有不同的数据格式。Channel Adapter 负责:
- 接收你的消息
- 标准化格式
- 提取附件(图片、文件等)

每个渠道(Telegram、WhatsApp、Slack)都有自己的专属适配器。

2. Gateway Server(网关服务器)

这是 OpenClaw 的心脏。它是任务/会话协调器,负责:
- 接收标准化后的消息
- 将消息路由到正确的会话(Session)
- 处理多个重叠的请求

核心设计:基于 Lane 的命令队列

OpenClaw 使用了一个基于车道(Lane)的命令队列来序列化操作:
- 每个会话有自己的专属车道
- 低风险的可并行任务可以在并行车道中运行(如定时任务)

这与传统的 async/await 意大利面条代码形成鲜明对比。

设计哲学:默认串行,显式并行

如果你做过 Agent 开发,你一定遇到过这个问题:过度并行化会导致可靠性下降,调试噩梦频发。

这也是 Cognition 在《Don't Build Multi-Agents》博客中提到的核心洞察:
- 简单的异步设置会让你的日志变成一堆交错的垃圾
- 如果多个 Agent 共享状态,竞态条件(Race Condition)将成为你开发中的永恒恐惧

Lane 是对队列的抽象,序列化是默认架构,而不是事后补丁。

作为开发者,你只需要手动编写代码,队列会为你处理竞态条件。

心智模型的转变:
- 从"我需要锁什么?"
- 变成"什么是可以安全并行的?"

3. Agent Runner(Agent 运行器)

这是 AI 真正登场的地方。Agent Runner 负责:
- 决定使用哪个模型
- 选择 API Key(如果某个 Key 失效,标记为冷却状态并尝试下一个)
- 如果主模型失败,回退到备用模型

Agent Runner 会动态组装系统提示词,包括:
- 可用工具
- Skills
- 记忆
- 会话历史(从 .jsonl 文件读取)

然后,它会将这些内容传递给上下文窗口守卫(Context Window Guard),确保有足够的上下文空间。如果上下文快满了,它会:
- 压缩会话(总结上下文)
- 或优雅地失败

4. LLM API 调用

LLM 调用本身会流式传输响应,并对不同的提供商进行抽象。如果模型支持,它还可以请求扩展思考(Extended Thinking)。

5. Agentic Loop(Agent 循环)

如果 LLM 返回工具调用响应,OpenClaw 会在本地执行它,并将结果添加到对话中。这个过程会重复,直到:
- LLM 返回最终文本
- 或达到最大轮次(默认约 20 轮)

这就是魔法发生的地方:Computer Use(计算机使用)。

6. 响应路径

响应通过渠道返回给你。会话也会持久化为一个基本的 JSONL 文件,每一行都是一个 JSON 对象,包含:
- 用户消息
- 工具调用
- 结果
- 响应等

这就是 OpenClaw 如何记住的(基于会话的记忆)。


OpenClaw 如何记忆?

没有合适的记忆系统,AI 助手就像金鱼一样。OpenClaw 通过两个系统处理记忆:

1. 会话转录(Session Transcripts)

如前所述,会话以 JSONL 格式存储。

2. 记忆文件(Memory Files)

记忆以 Markdown 格式存储在 MEMORY[.]mdmemory/ 文件夹中。

混合搜索:向量 + 关键词

OpenClaw 使用混合搜索来检索记忆:
- 向量搜索(Vector Search):捕捉语义相似性
- 关键词匹配(Keyword Match):捕捉精确短语

例如,搜索"authentication bug"会找到:
- 提到"auth issues"的文档(语义)
- 包含精确短语"authentication bug"的文档(关键词)

技术栈:
- 向量搜索:SQLite
- 关键词搜索:FTS5(也是 SQLite 扩展)
- 嵌入提供商:可配置

智能同步(Smart Syncing)

当文件监视器检测到文件更改时,会触发智能同步。

这个 Markdown 是由 Agent 自己生成的,使用标准的"写文件"工具。没有特殊的内存写入 API。Agent 只是写入 memory/*.md

一旦新对话开始,一个钩子会抓取上一次对话,并写入摘要到 Markdown。

简单但有效

OpenClaw 的记忆系统出奇地简单,与我们在 @CamelAIOrg 中实现的工作流记忆非常相似:
- 没有记忆合并
- 没有月度/周度记忆压缩

这种简单性可能是优势,也可能是陷阱,取决于你的视角。但我始终倾向于可解释的简单性,而不是复杂的意大利面条。

记忆永久保存,旧记忆基本上具有相同的权重,所以可以说没有遗忘曲线


OpenClaw 的利爪:如何使用你的计算机?

这是 OpenClaw 的护城河之一:你给它一台计算机,让它使用。那么它是如何使用计算机的?

执行工具(Exec Tool)

OpenClaw 使用 exec 工具在以下环境中运行 Shell 命令:
- 沙盒(默认):命令在 Docker 容器中运行
- 直接在宿主机上
- 在远程设备上

文件系统工具(Filesystem Tools)

浏览器工具(Browser Tool)

基于 Playwright,使用语义快照(Semantic Snapshots)。

进程管理(Process Tool)


安全性(或缺乏安全性?)

类似于 Claude Code,OpenClaw 有一个命令白名单供用户批准:
- 允许一次
- 始终允许
- 拒绝

// ~/.clawdbot/exec-approvals.json
{
  "agents": {
    "main": {
      "allowlist": [
        { "pattern": "/usr/bin/npm", "lastUsedAt": 1706644800 },
        { "pattern": "/opt/homebrew/bin/git", "lastUsedAt": 1706644900 }
      ]
    }
  }
}

安全命令(如 jqgrepcutsortuniqheadtailtrwc)已预先批准。

危险的 Shell 构造默认被阻止:

# 这些会在执行前被拒绝:
npm install $(cat /etc/passwd)     # 命令替换
cat file > /etc/hosts              # 重定向
rm -rf / || echo "failed"          # 用 || 链接
(sudo rm -rf /)                    # 子 Shell

安全性与 Claude Code 非常相似。核心理念是:在用户允许的范围内,尽可能多的自主权。


浏览器:语义快照

浏览器工具不主要使用截图,而是使用语义快照,这是页面可访问性树(ARIA)的文本表示。

所以 Agent 会看到:

- button "Sign In" [ref=1]
- textbox "Email" [ref=2]
- textbox "Password" [ref=3]
- link "Forgot password?" [ref=4]
- heading "Welcome back"
- list
  - listitem "Dashboard"
  - listitem "Settings"

四大优势

正如你可能猜到的,浏览网站不一定是一个视觉任务。

  1. 体积小:截图可能有 5 MB,语义快照不到 50 KB
  2. Token 成本低:图像的 Token 成本的一小部分
  3. 精确性高:文本表示更容易解析和操作
  4. 可访问性:天然支持无障碍访问

本质层:OpenClaw 的设计哲学

1. 简化是最高形式的复杂

OpenClaw 的记忆系统没有复杂的合并、压缩机制,但它可解释

2. 默认串行,显式并行

Lane 队列的设计让开发者不再担心竞态条件,而是专注于"什么可以安全并行"。

3. 工具即能力

OpenClaw 不是通过复杂的多 Agent 系统来实现能力,而是通过工具(exec、文件系统、浏览器)来扩展能力。


哲学层:AI Agent 的本质

Agent 不是魔法,是工程

OpenClaw 的架构告诉我们:
- AI Agent 的核心是任务协调
- 记忆不需要复杂,但需要可靠
- 并行化是陷阱,序列化是默认

好品味的代码

OpenClaw 的设计体现了 Linus Torvalds 所说的"好品味":
- 消除特殊情况,而不是增加 if/else
- 通过设计让边界自然融入常规
- 好代码不需要例外


总结:OpenClaw 教给我们的

  1. 架构即认知:理解系统的底层,才能真正掌握它
  2. 简单即力量:可解释的简单性优于复杂的意大利面条
  3. 序列化优于并行化:默认串行,显式并行
  4. 工具即能力:通过工具扩展 Agent 的能力,而不是复杂的多 Agent 系统

OpenClaw 不仅是一个 AI Agent,更是一个关于如何设计可靠、可扩展系统的教科书。

如果你是 AI 工程师,理解 OpenClaw 的底层架构,将帮助你更好地设计自己的 Agent 系统。


参考资源

目录 最新
← 左侧翻上一屏 · 右侧翻下一屏 · 中间唤出菜单