ai 7.0.148 → 7.0.150

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.
Files changed (42) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/index.d.ts +168 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +325 -35
  5. package/dist/index.js.map +1 -1
  6. package/dist/internal/index.d.ts +2 -1
  7. package/dist/internal/index.d.ts.map +1 -1
  8. package/dist/internal/index.js +4 -1
  9. package/dist/internal/index.js.map +1 -1
  10. package/dist/test/index.d.ts +17 -2
  11. package/dist/test/index.d.ts.map +1 -1
  12. package/dist/test/index.js +12 -1
  13. package/dist/test/index.js.map +1 -1
  14. package/docs/03-ai-sdk-core/15-tools-and-tool-calling.mdx +7 -0
  15. package/docs/03-ai-sdk-core/18-code-mode.mdx +3 -1
  16. package/docs/03-ai-sdk-core/36-transcription.mdx +40 -39
  17. package/docs/03-ai-sdk-core/37-speech.mdx +66 -0
  18. package/docs/03-ai-sdk-core/60-telemetry.mdx +25 -2
  19. package/docs/03-ai-sdk-harnesses/05-harness-adapters.mdx +1 -1
  20. package/docs/07-reference/01-ai-sdk-core/01-generate-text.mdx +4 -4
  21. package/docs/07-reference/01-ai-sdk-core/02-stream-text.mdx +7 -7
  22. package/docs/07-reference/01-ai-sdk-core/12-stream-speech.mdx +195 -0
  23. package/docs/07-reference/01-ai-sdk-core/index.mdx +5 -0
  24. package/docs/07-reference/02-ai-sdk-ui/01-use-chat.mdx +1 -1
  25. package/docs/07-reference/02-ai-sdk-ui/40-create-ui-message-stream.mdx +1 -1
  26. package/docs/07-reference/03-ai-sdk-rsc/01-stream-ui.mdx +1 -1
  27. package/docs/07-reference/05-ai-sdk-errors/ai-tool-choice-violation-error.mdx +12 -7
  28. package/package.json +12 -12
  29. package/src/error/no-speech-generated-error.ts +5 -1
  30. package/src/error/tool-choice-violation-error.ts +6 -4
  31. package/src/generate-speech/index.ts +7 -0
  32. package/src/generate-speech/is-streaming-speech-model.ts +17 -0
  33. package/src/generate-speech/stream-speech-result.ts +95 -0
  34. package/src/generate-speech/stream-speech.ts +569 -0
  35. package/src/generate-text/collect-tool-approvals.ts +10 -0
  36. package/src/generate-text/generate-text.ts +24 -12
  37. package/src/generate-text/stream-language-model-call.ts +37 -12
  38. package/src/generate-text/stream-text.ts +4 -1
  39. package/src/test/mock-streaming-speech-model-v4.ts +28 -0
  40. package/src/types/language-model.ts +2 -0
  41. package/src/ui/chat.ts +40 -12
  42. package/src/ui-message-stream/ui-message-chunks.ts +1 -0
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
2
2
  import { GatewayAuthenticationError, GatewayError, createGateway, gateway, gateway as gateway$1 } from "@ai-sdk/gateway";
3
- import { DEFAULT_MAX_DOWNLOAD_SIZE, DelayedPromise, DownloadError, DownloadError as DownloadError$1, EXPERIMENTAL_EMBEDDING_MODEL_MAX_INPUT_BYTES_PER_CALL, EXPERIMENTAL_EMBEDDING_MODEL_PROVIDER_OPTIONS_TRANSFORMER, asArray, asSchema, asSchema as asSchema$1, cancelResponseBody, convertBase64ToUint8Array, convertUint8ArrayToBase64, createIdGenerator, createIdGenerator as createIdGenerator$1, delay, detectMediaType, dynamicTool, executeTool, experimental_getToolCaller, experimental_toolCaller, fetchUntrustedUrl, filterNullable, generateId, generateId as generateId$1, getErrorMessage, getRuntimeEnvironmentUserAgent, getWebSocketConstructor, isAbortError, isBuffer, isExecutableTool, isFullMediaType, isNonNullable, isProviderReference, isProviderStreamError, isUrlSupported, jsonSchema, jsonSchema as jsonSchema$1, lazySchema, normalizeHeaders, parseJsonEventStream, parseJsonEventStream as parseJsonEventStream$1, readResponseWithSizeLimit, readWebSocketMessageText, resolve, retryWithExponentialBackoff, safeParseJSON, safeValidateTypes, toWebSocketUrl, tool, tool as tool$1, validateTypes, waitForWebSocketBufferDrain, withUserAgentSuffix, zodSchema, zodSchema as zodSchema$1 } from "@ai-sdk/provider-utils";
3
+ import { DEFAULT_MAX_DOWNLOAD_SIZE, DelayedPromise, DownloadError, DownloadError as DownloadError$1, EXPERIMENTAL_EMBEDDING_MODEL_MAX_INPUT_BYTES_PER_CALL, EXPERIMENTAL_EMBEDDING_MODEL_PROVIDER_OPTIONS_TRANSFORMER, asArray, asSchema, asSchema as asSchema$1, cancelResponseBody, convertAsyncIteratorToReadableStream, convertBase64ToUint8Array, convertUint8ArrayToBase64, createIdGenerator, createIdGenerator as createIdGenerator$1, delay, detectMediaType, dynamicTool, executeTool, experimental_getToolCaller, experimental_toolCaller, fetchUntrustedUrl, filterNullable, generateId, generateId as generateId$1, getErrorMessage, getRuntimeEnvironmentUserAgent, getWebSocketConstructor, isAbortError, isBuffer, isExecutableTool, isFullMediaType, isNonNullable, isProviderReference, isProviderStreamError, isUrlSupported, jsonSchema, jsonSchema as jsonSchema$1, lazySchema, normalizeHeaders, parseJsonEventStream, parseJsonEventStream as parseJsonEventStream$1, readResponseWithSizeLimit, readWebSocketMessageText, resolve, retryWithExponentialBackoff, safeParseJSON, safeValidateTypes, toWebSocketUrl, tool, tool as tool$1, validateTypes, waitForWebSocketBufferDrain, withUserAgentSuffix, zodSchema, zodSchema as zodSchema$1 } from "@ai-sdk/provider-utils";
4
4
  import { AISDKError, AISDKError as AISDKError$1, APICallError, APICallError as APICallError$1, EmptyResponseBodyError, EmptyResponseBodyError as EmptyResponseBodyError$1, Experimental_DecisionRefusalError, Experimental_DecisionRefusalError as Experimental_DecisionRefusalError$1, Experimental_DecisionUnsupportedQuestionTypeError, Experimental_DecisionUnsupportedQuestionTypeError as Experimental_DecisionUnsupportedQuestionTypeError$1, InvalidArgumentError as InvalidArgumentError$1, InvalidPromptError, InvalidPromptError as InvalidPromptError$1, InvalidResponseDataError, InvalidResponseDataError as InvalidResponseDataError$1, JSONParseError, JSONParseError as JSONParseError$1, LoadAPIKeyError, LoadSettingError, NoContentGeneratedError, NoSuchModelError, NoSuchModelError as NoSuchModelError$1, NoSuchProviderReferenceError, TooManyEmbeddingValuesForCallError, TypeValidationError, TypeValidationError as TypeValidationError$1, UnsupportedFunctionalityError, UnsupportedFunctionalityError as UnsupportedFunctionalityError$1, getErrorMessage as getErrorMessage$1, isJSONArray, isJSONObject } from "@ai-sdk/provider";
