ai 5.0.22 → 5.0.24

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,28 @@
1
1
  # ai
2
2
 
3
+ ## 5.0.24
4
+
5
+ ### Patch Changes
6
+
7
+ - f8f3682: fix: call onFinish when stream is cancelled in toUIMessageStream
8
+
9
+ Previously, onFinish was only called on normal stream completion. Now it's also called when the reader is cancelled (e.g., browser close, navigation), ensuring partial messages are persisted.
10
+
11
+ - Updated dependencies [1b5a3d3]
12
+ - Updated dependencies [c9994f9]
13
+ - @ai-sdk/provider-utils@3.0.6
14
+ - @ai-sdk/gateway@1.0.13
15
+
16
+ ## 5.0.23
17
+
18
+ ### Patch Changes
19
+
20
+ - 5099b3d: fix(ai): make `chat.addToolResult()` compatible with dynamic tool calls
21
+ - 7a2bf8d: fix(ai): support loop breaking behavior in async iterable stream
22
+ - Updated dependencies [50e2029]
23
+ - Updated dependencies [b8478f0]
24
+ - @ai-sdk/gateway@1.0.12
25
+
3
26
  ## 5.0.22
4
27
 
5
28
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -1518,7 +1518,9 @@ type DynamicToolUIPart = {
1518
1518
  callProviderMetadata?: ProviderMetadata;
1519
1519
  });
1520
1520
  declare function isToolUIPart<TOOLS extends UITools>(part: UIMessagePart<UIDataTypes, TOOLS>): part is ToolUIPart<TOOLS>;
1521
+ declare function isToolOrDynamicToolUIPart<TOOLS extends UITools>(part: UIMessagePart<UIDataTypes, TOOLS>): part is ToolUIPart<TOOLS> | DynamicToolUIPart;
1521
1522
  declare function getToolName<TOOLS extends UITools>(part: ToolUIPart<TOOLS>): keyof TOOLS;
1523
+ declare function getToolOrDynamicToolName(part: ToolUIPart<UITools> | DynamicToolUIPart): string;
1522
1524
  type InferUIMessageMetadata<T extends UIMessage> = T extends UIMessage<infer METADATA> ? METADATA : unknown;
1523
1525
  type InferUIMessageData<T extends UIMessage> = T extends UIMessage<unknown, infer DATA_TYPES> ? DATA_TYPES : UIDataTypes;
1524
1526
  type InferUIMessageTools<T extends UIMessage> = T extends UIMessage<unknown, UIDataTypes, infer TOOLS> ? TOOLS : UITools;
@@ -1651,6 +1653,10 @@ type UIMessageStreamResponseInit = ResponseInit & {
1651
1653
  }) => PromiseLike<void> | void;
1652
1654
  };
1653
1655
 
1656
+ /**
1657
+ * A type that combines AsyncIterable and ReadableStream.
1658
+ * This allows a ReadableStream to be consumed using for-await-of syntax.
1659
+ */
1654
1660
  type AsyncIterableStream<T> = AsyncIterable<T> & ReadableStream<T>;
1655
1661
 
1656
1662
  type ErrorHandler = (error: unknown) => void;
@@ -4368,4 +4374,4 @@ declare global {
4368
4374
  var AI_SDK_DEFAULT_PROVIDER: ProviderV2 | undefined;
4369
4375
  }
4370
4376
 
