简短的答案
Whizi消息发不出去,原因通常是这五种之一:另一条回复还在生成,你把同一条内容发了两次,你触发了每分钟或每小时的限速,消息本身没通过校验,或者登录令牌过期了。Whizi会在错误文字里说明原因,你看到的那句提示决定了该怎么解决。
| 你看到的内容 | 状态码 | 原因 | 该怎么做 |
|---|---|---|---|
Generation already in progress. Please stop it or wait for it to finish. | 409 | 你的账号下另一条回复正在生成 | 停止它,或者等它结束 |
Duplicate message ignored. Please wait for the current response to finish. | 409 | 同样的文字(和图片)最近已经发给这个对话了 | 等正在生成的那条回复结束 |
Too many requests. Please wait and try again. | 429 | 每分钟的时间窗口拒绝了这次请求 | 等一会儿再重发 |
Hourly message limit reached. Please try again later. | 429 | 触发了每小时的消息上限 | 等一会儿再重发 |
A non-empty message is required. | 400 | 消息为空或者只有空白字符 | 输入一些内容 |
This message is {count} characters, over the 100,000 character limit. Attach a shorter file, or ask about one section at a time. | 400 | 单条消息超过了100,000字符 | 拆开发送,或者一次只问一个部分 |
The model is temporarily rate-limited. Please retry shortly. | 429 | 模型提供方在建立连接时返回了429 | 重试,或者换一个模型 |
Failed to send message. | 无,网页端的提示条 | 发送失败,后端没有给出具体信息 | 检查网络连接后重发 |
Something went wrong. Please retry. | 500 | 后端出现了未被专门处理的错误 | 重发一次,如果反复出现就联系支持 |
Invalid or expired session token. | 401 | 令牌校验失败 | 刷新页面并重新登录 |
被限速拒绝的请求会被撤销,所以一次被拒的请求永远不会从你的额度里扣掉一条消息。
按下回车键没有任何反应
如果按回车完全没反应,说明有一条回复还在生成。输入框在有回复正在进行时会故意忽略回车键,所以这不是漏掉了按键。Shift加回车依然可以换行。
Whizi同一时间每个账号只允许一条回复在生成,这由单用户生成锁强制执行,所以同一个账号的两台设备永远不能同时生成回复。第二次尝试会被拒绝,提示为Generation already in progress. Please stop it or wait for it to finish.,HTTP 409,代码generation_in_progress。当生成协调器在建立连接时检测到冲突,返回的也是同一句提示。
把同样的文字发送两次会返回Duplicate message ignored. Please wait for the current response to finish.,HTTP 409,代码duplicate_message。当同样的消息文字(和图片)最近已经发给这个对话时就会触发,这正是双击发送或者心急又按了一次回车的结果。
两种情况的解决办法一样:停止正在运行的回复,或者等它结束。停止操作在服务器端处理:协调器会取消对模型提供方的读取,保存已经收到的文字,释放锁,并把这条没送达的回复退还给你的额度。如果锁不知为何被遗留下来,它也会自动恢复:一旦持有者被判定为孤立或卡死,锁就会变得可以被抢占,过期的锁也会按计划被清理。
如果停止操作留下了空缺,助手气泡里会显示Generation stopped.,这是在生成被停止且没有捕获到部分文字时保存的提示。Generation stopped, but it could not be saved.则表示停止操作成功了,但保存那部分回复失败了。
消息在到达任何模型之前就被拒绝了
以下都是在到达模型之前就被抛出的HTTP 400校验拒绝,任何内容都没有被发往上游。
| 提示 | 代码 | 触发条件 |
|---|---|---|
A non-empty message is required. | empty_message | content缺失或者只有空白字符 |
A model is required. | invalid_model | model缺失或为空 |
That model is not available for text chat. | unsupported_model | 该模型id在目录里对应不到任何文本模型 |
This message is {count} characters, over the 100,000 character limit. Attach a shorter file, or ask about one section at a time. | message_too_long | 单条消息超过了100,000字符 |
That system prompt is missing or over the 32,000 character limit. | invalid_system_prompt | 系统提示词缺失或者超过32,000字符 |
That image reference is not valid. | invalid_image_url | 图片引用不是字符串,或者长度超过2,048字符 |
This conversation has {count} messages, over the 100 message limit. | too_many_messages | 应用聊天路由拒绝了一次携带超过100条消息的请求 |
100,000字符的上限会计入整条消息,包括从附件中提取出来的文字。关于附件提取的文字超出消息预算时Whizi会怎么处理,参见文件上传失败。
回复开始了,然后中断或者根本不显示
连接一旦建立,失败要么来自模型提供方,要么来自承载这条流的机制。提示的内容取决于失败发生在哪一环。
| 提示 | 来源 |
|---|---|
The model is temporarily rate-limited. Please retry shortly. | HTTP 429 provider_rate_limited,提供方在建立连接时返回了429 |
The model provider rejected the request. | 用于提供方的错误内容无法解析,或者解析出来是空消息的情况 |
The model provider returned an empty stream. | HTTP 502,上游返回了OK但没有内容 |
The model provider returned an error. | 提供方发送了一个没有附带自身消息的错误帧时的流内错误事件 |
The model stream was interrupted. | 其他任何流中途失败对应的流内错误事件 |
Generation failed mid-stream. | 已经发送了部分字节之后,生成才以失败告终 |
Generation failed to start. | 协调器启动失败且没有附带自身消息时的内部兜底文案 |
The generation stream is unavailable. | 协调器无法交回一条可以接上的流时抛出 |
Generation aborted before it started. | 客户端在上游连接建立完成之前断开,作为AbortError抛出 |
Something went wrong. Please retry. | HTTP 500 internal_error,任何未被专门处理的后端错误的响应体 |
Sorry, there was an error generating the response. | 当一条流结束时既没有最终消息也没有累积到任何内容,就会写进助手气泡里 |
除429以外的任何上游失败都是HTTP 502 provider_error,携带提供方的消息,并截断到300字符。在流中途这条路径上没有带内错误事件:连接就是直接断开。
其中有一条提示其实是一条记录而不是一句消息。Generation aborted before it started.会在客户端于上游连接建立完成之前断开时作为AbortError被抛出,这种情况下路由返回的是HTTP 408和一个空的响应体,所以这句话是服务器写下的记录,而不是浏览器打印出来的内容。在网络抓包里,generate路由上的一个空408意味着请求在触达任何模型之前就已经中止了。
所有这些情况之下都有一个兜底:任何后端无法识别的情况最终都会变成HTTP 500 internal_error,响应体是Something went wrong. Please retry.HTTP 500无法说明具体原因。先重发一次,如果反复出现再联系支持。
该怎么做:重发一次,如果反复出现,就在同一个对话里换一个模型。这些错误产生于Whizi之外的上游,跟你的账号或设置无关。
有一件事你不需要做,那就是一直开着标签页。生成过程运行在按对话划分的Durable Object里,所以在流式回复中途关闭标签页并不会终止这条回复,回复依然会被保存下来。重新打开的标签页或者另一台设备可以重新接上正在进行的生成。The generation stream is unavailable.是在协调器无法交回一条可以接上的流时抛出的。重新加载对话,读取已经保存下来的内容就行,不用干等着这条流。
在并排对比视图里,各自一侧的提示又不一样:The model did not respond. Please try again.用于generate的响应不正常且没有可读错误信息的情况,Could not start a comparison chat.用于背后的对话创建不出来的情况,Something went wrong.则是最后的兜底。最后这一句是简短版,后面没有跟着重试那句话,这就是它跟500错误里那句Something went wrong. Please retry.的区别。
你的登录状态过期了
认证失败看起来像发送失败,因为它们都是在发送时才暴露出来的。Authentication required.是HTTP 401 unauthorized,在请求没有携带承载令牌时触发。Invalid or expired session token.是同样的状态码和代码,出现在令牌校验因任何原因失败时:令牌过期、签名错误、签发方不对。
在网站端,你也可能看到Failed to retrieve session token.,只要在获取对话列表、加载对话、删除、重命名或上传调用之前,令牌获取没有拿到结果,网站就会抛出这句话。对比视图有自己的措辞:Your session expired. Please refresh and try again.
解决办法是刷新页面,如果刷新之后会话还是没有恢复,就重新登录一次。账号上的内容不会丢失,也没有任何消息被真正发送出去。
编辑已发送的消息反而会失败
编辑一条提示词再重发,是重新跑一轮对话的方式,因为Whizi没有重新生成按钮。这条路径有自己独有的两种失败。
That message is no longer part of this conversation. Reload and try again.是HTTP 404 replace_anchor_not_found,出现在编辑操作指向的消息id已经不在这个对话里的时候。重新加载这个对话即可。客户端手里拿着的是一个服务器上已经没有的消息id。
Conversation not found.是HTTP 404 not_found,出现在对话id不存在或者不属于调用者的时候。它也会出现在generate路由,以及读取、删除、重命名、追加消息、切换版本和分享这几个路由上。
- 按回车没反应,说明有一条回复还在生成,不是漏按了键
- 同一时间每个账号只运行一条生成,跨你所有的设备都算
- 重复发送会被有意忽略,会返回409和一句说明
- 聊天有每分钟和每小时的上限,任何套餐都解不开
- 被限速拒绝的请求不会花掉你的额度
- 单条消息上限是100,000字符
- 提供方的错误靠重发或换模型解决,不是靠改设置
- 在回复过程中关闭标签页不会中断这条回复
- 认证错误靠刷新页面并重新登录解决
常见问题
"Generation already in progress. Please stop it or wait for it to finish."是什么意思?
停止正在运行的回复,或者等它结束,然后再发一次。这个拒绝是HTTP 409,代码generation_in_progress,同一个账号在另一台设备上生成时也会出现同样的提示。停止操作在服务器端处理:部分答案会被保存,锁会被释放,一条没送达的回复会被退还给额度。
我的回复中途停止了,我被扣钱了吗?
流中途失败会在没有带内错误事件的情况下直接断开连接,断开之前收到的文字会被保留下来。如果是你自己停止了生成,服务器会取消对提供方的读取,保存部分答案,并退还一条没送达的回复。如果同一个提供方反复出问题,就在同一个对话里换一个模型,因为这个错误产生于Whizi之外的上游。如果你收到的是HTTP 500和"Something went wrong. Please retry.",那是未被专门处理的后端错误的通用响应体,不是模型本身的问题,重发一次,如果反复出现再报告。
关闭标签页会取消我的回复吗?
不会,只有开头很窄的一段时间例外。如果客户端在上游连接建立完成之前就断开了,服务器会记录"Generation aborted before it started."并返回HTTP 408和一个空响应体,这就是为什么那次请求看起来像什么都没返回。过了这个阶段,回复就不会因为客户端而消失,因为生成运行在按对话划分的Durable Object里,答案依然会被保存下来。"The generation stream is unavailable."是协调器无法交回一条可以接上的流时抛出的,重新加载对话就能看到已经保存的内容。
Whizi说我的消息超过了100,000字符的上限,该怎么办?
单条消息上限是100,000字符,拒绝会以HTTP 400返回,代码message_too_long。这个计数会算上整条消息,包括从附件中提取出来的文字。可以一次只问一个部分,或者附上一个更短的文件。当提取出来的附件文字超出消息预算时,Whizi会截断而不是直接拒绝,并提示你只有前一部分被发送了。