OpenClaw的爆火不仅验证了具有“活人感”的通用 Agent 的巨大市场需求,也证明了其智能体底层工程实践的优越性。
下面我将结合《The Engineering Behind Clawbot》与个人实践理解,带你一起研究OpenClaw的底层“图纸”,剖析小龙虾“活人感”的奥秘,从而获取更好的解题思路。
1. OpenClaw的技术本质
很多人以为 Clawdbot 是一个应用或网站产品。实际上,它是一个 TypeScript 编写的 CLI 程序。
本质上,它是一个长期运行的进程,负责:
-通过暴露网关服务器(Gateway Server)接收来自不同渠道的消息(Telegram、Slack、WhatsApp 等)
- 调用 LLM API(Anthropic / OpenAI / 本地模型等)
- 在本地执行工具
- 操作你的文件系统、浏览器、Shell
换句话说,Clawdbot 不是 App,而是一个「本地 Agent 操作系统」。
这就意味着 Clawdbot 不是围绕 UI 设计,而是围绕任务调度与执行可靠性设计。
2. 整体架构:一条请求如何流转?
如下图所示,当你给OpenClaw发送消息到接收到回复,大致经历6个阶段:
1. 渠道适配层(Channel Adapter)
用于接收你各个渠道发来的消息,并将来自不同平台的消息统一成标准格式:文本、附件、元数据。
不同渠道传递来的消息有各自的适配器,这是典型的“输入归一化”预处理。
2. 网关服务器(Gateway Server)
网关服务器是任务/会话的协调器,这是OpenClaw的核心。
主要职责是:
- 管理会话
- 协调并发请求
- 调度任务执行顺序
它采用了一个关键设计:Lane-based Command Queue(基于 Lane 的队列模型)。
每个会话有自己的队列(lane),默认串行执行;只有被明确标记为“低风险”的任务,才允许并行(定时任务)。
这背后的理念是「Default to Serial,Parallel by Exception」。
与到处async/await方式对比,这种方式的优势是:
- 日志更清晰
- 状态更可控
- 几乎避免竞态条件
这与Cognition在《不要构建多代理》中的见解一致。
多数Agent系统失败,并不是模型不行,而是并发失控。
3. Agent运行器(Agent Runner)
这是AI实际发挥作用的地方,系统开始组装一次思考。
- 确定使用哪个模型,选择API密钥(如果无效则将配置文件标记为冷却状态并尝试下一个),如果主要模型失败则回退到不同的模型
- 动态地组装系统提示
- 注入可用的工具、技能、记忆
- 然后添加会话历史(来自.jsonl文件)
这是接下来传递给上下文窗口守护程序,确保有足够的上下文空间。如果上下文快满了,它要么自动压缩会话(总结上下文),要么优雅的失败。
4. LLM API调用
统一封装不同模型提供商:
- LLM调用本身会流式传输响应
- 如果模型支持,还可以请求扩展思考(extended thinking)
- 支持失败自动切换模型
5. Agent循环(Agentic Loop)
如果LLM返回一个工具调用响应,OpenClaw将在本地执行它并将结果添加到对话中。
这是一个典型的循环模式,直到LLM返回最终文本或达到最大回合数(默认约20回合)。
这也是令大家aha moment的魔法:Computer Use(下文详细介绍)。
6. Response Path(响应与持久化)
响应结果发回给用户,同时也将过程写入.jsonl进行持久化,每行是一个包含用户消息、工具调用、结果、响应等的JSON对象。
这是OpenClaw调试依据,也是会话级记忆。
3. 记忆系统:刻意保持简单
OpenClaw有两种记忆系统。
(1)会话日志(JSONL)
(2)长期记忆(Markdown文件),位于MEMORY.md或memory/文件夹中
搜索方式是混合搜索,结合了向量搜索(语义)和关键词匹配,融合了两种方法的优势。
举个例子:
搜索“身份验证漏洞(authentication bug)”时,既能找到提到“登录问题(auth issues)”的语义匹配文档,同时也能通过关键词匹配到包含该精确短语的文档。
技术上实现上,向量搜索使用SQLlite,关键词搜索使用FTS5,后者也是SQLite的扩展。其中,向量检索的Embedding模型允许自定义供应商。
此外,它还受益于**智能同步(Smart Synching)功能,该功能在文件监视器(File Watcher)**监测到文件变化时触发。
这些Markdown文件是由Agent本身使用标准的write文件工具生成的,并没有专门的“记忆写入API”,Agent只是简单地写入到memory/*.md中。
每当开始新的对话,一个钩子(Hook)会抓取之前的对话内容,并写入一个Markdown格式的摘要。
由此可见,OpenClaw的记忆系统设计的非常简单。没有记忆合并,也没有每月/每周的记忆压缩。
这种简单性可能是优势也可能是陷阱,作者的态度是:与其做复杂但难以解释的记忆系统,不如选择简单可控的方案。
我认为从长期数据治理角度来看,当前的策略还是太简单了。
4. OpenClaw的利爪:操控你的电脑
这是令用户感到欣喜的点,你给它一台电脑,它可以帮你做很多事。
OpenClaw赋予了Agent极高的电脑访问权限,风险由用户自负。
它使用执行工具在以下环境中运行Shell命令:
- 沙盒:默认选项,命令在Docker容器中运行
- 宿主机:直接在你的主机上操作
- 远程设备:在远程设备上运行
除此之外,OpenClaw还具有文件系统的读取/写入/编辑、操作浏览器(playwrite+语义快照)、进程管理等工具。
其中,浏览器工具不是使用截图,而是一种基于文本的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"
浏览网站,本质是结构理解,而不一定是视觉任务。
一张截图大小5MB,但语义快照大小<50KB,是图像token成本的几分之一。
由此可见,通过语义树方式,非常节省token成本,而且更稳定更适合推理。
补充一点,OpenClaw 的执行工具链并不仅限于简单的 Shell / 文件系统,还包括:
- 与 Calendar、邮件、API 等整合流程
- 批处理与条件触发任务
- 子 Agent 管理和多任务调度(多 Agent 路由)
这些体系让它不再只是简单“执行命令”,而是能做复杂工作流。
5. 安全机制:权限可控,而非绝对安全
OpenClaw的安全哲学是:让用户决定Agent能做多大程度的事。
与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 substitutioncat file > /etc/hosts # redirectionrm -rf / || echo "failed" # chained with ||(sudo rm -rf /) # subshell
安全机制非常类似于Claude Code,其核心理念是:“在用户允许的范围内,赋予Agent尽可能高的自主权”。
6. 心跳机制:自驱性与活人感
补充一点Hesam没有提到的,但我认为是小龙虾出圈非常重要的亮点——心跳机制(Heartbeat)。
它允许Agent自动“醒来”,不只是被动响应用户指令,还能主动在预定时间或条件下执行任务。
其工作机制如下:
- 心跳机制根据一个配置(如every/activeHours)定时运行任务;
- OpenClaw会在本地生成一个检查列表(比如HEARTBEAT.md),记录需要定期执行的动作;
- 每次心跳触发时,系统会读取这些任务清单并执行相应的技能或检查;
{ "agent": { "heartbeat": { "every": "30m", "activeHours": { "start": "08:00", "end": "22:00" } } }}
OpenClaw的心跳机制本质上是一种周期性事件的调度机制,与Cron(定时任务)类似但更智能。
比如小龙虾可以定期帮我检查邮件中是否有紧急信息,只有在有紧急信息才提醒我,是个有脑子的得力助手。
心跳机制使Agent成为真正的“自驱助手”,而不是被动响应工具,不仅能持续监控,而且主动化决策让OpenClaw非常具有活人感。