ai 4.3.0 → 4.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # ai
2
2
 
3
+ ## 4.3.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 665a567: fix (core): improve error handling in streamText's consumeStream method
8
+
9
+ ## 4.3.1
10
+
11
+ ### Patch Changes
12
+
13
+ - 3d1bd38: feat(smooth-stream): chunking callbacks
14
+
3
15
  ## 4.3.0
4
16
 
5
17
  ### Minor Changes
package/dist/index.d.mts CHANGED
@@ -2539,6 +2539,9 @@ type DataStreamOptions = {
2539
2539
  */
2540
2540
  experimental_sendStart?: boolean;
2541
2541
  };
2542
+ type ConsumeStreamOptions = {
2543
+ onError?: (error: unknown) => void;
2544
+ };
2542
2545
  /**
2543
2546
  A result object for accessing different stream types and additional information.
2544
2547
  */
@@ -2659,8 +2662,10 @@ interface StreamTextResult<TOOLS extends ToolSet, PARTIAL_OUTPUT> {
2659
2662
  This is useful to force the stream to finish.
2660
2663
  It effectively removes the backpressure and allows the stream to finish,
2661
2664
  triggering the `onFinish` callback and the promise resolution.
2665
+
2666
+ If an error occurs, it is passed to the optional `onError` callback.
2662
2667
  */
2663
- consumeStream(): Promise<void>;
2668
+ consumeStream(options?: ConsumeStreamOptions): Promise<void>;
2664
2669
  /**
2665
2670
  Converts the result to a data stream.
2666
2671
 
@@ -2806,6 +2811,14 @@ type TextStreamPart<TOOLS extends ToolSet> = {
2806
2811
  error: unknown;
2807
2812
  };
2808
2813
 
2814
+ /**
2815
+ * Detects the first chunk in a buffer.
2816
+ *
2817
+ * @param buffer - The buffer to detect the first chunk in.
2818
+ *
2819
+ * @returns The first detected chunk, or `undefined` if no chunk was detected.
2820
+ */
2821
+ type ChunkDetector = (buffer: string) => string | undefined | null;
2809
2822
  /**
2810
2823
  * Smooths text streaming output.
2811
2824
  *
@@ -2816,7 +2829,7 @@ type TextStreamPart<TOOLS extends ToolSet> = {
2816
2829
  */
2817
2830
  declare function smoothStream<TOOLS extends ToolSet>({ delayInMs, chunking, _internal: { delay }, }?: {
2818
2831
  delayInMs?: number | null;
2819
- chunking?: 'word' | 'line' | RegExp;
2832
+ chunking?: 'word' | 'line' | RegExp | ChunkDetector;
2820
2833
  /**
2821
2834
  * Internal. For test use only. May change without notice.
2822
2835
  */
@@ -4382,4 +4395,4 @@ declare namespace llamaindexAdapter {
4382
4395
  };
4383
4396
  }
4384
4397
 
4385
- export { AssistantContent, AssistantResponse, CallWarning, CoreAssistantMessage, CoreMessage, CoreSystemMessage, CoreTool, CoreToolCallUnion, CoreToolChoice, CoreToolMessage, CoreToolResultUnion, CoreUserMessage, DataContent, DataStreamOptions, DataStreamWriter, DownloadError, EmbedManyResult, EmbedResult, Embedding, EmbeddingModel, EmbeddingModelUsage, GenerateImageResult as Experimental_GenerateImageResult, GeneratedFile as Experimental_GeneratedImage, Experimental_LanguageModelV1Middleware, FilePart, FinishReason, GenerateObjectResult, GenerateTextOnStepFinishCallback, GenerateTextResult, GeneratedFile, ImageModel, ImageGenerationWarning as ImageModelCallWarning, ImageModelResponseMetadata, ImagePart, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, InvalidStreamPartError, InvalidToolArgumentsError, JSONRPCError, JSONRPCMessage, JSONRPCNotification, JSONRPCRequest, JSONRPCResponse, langchainAdapter as LangChainAdapter, LanguageModel, LanguageModelRequestMetadata, LanguageModelResponseMetadata, LanguageModelUsage, LanguageModelV1Middleware, llamaindexAdapter as LlamaIndexAdapter, LogProbs, MCPClientError, MCPTransport, MessageConversionError, NoImageGeneratedError, NoObjectGeneratedError, NoOutputSpecifiedError, NoSuchProviderError, NoSuchToolError, ObjectStreamPart, output as Output, Provider, ProviderMetadata, ProviderRegistryProvider, RepairTextFunction, RetryError, StepResult, StreamData, StreamObjectOnFinishCallback, StreamObjectResult, StreamTextOnChunkCallback, StreamTextOnErrorCallback, StreamTextOnFinishCallback, StreamTextOnStepFinishCallback, StreamTextResult, StreamTextTransform, TelemetrySettings, TextPart, TextStreamPart, Tool, ToolCallPart, ToolCallRepairError, ToolCallRepairFunction, ToolCallUnion, ToolChoice, ToolContent, ToolExecutionError, ToolExecutionOptions, ToolResultPart, ToolResultUnion, ToolSet, UserContent, appendClientMessage, appendResponseMessages, convertToCoreMessages, coreAssistantMessageSchema, coreMessageSchema, coreSystemMessageSchema, coreToolMessageSchema, coreUserMessageSchema, cosineSimilarity, createDataStream, createDataStreamResponse, createProviderRegistry, customProvider, defaultSettingsMiddleware, embed, embedMany, createMCPClient as experimental_createMCPClient, experimental_createProviderRegistry, experimental_customProvider, generateImage as experimental_generateImage, experimental_wrapLanguageModel, extractReasoningMiddleware, generateObject, generateText, pipeDataStreamToResponse, simulateReadableStream, simulateStreamingMiddleware, smoothStream, streamObject, streamText, tool, wrapLanguageModel };
4398
+ export { AssistantContent, AssistantResponse, CallWarning, ChunkDetector, CoreAssistantMessage, CoreMessage, CoreSystemMessage, CoreTool, CoreToolCallUnion, CoreToolChoice, CoreToolMessage, CoreToolResultUnion, CoreUserMessage, DataContent, DataStreamOptions, DataStreamWriter, DownloadError, EmbedManyResult, EmbedResult, Embedding, EmbeddingModel, EmbeddingModelUsage, GenerateImageResult as Experimental_GenerateImageResult, GeneratedFile as Experimental_GeneratedImage, Experimental_LanguageModelV1Middleware, FilePart, FinishReason, GenerateObjectResult, GenerateTextOnStepFinishCallback, GenerateTextResult, GeneratedFile, ImageModel, ImageGenerationWarning as ImageModelCallWarning, ImageModelResponseMetadata, ImagePart, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, InvalidStreamPartError, InvalidToolArgumentsError, JSONRPCError, JSONRPCMessage, JSONRPCNotification, JSONRPCRequest, JSONRPCResponse, langchainAdapter as LangChainAdapter, LanguageModel, LanguageModelRequestMetadata, LanguageModelResponseMetadata, LanguageModelUsage, LanguageModelV1Middleware, llamaindexAdapter as LlamaIndexAdapter, LogProbs, MCPClientError, MCPTransport, MessageConversionError, NoImageGeneratedError, NoObjectGeneratedError, NoOutputSpecifiedError, NoSuchProviderError, NoSuchToolError, ObjectStreamPart, output as Output, Provider, ProviderMetadata, ProviderRegistryProvider, RepairTextFunction, RetryError, StepResult, StreamData, StreamObjectOnFinishCallback, StreamObjectResult, StreamTextOnChunkCallback, StreamTextOnErrorCallback, StreamTextOnFinishCallback, StreamTextOnStepFinishCallback, StreamTextResult, StreamTextTransform, TelemetrySettings, TextPart, TextStreamPart, Tool, ToolCallPart, ToolCallRepairError, ToolCallRepairFunction, ToolCallUnion, ToolChoice, ToolContent, ToolExecutionError, ToolExecutionOptions, ToolResultPart, ToolResultUnion, ToolSet, UserContent, appendClientMessage, appendResponseMessages, convertToCoreMessages, coreAssistantMessageSchema, coreMessageSchema, coreSystemMessageSchema, coreToolMessageSchema, coreUserMessageSchema, cosineSimilarity, createDataStream, createDataStreamResponse, createProviderRegistry, customProvider, defaultSettingsMiddleware, embed, embedMany, createMCPClient as experimental_createMCPClient, experimental_createProviderRegistry, experimental_customProvider, generateImage as experimental_generateImage, experimental_wrapLanguageModel, extractReasoningMiddleware, generateObject, generateText, pipeDataStreamToResponse, simulateReadableStream, simulateStreamingMiddleware, smoothStream, streamObject, streamText, tool, wrapLanguageModel };
package/dist/index.d.ts CHANGED
@@ -2539,6 +2539,9 @@ type DataStreamOptions = {
2539
2539
  */
2540
2540
  experimental_sendStart?: boolean;
2541
2541
  };
2542
+ type ConsumeStreamOptions = {
2543
+ onError?: (error: unknown) => void;
2544
+ };
2542
2545
  /**
2543
2546
  A result object for accessing different stream types and additional information.
2544
2547
  */
@@ -2659,8 +2662,10 @@ interface StreamTextResult<TOOLS extends ToolSet, PARTIAL_OUTPUT> {
2659
2662
  This is useful to force the stream to finish.
2660
2663
  It effectively removes the backpressure and allows the stream to finish,
2661
2664
  triggering the `onFinish` callback and the promise resolution.
2665
+
2666
+ If an error occurs, it is passed to the optional `onError` callback.
2662
2667
  */
2663
- consumeStream(): Promise<void>;
2668
+ consumeStream(options?: ConsumeStreamOptions): Promise<void>;
2664
2669
  /**
2665
2670
  Converts the result to a data stream.
2666
2671
 
@@ -2806,6 +2811,14 @@ type TextStreamPart<TOOLS extends ToolSet> = {
2806
2811
  error: unknown;
2807
2812
  };
2808
2813
 
2814
+ /**
2815
+ * Detects the first chunk in a buffer.
2816
+ *
2817
+ * @param buffer - The buffer to detect the first chunk in.
2818
+ *
2819
+ * @returns The first detected chunk, or `undefined` if no chunk was detected.
2820
+ */
2821
+ type ChunkDetector = (buffer: string) => string | undefined | null;
2809
2822
  /**
2810
2823
  * Smooths text streaming output.
2811
2824
  *
@@ -2816,7 +2829,7 @@ type TextStreamPart<TOOLS extends ToolSet> = {
2816
2829
  */
2817
2830
  declare function smoothStream<TOOLS extends ToolSet>({ delayInMs, chunking, _internal: { delay }, }?: {
2818
2831
  delayInMs?: number | null;
2819
- chunking?: 'word' | 'line' | RegExp;
2832
+ chunking?: 'word' | 'line' | RegExp | ChunkDetector;
2820
2833
  /**
2821
2834
  * Internal. For test use only. May change without notice.
2822
2835
  */
@@ -4382,4 +4395,4 @@ declare namespace llamaindexAdapter {
4382
4395
  };
4383
4396
  }
4384
4397
 
4385
- export { AssistantContent, AssistantResponse, CallWarning, CoreAssistantMessage, CoreMessage, CoreSystemMessage, CoreTool, CoreToolCallUnion, CoreToolChoice, CoreToolMessage, CoreToolResultUnion, CoreUserMessage, DataContent, DataStreamOptions, DataStreamWriter, DownloadError, EmbedManyResult, EmbedResult, Embedding, EmbeddingModel, EmbeddingModelUsage, GenerateImageResult as Experimental_GenerateImageResult, GeneratedFile as Experimental_GeneratedImage, Experimental_LanguageModelV1Middleware, FilePart, FinishReason, GenerateObjectResult, GenerateTextOnStepFinishCallback, GenerateTextResult, GeneratedFile, ImageModel, ImageGenerationWarning as ImageModelCallWarning, ImageModelResponseMetadata, ImagePart, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, InvalidStreamPartError, InvalidToolArgumentsError, JSONRPCError, JSONRPCMessage, JSONRPCNotification, JSONRPCRequest, JSONRPCResponse, langchainAdapter as LangChainAdapter, LanguageModel, LanguageModelRequestMetadata, LanguageModelResponseMetadata, LanguageModelUsage, LanguageModelV1Middleware, llamaindexAdapter as LlamaIndexAdapter, LogProbs, MCPClientError, MCPTransport, MessageConversionError, NoImageGeneratedError, NoObjectGeneratedError, NoOutputSpecifiedError, NoSuchProviderError, NoSuchToolError, ObjectStreamPart, output as Output, Provider, ProviderMetadata, ProviderRegistryProvider, RepairTextFunction, RetryError, StepResult, StreamData, StreamObjectOnFinishCallback, StreamObjectResult, StreamTextOnChunkCallback, StreamTextOnErrorCallback, StreamTextOnFinishCallback, StreamTextOnStepFinishCallback, StreamTextResult, StreamTextTransform, TelemetrySettings, TextPart, TextStreamPart, Tool, ToolCallPart, ToolCallRepairError, ToolCallRepairFunction, ToolCallUnion, ToolChoice, ToolContent, ToolExecutionError, ToolExecutionOptions, ToolResultPart, ToolResultUnion, ToolSet, UserContent, appendClientMessage, appendResponseMessages, convertToCoreMessages, coreAssistantMessageSchema, coreMessageSchema, coreSystemMessageSchema, coreToolMessageSchema, coreUserMessageSchema, cosineSimilarity, createDataStream, createDataStreamResponse, createProviderRegistry, customProvider, defaultSettingsMiddleware, embed, embedMany, createMCPClient as experimental_createMCPClient, experimental_createProviderRegistry, experimental_customProvider, generateImage as experimental_generateImage, experimental_wrapLanguageModel, extractReasoningMiddleware, generateObject, generateText, pipeDataStreamToResponse, simulateReadableStream, simulateStreamingMiddleware, smoothStream, streamObject, streamText, tool, wrapLanguageModel };
4398
+ export { AssistantContent, AssistantResponse, CallWarning, ChunkDetector, CoreAssistantMessage, CoreMessage, CoreSystemMessage, CoreTool, CoreToolCallUnion, CoreToolChoice, CoreToolMessage, CoreToolResultUnion, CoreUserMessage, DataContent, DataStreamOptions, DataStreamWriter, DownloadError, EmbedManyResult, EmbedResult, Embedding, EmbeddingModel, EmbeddingModelUsage, GenerateImageResult as Experimental_GenerateImageResult, GeneratedFile as Experimental_GeneratedImage, Experimental_LanguageModelV1Middleware, FilePart, FinishReason, GenerateObjectResult, GenerateTextOnStepFinishCallback, GenerateTextResult, GeneratedFile, ImageModel, ImageGenerationWarning as ImageModelCallWarning, ImageModelResponseMetadata, ImagePart, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, InvalidStreamPartError, InvalidToolArgumentsError, JSONRPCError, JSONRPCMessage, JSONRPCNotification, JSONRPCRequest, JSONRPCResponse, langchainAdapter as LangChainAdapter, LanguageModel, LanguageModelRequestMetadata, LanguageModelResponseMetadata, LanguageModelUsage, LanguageModelV1Middleware, llamaindexAdapter as LlamaIndexAdapter, LogProbs, MCPClientError, MCPTransport, MessageConversionError, NoImageGeneratedError, NoObjectGeneratedError, NoOutputSpecifiedError, NoSuchProviderError, NoSuchToolError, ObjectStreamPart, output as Output, Provider, ProviderMetadata, ProviderRegistryProvider, RepairTextFunction, RetryError, StepResult, StreamData, StreamObjectOnFinishCallback, StreamObjectResult, StreamTextOnChunkCallback, StreamTextOnErrorCallback, StreamTextOnFinishCallback, StreamTextOnStepFinishCallback, StreamTextResult, StreamTextTransform, TelemetrySettings, TextPart, TextStreamPart, Tool, ToolCallPart, ToolCallRepairError, ToolCallRepairFunction, ToolCallUnion, ToolChoice, ToolContent, ToolExecutionError, ToolExecutionOptions, ToolResultPart, ToolResultUnion, ToolSet, UserContent, appendClientMessage, appendResponseMessages, convertToCoreMessages, coreAssistantMessageSchema, coreMessageSchema, coreSystemMessageSchema, coreToolMessageSchema, coreUserMessageSchema, cosineSimilarity, createDataStream, createDataStreamResponse, createProviderRegistry, customProvider, defaultSettingsMiddleware, embed, embedMany, createMCPClient as experimental_createMCPClient, experimental_createProviderRegistry, experimental_customProvider, generateImage as experimental_generateImage, experimental_wrapLanguageModel, extractReasoningMiddleware, generateObject, generateText, pipeDataStreamToResponse, simulateReadableStream, simulateStreamingMiddleware, smoothStream, streamObject, streamText, tool, wrapLanguageModel };
package/dist/index.js CHANGED
@@ -4676,23 +4676,49 @@ var object = ({
4676
4676
  };
4677
4677
 
4678
4678
  // core/generate-text/smooth-stream.ts
4679
- var import_provider21 = require("@ai-sdk/provider");
4680
4679
  var import_provider_utils11 = require("@ai-sdk/provider-utils");
4680
+ var import_provider21 = require("@ai-sdk/provider");
4681
4681
  var CHUNKING_REGEXPS = {
4682
- word: /\s*\S+\s+/m,
4683
- line: /[^\n]*\n/m
4682
+ word: /\S+\s+/m,
4683
+ line: /\n+/m
4684
4684
  };
4685
4685
  function smoothStream({
4686
4686
  delayInMs = 10,
4687
4687
  chunking = "word",
4688
4688
  _internal: { delay: delay2 = import_provider_utils11.delay } = {}
4689
4689
  } = {}) {
4690
- const chunkingRegexp = typeof chunking === "string" ? CHUNKING_REGEXPS[chunking] : chunking;
4691
- if (chunkingRegexp == null) {
4692
- throw new import_provider21.InvalidArgumentError({
4693
- argument: "chunking",
4694
- message: `Chunking must be "word" or "line" or a RegExp. Received: ${chunking}`
4695
- });
4690
+ let detectChunk;
4691
+ if (typeof chunking === "function") {
4692
+ detectChunk = (buffer) => {
4693
+ const match = chunking(buffer);
4694
+ if (match == null) {
4695
+ return null;
4696
+ }
4697
+ if (!match.length) {
4698
+ throw new Error(`Chunking function must return a non-empty string.`);
4699
+ }
4700
+ if (!buffer.startsWith(match)) {
4701
+ throw new Error(
4702
+ `Chunking function must return a match that is a prefix of the buffer. Received: "${match}" expected to start with "${buffer}"`
4703
+ );
4704
+ }
4705
+ return match;
4706
+ };
4707
+ } else {
4708
+ const chunkingRegex = typeof chunking === "string" ? CHUNKING_REGEXPS[chunking] : chunking;
4709
+ if (chunkingRegex == null) {
4710
+ throw new import_provider21.InvalidArgumentError({
4711
+ argument: "chunking",
4712
+ message: `Chunking must be "word" or "line" or a RegExp. Received: ${chunking}`
4713
+ });
4714
+ }
4715
+ detectChunk = (buffer) => {
4716
+ const match = chunkingRegex.exec(buffer);
4717
+ if (!match) {
4718
+ return null;
4719
+ }
4720
+ return buffer.slice(0, match.index) + (match == null ? void 0 : match[0]);
4721
+ };
4696
4722
  }
4697
4723
  return () => {
4698
4724
  let buffer = "";
@@ -4708,10 +4734,9 @@ function smoothStream({
4708
4734
  }
4709
4735
  buffer += chunk.textDelta;
4710
4736
  let match;
4711
- while ((match = chunkingRegexp.exec(buffer)) != null) {
4712
- const chunk2 = match[0];
4713
- controller.enqueue({ type: "text-delta", textDelta: chunk2 });
4714
- buffer = buffer.slice(chunk2.length);
4737
+ while ((match = detectChunk(buffer)) != null) {
4738
+ controller.enqueue({ type: "text-delta", textDelta: match });
4739
+ buffer = buffer.slice(match.length);
4715
4740
  await delay2(delayInMs);
4716
4741
  }
4717
4742
  }
@@ -4729,6 +4754,25 @@ function asArray(value) {
4729
4754
  return value === void 0 ? [] : Array.isArray(value) ? value : [value];
4730
4755
  }
4731
4756
 
4757
+ // util/consume-stream.ts
4758
+ async function consumeStream({
4759
+ stream,
4760
+ onError
4761
+ }) {
4762
+ const reader = stream.getReader();
4763
+ try {
4764
+ while (true) {
4765
+ const { done } = await reader.read();
4766
+ if (done)
4767
+ break;
4768
+ }
4769
+ } catch (error) {
4770
+ onError == null ? void 0 : onError(error);
4771
+ } finally {
4772
+ reader.releaseLock();
4773
+ }
4774
+ }
4775
+
4732
4776
  // core/util/merge-streams.ts
4733
4777
  function mergeStreams(stream1, stream2) {
4734
4778
  const reader1 = stream1.getReader();
@@ -5970,9 +6014,15 @@ var DefaultStreamTextResult = class {
5970
6014
  )
5971
6015
  );
5972
6016
  }
5973
- async consumeStream() {
5974
- const stream = this.fullStream;
5975
- for await (const part of stream) {
6017
+ async consumeStream(options) {
6018
+ var _a17;
6019
+ try {
6020
+ await consumeStream({
6021
+ stream: this.fullStream,
6022
+ onError: options == null ? void 0 : options.onError
6023
+ });
6024
+ } catch (error) {
6025
+ (_a17 = options == null ? void 0 : options.onError) == null ? void 0 : _a17.call(options, error);
5976
6026
  }
5977
6027
  }
5978
6028
  get experimental_partialOutputStream() {