A Whizi message will not send, or the reply never arrives

The short answer

A Whizi message that will not send is one of five things: another reply is still generating, you sent the same text twice, you crossed a per-minute or per-hour rate limit, the message itself failed validation, or your session token expired. Whizi names the reason in the error text, so the string you see decides the fix.

What you seeCodeWhyWhat to do
Generation already in progress. Please stop it or wait for it to finish.409Another reply is running on your accountStop it, or wait
Duplicate message ignored. Please wait for the current response to finish.409The same text (and image) was already sent to this chat recentlyWait for the reply already running
Too many requests. Please wait and try again.429A per-minute window refused the requestWait, then resend
Hourly message limit reached. Please try again later.429The hourly chat ceiling refused itWait, then resend
A non-empty message is required.400The message is missing or whitespace onlyType something
This message is {count} characters, over the 100,000 character limit. Attach a shorter file, or ask about one section at a time.400One message went over 100,000 charactersSplit it, or ask about one section
The model is temporarily rate-limited. Please retry shortly.429The model provider answered the connect with a 429Retry, or switch models
Failed to send message.none, a website toastThe send failed and the backend supplied no messageCheck your connection and resend
Something went wrong. Please retry.500Any unhandled error on the backendResend, then report it if it repeats
Invalid or expired session token.401Token verification failedRefresh the page and sign in again

Rate-limit refusals are unwound, so a refused request never spends a message off your allowance.

Nothing happens when you press Enter

If Enter does nothing at all, a reply is still generating. The composer deliberately ignores Enter while a reply is in flight, so this is not a dropped keypress. Shift and Enter still inserts a newline.

Whizi runs one generation per account at a time, enforced by a per-user lock, so two devices can never generate at once for the same account. A second attempt is refused with Generation already in progress. Please stop it or wait for it to finish., HTTP 409, code generation_in_progress. The same string is returned when the generation coordinator reports a conflict at connect time.

Sending the identical text twice returns Duplicate message ignored. Please wait for the current response to finish., HTTP 409, code duplicate_message. This fires when the same message text (and image) was already sent to this conversation recently, which is what a double click or an impatient second Enter produces.

The fix for both is the same: stop the running reply, or let it finish. Stopping is handled on the server. The coordinator cancels the provider read, saves whatever text arrived, releases the lock, and refunds an undelivered turn. If a lock is somehow left behind, it recovers on its own: a lock becomes stealable once its holder is judged orphaned or stalled, and expired locks are swept on a schedule.

If a stop leaves a gap, the assistant bubble reads Generation stopped., which is the text persisted when a generation is stopped and no partial text was captured. Generation stopped, but it could not be saved. means the stop worked but persisting the partial reply did not.

The message is refused before any model sees it

These are HTTP 400 validation refusals raised before anything reaches a model. Nothing was sent upstream and nothing was charged.

MessageCodeTrigger
A non-empty message is required.empty_messagecontent is missing or whitespace only
A model is required.invalid_modelmodel is missing or blank
That model is not available for text chat.unsupported_modelThe model id does not resolve to a text model in the catalog
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_longA single message crossed 100,000 characters
That system prompt is missing or over the 32,000 character limit.invalid_system_promptThe system prompt is missing or over 32,000 characters
That image reference is not valid.invalid_image_urlThe image reference is not a string, or is longer than 2,048 characters
This conversation has {count} messages, over the 100 message limit.too_many_messagesThe app chat route refused a transcript carrying more than 100 messages in one request

The 100,000 character cap counts the whole message, including any text extracted from an attachment. For what Whizi does when extracted attachment text does not fit the message budget, see file upload failed.

Rate limits, and one refusal that is not about speed

Both 429 rate-limit strings are in the table above, and both carry the code rate_limit_reached. A refused request is unwound, so a 429 never spends a message off your allowance: wait out the window and resend. The window figures and the plan allowances behind them are on rate limits and out of credits.

One refusal in the same family is not about speed at all: Account sharing limit reached. Please use your own Whizi account., HTTP 403, code account_sharing_limit, fires when more than 3 distinct device or session keys have been seen on one account in the last 24 hours. Waiting a minute does not clear it.

The reply starts, then stops or never renders

Once the connection is open, a failure comes either from the model provider or from the machinery carrying the stream. The strings differ by where the failure landed.

MessageWhere it comes from
The model is temporarily rate-limited. Please retry shortly.HTTP 429 provider_rate_limited, when the provider answers the connect with a 429
The model provider rejected the request.Used when the provider error body cannot be parsed, or parses to an empty message
The model provider returned an empty stream.HTTP 502, upstream answered OK but sent no body
The model provider returned an error.In-stream error event when the provider sends an error frame with no message of its own
The model stream was interrupted.In-stream error event for any other mid-stream failure
Generation failed mid-stream.The generation ended in failure after bytes had already been sent
Generation failed to start.The internal fallback text on a coordinator start failure that carries no message of its own
The generation stream is unavailable.Raised when the coordinator cannot hand back a stream to attach to
Generation aborted before it started.Raised as an AbortError when the client disconnects before the upstream connect completes
Something went wrong. Please retry.HTTP 500 internal_error, the body for any unhandled backend error
Sorry, there was an error generating the response.Written into the assistant bubble when a stream ends with no final message and no accumulated content

Any upstream failure other than a 429 is HTTP 502 provider_error carrying the provider message, truncated to 300 characters. On the mid-stream path there is no in-band error event: the connection simply breaks.

