找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1194

积分

0

好友

152

主题
发表于 昨天 04:03 | 查看: 1| 回复: 0

Clawdbot 项目概览界面

Clawdbot 是一个开源的本地优先个人 AI 助手项目,设计目标是让用户在自有设备上运行一个完全可控的智能助手。项目在 GitHub 上热度颇高,拥有超过 15.4k 的星标,采用宽松的 MIT 开源协议。

它的核心理念是 “Local-first”,所有控制逻辑与数据都运行在用户自己的设备上,不依赖云端服务。它支持连接 WhatsApp、Telegram、Slack、Discord、Google Chat、Signal、iMessage、Microsoft Teams 等数十个主流消息平台,并通过一个统一的控制平面进行管理。

本文将深入代码层面,拆解 Clawdbot 的技术实现原理,重点关注其模块化架构设计与核心模块的实现细节。

整体架构

Clawdbot 的代码仓库位于 https://github.com/clawdbot/clawdbot。项目主要使用 TypeScript 编写,运行时要求 Node.js 版本 ≥22,并采用 pnpm 作为包管理器,代码结构清晰,模块化程度很高。

项目主要编程语言使用比例图表

src/ 目录的组织来看,系统主要由以下核心模块构成:

模块目录 功能职责
src/gateway/ WebSocket 控制平面,管理连接、会话、配置和事件
src/agents/ AI 代理运行时,处理消息并调用 LLM 和工具
src/channels/ 多渠道消息适配器,对接不同的通信平台
src/browser/ 浏览器控制模块,通过 CDP 协议控制 Chrome
src/canvas-host/ Canvas 渲染服务,托管 A2UI 可视化界面
src/nodes/ 设备节点管理,与 iOS/Android/macOS 应用通信
src/cli/ 命令行界面,提供用户交互入口
src/config/ 配置管理系统
src/sessions/ 会话管理,维护对话上下文

这些模块通过 Gateway 这个中心枢纽进行协调。所有客户端(CLI、macOS 应用、移动应用)都通过 WebSocket 连接到 Gateway,再由 Gateway 负责将请求路由到对应的处理模块。

项目 package.json 依赖项列表截图

Gateway 控制平面实现

启动机制

Gateway 的启动逻辑在 src/gateway/boot.ts 文件中。这里有一个巧妙的设计:系统启动时会检查工作目录下是否存在 BOOT.md 文件。如果文件存在且内容不为空,则会将其内容作为指令交给 Agent 执行。

src/gateway/boot.ts 中的核心函数 runBootOnce 实现了以下逻辑:

export async function runBootOnce(params: {
  cfg: ClawdbotConfig;
  deps: CliDeps;
  workspaceDir: string;
}): Promise<BootRunResult>

该函数首先调用 loadBootFile 函数读取 BOOT.md 文件:

async function loadBootFile(
  workspaceDir: string,
): Promise<{ content?: string; status: "ok" | "missing" | "empty" }>

如果文件存在且非空,则会构建一个特殊提示词,并通过 agentCommand 函数(位于 src/commands/agent.js)将任务提交给 Agent 执行。这意味着用户可以通过编辑一个 Markdown 文件来定义启动时需要自动执行的任务。

函数返回值类型定义如下:

export type BootRunResult =
  | { status: "skipped"; reason: "missing" | "empty" }
  | { status: "ran" }
  | { status: "failed"; reason: string };

WebSocket 服务

Gateway 的 WebSocket 服务器实现位于 src/gateway/server/ 目录。从结构看,包含几个关键部分:

  • src/gateway/server-methods/ - 定义了各种 RPC 方法的处理逻辑
  • src/gateway/protocol/ - 定义了通信协议的数据结构
  • src/gateway/auth.ts - 实现了连接认证逻辑

Gateway 通过 WebSocket 提供实时双向通信能力。客户端连接后,可以发送如 agent:runconfig:getsession:send 等类型的消息,Gateway 会根据消息类型将请求分发到对应的处理函数。

认证与安全

src/gateway/auth.ts 文件实现了连接认证机制。客户端尝试建立 WebSocket 连接时必须提供有效的认证凭证,只有通过验证的连接才会被接受。

