Problem
While waiting for a long answer, people need to know whether the assistant is working or has stalled.
Solution
Show the answer in readable pieces as it is generated. Before text arrives, display a clear progress state. Let people stop generation and mark any interrupted answer as incomplete.
Keep formatting stable as text arrives. Handle unfinished tables, links, and code blocks without repeatedly rearranging the page.
Follow new text only while the reader stays at the bottom. If they scroll up, keep their place and offer a way to return to the latest text.
For screen readers, announce useful progress and completion rather than every small text update.
Use when
Answers take time to generate and people can start reading before they are complete.
Don’t use when
The output is only usable whole. A JSON payload, an image, a table that reflows on every row, or a three-word answer all do better arriving complete. Streaming a structure that rearranges itself as it grows is more agitating than a spinner.
Trade-offs
People see text before the full answer is available, including mistakes or incomplete qualifications. Formatting and scrolling need careful handling. Streaming can shorten the wait before reading without reducing the time required to finish the answer.
Checklist
- What’s the time to first token, and is it measured separately from total generation time?
- What fills the gap between send and first token?
- Does a half-written code fence, table, or link render as literal markdown while it streams?
- When the reader scrolls up mid-stream, does the view stay where they put it?
- Is there an obvious way back to the live edge once they have detached?
- What does a screen reader hear while three hundred tokens arrive?
- If the connection drops at token 200, what stays on screen and what does the viewer see?
- Can the viewer copy or act on a partial response before it finishes?
- Does the composer stay usable while a response is streaming?
- Is the end of the stream marked in a way a person and a screen reader can both detect?
Compare
ChatGPT keeps the composer live while a response streams, so a correction can be typed before the answer lands. Claude moves long structured output into a side panel rather than the transcript, so a document being generated does not reflow the conversation underneath it. Perplexity resolves and shows its sources before the prose begins, so the citations a sentence points at already exist by the time the sentence arrives. GitHub Copilot goes the other way for inline code completion and presents a suggestion whole, because ghost text that grows character by character inside an editor is unreadable.
Related
Message turn contains the response. Stop generation lets people interrupt it. Reasoning disclosure shows a separate summary of ongoing work.
Artifact panel holds larger output. Generation error explains when a response fails before completion.