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.
Foundations · StreamingRead docs ↗

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): generateText is simpler.
  • Errors arrive in the stream; log them with onError.
  • The stream must be consumed or it never finishes.