Clawdbot 架构解析:它是如何工作的

0 阅读6分钟

本文从内部视角介绍 Clawdbot(又称 Moltbot)的架构,包括代理执行、工具调用、浏览器交互等机制,并提炼对 AI 工程师有价值的经验。

理解 Clawd 的实现原理有助于更好地把握系统能力边界,尤其是它擅长什么不擅长什么。本文源于对 Clawd 记忆机制与可靠性的好奇,将从表层梳理 Clawd 的工作方式。


Clawd 的技术本质

Clawd 常被描述为可本地运行或通过模型 API 使用的个人助手,在手机等设备上即可访问。那它本质上是什么?

Clawdbot 的核心是一个 TypeScript 编写的 CLI 应用。

它不是 Python、Next.js 或 Web 应用,而是一个进程,负责:

  • 在本地运行并暴露 Gateway Server,统一处理各渠道连接(Telegram、WhatsApp、Slack 等)
  • 调用 LLM API(Anthropic、OpenAI、本地模型等)
  • 在本地执行工具
  • 按你的需求在电脑上完成各类操作

整体架构

下面用「从你发出一条消息到收到回复」的完整链路,说明架构是如何运转的。

art.jpeg

当你在某个 Messenger 里向 Clawd 发消息时,会发生什么?

1. Channel Adapter(渠道适配器)

Channel Adapter 接收你的消息并做预处理(归一化、提取附件等)。不同 Messenger 和输入流有各自的适配器。

2. Gateway Server(网关服务器)

Gateway Server 是任务/会话协调中心,接收消息并分发给对应会话,是 Clawd 的核心。它需要处理大量并发请求。

串行化操作,Clawd 使用基于 Lane 的命令队列:每个会话有独立 Lane,低风险、可并行的任务可在并行 Lane 中执行(如 cron 任务)。

这与「到处 async/await」的做法形成对比:过度并行会损害可靠性并带来大量调试问题。

原则:默认串行,仅在明确安全时并行。

若你做过 Agent 开发,对此会有体会;Cognition 的《Don't Build Multi-Agents》也强调了这一点。每个 Agent 简单 async 一把梭,很容易得到交错混乱的日志;若共享状态,竞态会成为开发中的常态。Lane 是对队列的抽象,串行是默认架构,而不是事后补救。开发者只需写业务逻辑,队列负责避免竞态;心智从「要锁什么?」变成「什么可以安全并行?」。

3. Agent Runner(代理运行器)

这里才真正接入 AI。Agent Runner 会:

  • 决定使用哪个模型、选用哪个 API Key(若都不可用则标记该 profile 进入 cooldown 并尝试下一个)
  • 主模型失败时回退到其他模型
  • 动态组装系统提示:包含可用工具、技能、记忆,再附上会话历史(来自 .jsonl 文件)
  • 将组装好的内容交给 Context Window Guard,检查上下文是否足够;若接近满则压缩会话(如总结)或优雅失败

4. LLM API 调用

真正的 LLM 调用在这里完成:流式返回结果,并对不同提供商做统一抽象;若模型支持,还可请求扩展思考(extended thinking)。

5. Agentic Loop(代理循环)

若 LLM 返回的是工具调用,Clawd 在本地执行该工具并把结果追加到对话中,然后继续请求 LLM。如此循环,直到 LLM 返回最终文本或达到最大轮数(默认约 20)。

这里也是 Computer Use 等能力的实现位置(后文会展开)。

6. Response Path(响应路径)

响应经渠道返回给你;会话通过 JSONL 持久化,每行一个 JSON 对象(用户消息、工具调用、结果、回复等)。这就是 Clawd 的会话级记忆

以上是基础架构。下面深入几个关键组件。


Clawd 如何记忆

没有合适的记忆系统,AI 助手和「金鱼记忆」差不多。Clawd 通过两套机制实现记忆:

  1. 会话记录:如上所述,用 JSONL 保存会话。
  2. 记忆文件:以 Markdown 形式存放在 MEMORY.mdmemory/ 目录下。

检索采用 向量搜索 + 关键词匹配 的混合方式,兼顾语义与精确匹配。例如搜 "authentication bug" 既能命中写「auth 相关问题」的文档(语义),也能命中包含该精确短语的文档(关键词)。

  • 向量搜索基于 SQLite;关键词搜索用 FTS5(SQLite 扩展)。
  • 嵌入模型/提供商可配置。
  • Smart Syncing:文件变更时由 file watcher 触发同步。

这些 Markdown 记忆由 Agent 通过普通的「写文件」工具生成,没有专门的 memory-write API,Agent 只是往 memory/*.md 写。新会话开始时,一个 hook 会抓取上一轮对话并写出摘要到 Markdown。

Clawd 的记忆设计相当简单,与 CamelAIOrg 中的 workflow memories 思路接近:不做记忆合并,不做按月/按周的压缩。这种简单可以是优势也可以是局限,但作者倾向于「可解释的简单」而非复杂纠缠。记忆长期保留,旧记忆权重与新区分不大,可以说没有遗忘曲线


Clawd 的「爪子」:如何使用你的电脑

Clawd 的一大护城河是:你给它一台电脑,它就真的能用。具体方式大致如下。

Clawd 在用户自担风险的前提下,给 Agent 较高的电脑权限。它通过 exec 工具在以下环境执行 shell 命令:

  • Sandbox(默认):在 Docker 容器中执行
  • 宿主机:直接在主机上执行
  • 远程设备:在指定远程机器上执行

此外还有:

  • 文件系统工具:读、写、编辑文件
  • 浏览器工具:基于 Playwright,配合语义快照(见下节)
  • 进程管理:长时间后台命令、结束进程等(process 相关工具)

安全机制(或说「有意为之的有限安全」)

类似 Claude Code,存在命令审批列表:用户可对命令选择「本次允许」「始终允许」或「拒绝」并会收到提示。

配置示例(~/.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 的本地安全模型类似:在用户允许的范围内尽量给 Agent 自主权


浏览器:语义快照(Semantic Snapshots)

浏览器工具主要不依赖截图,而是使用 语义快照:基于页面无障碍树(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 成本。


小结

  • Clawdbot 是 TypeScript CLI,通过 Gateway、Lane 队列、Agent Runner 和 Agentic Loop 串联起渠道、模型与工具。
  • 记忆依赖 JSONL 会话 + Markdown 记忆文件,检索用向量 + 关键词,设计简单、可解释。
  • 电脑使用依赖 exec / 文件 / 浏览器 / 进程 等工具,配合审批列表与危险构造拦截,在安全与自主之间做权衡。
  • 浏览器能力建立在 语义快照 上,节省 token 并更利于推理。

若你关心「一个可本地跑、多渠道、能真正用电脑的 Agent 是怎么搭出来的」,Clawd 的架构是一个很好的参考样本。