小虾 Local Agent 架构设计:控制用户本地电脑

> 发布日期:2026-03-31 | 作者:Tony @ Jay's Lab

> 分类:私有报告 | 项目:xiaoxia.app

>

> 小虾从"云端容器托管"延伸到"本地代理执行"的架构设计方案。基于 Manus Desktop 的经验教训和 OpenClaw Node 的实战踩坑,设计一个轻量、安全、透明的本地 Agent。

1. 背景与动机

1.1 为什么需要本地 Agent?

小虾(xiaoxia.app)当前架构是纯云端:用户的 AI agent 运行在 K3s 托管的 Docker 容器中。但很多高价值场景需要访问用户本地环境

1.2 Manus Desktop 的先例

Manus 于 2026 年 3 月 17-18 日发布 Desktop App(Meta 收购后首个大动作),采用混合执行模型:

Manus 的问题(用户反馈):

1.3 OpenClaw Node 的经验

我们已有 OpenClaw Node 的实战经验(Mac mini 配对),踩过的关键坑:

问题经验
TLS 自签证书需要 `--tls-fingerprint` 跳过验证,用户体验差
SSH key 不匹配Mac mini 至今 SSH 连不上,但 Node system.run 正常
屏幕录制权限macOS 需给 Node 本体授权 + 重启服务才生效
exec-approvals需要手动改 JSON 文件,应做成 GUI
NAT 穿透Tailscale Peer Relay 才解决跨运营商延迟

2. 核心架构

2.1 总体设计


用户本地电脑                              小虾云端
┌──────────────────┐                  ┌───────────────┐
│  xiaoxia-agent    │◄── WebSocket ──►│  控制面 API     │
│  (轻量守护进程)     │   (出站连接)      │  + LLM 推理    │
│                   │                  │  + 任务调度     │
│  ├─ exec 模块      │                  │  + 用户 Dashboard│
│  ├─ fs 模块        │                  └───────────────┘
│  ├─ screen 模块    │
│  ├─ gui 模块       │
│  ├─ approval 模块  │
│  └─ heartbeat     │
└──────────────────┘

核心原则:本地只做执行,云端做决策。

Agent 本身不含任何 LLM,就是一个听指令干活的"手脚"。所有智能决策(任务分解、代码生成、错误分析)都在云端完成。

2.2 为什么 WebSocket 出站连接?

传统方案(如 SSH)需要云端主动连接用户电脑,面临:

WebSocket 出站连接天然解决所有问题:

2.3 与 Manus 的架构对比

维度Manus Desktop小虾 Agent
安装包大小200MB+ (Electron)**<10MB 单二进制**
技术栈Electron (Chromium 内核)**Go 原生编译**
连接方式未公开(推测 WebSocket)WebSocket 出站
LLM 位置云端云端
本地计算文件/终端/GUI/GPU文件/终端/GUI(v0.1)
权限模型不透明**三级权限 + 逐操作确认**
开源闭源**Agent 端开源**

3. 权限模型

3.1 三级权限体系

这是与 Manus 最大的差异化:完全透明的权限控制

级别名称能做什么默认状态
L1**只读**读文件、目录列表、系统信息、屏幕截图✅ 配对后默认
L2**标准**+ 写文件、执行命令(限白名单目录)需用户确认升级
L3**完全**+ 任意目录、GUI 控制、系统设置修改需用户手动开启

3.2 操作审批流程


云端发来命令: exec("npm install", cwd="~/projects/my-app")
        │
        ▼
┌─ 权限检查 ─┐
│ 当前级别: L2 │
│ 目录白名单:   │──── ~/projects/ ✅ 在白名单内
│ 命令白名单:   │──── npm ✅ 在白名单内
└──────────┘
        │
        ▼ 自动放行(L2 + 白名单匹配)
    执行命令

云端发来命令: exec("sudo apt install nginx")
        │
        ▼
┌─ 权限检查 ─┐
│ 当前级别: L2 │
│ sudo 命令   │──── ❌ 需要 L3 权限
└──────────┘
        │
        ▼ 弹出确认
┌────────────────────────────────┐
│ ☁️ 小虾想执行:                   │
│ sudo apt install nginx          │
│                                 │
│ ⚠️ 此操作需要管理员权限            │
│                                 │
│ [允许一次] [允许并升级到L3] [拒绝]  │
└────────────────────────────────┘

3.3 审计日志

