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

问题驱动型:你还在为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 工作流
- 安装与初始化(需 Node 22+):
bash
## 全局安装(pnpm 更推荐,monorepo 友好)
pnpm add -g moltbot@latest
## 运行向导:自动创建 ~/clawd/、生成密钥、注册系统服务
moltbot onboard --install-daemon
- 启动网关并接入 WhatsApp:
bash
## 启动本地中枢,开启 WebSocket 控制平面
moltbot gateway --port 18789 --verbose
## 扫码绑定 WhatsApp(首次运行会输出 QR code)
## 绑定后,所有 WhatsApp 消息自动路由至 gateway
- 发送首条指令并触发设备操作:
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 -la、chmod、甚至 rm -rf。
踩坑指南:龙虾的倔强,你得提前知道
- Node 版本陷阱:
moltbot要求 Node ≥22,因为用了WebTransport(实验性 API)和fs.cpSync。node -v输出v20.15.0?直接报错ERR_MODULE_NOT_FOUND。解决方案:用nvm install 22 && nvm use 22; - macOS 权限弹窗:首次调用
camera或microphone,系统会弹出「允许 Moltbot 访问相机」——这不是 bug,是 Gatekeeper 强制校验。必须手动点击「打开系统设置→隐私与安全性→相机→勾选 Moltbot」; - Tailscale 登录失败:若
moltbot gateway --tailscale报auth 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!
蜕壳不是为了更漂亮,而是为了长出新的附肢,去够那些旧壳永远碰不到的星辰。