大多数 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[.]md 或 memory/ 文件夹中。
混合搜索:向量 + 关键词
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)
- 读取(read)
- 写入(write)
- 编辑(edit)
浏览器工具(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 }
]
}
}
}
安全命令(如 jq、grep、cut、sort、uniq、head、tail、tr、wc)已预先批准。
危险的 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"
四大优势
正如你可能猜到的,浏览网站不一定是一个视觉任务。
- 体积小:截图可能有 5 MB,语义快照不到 50 KB
- Token 成本低:图像的 Token 成本的一小部分
- 精确性高:文本表示更容易解析和操作
- 可访问性:天然支持无障碍访问
本质层:OpenClaw 的设计哲学
1. 简化是最高形式的复杂
OpenClaw 的记忆系统没有复杂的合并、压缩机制,但它可解释。
2. 默认串行,显式并行
Lane 队列的设计让开发者不再担心竞态条件,而是专注于"什么可以安全并行"。
3. 工具即能力
OpenClaw 不是通过复杂的多 Agent 系统来实现能力,而是通过工具(exec、文件系统、浏览器)来扩展能力。
哲学层:AI Agent 的本质
Agent 不是魔法,是工程
OpenClaw 的架构告诉我们:
- AI Agent 的核心是任务协调
- 记忆不需要复杂,但需要可靠
- 并行化是陷阱,序列化是默认
好品味的代码
OpenClaw 的设计体现了 Linus Torvalds 所说的"好品味":
- 消除特殊情况,而不是增加 if/else
- 通过设计让边界自然融入常规
- 好代码不需要例外
总结:OpenClaw 教给我们的
- 架构即认知:理解系统的底层,才能真正掌握它
- 简单即力量:可解释的简单性优于复杂的意大利面条
- 序列化优于并行化:默认串行,显式并行
- 工具即能力:通过工具扩展 Agent 的能力,而不是复杂的多 Agent 系统
OpenClaw 不仅是一个 AI Agent,更是一个关于如何设计可靠、可扩展系统的教科书。
如果你是 AI 工程师,理解 OpenClaw 的底层架构,将帮助你更好地设计自己的 Agent 系统。
参考资源
- OpenClaw 官方仓库
- Cognition: Don't Build Multi-Agents
- Linus Torvalds: Good Taste in Code