Moltbot:不是AI助手,是AI操作系统

66 次阅读 0 点赞 0 评论 9 分钟原创开源项目

Moltbot以本地优先架构重构AI助手范式:所有数据驻留本机,15+消息平台统一网关,跨设备RPC节点(iOS/macOS/Android),Docker级沙箱隔离,Tailscale原生远程访问。TypeScript实现WebSocket+JSON-RPC轻量协议,A2UI Canvas替代WebView,真正把LLM当内核、设备当外设。

#ai-assistant #local-first #typescript #desktop-app #websocket #rpc #privacy-first
Moltbot:不是AI助手,是AI操作系统

问题驱动型:你还在为AI助手的数据主权焦虑吗?

上周五,我收到一封来自某知名AI助手服务商的邮件:「我们已升级隐私政策,您的对话历史将用于模型微调」。我盯着那句「可选择退出」看了三分钟——退出后功能降级、响应变慢、甚至部分工具不可用。这不是服务升级,是温柔的数字绑架。

更讽刺的是,我们天天教AI写「拒绝话术」,自己却连拒绝上传聊天记录的权限都没有。

Moltbot 就是在这个时刻撞进我视野的。它不谈「合规」「GDPR」「端侧推理」这些大词,只在 README 第一行写着:"Your own personal AI assistant. Any OS. Any Platform. The lobster way."

它用代码回答了一个问题:如果真要「自己的」AI助手,它该长什么样?


解决方案:把AI当内核,把设备当外设

Moltbot 的本质不是 ChatGPT 客户端,而是一套运行在本地的操作系统级抽象:

  • LLM 是内核(kernel):通过 agent.model 配置任意兼容 Anthropic/OpenAI/Ollama 的模型,不绑定供应商;
  • WhatsApp/Telegram/Discord 是终端(tty):所有通道统一接入 Gateway,消息收发走 WebSocket 控制平面(默认 localhost:18789);
  • macOS/iOS/Android 是设备驱动(driver)moltbot nodes camera snap 不是调 API,而是触发本地节点执行 AVCaptureSession
  • Canvas 是 GUI 子系统A2UI.push() 直接操作 <canvas>,无 WebView、无 Electron 主进程开销;
  • Tailscale 是网卡(NIC):远程访问无需暴露端口,自动建立 P2P mesh 网络。

它不追求「全平台兼容」,而是精准定义边界:Node.js ≥22、仅支持 macOS/iOS/Android(Windows 必须 WSL2)、拒绝任何云托管。这种「不妥协」,恰恰是主权的起点。


核心代码解析:从配置到沙箱,全是硬核设计

先看最简配置 .clawdbot/moltbot.json

json 复制代码
{
  "agent": {
    "model": "anthropic/claude-opus-4-5"
  }
}

没有 providers、没有 endpoints、没有 apiKeys——模型标识符直接透传给底层 runtime(实现在 packages/agent/src/runtime/anthropic.ts 中),由它动态 resolve endpoint 和 auth。这意味着:你换模型,只需改这一行,不用动任何胶水代码。

再看沙箱控制的核心逻辑(摘自 packages/gateway/src/sandbox/index.ts):

ts 复制代码
export const createSandbox = (session: Session) => {
  // main session 全权开放
  if (session.type === 'main') {
    return new HostSandbox(); // 直接 execSync, fs.promises, openBrowser()
  }
  
  // 非 main session 强制 Docker 沙箱
  return new DockerSandbox({
    image: 'moltbot/sandbox:latest',
    allowedTools: ['sessions_list', 'read', 'write'], // 白名单硬编码
    deniedTools: ['browser', 'canvas', 'nodes'] // 黑名单显式禁用
  });
};

注意:allowedTools 是白名单,不是配置项。源码里写死,想加新工具?必须改源码、重编译、重新签名。这反直觉的设计,恰恰堵死了「沙箱逃逸」的想象空间——安全不是靠配置,而是靠收敛。

最后看跨设备 RPC 的协议层(packages/nodes/src/protocol.ts):

