diff --git a/packages/ai/src/generate-text/stream-text.ts b/packages/ai/src/generate-text/stream-text.ts index 3be48634721d..4e6a869ec761 100644 --- a/packages/ai/src/generate-text/stream-text.ts +++ b/packages/ai/src/generate-text/stream-text.ts @@ -629,6 +629,7 @@ function createOutputTransformStream< let textChunk = ''; let textProviderMetadata: ProviderMetadata | undefined = undefined; let lastPublishedJson = ''; + const isTextOutput = output.name === 'text'; function publishTextChunk({ controller, @@ -696,6 +697,17 @@ function createOutputTransformStream< textChunk += chunk.text; textProviderMetadata = chunk.providerMetadata ?? textProviderMetadata; + // For text output, every text-delta always changes the partial output, + // so we can publish immediately and avoid the expensive JSON.stringify + // comparison that causes O(n²) memory growth with large responses. + if (isTextOutput) { + publishTextChunk({ + controller, + partialOutput: text as InferPartialOutput, + }); + return; + } + // only publish if partial json can be parsed: const result = await output.parsePartialOutput({ text });