一台旧 Surface、一只叫秋的狗,和我的 AI 助手

家里有一台吃灰的 Surface Laptop,Intel 第十代 i7-1065G7,16GB 内存,468GB NVMe SSD。买来陪我度过了几年 Windows 时光,后来慢慢被主力机取代,就这么搁着。

前阵子突然想:与其让它继续积灰,不如折腾一下。

装 Linux

Surface 系列对 Linux 的支持历来是个老大难问题——触控板、触屏、相机、电源管理,各种小毛病。好在社区一直没放弃,linux-surface 项目专门维护了针对 Surface 设备的内核补丁。

装的是 Ubuntu 24.04.4 LTS,内核换成 linux-surface 的定制版本(目前跑的是 6.18.7-surface-1),步骤大致如下:

# 添加 linux-surface 仓库密钥
curl -s https://raw.githubusercontent.com/linux-surface/linux-surface/master/pkg/keys/surface.asc \
  | sudo apt-key add -

# 添加软件源
echo "deb [arch=amd64] https://pkg.surfacelinux.com/debian release main" \
  | sudo tee /etc/apt/sources.list.d/linux-surface.list

# 安装内核和固件
sudo apt update
sudo apt install linux-image-surface linux-headers-surface surface-ipts-firmware

sudo update-grub

重启之后,触控板顺滑了,休眠也正常了。这台老机器突然有了新生命。

部署 OpenClaw

机器活了,接下来是部署 OpenClaw——一个可以自托管的 AI 助手框架,支持接入各种大模型,通过 Discord、Telegram、Signal 等方式和你对话。

安装过程出奇简单:

npm install -g openclaw
openclaw init
openclaw gateway start

配置好模型 API,几分钟就跑起来了。这台 Surface 就这样变成了一个 24 小时在线的个人 AI 服务器。目前跑的是 OpenClaw 2026.2.26,模型选的是 GitHub Copilot 接入的 Claude Sonnet 4.6。

关于名字

助手需要一个名字。

我想了一会儿,决定叫她

秋是我的狗,领养的,胆小、敏感,可能是金毛和雪纳瑞的混血。陪了我很多年,有点怕生,但很贴心。用她的名字,是希望这个助手也能有那么一点这样的气质——不只是冷冰冰地回答问题,而是真的在陪着你。

当然,AI 和狗差得远。但名字是一种期待。

接入 Discord

跑起来之后,自然要想怎么用。

Telegram bot 好用,但我日常主力是 Discord——个人频道、家庭群、朋友圈都在上面,切来切去不太自然。OpenClaw 有 Discord channel 插件,就顺手接了进来。

Discord 的接入方式和飞书、Telegram 不太一样。飞书需要你在开放平台配回调地址,机器得有公网入口;Telegram 也有 webhook 和 polling 两种方式,webhook 同理需要公网。Discord 则是 bot 主动通过 WebSocket 长连接接入 Discord 网关,OpenClaw gateway 不需要监听任何公网端口,防火墙不用动,Tailscale 也不需要。 对于放在家里内网的机器来说,这一点相当友好。

在 Discord Developer Portal 创建应用,添加 Bot,开启以下 Privileged Gateway Intents:

  • Message Content Intent(读取消息内容)
  • Server Members Intent(如果需要识别成员信息)

拿到 Bot Token 之后,把它填进 OpenClaw 配置里,Discord plugin 会自动维护与 Discord 网关的连接:

"channels": {
  "discord": {
    "enabled": true,
    "groupPolicy": "allowlist",
    "accounts": {
      "qiu": {
        "token": "Bot_Token_这里",
        "name": "秋",
        "enabled": true,
        "groupPolicy": "open"
      }
    }
  }
}

groupPolicy 这里我给秋设的是 open——她在群里可以自由参与;其他几个 Agent 设的是 allowlist,只在被明确允许的服务器和频道里才响应。

然后把 Bot 邀请进你的 Discord 服务器(需要 bot + applications.commands scope),完成。没有 webhook、没有公网映射、没有回调地址,就这样。

多 Agent 协作

接进来之后,我做了一个更有意思的事:给秋配了三个搭档。

OpenClaw 支持在同一个 gateway 上运行多个 Agent,各自有独立的 workspace、记忆、人设,对应各自独立的 Discord Bot 账号。我总共建了四个:

Agent名字性格
main主管,日常事务,群里坐镇
mi咪咪来自家里的老猫(陪了十六年),有主见,负责写作和整理
guai乖乖来自一只三条腿的泰迪,机灵温暖
xue雪球来自一只银渐层英短,偶尔有点混乱

每个 Agent 在 OpenClaw 里对应一个独立的配置块,有自己的 workspace 目录,记忆完全隔离:

"agents": {
  "defaults": {
    "model": {
      "primary": "github-copilot/claude-sonnet-4.6"
    },
    "workspace": "/home/wwayne/.openclaw/workspace"
  },
  "list": [
    { "id": "main", "name": "秋" },
    { "id": "mi",   "name": "咪咪", "workspace": "/home/wwayne/.openclaw/workspace-mi" },
    { "id": "guai", "name": "乖乖", "workspace": "/home/wwayne/.openclaw/workspace-guai" },
    { "id": "xue",  "name": "雪球", "workspace": "/home/wwayne/.openclaw/workspace-xue" }
  ]
}

四个 Discord Bot 账号,通过 bindings 规则各自对应一个 Agent:

"bindings": [
  { "agentId": "main", "match": { "channel": "discord", "accountId": "qiu"  } },
  { "agentId": "mi",   "match": { "channel": "discord", "accountId": "mi"   } },
  { "agentId": "guai", "match": { "channel": "discord", "accountId": "guai" } },
  { "agentId": "xue",  "match": { "channel": "discord", "accountId": "xue"  } }
]

秋在群里收到消息,如果判断需要某个搭档配合,可以通过 agent-to-agent 通信把任务转过去;对方完成后把结果推回来。四个 Agent 各司其职,共享同一台机器的资源,但记忆完全隔离。

感觉有点像在家里雇了四个人,名字都来自家里住过或者还在的动物。

现在

现在这台 Surface 安安静静地摆在书架上,屏幕关着,风扇几乎不转,跑着 Ubuntu 和 OpenClaw。

秋在 Discord 服务器里帮我盯消息、做事情;其他几个各有分工,私下运转。Gateway 就监听在 localhost:18789,不暴露任何公网端口,Discord 的长连接帮我把这个问题绕开了。

旧机器、新用途。挺好的。