Stream, don't block
Use streamText when a person reads the answer.
AI SDK docsai-sdk.dev
Streaming UIs can help mitigate this issue by displaying parts of the response as they become available.
From ai-sdk and the Generating Text docs.
Same answer, two routes
Press Ask and watch when text first shows.
generateTextBad
0 msIdle
First text –Done –
const { text } = await generateText(…)streamTextGood
0 msIdle
First text –Done –
streamText(…) → result.stream// app/api/chat/route.ts
import {
streamText,
convertToModelMessages,
createUIMessageStreamResponse,
toUIMessageStream,
type UIMessage,
} from 'ai';
export async function POST(req: Request) {
const { messages }: { messages: UIMessage[] } = await req.json();
const result = streamText({
model: 'anthropic/claude-sonnet-5',
messages: await convertToModelMessages(messages),
});
return createUIMessageStreamResponse({
stream: toUIMessageStream({ stream: result.stream }),
});
}
Longer answer, longer blank
Drag the answer length.
generateTextBad
streamTextGood
Why it matters, pros and cons
Why it matters
A long answer can take many seconds. Streaming shows the first words after a fraction of that.
Pros
- Blank time is the first token, not the whole answer.
- Same total time, same tokens, same cost.
- The reader can stop a wrong answer early.
Cons
- No reader (jobs, agents, emails):
generateTextis simpler. - Errors arrive in the stream; log them with
onError. - The stream must be consumed or it never finishes.