ai 5.0.248 → 5.0.249

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,11 @@
1
1
  # ai
2
2
 
3
+ ## 5.0.249
4
+
5
+ ### Patch Changes
6
+
7
+ - 989be6f: add operation-level outcomes to UI message stream end callbacks
8
+
3
9
  ## 5.0.248
4
10
 
5
11
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -1848,6 +1848,24 @@ type UIMessageChunk<METADATA = unknown, DATA_TYPES extends UIDataTypes = UIDataT
1848
1848
  };
1849
1849
  type InferUIMessageChunk<T extends UIMessage> = UIMessageChunk<InferUIMessageMetadata<T>, InferUIMessageData<T>>;
1850
1850
 
1851
+ /**
1852
+ * The operation-level outcome of a UI message stream.
1853
+ *
1854
+ * This is separate from model finish reasons and individual stream chunks.
1855
+ * Fatal stream-processing failures override outcomes declared by the stream
1856
+ * owner.
1857
+ */
1858
+ type UIMessageStreamOutcome = {
1859
+ status: 'completed';
1860
+ } | {
1861
+ status: 'failed';
1862
+ error?: unknown;
1863
+ } | {
1864
+ status: 'aborted';
1865
+ } | {
1866
+ status: 'unknown';
1867
+ };
1868
+
1851
1869
  type UIMessageStreamOnFinishCallback<UI_MESSAGE extends UIMessage> = (event: {
1852
1870
  /**
1853
1871
  * The updated list of UI messages.
@@ -1862,6 +1880,10 @@ type UIMessageStreamOnFinishCallback<UI_MESSAGE extends UIMessage> = (event: {
1862
1880
  * Indicates whether the stream was aborted.
1863
1881
  */
1864
1882
  isAborted: boolean;
1883
+ /**
1884
+ * The operation-level outcome of the stream.
1885
+ */
1886
+ outcome: UIMessageStreamOutcome;
1865
1887
  /**
1866
1888
  * The message that was sent to the client as a response
1867
1889
  * (including the original message if it was extended).
@@ -3862,6 +3884,17 @@ interface UIMessageStreamWriter<UI_MESSAGE extends UIMessage = UIMessage> {
3862
3884
  */
3863
3885
  onError: ErrorHandler | undefined;
3864
3886
  }
3887
+ interface UIMessageStreamWriterWithOutcome<UI_MESSAGE extends UIMessage = UIMessage> extends UIMessageStreamWriter<UI_MESSAGE> {
3888
+ /**
3889
+ * Declares the operation-level outcome of the composed stream.
3890
+ *
3891
+ * The first outcome declared through this method is retained. Fatal
3892
+ * execution, merge, error-handling, or downstream processing failures
3893
+ * override declared outcomes. Declaring an outcome does not write a chunk or
3894
+ * close the stream.
3895
+ */
3896
+ setOutcome(outcome: UIMessageStreamOutcome): void;
3897
+ }
3865
3898
 
3866
3899
  /**
3867
3900
  * Creates a UI message stream that can be used to send messages to the client.
@@ -3879,7 +3912,7 @@ interface UIMessageStreamWriter<UI_MESSAGE extends UIMessage = UIMessage> {
3879
3912
  declare function createUIMessageStream<UI_MESSAGE extends UIMessage>({ execute, onError, // prevent leaking server error details to the client by default
3880
3913
  originalMessages, onFinish, generateId, }: {
3881
3914
  execute: (options: {
3882
- writer: UIMessageStreamWriter<UI_MESSAGE>;
3915
+ writer: UIMessageStreamWriterWithOutcome<UI_MESSAGE>;
3883
3916
  }) => Promise<void> | void;
3884
3917
  onError?: (error: unknown) => string;
3885
3918
  /**
@@ -4481,4 +4514,4 @@ declare function validateUIMessages<UI_MESSAGE extends UIMessage>({ messages, me
4481
4514
  };
4482
4515
  }): Promise<Array<UI_MESSAGE>>;
4483
4516
 
4484
- export { AbstractChat, AsyncIterableStream, CallSettings, CallWarning, ChatInit, ChatOnDataCallback, ChatOnErrorCallback, ChatOnFinishCallback, ChatOnToolCallCallback, ChatRequestOptions, ChatState, ChatStatus, ChatTransport, ChunkDetector, CompletionRequestOptions, ContentPart, 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, DownloadFunction as Experimental_DownloadFunction, GenerateImageResult as Experimental_GenerateImageResult, GeneratedFile as Experimental_GeneratedImage, InferAgentUIMessage as Experimental_InferAgentUIMessage, LogWarningsFunction as Experimental_LogWarningsFunction, SpeechResult as Experimental_SpeechResult, TranscriptionResult as Experimental_TranscriptionResult, Warning as Experimental_Warning, FileUIPart, FinishReason, GenerateObjectResult, GenerateTextOnStepFinishCallback, GenerateTextResult, GeneratedAudioFile, GeneratedFile, HttpChatTransport, HttpChatTransportInitOptions, ImageModel, ImageGenerationWarning as ImageModelCallWarning, ImageModelProviderMetadata, ImageModelResponseMetadata, InferUIDataParts, InferUIMessageChunk, InferUITool, InferUITools, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, InvalidStreamPartError, InvalidToolInputError, JSONValue, JsonToSseTransformStream, LanguageModel, LanguageModelMiddleware, LanguageModelRequestMetadata, LanguageModelResponseMetadata, LanguageModelUsage, MessageConversionError, NoImageGeneratedError, NoObjectGeneratedError, NoOutputGeneratedError, NoOutputSpecifiedError, NoSpeechGeneratedError, NoSuchProviderError, NoSuchToolError, ObjectStreamPart, output as Output, Output as OutputInterface, PrepareReconnectToStreamRequest, PrepareSendMessagesRequest, PrepareStepFunction, PrepareStepResult, Prompt, Provider, ProviderMetadata, ProviderRegistryProvider, ReasoningOutput, ReasoningUIPart, RepairTextFunction, RetryError, SafeValidateUIMessagesResult, 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, UIToolInvocation, UITools, UI_MESSAGE_STREAM_HEADERS, UnsupportedModelVersionError, UseCompletionOptions, assistantModelMessageSchema, callCompletionApi, consumeStream, convertFileListToFileUIParts, convertToCoreMessages, convertToModelMessages, coreAssistantMessageSchema, coreMessageSchema, coreSystemMessageSchema, coreToolMessageSchema, coreUserMessageSchema, cosineSimilarity, createDownload, createProviderRegistry, createTextStreamResponse, createUIMessageStream, createUIMessageStreamResponse, customProvider, defaultSettingsMiddleware, embed, embedMany, experimental_createProviderRegistry, experimental_customProvider, generateImage as experimental_generateImage, generateSpeech as experimental_generateSpeech, transcribe as experimental_transcribe, extractReasoningMiddleware, generateObject, generateText, getTextFromDataUrl, getToolName, getToolOrDynamicToolName, hasToolCall, isDataUIPart, isDeepEqualData, isFileUIPart, isReasoningUIPart, isTextUIPart, isToolOrDynamicToolUIPart, isToolUIPart, lastAssistantMessageIsCompleteWithToolCalls, modelMessageSchema, parsePartialJson, pipeTextStreamToResponse, pipeUIMessageStreamToResponse, pruneMessages, readUIMessageStream, safeValidateUIMessages, simulateReadableStream, simulateStreamingMiddleware, smoothStream, stepCountIs, streamObject, streamText, systemModelMessageSchema, toolModelMessageSchema, uiMessageChunkSchema, userModelMessageSchema, validateUIMessages, wrapLanguageModel, wrapProvider };
4517
+ export { AbstractChat, AsyncIterableStream, CallSettings, CallWarning, ChatInit, ChatOnDataCallback, ChatOnErrorCallback, ChatOnFinishCallback, ChatOnToolCallCallback, ChatRequestOptions, ChatState, ChatStatus, ChatTransport, ChunkDetector, CompletionRequestOptions, ContentPart, 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, DownloadFunction as Experimental_DownloadFunction, GenerateImageResult as Experimental_GenerateImageResult, GeneratedFile as Experimental_GeneratedImage, InferAgentUIMessage as Experimental_InferAgentUIMessage, LogWarningsFunction as Experimental_LogWarningsFunction, SpeechResult as Experimental_SpeechResult, TranscriptionResult as Experimental_TranscriptionResult, Warning as Experimental_Warning, FileUIPart, FinishReason, GenerateObjectResult, GenerateTextOnStepFinishCallback, GenerateTextResult, GeneratedAudioFile, GeneratedFile, HttpChatTransport, HttpChatTransportInitOptions, ImageModel, ImageGenerationWarning as ImageModelCallWarning, ImageModelProviderMetadata, ImageModelResponseMetadata, InferUIDataParts, InferUIMessageChunk, InferUITool, InferUITools, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, InvalidStreamPartError, InvalidToolInputError, JSONValue, JsonToSseTransformStream, LanguageModel, LanguageModelMiddleware, LanguageModelRequestMetadata, LanguageModelResponseMetadata, LanguageModelUsage, MessageConversionError, NoImageGeneratedError, NoObjectGeneratedError, NoOutputGeneratedError, NoOutputSpecifiedError, NoSpeechGeneratedError, NoSuchProviderError, NoSuchToolError, ObjectStreamPart, output as Output, Output as OutputInterface, PrepareReconnectToStreamRequest, PrepareSendMessagesRequest, PrepareStepFunction, PrepareStepResult, Prompt, Provider, ProviderMetadata, ProviderRegistryProvider, ReasoningOutput, ReasoningUIPart, RepairTextFunction, RetryError, SafeValidateUIMessagesResult, 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, UIMessageStreamOutcome, UIMessageStreamWriter, UIMessageStreamWriterWithOutcome, UITool, UIToolInvocation, UITools, UI_MESSAGE_STREAM_HEADERS, UnsupportedModelVersionError, UseCompletionOptions, assistantModelMessageSchema, callCompletionApi, consumeStream, convertFileListToFileUIParts, convertToCoreMessages, convertToModelMessages, coreAssistantMessageSchema, coreMessageSchema, coreSystemMessageSchema, coreToolMessageSchema, coreUserMessageSchema, cosineSimilarity, createDownload, createProviderRegistry, createTextStreamResponse, createUIMessageStream, createUIMessageStreamResponse, customProvider, defaultSettingsMiddleware, embed, embedMany, experimental_createProviderRegistry, experimental_customProvider, generateImage as experimental_generateImage, generateSpeech as experimental_generateSpeech, transcribe as experimental_transcribe, extractReasoningMiddleware, generateObject, generateText, getTextFromDataUrl, getToolName, getToolOrDynamicToolName, hasToolCall, isDataUIPart, isDeepEqualData, isFileUIPart, isReasoningUIPart, isTextUIPart, isToolOrDynamicToolUIPart, isToolUIPart, lastAssistantMessageIsCompleteWithToolCalls, modelMessageSchema, parsePartialJson, pipeTextStreamToResponse, pipeUIMessageStreamToResponse, pruneMessages, readUIMessageStream, safeValidateUIMessages, simulateReadableStream, simulateStreamingMiddleware, smoothStream, stepCountIs, streamObject, streamText, systemModelMessageSchema, toolModelMessageSchema, uiMessageChunkSchema, userModelMessageSchema, validateUIMessages, wrapLanguageModel, wrapProvider };
package/dist/index.d.ts CHANGED
@@ -1848,6 +1848,24 @@ type UIMessageChunk<METADATA = unknown, DATA_TYPES extends UIDataTypes = UIDataT
1848
1848
  };
1849
1849
  type InferUIMessageChunk<T extends UIMessage> = UIMessageChunk<InferUIMessageMetadata<T>, InferUIMessageData<T>>;
1850
1850
 
1851
+ /**
1852
+ * The operation-level outcome of a UI message stream.
1853
+ *
1854
+ * This is separate from model finish reasons and individual stream chunks.
1855
+ * Fatal stream-processing failures override outcomes declared by the stream
1856
+ * owner.
1857
+ */
1858
+ type UIMessageStreamOutcome = {
1859
+ status: 'completed';
1860
+ } | {
1861
+ status: 'failed';
1862
+ error?: unknown;
1863
+ } | {
1864
+ status: 'aborted';
1865
+ } | {
1866
+ status: 'unknown';
1867
+ };
1868
+
1851
1869
  type UIMessageStreamOnFinishCallback<UI_MESSAGE extends UIMessage> = (event: {
1852
1870
  /**
1853
1871
  * The updated list of UI messages.
@@ -1862,6 +1880,10 @@ type UIMessageStreamOnFinishCallback<UI_MESSAGE extends UIMessage> = (event: {
1862
1880
  * Indicates whether the stream was aborted.
1863
1881
  */
1864
1882
  isAborted: boolean;
1883
+ /**
1884
+ * The operation-level outcome of the stream.
1885
+ */
1886
+ outcome: UIMessageStreamOutcome;
1865
1887
  /**
1866
1888
  * The message that was sent to the client as a response
1867
1889
  * (including the original message if it was extended).
@@ -3862,6 +3884,17 @@ interface UIMessageStreamWriter<UI_MESSAGE extends UIMessage = UIMessage> {
3862
3884
  */
3863
3885
  onError: ErrorHandler | undefined;
3864
3886
  }
3887
+ interface UIMessageStreamWriterWithOutcome<UI_MESSAGE extends UIMessage = UIMessage> extends UIMessageStreamWriter<UI_MESSAGE> {
3888
+ /**
3889
+ * Declares the operation-level outcome of the composed stream.
3890
+ *
3891
+ * The first outcome declared through this method is retained. Fatal
3892
+ * execution, merge, error-handling, or downstream processing failures
3893
+ * override declared outcomes. Declaring an outcome does not write a chunk or
3894
+ * close the stream.
3895
+ */
3896
+ setOutcome(outcome: UIMessageStreamOutcome): void;
3897
+ }
3865
3898
 
3866
3899
  /**
3867
3900
  * Creates a UI message stream that can be used to send messages to the client.
@@ -3879,7 +3912,7 @@ interface UIMessageStreamWriter<UI_MESSAGE extends UIMessage = UIMessage> {
3879
3912
  declare function createUIMessageStream<UI_MESSAGE extends UIMessage>({ execute, onError, // prevent leaking server error details to the client by default
3880
3913
  originalMessages, onFinish, generateId, }: {
3881
3914
  execute: (options: {
3882
- writer: UIMessageStreamWriter<UI_MESSAGE>;
3915
+ writer: UIMessageStreamWriterWithOutcome<UI_MESSAGE>;
3883
3916
  }) => Promise<void> | void;
3884
3917
  onError?: (error: unknown) => string;
3885
3918
  /**
@@ -4481,4 +4514,4 @@ declare function validateUIMessages<UI_MESSAGE extends UIMessage>({ messages, me
4481
4514
  };
4482
4515
  }): Promise<Array<UI_MESSAGE>>;
4483
4516
 
4484
- export { AbstractChat, AsyncIterableStream, CallSettings, CallWarning, ChatInit, ChatOnDataCallback, ChatOnErrorCallback, ChatOnFinishCallback, ChatOnToolCallCallback, ChatRequestOptions, ChatState, ChatStatus, ChatTransport, ChunkDetector, CompletionRequestOptions, ContentPart, 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, DownloadFunction as Experimental_DownloadFunction, GenerateImageResult as Experimental_GenerateImageResult, GeneratedFile as Experimental_GeneratedImage, InferAgentUIMessage as Experimental_InferAgentUIMessage, LogWarningsFunction as Experimental_LogWarningsFunction, SpeechResult as Experimental_SpeechResult, TranscriptionResult as Experimental_TranscriptionResult, Warning as Experimental_Warning, FileUIPart, FinishReason, GenerateObjectResult, GenerateTextOnStepFinishCallback, GenerateTextResult, GeneratedAudioFile, GeneratedFile, HttpChatTransport, HttpChatTransportInitOptions, ImageModel, ImageGenerationWarning as ImageModelCallWarning, ImageModelProviderMetadata, ImageModelResponseMetadata, InferUIDataParts, InferUIMessageChunk, InferUITool, InferUITools, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, InvalidStreamPartError, InvalidToolInputError, JSONValue, JsonToSseTransformStream, LanguageModel, LanguageModelMiddleware, LanguageModelRequestMetadata, LanguageModelResponseMetadata, LanguageModelUsage, MessageConversionError, NoImageGeneratedError, NoObjectGeneratedError, NoOutputGeneratedError, NoOutputSpecifiedError, NoSpeechGeneratedError, NoSuchProviderError, NoSuchToolError, ObjectStreamPart, output as Output, Output as OutputInterface, PrepareReconnectToStreamRequest, PrepareSendMessagesRequest, PrepareStepFunction, PrepareStepResult, Prompt, Provider, ProviderMetadata, ProviderRegistryProvider, ReasoningOutput, ReasoningUIPart, RepairTextFunction, RetryError, SafeValidateUIMessagesResult, 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, UIToolInvocation, UITools, UI_MESSAGE_STREAM_HEADERS, UnsupportedModelVersionError, UseCompletionOptions, assistantModelMessageSchema, callCompletionApi, consumeStream, convertFileListToFileUIParts, convertToCoreMessages, convertToModelMessages, coreAssistantMessageSchema, coreMessageSchema, coreSystemMessageSchema, coreToolMessageSchema, coreUserMessageSchema, cosineSimilarity, createDownload, createProviderRegistry, createTextStreamResponse, createUIMessageStream, createUIMessageStreamResponse, customProvider, defaultSettingsMiddleware, embed, embedMany, experimental_createProviderRegistry, experimental_customProvider, generateImage as experimental_generateImage, generateSpeech as experimental_generateSpeech, transcribe as experimental_transcribe, extractReasoningMiddleware, generateObject, generateText, getTextFromDataUrl, getToolName, getToolOrDynamicToolName, hasToolCall, isDataUIPart, isDeepEqualData, isFileUIPart, isReasoningUIPart, isTextUIPart, isToolOrDynamicToolUIPart, isToolUIPart, lastAssistantMessageIsCompleteWithToolCalls, modelMessageSchema, parsePartialJson, pipeTextStreamToResponse, pipeUIMessageStreamToResponse, pruneMessages, readUIMessageStream, safeValidateUIMessages, simulateReadableStream, simulateStreamingMiddleware, smoothStream, stepCountIs, streamObject, streamText, systemModelMessageSchema, toolModelMessageSchema, uiMessageChunkSchema, userModelMessageSchema, validateUIMessages, wrapLanguageModel, wrapProvider };
4517
+ export { AbstractChat, AsyncIterableStream, CallSettings, CallWarning, ChatInit, ChatOnDataCallback, ChatOnErrorCallback, ChatOnFinishCallback, ChatOnToolCallCallback, ChatRequestOptions, ChatState, ChatStatus, ChatTransport, ChunkDetector, CompletionRequestOptions, ContentPart, 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, DownloadFunction as Experimental_DownloadFunction, GenerateImageResult as Experimental_GenerateImageResult, GeneratedFile as Experimental_GeneratedImage, InferAgentUIMessage as Experimental_InferAgentUIMessage, LogWarningsFunction as Experimental_LogWarningsFunction, SpeechResult as Experimental_SpeechResult, TranscriptionResult as Experimental_TranscriptionResult, Warning as Experimental_Warning, FileUIPart, FinishReason, GenerateObjectResult, GenerateTextOnStepFinishCallback, GenerateTextResult, GeneratedAudioFile, GeneratedFile, HttpChatTransport, HttpChatTransportInitOptions, ImageModel, ImageGenerationWarning as ImageModelCallWarning, ImageModelProviderMetadata, ImageModelResponseMetadata, InferUIDataParts, InferUIMessageChunk, InferUITool, InferUITools, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, InvalidStreamPartError, InvalidToolInputError, JSONValue, JsonToSseTransformStream, LanguageModel, LanguageModelMiddleware, LanguageModelRequestMetadata, LanguageModelResponseMetadata, LanguageModelUsage, MessageConversionError, NoImageGeneratedError, NoObjectGeneratedError, NoOutputGeneratedError, NoOutputSpecifiedError, NoSpeechGeneratedError, NoSuchProviderError, NoSuchToolError, ObjectStreamPart, output as Output, Output as OutputInterface, PrepareReconnectToStreamRequest, PrepareSendMessagesRequest, PrepareStepFunction, PrepareStepResult, Prompt, Provider, ProviderMetadata, ProviderRegistryProvider, ReasoningOutput, ReasoningUIPart, RepairTextFunction, RetryError, SafeValidateUIMessagesResult, 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, UIMessageStreamOutcome, UIMessageStreamWriter, UIMessageStreamWriterWithOutcome, UITool, UIToolInvocation, UITools, UI_MESSAGE_STREAM_HEADERS, UnsupportedModelVersionError, UseCompletionOptions, assistantModelMessageSchema, callCompletionApi, consumeStream, convertFileListToFileUIParts, convertToCoreMessages, convertToModelMessages, coreAssistantMessageSchema, coreMessageSchema, coreSystemMessageSchema, coreToolMessageSchema, coreUserMessageSchema, cosineSimilarity, createDownload, createProviderRegistry, createTextStreamResponse, createUIMessageStream, createUIMessageStreamResponse, customProvider, defaultSettingsMiddleware, embed, embedMany, experimental_createProviderRegistry, experimental_customProvider, generateImage as experimental_generateImage, generateSpeech as experimental_generateSpeech, transcribe as experimental_transcribe, extractReasoningMiddleware, generateObject, generateText, getTextFromDataUrl, getToolName, getToolOrDynamicToolName, hasToolCall, isDataUIPart, isDeepEqualData, isFileUIPart, isReasoningUIPart, isTextUIPart, isToolOrDynamicToolUIPart, isToolUIPart, lastAssistantMessageIsCompleteWithToolCalls, modelMessageSchema, parsePartialJson, pipeTextStreamToResponse, pipeUIMessageStreamToResponse, pruneMessages, readUIMessageStream, safeValidateUIMessages, simulateReadableStream, simulateStreamingMiddleware, smoothStream, stepCountIs, streamObject, streamText, systemModelMessageSchema, toolModelMessageSchema, uiMessageChunkSchema, userModelMessageSchema, validateUIMessages, wrapLanguageModel, wrapProvider };
package/dist/index.js CHANGED
@@ -816,7 +816,7 @@ function detectMediaType({
816
816
  var import_provider_utils2 = require("@ai-sdk/provider-utils");
817
817
 
818
818
  // src/version.ts
819
- var VERSION = true ? "5.0.248" : "0.0.0-test";
819
+ var VERSION = true ? "5.0.249" : "0.0.0-test";
820
820
 
821
821
  // src/util/download/download.ts
822
822
  var download = async ({
@@ -4141,7 +4141,8 @@ function handleUIMessageStreamFinish({
4141
4141
  originalMessages = [],
4142
4142
  onFinish,
4143
4143
  onError,
4144
- stream
4144
+ stream,
4145
+ getOutcome
4145
4146
  }) {
4146
4147
  let lastMessage = originalMessages == null ? void 0 : originalMessages[originalMessages.length - 1];
4147
4148
  if ((lastMessage == null ? void 0 : lastMessage.role) !== "assistant") {
@@ -4150,19 +4151,34 @@ function handleUIMessageStreamFinish({
4150
4151
  messageId = lastMessage.id;
4151
4152
  }
4152
4153
  let isAborted = false;
4154
+ let hasProcessingFailure = false;
4155
+ let processingError;
4156
+ const recordProcessingFailure = (error) => {
4157
+ hasProcessingFailure = true;
4158
+ processingError = error;
4159
+ };
4153
4160
  const idInjectedStream = stream.pipeThrough(
4154
4161
  new TransformStream({
4155
4162
  transform(chunk, controller) {
4156
- if (chunk.type === "start") {
4157
- const startChunk = chunk;
4158
- if (startChunk.messageId == null && messageId != null) {
4159
- startChunk.messageId = messageId;
4163
+ try {
4164
+ let outputChunk = chunk;
4165
+ if (chunk.type === "start") {
4166
+ const startChunk = chunk;
4167
+ if (startChunk.messageId == null && messageId != null) {
4168
+ outputChunk = {
4169
+ ...startChunk,
4170
+ messageId
4171
+ };
4172
+ }
4160
4173
  }
4174
+ if (chunk.type === "abort") {
4175
+ isAborted = true;
4176
+ }
4177
+ controller.enqueue(outputChunk);
4178
+ } catch (error) {
4179
+ recordProcessingFailure(error);
4180
+ throw error;
4161
4181
  }
4162
- if (chunk.type === "abort") {
4163
- isAborted = true;
4164
- }
4165
- controller.enqueue(chunk);
4166
4182
  }
4167
4183
  })
4168
4184
  );
@@ -4175,19 +4191,28 @@ function handleUIMessageStreamFinish({
4175
4191
  // will be overridden by the stream
4176
4192
  });
4177
4193
  const runUpdateMessageJob = async (job) => {
4178
- await job({ state, write: () => {
4179
- } });
4194
+ try {
4195
+ await job({ state, write: () => {
4196
+ } });
4197
+ } catch (error) {
4198
+ recordProcessingFailure(error);
4199
+ throw error;
4200
+ }
4180
4201
  };
4181
4202
  let finishCalled = false;
4182
4203
  const callOnFinish = async () => {
4204
+ var _a16;
4183
4205
  if (finishCalled || !onFinish) {
4184
4206
  return;
4185
4207
  }
4186
4208
  finishCalled = true;
4187
4209
  const isContinuation = state.message.id === (lastMessage == null ? void 0 : lastMessage.id);
4210
+ const declaredOutcome = (_a16 = getOutcome == null ? void 0 : getOutcome()) != null ? _a16 : { status: "unknown" };
4211
+ const outcome = hasProcessingFailure ? { status: "failed", error: processingError } : declaredOutcome.status === "unknown" && isAborted ? { status: "aborted" } : declaredOutcome;
4188
4212
  await onFinish({
4189
- isAborted,
4213
+ isAborted: isAborted || outcome.status === "aborted",
4190
4214
  isContinuation,
4215
+ outcome,
4191
4216
  responseMessage: state.message,
4192
4217
  messages: [
4193
4218
  ...isContinuation ? originalMessages.slice(0, -1) : originalMessages,
@@ -5780,6 +5805,17 @@ var DefaultStreamTextResult = class {
5780
5805
  onError = () => "An error occurred."
5781
5806
  // prevent leaking server error details to the client by default
5782
5807
  } = {}) {
5808
+ let outcome = { status: "unknown" };
5809
+ let hasFatalFailure = false;
5810
+ const setSourceOutcome = (newOutcome) => {
5811
+ if (!hasFatalFailure && outcome.status !== "completed" && outcome.status !== "aborted" && newOutcome.status !== "unknown" && (outcome.status === "unknown" || newOutcome.status !== "failed")) {
5812
+ outcome = newOutcome;
5813
+ }
5814
+ };
5815
+ const failOutcome = (error) => {
5816
+ hasFatalFailure = true;
5817
+ outcome = { status: "failed", error };
5818
+ };
5783
5819
  const responseMessageId = generateMessageId != null ? getResponseUIMessageId({
5784
5820
  originalMessages,
5785
5821
  responseMessageId: generateMessageId
@@ -5791,7 +5827,48 @@ var DefaultStreamTextResult = class {
5791
5827
  const dynamic = ((_b = (_a16 = this.tools) == null ? void 0 : _a16[toolName]) == null ? void 0 : _b.type) === "dynamic";
5792
5828
  return dynamic ? true : void 0;
5793
5829
  };
5794
- const baseStream = this.fullStream.pipeThrough(
5830
+ const sourceReader = this.fullStream.getReader();
5831
+ let sourceReaderReleased = false;
5832
+ let sourceStreamCancelled = false;
5833
+ const releaseSourceReader = () => {
5834
+ if (!sourceReaderReleased) {
5835
+ sourceReader.releaseLock();
5836
+ sourceReaderReleased = true;
5837
+ }
5838
+ };
5839
+ const sourceStream = new ReadableStream({
5840
+ async pull(controller) {
5841
+ try {
5842
+ const { done, value } = await sourceReader.read();
5843
+ if (done) {
5844
+ releaseSourceReader();
5845
+ if (!sourceStreamCancelled) {
5846
+ controller.close();
5847
+ }
5848
+ } else {
5849
+ controller.enqueue(value);
5850
+ }
5851
+ } catch (error) {
5852
+ releaseSourceReader();
5853
+ if (!sourceStreamCancelled) {
5854
+ failOutcome(error);
5855
+ controller.error(error);
5856
+ }
5857
+ }
5858
+ },
5859
+ async cancel(reason) {
5860
+ sourceStreamCancelled = true;
5861
+ if (sourceReaderReleased) {
5862
+ return;
5863
+ }
5864
+ try {
5865
+ await sourceReader.cancel(reason);
5866
+ } finally {
5867
+ releaseSourceReader();
5868
+ }
5869
+ }
5870
+ });
5871
+ const baseStream = sourceStream.pipeThrough(
5795
5872
  new TransformStream({
5796
5873
  transform: async (part, controller) => {
5797
5874
  const messageMetadataValue = messageMetadata == null ? void 0 : messageMetadata({ part });
@@ -6005,16 +6082,65 @@ var DefaultStreamTextResult = class {
6005
6082
  messageMetadata: messageMetadataValue
6006
6083
  });
6007
6084
  }
6085
+ if (part.type === "finish") {
6086
+ setSourceOutcome({ status: "completed" });
6087
+ } else if (part.type === "abort") {
6088
+ setSourceOutcome({ status: "aborted" });
6089
+ } else if (part.type === "error") {
6090
+ setSourceOutcome({ status: "failed", error: part.error });
6091
+ }
6008
6092
  }
6009
6093
  })
6010
6094
  );
6095
+ const baseStreamReader = baseStream.getReader();
6096
+ let baseStreamReaderReleased = false;
6097
+ let baseStreamCancelled = false;
6098
+ const releaseBaseStreamReader = () => {
6099
+ if (!baseStreamReaderReleased) {
6100
+ baseStreamReader.releaseLock();
6101
+ baseStreamReaderReleased = true;
6102
+ }
6103
+ };
6104
+ const trackedBaseStream = new ReadableStream({
6105
+ async pull(controller) {
6106
+ try {
6107
+ const { done, value } = await baseStreamReader.read();
6108
+ if (done) {
6109
+ releaseBaseStreamReader();
6110
+ if (!baseStreamCancelled) {
6111
+ controller.close();
6112
+ }
6113
+ } else {
6114
+ controller.enqueue(value);
6115
+ }
6116
+ } catch (error) {
6117
+ releaseBaseStreamReader();
6118
+ if (!baseStreamCancelled) {
6119
+ failOutcome(error);
6120
+ controller.error(error);
6121
+ }
6122
+ }
6123
+ },
6124
+ async cancel(reason) {
6125
+ baseStreamCancelled = true;
6126
+ if (baseStreamReaderReleased) {
6127
+ return;
6128
+ }
6129
+ try {
6130
+ await baseStreamReader.cancel(reason);
6131
+ } finally {
6132
+ releaseBaseStreamReader();
6133
+ }
6134
+ }
6135
+ });
6011
6136
  return createAsyncIterableStream(
6012
6137
  handleUIMessageStreamFinish({
6013
- stream: baseStream,
6138
+ stream: trackedBaseStream,
6014
6139
  messageId: responseMessageId != null ? responseMessageId : generateMessageId == null ? void 0 : generateMessageId(),
6015
6140
  originalMessages,
6016
6141
  onFinish,
6017
- onError
6142
+ onError,
6143
+ getOutcome: () => outcome
6018
6144
  })
6019
6145
  );
6020
6146
  }
@@ -10316,6 +10442,7 @@ function createUIMessageStream({
10316
10442
  }) {
10317
10443
  let controller;
10318
10444
  const ongoingStreamPromises = [];
10445
+ let outcome = { status: "unknown" };
10319
10446
  const stream = new ReadableStream({
10320
10447
  start(controllerArg) {
10321
10448
  controller = controllerArg;
@@ -10327,6 +10454,35 @@ function createUIMessageStream({
10327
10454
  } catch (error) {
10328
10455
  }
10329
10456
  }
10457
+ function setOutcome(newOutcome) {
10458
+ if (outcome.status === "unknown" && newOutcome.status !== "unknown") {
10459
+ outcome = newOutcome;
10460
+ }
10461
+ }
10462
+ function failOutcome(error) {
10463
+ outcome = { status: "failed", error };
10464
+ }
10465
+ function safeError(error) {
10466
+ try {
10467
+ controller.error(error);
10468
+ } catch (e) {
10469
+ }
10470
+ }
10471
+ function handleError(error) {
10472
+ failOutcome(error);
10473
+ let errorText;
10474
+ try {
10475
+ errorText = onError(error);
10476
+ } catch (onErrorError) {
10477
+ failOutcome(onErrorError);
10478
+ safeError(onErrorError);
10479
+ return;
10480
+ }
10481
+ safeEnqueue({
10482
+ type: "error",
10483
+ errorText
10484
+ });
10485
+ }
10330
10486
  try {
10331
10487
  const result = execute({
10332
10488
  writer: {
@@ -10344,38 +10500,29 @@ function createUIMessageStream({
10344
10500
  safeEnqueue(value);
10345
10501
  }
10346
10502
  })().catch((error) => {
10347
- safeEnqueue({
10348
- type: "error",
10349
- errorText: onError(error)
10350
- });
10503
+ handleError(error);
10351
10504
  })
10352
10505
  );
10353
10506
  },
10507
+ setOutcome,
10354
10508
  onError
10355
10509
  }
10356
10510
  });
10357
10511
  if (result) {
10358
10512
  ongoingStreamPromises.push(
10359
10513
  result.catch((error) => {
10360
- safeEnqueue({
10361
- type: "error",
10362
- errorText: onError(error)
10363
- });
10514
+ handleError(error);
10364
10515
  })
10365
10516
  );
10366
10517
  }
10367
10518
  } catch (error) {
10368
- safeEnqueue({
10369
- type: "error",
10370
- errorText: onError(error)
10371
- });
10519
+ handleError(error);
10372
10520
  }
10373
- const waitForStreams = new Promise(async (resolve2) => {
10521
+ const waitForStreams = (async () => {
10374
10522
  while (ongoingStreamPromises.length > 0) {
10375
10523
  await ongoingStreamPromises.shift();
10376
10524
  }
10377
- resolve2();
10378
- });
10525
+ })();
10379
10526
  waitForStreams.finally(() => {
10380
10527
  try {
10381
10528
  controller.close();
@@ -10387,7 +10534,8 @@ function createUIMessageStream({
10387
10534
  messageId: generateId3(),
10388
10535
  originalMessages,
10389
10536
  onFinish,
10390
- onError
10537
+ onError,
10538
+ getOutcome: () => outcome
10391
10539
  });
10392
10540
  }
10393
10541