所有操作记录在本地日志文件(用户可随时查看):


{
  "timestamp": "2026-03-31T11:30:00Z",
  "action": "exec",
  "command": "npm install",
  "directory": "~/projects/my-app",
  "approval": "auto_whitelist",
  "result": "success",
  "duration_ms": 12340
}

4. 通信协议

4.1 JSON-RPC 2.0 over WebSocket

选择 JSON-RPC 2.0 的原因:

4.2 消息类型

云端 → Agent:执行命令


{
  "jsonrpc": "2.0",
  "method": "exec",
  "params": {
    "command": "ls -la ~/Documents",
    "timeout_ms": 30000,
    "stream": true
  },
  "id": "task-001"
}

Agent → 云端:流式输出


{
  "jsonrpc": "2.0",
  "method": "output",
  "params": {
    "task_id": "task-001",
    "chunk": "total 128\ndrwxr-xr-x  5 jay  staff  160 Mar 31 10:00 .\n",
    "done": false
  }
}

Agent → 云端:需要用户审批


{
  "jsonrpc": "2.0",
  "method": "approval_required",
  "params": {
    "task_id": "task-001",
    "action": "exec",
    "command": "sudo systemctl restart nginx",
    "reason": "需要管理员权限",
    "current_level": "L2",
    "required_level": "L3"
  }
}

Agent → 云端:系统信息


{
  "jsonrpc": "2.0",
  "method": "sysinfo",
  "params": {
    "os": "darwin",
    "arch": "arm64",
    "hostname": "jays-macbook",
    "cpu": "Apple M4",
    "ram_gb": 16,
    "disk_free_gb": 128,
    "gpu": "Apple M4 GPU (10-core)",
    "agent_version": "0.1.0",
    "permission_level": "L2"
  }
}

4.3 安全机制

层级机制
传输层WSS(TLS 1.3 加密)
认证配对时生成 Agent Token(JWT),每次连接验证
命令过滤本地黑名单(`rm -rf /`、`format`、`:(){ ::& };:`)
审计所有命令和结果记录本地日志
超时命令默认 30 秒超时,防止死循环
心跳30 秒一次,断连后云端立即标记离线

5. 技术实现

5.1 为什么选 Go?

考虑因素GoElectronPythonRust
交叉编译✅ 一次编译出三平台❌ 需要分别打包⚠️ 需要 pyinstaller
二进制大小~8MB~200MB~50MB~5MB
用户依赖Python 运行时
开发效率最高
与小虾主体**统一技术栈**不同不同不同
WebSocketnet/http 内置内置websockets 库tokio-tungstenite

Go 是最平衡的选择:和小虾主体统一、交叉编译方便、用户零依赖。

5.2 GUI 技术选型

Go 的 GUI 生态不如 Electron 丰富,但对 Agent 来说不需要复杂 UI。采用分层策略

Go GUI 库现状:

方案优点缺点
**Fyne**自绘引擎纯 Go,跨平台控件丑,不像原生
**Gio**自绘(Immediate Mode)性能好,Google 背景学习曲线陡,生态小
**Wails**Go 后端 + Web 前端**UI 好看**,用 HTML/CSS/JS本质是 WebView,~15-20MB
**go-gtk / go-qt**绑定 C 库原生控件交叉编译噩梦,依赖重
**systray**仅系统托盘图标极简,<1MB只有托盘菜单,没有窗口

推荐方案:systray(日常)+ Wails(设置面板)


v0.1  纯 CLI,无 GUI                        → 0 额外依赖
v0.2  + systray 托盘图标(状态/权限/暂停)      → +1MB
v0.3  + Wails 设置面板(白名单/日志/设备详情)   → +15MB

v0.2 系统托盘:用 getlantern/systray,代码极简:


systray.SetIcon(icon)
systray.SetTitle("🦐 小虾 Agent")
mStatus := systray.AddMenuItem("✅ 已连接", "")
mPermission := systray.AddMenuItem("权限: L2 标准", "")
mLogs := systray.AddMenuItem("查看日志", "")
systray.AddSeparator()
mQuit := systray.AddMenuItem("退出", "")

90% 的日常交互(看状态、改权限、暂停)托盘菜单就够了。

v0.3 Wails 设置面板:需要更丰富 UI 时才引入。


Go 后端(agent 核心逻辑)
    ↕ 绑定调用