此外,src/gateway/device-auth.ts 文件处理设备级别的认证,确保只有授权的设备可以连接到 Gateway。

Agent 运行时实现

Pi Agent 架构

Agent 的核心实现位于 src/agents/ 目录,这里包含了完整的 AI 代理运行时,被称为 Pi Agent

关键子目录包括:

  • src/agents/pi-embedded-runner/ - Pi Agent 的嵌入式运行器
  • src/agents/pi-embedded-helpers/ - 运行时辅助函数
  • src/agents/pi-extensions/ - Agent 扩展机制
  • src/agents/tools/ - 工具集合
  • src/agents/skills/ - 技能系统
  • src/agents/sandbox/ - 沙箱隔离环境

Agent 的标准工作流程是:接收用户消息 → 构建包含工具列表的提示词 → 调用 LLM → 解析 LLM 响应 → 执行工具调用 → 将结果反馈给 LLM → 循环直到任务完成。

认证配置管理

src/agents/auth-profiles/ 目录实现了多认证配置管理。Clawdbot 支持同时配置多个 LLM 提供商(如 Anthropic、OpenAI)的认证信息,并在运行时根据配置动态选择。

相关文件包括:

  • src/agents/auth-health.ts - 检查认证配置的健康状态
  • src/agents/auth-profiles.*.test.ts - 认证配置的测试用例

沙箱机制

src/agents/sandbox/ 目录实现了代码执行的沙箱隔离。当 Agent 需要执行可能存在风险的操作时,这些操作会在隔离的 Docker 容器中进行。

项目根目录下的 Dockerfile.sandboxDockerfile.sandbox-browser 定义了两类沙箱容器:

  • Dockerfile.sandbox - 通用的代码执行沙箱
  • Dockerfile.sandbox-browser - 带有浏览器环境的沙箱,用于需要操作网页的任务

多渠道通信系统

插件化架构

Clawdbot 对多平台消息的支持通过插件化架构实现,核心代码在 src/channels/plugins/ 目录下。每个消息平台都有对应的插件实现。

插件目录结构清晰:

  • src/channels/plugins/actions/ - 渠道操作定义
  • src/channels/plugins/agent-tools/ - 渠道相关的 Agent 工具
  • src/channels/plugins/normalize/ - 消息标准化处理
  • src/channels/plugins/onboarding/ - 渠道引导流程
  • src/channels/plugins/outbound/ - 出站消息处理
  • src/channels/plugins/status-issues/ - 状态问题处理

关键文件包括:

  • src/channels/plugins/catalog.ts - 插件注册表
  • src/channels/plugins/config-schema.ts - 插件配置模式定义
  • src/channels/plugins/channel-config.ts - 渠道配置管理

消息标准化

src/channels/plugins/normalize/ 目录负责将不同平台的原生消息格式转换为统一的内部表示。这样,后端的 Agent 和 Gateway 只需要处理标准化的消息对象,无需关心消息具体来自哪个平台。

安全控制

src/channels/allowlists/ 目录实现了白名单机制。相关文件包括:

  • src/channels/allowlist-match.ts - 白名单匹配逻辑
  • src/channels/mention-gating.ts - 提及门控(在群组中需要 @ 机器人它才响应)
  • src/channels/command-gating.ts - 命令门控

src/pairing/ 目录则实现了私信配对机制。当陌生用户首次发送私信时,系统会生成一个配对码,只有管理员批准后,该用户才能正常使用机器人功能。

浏览器控制实现

CDP 协议封装

浏览器控制功能位于 src/browser/ 目录,其核心实现基于 Chrome DevTools Protocol (CDP)。

关键文件包括:

  • src/browser/cdp.ts - CDP 协议的核心封装
  • src/browser/cdp.helpers.ts - CDP 辅助函数
  • src/browser/chrome.ts - Chrome 浏览器启动和管理
  • src/browser/chrome.executables.ts - Chrome 可执行文件路径查找

src/browser/cdp.ts 负责通过 WebSocket 连接到浏览器的调试端口,并发送 CDP 命令来控制浏览器行为。

