跳转到内容

设备(P2P)

笔记本适合写代码,却不适合跑 14B 模型。“设备”功能让一台电脑上的 twinny 使用你拥有的另一台电脑(例如带 GPU 的台式机)上的 Ollama,通过直接的加密连接。不会暴露到互联网,没有账号也没有中继:两台机器通过分布式哈希表(DHT)找到彼此后直接通信,而且只有你配对过的设备才能连接。

配对后,远程机器以 Twinny device (P2P) 提供者的形式出现,可像其他提供者一样用于对话、自动补全和嵌入。

工作原理

笔记本 台式机
┌───────────────────────────┐ ┌──────────────────────────┐
│ twinny │ 加密 UDP │ twinny 节点 │
│ 提供者 ─► 网关 ──────────┼───────────────────┼─► 转发 ─► Ollama │
│ (回环) P2P 客户端 │ (打洞) │ (扩展或命令行) │
└───────────────────────────┘ └──────────────────────────┘
│ │
└──────── DHT:“密钥 ABC 在哪里?” ────────┘
  • 每一方都有一个密钥对。节点的公钥就是它的地址;DHT 把它映射到节点当前所在的位置,因此 IP 变化后仍能工作。
  • 配对通过一个短期有效的配对码交换一次公钥。此后节点只回应受信列表中的密钥。
  • 在笔记本上,回环接口上的网关把 twinny 提供者发出的普通 HTTP 请求转换为对等连接上的消息。由设备创建的提供者指向这个网关,twinny 的其余部分无需了解 P2P。
  • 同一网络内直接连接。跨网络时借助 DHT 穿透 NAT 打洞。没有中继服务器;打洞失败则连接失败。

在有 GPU 的电脑上

那台电脑上必须运行着 Ollama 并装有你需要的模型。然后用以下两种方式之一共享。

在 VS Code 中

打开 Twinny → 提供者 → 设备,在此电脑下点击共享。twinny 在扩展内启动一个节点,显示配对码,并在重启后继续共享,直到你点击停止共享。命令 Twinny - Share this computer’s Ollama with my other devices (P2P) 作用相同。

每个配置文件只有一个 VS Code 窗口运行节点;其他窗口显示已从另一个 VS Code 窗口共享,并在该窗口关闭时接管。共享的 Ollama 由 twinny.ollamaHostnametwinny.ollamaApiPort 指定。

在终端中

对于无头机器或没有 VS Code 的机器,运行 twinny-node 命令行。它从 twinny 仓库构建:

Terminal window
git clone https://github.com/twinnydotdev/twinny.git
cd twinny
npm install
npm run build
npm run node -- --name "Home RTX 3090"

在该文件夹中执行 npm link 可让 twinny-node 出现在 PATH 中。需要 Node.js 18 或更新版本。

twinny-node [options]
-n, --name <name> 配对设备看到的本机名称(默认:主机名)
-o, --ollama <url> Ollama 地址(默认:http://localhost:11434,或 $OLLAMA_HOST)
-d, --dir <path> 节点身份和受信设备的保存位置
(默认:~/.twinny/node)
-p, --port <port> 监听的 UDP 端口(默认:49737,或 $TWINNY_NODE_PORT)
--no-pair 启动时不打开配对窗口
-h, --help 显示帮助
运行中:
p 显示新的配对码 l 列出已配对设备
r 移除已配对设备 q 退出

启动时节点列出 Ollama 拥有的模型,打印其 peer ID 和配对码,之后记录连接和请求。要作为服务运行,可用 --no-pair,在附加的会话中按 p 配对,或在安装服务前先交互式配对一次;受信列表在 ~/.twinny/node/trusted-peers.json

防火墙

设备通过 UDP 端口 49737 访问节点(VS Code 中为 twinny.p2pPort,命令行为 --port)。如果该机器运行防火墙,请放行此端口:

Terminal window
sudo ufw allow 49737/udp

端口固定而非随机,以便规则可以永久保留。

在你写代码的电脑上

  1. 打开 Twinny → 提供者 → 设备添加设备
  2. 粘贴配对码,可选择为设备命名。点击配对
  3. 设备卡片显示在线、延迟以及那台机器的 Ollama 安装的模型。
  4. 用卡片上的按钮将其设为对话、自动补全或嵌入提供者。twinny 从设备的列表中为每项工作挑选合适的模型;点击某项工作可更换模型。

配对码只能用一次,十分钟后过期。此后两台机器凭密钥互认,不再需要配对码。

由设备创建的提供者没有需要配置的主机名或端口。侧边栏关闭时自动补全仍然可用,因为 P2P 运行时贯穿整个 VS Code 会话。

管理设备

  • 离线:无法访问设备。设备上的 Ollama 未运行:节点在线但 Ollama 未运行。
  • 重新连接并刷新重试连接并重新列出模型。
  • 取消配对移除设备及使用它的所有提供者。在共享一侧,从已配对列表中移除设备(或在命令行按 r)后,它需要新的配对码才能再次连接。
  • VS Code 打开期间每 30 秒检查一次健康状态。上次的模型列表会被记住,设备离线时卡片仍有信息。

安全

  • 每个连接都通过密钥对认证并端到端加密。DHT 只帮助两台机器找到彼此,从不承载流量。
  • 节点只回应受信列表中密钥的请求。知道 peer ID 的人可以建立连接,但在提供有效配对码之前无法发送请求,而配对码一次性有效。
  • 请求原样转发给 Ollama,且只转发给 Ollama。节点不会暴露文件或运行命令。
  • 身份密钥保存在 VS Code 的密钥存储中(扩展)或权限仅限所有者的 ~/.twinny/node/identity.json(命令行)。删除该文件即以新身份开始;已配对设备需要重新配对。
  • 受信对等方保存在 VS Code 全局状态(扩展)或 ~/.twinny/node/trusted-peers.json(命令行)。

常见问题

能跨互联网使用吗? 能,只要路由器允许打洞,大多数家庭网络都可以。双方都在严格 NAT 之后时可能失败;在两台机器间用 Tailscale 或 WireGuard 等 VPN 让它们互相“本地”,就总能成功。

多台笔记本能共用一台台式机吗? 能。逐一配对;节点的列表会显示全部。

能共享 Ollama 之外的东西吗? 目前不能。节点转发的是 Ollama 的 API,也就是 twinny 的 Ollama 提供者所使用的。

DHT 能看到我的代码吗? 不能。它只知道某个密钥可在某个地址访问。请求和回复在两台机器之间直接加密传输。