ts 复制代码
// 所有节点通信基于 JSON-RPC over WebSocket
interface NodeRequest {
  jsonrpc: '2.0';
  method: 'camera.snap' | 'location.get' | 'microphone.record';
  params: Record<string, any>;
  id: string; // 用于 gateway 多路复用
}

// gateway 收到后,根据 deviceID 路由到对应节点
// iOS 节点用 Swift 实现 AVCaptureVideoDataOutputSampleBufferDelegate
// Android 节点用 Kotlin 实现 ImageReader.OnImageAvailableListener

它没用 gRPC 或 REST,因为 WebSocket 天然支持双向流和低延迟事件推送——拍完照立刻 push mediaId,比 HTTP 轮询快一个数量级。


实战演示:5 分钟构建你的私人 AI 工作流

  1. 安装与初始化(需 Node 22+):
bash 复制代码
## 全局安装(pnpm 更推荐,monorepo 友好)
pnpm add -g moltbot@latest

## 运行向导:自动创建 ~/clawd/、生成密钥、注册系统服务
moltbot onboard --install-daemon
  1. 启动网关并接入 WhatsApp
bash 复制代码
## 启动本地中枢,开启 WebSocket 控制平面
moltbot gateway --port 18789 --verbose

## 扫码绑定 WhatsApp(首次运行会输出 QR code)
## 绑定后,所有 WhatsApp 消息自动路由至 gateway
  1. 发送首条指令并触发设备操作
bash 复制代码
## 在 WhatsApp 里发:/status → 返回 token 使用量
## 在 CLI 发:让 AI 分析摄像头画面
moltbot nodes camera snap  # 返回 mediaId: "cam-abc123"
moltbot agent --message "What's in this image?" --mediaId cam-abc123

## 实时渲染结果到 macOS 菜单栏
moltbot canvas eval 'A2UI.push({type:"image", src:"data:image/jpeg;base64,..."})'

整个流程不经过任何第三方服务器。mediaId 对应的文件就躺在 ~/clawd/media/cam-abc123.jpg,你随时可以 ls -lachmod、甚至 rm -rf


踩坑指南:龙虾的倔强,你得提前知道

  • Node 版本陷阱moltbot 要求 Node ≥22,因为用了 WebTransport(实验性 API)和 fs.cpSyncnode -v 输出 v20.15.0?直接报错 ERR_MODULE_NOT_FOUND。解决方案:用 nvm install 22 && nvm use 22
  • macOS 权限弹窗:首次调用 cameramicrophone,系统会弹出「允许 Moltbot 访问相机」——这不是 bug,是 Gatekeeper 强制校验。必须手动点击「打开系统设置→隐私与安全性→相机→勾选 Moltbot」;
  • Tailscale 登录失败:若 moltbot gateway --tailscaleauth timeout,大概率是 Tailscale daemon 未运行。先执行 sudo tailscaled,再 tailscale up --login-server=https://login.tailscale.com
  • Discord pairing 失败moltbot pairing approve discord 123456 必须在 Discord 私聊窗口中等待 60 秒内完成。超时需重发 /pair 指令。

个人评价:它让我删掉了所有 SaaS AI 工具

作为写了 8 年 Java 安全中间件的老兵,我敢说 Moltbot 的权限模型比 Spring Security + OAuth2 + JWT 的组合还干净:

  • dmPolicy="pairing":零信任 DM,6 位验证码即凭证,无持久 token;
  • sandbox.mode: "non-main":沙箱粒度精确到 session,不是「全局开关」;
  • gateway.auth.mode: "password":Tailscale 远程访问密码明文存于 ~/.clawdbot/auth.json,但该文件权限为 600,且 gateway 启动时校验 stat().uid === process.getuid()

它不提供「企业版」「高级报表」「SSO 集成」——因为它的目标用户只有一个:那个愿意为数据主权多敲三行命令的极客。

EXFOLIATE! EXFOLIATE!

蜕壳不是为了更漂亮,而是为了长出新的附肢,去够那些旧壳永远碰不到的星辰。

最后更新:2026-01-30T10:01:33

评论 (0)

发表评论

blog.comments.form.loading
0/500
加载评论中...