4371
- export { AbstractChat, AsyncIterableStream, CallSettings, CallWarning, ChatInit, ChatOnDataCallback, ChatOnErrorCallback, ChatOnFinishCallback, ChatOnToolCallCallback, ChatRequestOptions, ChatState, ChatStatus, ChatTransport, ChunkDetector, CompletionRequestOptions, CoreAssistantMessage, CoreMessage, CoreSystemMessage, CoreToolMessage, CoreUserMessage, CreateUIMessage, DataUIPart, DeepPartial, DefaultChatTransport, DownloadError, DynamicToolCall, DynamicToolError, DynamicToolResult, DynamicToolUIPart, EmbedManyResult, EmbedResult, Embedding, EmbeddingModel, EmbeddingModelUsage, ErrorHandler, Agent as Experimental_Agent, AgentSettings as Experimental_AgentSettings, GenerateImageResult as Experimental_GenerateImageResult, GeneratedFile as Experimental_GeneratedImage, SpeechResult as Experimental_SpeechResult, TranscriptionResult as Experimental_TranscriptionResult, FileUIPart, FinishReason, GenerateObjectResult, GenerateTextOnStepFinishCallback, GenerateTextResult, GeneratedAudioFile, GeneratedFile, HttpChatTransport, HttpChatTransportInitOptions, ImageModel, ImageGenerationWarning as ImageModelCallWarning, ImageModelProviderMetadata, ImageModelResponseMetadata, InferUIDataParts, InferUIMessageChunk, InferUITool, InferUITools, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, InvalidStreamPartError, InvalidToolInputError, JSONRPCError, JSONRPCMessage, JSONRPCNotification, JSONRPCRequest, JSONRPCResponse, JSONValue, JsonToSseTransformStream, LanguageModel, LanguageModelMiddleware, LanguageModelRequestMetadata, LanguageModelResponseMetadata, LanguageModelUsage, MCPClientError, MCPTransport, MessageConversionError, NoImageGeneratedError, NoObjectGeneratedError, NoOutputGeneratedError, NoOutputSpecifiedError, NoSuchProviderError, NoSuchToolError, ObjectStreamPart, output as Output, PrepareReconnectToStreamRequest, PrepareSendMessagesRequest, PrepareStepFunction, PrepareStepResult, Prompt, Provider, ProviderMetadata, ProviderRegistryProvider, ReasoningUIPart, RepairTextFunction, RetryError, SerialJobExecutor, SourceDocumentUIPart, SourceUrlUIPart, SpeechModel, SpeechModelResponseMetadata, SpeechWarning, StaticToolCall, StaticToolError, StaticToolResult, StepResult, StepStartUIPart, StopCondition, StreamObjectOnFinishCallback, StreamObjectResult, StreamTextOnChunkCallback, StreamTextOnErrorCallback, StreamTextOnFinishCallback, StreamTextOnStepFinishCallback, StreamTextResult, StreamTextTransform, TelemetrySettings, TextStreamChatTransport, TextStreamPart, TextUIPart, ToolCallRepairError, ToolCallRepairFunction, ToolChoice, ToolSet, ToolUIPart, TranscriptionModel, TranscriptionModelResponseMetadata, TranscriptionWarning, TypedToolCall, TypedToolError, TypedToolResult, UIDataPartSchemas, UIDataTypes, UIMessage, UIMessageChunk, UIMessagePart, UIMessageStreamOnFinishCallback, UIMessageStreamOptions, UIMessageStreamWriter, UITool, UITools, UI_MESSAGE_STREAM_HEADERS, UnsupportedModelVersionError, UseCompletionOptions, assistantModelMessageSchema, callCompletionApi, consumeStream, convertFileListToFileUIParts, convertToCoreMessages, convertToModelMessages, coreAssistantMessageSchema, coreMessageSchema, coreSystemMessageSchema, coreToolMessageSchema, coreUserMessageSchema, cosineSimilarity, createProviderRegistry, createTextStreamResponse, createUIMessageStream, createUIMessageStreamResponse, customProvider, defaultSettingsMiddleware, embed, embedMany, MCPClient as experimental_MCPClient, MCPClientConfig as experimental_MCPClientConfig, createMCPClient as experimental_createMCPClient, experimental_createProviderRegistry, experimental_customProvider, generateImage as experimental_generateImage, generateSpeech as experimental_generateSpeech, transcribe as experimental_transcribe, extractReasoningMiddleware, generateObject, generateText, getTextFromDataUrl, getToolName, hasToolCall, isDeepEqualData, isToolUIPart, lastAssistantMessageIsCompleteWithToolCalls, modelMessageSchema, parsePartialJson, pipeTextStreamToResponse, pipeUIMessageStreamToResponse, readUIMessageStream, simulateReadableStream, simulateStreamingMiddleware, smoothStream, stepCountIs, streamObject, streamText, systemModelMessageSchema, toolModelMessageSchema, userModelMessageSchema, validateUIMessages, wrapLanguageModel, wrapProvider };
4377
+ export { AbstractChat, AsyncIterableStream, CallSettings, CallWarning, ChatInit, ChatOnDataCallback, ChatOnErrorCallback, ChatOnFinishCallback, ChatOnToolCallCallback, ChatRequestOptions, ChatState, ChatStatus, ChatTransport, ChunkDetector, CompletionRequestOptions, CoreAssistantMessage, CoreMessage, CoreSystemMessage, CoreToolMessage, CoreUserMessage, CreateUIMessage, DataUIPart, DeepPartial, DefaultChatTransport, DownloadError, DynamicToolCall, DynamicToolError, DynamicToolResult, DynamicToolUIPart, EmbedManyResult, EmbedResult, Embedding, EmbeddingModel, EmbeddingModelUsage, ErrorHandler, Agent as Experimental_Agent, AgentSettings as Experimental_AgentSettings, GenerateImageResult as Experimental_GenerateImageResult, GeneratedFile as Experimental_GeneratedImage, SpeechResult as Experimental_SpeechResult, TranscriptionResult as Experimental_TranscriptionResult, FileUIPart, FinishReason, GenerateObjectResult, GenerateTextOnStepFinishCallback, GenerateTextResult, GeneratedAudioFile, GeneratedFile, HttpChatTransport, HttpChatTransportInitOptions, ImageModel, ImageGenerationWarning as ImageModelCallWarning, ImageModelProviderMetadata, ImageModelResponseMetadata, InferUIDataParts, InferUIMessageChunk, InferUITool, InferUITools, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, InvalidStreamPartError, InvalidToolInputError, JSONRPCError, JSONRPCMessage, JSONRPCNotification, JSONRPCRequest, JSONRPCResponse, JSONValue, JsonToSseTransformStream, LanguageModel, LanguageModelMiddleware, LanguageModelRequestMetadata, LanguageModelResponseMetadata, LanguageModelUsage, MCPClientError, MCPTransport, MessageConversionError, NoImageGeneratedError, NoObjectGeneratedError, NoOutputGeneratedError, NoOutputSpecifiedError, NoSuchProviderError, NoSuchToolError, ObjectStreamPart, output as Output, PrepareReconnectToStreamRequest, PrepareSendMessagesRequest, PrepareStepFunction, PrepareStepResult, Prompt, Provider, ProviderMetadata, ProviderRegistryProvider, ReasoningUIPart, RepairTextFunction, RetryError, SerialJobExecutor, SourceDocumentUIPart, SourceUrlUIPart, SpeechModel, SpeechModelResponseMetadata, SpeechWarning, StaticToolCall, StaticToolError, StaticToolResult, StepResult, StepStartUIPart, StopCondition, StreamObjectOnFinishCallback, StreamObjectResult, StreamTextOnChunkCallback, StreamTextOnErrorCallback, StreamTextOnFinishCallback, StreamTextOnStepFinishCallback, StreamTextResult, StreamTextTransform, TelemetrySettings, TextStreamChatTransport, TextStreamPart, TextUIPart, ToolCallRepairError, ToolCallRepairFunction, ToolChoice, ToolSet, ToolUIPart, TranscriptionModel, TranscriptionModelResponseMetadata, TranscriptionWarning, TypedToolCall, TypedToolError, TypedToolResult, UIDataPartSchemas, UIDataTypes, UIMessage, UIMessageChunk, UIMessagePart, UIMessageStreamOnFinishCallback, UIMessageStreamOptions, UIMessageStreamWriter, UITool, UITools, UI_MESSAGE_STREAM_HEADERS, UnsupportedModelVersionError, UseCompletionOptions, assistantModelMessageSchema, callCompletionApi, consumeStream, convertFileListToFileUIParts, convertToCoreMessages, convertToModelMessages, coreAssistantMessageSchema, coreMessageSchema, coreSystemMessageSchema, coreToolMessageSchema, coreUserMessageSchema, cosineSimilarity, createProviderRegistry, createTextStreamResponse, createUIMessageStream, createUIMessageStreamResponse, customProvider, defaultSettingsMiddleware, embed, embedMany, MCPClient as experimental_MCPClient, MCPClientConfig as experimental_MCPClientConfig, createMCPClient as experimental_createMCPClient, experimental_createProviderRegistry, experimental_customProvider, generateImage as experimental_generateImage, generateSpeech as experimental_generateSpeech, transcribe as experimental_transcribe, extractReasoningMiddleware, generateObject, generateText, getTextFromDataUrl, getToolName, getToolOrDynamicToolName, hasToolCall, isDeepEqualData, isToolOrDynamicToolUIPart, isToolUIPart, lastAssistantMessageIsCompleteWithToolCalls, modelMessageSchema, parsePartialJson, pipeTextStreamToResponse, pipeUIMessageStreamToResponse, readUIMessageStream, simulateReadableStream, simulateStreamingMiddleware, smoothStream, stepCountIs, streamObject, streamText, systemModelMessageSchema, toolModelMessageSchema, userModelMessageSchema, validateUIMessages, wrapLanguageModel, wrapProvider };
package/dist/index.d.ts CHANGED
@@ -1518,7 +1518,9 @@ type DynamicToolUIPart = {
1518
1518
  callProviderMetadata?: ProviderMetadata;
1519
1519
  });