One of those strings is a record rather than a message. Generation aborted before it started. is raised as an AbortError when the client disconnects before the upstream connect completes, and the route answers that case with HTTP 408 and an empty body, so the string is what the server writes down, not what the browser prints. In a network trace, an empty 408 on the generate route means the request went away before any model was reached.

The catch-all sits underneath all of this: anything the backend does not recognize ends as HTTP 500 internal_error with the body Something went wrong. Please retry. HTTP 500 does not identify a cause. Resend once, then contact support if it repeats.

What to do: resend, and if it repeats, switch to a different model in the same conversation. These errors originate upstream of Whizi, not in your account or your settings.

One thing you do not have to do is keep the tab open. Generation runs in a per-conversation Durable Object, so closing the tab mid-stream does not kill the answer and the reply is still persisted. A reopened tab or a second device can reattach to a generation already in flight. The generation stream is unavailable. is raised when the coordinator cannot hand back a stream to attach to. Reload the conversation and read whatever was persisted instead of waiting on the stream.

In the side-by-side compare view the per-side strings are different again: The model did not respond. Please try again. when a generate response is not OK and carries no readable error, Could not start a comparison chat. when the backing chat cannot be created, and Something went wrong. as the last resort. That last one is the short form, with no retry sentence after it, which is how you tell it apart from the Something went wrong. Please retry. body of a 500.

Your session expired

Auth failures look like send failures because they surface at send time. Authentication required. is HTTP 401 unauthorized and fires when the request carries no bearer token. Invalid or expired session token. is the same status and code when token verification fails for any reason: expired token, bad signature, wrong issuer.

On the website side you may instead see Failed to retrieve session token., which the site throws whenever the token fetch returns nothing before a chat list, chat load, delete, rename, or upload call. The compare view has its own wording: Your session expired. Please refresh and try again.

The fix is a page refresh, then signing in again if the refresh does not restore the session. Nothing on the account is lost, and no message was sent.

It is not a failure, it is a limit

An allowance refusal and a tier refusal are not send failures. The request was formed correctly and Whizi declined it on purpose, so there is nothing to fix in the composer: allowance refusals are covered in out of credits, and a model that shows as locked is covered in troubleshooting.

A prompt refused by content screening is also not a send failure. Screening runs before any quota is reserved and before the provider is called, so a refused prompt costs no allowance, and the refusal arrives as HTTP 400 with the reason shown in the chat.

Editing a sent message fails instead

Editing a prompt and resending is how you re-run a turn, since Whizi has no regenerate control. That path has its own two failures.

That message is no longer part of this conversation. Reload and try again. is HTTP 404 replace_anchor_not_found, returned when the edit names a message id that is no longer in the conversation. Reload the conversation. The client is holding a message id the server no longer has.

Conversation not found. is HTTP 404 not_found, returned when the conversation id does not exist or is not owned by the caller. It shows on the generate route and on the read, delete, rename, message-append, version-switch and share routes too.

Workflow checklist
  • Enter doing nothing means a reply is still generating, not a dropped keypress
  • One generation runs per account at a time, across all your devices
  • A duplicate send is ignored on purpose, with a 409 and a message saying so
  • Chat has a per-minute and a per-hour cap that no plan lifts
  • A rate-limited request costs nothing off your allowance
  • One message is capped at 100,000 characters
  • Provider errors are fixed by resending or switching model, not by settings
  • Closing the tab mid-reply does not kill the reply
  • Auth errors are fixed by refreshing and signing in again
Common questions

Frequently asked questions

What does "Generation already in progress. Please stop it or wait for it to finish." mean?

Stop the running reply, or wait for it to finish, then send again. The refusal is HTTP 409 with code generation_in_progress, and it also appears when a different device is generating on the same account. Stopping is handled on the server: the partial answer is saved, the lock is released, and an undelivered turn is refunded.

How many messages can I send per minute?

Ten per minute and 60 per hour, per user, flat across every plan including Powerhouse. There is also a shared ceiling of 30 requests per minute across all routes and a per-IP ceiling of 60 per minute. Crossing them returns HTTP 429 with either "Too many requests. Please wait and try again." or "Hourly message limit reached. Please try again later." Nothing lifts these limits, but a refused request is unwound and never spends a message off your allowance.

My reply stopped halfway through. Did I get charged?

A mid-stream failure breaks the connection with no in-band error event, and whatever text arrived before the break is kept. If you stop a generation yourself, the server cancels the provider read, saves the partial answer, and refunds an undelivered turn. For a repeated provider failure, switch to a different model in the same conversation, since the error originates upstream of Whizi. If what you get back is HTTP 500 with "Something went wrong. Please retry.", that is the generic body for an unhandled backend error rather than a model problem, so resend once and report it if it keeps happening.

Does closing the tab cancel my reply?

No, with one narrow window at the very start. If the client disconnects before the upstream connect completes, the server records "Generation aborted before it started." and answers HTTP 408 with an empty body, which is why that request looks like it returned nothing at all. Past that point the reply survives the client, because generation runs in a per-conversation Durable Object and the answer is still persisted. "The generation stream is unavailable." is raised when the coordinator cannot hand back a stream to attach to, and reloading the conversation shows whatever was saved.

Whizi says my message is over the 100,000 character limit. What now?

A single message is capped at 100,000 characters and the refusal is HTTP 400, code message_too_long. The count covers the whole message, including text extracted from an attachment. Ask about one section at a time, or attach a shorter file. When extracted attachment text does not fit the message budget, Whizi truncates instead of refusing and warns you that only the first part was sent.