Web 前端(Vue/Svelte,打包进二进制)

核心原则:不要一上来就做 GUI。 先让 CLI 跑通,托盘够日常用,复杂设置面板等有用户反馈再加。

5.3 Windows 平台适配

Go 交叉编译原生支持 Windows:GOOS=windows GOARCH=amd64 go build -o xiaoxia-agent.exe

平台差异通过 //go:build 条件编译处理:

功能macOS/LinuxWindows
Shell 命令`sh -c "..."``powershell -NoProfile -c "..."`
文件路径`/home/jay/...``C:\Users\Jay\...`
系统托盘菜单栏图标任务栏通知区域
GUI 自动化AppleScript / xdotoolWin32 API / UI Automation
屏幕截图screencaptureBitBlt / DXGI
开机自启launchd / systemd注册表 / 任务计划程序

// exec_windows.go
//go:build windows
func runCommand(cmd string) *exec.Cmd {
    return exec.Command("powershell", "-NoProfile", "-c", cmd)
}

// exec_unix.go
//go:build !windows
func runCommand(cmd string) *exec.Cmd {
    return exec.Command("sh", "-c", cmd)
}

Windows 安装脚本:


irm https://xiaoxia.app/install.ps1 | iex

Go 标准库(os/execfilepath)已处理大部分跨平台差异,核心逻辑(WebSocket、JSON-RPC、权限检查)完全不用改。

5.2 模块设计


xiaoxia-agent/
├── main.go              // 入口,启动 WebSocket 连接
├── cmd/
│   ├── pair.go          // 配对命令
│   ├── start.go         // 启动守护进程
│   └── status.go        // 查看状态
├── internal/
│   ├── ws/
│   │   └── client.go    // WebSocket 客户端,重连逻辑
│   ├── executor/
│   │   ├── exec.go      // 命令执行(带超时、流式输出)
│   │   ├── fs.go        // 文件操作(读/写/列表)
│   │   ├── screen.go    // 屏幕截图
│   │   └── gui.go       // GUI 自动化(v0.4+)
│   ├── approval/
│   │   ├── checker.go   // 权限检查
│   │   ├── prompt.go    // 终端/GUI 弹窗确认
│   │   └── whitelist.go // 白名单管理
│   ├── config/
│   │   └── config.go    // 配置文件管理
│   └── logger/
│       └── audit.go     // 审计日志
├── config.toml          // 用户配置
└── audit.log            // 操作日志

5.3 配对流程


用户操作                          小虾云端

1. 下载 agent
   curl -fsSL https://xiaoxia.app/install.sh | sh

2. 运行配对
   $ xiaoxia-agent pair
   
   显示: "请在 xiaoxia.app 输入配对码: ABC-XYZ-123"
                                    │
3. 用户在网页端输入配对码 ─────────────►│
                                    │
4. 云端生成 Agent Token ◄────────────┘
   + 绑定到用户账户
                                    │
5. Agent 收到 Token ◄───────────────┘
   保存到 ~/.xiaoxia/credentials.json
   
6. WebSocket 长连接建立 ──────────────►
   
   $ xiaoxia-agent start
   ✅ 已连接到 xiaoxia.app
   📋 权限级别: L1 (只读)
   💡 运行 'xiaoxia-agent config' 调整权限

5.4 安装脚本设计


#!/bin/bash
# install.sh — 一键安装 xiaoxia-agent

set -e

OS=$(uname -s | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m)

case "$ARCH" in
  x86_64)  ARCH="amd64" ;;
  aarch64|arm64) ARCH="arm64" ;;
  *) echo "不支持的架构: $ARCH"; exit 1 ;;
esac

URL="https://xiaoxia.app/dl/xiaoxia-agent-${OS}-${ARCH}"
DEST="/usr/local/bin/xiaoxia-agent"

echo "⬇️  下载 xiaoxia-agent (${OS}/${ARCH})..."
curl -fsSL "$URL" -o "$DEST"
chmod +x "$DEST"

echo "✅ 安装完成!"
echo ""
echo "下一步:"
echo "  xiaoxia-agent pair    # 绑定到你的小虾账户"
echo "  xiaoxia-agent start   # 启动 agent"

6. 渐进式功能路线

Phase 1:CLI Agent(v0.1,1-2 周)

最小可行产品,验证核心架构:


支持的命令:
├── exec     — 执行 shell 命令,流式返回输出
├── read     — 读取文件内容
├── write    — 写入文件
├── ls       — 列出目录
├── sysinfo  — 返回系统信息
└── ping     — 心跳

交互方式:纯终端(无 GUI)

Phase 2:系统托盘 GUI(v0.2,+1 周)


┌─────────────────────────┐
│ 🦐 小虾 Agent           │
│                         │
│ 状态: ✅ 已连接           │
│ 权限: L2 (标准)          │
│ 今日操作: 23 次          │
│                         │
│ [查看日志] [调整权限]     │
│ [暂停] [断开连接]        │
└─────────────────────────┘

Phase 3:屏幕感知(v0.3,+1 周)


新增命令:
├── screenshot  — 截取全屏/指定窗口
├── ocr         — 识别屏幕文字(调用云端视觉模型)
└── windows     — 列出当前打开的窗口

使用场景:

Phase 4:GUI 自动化(v0.4,+2 周)


新增命令:
├── click      — 点击屏幕坐标/元素
├── type       — 输入文字
├── hotkey     — 发送快捷键
└── scroll     — 滚动

实现方式:

Phase 5:跨设备任务连续性(v0.5,+1 周)

核心场景:云端开始,本地继续


用户在手机/网页端对小虾说:
  "帮我在我的电脑上创建一个新的 React 项目"

云端任务调度器:
  1. 检查用户有哪些在线 agent
  2. 选择目标设备(jays-macbook, L2 权限)
  3. 生成执行计划
  4. 通过 WebSocket 发送到 agent
  
Agent 执行:
  exec("npx create-react-app my-project", cwd="~/projects/")
  exec("cd my-project && code .", cwd="~/projects/")  // 打开 VS Code
  
结果返回给用户手机:
  "✅ React 项目已创建在 ~/projects/my-project/,VS Code 已打开"

7. 定价策略

7.1 Agent 本身免费

Agent 是开源的、免费的。小虾赚钱的方式是云端服务(LLM 推理 + 任务调度),不是本地软件。

7.2 云端计费

场景计费方式
LLM 推理(任务规划、代码生成)按 token 计费,包含在 $5/月 Pro 套餐
本地命令执行不收费(在用户自己电脑上跑)
屏幕 OCR(云端视觉模型)按次计费,极低(几分钱/次)
文件同步到云端免费(10GB 配额内)

7.3 与 Manus 定价对比

Manus小虾
最低套餐$39/月 (Plus)**$5/月 (Pro)**
本地执行收费消耗 Credit**免费**
Agent 客户端免费**免费 + 开源**
透明度Credit 消耗不透明**逐操作计费可查**

8. 安全考量

8.1 威胁模型

威胁风险缓解措施
云端被入侵,发送恶意命令本地权限检查 + 操作审批 + 命令黑名单
Agent Token 泄露Token 绑定设备指纹,异地登录告警
中间人攻击WSS (TLS 1.3) + 证书固定
恶意 Agent 版本开源代码可审计 + 二进制签名

8.2 关键安全原则

1. Agent 端可以拒绝任何命令:即使云端发来指令,本地检查不通过就不执行

2. 用户始终有最终控制权:可以随时暂停、断开、卸载

3. 最小权限原则:默认只读,逐步升级

4. 审计不可篡改:本地日志 append-only,云端也保留副本

8.3 macOS 特殊处理


首次运行时的权限引导:

1. 辅助功能权限(GUI 自动化需要)
   → 系统偏好设置 → 隐私与安全性 → 辅助功能
   → 添加 xiaoxia-agent

2. 屏幕录制权限(截图需要)
   → 系统偏好设置 → 隐私与安全性 → 屏幕录制
   → 添加 xiaoxia-agent

3. 完全磁盘访问(可选,访问 ~/Desktop 等受保护目录)
   → 系统偏好设置 → 隐私与安全性 → 完全磁盘访问

Agent 提供一键引导脚本:
$ xiaoxia-agent setup-permissions

9. 云端 Relay 架构:Agent 连接管理

用户本地 agent 通过 WebSocket 连接云端,云端需要一个组件来管理这些连接。有两种方案:

9.1 方案 A:独立 Relay 服务(推荐)


xiaoxia-agent (用户电脑)
    │ WSS 出站连接
    ▼
xiaoxia-relay (独立 Go 服务,跑在小虾云端)
    │ 内部 HTTP API
    ▼