1520
1520
  declare function isToolUIPart<TOOLS extends UITools>(part: UIMessagePart<UIDataTypes, TOOLS>): part is ToolUIPart<TOOLS>;
1521
+ declare function isToolOrDynamicToolUIPart<TOOLS extends UITools>(part: UIMessagePart<UIDataTypes, TOOLS>): part is ToolUIPart<TOOLS> | DynamicToolUIPart;
1521
1522
  declare function getToolName<TOOLS extends UITools>(part: ToolUIPart<TOOLS>): keyof TOOLS;
1523
+ declare function getToolOrDynamicToolName(part: ToolUIPart<UITools> | DynamicToolUIPart): string;
1522
1524
  type InferUIMessageMetadata<T extends UIMessage> = T extends UIMessage<infer METADATA> ? METADATA : unknown;
1523
1525
  type InferUIMessageData<T extends UIMessage> = T extends UIMessage<unknown, infer DATA_TYPES> ? DATA_TYPES : UIDataTypes;
1524
1526
  type InferUIMessageTools<T extends UIMessage> = T extends UIMessage<unknown, UIDataTypes, infer TOOLS> ? TOOLS : UITools;
@@ -1651,6 +1653,10 @@ type UIMessageStreamResponseInit = ResponseInit & {
1651
1653
  }) => PromiseLike<void> | void;
