研究了 Clawdbot 的架构,包括它如何处理 Agent 执行、工具调用、浏览器操作等。对于 AI 工程师来说,这里有很多值得学习的地方。
深入了解 Clawd 的底层原理,能让你更好地理解这个系统的能力边界,最重要的是,搞清楚它擅长什么以及不擅长什么。
这篇文章始于我个人的好奇心:Clawd 是如何处理内存的?它的可靠性究竟如何?在此,我将带你揭开 Clawd 运作机制的表层。
Clawd 在技术上究竟是什么?
大家都知道 Clawd 是一个个人助理,你可以在本地运行,也可以通过模型 API 在手机上轻松访问。但它的本质是什么?
从核心来看,Clawdbot 是一个 TypeScript CLI 应用程序。它不是 Python,不是 Next.js,也不是一个网页应用。它是一个:
运行在你机器上的进程,并暴露一个 网关服务器(Gateway Server) 来处理所有频道连接(Telegram, WhatsApp, Slack 等)。调用 LLM API(Anthropic, OpenAI, 本地模型等)。在本地执行工具。根据你的指令操控电脑。
1. 频道适配器 (Channel Adapter)
适配器接收你的消息并进行预处理(标准化格式、提取附件)。不同的通讯软件和输入流都有对应的专用适配器。
2. 网关服务器 (Gateway Server)
网关服务器是任务/会话协调器,负责接收你的消息并将其分发到正确的会话中。它是 Clawd 的核心,能够处理多个重叠的请求。
为了使操作 序列化,Clawd 使用了一种 基于'泳道'(lane)的命令队列。每个会话都有其专属的泳道,而一些低风险的可并行任务(如定时任务 cron jobs)则在并行泳道中运行。
这与使用混乱的 async/await(异步逻辑乱象)形成了鲜明对比。过度并行会损害系统的可靠性,并带来海量的调试噩梦。
默认串行,显式并行
如果你开发过智能体(Agent),可能已经在某种程度上意识到这一点了。这也是 Cognition 在其《不要构建多智能体》(Don't Build Multi-Agents)博文中所表达的核心见解。
如果为每个智能体仅进行简单的异步设置,最终你会得到一堆交织在一起的垃圾信息。日志将变得不可读,而且如果它们共享状态,竞态条件(Race conditions) 将成为你在开发过程中必须时刻防范的恐惧。
'泳道'是对队列的一种抽象,它将 序列化 作为默认架构,而不是事后的补救措施。作为开发者,你只需编写逻辑代码,队列会自动为你处理竞态条件。
此时,你的心理模型将发生转变:从'我需要锁定(lock)什么?'变为'哪些任务是可以安全并行的?'。
3. Agent 运行器 (Agent Runner)
这是 AI 真正介入的地方。它负责确定使用哪个模型,挑选 API 密钥(如果所有密钥都失效,它会将该配置标记为'冷却'状态并尝试下一个),并在主模型失败时自动切换到备用模型。
智能体运行器会结合可用的工具、技能、记忆动态组装系统提示词(System Prompt),然后添加会话历史记录(来自 .jsonl 文件)。接着,这些内容会被传递给 上下文窗口守护者 (Context Window Guard),以确保有足够的上下文空间。如果上下文空间即将填满,它要么会压缩会话(总结上下文内容),要么会优雅地报错并停止。
4. LLM API 调用
LLM 调用本身支持流式响应,并对不同的供应商进行了抽象层封装。如果模型支持,它还可以请求 深度思考 (Extended Thinking)。
5. 智能体循环 (Agentic Loop)
如果 LLM 返回了工具调用(Tool Call)响应,Clawd 会在本地执行该操作并将结果添加到对话中。这个过程会不断重复,直到 LLM 给出最终的文本回复,或者达到了最大轮次限制(默认为 20 轮左右)。
这也是奇迹发生的地方:
电脑操作 (Computer Use):我稍后会详细介绍。
6. 响应路径 (Response Path)
这部分非常标准。响应通过频道(Channel)传回给你。同时,会话会持久化存储在一个基础的 文件中,每一行都是一个包含用户消息、工具调用、执行结果及模型响应的 JSON 对象。这就是 Clawd 的记忆方式()。


