> ## Documentation Index
> Fetch the complete documentation index at: https://mintlify.com/vercel/ai/llms.txt
> Use this file to discover all available pages before exploring further.

# streamText

> API reference for the streamText function

Generates text and calls tools for a given prompt using a language model, streaming the output.

If you do not want to stream the output, use [`generateText`](/reference/ai-sdk-core/generate-text) instead.

```typescript theme={null}
import { streamText } from 'ai';
import { openai } from '@ai-sdk/openai';

const result = streamText({
  model: openai('gpt-4-turbo'),
  prompt: 'Invent a new holiday.',
});

for await (const textPart of result.textStream) {
  console.log(textPart);
}
```

## Parameters

<ParamField path="model" type="LanguageModel" required>
  The language model to use.
</ParamField>

<ParamField path="prompt" type="string">
  A simple text prompt. You can either use `prompt` or `messages` but not both.
</ParamField>

<ParamField path="messages" type="Array<CoreMessage>">
  A list of messages. You can either use `prompt` or `messages` but not both.
</ParamField>

<ParamField path="system" type="string">
  A system message that will be part of the prompt.
</ParamField>

<ParamField path="tools" type="ToolSet">
  Tools that are accessible to and can be called by the model. The model needs to support calling tools.
</ParamField>

<ParamField path="toolChoice" type="ToolChoice">
  The tool choice strategy. Default: `'auto'`.
</ParamField>

<ParamField path="maxOutputTokens" type="number">
  Maximum number of tokens to generate.
</ParamField>

<ParamField path="temperature" type="number">
  Temperature setting. The value is passed through to the provider. The range depends on the provider and model.
  It is recommended to set either `temperature` or `topP`, but not both.
</ParamField>

<ParamField path="topP" type="number">
  Nucleus sampling. The value is passed through to the provider. The range depends on the provider and model.
  It is recommended to set either `temperature` or `topP`, but not both.
</ParamField>

<ParamField path="topK" type="number">
  Only sample from the top K options for each subsequent token.
  Used to remove "long tail" low probability responses.
  Recommended for advanced use cases only. You usually only need to use temperature.
</ParamField>

<ParamField path="presencePenalty" type="number">
  Presence penalty setting.
  It affects the likelihood of the model to repeat information that is already in the prompt.
  The value is passed through to the provider. The range depends on the provider and model.
</ParamField>

<ParamField path="frequencyPenalty" type="number">
  Frequency penalty setting.
  It affects the likelihood of the model to repeatedly use the same words or phrases.
  The value is passed through to the provider. The range depends on the provider and model.
</ParamField>

<ParamField path="stopSequences" type="Array<string>">
  Stop sequences. If set, the model will stop generating text when one of the stop sequences is generated.
</ParamField>

<ParamField path="seed" type="number">
  The seed (integer) to use for random sampling.
  If set and supported by the model, calls will generate deterministic results.
</ParamField>

<ParamField path="maxRetries" type="number" default="2">
  Maximum number of retries. Set to 0 to disable retries.
</ParamField>

<ParamField path="abortSignal" type="AbortSignal">
  An optional abort signal that can be used to cancel the call.
</ParamField>

<ParamField path="timeout" type="number">
  An optional timeout in milliseconds. The call will be aborted if it takes longer than the specified timeout.
</ParamField>

<ParamField path="headers" type="Record<string, string>">
  Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.
</ParamField>

<ParamField path="stopWhen" type="StopCondition | Array<StopCondition>" default="stepCountIs(1)">
  Condition for stopping the generation when there are tool results in the last step.
  When the condition is an array, any of the conditions can be met to stop the generation.
</ParamField>

<ParamField path="output" type="Output">
  Optional specification for parsing structured outputs from the LLM response.
</ParamField>

<ParamField path="activeTools" type="Array<keyof TOOLS>">
  Limits the tools that are available for the model to call without changing the tool call and result types in the result.
</ParamField>

<ParamField path="prepareStep" type="PrepareStepFunction">
  Optional function that you can use to provide different settings for a step.
</ParamField>

<ParamField path="experimental_repairToolCall" type="ToolCallRepairFunction">
  A function that attempts to repair a tool call that failed to parse.
</ParamField>

<ParamField path="experimental_transform" type="StreamTextTransform | Array<StreamTextTransform>">
  Optional stream transformations. They are applied in the order they are provided.
  The stream transformations must maintain the stream structure for streamText to work correctly.
</ParamField>

<ParamField path="experimental_download" type="DownloadFunction">
  Custom download function to use for URLs.
  By default, files are downloaded if the model does not support the URL for the given media type.
</ParamField>

