一台旧 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 的长连接帮我把这个问题绕开了。
旧机器、新用途。挺好的。