浏览器操作

src/browser/client-actions.ts 及相关文件定义了丰富的浏览器操作:

  • src/browser/client-actions-core.ts - 核心操作(导航、点击、输入等)
  • src/browser/client-actions-observe.ts - 页面观察和数据提取
  • src/browser/client-actions-state.ts - 浏览器状态管理
  • src/browser/client-actions-types.ts - 操作类型定义

配置文件管理

src/browser/profiles.tssrc/browser/profiles-service.ts 实现了浏览器配置文件的管理。每个会话可以使用独立的浏览器配置文件,从而保持 Cookie 和登录状态的隔离。

Canvas 可视化系统

Canvas 功能位于 src/canvas-host/ 目录。这个模块实现了 A2UI(Agent-to-UI) 协议的渲染服务。

A2UI 是一个将 Agent 内部状态和工作流程可视化的协议。Agent 可以通过发送 A2UI 指令来动态更新 Canvas 上的内容,实现实时的可视化交互。

项目还在 vendor/a2ui/ 目录下包含了 A2UI 渲染器的供应商代码,用于在 macOS、iOS 等客户端应用中渲染 Canvas 内容。

节点系统实现

节点管理

src/nodes/ 目录实现了设备节点的管理。这里的“节点”指的是运行在 macOS、iOS、Android 上的伴侣应用,它们通过 WebSocket 连接到中心 Gateway,从而为 Agent 提供访问设备原生能力(如通知、地理位置等)的通道。

src/node-host/ 目录则包含了节点主机服务,负责管理与各个节点的连接和通信。

跨平台应用

项目包含了多平台的原生应用实现:

  • apps/ 目录 - 包含了各平台应用的项目文件
  • Swabble/ 目录 - 移动应用的核心代码(Swift 实现)

从项目根目录的 .swiftformat.swiftlint.yml 配置文件可以确认,移动端采用 Swift 语言开发。

工具系统实现

工具目录结构

src/agents/tools/ 目录包含了 Agent 可用的所有工具实现,文件数量超过 50 个,涵盖了从底层系统操作到高层业务处理的完整工具链。

src/agents/tools 工具目录文件列表

工具按功能可大致分为以下几类:

浏览器控制工具browser-tool.ts 是核心实现,配合 browser-tool.schema.ts 定义了工具的输入输出规范。它封装了 src/browser/ 目录下的 CDP 协议实现,为 Agent 提供页面导航、元素操作、截图等能力。

可视化工具canvas-tool.ts 实现了 A2UI 协议的 Canvas 操作接口。

定时任务工具cron-tool.ts 提供了定时任务的创建和管理能力。

会话管理工具:包含 sessions-list-tool.ts(列出会话)、sessions-send-tool.ts(发送消息)、sessions-history-tool.ts(查询历史)、sessions-spawn-tool.ts(创建新会话)、session-status-tool.ts(查询状态)等,提供了完整的会话操作能力。

网络工具web-fetch.ts 实现网页内容抓取,web-search.ts 提供网页搜索能力。相关测试文件如 web-fetch.ssrf.test.ts 针对 SSRF 攻击进行了安全测试。

节点控制工具nodes-tool.ts 是与设备节点通信的接口,Agent 可通过它调用运行在 iOS/Android/macOS 上的原生功能。

平台特定操作:例如 discord-actions.ts 及其子模块提供了 Discord 平台的服务器管理、消息操作和审核功能。类似的还有 slack-actions.tstelegram-actions.tswhatsapp-actions.ts

多媒体工具image-tool.ts 提供图像处理能力,tts-tool.ts 实现文本转语音功能。

系统工具gateway-tool.ts 允许 Agent 查询和修改 Gateway 配置,memory-tool.ts 提供会话记忆功能,agents-list-tool.ts 可以列出所有可用 Agent。

浏览器工具深入分析

src/agents/tools/browser-tool.ts 的实现很好地展示了工具系统的设计模式。该文件定义了关键类型:

type BrowserProxyFile = {
  path: string;
  base64: string;
  mimeType?: string;
};

type BrowserNodeTarget = {
  nodeId: string;
  label?: string;
};