5
5
  import { array, boolean, custom, discriminatedUnion, enum as enum$1, instanceof as instanceof$1, lazy, literal, looseObject, never, null as null$1, number, object, record, string, union, unknown } from "zod/v4";
6
6
  //#region src/error/invalid-argument-error.ts
@@ -225,7 +225,8 @@ var NoSpeechGeneratedError = class extends AISDKError$1 {
225
225
  constructor(options) {
226
226
  super({
227
227
  name: name$13,
228
- message: "No speech audio generated."
228
+ message: "No speech audio generated.",
229
+ ...options.cause !== void 0 && { cause: options.cause }
229
230
  });
230
231
  this[symbol$13] = true;
231
232
  this.responses = options.responses;
@@ -389,7 +390,7 @@ const symbol$6 = Symbol.for(marker$6);
389
390
  * Thrown when a model response does not satisfy an enforced tool choice.
390
391
  */
391
392
  var ToolChoiceViolationError = class extends AISDKError$1 {
392
- constructor({ toolChoice, finishReason, provider, modelId, content, message = toolChoice.type === "required" ? "Model response did not contain a tool call even though tool choice was required." : `Model response did not contain a call to the required tool '${toolChoice.toolName}'.` }) {
393
+ constructor({ toolChoice, finishReason, provider, modelId, content, message = toolChoice.type === "none" ? "Model response contained a tool call even though tool choice was none." : toolChoice.type === "required" ? "Model response did not contain a tool call even though tool choice was required." : `Model response did not contain a call to the required tool '${toolChoice.toolName}'.` }) {
393
394
  super({
394
395
  name: name$6,
395
396
  message
@@ -1174,7 +1175,7 @@ function cloneValue(value) {
1174
1175
  }
1175
1176
  //#endregion
1176
1177
  //#region src/version.ts
1177
- const VERSION = "7.0.148";
1178
+ const VERSION = "7.0.150";
1178
1179
  //#endregion
1179
1180
  //#region src/util/download/download.ts
1180
1181
  /**
@@ -2740,6 +2741,7 @@ function collectToolApprovals({ messages }) {
2740
2741
  for (const part of lastMessage.content) if (part.type === "tool-result") toolResults[part.toolCallId] = part;
2741
2742
  const approvedToolApprovals = [];
2742
2743
  const deniedToolApprovals = [];
2744
+ const collectedToolCallIds = /* @__PURE__ */ new Set();
2743
2745
  const approvalResponses = lastMessage.content.filter((part) => part.type === "tool-approval-response");
2744
2746
  for (const approvalResponse of approvalResponses) {
2745
2747
  const approvalRequest = toolApprovalRequestsByApprovalId[approvalResponse.approvalId];
@@ -2751,6 +2753,8 @@ function collectToolApprovals({ messages }) {
2751
2753
  toolCallId: approvalRequest.toolCallId,
2752
2754
  approvalId: approvalRequest.approvalId
2753
2755
  });
2756
+ if (collectedToolCallIds.has(toolCall.toolCallId)) continue;
2757
+ collectedToolCallIds.add(toolCall.toolCallId);
2754
2758
  const approval = {
2755
2759
  approvalRequest,
2756
2760
  approvalResponse,
@@ -5569,7 +5573,7 @@ async function generateText({ model: modelArg, tools, toolChoice, instructions,
5569
5573
  tools,
5570
5574
  activeTools: prepareStepResult?.activeTools ?? activeTools
5571
5575
  });
5572
- const { executionTools: stepExecutionTools, modelTools: stepModelTools, toolCallerMessages } = prepareToolsForToolCallers({
5576
+ const { executionTools, modelTools: stepModelTools, toolCallerMessages } = prepareToolsForToolCallers({
5573
5577
  tools: prepareToolSearch(stepActiveTools, {
5574
5578
  toolsContext,
5575
5579
  experimental_sandbox: stepSandbox
@@ -5584,6 +5588,7 @@ async function generateText({ model: modelArg, tools, toolChoice, instructions,
5584
5588
  experimental_sandbox: stepSandbox
5585
5589
  });
5586
5590
  const stepToolChoice = prepareToolChoice({ toolChoice: prepareStepResult?.toolChoice ?? toolChoice });
5591
+ const stepExecutionTools = stepToolChoice.type === "none" ? void 0 : executionTools;
5587
5592
  const stepMessages = appendToolCallerMessages({
5588
5593
  messages: prepareStepResult?.messages ?? stepInputMessages,
5589
5594
  toolCallerMessages
@@ -5675,8 +5680,8 @@ async function generateText({ model: modelArg, tools, toolChoice, instructions,
5675
5680
  const stepToolCalls = await Promise.all(currentModelResponse.content.filter((part) => part.type === "tool-call").map((toolCall) => parseToolCall({
5676
5681
  toolCall,
5677
5682
  tools: stepModelTools,
5678
- repairToolCall,
5679
- refineToolInput,
5683
+ repairToolCall: stepToolChoice.type === "none" ? void 0 : repairToolCall,
5684
+ refineToolInput: stepToolChoice.type === "none" ? void 0 : refineToolInput,
5680
5685
  instructions: stepInstructions,
5681
5686
  messages: stepMessages,
5682
5687
  abortSignal: mergedAbortSignal
@@ -5722,8 +5727,8 @@ async function generateText({ model: modelArg, tools, toolChoice, instructions,
5722
5727
  },
5723
5728
  callbacks: [resolvedOnLanguageModelCallEnd, telemetryDispatcher.onLanguageModelCallEnd]
5724
5729
  });
5725
- const enforcedToolChoice = stepToolChoice.type === "required" || stepToolChoice.type === "tool" ? stepToolChoice : void 0;
5726
- if (enforcedToolChoice != null && !stepToolCalls.some((toolCall) => enforcedToolChoice.type === "required" || toolCall.toolName === enforcedToolChoice.toolName)) throw new ToolChoiceViolationError({
5730
+ const enforcedToolChoice = stepToolChoice.type === "auto" ? void 0 : stepToolChoice;
5731
+ if (enforcedToolChoice != null && (enforcedToolChoice.type === "none" ? stepToolCalls.length > 0 : currentModelResponse.finishReason.unified !== "interrupted" && !stepToolCalls.some((toolCall) => enforcedToolChoice.type === "required" || toolCall.toolName === enforcedToolChoice.toolName))) throw new ToolChoiceViolationError({
5727
5732
  toolChoice: enforcedToolChoice,
5728
5733
  finishReason: currentModelResponse.finishReason.unified,
5729
5734
  provider: stepModel.provider,
@@ -5943,7 +5948,7 @@ async function generateText({ model: modelArg, tools, toolChoice, instructions,
5943
5948
  } finally {
5944
5949
  if (stepTimeoutId != null) clearTimeout(stepTimeoutId);
5945
5950
  }
5946
- } while (clientToolOutputs.length + deniedToolApprovalResponses.length === clientToolCalls.length && (clientToolCalls.length > 0 || pendingDeferredToolCalls.size > 0) && !await isStopConditionMet({
5951
+ } while (steps[steps.length - 1].finishReason !== "interrupted" && clientToolOutputs.length + deniedToolApprovalResponses.length === clientToolCalls.length && (clientToolCalls.length > 0 || pendingDeferredToolCalls.size > 0) && !await isStopConditionMet({
5947
5952
  stopConditions,
5948
5953
  steps
5949
5954
  }));
@@ -6520,6 +6525,7 @@ const uiMessageChunkSchema = lazySchema(() => zodSchema$1(z.union([
6520
6525
  "content-filter",
6521
6526
  "tool-calls",
6522
6527
  "error",
6528
+ "interrupted",
6523
6529
  "other"
6524
6530
  ]).optional(),
6525
6531
  messageMetadata: z.unknown().optional()
@@ -8394,6 +8400,7 @@ function createLanguageModelV4StreamPartToLanguageModelStreamPartTransform({ too
8394
8400
  let timeToFirstOutputMs;
8395
8401
  let previousOutputChunkTimestampMs;
8396
8402
  const timeBetweenOutputChunksMs = [];
8403
+ const withholdToolParts = toolChoice.type === "none";
8397
8404
  return new TransformStream({ async transform(chunk, controller) {
8398
8405
  if (isOutputChunk(chunk)) {
8399
8406
  const outputChunkTimestampMs = now();
@@ -8401,6 +8408,7 @@ function createLanguageModelV4StreamPartToLanguageModelStreamPartTransform({ too
8401
8408
  else if (previousOutputChunkTimestampMs != null) timeBetweenOutputChunksMs.push(outputChunkTimestampMs - previousOutputChunkTimestampMs);
8402
8409
  previousOutputChunkTimestampMs = outputChunkTimestampMs;
8403
8410
  }
8411
+ if (withholdToolParts && (chunk.type === "tool-input-start" || chunk.type === "tool-input-delta" || chunk.type === "tool-input-end")) return;
8404
8412
  switch (chunk.type) {
8405
8413
  case "error":
8406
8414
  controller.enqueue({
@@ -8562,8 +8570,8 @@ function createLanguageModelV4StreamPartToLanguageModelStreamPartTransform({ too
8562
8570
  },
8563
8571
  callbacks: onLanguageModelCallEnd
8564
8572
  });
8565
- const enforcedToolChoice = toolChoice.type === "required" || toolChoice.type === "tool" ? toolChoice : void 0;
8566
- const toolChoiceViolationError = enforcedToolChoice != null && ![...toolCallsByToolCallId.values()].some((toolCall) => enforcedToolChoice.type === "required" || toolCall.toolName === enforcedToolChoice.toolName) ? new ToolChoiceViolationError({
8573
+ const enforcedToolChoice = toolChoice.type === "auto" ? void 0 : toolChoice;
8574
+ const toolChoiceViolationError = enforcedToolChoice != null && (enforcedToolChoice.type === "none" ? toolCallsByToolCallId.size > 0 : chunk.finishReason.unified !== "interrupted" && ![...toolCallsByToolCallId.values()].some((toolCall) => enforcedToolChoice.type === "required" || toolCall.toolName === enforcedToolChoice.toolName)) ? new ToolChoiceViolationError({
8567
8575
  toolChoice: enforcedToolChoice,
8568
8576
  finishReason: chunk.finishReason.unified,
8569
8577
  provider,
@@ -8593,15 +8601,16 @@ function createLanguageModelV4StreamPartToLanguageModelStreamPartTransform({ too
8593
8601
  const toolCall = await parseToolCall({
8594
8602
  toolCall: chunk,
8595
8603
  tools,
8596
- repairToolCall,
8597
- refineToolInput,
8604
+ repairToolCall: withholdToolParts ? void 0 : repairToolCall,
8605
+ refineToolInput: withholdToolParts ? void 0 : refineToolInput,
8598
8606
  instructions,
8599
8607
  messages,
8600
8608
  abortSignal
8601
8609
  });
8602
8610
  toolCallsByToolCallId.set(toolCall.toolCallId, toolCall);
8603
- controller.enqueue(toolCall);
8604
8611
  if (collectContent) modelCallContent.push(toolCall);
8612
+ if (withholdToolParts) break;
8613
+ controller.enqueue(toolCall);
8605
8614
  if (toolCall.invalid) {
8606
8615
  if (!toolCall.providerExecuted) controller.enqueue({
8607
8616
  type: "tool-error",
@@ -8624,6 +8633,7 @@ function createLanguageModelV4StreamPartToLanguageModelStreamPartTransform({ too
8624
8633
  break;
8625
8634
  case "tool-approval-request": {
8626
8635
  if (collectContent) rawModelCallContent.push(chunk);
8636
+ if (withholdToolParts) break;
8627
8637
  const toolCall = toolCallsByToolCallId.get(chunk.toolCallId);
8628
8638
  if (toolCall == null) {
8629
8639
  controller.enqueue({
@@ -8669,7 +8679,7 @@ function createLanguageModelV4StreamPartToLanguageModelStreamPartTransform({ too
8669
8679
  ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {},
8670
8680
  ...toolCall?.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {}
8671
8681
  };
8672
- controller.enqueue(toolResultPart);
8682
+ if (!withholdToolParts) controller.enqueue(toolResultPart);
8673
8683
  if (collectContent) modelCallContent.push(toolResultPart);
8674
8684
  break;
8675
8685
  }
@@ -9783,7 +9793,7 @@ var DefaultStreamTextResult = class {
9783
9793
  tools,
9784
9794
  activeTools: prepareStepResult?.activeTools ?? activeTools
9785
9795
  });
9786
- const { executionTools: stepExecutionTools, modelTools: stepModelTools, toolCallerMessages } = prepareToolsForToolCallers({
9796
+ const { executionTools, modelTools: stepModelTools, toolCallerMessages } = prepareToolsForToolCallers({
9787
9797
  tools: prepareToolSearch(stepActiveTools, {
9788
9798
  toolsContext,
9789
9799
  experimental_sandbox: stepSandbox
@@ -9798,6 +9808,7 @@ var DefaultStreamTextResult = class {
9798
9808
  experimental_sandbox: stepSandbox
9799
9809
  });
9800
9810
  const stepToolChoice = prepareToolChoice({ toolChoice: prepareStepResult?.toolChoice ?? toolChoice });
9811
+ const stepExecutionTools = stepToolChoice.type === "none" ? void 0 : executionTools;
9801
9812
  const stepMessages = appendToolCallerMessages({
9802
9813
  messages: prepareStepResult?.messages ?? stepInputMessages,
9803
9814
  toolCallerMessages
@@ -10244,7 +10255,7 @@ var DefaultStreamTextResult = class {
10244
10255
  }
10245
10256
  for (const output of stepToolOutputs) if (output.type === "tool-result" || output.type === "tool-error") pendingDeferredToolCalls.delete(output.toolCallId);
10246
10257
  cleanupStepTimeouts();
10247
- if (clientToolCalls.length === clientToolOutputs.length + deniedToolApprovalResponses.length && (clientToolCalls.length > 0 || pendingDeferredToolCalls.size > 0) && !await isStopConditionMet({
10258
+ if (stepFinishReason !== "interrupted" && clientToolCalls.length === clientToolOutputs.length + deniedToolApprovalResponses.length && (clientToolCalls.length > 0 || pendingDeferredToolCalls.size > 0) && !await isStopConditionMet({
10248
10259
  stopConditions,
10249
10260
  steps: recordedSteps
10250
10261
  })) try {
@@ -14830,6 +14841,280 @@ var DefaultSpeechResult = class {
14830
14841
  }
14831
14842
  };
14832
14843
  //#endregion
14844
+ //#region src/generate-speech/is-streaming-speech-model.ts
14845
+ /**
14846
+ * Whether a resolved speech model implements the experimental streaming
14847
+ * speech extension (`Experimental_StreamingSpeechModelV4`).
14848
+ */
14849
+ function isStreamingSpeechModel(model) {
14850
+ return typeof model.doStream === "function";
14851
+ }
14852
+ //#endregion
14853
+ //#region src/generate-speech/stream-speech.ts
14854
+ /**
14855
+ * Streams speech audio using a speech model.
14856
+ *
14857
+ * @param model - The speech model to use. It must support streaming speech.
14858
+ * @param text - The text to convert to speech: a complete string, or a stream of text deltas
14859
+ * (e.g. the text stream of `streamText`) or text parts that is synthesized as it arrives.
14860
+ * A text part can set its own `voice` on providers that support several voices per stream.
14861
+ * @param voice - The voice to use for speech generation.
14862
+ * @param outputFormat - The format of the output audio chunks, e.g. `{ type: 'audio/pcm', rate: 24000 }`.
14863
+ * @param instructions - Instructions for the speech generation e.g. "Speak in a slow and steady tone".
14864
+ * @param speed - The speed of the speech generation.
14865
+ * @param language - The language for speech generation (ISO 639-1 code e.g. "en", "es", "fr") or "auto" for automatic detection.
14866
+ * @param providerOptions - Additional provider-specific options.
14867
+ * @param abortSignal - An optional abort signal that can be used to cancel the call.
14868
+ * @param headers - Additional HTTP/WebSocket headers to send when supported by the provider.
14869
+ * @param includeRawChunks - When true, raw provider chunks are included in `fullStream`.
14870
+ * @param onError - Called for each provider error part; defaults to `console.error`.
14871
+ *
14872
+ * @returns A result object with the audio stream and the final usage and metadata.
14873
+ */
14874
+ function streamSpeech({ model, text, voice, outputFormat, instructions, speed, language, providerOptions = {}, abortSignal, headers, includeRawChunks, onError = ({ error }) => {
14875
+ console.error(error);
14876
+ }, _internal: { currentDate = () => /* @__PURE__ */ new Date() } = {} }) {
14877
+ const resolvedModel = resolveSpeechModel(model);
14878
+ if (!resolvedModel) throw new Error("Model could not be resolved");
14879
+ if (!isStreamingSpeechModel(resolvedModel)) throw new UnsupportedFunctionalityError$1({
14880
+ functionality: "streaming speech",
14881
+ message: `The ${resolvedModel.provider} model "${resolvedModel.modelId}" does not support streaming speech.` + (typeof model === "string" ? " String model IDs resolve through the global provider (AI Gateway by default). If that provider does not support streaming speech, pass a provider model instance instead (e.g. elevenLabs.speech('eleven_flash_v2_5')) or upgrade @ai-sdk/gateway to a version with streaming speech support." : "")
14882
+ });
14883
+ const textStream = toTextStream$1(text);
14884
+ const headersWithUserAgent = withUserAgentSuffix(headers ?? {}, `ai/${VERSION}`);
14885
+ const usagePromise = new DelayedPromise();
14886
+ const warningsPromise = new DelayedPromise();
14887
+ const responsesPromise = new DelayedPromise();
14888
+ const providerMetadataPromise = new DelayedPromise();
14889
+ const rejectPendingPromises = (error) => {
14890
+ for (const promise of [
14891
+ usagePromise,
14892
+ warningsPromise,
14893
+ responsesPromise,
14894
+ providerMetadataPromise
14895
+ ]) if (promise.isPending()) promise.reject(error);
14896
+ };
14897
+ const startedAt = currentDate();
14898
+ let response;
14899
+ const currentResponseMetadata = () => response ?? {
14900
+ timestamp: startedAt,
14901
+ modelId: resolvedModel.modelId
14902
+ };
14903
+ const resolveWarnings = (warnings) => {
14904
+ warningsPromise.resolve(warnings);
14905
+ logWarnings({
14906
+ warnings,
14907
+ provider: resolvedModel.provider,
14908
+ model: resolvedModel.modelId
14909
+ });
14910
+ };
14911
+ const pipeAbortController = new AbortController();
14912
+ let hasAudio = false;
14913
+ let finished = false;
14914
+ let lastError;
14915
+ const incompleteStreamError = () => hasAudio ? lastError ?? new StreamProviderError({ message: "The speech stream ended before it finished." }) : new NoSpeechGeneratedError({
14916
+ responses: [currentResponseMetadata()],
14917
+ cause: lastError
14918
+ });
14919
+ const transform = new TransformStream({
14920
+ transform(value, controller) {
14921
+ switch (value.type) {
14922
+ case "stream-start":
14923
+ resolveWarnings(value.warnings);
14924
+ break;
14925
+ case "response-metadata":
14926
+ response = {
14927
+ timestamp: value.timestamp ?? currentResponseMetadata().timestamp,
14928
+ modelId: value.modelId ?? currentResponseMetadata().modelId,
14929
+ headers: value.headers ?? response?.headers,
14930
+ body: value.body ?? response?.body
14931
+ };
14932
+ break;
14933
+ case "audio": {
14934
+ const audio = typeof value.audio === "string" ? convertBase64ToUint8Array(value.audio) : value.audio;
14935
+ if (audio.length === 0 && value.providerMetadata == null) break;
14936
+ hasAudio ||= audio.length > 0;
14937
+ controller.enqueue({
14938
+ type: "audio",
14939
+ ...value.id != null && { id: value.id },
14940
+ audio,
14941
+ audioFormat: value.audioFormat,
14942
+ ...value.providerMetadata != null && { providerMetadata: value.providerMetadata }
14943
+ });
14944
+ break;
14945
+ }
14946
+ case "raw":
14947
+ controller.enqueue(value);
14948
+ break;
14949
+ case "error":
14950
+ lastError = value.error;
14951
+ Promise.resolve().then(() => onError({ error: value.error })).catch(() => {});
14952
+ controller.enqueue(value);
14953
+ break;
14954
+ case "finish":
14955
+ if (!warningsPromise.isResolved()) resolveWarnings([]);
14956
+ if (!hasAudio) throw new NoSpeechGeneratedError({
14957
+ responses: [currentResponseMetadata()],
14958
+ cause: lastError
14959
+ });
14960
+ finished = true;
14961
+ usagePromise.resolve(value.usage ?? {});
14962
+ responsesPromise.resolve([currentResponseMetadata()]);
14963
+ providerMetadataPromise.resolve(value.providerMetadata ?? {});
14964
+ }
14965
+ },
14966
+ flush() {
14967
+ if (!finished) throw incompleteStreamError();
14968
+ },
14969
+ cancel(reason) {
14970
+ const cancelReason = reason ?? /* @__PURE__ */ new Error("Speech stream was cancelled.");
14971
+ rejectPendingPromises(cancelReason);
14972
+ pipeAbortController.abort(cancelReason);
14973
+ }
14974
+ });
14975
+ if (abortSignal != null) {
14976
+ const onAbort = () => {
14977
+ const reason = abortSignal.reason;
14978
+ rejectPendingPromises(reason);
14979
+ pipeAbortController.abort(reason);
14980
+ transform.writable.abort(reason).catch(() => {});
14981
+ };
14982
+ if (abortSignal.aborted) onAbort();
14983
+ else abortSignal.addEventListener("abort", onAbort, { once: true });
14984
+ }
14985
+ (async () => {
14986
+ const result = await resolvedModel.doStream({
14987
+ text: textStream,
14988
+ voice,
14989
+ outputFormat,
14990
+ instructions,
14991
+ speed,
14992
+ language,
14993
+ providerOptions,
14994
+ abortSignal: mergeAbortSignals(abortSignal, pipeAbortController.signal),
14995
+ headers: headersWithUserAgent,
14996
+ includeRawChunks
14997
+ });
14998
+ response = {
14999
+ timestamp: result.response?.timestamp ?? startedAt,
15000
+ modelId: result.response?.modelId ?? resolvedModel.modelId,
15001
+ headers: result.response?.headers,
15002
+ body: result.response?.body
15003
+ };
15004
+ await result.stream.pipeTo(transform.writable, { signal: pipeAbortController.signal });
15005
+ })().catch((error) => {
15006
+ const reason = error ?? /* @__PURE__ */ new Error("Speech stream was cancelled or errored.");
15007
+ rejectPendingPromises(reason);
15008
+ textStream.cancel(reason).catch(() => {});
15009
+ transform.writable.abort(reason).catch(() => {});
15010
+ });
15011
+ let streamOwner = "unclaimed";
15012
+ function consumeStream() {
15013
+ if (streamOwner !== "unclaimed") return;
15014
+ streamOwner = "result-promises";
15015
+ const reader = transform.readable.getReader();
15016
+ (async () => {
15017
+ while (!(await reader.read()).done);
15018
+ })().catch(() => {});
15019
+ }
15020
+ function claimStream(owner) {
15021
+ if (streamOwner !== "unclaimed") throw new Error(streamOwner === "result-promises" ? `${owner === "full-stream" ? "fullStream" : "audioStream"} cannot be accessed after a result promise.` : "Only one of audioStream or fullStream can be accessed, and only once.");
15022
+ streamOwner = owner;
15023
+ return transform.readable;
15024
+ }
15025
+ return {
15026
+ get usage() {
15027
+ consumeStream();
15028
+ return usagePromise.promise;
15029
+ },
15030
+ get warnings() {
15031
+ consumeStream();
15032
+ return warningsPromise.promise;
15033
+ },
15034
+ get responses() {
15035
+ consumeStream();
15036
+ return responsesPromise.promise;
15037
+ },
15038
+ get providerMetadata() {
15039
+ consumeStream();
15040
+ return providerMetadataPromise.promise;
15041
+ },
15042
+ get fullStream() {
15043
+ return asAsyncIterableStream(claimStream("full-stream"));
15044
+ },
15045
+ get audioStream() {
15046
+ return asAsyncIterableStream(createAudioByteStream(claimStream("audio-stream")));
15047
+ }
15048
+ };
15049
+ }
15050
+ /**
15051
+ * Projects speech parts to audio bytes with a pull-based stream rather than a
15052
+ * second `pipeThrough`, so an early consumer cancel cancels the part stream
15053
+ * directly instead of surfacing an unhandled rejection from a chained pipe.
15054
+ */
15055
+ function createAudioByteStream(parts) {
15056
+ let reader;
15057
+ return new ReadableStream({
15058
+ async pull(controller) {
15059
+ reader ??= parts.getReader();
15060
+ for (;;) {
15061
+ const { done, value } = await reader.read();
15062
+ if (done) {
15063
+ controller.close();
15064
+ return;
15065
+ }
15066
+ if (value.type === "audio" && value.audio.length > 0) {
15067
+ controller.enqueue(value.audio);
15068
+ return;
15069
+ }
15070
+ }
15071
+ },
15072
+ async cancel(reason) {
15073
+ if (reader != null) await reader.cancel(reason).catch(() => {});
15074
+ else await parts.cancel(reason).catch(() => {});
15075
+ }
15076
+ });
15077
+ }
15078
+ function toTextStream$1(text) {
15079
+ if (typeof text === "string") return new ReadableStream({ start(controller) {
15080
+ controller.enqueue({
15081
+ type: "text",
15082
+ text
15083
+ });
15084
+ controller.close();
15085
+ } });
15086
+ return toSourceStream(text).pipeThrough(new TransformStream({ transform(value, controller) {
15087
+ controller.enqueue(toTextPart(value));
15088
+ } }));
15089
+ }
15090
+ function toSourceStream(text) {
15091
+ if (text instanceof ReadableStream) return text;
15092
+ if (typeof text?.[Symbol.asyncIterator] === "function") return convertAsyncIteratorToReadableStream(text[Symbol.asyncIterator]());
15093
+ if (typeof text?.[Symbol.iterator] === "function") {
15094
+ const iterable = text;
15095
+ return convertAsyncIteratorToReadableStream((async function* () {
15096
+ yield* iterable;
15097
+ })());
15098
+ }
15099
+ throw new InvalidArgumentError({
15100
+ parameter: "text",
15101
+ value: text,
15102
+ message: "Expected a string, an iterable or async iterable, or a ReadableStream of strings or text parts."
15103
+ });
15104
+ }
15105
+ function toTextPart(value) {
15106
+ if (typeof value === "string") return {
15107
+ type: "text",
15108
+ text: value
15109
+ };
15110
+ return {
15111
+ type: "text",
15112
+ text: value.text,
15113
+ ...value.voice != null && { voice: value.voice },
15114
+ ...value.providerOptions != null && { providerOptions: value.providerOptions }
15115
+ };
15116
+ }
15117
+ //#endregion
14833
15118
  //#region src/generate-speech/index.ts
14834
15119
  /**
14835
15120
  * @deprecated Use `generateSpeech` instead.
@@ -20035,6 +20320,7 @@ var AbstractChat = class {
20035
20320
  }
20036
20321
  constructor({ generateId = generateId$1, id, transport = new DefaultChatTransport(), messageMetadataSchema, dataPartSchemas, state, onError, onToolCall, onFinish, onData, sendAutomaticallyWhen }) {
20037
20322
  this.pendingMessagePreparations = /* @__PURE__ */ new Set();
20323
+ this.interruptedMessageIds = /* @__PURE__ */ new Set();
20038
20324
  this.activeResponse = void 0;
20039
20325
  this.activeResumeRequest = void 0;
20040
20326
  this.resumableStreamState = void 0;
@@ -20166,7 +20452,7 @@ var AbstractChat = class {
20166
20452
  }
20167
20453
  if (this.activeResponse) this.activeResponse.state.message.parts = this.activeResponse.state.message.parts.map(updatePart);
20168
20454
  if (messageIndex !== -1 && this.status !== "streaming" && this.status !== "submitted" && this.sendAutomaticallyWhen) {
20169
- const shouldSend = await this.shouldSendAutomatically();
20455
+ const shouldSend = await this.shouldSendAutomatically(messages[messageIndex].id);
20170
20456
  if (shouldSend) this.runAutomaticRequest(() => {
20171
20457
  const messageId = messageIndex === -1 ? this.lastMessage?.id : messages[messageIndex].id;
20172
20458
  return this.makeRequestForToolApproval({
@@ -20212,7 +20498,7 @@ var AbstractChat = class {
20212
20498
  }
20213
20499
  if (this.activeResponse) this.activeResponse.state.message.parts = this.activeResponse.state.message.parts.map(updatePart);
20214
20500
  if (messageIndex !== -1 && this.status !== "streaming" && this.status !== "submitted" && this.sendAutomaticallyWhen) {
20215
- const shouldSend = await this.shouldSendAutomatically();
20501
+ const shouldSend = await this.shouldSendAutomatically(messages[messageIndex].id);
20216
20502
  if (shouldSend) this.runAutomaticRequest(() => this.makeRequest({
20217
20503
  trigger: "submit-message",
20218
20504
  messageId: messages[messageIndex].id,
@@ -20283,11 +20569,10 @@ var AbstractChat = class {
20283
20569
  set messages(messages) {
20284
20570
  this.state.messages = messages;
20285
20571
  }
20286
- async shouldSendAutomatically() {
20287
- if (!this.sendAutomaticallyWhen) return false;
20288
- const result = this.sendAutomaticallyWhen({ messages: this.state.messages });
20289
- if (result && typeof result === "object" && "then" in result) return await result;
20290
- return result;
20572
+ async shouldSendAutomatically(messageId = this.lastMessage?.id) {
20573
+ const isInterrupted = (id) => id != null && this.interruptedMessageIds.has(id);
20574
+ if (!this.sendAutomaticallyWhen || isInterrupted(messageId) || isInterrupted(this.lastMessage?.id)) return false;
20575
+ return await this.sendAutomaticallyWhen({ messages: this.state.messages }) && !isInterrupted(messageId) && !isInterrupted(this.lastMessage?.id);
20291
20576
  }
20292
20577
  async runAutomaticRequest(request, shouldSend) {
20293
20578
  const stopGeneration = this.stopGeneration;
@@ -20486,20 +20771,25 @@ var AbstractChat = class {
20486
20771
  });
20487
20772
  } finally {
20488
20773
  try {
20489
- if (activeResponse) this.onFinish?.({
20490
- message: activeResponse.state.message,
20491
- messages: this.state.messages,
20492
- isAbort,
20493
- isDisconnect,
20494
- isError,
20495
- finishReason: activeResponse.state.finishReason
20496
- });
20774
+ if (activeResponse) {
20775
+ const { message, finishReason } = activeResponse.state;
20776
+ if (finishReason === "interrupted") this.interruptedMessageIds.add(message.id);
20777
+ else if (!isAbort && !isError) this.interruptedMessageIds.delete(message.id);
20778
+ this.onFinish?.({
20779
+ message: activeResponse.state.message,
20780
+ messages: this.state.messages,
20781
+ isAbort,
20782
+ isDisconnect,
20783
+ isError,
20784
+ finishReason: activeResponse.state.finishReason
20785
+ });
20786
+ }
20497
20787
  } finally {
20498
20788
  if (this.activeResponse === activeResponse) this.activeResponse = void 0;
20499
20789
  clearActiveResumeRequest();
20500
20790
  }
20501
20791
  }
20502
- if (!isAbort && !isError) await this.runAutomaticRequest(() => this.makeRequest({
20792
+ if (!isAbort && !isError && activeResponse?.state.finishReason !== "interrupted") await this.runAutomaticRequest(() => this.makeRequest({
20503
20793
  trigger: "submit-message",
20504
20794
  messageId: this.lastMessage?.id,
20505
20795
  metadata,
@@ -21194,6 +21484,6 @@ async function uploadSkill({ api, files, displayTitle, providerOptions }) {
21194
21484
  });
21195
21485
  }
21196
21486
  //#endregion
21197
- export { AISDKError, AI_SDK_TELEMETRY_TRACING_CHANNEL, APICallError, AbstractChat, DefaultChatTransport, DefaultGeneratedFile, DirectChatTransport, DownloadError, EmptyResponseBodyError, AbstractRealtimeSession as Experimental_AbstractRealtimeSession, ToolLoopAgent as Experimental_Agent, ToolLoopAgent, Experimental_DecisionRefusalError, Experimental_DecisionUnsupportedQuestionTypeError, Experimental_EvaluationUnsupportedQuestionTypeError, HttpChatTransport, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, InvalidPromptError, InvalidResponseDataError, InvalidStreamPartError, InvalidToolApprovalError, InvalidToolApprovalSignatureError, InvalidToolInputError, JSONParseError, JsonToSseTransformStream, LoadAPIKeyError, LoadSettingError, MessageConversionError, MissingToolResultsError, NoContentGeneratedError, NoImageGeneratedError, NoObjectGeneratedError, NoOutputGeneratedError, NoSpeechGeneratedError, NoSuchModelError, NoSuchProviderError, NoSuchProviderReferenceError, NoSuchToolError, NoTranscriptGeneratedError, NoTranslationGeneratedError, NoVideoGeneratedError, output_exports as Output, RetryError, SerialJobExecutor, StreamProviderError, TextStreamChatTransport, TooManyEmbeddingValuesForCallError, ToolCallNotFoundForApprovalError, ToolCallRepairError, ToolChoiceViolationError, TypeValidationError, UIMessageStreamError, UI_MESSAGE_STREAM_HEADERS, UnsupportedFunctionalityError, UnsupportedModelVersionError, WebSocketChatTransport, addToolInputExamplesMiddleware, asSchema, assistantModelMessageSchema, callCompletionApi, consumeStream, convertDataContentToBase64String, convertFileListToFileUIParts, convertToModelMessages, cosineSimilarity, createAgentUIStream, createAgentUIStreamResponse, createDownload, createGateway, createIdGenerator, createProviderRegistry, createTextStreamResponse, createUIMessageStream, createUIMessageStreamResponse, customProvider, defaultEmbeddingSettingsMiddleware, defaultInstructionsMiddleware, defaultSettingsMiddleware, detectToolDrift, dynamicTool, embed, embedMany, cancelBatch as experimental_cancelBatch, experimental_createProviderRegistry, decide as experimental_decide, decodeRealtimeAudio as experimental_decodeRealtimeAudio, encodeRealtimeAudio as experimental_encodeRealtimeAudio, experimental_evaluate, filterActiveTools as experimental_filterActiveTools, experimental_generateSpeech, experimental_generateVideo, getBatchResults as experimental_getBatchResults, getBatchStatus as experimental_getBatchStatus, getRealtimeToolDefinitions as experimental_getRealtimeToolDefinitions, experimental_getVideoStatus, listBatches as experimental_listBatches, resampleAudio as experimental_resampleAudio, startBatch as experimental_startBatch, experimental_startVideo, streamLanguageModelCall as experimental_streamLanguageModelCall, streamTextLowMemory as experimental_streamTextLowMemory, streamTranscribe as experimental_streamTranscribe, streamTranslate as experimental_streamTranslate, experimental_toolCaller, experimental_transcribe, extractJsonMiddleware, extractReasoningMiddleware, fingerprintTools, gateway, generateId, generateImage, generateObject, generateSpeech, generateText, getChunkTimeoutMs, getFirstChunkTimeoutMs, getStaticToolName, getStepTimeoutMs, getTextFromDataUrl, getToolName, getToolOrDynamicToolName, getToolTimeoutMs, getTotalTimeoutMs, hasToolCall, isCustomContentUIPart, isDataUIPart, isDeepEqualData, isDynamicToolUIPart, isFileUIPart, isLoopFinished, isReasoningFileUIPart, isReasoningUIPart, isStaticToolUIPart, isStepCount, isStepCount as stepCountIs, isTextUIPart, isToolOutputErrorUIPart, isToolUIPart, jsonSchema, lastAssistantMessageIsCompleteWithApprovalResponses, lastAssistantMessageIsCompleteWithToolCalls, modelMessageSchema, parseJsonEventStream, parsePartialJson, pipeAgentUIStreamToResponse, pipeTextStreamToResponse, pipeUIMessageStreamToResponse, pruneMessages, readUIMessageStream, registerTelemetry, rerank, safeValidateUIMessages, safeValidateWebSocketChatTransportRequest, simulateReadableStream, simulateStreamingMiddleware, smoothStream, streamObject, streamText, systemModelMessageSchema, toTextStream, toUIMessageChunk, toUIMessageStream, tool, toolModelMessageSchema, toolSearch, transcribe, uiMessageChunkSchema, uploadFile, uploadSkill, userModelMessageSchema, validateUIMessages, wrapEmbeddingModel, wrapImageModel, wrapLanguageModel, wrapProvider, zodSchema };
21487
+ export { AISDKError, AI_SDK_TELEMETRY_TRACING_CHANNEL, APICallError, AbstractChat, DefaultChatTransport, DefaultGeneratedFile, DirectChatTransport, DownloadError, EmptyResponseBodyError, AbstractRealtimeSession as Experimental_AbstractRealtimeSession, ToolLoopAgent as Experimental_Agent, ToolLoopAgent, Experimental_DecisionRefusalError, Experimental_DecisionUnsupportedQuestionTypeError, Experimental_EvaluationUnsupportedQuestionTypeError, HttpChatTransport, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, InvalidPromptError, InvalidResponseDataError, InvalidStreamPartError, InvalidToolApprovalError, InvalidToolApprovalSignatureError, InvalidToolInputError, JSONParseError, JsonToSseTransformStream, LoadAPIKeyError, LoadSettingError, MessageConversionError, MissingToolResultsError, NoContentGeneratedError, NoImageGeneratedError, NoObjectGeneratedError, NoOutputGeneratedError, NoSpeechGeneratedError, NoSuchModelError, NoSuchProviderError, NoSuchProviderReferenceError, NoSuchToolError, NoTranscriptGeneratedError, NoTranslationGeneratedError, NoVideoGeneratedError, output_exports as Output, RetryError, SerialJobExecutor, StreamProviderError, TextStreamChatTransport, TooManyEmbeddingValuesForCallError, ToolCallNotFoundForApprovalError, ToolCallRepairError, ToolChoiceViolationError, TypeValidationError, UIMessageStreamError, UI_MESSAGE_STREAM_HEADERS, UnsupportedFunctionalityError, UnsupportedModelVersionError, WebSocketChatTransport, addToolInputExamplesMiddleware, asSchema, assistantModelMessageSchema, callCompletionApi, consumeStream, convertDataContentToBase64String, convertFileListToFileUIParts, convertToModelMessages, cosineSimilarity, createAgentUIStream, createAgentUIStreamResponse, createDownload, createGateway, createIdGenerator, createProviderRegistry, createTextStreamResponse, createUIMessageStream, createUIMessageStreamResponse, customProvider, defaultEmbeddingSettingsMiddleware, defaultInstructionsMiddleware, defaultSettingsMiddleware, detectToolDrift, dynamicTool, embed, embedMany, cancelBatch as experimental_cancelBatch, experimental_createProviderRegistry, decide as experimental_decide, decodeRealtimeAudio as experimental_decodeRealtimeAudio, encodeRealtimeAudio as experimental_encodeRealtimeAudio, experimental_evaluate, filterActiveTools as experimental_filterActiveTools, experimental_generateSpeech, experimental_generateVideo, getBatchResults as experimental_getBatchResults, getBatchStatus as experimental_getBatchStatus, getRealtimeToolDefinitions as experimental_getRealtimeToolDefinitions, experimental_getVideoStatus, listBatches as experimental_listBatches, resampleAudio as experimental_resampleAudio, startBatch as experimental_startBatch, experimental_startVideo, streamLanguageModelCall as experimental_streamLanguageModelCall, streamSpeech as experimental_streamSpeech, streamTextLowMemory as experimental_streamTextLowMemory, streamTranscribe as experimental_streamTranscribe, streamTranslate as experimental_streamTranslate, experimental_toolCaller, experimental_transcribe, extractJsonMiddleware, extractReasoningMiddleware, fingerprintTools, gateway, generateId, generateImage, generateObject, generateSpeech, generateText, getChunkTimeoutMs, getFirstChunkTimeoutMs, getStaticToolName, getStepTimeoutMs, getTextFromDataUrl, getToolName, getToolOrDynamicToolName, getToolTimeoutMs, getTotalTimeoutMs, hasToolCall, isCustomContentUIPart, isDataUIPart, isDeepEqualData, isDynamicToolUIPart, isFileUIPart, isLoopFinished, isReasoningFileUIPart, isReasoningUIPart, isStaticToolUIPart, isStepCount, isStepCount as stepCountIs, isTextUIPart, isToolOutputErrorUIPart, isToolUIPart, jsonSchema, lastAssistantMessageIsCompleteWithApprovalResponses, lastAssistantMessageIsCompleteWithToolCalls, modelMessageSchema, parseJsonEventStream, parsePartialJson, pipeAgentUIStreamToResponse, pipeTextStreamToResponse, pipeUIMessageStreamToResponse, pruneMessages, readUIMessageStream, registerTelemetry, rerank, safeValidateUIMessages, safeValidateWebSocketChatTransportRequest, simulateReadableStream, simulateStreamingMiddleware, smoothStream, streamObject, streamText, systemModelMessageSchema, toTextStream, toUIMessageChunk, toUIMessageStream, tool, toolModelMessageSchema, toolSearch, transcribe, uiMessageChunkSchema, uploadFile, uploadSkill, userModelMessageSchema, validateUIMessages, wrapEmbeddingModel, wrapImageModel, wrapLanguageModel, wrapProvider, zodSchema };
21198
21488
 
21199
21489
  //# sourceMappingURL=index.js.map