1652
1654
  };
1653
1655
 
1656
+ /**
1657
+ * A type that combines AsyncIterable and ReadableStream.
1658
+ * This allows a ReadableStream to be consumed using for-await-of syntax.
1659
+ */
1654
1660
  type AsyncIterableStream<T> = AsyncIterable<T> & ReadableStream<T>;
1655
1661
 
1656
1662
  type ErrorHandler = (error: unknown) => void;
@@ -4368,4 +4374,4 @@ declare global {
4368
4374
  var AI_SDK_DEFAULT_PROVIDER: ProviderV2 | undefined;
4369
4375
  }
4370
4376
 
4371
- export { AbstractChat, AsyncIterableStream, CallSettings, CallWarning, ChatInit, ChatOnDataCallback, ChatOnErrorCallback, ChatOnFinishCallback, ChatOnToolCallCallback, ChatRequestOptions, ChatState, ChatStatus, ChatTransport, ChunkDetector, CompletionRequestOptions, CoreAssistantMessage, CoreMessage, CoreSystemMessage, CoreToolMessage, CoreUserMessage, CreateUIMessage, DataUIPart, DeepPartial, DefaultChatTransport, DownloadError, DynamicToolCall, DynamicToolError, DynamicToolResult, DynamicToolUIPart, EmbedManyResult, EmbedResult, Embedding, EmbeddingModel, EmbeddingModelUsage, ErrorHandler, Agent as Experimental_Agent, AgentSettings as Experimental_AgentSettings, GenerateImageResult as Experimental_GenerateImageResult, GeneratedFile as Experimental_GeneratedImage, SpeechResult as Experimental_SpeechResult, TranscriptionResult as Experimental_TranscriptionResult, FileUIPart, FinishReason, GenerateObjectResult, GenerateTextOnStepFinishCallback, GenerateTextResult, GeneratedAudioFile, GeneratedFile, HttpChatTransport, HttpChatTransportInitOptions, ImageModel, ImageGenerationWarning as ImageModelCallWarning, ImageModelProviderMetadata, ImageModelResponseMetadata, InferUIDataParts, InferUIMessageChunk, InferUITool, InferUITools, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, InvalidStreamPartError, InvalidToolInputError, JSONRPCError, JSONRPCMessage, JSONRPCNotification, JSONRPCRequest, JSONRPCResponse, JSONValue, JsonToSseTransformStream, LanguageModel, LanguageModelMiddleware, LanguageModelRequestMetadata, LanguageModelResponseMetadata, LanguageModelUsage, MCPClientError, MCPTransport, MessageConversionError, NoImageGeneratedError, NoObjectGeneratedError, NoOutputGeneratedError, NoOutputSpecifiedError, NoSuchProviderError, NoSuchToolError, ObjectStreamPart, output as Output, PrepareReconnectToStreamRequest, PrepareSendMessagesRequest, PrepareStepFunction, PrepareStepResult, Prompt, Provider, ProviderMetadata, ProviderRegistryProvider, ReasoningUIPart, RepairTextFunction, RetryError, SerialJobExecutor, SourceDocumentUIPart, SourceUrlUIPart, SpeechModel, SpeechModelResponseMetadata, SpeechWarning, StaticToolCall, StaticToolError, StaticToolResult, StepResult, StepStartUIPart, StopCondition, StreamObjectOnFinishCallback, StreamObjectResult, StreamTextOnChunkCallback, StreamTextOnErrorCallback, StreamTextOnFinishCallback, StreamTextOnStepFinishCallback, StreamTextResult, StreamTextTransform, TelemetrySettings, TextStreamChatTransport, TextStreamPart, TextUIPart, ToolCallRepairError, ToolCallRepairFunction, ToolChoice, ToolSet, ToolUIPart, TranscriptionModel, TranscriptionModelResponseMetadata, TranscriptionWarning, TypedToolCall, TypedToolError, TypedToolResult, UIDataPartSchemas, UIDataTypes, UIMessage, UIMessageChunk, UIMessagePart, UIMessageStreamOnFinishCallback, UIMessageStreamOptions, UIMessageStreamWriter, UITool, UITools, UI_MESSAGE_STREAM_HEADERS, UnsupportedModelVersionError, UseCompletionOptions, assistantModelMessageSchema, callCompletionApi, consumeStream, convertFileListToFileUIParts, convertToCoreMessages, convertToModelMessages, coreAssistantMessageSchema, coreMessageSchema, coreSystemMessageSchema, coreToolMessageSchema, coreUserMessageSchema, cosineSimilarity, createProviderRegistry, createTextStreamResponse, createUIMessageStream, createUIMessageStreamResponse, customProvider, defaultSettingsMiddleware, embed, embedMany, MCPClient as experimental_MCPClient, MCPClientConfig as experimental_MCPClientConfig, createMCPClient as experimental_createMCPClient, experimental_createProviderRegistry, experimental_customProvider, generateImage as experimental_generateImage, generateSpeech as experimental_generateSpeech, transcribe as experimental_transcribe, extractReasoningMiddleware, generateObject, generateText, getTextFromDataUrl, getToolName, hasToolCall, isDeepEqualData, isToolUIPart, lastAssistantMessageIsCompleteWithToolCalls, modelMessageSchema, parsePartialJson, pipeTextStreamToResponse, pipeUIMessageStreamToResponse, readUIMessageStream, simulateReadableStream, simulateStreamingMiddleware, smoothStream, stepCountIs, streamObject, streamText, systemModelMessageSchema, toolModelMessageSchema, userModelMessageSchema, validateUIMessages, wrapLanguageModel, wrapProvider };
4377
+ export { AbstractChat, AsyncIterableStream, CallSettings, CallWarning, ChatInit, ChatOnDataCallback, ChatOnErrorCallback, ChatOnFinishCallback, ChatOnToolCallCallback, ChatRequestOptions, ChatState, ChatStatus, ChatTransport, ChunkDetector, CompletionRequestOptions, CoreAssistantMessage, CoreMessage, CoreSystemMessage, CoreToolMessage, CoreUserMessage, CreateUIMessage, DataUIPart, DeepPartial, DefaultChatTransport, DownloadError, DynamicToolCall, DynamicToolError, DynamicToolResult, DynamicToolUIPart, EmbedManyResult, EmbedResult, Embedding, EmbeddingModel, EmbeddingModelUsage, ErrorHandler, Agent as Experimental_Agent, AgentSettings as Experimental_AgentSettings, GenerateImageResult as Experimental_GenerateImageResult, GeneratedFile as Experimental_GeneratedImage, SpeechResult as Experimental_SpeechResult, TranscriptionResult as Experimental_TranscriptionResult, FileUIPart, FinishReason, GenerateObjectResult, GenerateTextOnStepFinishCallback, GenerateTextResult, GeneratedAudioFile, GeneratedFile, HttpChatTransport, HttpChatTransportInitOptions, ImageModel, ImageGenerationWarning as ImageModelCallWarning, ImageModelProviderMetadata, ImageModelResponseMetadata, InferUIDataParts, InferUIMessageChunk, InferUITool, InferUITools, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, InvalidStreamPartError, InvalidToolInputError, JSONRPCError, JSONRPCMessage, JSONRPCNotification, JSONRPCRequest, JSONRPCResponse, JSONValue, JsonToSseTransformStream, LanguageModel, LanguageModelMiddleware, LanguageModelRequestMetadata, LanguageModelResponseMetadata, LanguageModelUsage, MCPClientError, MCPTransport, MessageConversionError, NoImageGeneratedError, NoObjectGeneratedError, NoOutputGeneratedError, NoOutputSpecifiedError, NoSuchProviderError, NoSuchToolError, ObjectStreamPart, output as Output, PrepareReconnectToStreamRequest, PrepareSendMessagesRequest, PrepareStepFunction, PrepareStepResult, Prompt, Provider, ProviderMetadata, ProviderRegistryProvider, ReasoningUIPart, RepairTextFunction, RetryError, SerialJobExecutor, SourceDocumentUIPart, SourceUrlUIPart, SpeechModel, SpeechModelResponseMetadata, SpeechWarning, StaticToolCall, StaticToolError, StaticToolResult, StepResult, StepStartUIPart, StopCondition, StreamObjectOnFinishCallback, StreamObjectResult, StreamTextOnChunkCallback, StreamTextOnErrorCallback, StreamTextOnFinishCallback, StreamTextOnStepFinishCallback, StreamTextResult, StreamTextTransform, TelemetrySettings, TextStreamChatTransport, TextStreamPart, TextUIPart, ToolCallRepairError, ToolCallRepairFunction, ToolChoice, ToolSet, ToolUIPart, TranscriptionModel, TranscriptionModelResponseMetadata, TranscriptionWarning, TypedToolCall, TypedToolError, TypedToolResult, UIDataPartSchemas, UIDataTypes, UIMessage, UIMessageChunk, UIMessagePart, UIMessageStreamOnFinishCallback, UIMessageStreamOptions, UIMessageStreamWriter, UITool, UITools, UI_MESSAGE_STREAM_HEADERS, UnsupportedModelVersionError, UseCompletionOptions, assistantModelMessageSchema, callCompletionApi, consumeStream, convertFileListToFileUIParts, convertToCoreMessages, convertToModelMessages, coreAssistantMessageSchema, coreMessageSchema, coreSystemMessageSchema, coreToolMessageSchema, coreUserMessageSchema, cosineSimilarity, createProviderRegistry, createTextStreamResponse, createUIMessageStream, createUIMessageStreamResponse, customProvider, defaultSettingsMiddleware, embed, embedMany, MCPClient as experimental_MCPClient, MCPClientConfig as experimental_MCPClientConfig, createMCPClient as experimental_createMCPClient, experimental_createProviderRegistry, experimental_customProvider, generateImage as experimental_generateImage, generateSpeech as experimental_generateSpeech, transcribe as experimental_transcribe, extractReasoningMiddleware, generateObject, generateText, getTextFromDataUrl, getToolName, getToolOrDynamicToolName, hasToolCall, isDeepEqualData, isToolOrDynamicToolUIPart, isToolUIPart, lastAssistantMessageIsCompleteWithToolCalls, modelMessageSchema, parsePartialJson, pipeTextStreamToResponse, pipeUIMessageStreamToResponse, readUIMessageStream, simulateReadableStream, simulateStreamingMiddleware, smoothStream, stepCountIs, streamObject, streamText, systemModelMessageSchema, toolModelMessageSchema, userModelMessageSchema, validateUIMessages, wrapLanguageModel, wrapProvider };
package/dist/index.js CHANGED
@@ -92,8 +92,10 @@ __export(src_exports, {
92
92
  generateText: () => generateText,
93
93
  getTextFromDataUrl: () => getTextFromDataUrl,
94
94
  getToolName: () => getToolName,
95
+ getToolOrDynamicToolName: () => getToolOrDynamicToolName,
95
96
  hasToolCall: () => hasToolCall,
96
97
  isDeepEqualData: () => isDeepEqualData,
98
+ isToolOrDynamicToolUIPart: () => isToolOrDynamicToolUIPart,
97
99
  isToolUIPart: () => isToolUIPart,
98
100
  jsonSchema: () => import_provider_utils29.jsonSchema,
99
101
  lastAssistantMessageIsCompleteWithToolCalls: () => lastAssistantMessageIsCompleteWithToolCalls,
@@ -3332,9 +3334,18 @@ async function parsePartialJson(jsonText) {
3332
3334
  function isToolUIPart(part) {
3333
3335
  return part.type.startsWith("tool-");
3334
3336
  }
3337
+ function isDynamicToolUIPart(part) {
3338
+ return part.type === "dynamic-tool";
3339
+ }
3340
+ function isToolOrDynamicToolUIPart(part) {
3341
+ return isToolUIPart(part) || isDynamicToolUIPart(part);
3342
+ }
3335
3343
  function getToolName(part) {
3336
3344
  return part.type.split("-").slice(1).join("-");
3337
3345
  }
3346
+ function getToolOrDynamicToolName(part) {
3347
+ return isDynamicToolUIPart(part) ? part.toolName : getToolName(part);
3348
+ }
3338
3349
 
3339
3350
  // src/ui/process-ui-message-stream.ts
3340
3351
  function createStreamingUIMessageState({
@@ -3827,6 +3838,23 @@ function handleUIMessageStreamFinish({
3827
3838
  await job({ state, write: () => {
3828
3839
  } });
3829
3840
  };
3841
+ let finishCalled = false;
3842
+ const callOnFinish = async () => {
3843
+ if (finishCalled || !onFinish) {
3844
+ return;
3845
+ }
3846
+ finishCalled = true;
3847
+ const isContinuation = state.message.id === (lastMessage == null ? void 0 : lastMessage.id);
3848
+ await onFinish({
3849
+ isAborted,
3850
+ isContinuation,
3851
+ responseMessage: state.message,
3852
+ messages: [
3853
+ ...isContinuation ? originalMessages.slice(0, -1) : originalMessages,
3854
+ state.message
3855
+ ]
3856
+ });
3857
+ };
3830
3858
  return processUIMessageStream({
3831
3859
  stream: idInjectedStream,
3832
3860
  runUpdateMessageJob,
@@ -3836,17 +3864,12 @@ function handleUIMessageStreamFinish({
3836
3864
  transform(chunk, controller) {
3837
3865
  controller.enqueue(chunk);
3838
3866
  },
3867
+ // @ts-expect-error cancel is still new and missing from types https://developer.mozilla.org/en-US/docs/Web/API/TransformStream#browser_compatibility
3868
+ async cancel() {
3869
+ await callOnFinish();
3870
+ },
3839
3871
  async flush() {
3840
- const isContinuation = state.message.id === (lastMessage == null ? void 0 : lastMessage.id);
3841
- await onFinish({
3842
- isAborted,
3843
- isContinuation,
3844
- responseMessage: state.message,
3845
- messages: [
3846
- ...isContinuation ? originalMessages.slice(0, -1) : originalMessages,
3847
- state.message
3848
- ]
3849
- });
3872
+ await callOnFinish();
3850
3873
  }
3851
3874
  })
3852
3875
  );
@@ -3881,12 +3904,57 @@ function pipeUIMessageStreamToResponse({
3881
3904
  // src/util/async-iterable-stream.ts
3882
3905
  function createAsyncIterableStream(source) {
3883
3906
  const stream = source.pipeThrough(new TransformStream());
3884
- stream[Symbol.asyncIterator] = () => {
3885
- const reader = stream.getReader();
3907
+ stream[Symbol.asyncIterator] = function() {
3908
+ const reader = this.getReader();
3909
+ let finished = false;
3910
+ async function cleanup(cancelStream) {
3911
+ var _a17;
3912
+ finished = true;
3913
+ try {
3914
+ if (cancelStream) {
3915
+ await ((_a17 = reader.cancel) == null ? void 0 : _a17.call(reader));
3916
+ }
3917
+ } finally {
3918
+ try {
3919
+ reader.releaseLock();
3920
+ } catch (e) {
3921
+ }
3922
+ }
3923
+ }
3886
3924
  return {
3925
+ /**
3926
+ * Reads the next chunk from the stream.
3927
+ * @returns A promise resolving to the next IteratorResult.
3928
+ */
3887
3929
  async next() {
3930
+ if (finished) {
3931
+ return { done: true, value: void 0 };
3932
+ }
3888
3933
  const { done, value } = await reader.read();
3889
- return done ? { done: true, value: void 0 } : { done: false, value };
3934
+ if (done) {
3935
+ await cleanup(true);
3936
+ return { done: true, value: void 0 };
3937
+ }
3938
+ return { done: false, value };
3939
+ },
3940
+ /**
3941
+ * Called on early exit (e.g., break from for-await).
3942
+ * Ensures the stream is cancelled and resources are released.
3943
+ * @returns A promise resolving to a completed IteratorResult.
3944
+ */
3945
+ async return() {
3946
+ await cleanup(true);
3947
+ return { done: true, value: void 0 };
3948
+ },
3949
+ /**
3950
+ * Called on early exit with error.
3951
+ * Ensures the stream is cancelled and resources are released, then rethrows the error.
3952
+ * @param err The error to throw.
3953
+ * @returns A promise that rejects with the provided error.
3954
+ */
3955
+ async throw(err) {
3956
+ await cleanup(true);
3957
+ throw err;
3890
3958
  }
3891
3959
  };
3892
3960
  };
@@ -9285,12 +9353,12 @@ var AbstractChat = class {
9285
9353
  this.state.replaceMessage(messages.length - 1, {
9286
9354
  ...lastMessage,
9287
9355
  parts: lastMessage.parts.map(
9288
- (part) => isToolUIPart(part) && part.toolCallId === toolCallId ? { ...part, state: "output-available", output } : part
9356
+ (part) => isToolOrDynamicToolUIPart(part) && part.toolCallId === toolCallId ? { ...part, state: "output-available", output } : part
9289
9357
  )
9290
9358
  });
9291
9359
  if (this.activeResponse) {
9292
9360
  this.activeResponse.state.message.parts = this.activeResponse.state.message.parts.map(
9293
- (part) => isToolUIPart(part) && part.toolCallId === toolCallId ? {
9361
+ (part) => isToolOrDynamicToolUIPart(part) && part.toolCallId === toolCallId ? {
9294
9362
  ...part,
9295
9363
  state: "output-available",
9296
9364
  output,
@@ -9474,7 +9542,7 @@ function convertToModelMessages(messages, options) {
9474
9542
  messages = messages.map((message) => ({
9475
9543
  ...message,
9476
9544
  parts: message.parts.filter(
9477
- (part) => !isToolUIPart(part) || part.state !== "input-streaming" && part.state !== "input-available"
9545
+ (part) => !isToolOrDynamicToolUIPart(part) || part.state !== "input-streaming" && part.state !== "input-available"
9478
9546
  )
9479
9547
  }));
9480
9548
  }
@@ -9553,12 +9621,7 @@ function convertToModelMessages(messages, options) {
9553
9621
  });
9554
9622
  } else if (part.type === "dynamic-tool") {
9555
9623
  const toolName = part.toolName;
9556
- if (part.state === "input-streaming") {
9557
- throw new MessageConversionError({
9558
- originalMessage: message,
9559
- message: `incomplete tool input is not supported: ${part.toolCallId}`
9560
- });
9561
- } else {
9624
+ if (part.state !== "input-streaming") {
9562
9625
  content.push({
9563
9626
  type: "tool-call",
9564
9627
  toolCallId: part.toolCallId,
@@ -9569,12 +9632,7 @@ function convertToModelMessages(messages, options) {
9569
9632
  }
9570
9633
  } else if (isToolUIPart(part)) {
9571
9634
  const toolName = getToolName(part);
9572
- if (part.state === "input-streaming") {
9573
- throw new MessageConversionError({
9574
- originalMessage: message,
9575
- message: `incomplete tool input is not supported: ${part.toolCallId}`
9576
- });
9577
- } else {
9635
+ if (part.state !== "input-streaming") {
9578
9636
  content.push({
9579
9637
  type: "tool-call",
9580
9638
  toolCallId: part.toolCallId,
@@ -9629,13 +9687,12 @@ function convertToModelMessages(messages, options) {
9629
9687
  };
9630
9688
  }
9631
9689
  default: {
9632
- throw new MessageConversionError({
9633
- originalMessage: message,
9634
- message: `Unsupported tool part state: ${toolPart.state}`
9635
- });
9690
+ return null;
9636
9691
  }
9637
9692
  }
9638
- })
9693
+ }).filter(
9694
+ (output) => output != null
9695
+ )
9639
9696
  });
9640
9697
  }
9641
9698
  block = [];
@@ -9681,7 +9738,7 @@ function lastAssistantMessageIsCompleteWithToolCalls({
9681
9738
  const lastStepStartIndex = message.parts.reduce((lastIndex, part, index) => {
9682
9739
  return part.type === "step-start" ? index : lastIndex;
9683
9740
  }, -1);
9684
- const lastStepToolInvocations = message.parts.slice(lastStepStartIndex + 1).filter((part) => isToolUIPart(part) || part.type === "dynamic-tool");
9741
+ const lastStepToolInvocations = message.parts.slice(lastStepStartIndex + 1).filter(isToolOrDynamicToolUIPart);
9685
9742
  return lastStepToolInvocations.length > 0 && lastStepToolInvocations.every((part) => part.state === "output-available");
9686
9743
  }
9687
9744
 
@@ -10142,8 +10199,10 @@ function readUIMessageStream({
10142
10199
  generateText,
10143
10200
  getTextFromDataUrl,
10144
10201
  getToolName,
10202
+ getToolOrDynamicToolName,
10145
10203
  hasToolCall,
10146
10204
  isDeepEqualData,
10205
+ isToolOrDynamicToolUIPart,
10147
10206
  isToolUIPart,
10148
10207
  jsonSchema,
10149
10208
  lastAssistantMessageIsCompleteWithToolCalls,