Clawdbot (OpenClaw): 架构与实现解析
了解Clawd的内部工作机制,能让我们更好地理解这个系统及其能力,最重要的是,明白它擅长什么与不擅长什么。这一切始于我个人对Clawd如何处理记忆及其可靠性的好奇。在本文中,我将浅析Clawd的工作方式。Clawd的技术实质众所周知,Clawd是一个个人助理,你可以本地运行或通过模型API使用,并能像在手机上一样轻松访问。但它究竟是什么?本质上,Clawdbot 是一个 TypeScript CL
我深入了解了Clawdbot(亦称Moltbot)的架构及其处理智能体执行、工具使用、浏览器操作等方式。对于AI工程师而言,这其中有许多值得借鉴之处。
了解Clawd的内部工作机制,能让我们更好地理解这个系统及其能力,最重要的是,明白它擅长什么与不擅长什么。
这一切始于我个人对Clawd如何处理记忆及其可靠性的好奇。
在本文中,我将浅析Clawd的工作方式。
Clawd的技术实质
众所周知,Clawd是一个个人助理,你可以本地运行或通过模型API使用,并能像在手机上一样轻松访问。但它究竟是什么?
本质上,Clawdbot 是一个 TypeScript CLI 应用程序。
它并非Python、Next.js或网页应用。
它是一个进程,能够:
在你的机器上运行,并暴露一个网关服务器来处理所有通道连接(Telegram、WhatsApp、Slack 等);
调用LLM API(Anthropic、OpenAI、本地模型等);
在本地执行工具;
并在你的计算机上执行你想要的任何操作。
系统架构
为了更简单地解释其架构,这里有一个示例,展示了从你向Clawd发送消息到获得输出的完整过程。

当你通过即时通讯软件向Clawd发送指令时,会发生以下过程:
1. 通道适配器
通道适配器接收并处理你的消息(进行规范化、提取附件)。不同的通讯软件和输入流都有其专用的适配器。
2. 网关服务器
作为任务/会话协调器的网关服务器接收你的消息,并将其传递到正确的会话。这是Clawd的核心。它处理多个重叠的请求。
为了序列化操作,Clawd使用了一个基于通道的命令队列。一个会话拥有其专属的通道,而低风险、可并行化的任务可以在并行通道中运行(例如定时任务)。
这与使用异步/等待的混乱代码形成对比。过度并行化会损害可靠性,并引发一大堆调试问题。
默认采用串行,显式地选择并行
如果你从事过智能体开发,可能已经在某种程度上意识到了这一点。这也是Cognition公司的博文《不要构建多智能体》中的核心见解。
为每个智能体设置简单的异步架构,最终会让你得到一堆交错混乱的垃圾数据。日志将难以阅读,如果它们共享状态,竞态条件将成为你在开发过程中必须时刻警惕的常驻恐惧。
“通道”是对队列的一种抽象,其默认架构就是序列化,而非事后补救。作为开发者,你只需手动编写代码,队列会为你处理竞态条件。
这种思维模式从“我需要锁定什么?”转变为“什么是可以安全并行化的?”
3. 代理运行器
这才是真正的AI发挥作用的地方。它决定使用哪个模型,选择API密钥(如果都无效,则将对应的配置标记为冷却状态并尝试下一个),并在主模型失败时回退到其他模型。
代理运行器动态地组装系统提示,包含可用的工具、技能、记忆,然后添加上下文历史记录(来自一个.jsonl文件)。
接下来,它会将提示传递给上下文窗口守卫,确保有足够的上下文空间。如果上下文几乎已满,它要么压缩会话(总结上下文),要么优雅地失败。
4. LLM API 调用
LLM调用本身会流式传输响应,并对不同的提供商进行抽象封装。如果模型支持,它还可以请求进行扩展思考。
5. 代理循环
如果LLM返回一个工具调用的响应,Clawd会在本地执行它,并将结果添加到对话中。这个过程会不断重复,直到LLM返回最终文本或达到最大轮次限制(默认为约20轮)。
这也是魔法发生的地方:
计算机使用
这一点我稍后会详细说明。
6. 响应路径
这部分相当标准。响应通过原通道返回给你。会话也会通过一个基础的jsonl文件持久化保存,其中每一行都是一个JSON对象,记录了用户消息、工具调用、结果、响应等内容。这就是Clawd记忆的方式(基于会话的记忆)。
以上就是基本架构。现在,让我们深入了解一些更关键的组件。
Clawd如何记忆
没有一个合适的记忆系统,AI助手就跟金鱼没什么两样。Clawd通过两个系统来处理记忆:
-
如上所述的JSONL格式的会话记录。
-
位于
MEMORY[.]md文件或memory/文件夹中的Markdown格式的记忆文件。
对于搜索,它采用了向量搜索和关键词匹配的混合方式。这结合了两者的优点。
因此,搜索“authentication bug”(认证错误)既能找到提及“auth issues”(权限问题)的文档(语义匹配),也能找到包含完全匹配短语的文档(关键词匹配)。
向量搜索使用SQLite,关键词搜索使用同样是SQLite扩展的FTS5。嵌入的提供者是可配置的。
它还受益于智能同步功能,该功能在文件监视器检测到文件更改时触发。
这些Markdown文件是由智能体自身使用一个标准的“写入”文件工具生成的。并没有特殊的记忆写入API。智能体只是简单地写入memory/*.md文件。
当一个新的对话开始时,一个钩子会抓取之前的对话,并用Markdown格式写一个摘要。
Clawd的记忆系统出奇地简单,与我们在@CamelAIOrg中实现的工作流记忆非常相似。没有记忆合并,没有每月/每周的记忆压缩。
这种简单性可能是一个优势,也可能是一个缺陷,取决于你的视角,但我个人总是更倾向于可解释的简洁,而非复杂的意大利面条式代码。
记忆会永久保存,旧的记忆基本上拥有同等的权重,因此我们可以说它没有遗忘曲线。
Clawd的“爪子”:它如何使用你的计算机
这是Clawd的护城河之一:你给它一台计算机,让它使用。那么它是如何使用的呢?基本上和你想象的一样。
Clawd赋予智能体对计算机的重大访问权限,但这需要你自担风险。它使用一个执行工具来运行shell命令,可以在以下环境:
-
沙盒:默认选项,命令在Docker容器中运行。
-
直接在宿主机上运行。
-
在远程设备上运行。
除此之外,Clawd还拥有文件系统工具(读、写、编辑),
基于Playwright的浏览器工具(附带语义快照功能),
以及用于管理后台长期命令、终止进程等的进程管理工具。
安全性(或其缺失?)
与Claude Code类似,这里有一个允许列表,用于管理用户希望批准的命令(允许一次、总是允许、向用户发送拒绝提示)。
// ~/.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结构默认会被阻止。
# these get rejected before execution:
npm install $(cat /etc/passwd) # command substitution
cat file > /etc/hosts # redirection
rm -rf / || echo "failed" # chained with ||
(sudo rm -rf /) # subshell
其安全设计与Claude Code非常相似。
核心理念是提供用户所允许的最大限度的自主性。
浏览器:语义快照
浏览器工具主要并非使用屏幕截图,而是使用语义快照,即基于文本的页面可访问性树表示。
因此,智能体会看到类似这样的内容:
- 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 成本也只是图像的一小部分。
原文:https://x.com/Hesamation/status/2017038553058857413[1]
更多推荐

所有评论(0)