简短回答
不能。Whizi没有离线模式。为了生成回复,Whizi会把这次请求合理需要的信息发送给OpenRouter和被路由到的模型提供方,或者发送给所选功能使用的其他提供方,所以一个回答总是要经过一次与Whizi以外公司的网络往返。托管、同步的对话、媒体、账号状态、用量限制、报告,以及安全和运营处理,全部运行在Cloudflare Workers、D1、R2和Durable Objects上,这意味着你正在输入的对话也保存在服务器上。
出于同样的原因,模型列表也是服务器端的。选择器由Whizi后端在GET /api/models提供,写死在网页版和移动端客户端里的模型列表只是离线兜底方案,只有在这个请求无法访问时才会用到。这个兜底列表只负责把选择器画出来:网络断开时在里面看到某个名字,并不代表背后有什么能真正回答你。
| 需要联网的内容 | 在你设备上发生的内容 |
|---|---|
| 每一次模型回复,不论什么套餐 | 你选择的主题,保存在本地存储中,下次访问时恢复 |
| 加载你的对话列表和任何一段对话 | 解析ChatGPT或Claude的导出文件,浏览器在发送之前就会先读取它 |
| 发送消息、编辑消息、切换版本 | 从回答中的文件卡片生成.xlsx或.docx文件 |
| 网页搜索、语音、图像生成 | 手机应用对最近对话的缓存,下文会说明 |
| 上传文件,以及通过签名URL查看已存储的媒体 |
手机应用在设备上保留了什么
隐私政策对此有明确说明。手机应用可能会在已登录或访客设备上本地缓存最多40条最近的对话,这个缓存并不是一份独立的云端备份。它是如何被清除的,以及账号中其他一切内容存放在哪里,都写在Whizi把数据存在哪里里。
缓存最近的对话并不是一种离线阅读模式,也不会改变实际工作发生的地方。对话和消息会一直保存在账号中,直到你删除它们或删除账号,而一条新回复仍然需要通过网络到达提供方。
你的套餐同样是在服务器上解析的。计费按单个账号进行,套餐等级只从该账号自己的订阅这一处推导出来。两个平台如何共享同一个账号,见Whizi在移动端。
回复中途断开的连接
生成过程运行在服务器上一个按对话划分的Durable Object里,所以中途关闭标签页并不会终止回答,回复仍然会被保存下来。重新打开的标签页或第二台设备可以通过GET /api/conversations/:id/generate/active重新连上正在进行中的生成。回来、重新加载对话,就能读到已保存的内容。
只有开头很窄的一个时间窗口不适用这条规则。如果客户端在与上游建立连接完成之前就断开了,服务器会记录Generation aborted before it started.,并返回HTTP 408和空响应体,说明请求根本没有到达模型。
停止操作由服务器而不是客户端决定:协调器会取消对提供方的读取、保存部分回答、释放锁,并把未送达的一次对话额度退还。中途各种字符串及其含义的完整列表见消息发送不出去。
请求无法完成时你会看到的提示文字
Whizi会呈现具体是哪个请求失败了,而不是一句笼统的提示,所以你看到的文字取决于你当时在做什么。以下每一句都是原文照录,并附上它对应的具体情况。
| 提示文字 | 记录在案的触发条件 | 详见 |
|---|---|---|
Failed to send message. | 发送失败且后端没有返回任何信息时,网页版兜底的提示 | 消息发送不出去 |
Could not load your chats. Please refresh to try again. | 对话列表加载失败时显示的提示 | 消息发送不出去 |
Failed to retrieve session token. | 在对话列表、对话加载、删除、重命名或上传请求之前,令牌获取没有返回任何内容时抛出 | 登录与账号访问 |
The import could not be finished. Check your connection and try again. | 导入过程中的其他任何上传失败 | 对话导入错误 |
Something went wrong. Please close and try again. | 分享对话框的通用错误提示,仅在失败本身不带任何信息时显示,比如连接中断或收到一个HTML错误页面 | 分享一段对话 |
The realtime voice connection failed. | 在websocket出错事件时显示 | 语音模式无法使用 |
The realtime voice connection was closed. | websocket在设置完成后关闭时显示 | 语音模式无法使用 |
Connection error | 语音悬浮层中,语音会话失败时的状态标签 | 语音模式无法使用 |
That didn't send. Check your connection and try again. | 其余所有失败情况的反馈兜底提示 | 故障排查 |
语音功能值得单独说明一句,因为它的架构看起来独立,实际并不是。Worker会签发一个短期有效的令牌,浏览器直接对Google开启一条WebSocket连接,所以没有任何音频经过Whizi的后端服务器。这是一个隐私特性,而不是离线特性:这条到Google的连接依然是一条网络连接,开启它的会话令牌也依然是由worker签发的。
断网之前该做什么
以下这些都无法让你在没有连接的情况下用上一个能真正工作的模型。它们要解决的是:不要在没有内容可用的情况下被困住。
把你的数据随身带走。 GET /api/account/export会把账号数据打包成一个可下载的JSON文件返回,在设置的账号栏目下以“导出数据”呈现,可以直接使用。离线场景下需要留意的一点是:媒体是以元数据加签名URL的形式导出的,而不是内联的字节数据,所以JSON里保留的是记录,图片本身仍然需要另外获取。账号里都保存了些什么,写在Whizi把数据存在哪里里。
在还有信号的时候,把一个回答导出成文件。 一条对话回答可以生成一个围栏代码块,网页版会把它渲染成文件卡片,并在浏览器里转换成一份真正的.xlsx或.docx文件。构建这个文件是在本地完成的,但生成这份回答本身并不是。
落地后再导入,而不是在路上导入。 选择导出文件是本地操作,上传不是,不过如果上传过程中连接中断也不会造成损失,因为每一段对话都以账号加来源加来源ID为键,只会落地一次。相关失败提示见对话导入错误。
- Whizi没有离线模式,也没有设备端的回答路径
- 每一次回复都是对被路由到的模型提供方发起的一次网络请求
- 模型选择器由后端提供,内置列表只是兜底方案
- 手机应用可能缓存最多40条最近的对话,这个缓存并不是一份独立的云端备份
- 你的套餐等级由服务器根据你自己账号的订阅推导得出
- 客户端断开连接后回复仍能保留:生成过程会在Durable Object中继续进行
- 出发前先在设置的账号栏目下把账号导出为JSON
- 导出内容中的媒体是签名URL,之后仍需另行获取
常见问题
Whizi在没有wifi的飞机上能用吗?
不能。每一条回复都由通过网络访问的模型提供方生成,所以没有连接时既没有通往模型的路径,也没有通往你对话列表的路径。
我的手机在生成过程中信号中断了,能马上在笔记本电脑上重新开一个吗?
不一定,因为每个账号同一时间只能运行一次生成。只要这个按用户划分的锁还被占用,第二次尝试就会被拒绝,提示为"Generation already in progress. Please stop it or wait for it to finish."。这个锁并非永久有效:一旦持有者被判定为失联或卡住,锁就会变得可被抢占,过期的锁也会按计划被定期清理。
我能在飞行模式下的手机上滚动查看旧对话吗?
只能查看手机应用已经缓存的部分,而图片即便在这种情况下也是另一回事。生成的图片保存在服务器端,通过签名URL提供,所以旧对话中的一张图片是在你查看的那一刻才被获取的,而不是保存在设备上。
手机上的访客账号会改变这一切吗?
不会。隐私政策所描述的本地缓存对已登录设备和访客设备一视同仁。访客凭证本身保存在设备上,但Whizi会存储一个单向推导出的标识符,用来识别访客身份、同步数据、验证订阅权限,并在之后把这些数据关联到某个账号,这些全部都是服务器端操作。账号导出对访客会话同样有效,因为访客也拥有真实的对话和记忆,可能想在丢失设备之前先导出来。
导出文件里的媒体链接能保持有效多久?
上传的附件和生成的媒体被设置为最多30天后过期,你自己或在账号删除过程中也可能会更早删除它们。一旦某个对象超过了保留期限,请求会返回"Media has expired.",HTTP 404,media_expired,而不会返回原始字节。趁还有连接时,抓紧获取你想保留的内容。