离线与隐私
iRoof.top 将你的聊天保存在你的电脑上。如果模型也在你的电脑上运行,就没有任何内容需要离开你的电脑。 离线模式把这一点变成应用强制执行的规则,而不只是一种习惯。
本地发生了什么
| 步骤 | 运行位置 | 网络 |
|---|---|---|
| 导入、解析、风格档案 | 你的电脑 | 无 |
| 存储 | 数据目录中的 JSON 文件和媒体 | 无 |
| 搜索历史、分享链接 PIN、媒体库 | 你的电脑 | 无 |
| 描述照片、贴纸、GIF、视频 | 媒体模型,仅当你点击用 AI 描述时 | 每个项目一次请求,发往模型端点 |
| 语音转文字 | 媒体模型,当你对语音消息点击用 AI 描述或录制语音时 | 一次请求,发往模型端点 |
| 一次回复 | 聊天模型,当你发送消息(或访客发送消息)时 | 请求发往模型端点 |
| 压缩较长的历史 | 聊天模型,作为回复的一部分,当历史超过预算时 | 一次额外请求,发往模型端点 |
导入从不调用模型。第一次调用发生在你发送消息、点击描述或录制语音消息时。回复会把导出的历史(最多到历史预算)、风格档案和媒体描述发送给模型。所以模型运行在哪里,决定了聊天会去哪里:云端端点会收到,你电脑上的模型则不会。
完全离线运行
- 安装 Ollama 或 LM Studio,或运行 llama.cpp 的
llama-server。 - 下载一个支持工具调用的聊天模型;如果希望照片和贴纸得到描述,还需要一个视觉模型。
- 在设置中选择端点和模型,然后打开离线:
| 服务器 | 基础 URL |
|---|---|
| Ollama | http://localhost:11434/v1 |
| LM Studio | http://localhost:1234/v1 |
llama.cpp llama-server | http://localhost:8081/v1(它的默认端口 8080 是 iRoof.top 的,请用 llama-server --port 8081 启动) |
- 点击测试。它会发送一个很小的请求,并显示响应的模型和主机。你可以关闭网络,继续聊天。
桌面应用在设置中配置。它不读取你的 shell 或 .env 文件(参见桌面应用),但如果启动它时的环境中有 ROOFTOP_OFFLINE 和 OPENAI_*,它会遵循这些设置。服务器会读取环境(以及 .env):
# --offline 等同于 ROOFTOP_OFFLINE=1
OPENAI_BASE_URL=http://localhost:11434/v1 OPENAI_MODEL=llama3.1 rooftop --offlinedocker run -p 8080:8080 -v rooftop-data:/data \
--add-host=host.docker.internal:host-gateway \
-e ROOFTOP_OFFLINE=1 \
-e OPENAI_BASE_URL=http://host.docker.internal:11434/v1 -e OPENAI_MODEL=llama3.1 \
ghcr.io/irooftop/rooftop在 Docker 中,localhost 指的是容器本身,所以请使用 host.docker.internal(--add-host 选项仅在 Linux 上需要)。如果 Ollama 拒绝连接,请让它监听所有接口(OLLAMA_HOST=0.0.0.0)。
离线模式强制执行的内容
| 离线模式 | |
|---|---|
| 聊天、历史摘要、媒体描述、语音转文字 | 除非端点是本地的,否则被拒绝 |
| 通过 HTTP 连接的 MCP 服务器 | 除非是本地的,否则被拒绝;在设置中以错误形式显示 |
互联网分享(<名称>.iroof.top) | 关闭:中继客户端不启动,开关被锁定 |
| Telegram 机器人,无论是自己的还是共享的 | 不启动 |
| 通过 URL 发送 GIF | AI 无法从非本地 URL 发送 GIF |
| Wi‑Fi 分享链接 | 正常工作 |
被拒绝的请求会在建立任何连接之前失败,消息会说明原因:离线模式:https://openrouter.ai 不是本地端点。从本地端点重定向到其他主机的请求同样会被拒绝。模式开启时,侧边栏顶部会显示一个小的离线徽章。该设置会被保存。--offline / ROOFTOP_OFFLINE=1 无论设置如何都会开启该模式,而设置无法将其关闭。
“本地”的含义
localhost、回环地址(127.0.0.0/8、::1)、专用网络地址(10/8、172.16/12、192.168/16、fc00::/7)、链路本地地址,以及名称 *.local 和 *.internal(例如 host.docker.internal)。你家庭网络中另一台电脑上的模型也算本地,因为它从不离开你的网络。名称是根据其写法判断的,不会被解析。
离线模式无法检查的内容
- stdio MCP 服务器是你电脑上的程序。iRoof.top 会启动它们,但看不到它们连接到什么,因此只添加你信任其会保持在本地的服务器。
- 语音转文字使用聊天 API(一个
input_audio部分),而不是 Whisper 的/audio/transcriptionsAPI。它需要一个在那里接受音频的本地服务器和模型。如果你的不接受,语音消息仍会被保存和发送,只是缺少文字。 - 图像和语音生成只以 MCP 工具的形式存在。离线时,请为它们使用本地 MCP 服务器。
- 与你分享的人在他们自己的浏览器中打开你的 Wi‑Fi 链接。离线模式管理的是这个应用,而不是他们的设备。
与朋友安全分享
| 链接 | 会发生什么 |
|---|---|
Wi‑Fi http://<你的 IP>:8737/s/<名称> | 从不离开你的本地网络 |
互联网 https://<名称>.iroof.top/s/<名称> | 应用打开一条通往中继的出站 WebSocket 连接,访客的 HTTP 请求和你应用的响应通过它转发 |
使用互联网链接时,你的导出、聊天和模型仍然留在你的电脑上,而中继不存储其中任何一项。中继只保存账户记录:你的名称、你的密钥的哈希值,以及它最后一次看到你的时间。
请清楚这不能给你带来什么。中继会终结 TLS,因此和任何反向代理一样,从技术上讲它能看到经过它的流量:访客输入的内容、角色的回复,以及链接允许访客阅读的历史(访客可以阅读导出内容,默认是什么都不能)。它只转发访客页面(/s/…、/api/s/…、页面资源),并在两个方向上丢弃 Cookie;你的所有者界面和设置永远无法通过它访问。如果这样的信任仍然太多,请使用 Wi‑Fi 链接,或运行你自己的中继服务器。 关于分享链接的更多信息。
在离线模式下,iroof.top 中继是关闭的。Wi‑Fi 链接仍然可用。
Telegram 机器人
从 Telegram 回复会向你的群组发布:
- 新的访客消息(名称、链接名称、文字,或带有描述或转写的媒体标签,以及他们所回复消息的简短预览)和 AI 的回复;
- 从不发布导出的历史。旧消息不会被发送。
机器人没有端到端加密:文字以明文形式通过 Telegram。使用共享机器人时,文字还会经过中继,中继只保存哪个群组属于哪个账户。自己的机器人直接与 Telegram 通信,不经过中继。离线模式会关闭这两者。
你的数据去向
| 数据 | 去向 |
|---|---|
| 导出、聊天、设置、API 密钥 | 你电脑上的数据目录 |
| 导入和风格档案 | 不发送到任何地方 |
| 历史、风格档案、你的消息 | 你选择的模型端点,每次回复时 |
| 照片和语音 | 媒体模型端点,在描述时或你录制语音消息时 |
| Wi‑Fi 链接上的访客消息 | 你的电脑和你的模型端点 |
| 互联网链接上的访客消息 | 中继(传输中)、你的电脑、你的模型端点 |
| 通过 Telegram 的访客消息 | 另外还有 Telegram,以及共享机器人的中继 |
| 离线模式 | 仅本地模型端点,仅 Wi‑Fi 链接,没有 Telegram |