smoothStream()
smoothStream is a utility function that creates a TransformStream
for the streamText transform option
to smooth out text and reasoning streaming by buffering and releasing complete chunks with configurable delays.
This creates a more natural reading experience when streaming text and reasoning responses.
import { smoothStream, streamText } from 'ai';
const result = streamText({ model, prompt, experimental_transform: smoothStream({ delayInMs: 20, // optional: defaults to 10ms chunking: 'line', // optional: defaults to 'word' }),});Import
import { smoothStream } from "ai"API Signature
Parameters
delayInMs?:
chunking?:
Word chunking caveats with non-latin languages
The word based chunking does not work well with the following languages that do not delimit words with spaces:
- Chinese
- Japanese
- Korean
- Vietnamese
- Thai
Using Intl.Segmenter (recommended)
For these languages, we recommend using Intl.Segmenter for proper locale-aware word segmentation.
This is the preferred approach as it provides accurate word boundaries for CJK and other languages.
Intl.Segmenter is available in Node.js 16+ and all modern browsers (Chrome
87+, Firefox 125+, Safari 14.1+).
import { smoothStream, streamText } from 'ai';
const segmenter = new Intl.Segmenter('ja', { granularity: 'word' });
const result = streamText({ model: "anthropic/claude-sonnet-4.5", prompt: 'Your prompt here', experimental_transform: smoothStream({ chunking: segmenter, }),});import { smoothStream, streamText } from 'ai';
const segmenter = new Intl.Segmenter('zh', { granularity: 'word' });
const result = streamText({ model: "anthropic/claude-sonnet-4.5", prompt: 'Your prompt here', experimental_transform: smoothStream({ chunking: segmenter, }),});Regex based chunking
To use regex based chunking, pass a RegExp to the chunking option.
// To split on underscores:smoothStream({ chunking: /_+/,});
// Also can do it like this, same behaviorsmoothStream({ chunking: /[^_]*_/,});Custom callback chunking
To use a custom callback for chunking, pass a function to the chunking option.
smoothStream({ chunking: text => { const findString = 'some string'; const index = text.indexOf(findString);
if (index === -1) { return null; }
return text.slice(0, index) + findString; },});Returns
Returns a TransformStream that:
- Buffers incoming text and reasoning chunks
- Releases content when the chunking pattern is encountered
- Adds configurable delays between chunks for smooth output
- Passes through non-text/reasoning chunks (like tool calls, step-finish events) immediately