核心函数 resolveBrowserNodeTarget 实现了浏览器目标解析逻辑,支持多种目标类型:

  • sandbox:在沙箱容器中的浏览器
  • host:在主机上运行的浏览器
  • custom:自定义浏览器实例
  • node:在远程设备节点上的浏览器

当 Agent 调用浏览器工具时,系统会根据配置和节点状态决定使用哪个浏览器实例。如果指定了 requestedNode 参数,工具会检查该节点是否连接且支持浏览器功能,然后将操作代理到该节点执行。这意味着 Agent 可以直接控制运行在用户手机上的浏览器,实现真正的跨设备自动化操作。

技能系统实现

技能系统架构

src/agents/skills/ 目录实现了一个完整的技能管理系统。技能是对基础工具的高级封装,它将多个工具调用和特定的提示词模板组合成面向具体任务的、可复用的能力单元。

技能目录 (skills) 结构截图

核心文件包括:

  • 配置和类型定义config.ts 管理技能配置,types.ts 定义类型结构,frontmatter.ts 解析技能文件中的 Markdown frontmatter 元数据。
  • 技能加载机制bundled-dir.ts 管理内置技能,plugin-skills.ts 处理插件技能加载,workspace.ts 管理用户自定义技能。
  • 动态刷新refresh.ts 实现了技能的动态刷新,允许在运行时重新加载技能而无需重启系统。
  • 序列化serialize.ts 负责将技能定义序列化为 Agent 可理解的格式。
  • 环境配置env-overrides.ts 允许技能通过环境变量覆盖默认配置。

三层技能体系

从测试文件的命名可以推断,Clawdbot 实现了三层技能体系:

  1. Bundled Skills(内置技能):随项目一起发布,存储在特定目录中。
  2. Plugin Skills(插件技能):通过 plugin-skills.ts 加载的外部技能包,可通过包管理器安装以扩展系统能力。
  3. Workspace Skills(工作空间技能):用户在自己工作空间中创建的自定义技能,具有最高优先级,会覆盖同名的插件技能和内置技能。

技能的构建和执行

测试文件揭示了技能系统的工作流程:

  • skills.buildworkspaceskillcommands.test.ts:测试将技能转换为 Agent 可调用命令的过程。
  • skills.buildworkspaceskillsnapshot.test.ts:测试技能快照功能,用于保存和恢复技能状态。
  • skills.resolveskillspromptforrun.test.ts:测试技能提示词解析。当执行技能时,系统会根据技能定义和当前上下文,构建一个包含详细指令和可用工具列表的完整提示词。
  • skills.build-workspace-skills-prompt.syncs-merged-skills-into-target-workspace.test.ts:显示系统支持将多个来源的技能合并同步到目标工作空间。

对这类复杂的技能系统与插件架构感兴趣?你可以在 开源实战 板块找到更多关于热门项目架构分析与最佳实践的深度内容。

沙箱系统实现

沙箱架构

src/agents/sandbox/ 目录实现了基于 Docker 的沙箱隔离系统,确保 Agent 执行的代码和工具调用不会威胁主机安全。

核心文件分层清晰:

  • Docker 集成层docker.ts 封装 Docker API 调用,types.docker.ts 定义相关类型。
  • 配置管理层config.ts 定义配置选项,config-hash.ts 通过计算配置哈希值来确保环境一致性。
  • 运行时管理层manage.ts 管理生命周期,runtime-status.ts 查询状态,context.ts 维护执行上下文,registry.ts 管理沙箱实例注册表。
  • 浏览器支持层browser.ts 集成沙箱内浏览器,browser-bridges.ts 提供桥接机制。
  • 安全策略tool-policy.ts 定义工具使用策略,规定哪些工具可在沙箱内执行。

沙箱工作流程

当 Agent 需要执行需隔离的操作时(如运行用户提供的代码),系统会:

  1. 计算当前配置哈希值。
  2. 查找是否已有匹配的沙箱实例。
  3. 若不存在,则创建新的 Docker 容器。
  4. 挂载必要的文件和目录。
  5. 在容器内执行操作。
  6. 监控执行状态。
  7. 操作完成后,根据策略决定是否销毁容器。