<ParamField path="includeRawChunks" type="boolean" default="false">
  Whether to include raw chunks from the provider in the stream.
  When enabled, you will receive raw chunks with type 'raw' that contain the unprocessed data from the provider.
  This allows access to cutting-edge provider features not yet wrapped by the AI SDK.
</ParamField>

<ParamField path="experimental_context" type="unknown">
  Context that is passed into tool execution.
</ParamField>

<ParamField path="experimental_telemetry" type="TelemetrySettings">
  Optional telemetry configuration (experimental).
</ParamField>

<ParamField path="providerOptions" type="ProviderOptions">
  Additional provider-specific options. They are passed through to the provider from the AI SDK
  and enable provider-specific functionality that can be fully encapsulated in the provider.
</ParamField>

<ParamField path="onChunk" type="(chunk: TextStreamPart) => void">
  Callback that is called for each chunk of the stream.
  The stream processing will pause until the callback promise is resolved.
</ParamField>

<ParamField path="onError" type="(error: Error) => void">
  Callback that is invoked when an error occurs during streaming.
  You can use it to log errors. The stream processing will pause until the callback promise is resolved.
</ParamField>

<ParamField path="experimental_onStart" type="(event: OnStartEvent) => void">
  Callback invoked when generation begins, before any LLM calls.
</ParamField>

<ParamField path="experimental_onStepStart" type="(event: OnStepStartEvent) => void">
  Callback invoked when each step begins, before the provider is called.
</ParamField>

<ParamField path="experimental_onToolCallStart" type="(event: OnToolCallStartEvent) => void">
  Callback invoked before each tool execution begins.
</ParamField>

<ParamField path="experimental_onToolCallFinish" type="(event: OnToolCallFinishEvent) => void">
  Callback invoked after each tool execution completes.
</ParamField>

<ParamField path="onStepFinish" type="(event: OnStepFinishEvent) => void">
  Callback that is called when each step (LLM call) is finished, including intermediate steps.
</ParamField>

<ParamField path="onFinish" type="(event: OnFinishEvent) => void">
  Callback that is called when the LLM response and all request tool executions are finished.
  The usage is the combined usage of all steps.
</ParamField>

<ParamField path="onAbort" type="(event: OnAbortEvent) => void">
  Callback that is called when the stream is aborted.
</ParamField>

## Returns

<ResponseField name="textStream" type="AsyncIterableStream<string>">
  A text stream that returns only the generated text deltas. You can use it as an async iterable or call `textStream.getReader()` to get a reader.
</ResponseField>

<ResponseField name="fullStream" type="AsyncIterableStream<TextStreamPart>">
  A stream with all events, including text deltas, tool calls, tool results, and metadata.
</ResponseField>

<ResponseField name="usage" type="Promise<LanguageModelUsage>">
  A promise that resolves to the total token usage.
</ResponseField>

<ResponseField name="finishReason" type="Promise<FinishReason>">
  A promise that resolves to the finish reason.
</ResponseField>

<ResponseField name="steps" type="Promise<Array<StepResult>>">
  A promise that resolves to the details for all steps.
</ResponseField>

<ResponseField name="toTextStreamResponse" type="(init?: ResponseInit) => Response">
  Creates a simple text stream response for easier integration with the Vercel AI SDK UI hooks. The response is a `text/plain` stream that streams the text parts.
</ResponseField>

<ResponseField name="pipeTextStreamToResponse" type="(response: ServerResponse, init?: ResponseInit) => void">
  Pipes the text stream to a Node.js response-like object.
</ResponseField>

## Examples

### Basic streaming

```typescript theme={null}
import { streamText } from 'ai';
import { openai } from '@ai-sdk/openai';

const result = streamText({
  model: openai('gpt-4-turbo'),
  prompt: 'Invent a new holiday.',
});

for await (const textPart of result.textStream) {
  console.log(textPart);
}
```

### Full stream with events

```typescript theme={null}
import { streamText } from 'ai';
import { openai } from '@ai-sdk/openai';

const result = streamText({
  model: openai('gpt-4-turbo'),
  prompt: 'Invent a new holiday.',
});

for await (const part of result.fullStream) {
  switch (part.type) {
    case 'text-delta':
      console.log('Text delta:', part.text);
      break;
    case 'tool-call':
      console.log('Tool call:', part.toolName);
      break;
    case 'tool-result':
      console.log('Tool result:', part.result);
      break;
    case 'finish':
      console.log('Finish reason:', part.finishReason);
      break;
  }
}
```

### Stream to response

```typescript theme={null}
import { streamText } from 'ai';
import { openai } from '@ai-sdk/openai';

export async function POST(req: Request) {
  const { prompt } = await req.json();

  const result = streamText({
    model: openai('gpt-4-turbo'),
    prompt,
  });

  return result.toTextStreamResponse();
}
```
