Stream the Answer, Don't Spin: AI-Native Latency UX
AI-native latency UX means streaming tokens as they arrive, not showing a spinner. Here is why perceived speed beats raw speed for model-backed features.
If a model takes six seconds to answer, do not make the user stare at a spinner for six seconds. Stream the tokens as they come. The answer starts appearing in 400 milliseconds and finishes in six seconds, and the whole thing feels fast. Same latency, different product. This is the single cheapest UX win in an AI-native feature, and most teams skip it because they wired the model call like a normal REST endpoint.
The lesson: with a model in the loop, perceived speed is a design decision, not a performance number. You do not always get to make the model faster. You always get to change how waiting feels.
Why a spinner is the wrong pattern for model output
A spinner says "something is happening, I have no idea how long." That is fine for a database query that returns in 80 milliseconds. It is hostile for a generation that runs multiple seconds. The user cannot tell if it is working or hung. They click again. Now you have two inflight calls and a worse bill.
Streaming replaces "wait, then everything" with "watch it build." People read while the model writes. By the time generation finishes, they have already consumed the first half. That is dead time you got back for free. Chatbots normalized this, but the pattern belongs anywhere a model produces text: summaries, drafts, extracted fields, explanations. If your feature shows a spinner over model output, you are leaving the easiest improvement on the table. This is part of why AI-native UX is not just adding a chatbot: the interaction has to be built around how the model actually behaves.
How to design latency UX around a model
Start by budgeting the wait, not hiding it. Three buckets:
Under 300 milliseconds, do nothing special. It reads as instant.
Between 300 milliseconds and roughly two seconds, show motion tied to the actual work. A streaming first token beats a spinner. If you cannot stream, show a skeleton of the result shape so the eye knows what is coming.
Over two seconds, narrate. "Reading the document." "Pulling the three relevant sections." "Drafting." These are not decorations. They map to real pipeline stages, so a stall in one stage tells the user (and you) where the time went. Treating latency as a product decision, not a metric is the whole move here.
The rule I hold teams to: never show a determinate progress bar you cannot honor. A fake bar that jumps to 90 percent and sits there is worse than honest motion. Model latency is variable. Lying about it just trains users to distrust your UI.
When streaming is not the right answer
Streaming is not free and not always correct. Skip it in three cases.
First, when the output is structured and only useful complete. A half-streamed JSON object or a half-parsed table is noise. Buffer it, validate it, then render the finished thing. Users do not want to watch a schema assemble.
Second, when you need to validate or guardrail the output before the user sees it. If you stream raw tokens straight to the screen, you cannot catch a bad answer before it lands. When correctness gates matter, generate fully, run your checks, then reveal. That is the tradeoff you accept when you build guardrails into an AI product.
Third, when the answer is short. A one-line classification does not need streaming theater. Return it and move on.
What this says about AI-native product architecture
The deeper point: an AI-native product is architected around the fact that its core operation is slow, variable, and probabilistic. A bolted-on feature treats the model call as a synchronous function that either returns or errors. A native one treats it as a stream of partial state that the interface renders progressively, degrades gracefully, and narrates honestly. You can see the difference in the plumbing, which is why streaming, cancellation, and partial rendering should be designed into the product around the model from the first sketch, not patched in after users complain the app feels dead.
We build these patterns into the automation surfaces at Girard AI because a slow answer that streams keeps people engaged, and a fast answer behind a spinner makes them reload. The model is the same. The product is not.
Get the waiting right and users forgive a lot of latency. Get it wrong and they will swear your fast feature is broken.