安全机制

沙箱系统的安全性体现在多方面:进程隔离、网络隔离、文件系统隔离、资源使用限制以及通过 tool-policy.ts 实施的工具执行策略。

开发工具链

包管理

项目使用 pnpm 作为包管理器,pnpm-workspace.yaml 文件定义了工作空间配置,支持 Monorepo 结构。

package.json 中定义了完整的构建和开发脚本:

{
  "scripts": {
    "dev": "node scripts/run-node.mjs",
    "build": "tsc -p tsconfig.json && ...",
    "ui:build": "node scripts/ui.js build",
    "gateway:watch": "tsx watch src/cli/entry.ts gateway",
    "test": "vitest"
  }
}

代码质量工具

项目使用一系列现代化工具保证代码质量:

  • Oxlint (.oxlintrc.json) - 基于 Rust 的高性能代码检查工具。
  • Oxfmt (.oxfmtrc.jsonc) - 代码格式化工具。
  • detect-secrets (.detect-secrets.cfg) - 密钥泄露检测。
  • shellcheck (.shellcheckrc) - Shell 脚本检查。
  • swiftlint (.swiftlint.yml) - Swift 代码检查。

测试体系

项目建立了完善的测试体系,包含多个 Vitest 配置文件:vitest.unit.config.ts(单元测试)、vitest.e2e.config.ts(端到端测试)、vitest.gateway.config.ts(Gateway 专项测试)等。从 src/ 目录下大量的 .test.ts 文件可以看出,测试覆盖率很高。

部署方案

Docker 部署

项目提供了完整的 Docker 部署方案,包括 Dockerfile(主应用镜像)、docker-compose.ymldocker-setup.sh 设置脚本。

云平台部署

fly.toml 文件提供了 Fly.io 平台的部署配置,用户可以将 Gateway 部署到云端以实现远程访问。

总结

Clawdbot 是一个架构清晰、模块化程度极高的个人 AI 助手项目。通过代码分析,可以总结出其技术特点:

  • 架构设计:采用中心化 Gateway 控制平面,各模块通过 WebSocket 与其通信,实现松耦合。
  • 插件化:渠道、工具、技能均采用插件化设计,扩展性强。
  • 安全机制:通过沙箱隔离、白名单、配对机制等实现多层防护。
  • 跨平台能力:通过节点系统和原生应用,实现跨 macOS、iOS、Android 的设备控制。
  • 工程实践:使用 pnpm、Oxlint、Vitest 等现代化工具链,建立了完善的测试和自动化流程。

从工程角度看,Clawdbot 是一个质量很高的开源项目,其设计思路与实现方式,尤其是在 Node.js 技术栈上的应用,值得开发者深入研究和借鉴。如果你想了解更多关于系统架构设计的知识,可以关注 后端 & 架构 相关内容。

对于希望深入研究或自行部署的开发者,详细查阅项目的 技术文档 和官方指南是必不可少的一步。此外,欢迎在 云栈社区 与其他开发者交流关于 AI 助手实现的心得与挑战。


附:项目核心依赖包简介

生产依赖 (dependencies) 选摘

依赖包 用途
@aws-sdk/client-bedrock AWS Bedrock AI 模型服务客户端
@grammyjs/runner Telegram 机器人框架运行器
@slack/bolt Slack 机器人框架
@whiskeysockets/baileys WhatsApp Web 客户端库
chromium-bidi Chromium BiDi 协议实现(浏览器自动化)
express / hono Web 应用框架
playwright-core 浏览器自动化核心库
ws WebSocket 客户端/服务器库
zod TypeScript 模式验证库

开发依赖 (devDependencies) 选摘

依赖包 用途
oxlint / oxfmt Rust 编写的 JS/TS 代码检查与格式化工具
tsx TypeScript 执行器
vitest 单元测试框架
wireit 构建任务编排工具



上一篇:Git版本控制全面指南:从核心原理到团队协作实践
下一篇:掌握3个Flexbox核心布局模式,告别响应式设计烦恼
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-6 06:10 , Processed in 0.435906 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表