xiaoxia-hosting (现有控制面)
    │
    ▼
LLM Proxy → 模型推理

xiaoxia-relay 是一个独立的 Go 进程,核心职责:

内部 API 示例:


POST /api/v1/agents/{agent_id}/exec
{
  "command": "ls -la ~/Documents",
  "timeout_ms": 30000
}

GET /api/v1/agents/{agent_id}/status
→ { "online": true, "permission_level": "L2", "os": "darwin", ... }

GET /api/v1/agents
→ [{ "agent_id": "abc123", "hostname": "jays-macbook", "online": true }, ...]

优点

9.2 方案 B:作为 OpenClaw 插件

如果小虾的 AI 层直接使用 OpenClaw:


xiaoxia-agent (用户电脑)
    │ WSS
    ▼
openclaw-xiaoxia-plugin (OpenClaw 插件)
    │ 注册为 Tool
    ▼
OpenClaw Gateway
    │
    ▼
LLM → tool_call: agent.exec("npm install")

插件将 agent 连接注册为 OpenClaw 的 Tool,LLM 直接通过 tool_call 操作用户电脑。本质上就是 OpenClaw Node 的思路,只是换成了 WebSocket 出站连接(而非 Node 的入站连接)。

优点:零代码即可让 LLM 操作本地电脑

缺点:强依赖 OpenClaw 框架

9.3 方案选择

推荐先做方案 A(独立 Relay),原因:

1. 小虾是独立产品,不应强依赖 OpenClaw

2. 连接管理逻辑不复杂,Go 标准库就够

3. 后续如果想接入 OpenClaw 生态,写一个薄 adapter 把 Relay API 包装成 OpenClaw Tool 即可

两个方案不互斥——先有独立 Relay,再用 adapter 接入 OpenClaw 是最灵活的路径。

9.4 完整数据流

以用户在手机上对小虾说"帮我在电脑上跑 npm install"为例:


1. 用户消息 → 小虾 Hosting API
2. Hosting → LLM Proxy → LLM 推理
3. LLM 返回 tool_call: { "method": "exec", "command": "npm install" }
4. Hosting → Relay 内部 API: POST /agents/{id}/exec
5. Relay → WebSocket → xiaoxia-agent (用户电脑)
6. Agent 权限检查 → L2 白名单匹配 → 自动放行(或弹确认)
7. Agent 执行命令,流式返回输出
8. Relay → Hosting → LLM(读取输出,生成回复)
9. Hosting → 用户手机: "✅ npm install 完成,安装了 127 个包"

10. 与 OpenClaw 的关系

10.1 技术复用

小虾 Agent 和 OpenClaw Node 解决的是同一类问题。可以考虑:

10.2 差异化

OpenClaw Node小虾 Agent
目标用户技术用户(配置 JSON)**普通用户(一键安装)**
配对方式TLS fingerprint + token**6 位配对码**
权限管理JSON 文件**GUI 界面**
连接方式需要 Tailscale/公网 IP**WebSocket 出站(零配置)**
云端组件Gateway 内置**独立 Relay 服务**

11. 实施计划

10.1 MVP 时间线

阶段内容预计时间依赖
v0.1CLI agent + exec/fs/sysinfo1-2 周Go WebSocket
v0.2系统托盘 GUI+1 周systray 库
v0.3屏幕截图 + OCR+1 周云端视觉模型
v0.4GUI 自动化+2 周平台 API
v0.5跨设备连续性+1 周云端调度器

总计:~6-8 周 到功能完整版

10.2 优先级

1. v0.1 是关键:验证 WebSocket 通信 + 权限模型 + 基础执行

2. v0.2 提升体验:有 GUI 才像个正经产品

3. v0.3-v0.5 按需求排:看用户反馈决定优先级

10.3 开源策略

12. 总结

关键设计决策

1. Go 单二进制:<10MB,零依赖,三平台

2. WebSocket 出站连接:NAT 友好,零配置

3. 三级权限 + 逐操作确认:比 Manus 透明 10 倍

4. Agent 端开源:信任基础,竞品做不到

5. 本地执行免费:只收云端 LLM 推理费用

与 Manus 的护城河

Manus 有先发优势和 Meta 资源,但小虾可以在三个方面赢:

1. 价格:$5/月 vs $39/月

2. 透明度:开源 agent + 逐操作计费

3. 轻量级:8MB vs 200MB

下一步

参考链接