ai 7.0.97 → 7.0.98

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/dist/index.js CHANGED
@@ -1178,7 +1178,7 @@ import {
1178
1178
  } from "@ai-sdk/provider-utils";
1179
1179
 
1180
1180
  // src/version.ts
1181
- var VERSION = true ? "7.0.97" : "0.0.0-test";
1181
+ var VERSION = true ? "7.0.98" : "0.0.0-test";
1182
1182
 
1183
1183
  // src/util/download/download.ts
1184
1184
  var download = async ({
@@ -4387,6 +4387,21 @@ function normalizeToolApprovalStatus(status) {
4387
4387
  return status === void 0 ? { type: "not-applicable" } : typeof status === "string" ? { type: status } : status;
4388
4388
  }
4389
4389
 
4390
+ // src/telemetry/filter-included-context.ts
4391
+ function filterIncludedContext({
4392
+ context,
4393
+ includeContext
4394
+ }) {
4395
+ if (context == null) {
4396
+ return {};
4397
+ }
4398
+ return Object.fromEntries(
4399
+ Object.entries(context).filter(
4400
+ ([key]) => (includeContext == null ? void 0 : includeContext[key]) === true
4401
+ )
4402
+ );
4403
+ }
4404
+
4390
4405
  // src/telemetry/create-telemetry-dispatcher.ts
4391
4406
  import { asArray as asArray4 } from "@ai-sdk/provider-utils";
4392
4407
 
@@ -4759,19 +4774,6 @@ var DefaultStepResult = class {
4759
4774
  };
4760
4775
 
4761
4776
  // src/generate-text/restricted-telemetry-dispatcher.ts
4762
- function filterIncludedContext({
4763
- context,
4764
- includeContext
4765
- }) {
4766
- if (context == null) {
4767
- return {};
4768
- }
4769
- return Object.fromEntries(
4770
- Object.entries(context).filter(
4771
- ([key]) => (includeContext == null ? void 0 : includeContext[key]) === true
4772
- )
4773
- );
4774
- }
4775
4777
  function restrictStepResult({
4776
4778
  step,
4777
4779
  includeRuntimeContext,
@@ -6950,6 +6952,9 @@ function isDynamicToolUIPart(part) {
6950
6952
  function isToolUIPart(part) {
6951
6953
  return isStaticToolUIPart(part) || isDynamicToolUIPart(part);
6952
6954
  }
6955
+ function isToolOutputErrorUIPart(part) {
6956
+ return isToolUIPart(part) && part.state === "output-error";
6957
+ }
6953
6958
  function getStaticToolName(part) {
6954
6959
  return part.type.split("-").slice(1).join("-");
6955
6960
  }
@@ -12581,1264 +12586,1390 @@ import {
12581
12586
  UnsupportedFunctionalityError as UnsupportedFunctionalityError3
12582
12587
  } from "@ai-sdk/provider";
12583
12588
  import { gateway as gateway2 } from "@ai-sdk/gateway";
12584
- import { withUserAgentSuffix as withUserAgentSuffix4 } from "@ai-sdk/provider-utils";
12589
+ import {
12590
+ detectMediaType as detectMediaType3,
12591
+ withUserAgentSuffix as withUserAgentSuffix5
12592
+ } from "@ai-sdk/provider-utils";
12585
12593
 
12586
- // src/util/is-deep-equal-data.ts
12587
- function isDeepEqualData(obj1, obj2) {
12588
- if (obj1 === obj2) return true;
12589
- if (obj1 == null || obj2 == null) return false;
12590
- if (typeof obj1 !== "object" && typeof obj2 !== "object")
12591
- return obj1 === obj2;
12592
- if (obj1.constructor !== obj2.constructor) return false;
12593
- if (obj1 instanceof Date && obj2 instanceof Date) {
12594
- return obj1.getTime() === obj2.getTime();
12595
- }
12596
- if (Array.isArray(obj1)) {
12597
- if (obj1.length !== obj2.length) return false;
12598
- for (let i = 0; i < obj1.length; i++) {
12599
- if (!isDeepEqualData(obj1[i], obj2[i])) return false;
12600
- }
12601
- return true;
12602
- }
12603
- const keys1 = Object.keys(obj1);
12604
- const keys2 = Object.keys(obj2);
12605
- if (keys1.length !== keys2.length) return false;
12606
- for (const key of keys1) {
12607
- if (!keys2.includes(key)) return false;
12608
- if (!isDeepEqualData(obj1[key], obj2[key])) return false;
12609
- }
12610
- return true;
12611
- }
12594
+ // src/generate-image/generate-image.ts
12595
+ import {
12596
+ isJSONObject
12597
+ } from "@ai-sdk/provider";
12598
+ import {
12599
+ convertBase64ToUint8Array as convertBase64ToUint8Array4,
12600
+ detectMediaType as detectMediaType2,
12601
+ withUserAgentSuffix as withUserAgentSuffix4
12602
+ } from "@ai-sdk/provider-utils";
12612
12603
 
12613
- // src/batch/batch.ts
12614
- async function cancelBatch({
12615
- provider,
12616
- batch,
12617
- providerOptions,
12618
- abortSignal,
12619
- headers,
12620
- timeout
12621
- }) {
12622
- const batchApi = resolveBatchApi(provider);
12623
- validateBatchReference({ batchApi, batch });
12624
- if (batchApi.doCancelBatch == null) {
12625
- throw new UnsupportedFunctionalityError3({
12626
- functionality: "batch cancellation",
12627
- message: "The provider does not support batch cancellation."
12628
- });
12604
+ // src/prompt/data-content.ts
12605
+ import {
12606
+ convertBase64ToUint8Array as convertBase64ToUint8Array3,
12607
+ convertUint8ArrayToBase64 as convertUint8ArrayToBase643
12608
+ } from "@ai-sdk/provider-utils";
12609
+ function convertDataContentToBase64String(content) {
12610
+ if (typeof content === "string") {
12611
+ return content;
12629
12612
  }
12630
- const operationAbortSignal = mergeAbortSignals(
12631
- abortSignal,
12632
- getTotalTimeoutMs(timeout)
12633
- );
12634
- try {
12635
- return await batchApi.doCancelBatch({
12636
- batchId: batch.id,
12637
- providerOptions,
12638
- abortSignal: operationAbortSignal,
12639
- headers: withUserAgentSuffix4(headers != null ? headers : {}, `ai/${VERSION}`)
12640
- });
12641
- } catch (error) {
12642
- throw wrapGatewayError(error);
12613
+ if (content instanceof ArrayBuffer) {
12614
+ return convertUint8ArrayToBase643(new Uint8Array(content));
12643
12615
  }
12616
+ return convertUint8ArrayToBase643(content);
12644
12617
  }
12645
- async function listBatches({
12646
- provider,
12647
- providerOptions,
12648
- limit,
12649
- cursor,
12650
- maxRetries,
12651
- abortSignal,
12652
- headers,
12653
- timeout
12654
- } = {}) {
12655
- var _a25;
12656
- const batchApi = resolveBatchApi(provider);
12657
- const doListBatches = (_a25 = batchApi.doListBatches) == null ? void 0 : _a25.bind(batchApi);
12658
- if (doListBatches == null) {
12659
- throw new UnsupportedFunctionalityError3({
12660
- functionality: "batch listing",
12661
- message: "The provider does not support listing batches."
12662
- });
12618
+ function convertDataContentToUint8Array(content) {
12619
+ if (content instanceof Uint8Array) {
12620
+ return content;
12663
12621
  }
12664
- const operationAbortSignal = mergeAbortSignals(
12665
- abortSignal,
12666
- getTotalTimeoutMs(timeout)
12667
- );
12668
- const { retry } = prepareRetries({
12669
- maxRetries,
12670
- abortSignal: operationAbortSignal
12671
- });
12672
- try {
12673
- const { batches, nextCursor, providerMetadata } = await retry(
12674
- () => doListBatches({
12675
- providerOptions,
12676
- abortSignal: operationAbortSignal,
12677
- headers: withUserAgentSuffix4(headers != null ? headers : {}, `ai/${VERSION}`),
12678
- ...limit != null && { limit },
12679
- ...cursor != null && { cursor }
12680
- })
12681
- );
12682
- return {
12683
- batches: batches.map(({ batchId, ...status }) => ({
12684
- version: 2,
12685
- id: batchId,
12686
- provider: batchApi.provider,
12687
- ...status
12688
- })),
12689
- ...nextCursor != null && { nextCursor },
12690
- ...providerMetadata != null && { providerMetadata }
12691
- };
12692
- } catch (error) {
12693
- throw wrapGatewayError(error);
12622
+ if (typeof content === "string") {
12623
+ try {
12624
+ return convertBase64ToUint8Array3(content);
12625
+ } catch (error) {
12626
+ throw new InvalidDataContentError({
12627
+ message: "Invalid data content. Content string is not a base64-encoded media.",
12628
+ content,
12629
+ cause: error
12630
+ });
12631
+ }
12632
+ }
12633
+ if (content instanceof ArrayBuffer) {
12634
+ return new Uint8Array(content);
12694
12635
  }
12636
+ throw new InvalidDataContentError({ content });
12695
12637
  }
12696
- async function startBatch({
12697
- provider,
12698
- requests,
12638
+
12639
+ // src/generate-image/generate-image.ts
12640
+ var gatewayCostMetadataKeys = [
12641
+ "cost",
12642
+ "gatewayCost",
12643
+ "inferenceCost",
12644
+ "inputInferenceCost",
12645
+ "marketCost",
12646
+ "outputInferenceCost",
12647
+ "surchargeCost"
12648
+ ];
12649
+ var RetryableNoImageResultError = class extends Error {
12650
+ constructor() {
12651
+ super("No image generated.");
12652
+ this.name = "RetryableNoImageResultError";
12653
+ }
12654
+ };
12655
+ async function generateImage({
12656
+ model: modelArg,
12657
+ prompt: promptArg,
12658
+ n = 1,
12659
+ maxImagesPerCall,
12660
+ size,
12661
+ aspectRatio,
12662
+ seed,
12699
12663
  providerOptions,
12700
- webhookUrl,
12664
+ maxRetries: maxRetriesArg,
12701
12665
  abortSignal,
12702
- headers,
12703
- timeout
12666
+ headers
12704
12667
  }) {
12705
- validateRequests(requests);
12706
- const batchApi = resolveBatchApi(provider);
12707
- const operationAbortSignal = mergeAbortSignals(
12708
- abortSignal,
12709
- getTotalTimeoutMs(timeout)
12710
- );
12711
- const supportedUrls = await batchApi.supportedUrls;
12712
- operationAbortSignal == null ? void 0 : operationAbortSignal.throwIfAborted();
12713
- const normalizedRequests = [];
12714
- const toolsByName = /* @__PURE__ */ new Map();
12715
- for (const request of requests) {
12716
- switch (request.type) {
12717
- case "text": {
12718
- const standardizedPrompt = await standardizePrompt(request);
12719
- const preparedTools = await prepareTools({
12720
- tools: request.tools,
12721
- toolOrder: request.toolOrder,
12722
- toolsContext: request.toolsContext
12723
- });
12724
- validateCompatibleTools({
12725
- requestId: request.id,
12726
- tools: preparedTools,
12727
- toolsByName
12728
- });
12729
- normalizedRequests.push({
12730
- id: request.id,
12731
- type: request.type,
12732
- modelId: request.model,
12733
- options: {
12734
- ...prepareLanguageModelCallOptions(request),
12735
- prompt: await convertToLanguageModelPrompt({
12736
- prompt: standardizedPrompt,
12737
- supportedUrls,
12738
- download: void 0,
12739
- provider: batchApi.provider.split(".")[0]
12740
- }),
12741
- tools: preparedTools,
12742
- toolChoice: prepareToolChoice({ toolChoice: request.toolChoice }),
12743
- providerOptions: request.providerOptions
12744
- }
12745
- });
12746
- break;
12747
- }
12748
- }
12749
- operationAbortSignal == null ? void 0 : operationAbortSignal.throwIfAborted();
12750
- }
12668
+ var _a25, _b25;
12669
+ const model = resolveImageModel(modelArg);
12751
12670
  const headersWithUserAgent = withUserAgentSuffix4(
12752
12671
  headers != null ? headers : {},
12753
12672
  `ai/${VERSION}`
12754
12673
  );
12755
- try {
12756
- const result = await batchApi.doStartBatch({
12757
- requests: normalizedRequests,
12758
- providerOptions,
12759
- abortSignal: operationAbortSignal,
12760
- headers: headersWithUserAgent,
12761
- ...webhookUrl != null && { webhookUrl }
12762
- });
12763
- const { batchId, warnings, ...status } = result;
12764
- const modelByRequestId = new Map(
12765
- normalizedRequests.map((request) => [request.id, request.modelId])
12674
+ const { retry } = prepareRetries({
12675
+ maxRetries: maxRetriesArg,
12676
+ abortSignal,
12677
+ additionalRetryableError: (error) => error instanceof RetryableNoImageResultError
12678
+ });
12679
+ const maxImagesPerCallWithDefault = (_a25 = maxImagesPerCall != null ? maxImagesPerCall : await invokeModelMaxImagesPerCall(model)) != null ? _a25 : 1;
12680
+ const callCount = Math.ceil(n / maxImagesPerCallWithDefault);
12681
+ const callImageCounts = Array.from({ length: callCount }, (_, i) => {
12682
+ if (i < callCount - 1) {
12683
+ return maxImagesPerCallWithDefault;
12684
+ }
12685
+ const remainder = n % maxImagesPerCallWithDefault;
12686
+ return remainder === 0 ? maxImagesPerCallWithDefault : remainder;
12687
+ });
12688
+ const resultGroups = await Promise.all(
12689
+ callImageCounts.map(async (callImageCount) => {
12690
+ const callResults = [];
12691
+ try {
12692
+ await retry(async () => {
12693
+ const { prompt, files, mask } = normalizePrompt(promptArg);
12694
+ const result = await model.doGenerate({
12695
+ prompt,
12696
+ files,
12697
+ mask,
12698
+ n: callImageCount,
12699
+ abortSignal,
12700
+ headers: headersWithUserAgent,
12701
+ size,
12702
+ aspectRatio,
12703
+ seed,
12704
+ providerOptions: providerOptions != null ? providerOptions : {}
12705
+ });
12706
+ callResults.push(result);
12707
+ if (result.images.length === 0 && result.isRetryable !== false) {
12708
+ throw new RetryableNoImageResultError();
12709
+ }
12710
+ return result;
12711
+ });
12712
+ return callResults;
12713
+ } catch (error) {
12714
+ const noImageResultError = error instanceof RetryableNoImageResultError ? error : RetryError.isInstance(error) && error.lastError instanceof RetryableNoImageResultError ? error.lastError : void 0;
12715
+ if (noImageResultError != null) {
12716
+ return callResults;
12717
+ }
12718
+ throw error;
12719
+ }
12720
+ })
12721
+ );
12722
+ const results = resultGroups.flat();
12723
+ const images = [];
12724
+ const calls = [];
12725
+ const warnings = [];
12726
+ const responses = [];
12727
+ const providerMetadata = {};
12728
+ let totalUsage = {
12729
+ inputTokens: void 0,
12730
+ outputTokens: void 0,
12731
+ totalTokens: void 0
12732
+ };
12733
+ for (const result of results) {
12734
+ const callImages = result.images.map(
12735
+ (image, index) => {
12736
+ var _a26;
12737
+ return new DefaultGeneratedFile({
12738
+ data: image,
12739
+ mediaType: (_a26 = detectMediaType2({
12740
+ data: image,
12741
+ topLevelType: "image"
12742
+ })) != null ? _a26 : "image/png",
12743
+ providerMetadata: getImageProviderMetadata(
12744
+ result.providerMetadata,
12745
+ index
12746
+ )
12747
+ });
12748
+ }
12766
12749
  );
12767
- for (const { requestId, warning } of warnings) {
12768
- logWarnings({
12769
- warnings: [warning],
12770
- provider: batchApi.provider,
12771
- model: requestId == null ? void 0 : modelByRequestId.get(requestId)
12772
- });
12750
+ images.push(...callImages);
12751
+ calls.push({
12752
+ images: callImages,
12753
+ providerMetadata: result.providerMetadata,
12754
+ response: result.response,
12755
+ warnings: result.warnings,
12756
+ usage: result.usage
12757
+ });
12758
+ warnings.push(...result.warnings);
12759
+ if (result.usage != null) {
12760
+ totalUsage = addImageModelUsage(totalUsage, result.usage);
12773
12761
  }
12774
- return {
12775
- version: 2,
12776
- id: batchId,
12777
- provider: batchApi.provider,
12778
- ...status,
12779
- warnings
12780
- };
12781
- } catch (error) {
12782
- throw wrapGatewayError(error);
12762
+ if (result.providerMetadata) {
12763
+ for (const [providerName, metadata] of Object.entries(
12764
+ result.providerMetadata
12765
+ )) {
12766
+ if (providerName === "gateway") {
12767
+ const currentEntry = providerMetadata[providerName];
12768
+ if (currentEntry != null && typeof currentEntry === "object") {
12769
+ const currentGatewayMetadata = currentEntry;
12770
+ const newGatewayMetadata = metadata;
12771
+ providerMetadata[providerName] = {
12772
+ ...currentEntry,
12773
+ ...metadata,
12774
+ ...Object.fromEntries(
12775
+ gatewayCostMetadataKeys.flatMap((key) => {
12776
+ const total = addDecimalStrings(
12777
+ currentGatewayMetadata[key],
12778
+ newGatewayMetadata[key]
12779
+ );
12780
+ return total == null ? [] : [[key, total]];
12781
+ })
12782
+ )
12783
+ };
12784
+ } else {
12785
+ providerMetadata[providerName] = {
12786
+ ...metadata
12787
+ };
12788
+ }
12789
+ const imagesValue = providerMetadata[providerName].images;
12790
+ if (Array.isArray(imagesValue) && imagesValue.length === 0) {
12791
+ delete providerMetadata[providerName].images;
12792
+ }
12793
+ } else {
12794
+ (_b25 = providerMetadata[providerName]) != null ? _b25 : providerMetadata[providerName] = { images: [] };
12795
+ providerMetadata[providerName].images.push(...metadata.images);
12796
+ }
12797
+ }
12798
+ }
12799
+ responses.push(result.response);
12800
+ }
12801
+ logWarnings({ warnings, provider: model.provider, model: model.modelId });
12802
+ if (!images.length) {
12803
+ throw new NoImageGeneratedError({ calls, responses });
12783
12804
  }
12805
+ return new DefaultGenerateImageResult({
12806
+ images,
12807
+ calls,
12808
+ warnings,
12809
+ responses,
12810
+ providerMetadata,
12811
+ usage: totalUsage
12812
+ });
12784
12813
  }
12785
- function validateCompatibleTools({
12786
- requestId,
12787
- tools,
12788
- toolsByName
12789
- }) {
12790
- for (const tool2 of tools != null ? tools : []) {
12791
- const previousTool = toolsByName.get(tool2.name);
12792
- if (previousTool != null && !isDeepEqualData(previousTool, tool2)) {
12793
- throw new InvalidArgumentError({
12794
- parameter: "requests",
12795
- value: requestId,
12796
- message: `tool "${tool2.name}" must have the same definition in every batch request`
12797
- });
12814
+ var DefaultGenerateImageResult = class {
12815
+ constructor(options) {
12816
+ this.images = options.images;
12817
+ this.calls = options.calls;
12818
+ this.warnings = options.warnings;
12819
+ this.responses = options.responses;
12820
+ this.providerMetadata = options.providerMetadata;
12821
+ this.usage = options.usage;
12822
+ }
12823
+ get image() {
12824
+ return this.images[0];
12825
+ }
12826
+ };
12827
+ function getImageProviderMetadata(providerMetadata, imageIndex) {
12828
+ var _a25;
12829
+ if (providerMetadata == null) {
12830
+ return void 0;
12831
+ }
12832
+ let imageMetadata;
12833
+ for (const [providerName, metadata] of Object.entries(providerMetadata)) {
12834
+ const value = (_a25 = metadata.images) == null ? void 0 : _a25[imageIndex];
12835
+ if (isJSONObject(value) && !Array.isArray(value)) {
12836
+ (imageMetadata != null ? imageMetadata : imageMetadata = {})[providerName] = value;
12798
12837
  }
12799
- toolsByName.set(tool2.name, tool2);
12800
12838
  }
12839
+ return imageMetadata;
12801
12840
  }
12802
- async function getBatchStatus({
12803
- provider,
12804
- batch,
12805
- providerOptions,
12806
- maxRetries,
12807
- abortSignal,
12808
- headers,
12809
- timeout
12810
- }) {
12811
- const batchApi = resolveBatchApi(provider);
12812
- validateBatchReference({ batchApi, batch });
12813
- const operationAbortSignal = mergeAbortSignals(
12814
- abortSignal,
12815
- getTotalTimeoutMs(timeout)
12816
- );
12817
- const { retry } = prepareRetries({
12818
- maxRetries,
12819
- abortSignal: operationAbortSignal
12841
+ async function invokeModelMaxImagesPerCall(model) {
12842
+ const isFunction = model.maxImagesPerCall instanceof Function;
12843
+ if (!isFunction) {
12844
+ return model.maxImagesPerCall;
12845
+ }
12846
+ return model.maxImagesPerCall({
12847
+ modelId: model.modelId
12820
12848
  });
12821
- try {
12822
- const status = await retry(
12823
- () => batchApi.doGetBatchStatus({
12824
- batchId: batch.id,
12825
- providerOptions,
12826
- abortSignal: operationAbortSignal,
12827
- headers: withUserAgentSuffix4(headers != null ? headers : {}, `ai/${VERSION}`)
12828
- })
12829
- );
12830
- return status;
12831
- } catch (error) {
12832
- throw wrapGatewayError(error);
12849
+ }
12850
+ function addDecimalStrings(value1, value2) {
12851
+ if (typeof value1 !== "string" || typeof value2 !== "string" || !/^\d+(?:\.\d+)?$/.test(value1) || !/^\d+(?:\.\d+)?$/.test(value2)) {
12852
+ return void 0;
12833
12853
  }
12854
+ const [integer1, fraction1 = ""] = value1.split(".");
12855
+ const [integer2, fraction2 = ""] = value2.split(".");
12856
+ const precision = Math.max(fraction1.length, fraction2.length);
12857
+ const sum = BigInt(integer1 + fraction1.padEnd(precision, "0")) + BigInt(integer2 + fraction2.padEnd(precision, "0"));
12858
+ const sumString = sum.toString().padStart(precision + 1, "0");
12859
+ return precision === 0 ? sumString : `${sumString.slice(0, -precision)}.${sumString.slice(
12860
+ -precision
12861
+ )}`.replace(/\.?0+$/, "");
12834
12862
  }
12835
- function getBatchResults({
12836
- provider,
12837
- batch,
12838
- tools,
12839
- providerOptions,
12840
- maxRetries,
12841
- abortSignal,
12842
- headers,
12843
- timeout
12844
- }) {
12845
- const batchApi = resolveBatchApi(provider);
12846
- validateBatchReference({ batchApi, batch });
12847
- const streamAbortController = new AbortController();
12848
- const operationAbortSignal = mergeAbortSignals(
12849
- abortSignal,
12850
- getTotalTimeoutMs(timeout),
12851
- streamAbortController.signal
12852
- );
12853
- const { retry } = prepareRetries({
12854
- maxRetries,
12855
- abortSignal: operationAbortSignal
12856
- });
12857
- const transformer = {
12858
- async transform(item, controller) {
12859
- controller.enqueue(await convertBatchItemResult({ item, tools }));
12860
- },
12861
- cancel(reason) {
12862
- streamAbortController.abort(
12863
- reason != null ? reason : new Error("Batch results stream was cancelled.")
12864
- );
12865
- }
12863
+ function normalizePrompt(prompt) {
12864
+ if (typeof prompt === "string") {
12865
+ return { prompt, files: void 0, mask: void 0 };
12866
+ }
12867
+ return {
12868
+ prompt: prompt.text,
12869
+ files: prompt.images.map(toImageModelV4File),
12870
+ mask: prompt.mask ? toImageModelV4File(prompt.mask) : void 0
12866
12871
  };
12867
- const transform = new TransformStream(transformer);
12868
- void (async () => {
12869
- try {
12870
- const stream = await retry(
12871
- () => batchApi.doGetBatchResults({
12872
- batchId: batch.id,
12873
- providerOptions,
12874
- abortSignal: operationAbortSignal,
12875
- headers: withUserAgentSuffix4(headers != null ? headers : {}, `ai/${VERSION}`)
12876
- })
12877
- );
12878
- await stream.pipeTo(transform.writable, {
12879
- signal: operationAbortSignal
12880
- });
12881
- } catch (error) {
12882
- await transform.writable.abort(wrapGatewayError(error)).catch(() => {
12883
- });
12884
- }
12885
- })();
12886
- return asAsyncIterableStream(transform.readable);
12887
12872
  }
12888
- function resolveBatchApi(provider) {
12889
- var _a25;
12890
- provider != null ? provider : provider = asProviderV4((_a25 = globalThis.AI_SDK_DEFAULT_PROVIDER) != null ? _a25 : gateway2);
12891
- if (isBatchApi(provider)) {
12892
- return provider;
12873
+ function toImageModelV4File(dataContent) {
12874
+ if (typeof dataContent === "string" && dataContent.startsWith("http")) {
12875
+ return {
12876
+ type: "url",
12877
+ url: dataContent
12878
+ };
12893
12879
  }
12894
- if (!hasBatchFactory(provider)) {
12895
- throw new UnsupportedFunctionalityError3({
12896
- functionality: "batch processing",
12897
- message: "The provider does not support batch processing. Make sure it exposes an experimental_batch() method."
12898
- });
12880
+ if (typeof dataContent === "string" && dataContent.startsWith("data:")) {
12881
+ const { mediaType: dataUrlMediaType, base64Content } = splitDataUrl(dataContent);
12882
+ if (base64Content != null) {
12883
+ const uint8Data2 = convertBase64ToUint8Array4(base64Content);
12884
+ return {
12885
+ type: "file",
12886
+ data: uint8Data2,
12887
+ mediaType: dataUrlMediaType || detectMediaType2({
12888
+ data: uint8Data2,
12889
+ topLevelType: "image"
12890
+ }) || "image/png"
12891
+ };
12892
+ }
12899
12893
  }
12900
- return provider.experimental_batch();
12901
- }
12902
- function hasBatchFactory(provider) {
12903
- return typeof provider.experimental_batch === "function";
12904
- }
12905
- function isBatchApi(provider) {
12906
- const candidate = provider;
12907
- return typeof candidate.doStartBatch === "function" && typeof candidate.doGetBatchStatus === "function" && typeof candidate.doGetBatchResults === "function";
12894
+ const uint8Data = convertDataContentToUint8Array(dataContent);
12895
+ return {
12896
+ type: "file",
12897
+ data: uint8Data,
12898
+ mediaType: detectMediaType2({
12899
+ data: uint8Data,
12900
+ topLevelType: "image"
12901
+ }) || "image/png"
12902
+ };
12908
12903
  }
12909
- function validateRequests(requests) {
12910
- if (requests.length === 0) {
12911
- throw new InvalidArgumentError({
12912
- parameter: "requests",
12913
- value: requests,
12914
- message: "requests must not be empty"
12915
- });
12904
+
12905
+ // src/util/is-deep-equal-data.ts
12906
+ function isDeepEqualData(obj1, obj2) {
12907
+ if (obj1 === obj2) return true;
12908
+ if (obj1 == null || obj2 == null) return false;
12909
+ if (typeof obj1 !== "object" && typeof obj2 !== "object")
12910
+ return obj1 === obj2;
12911
+ if (obj1.constructor !== obj2.constructor) return false;
12912
+ if (obj1 instanceof Date && obj2 instanceof Date) {
12913
+ return obj1.getTime() === obj2.getTime();
12916
12914
  }
12917
- const ids = /* @__PURE__ */ new Set();
12918
- for (const request of requests) {
12919
- if (request.id.trim().length === 0) {
12920
- throw new InvalidArgumentError({
12921
- parameter: "requests",
12922
- value: requests,
12923
- message: "request IDs must not be empty"
12924
- });
12925
- }
12926
- if (ids.has(request.id)) {
12927
- throw new InvalidArgumentError({
12928
- parameter: "requests",
12929
- value: requests,
12930
- message: `request IDs must be unique; duplicate ID "${request.id}"`
12931
- });
12915
+ if (Array.isArray(obj1)) {
12916
+ if (obj1.length !== obj2.length) return false;
12917
+ for (let i = 0; i < obj1.length; i++) {
12918
+ if (!isDeepEqualData(obj1[i], obj2[i])) return false;
12932
12919
  }
12933
- ids.add(request.id);
12920
+ return true;
12921
+ }
12922
+ const keys1 = Object.keys(obj1);
12923
+ const keys2 = Object.keys(obj2);
12924
+ if (keys1.length !== keys2.length) return false;
12925
+ for (const key of keys1) {
12926
+ if (!keys2.includes(key)) return false;
12927
+ if (!isDeepEqualData(obj1[key], obj2[key])) return false;
12934
12928
  }
12929
+ return true;
12935
12930
  }
12936
- function validateBatchReference({
12937
- batchApi,
12938
- batch
12931
+
12932
+ // src/batch/batch.ts
12933
+ async function cancelBatch({
12934
+ provider,
12935
+ batch,
12936
+ providerOptions,
12937
+ abortSignal,
12938
+ headers,
12939
+ timeout
12939
12940
  }) {
12940
- if (batch.version !== 2) {
12941
- throw new InvalidArgumentError({
12942
- parameter: "batch",
12943
- value: batch,
12944
- message: "batch must be a supported batch reference"
12941
+ const batchApi = resolveBatchApi(provider);
12942
+ validateBatchReference({ batchApi, batch });
12943
+ if (batchApi.doCancelBatch == null) {
12944
+ throw new UnsupportedFunctionalityError3({
12945
+ functionality: "batch cancellation",
12946
+ message: "The provider does not support batch cancellation."
12945
12947
  });
12946
12948
  }
12947
- if (batch.provider !== batchApi.provider) {
12948
- throw new InvalidArgumentError({
12949
- parameter: "provider",
12950
- value: batchApi,
12951
- message: `provider ${batchApi.provider} is not compatible with batch provider ${batch.provider}`
12949
+ const operationAbortSignal = mergeAbortSignals(
12950
+ abortSignal,
12951
+ getTotalTimeoutMs(timeout)
12952
+ );
12953
+ try {
12954
+ return await batchApi.doCancelBatch({
12955
+ batchId: batch.id,
12956
+ providerOptions,
12957
+ abortSignal: operationAbortSignal,
12958
+ headers: withUserAgentSuffix5(headers != null ? headers : {}, `ai/${VERSION}`)
12952
12959
  });
12960
+ } catch (error) {
12961
+ throw wrapGatewayError(error);
12953
12962
  }
12954
12963
  }
12955
- async function convertBatchItemResult({
12956
- item,
12957
- tools
12958
- }) {
12959
- switch (item.type) {
12960
- case "text":
12961
- switch (item.status) {
12962
- case "succeeded":
12963
- return {
12964
- id: item.id,
12965
- status: item.status,
12966
- ...await convertGenerateResult({ result: item.result, tools })
12967
- };
12968
- case "failed":
12969
- return {
12970
- id: item.id,
12971
- status: item.status,
12972
- error: item.error,
12973
- providerMetadata: item.providerMetadata
12974
- };
12975
- case "cancelled":
12976
- case "expired":
12977
- return {
12978
- id: item.id,
12979
- status: item.status,
12980
- error: item.error,
12981
- providerMetadata: item.providerMetadata
12982
- };
12983
- }
12984
- }
12985
- }
12986
- async function convertGenerateResult({
12987
- result,
12988
- tools
12989
- }) {
12964
+ async function listBatches({
12965
+ provider,
12966
+ providerOptions,
12967
+ limit,
12968
+ cursor,
12969
+ maxRetries,
12970
+ abortSignal,
12971
+ headers,
12972
+ timeout
12973
+ } = {}) {
12990
12974
  var _a25;
12991
- const toolCalls = await Promise.all(
12992
- result.content.filter(
12993
- (part) => part.type === "tool-call"
12994
- ).map(
12995
- (toolCall) => parseToolCall({
12996
- toolCall,
12997
- tools,
12998
- repairToolCall: void 0,
12999
- refineToolInput: void 0,
13000
- instructions: void 0,
13001
- messages: []
13002
- })
13003
- )
12975
+ const batchApi = resolveBatchApi(provider);
12976
+ const doListBatches = (_a25 = batchApi.doListBatches) == null ? void 0 : _a25.bind(batchApi);
12977
+ if (doListBatches == null) {
12978
+ throw new UnsupportedFunctionalityError3({
12979
+ functionality: "batch listing",
12980
+ message: "The provider does not support listing batches."
12981
+ });
12982
+ }
12983
+ const operationAbortSignal = mergeAbortSignals(
12984
+ abortSignal,
12985
+ getTotalTimeoutMs(timeout)
13004
12986
  );
13005
- const content = convertLanguageModelContent({
13006
- content: result.content,
13007
- toolCalls,
13008
- toolOutputs: [],
13009
- toolApprovalRequests: [],
13010
- toolApprovalResponses: [],
13011
- tools
12987
+ const { retry } = prepareRetries({
12988
+ maxRetries,
12989
+ abortSignal: operationAbortSignal
13012
12990
  });
13013
- return {
13014
- content,
13015
- text: result.content.filter(
13016
- (part) => part.type === "text"
13017
- ).map((part) => part.text).join(""),
13018
- finishReason: result.finishReason.unified,
13019
- rawFinishReason: result.finishReason.raw,
13020
- usage: asLanguageModelUsage(result.usage),
13021
- ...result.response != null ? {
13022
- response: {
13023
- id: result.response.id,
13024
- timestamp: (_a25 = result.response.timestamp) == null ? void 0 : _a25.toISOString(),
13025
- modelId: result.response.modelId
13026
- }
13027
- } : {},
13028
- providerMetadata: result.providerMetadata
13029
- };
12991
+ try {
12992
+ const { batches, nextCursor, providerMetadata } = await retry(
12993
+ () => doListBatches({
12994
+ providerOptions,
12995
+ abortSignal: operationAbortSignal,
12996
+ headers: withUserAgentSuffix5(headers != null ? headers : {}, `ai/${VERSION}`),
12997
+ ...limit != null && { limit },
12998
+ ...cursor != null && { cursor }
12999
+ })
13000
+ );
13001
+ return {
13002
+ batches: batches.map(({ batchId, ...status }) => ({
13003
+ version: 2,
13004
+ id: batchId,
13005
+ provider: batchApi.provider,
13006
+ ...status
13007
+ })),
13008
+ ...nextCursor != null && { nextCursor },
13009
+ ...providerMetadata != null && { providerMetadata }
13010
+ };
13011
+ } catch (error) {
13012
+ throw wrapGatewayError(error);
13013
+ }
13030
13014
  }
13031
-
13032
- // src/embed/embed.ts
13033
- import {
13034
- createIdGenerator as createIdGenerator4,
13035
- withUserAgentSuffix as withUserAgentSuffix5
13036
- } from "@ai-sdk/provider-utils";
13037
- var originalGenerateCallId4 = createIdGenerator4({
13038
- prefix: "call",
13039
- size: 24
13040
- });
13041
- async function embed({
13042
- model: modelArg,
13043
- value,
13015
+ async function startBatch({
13016
+ provider,
13017
+ requests,
13044
13018
  providerOptions,
13045
- maxRetries: maxRetriesArg,
13019
+ webhookUrl,
13046
13020
  abortSignal,
13047
13021
  headers,
13048
- experimental_telemetry,
13049
- telemetry = experimental_telemetry,
13050
- onStart,
13051
- experimental_onStart,
13052
- onEnd,
13053
- experimental_onEnd,
13054
- _internal: { generateCallId = originalGenerateCallId4 } = {}
13022
+ timeout
13055
13023
  }) {
13056
- var _a25;
13057
- const model = resolveEmbeddingModel(modelArg);
13058
- const { maxRetries, retry } = prepareRetries({
13059
- maxRetries: maxRetriesArg,
13060
- abortSignal
13061
- });
13062
- const resolvedOnStart = onStart != null ? onStart : experimental_onStart;
13063
- const resolvedOnEnd = onEnd != null ? onEnd : experimental_onEnd;
13064
- const headersWithUserAgent = withUserAgentSuffix5(
13065
- headers != null ? headers : {},
13066
- `ai/${VERSION}`
13024
+ var _a25, _b25;
13025
+ validateRequests(requests);
13026
+ const batchApi = resolveBatchApi(provider);
13027
+ const operationAbortSignal = mergeAbortSignals(
13028
+ abortSignal,
13029
+ getTotalTimeoutMs(timeout)
13067
13030
  );
13068
- const callId = generateCallId();
13069
- const telemetryDispatcher = createTelemetryDispatcher({
13070
- telemetry
13071
- });
13072
- const runInTracingChannelSpan = (_a25 = telemetryDispatcher.runInTracingChannelSpan) != null ? _a25 : (async ({ execute }) => await execute());
13073
- const startEvent = {
13074
- callId,
13075
- operationId: "ai.embed",
13076
- provider: model.provider,
13077
- modelId: model.modelId,
13078
- value,
13079
- maxRetries,
13080
- headers: headersWithUserAgent,
13081
- providerOptions
13082
- };
13083
- return await runInTracingChannelSpan({
13084
- type: "embed",
13085
- event: startEvent,
13086
- execute: async () => {
13087
- var _a26;
13088
- await notify({
13089
- event: startEvent,
13090
- callbacks: [resolvedOnStart, telemetryDispatcher.onStart]
13091
- });
13092
- try {
13093
- const { embedding, usage, warnings, response, providerMetadata } = await retry(async () => {
13094
- var _a27, _b25;
13095
- const embedCallId = generateCallId();
13096
- await notify({
13097
- event: {
13098
- callId,
13099
- embedCallId,
13100
- operationId: "ai.embed.doEmbed",
13101
- provider: model.provider,
13102
- modelId: model.modelId,
13103
- values: [value]
13104
- },
13105
- callbacks: [telemetryDispatcher.onEmbedStart]
13106
- });
13107
- const modelResponse = await model.doEmbed({
13108
- values: [value],
13109
- abortSignal,
13110
- headers: headersWithUserAgent,
13111
- providerOptions
13112
- });
13113
- const embedding2 = modelResponse.embeddings[0];
13114
- const usage2 = (_a27 = modelResponse.usage) != null ? _a27 : { tokens: NaN };
13115
- await notify({
13116
- event: {
13117
- callId,
13118
- embedCallId,
13119
- operationId: "ai.embed.doEmbed",
13120
- provider: model.provider,
13121
- modelId: model.modelId,
13122
- values: [value],
13123
- embeddings: modelResponse.embeddings,
13124
- usage: usage2
13125
- },
13126
- callbacks: [telemetryDispatcher.onEmbedEnd]
13127
- });
13128
- if (embedding2 == null) {
13129
- throw new InvalidResponseDataError({
13130
- data: modelResponse.embeddings,
13131
- message: "No embedding generated."
13132
- });
13133
- }
13134
- return {
13135
- embedding: embedding2,
13136
- usage: usage2,
13137
- warnings: (_b25 = modelResponse.warnings) != null ? _b25 : [],
13138
- providerMetadata: modelResponse.providerMetadata,
13139
- response: modelResponse.response
13140
- };
13031
+ const supportedUrls = await batchApi.supportedUrls;
13032
+ operationAbortSignal == null ? void 0 : operationAbortSignal.throwIfAborted();
13033
+ const normalizedRequests = [];
13034
+ const toolsByName = /* @__PURE__ */ new Map();
13035
+ for (const request of requests) {
13036
+ const requestType = request.type;
13037
+ switch (requestType) {
13038
+ case "text": {
13039
+ const standardizedPrompt = await standardizePrompt(request);
13040
+ const preparedTools = await prepareTools({
13041
+ tools: request.tools,
13042
+ toolOrder: request.toolOrder,
13043
+ toolsContext: request.toolsContext
13141
13044
  });
13142
- logWarnings({
13143
- warnings,
13144
- provider: model.provider,
13145
- model: model.modelId
13045
+ validateCompatibleTools({
13046
+ requestId: request.id,
13047
+ tools: preparedTools,
13048
+ toolsByName
13146
13049
  });
13147
- await notify({
13148
- event: {
13149
- callId,
13150
- operationId: "ai.embed",
13151
- provider: model.provider,
13152
- modelId: model.modelId,
13153
- value,
13154
- embedding,
13155
- usage,
13156
- warnings,
13157
- providerMetadata,
13158
- response
13159
- },
13160
- callbacks: [resolvedOnEnd, telemetryDispatcher.onEnd]
13050
+ normalizedRequests.push({
13051
+ id: request.id,
13052
+ type: request.type,
13053
+ modelId: request.model,
13054
+ options: {
13055
+ ...prepareLanguageModelCallOptions(request),
13056
+ prompt: await convertToLanguageModelPrompt({
13057
+ prompt: standardizedPrompt,
13058
+ supportedUrls,
13059
+ download: void 0,
13060
+ provider: batchApi.provider.split(".")[0]
13061
+ }),
13062
+ tools: preparedTools,
13063
+ toolChoice: prepareToolChoice({ toolChoice: request.toolChoice }),
13064
+ providerOptions: request.providerOptions
13065
+ }
13161
13066
  });
13162
- return new DefaultEmbedResult({
13163
- value,
13164
- embedding,
13165
- usage,
13166
- warnings,
13167
- providerMetadata,
13168
- response
13067
+ break;
13068
+ }
13069
+ case "image": {
13070
+ const { prompt, files, mask } = normalizePrompt(request.prompt);
13071
+ normalizedRequests.push({
13072
+ id: request.id,
13073
+ type: request.type,
13074
+ modelId: request.model,
13075
+ options: {
13076
+ prompt,
13077
+ n: (_a25 = request.n) != null ? _a25 : 1,
13078
+ size: request.size,
13079
+ aspectRatio: request.aspectRatio,
13080
+ seed: request.seed,
13081
+ files,
13082
+ mask,
13083
+ providerOptions: (_b25 = request.providerOptions) != null ? _b25 : {}
13084
+ }
13085
+ });
13086
+ break;
13087
+ }
13088
+ default: {
13089
+ const _exhaustiveCheck = requestType;
13090
+ throw new InvalidArgumentError({
13091
+ parameter: "requests",
13092
+ value: _exhaustiveCheck,
13093
+ message: `Unsupported batch request type "${_exhaustiveCheck}".`
13169
13094
  });
13170
- } catch (error) {
13171
- await ((_a26 = telemetryDispatcher.onError) == null ? void 0 : _a26.call(telemetryDispatcher, { callId, error }));
13172
- throw error;
13173
13095
  }
13174
13096
  }
13175
- });
13176
- }
13177
- var DefaultEmbedResult = class {
13178
- constructor(options) {
13179
- this.value = options.value;
13180
- this.embedding = options.embedding;
13181
- this.usage = options.usage;
13182
- this.warnings = options.warnings;
13183
- this.providerMetadata = options.providerMetadata;
13184
- this.response = options.response;
13097
+ operationAbortSignal == null ? void 0 : operationAbortSignal.throwIfAborted();
13185
13098
  }
13186
- };
13187
-
13188
- // src/embed/embed-many.ts
13189
- import { InvalidResponseDataError as InvalidResponseDataError2 } from "@ai-sdk/provider";
13190
- import {
13191
- createIdGenerator as createIdGenerator5,
13192
- withUserAgentSuffix as withUserAgentSuffix6
13193
- } from "@ai-sdk/provider-utils";
13194
-
13195
- // src/model/get-embedding-model-max-input-bytes-per-call.ts
13196
- import { EXPERIMENTAL_EMBEDDING_MODEL_MAX_INPUT_BYTES_PER_CALL } from "@ai-sdk/provider-utils";
13197
- function getEmbeddingModelMaxInputBytesPerCall(model) {
13198
- return model[EXPERIMENTAL_EMBEDDING_MODEL_MAX_INPUT_BYTES_PER_CALL];
13199
- }
13200
-
13201
- // src/util/split-array.ts
13202
- function splitArray(array3, chunkSize) {
13203
- if (chunkSize <= 0) {
13204
- throw new Error("chunkSize must be greater than 0");
13099
+ const headersWithUserAgent = withUserAgentSuffix5(
13100
+ headers != null ? headers : {},
13101
+ `ai/${VERSION}`
13102
+ );
13103
+ try {
13104
+ const result = await batchApi.doStartBatch({
13105
+ requests: normalizedRequests,
13106
+ providerOptions,
13107
+ abortSignal: operationAbortSignal,
13108
+ headers: headersWithUserAgent,
13109
+ ...webhookUrl != null && { webhookUrl }
13110
+ });
13111
+ const { batchId, warnings, ...status } = result;
13112
+ const modelByRequestId = new Map(
13113
+ normalizedRequests.map((request) => [request.id, request.modelId])
13114
+ );
13115
+ for (const { requestId, warning } of warnings) {
13116
+ logWarnings({
13117
+ warnings: [warning],
13118
+ provider: batchApi.provider,
13119
+ model: requestId == null ? void 0 : modelByRequestId.get(requestId)
13120
+ });
13121
+ }
13122
+ return {
13123
+ version: 2,
13124
+ id: batchId,
13125
+ provider: batchApi.provider,
13126
+ ...status,
13127
+ warnings
13128
+ };
13129
+ } catch (error) {
13130
+ throw wrapGatewayError(error);
13205
13131
  }
13206
- const result = [];
13207
- for (let i = 0; i < array3.length; i += chunkSize) {
13208
- result.push(array3.slice(i, i + chunkSize));
13132
+ }
13133
+ function validateCompatibleTools({
13134
+ requestId,
13135
+ tools,
13136
+ toolsByName
13137
+ }) {
13138
+ for (const tool2 of tools != null ? tools : []) {
13139
+ const previousTool = toolsByName.get(tool2.name);
13140
+ if (previousTool != null && !isDeepEqualData(previousTool, tool2)) {
13141
+ throw new InvalidArgumentError({
13142
+ parameter: "requests",
13143
+ value: requestId,
13144
+ message: `tool "${tool2.name}" must have the same definition in every batch request`
13145
+ });
13146
+ }
13147
+ toolsByName.set(tool2.name, tool2);
13209
13148
  }
13210
- return result;
13211
13149
  }
13212
-
13213
- // src/embed/embed-many.ts
13214
- var originalGenerateCallId5 = createIdGenerator5({
13215
- prefix: "call",
13216
- size: 24
13217
- });
13218
- async function embedMany({
13219
- model: modelArg,
13220
- values,
13221
- maxParallelCalls = Infinity,
13222
- maxRetries: maxRetriesArg,
13150
+ async function getBatchStatus({
13151
+ provider,
13152
+ batch,
13153
+ providerOptions,
13154
+ maxRetries,
13223
13155
  abortSignal,
13224
13156
  headers,
13225
- providerOptions,
13226
- experimental_telemetry,
13227
- telemetry = experimental_telemetry,
13228
- onStart,
13229
- experimental_onStart,
13230
- onEnd,
13231
- experimental_onEnd,
13232
- _internal: { generateCallId = originalGenerateCallId5 } = {}
13157
+ timeout
13233
13158
  }) {
13234
- var _a25;
13235
- const model = resolveEmbeddingModel(modelArg);
13236
- const { maxRetries, retry } = prepareRetries({
13237
- maxRetries: maxRetriesArg,
13238
- abortSignal
13239
- });
13240
- const resolvedOnStart = onStart != null ? onStart : experimental_onStart;
13241
- const resolvedOnEnd = onEnd != null ? onEnd : experimental_onEnd;
13242
- const headersWithUserAgent = withUserAgentSuffix6(
13243
- headers != null ? headers : {},
13244
- `ai/${VERSION}`
13159
+ const batchApi = resolveBatchApi(provider);
13160
+ validateBatchReference({ batchApi, batch });
13161
+ const operationAbortSignal = mergeAbortSignals(
13162
+ abortSignal,
13163
+ getTotalTimeoutMs(timeout)
13245
13164
  );
13246
- const callId = generateCallId();
13247
- const telemetryDispatcher = createTelemetryDispatcher({
13248
- telemetry
13165
+ const { retry } = prepareRetries({
13166
+ maxRetries,
13167
+ abortSignal: operationAbortSignal
13249
13168
  });
13250
- const runInTracingChannelSpan = (_a25 = telemetryDispatcher.runInTracingChannelSpan) != null ? _a25 : (async ({ execute }) => await execute());
13251
- const startEvent = {
13252
- callId,
13253
- operationId: "ai.embedMany",
13254
- provider: model.provider,
13255
- modelId: model.modelId,
13256
- value: values,
13169
+ try {
13170
+ const status = await retry(
13171
+ () => batchApi.doGetBatchStatus({
13172
+ batchId: batch.id,
13173
+ providerOptions,
13174
+ abortSignal: operationAbortSignal,
13175
+ headers: withUserAgentSuffix5(headers != null ? headers : {}, `ai/${VERSION}`)
13176
+ })
13177
+ );
13178
+ return status;
13179
+ } catch (error) {
13180
+ throw wrapGatewayError(error);
13181
+ }
13182
+ }
13183
+ function getBatchResults({
13184
+ provider,
13185
+ batch,
13186
+ tools,
13187
+ providerOptions,
13188
+ maxRetries,
13189
+ abortSignal,
13190
+ headers,
13191
+ timeout
13192
+ }) {
13193
+ const batchApi = resolveBatchApi(provider);
13194
+ validateBatchReference({ batchApi, batch });
13195
+ const streamAbortController = new AbortController();
13196
+ const operationAbortSignal = mergeAbortSignals(
13197
+ abortSignal,
13198
+ getTotalTimeoutMs(timeout),
13199
+ streamAbortController.signal
13200
+ );
13201
+ const { retry } = prepareRetries({
13257
13202
  maxRetries,
13258
- headers: headersWithUserAgent,
13259
- providerOptions
13203
+ abortSignal: operationAbortSignal
13204
+ });
13205
+ const transformer = {
13206
+ async transform(item, controller) {
13207
+ controller.enqueue(await convertBatchItemResult({ item, tools }));
13208
+ },
13209
+ cancel(reason) {
13210
+ streamAbortController.abort(
13211
+ reason != null ? reason : new Error("Batch results stream was cancelled.")
13212
+ );
13213
+ }
13260
13214
  };
13261
- return await runInTracingChannelSpan({
13262
- type: "embedMany",
13263
- event: startEvent,
13264
- execute: async () => {
13265
- var _a26, _b25;
13266
- await notify({
13267
- event: startEvent,
13268
- callbacks: [resolvedOnStart, telemetryDispatcher.onStart]
13215
+ const transform = new TransformStream(transformer);
13216
+ void (async () => {
13217
+ try {
13218
+ const stream = await retry(
13219
+ () => batchApi.doGetBatchResults({
13220
+ batchId: batch.id,
13221
+ providerOptions,
13222
+ abortSignal: operationAbortSignal,
13223
+ headers: withUserAgentSuffix5(headers != null ? headers : {}, `ai/${VERSION}`)
13224
+ })
13225
+ );
13226
+ await stream.pipeTo(transform.writable, {
13227
+ signal: operationAbortSignal
13228
+ });
13229
+ } catch (error) {
13230
+ await transform.writable.abort(wrapGatewayError(error)).catch(() => {
13269
13231
  });
13270
- try {
13271
- const [
13272
- maxEmbeddingsPerCall,
13273
- maxInputBytesPerCall,
13274
- supportsParallelCalls
13275
- ] = await Promise.all([
13276
- model.maxEmbeddingsPerCall,
13277
- getEmbeddingModelMaxInputBytesPerCall(model),
13278
- model.supportsParallelCalls
13279
- ]);
13280
- const hasEmbeddingLimit = maxEmbeddingsPerCall != null && maxEmbeddingsPerCall !== Infinity;
13281
- const hasInputByteLimit = maxInputBytesPerCall != null && maxInputBytesPerCall !== Infinity;
13282
- if (!hasEmbeddingLimit && !hasInputByteLimit) {
13283
- const { embeddings: embeddings2, usage, warnings: warnings2, response, providerMetadata: providerMetadata2 } = await retry(async () => {
13284
- var _a27, _b26;
13285
- const embedCallId = generateCallId();
13286
- await notify({
13287
- event: {
13288
- callId,
13289
- embedCallId,
13290
- operationId: "ai.embedMany.doEmbed",
13291
- provider: model.provider,
13292
- modelId: model.modelId,
13293
- values
13294
- },
13295
- callbacks: [telemetryDispatcher.onEmbedStart]
13296
- });
13297
- const modelResponse = await model.doEmbed({
13298
- values,
13299
- abortSignal,
13300
- headers: headersWithUserAgent,
13301
- providerOptions
13302
- });
13303
- const embeddings3 = modelResponse.embeddings;
13304
- const usage2 = (_a27 = modelResponse.usage) != null ? _a27 : { tokens: NaN };
13305
- await notify({
13306
- event: {
13307
- callId,
13308
- embedCallId,
13309
- operationId: "ai.embedMany.doEmbed",
13310
- provider: model.provider,
13311
- modelId: model.modelId,
13312
- values,
13313
- embeddings: embeddings3,
13314
- usage: usage2
13315
- },
13316
- callbacks: [telemetryDispatcher.onEmbedEnd]
13317
- });
13318
- return {
13319
- embeddings: embeddings3,
13320
- usage: usage2,
13321
- warnings: (_b26 = modelResponse.warnings) != null ? _b26 : [],
13322
- providerMetadata: modelResponse.providerMetadata,
13323
- response: modelResponse.response
13324
- };
13325
- });
13326
- validateEmbeddingCount({ embeddings: embeddings2, values });
13327
- logWarnings({
13328
- warnings: warnings2,
13329
- provider: model.provider,
13330
- model: model.modelId
13331
- });
13332
- await notify({
13333
- event: {
13334
- callId,
13335
- operationId: "ai.embedMany",
13336
- provider: model.provider,
13337
- modelId: model.modelId,
13338
- value: values,
13339
- embedding: embeddings2,
13340
- usage,
13341
- warnings: warnings2,
13342
- providerMetadata: providerMetadata2,
13343
- response: [response]
13344
- },
13345
- callbacks: [resolvedOnEnd, telemetryDispatcher.onEnd]
13346
- });
13347
- return new DefaultEmbedManyResult({
13348
- values,
13349
- embeddings: embeddings2,
13350
- usage,
13351
- warnings: warnings2,
13352
- providerMetadata: providerMetadata2,
13353
- responses: [response]
13354
- });
13355
- }
13356
- const valueChunks = splitByEmbeddingLimits({
13357
- values,
13358
- maxEmbeddingsPerCall: hasEmbeddingLimit ? maxEmbeddingsPerCall : Infinity,
13359
- maxInputBytesPerCall: hasInputByteLimit ? maxInputBytesPerCall : Infinity
13360
- });
13361
- const embeddings = [];
13362
- const warnings = [];
13363
- const responses = [];
13364
- let tokens = 0;
13365
- let providerMetadata;
13366
- const parallelChunks = splitArray(
13367
- valueChunks,
13368
- supportsParallelCalls ? maxParallelCalls : 1
13369
- );
13370
- for (const parallelChunk of parallelChunks) {
13371
- const results = await Promise.all(
13372
- parallelChunk.map(async (chunk) => {
13373
- const result = await retry(async () => {
13374
- var _a27, _b26;
13375
- const embedCallId = generateCallId();
13376
- await notify({
13377
- event: {
13378
- callId,
13379
- embedCallId,
13380
- operationId: "ai.embedMany.doEmbed",
13381
- provider: model.provider,
13382
- modelId: model.modelId,
13383
- values: chunk
13384
- },
13385
- callbacks: [telemetryDispatcher.onEmbedStart]
13386
- });
13387
- const modelResponse = await model.doEmbed({
13388
- values: chunk,
13389
- abortSignal,
13390
- headers: headersWithUserAgent,
13391
- providerOptions
13392
- });
13393
- const chunkEmbeddings = modelResponse.embeddings;
13394
- const usage = (_a27 = modelResponse.usage) != null ? _a27 : { tokens: NaN };
13395
- await notify({
13396
- event: {
13397
- callId,
13398
- embedCallId,
13399
- operationId: "ai.embedMany.doEmbed",
13400
- provider: model.provider,
13401
- modelId: model.modelId,
13402
- values: chunk,
13403
- embeddings: chunkEmbeddings,
13404
- usage
13405
- },
13406
- callbacks: [telemetryDispatcher.onEmbedEnd]
13407
- });
13408
- return {
13409
- embeddings: chunkEmbeddings,
13410
- usage,
13411
- warnings: (_b26 = modelResponse.warnings) != null ? _b26 : [],
13412
- providerMetadata: modelResponse.providerMetadata,
13413
- response: modelResponse.response
13414
- };
13415
- });
13416
- validateEmbeddingCount({
13417
- embeddings: result.embeddings,
13418
- values: chunk
13419
- });
13420
- return result;
13421
- })
13422
- );
13423
- for (const result of results) {
13424
- embeddings.push(...result.embeddings);
13425
- warnings.push(...result.warnings);
13426
- responses.push(result.response);
13427
- tokens += result.usage.tokens;
13428
- if (result.providerMetadata) {
13429
- if (!providerMetadata) {
13430
- providerMetadata = { ...result.providerMetadata };
13431
- } else {
13432
- for (const [providerName, metadata] of Object.entries(
13433
- result.providerMetadata
13434
- )) {
13435
- providerMetadata[providerName] = {
13436
- ...(_a26 = providerMetadata[providerName]) != null ? _a26 : {},
13437
- ...metadata
13438
- };
13439
- }
13440
- }
13441
- }
13442
- }
13443
- }
13444
- logWarnings({
13445
- warnings,
13446
- provider: model.provider,
13447
- model: model.modelId
13448
- });
13449
- await notify({
13450
- event: {
13451
- callId,
13452
- operationId: "ai.embedMany",
13453
- provider: model.provider,
13454
- modelId: model.modelId,
13455
- value: values,
13456
- embedding: embeddings,
13457
- usage: { tokens },
13458
- warnings,
13459
- providerMetadata,
13460
- response: responses
13461
- },
13462
- callbacks: [resolvedOnEnd, telemetryDispatcher.onEnd]
13463
- });
13464
- return new DefaultEmbedManyResult({
13465
- values,
13466
- embeddings,
13467
- usage: { tokens },
13468
- warnings,
13469
- providerMetadata,
13470
- responses
13471
- });
13472
- } catch (error) {
13473
- await ((_b25 = telemetryDispatcher.onError) == null ? void 0 : _b25.call(telemetryDispatcher, { callId, error }));
13474
- throw error;
13475
- }
13476
13232
  }
13477
- });
13233
+ })();
13234
+ return asAsyncIterableStream(transform.readable);
13478
13235
  }
13479
- function validateEmbeddingCount({
13480
- embeddings,
13481
- values
13482
- }) {
13483
- if (embeddings.length !== values.length) {
13484
- throw new InvalidResponseDataError2({
13485
- data: embeddings,
13486
- message: `Expected ${values.length} embeddings, but received ${embeddings.length}.`
13236
+ function resolveBatchApi(provider) {
13237
+ var _a25;
13238
+ provider != null ? provider : provider = asProviderV4((_a25 = globalThis.AI_SDK_DEFAULT_PROVIDER) != null ? _a25 : gateway2);
13239
+ if (isBatchApi(provider)) {
13240
+ return provider;
13241
+ }
13242
+ if (!hasBatchFactory(provider)) {
13243
+ throw new UnsupportedFunctionalityError3({
13244
+ functionality: "batch processing",
13245
+ message: "The provider does not support batch processing. Make sure it exposes an experimental_batch() method."
13487
13246
  });
13488
13247
  }
13248
+ return provider.experimental_batch();
13489
13249
  }
13490
- var textEncoder = new TextEncoder();
13491
- function splitByEmbeddingLimits({
13492
- values,
13493
- maxEmbeddingsPerCall,
13494
- maxInputBytesPerCall
13495
- }) {
13496
- if (maxEmbeddingsPerCall <= 0) {
13497
- throw new Error("maxEmbeddingsPerCall must be greater than 0");
13498
- }
13499
- if (maxInputBytesPerCall <= 0) {
13500
- throw new Error("maxInputBytesPerCall must be greater than 0");
13501
- }
13502
- if (values.length === 0) {
13503
- return [];
13504
- }
13505
- const chunks = [];
13506
- let currentChunk = [];
13507
- let currentInputBytes = 0;
13508
- for (const value of values) {
13509
- const inputBytes = textEncoder.encode(value).length;
13510
- if (currentChunk.length > 0 && (currentChunk.length >= maxEmbeddingsPerCall || currentInputBytes + inputBytes > maxInputBytesPerCall)) {
13511
- chunks.push(currentChunk);
13512
- currentChunk = [];
13513
- currentInputBytes = 0;
13514
- }
13515
- currentChunk.push(value);
13516
- currentInputBytes += inputBytes;
13517
- }
13518
- chunks.push(currentChunk);
13519
- return chunks;
13250
+ function hasBatchFactory(provider) {
13251
+ return typeof provider.experimental_batch === "function";
13520
13252
  }
13521
- var DefaultEmbedManyResult = class {
13522
- constructor(options) {
13523
- this.values = options.values;
13524
- this.embeddings = options.embeddings;
13525
- this.usage = options.usage;
13526
- this.warnings = options.warnings;
13527
- this.providerMetadata = options.providerMetadata;
13528
- this.responses = options.responses;
13529
- }
13530
- };
13531
-
13532
- // src/generate-image/generate-image.ts
13533
- import {
13534
- isJSONObject
13535
- } from "@ai-sdk/provider";
13536
- import {
13537
- convertBase64ToUint8Array as convertBase64ToUint8Array4,
13538
- detectMediaType as detectMediaType2,
13539
- withUserAgentSuffix as withUserAgentSuffix7
13540
- } from "@ai-sdk/provider-utils";
13541
-
13542
- // src/prompt/data-content.ts
13543
- import {
13544
- convertBase64ToUint8Array as convertBase64ToUint8Array3,
13545
- convertUint8ArrayToBase64 as convertUint8ArrayToBase643
13546
- } from "@ai-sdk/provider-utils";
13547
- function convertDataContentToBase64String(content) {
13548
- if (typeof content === "string") {
13549
- return content;
13550
- }
13551
- if (content instanceof ArrayBuffer) {
13552
- return convertUint8ArrayToBase643(new Uint8Array(content));
13553
- }
13554
- return convertUint8ArrayToBase643(content);
13253
+ function isBatchApi(provider) {
13254
+ const candidate = provider;
13255
+ return typeof candidate.doStartBatch === "function" && typeof candidate.doGetBatchStatus === "function" && typeof candidate.doGetBatchResults === "function";
13555
13256
  }
13556
- function convertDataContentToUint8Array(content) {
13557
- if (content instanceof Uint8Array) {
13558
- return content;
13257
+ function validateRequests(requests) {
13258
+ if (requests.length === 0) {
13259
+ throw new InvalidArgumentError({
13260
+ parameter: "requests",
13261
+ value: requests,
13262
+ message: "requests must not be empty"
13263
+ });
13559
13264
  }
13560
- if (typeof content === "string") {
13561
- try {
13562
- return convertBase64ToUint8Array3(content);
13563
- } catch (error) {
13564
- throw new InvalidDataContentError({
13565
- message: "Invalid data content. Content string is not a base64-encoded media.",
13566
- content,
13567
- cause: error
13265
+ const ids = /* @__PURE__ */ new Set();
13266
+ for (const request of requests) {
13267
+ if (request.id.trim().length === 0) {
13268
+ throw new InvalidArgumentError({
13269
+ parameter: "requests",
13270
+ value: requests,
13271
+ message: "request IDs must not be empty"
13568
13272
  });
13569
13273
  }
13274
+ if (ids.has(request.id)) {
13275
+ throw new InvalidArgumentError({
13276
+ parameter: "requests",
13277
+ value: requests,
13278
+ message: `request IDs must be unique; duplicate ID "${request.id}"`
13279
+ });
13280
+ }
13281
+ ids.add(request.id);
13570
13282
  }
13571
- if (content instanceof ArrayBuffer) {
13572
- return new Uint8Array(content);
13573
- }
13574
- throw new InvalidDataContentError({ content });
13575
13283
  }
13576
-
13577
- // src/generate-image/generate-image.ts
13578
- var gatewayCostMetadataKeys = [
13579
- "cost",
13580
- "gatewayCost",
13581
- "inferenceCost",
13582
- "inputInferenceCost",
13583
- "marketCost",
13584
- "outputInferenceCost",
13585
- "surchargeCost"
13586
- ];
13587
- var RetryableNoImageResultError = class extends Error {
13588
- constructor() {
13589
- super("No image generated.");
13590
- this.name = "RetryableNoImageResultError";
13284
+ function validateBatchReference({
13285
+ batchApi,
13286
+ batch
13287
+ }) {
13288
+ if (batch.version !== 2) {
13289
+ throw new InvalidArgumentError({
13290
+ parameter: "batch",
13291
+ value: batch,
13292
+ message: "batch must be a supported batch reference"
13293
+ });
13591
13294
  }
13592
- };
13593
- async function generateImage({
13594
- model: modelArg,
13595
- prompt: promptArg,
13596
- n = 1,
13597
- maxImagesPerCall,
13598
- size,
13599
- aspectRatio,
13600
- seed,
13601
- providerOptions,
13602
- maxRetries: maxRetriesArg,
13603
- abortSignal,
13604
- headers
13295
+ if (batch.provider !== batchApi.provider) {
13296
+ throw new InvalidArgumentError({
13297
+ parameter: "provider",
13298
+ value: batchApi,
13299
+ message: `provider ${batchApi.provider} is not compatible with batch provider ${batch.provider}`
13300
+ });
13301
+ }
13302
+ }
13303
+ async function convertBatchItemResult({
13304
+ item,
13305
+ tools
13605
13306
  }) {
13606
- var _a25, _b25;
13607
- const model = resolveImageModel(modelArg);
13608
- const headersWithUserAgent = withUserAgentSuffix7(
13609
- headers != null ? headers : {},
13610
- `ai/${VERSION}`
13611
- );
13612
- const { retry } = prepareRetries({
13613
- maxRetries: maxRetriesArg,
13614
- abortSignal,
13615
- additionalRetryableError: (error) => error instanceof RetryableNoImageResultError
13616
- });
13617
- const maxImagesPerCallWithDefault = (_a25 = maxImagesPerCall != null ? maxImagesPerCall : await invokeModelMaxImagesPerCall(model)) != null ? _a25 : 1;
13618
- const callCount = Math.ceil(n / maxImagesPerCallWithDefault);
13619
- const callImageCounts = Array.from({ length: callCount }, (_, i) => {
13620
- if (i < callCount - 1) {
13621
- return maxImagesPerCallWithDefault;
13622
- }
13623
- const remainder = n % maxImagesPerCallWithDefault;
13624
- return remainder === 0 ? maxImagesPerCallWithDefault : remainder;
13625
- });
13626
- const resultGroups = await Promise.all(
13627
- callImageCounts.map(async (callImageCount) => {
13628
- const callResults = [];
13629
- try {
13630
- await retry(async () => {
13631
- const { prompt, files, mask } = normalizePrompt(promptArg);
13632
- const result = await model.doGenerate({
13633
- prompt,
13634
- files,
13635
- mask,
13636
- n: callImageCount,
13637
- abortSignal,
13638
- headers: headersWithUserAgent,
13639
- size,
13640
- aspectRatio,
13641
- seed,
13642
- providerOptions: providerOptions != null ? providerOptions : {}
13643
- });
13644
- callResults.push(result);
13645
- if (result.images.length === 0 && result.isRetryable !== false) {
13646
- throw new RetryableNoImageResultError();
13647
- }
13648
- return result;
13649
- });
13650
- return callResults;
13651
- } catch (error) {
13652
- const noImageResultError = error instanceof RetryableNoImageResultError ? error : RetryError.isInstance(error) && error.lastError instanceof RetryableNoImageResultError ? error.lastError : void 0;
13653
- if (noImageResultError != null) {
13654
- return callResults;
13655
- }
13656
- throw error;
13307
+ switch (item.type) {
13308
+ case "text":
13309
+ switch (item.status) {
13310
+ case "succeeded":
13311
+ return {
13312
+ type: item.type,
13313
+ id: item.id,
13314
+ status: item.status,
13315
+ ...await convertGenerateResult({ result: item.result, tools })
13316
+ };
13317
+ case "failed":
13318
+ return {
13319
+ type: item.type,
13320
+ id: item.id,
13321
+ status: item.status,
13322
+ error: item.error,
13323
+ providerMetadata: item.providerMetadata
13324
+ };
13325
+ case "cancelled":
13326
+ case "expired":
13327
+ return {
13328
+ type: item.type,
13329
+ id: item.id,
13330
+ status: item.status,
13331
+ error: item.error,
13332
+ providerMetadata: item.providerMetadata
13333
+ };
13657
13334
  }
13658
- })
13659
- );
13660
- const results = resultGroups.flat();
13661
- const images = [];
13662
- const calls = [];
13663
- const warnings = [];
13664
- const responses = [];
13665
- const providerMetadata = {};
13666
- let totalUsage = {
13667
- inputTokens: void 0,
13668
- outputTokens: void 0,
13669
- totalTokens: void 0
13670
- };
13671
- for (const result of results) {
13672
- const callImages = result.images.map(
13335
+ case "image":
13336
+ switch (item.status) {
13337
+ case "succeeded":
13338
+ return {
13339
+ type: item.type,
13340
+ id: item.id,
13341
+ status: item.status,
13342
+ ...convertImageResult(item.result)
13343
+ };
13344
+ case "failed":
13345
+ return {
13346
+ type: item.type,
13347
+ id: item.id,
13348
+ status: item.status,
13349
+ error: item.error,
13350
+ providerMetadata: item.providerMetadata
13351
+ };
13352
+ case "cancelled":
13353
+ case "expired":
13354
+ return {
13355
+ type: item.type,
13356
+ id: item.id,
13357
+ status: item.status,
13358
+ error: item.error,
13359
+ providerMetadata: item.providerMetadata
13360
+ };
13361
+ }
13362
+ }
13363
+ }
13364
+ function convertImageResult(result) {
13365
+ return {
13366
+ images: result.images.map(
13673
13367
  (image, index) => {
13674
- var _a26;
13368
+ var _a25;
13675
13369
  return new DefaultGeneratedFile({
13676
13370
  data: image,
13677
- mediaType: (_a26 = detectMediaType2({
13678
- data: image,
13679
- topLevelType: "image"
13680
- })) != null ? _a26 : "image/png",
13371
+ mediaType: (_a25 = detectMediaType3({ data: image, topLevelType: "image" })) != null ? _a25 : "image/png",
13681
13372
  providerMetadata: getImageProviderMetadata(
13682
13373
  result.providerMetadata,
13683
13374
  index
13684
13375
  )
13685
13376
  });
13686
13377
  }
13687
- );
13688
- images.push(...callImages);
13689
- calls.push({
13690
- images: callImages,
13691
- providerMetadata: result.providerMetadata,
13692
- response: result.response,
13693
- warnings: result.warnings,
13694
- usage: result.usage
13695
- });
13696
- warnings.push(...result.warnings);
13697
- if (result.usage != null) {
13698
- totalUsage = addImageModelUsage(totalUsage, result.usage);
13699
- }
13700
- if (result.providerMetadata) {
13701
- for (const [providerName, metadata] of Object.entries(
13702
- result.providerMetadata
13703
- )) {
13704
- if (providerName === "gateway") {
13705
- const currentEntry = providerMetadata[providerName];
13706
- if (currentEntry != null && typeof currentEntry === "object") {
13707
- const currentGatewayMetadata = currentEntry;
13708
- const newGatewayMetadata = metadata;
13709
- providerMetadata[providerName] = {
13710
- ...currentEntry,
13711
- ...metadata,
13712
- ...Object.fromEntries(
13713
- gatewayCostMetadataKeys.flatMap((key) => {
13714
- const total = addDecimalStrings(
13715
- currentGatewayMetadata[key],
13716
- newGatewayMetadata[key]
13717
- );
13718
- return total == null ? [] : [[key, total]];
13719
- })
13720
- )
13721
- };
13722
- } else {
13723
- providerMetadata[providerName] = {
13724
- ...metadata
13725
- };
13726
- }
13727
- const imagesValue = providerMetadata[providerName].images;
13728
- if (Array.isArray(imagesValue) && imagesValue.length === 0) {
13729
- delete providerMetadata[providerName].images;
13378
+ ),
13379
+ warnings: result.warnings,
13380
+ response: {
13381
+ timestamp: result.response.timestamp,
13382
+ modelId: result.response.modelId,
13383
+ headers: result.response.headers
13384
+ },
13385
+ providerMetadata: result.providerMetadata,
13386
+ usage: result.usage
13387
+ };
13388
+ }
13389
+ async function convertGenerateResult({
13390
+ result,
13391
+ tools
13392
+ }) {
13393
+ var _a25;
13394
+ const toolCalls = await Promise.all(
13395
+ result.content.filter(
13396
+ (part) => part.type === "tool-call"
13397
+ ).map(
13398
+ (toolCall) => parseToolCall({
13399
+ toolCall,
13400
+ tools,
13401
+ repairToolCall: void 0,
13402
+ refineToolInput: void 0,
13403
+ instructions: void 0,
13404
+ messages: []
13405
+ })
13406
+ )
13407
+ );
13408
+ const content = convertLanguageModelContent({
13409
+ content: result.content,
13410
+ toolCalls,
13411
+ toolOutputs: [],
13412
+ toolApprovalRequests: [],
13413
+ toolApprovalResponses: [],
13414
+ tools
13415
+ });
13416
+ return {
13417
+ content,
13418
+ text: result.content.filter(
13419
+ (part) => part.type === "text"
13420
+ ).map((part) => part.text).join(""),
13421
+ finishReason: result.finishReason.unified,
13422
+ rawFinishReason: result.finishReason.raw,
13423
+ usage: asLanguageModelUsage(result.usage),
13424
+ ...result.response != null ? {
13425
+ response: {
13426
+ id: result.response.id,
13427
+ timestamp: (_a25 = result.response.timestamp) == null ? void 0 : _a25.toISOString(),
13428
+ modelId: result.response.modelId
13429
+ }
13430
+ } : {},
13431
+ providerMetadata: result.providerMetadata
13432
+ };
13433
+ }
13434
+
13435
+ // src/embed/embed.ts
13436
+ import {
13437
+ createIdGenerator as createIdGenerator4,
13438
+ withUserAgentSuffix as withUserAgentSuffix6
13439
+ } from "@ai-sdk/provider-utils";
13440
+
13441
+ // src/embed/restricted-telemetry-dispatcher.ts
13442
+ function createRestrictedTelemetryDispatcher2({
13443
+ telemetry
13444
+ }) {
13445
+ const dispatcher = createTelemetryDispatcher({ telemetry });
13446
+ return {
13447
+ ...dispatcher,
13448
+ onStart: (event) => {
13449
+ var _a25;
13450
+ return (_a25 = dispatcher.onStart) == null ? void 0 : _a25.call(dispatcher, {
13451
+ ...event,
13452
+ runtimeContext: filterIncludedContext({
13453
+ context: event.runtimeContext,
13454
+ includeContext: telemetry == null ? void 0 : telemetry.includeRuntimeContext
13455
+ })
13456
+ });
13457
+ },
13458
+ onEnd: (event) => {
13459
+ var _a25;
13460
+ return (_a25 = dispatcher.onEnd) == null ? void 0 : _a25.call(dispatcher, {
13461
+ ...event,
13462
+ runtimeContext: filterIncludedContext({
13463
+ context: event.runtimeContext,
13464
+ includeContext: telemetry == null ? void 0 : telemetry.includeRuntimeContext
13465
+ })
13466
+ });
13467
+ }
13468
+ };
13469
+ }
13470
+
13471
+ // src/embed/embed.ts
13472
+ var originalGenerateCallId4 = createIdGenerator4({
13473
+ prefix: "call",
13474
+ size: 24
13475
+ });
13476
+ async function embed({
13477
+ model: modelArg,
13478
+ value,
13479
+ providerOptions,
13480
+ maxRetries: maxRetriesArg,
13481
+ abortSignal,
13482
+ headers,
13483
+ experimental_telemetry,
13484
+ telemetry = experimental_telemetry,
13485
+ runtimeContext = {},
13486
+ onStart,
13487
+ experimental_onStart,
13488
+ onEnd,
13489
+ experimental_onEnd,
13490
+ _internal: { generateCallId = originalGenerateCallId4 } = {}
13491
+ }) {
13492
+ var _a25;
13493
+ const model = resolveEmbeddingModel(modelArg);
13494
+ const { maxRetries, retry } = prepareRetries({
13495
+ maxRetries: maxRetriesArg,
13496
+ abortSignal
13497
+ });
13498
+ const resolvedOnStart = onStart != null ? onStart : experimental_onStart;
13499
+ const resolvedOnEnd = onEnd != null ? onEnd : experimental_onEnd;
13500
+ const headersWithUserAgent = withUserAgentSuffix6(
13501
+ headers != null ? headers : {},
13502
+ `ai/${VERSION}`
13503
+ );
13504
+ const callId = generateCallId();
13505
+ const telemetryDispatcher = createRestrictedTelemetryDispatcher2({
13506
+ telemetry
13507
+ });
13508
+ const runInTracingChannelSpan = (_a25 = telemetryDispatcher.runInTracingChannelSpan) != null ? _a25 : (async ({ execute }) => await execute());
13509
+ const startEvent = {
13510
+ callId,
13511
+ operationId: "ai.embed",
13512
+ runtimeContext,
13513
+ provider: model.provider,
13514
+ modelId: model.modelId,
13515
+ value,
13516
+ maxRetries,
13517
+ headers: headersWithUserAgent,
13518
+ providerOptions
13519
+ };
13520
+ return await runInTracingChannelSpan({
13521
+ type: "embed",
13522
+ event: startEvent,
13523
+ execute: async () => {
13524
+ var _a26;
13525
+ await notify({
13526
+ event: startEvent,
13527
+ callbacks: [resolvedOnStart, telemetryDispatcher.onStart]
13528
+ });
13529
+ try {
13530
+ const { embedding, usage, warnings, response, providerMetadata } = await retry(async () => {
13531
+ var _a27, _b25;
13532
+ const embedCallId = generateCallId();
13533
+ await notify({
13534
+ event: {
13535
+ callId,
13536
+ embedCallId,
13537
+ operationId: "ai.embed.doEmbed",
13538
+ provider: model.provider,
13539
+ modelId: model.modelId,
13540
+ values: [value]
13541
+ },
13542
+ callbacks: [telemetryDispatcher.onEmbedStart]
13543
+ });
13544
+ const modelResponse = await model.doEmbed({
13545
+ values: [value],
13546
+ abortSignal,
13547
+ headers: headersWithUserAgent,
13548
+ providerOptions
13549
+ });
13550
+ const embedding2 = modelResponse.embeddings[0];
13551
+ const usage2 = (_a27 = modelResponse.usage) != null ? _a27 : { tokens: NaN };
13552
+ await notify({
13553
+ event: {
13554
+ callId,
13555
+ embedCallId,
13556
+ operationId: "ai.embed.doEmbed",
13557
+ provider: model.provider,
13558
+ modelId: model.modelId,
13559
+ values: [value],
13560
+ embeddings: modelResponse.embeddings,
13561
+ usage: usage2
13562
+ },
13563
+ callbacks: [telemetryDispatcher.onEmbedEnd]
13564
+ });
13565
+ if (embedding2 == null) {
13566
+ throw new InvalidResponseDataError({
13567
+ data: modelResponse.embeddings,
13568
+ message: "No embedding generated."
13569
+ });
13570
+ }
13571
+ return {
13572
+ embedding: embedding2,
13573
+ usage: usage2,
13574
+ warnings: (_b25 = modelResponse.warnings) != null ? _b25 : [],
13575
+ providerMetadata: modelResponse.providerMetadata,
13576
+ response: modelResponse.response
13577
+ };
13578
+ });
13579
+ logWarnings({
13580
+ warnings,
13581
+ provider: model.provider,
13582
+ model: model.modelId
13583
+ });
13584
+ await notify({
13585
+ event: {
13586
+ callId,
13587
+ operationId: "ai.embed",
13588
+ runtimeContext,
13589
+ provider: model.provider,
13590
+ modelId: model.modelId,
13591
+ value,
13592
+ embedding,
13593
+ usage,
13594
+ warnings,
13595
+ providerMetadata,
13596
+ response
13597
+ },
13598
+ callbacks: [resolvedOnEnd, telemetryDispatcher.onEnd]
13599
+ });
13600
+ return new DefaultEmbedResult({
13601
+ value,
13602
+ embedding,
13603
+ usage,
13604
+ warnings,
13605
+ providerMetadata,
13606
+ response
13607
+ });
13608
+ } catch (error) {
13609
+ await ((_a26 = telemetryDispatcher.onError) == null ? void 0 : _a26.call(telemetryDispatcher, { callId, error }));
13610
+ throw error;
13611
+ }
13612
+ }
13613
+ });
13614
+ }
13615
+ var DefaultEmbedResult = class {
13616
+ constructor(options) {
13617
+ this.value = options.value;
13618
+ this.embedding = options.embedding;
13619
+ this.usage = options.usage;
13620
+ this.warnings = options.warnings;
13621
+ this.providerMetadata = options.providerMetadata;
13622
+ this.response = options.response;
13623
+ }
13624
+ };
13625
+
13626
+ // src/embed/embed-many.ts
13627
+ import { InvalidResponseDataError as InvalidResponseDataError2 } from "@ai-sdk/provider";
13628
+ import {
13629
+ createIdGenerator as createIdGenerator5,
13630
+ withUserAgentSuffix as withUserAgentSuffix7
13631
+ } from "@ai-sdk/provider-utils";
13632
+
13633
+ // src/model/get-embedding-model-max-input-bytes-per-call.ts
13634
+ import { EXPERIMENTAL_EMBEDDING_MODEL_MAX_INPUT_BYTES_PER_CALL } from "@ai-sdk/provider-utils";
13635
+ function getEmbeddingModelMaxInputBytesPerCall(model) {
13636
+ return model[EXPERIMENTAL_EMBEDDING_MODEL_MAX_INPUT_BYTES_PER_CALL];
13637
+ }
13638
+
13639
+ // src/util/split-array.ts
13640
+ function splitArray(array3, chunkSize) {
13641
+ if (chunkSize <= 0) {
13642
+ throw new Error("chunkSize must be greater than 0");
13643
+ }
13644
+ const result = [];
13645
+ for (let i = 0; i < array3.length; i += chunkSize) {
13646
+ result.push(array3.slice(i, i + chunkSize));
13647
+ }
13648
+ return result;
13649
+ }
13650
+
13651
+ // src/embed/embed-many.ts
13652
+ var originalGenerateCallId5 = createIdGenerator5({
13653
+ prefix: "call",
13654
+ size: 24
13655
+ });
13656
+ async function embedMany({
13657
+ model: modelArg,
13658
+ values,
13659
+ maxParallelCalls = Infinity,
13660
+ maxRetries: maxRetriesArg,
13661
+ abortSignal,
13662
+ headers,
13663
+ providerOptions,
13664
+ experimental_telemetry,
13665
+ telemetry = experimental_telemetry,
13666
+ runtimeContext = {},
13667
+ onStart,
13668
+ experimental_onStart,
13669
+ onEnd,
13670
+ experimental_onEnd,
13671
+ _internal: { generateCallId = originalGenerateCallId5 } = {}
13672
+ }) {
13673
+ var _a25;
13674
+ const model = resolveEmbeddingModel(modelArg);
13675
+ const { maxRetries, retry } = prepareRetries({
13676
+ maxRetries: maxRetriesArg,
13677
+ abortSignal
13678
+ });
13679
+ const resolvedOnStart = onStart != null ? onStart : experimental_onStart;
13680
+ const resolvedOnEnd = onEnd != null ? onEnd : experimental_onEnd;
13681
+ const headersWithUserAgent = withUserAgentSuffix7(
13682
+ headers != null ? headers : {},
13683
+ `ai/${VERSION}`
13684
+ );
13685
+ const callId = generateCallId();
13686
+ const telemetryDispatcher = createRestrictedTelemetryDispatcher2({
13687
+ telemetry
13688
+ });
13689
+ const runInTracingChannelSpan = (_a25 = telemetryDispatcher.runInTracingChannelSpan) != null ? _a25 : (async ({ execute }) => await execute());
13690
+ const startEvent = {
13691
+ callId,
13692
+ operationId: "ai.embedMany",
13693
+ runtimeContext,
13694
+ provider: model.provider,
13695
+ modelId: model.modelId,
13696
+ value: values,
13697
+ maxRetries,
13698
+ headers: headersWithUserAgent,
13699
+ providerOptions
13700
+ };
13701
+ return await runInTracingChannelSpan({
13702
+ type: "embedMany",
13703
+ event: startEvent,
13704
+ execute: async () => {
13705
+ var _a26, _b25;
13706
+ await notify({
13707
+ event: startEvent,
13708
+ callbacks: [resolvedOnStart, telemetryDispatcher.onStart]
13709
+ });
13710
+ try {
13711
+ const [
13712
+ maxEmbeddingsPerCall,
13713
+ maxInputBytesPerCall,
13714
+ supportsParallelCalls
13715
+ ] = await Promise.all([
13716
+ model.maxEmbeddingsPerCall,
13717
+ getEmbeddingModelMaxInputBytesPerCall(model),
13718
+ model.supportsParallelCalls
13719
+ ]);
13720
+ const hasEmbeddingLimit = maxEmbeddingsPerCall != null && maxEmbeddingsPerCall !== Infinity;
13721
+ const hasInputByteLimit = maxInputBytesPerCall != null && maxInputBytesPerCall !== Infinity;
13722
+ if (!hasEmbeddingLimit && !hasInputByteLimit) {
13723
+ const { embeddings: embeddings2, usage, warnings: warnings2, response, providerMetadata: providerMetadata2 } = await retry(async () => {
13724
+ var _a27, _b26;
13725
+ const embedCallId = generateCallId();
13726
+ await notify({
13727
+ event: {
13728
+ callId,
13729
+ embedCallId,
13730
+ operationId: "ai.embedMany.doEmbed",
13731
+ provider: model.provider,
13732
+ modelId: model.modelId,
13733
+ values
13734
+ },
13735
+ callbacks: [telemetryDispatcher.onEmbedStart]
13736
+ });
13737
+ const modelResponse = await model.doEmbed({
13738
+ values,
13739
+ abortSignal,
13740
+ headers: headersWithUserAgent,
13741
+ providerOptions
13742
+ });
13743
+ const embeddings3 = modelResponse.embeddings;
13744
+ const usage2 = (_a27 = modelResponse.usage) != null ? _a27 : { tokens: NaN };
13745
+ await notify({
13746
+ event: {
13747
+ callId,
13748
+ embedCallId,
13749
+ operationId: "ai.embedMany.doEmbed",
13750
+ provider: model.provider,
13751
+ modelId: model.modelId,
13752
+ values,
13753
+ embeddings: embeddings3,
13754
+ usage: usage2
13755
+ },
13756
+ callbacks: [telemetryDispatcher.onEmbedEnd]
13757
+ });
13758
+ return {
13759
+ embeddings: embeddings3,
13760
+ usage: usage2,
13761
+ warnings: (_b26 = modelResponse.warnings) != null ? _b26 : [],
13762
+ providerMetadata: modelResponse.providerMetadata,
13763
+ response: modelResponse.response
13764
+ };
13765
+ });
13766
+ validateEmbeddingCount({ embeddings: embeddings2, values });
13767
+ logWarnings({
13768
+ warnings: warnings2,
13769
+ provider: model.provider,
13770
+ model: model.modelId
13771
+ });
13772
+ await notify({
13773
+ event: {
13774
+ callId,
13775
+ operationId: "ai.embedMany",
13776
+ runtimeContext,
13777
+ provider: model.provider,
13778
+ modelId: model.modelId,
13779
+ value: values,
13780
+ embedding: embeddings2,
13781
+ usage,
13782
+ warnings: warnings2,
13783
+ providerMetadata: providerMetadata2,
13784
+ response: [response]
13785
+ },
13786
+ callbacks: [resolvedOnEnd, telemetryDispatcher.onEnd]
13787
+ });
13788
+ return new DefaultEmbedManyResult({
13789
+ values,
13790
+ embeddings: embeddings2,
13791
+ usage,
13792
+ warnings: warnings2,
13793
+ providerMetadata: providerMetadata2,
13794
+ responses: [response]
13795
+ });
13796
+ }
13797
+ const valueChunks = splitByEmbeddingLimits({
13798
+ values,
13799
+ maxEmbeddingsPerCall: hasEmbeddingLimit ? maxEmbeddingsPerCall : Infinity,
13800
+ maxInputBytesPerCall: hasInputByteLimit ? maxInputBytesPerCall : Infinity
13801
+ });
13802
+ const embeddings = [];
13803
+ const warnings = [];
13804
+ const responses = [];
13805
+ let tokens = 0;
13806
+ let providerMetadata;
13807
+ const parallelChunks = splitArray(
13808
+ valueChunks,
13809
+ supportsParallelCalls ? maxParallelCalls : 1
13810
+ );
13811
+ for (const parallelChunk of parallelChunks) {
13812
+ const results = await Promise.all(
13813
+ parallelChunk.map(async (chunk) => {
13814
+ const result = await retry(async () => {
13815
+ var _a27, _b26;
13816
+ const embedCallId = generateCallId();
13817
+ await notify({
13818
+ event: {
13819
+ callId,
13820
+ embedCallId,
13821
+ operationId: "ai.embedMany.doEmbed",
13822
+ provider: model.provider,
13823
+ modelId: model.modelId,
13824
+ values: chunk
13825
+ },
13826
+ callbacks: [telemetryDispatcher.onEmbedStart]
13827
+ });
13828
+ const modelResponse = await model.doEmbed({
13829
+ values: chunk,
13830
+ abortSignal,
13831
+ headers: headersWithUserAgent,
13832
+ providerOptions
13833
+ });
13834
+ const chunkEmbeddings = modelResponse.embeddings;
13835
+ const usage = (_a27 = modelResponse.usage) != null ? _a27 : { tokens: NaN };
13836
+ await notify({
13837
+ event: {
13838
+ callId,
13839
+ embedCallId,
13840
+ operationId: "ai.embedMany.doEmbed",
13841
+ provider: model.provider,
13842
+ modelId: model.modelId,
13843
+ values: chunk,
13844
+ embeddings: chunkEmbeddings,
13845
+ usage
13846
+ },
13847
+ callbacks: [telemetryDispatcher.onEmbedEnd]
13848
+ });
13849
+ return {
13850
+ embeddings: chunkEmbeddings,
13851
+ usage,
13852
+ warnings: (_b26 = modelResponse.warnings) != null ? _b26 : [],
13853
+ providerMetadata: modelResponse.providerMetadata,
13854
+ response: modelResponse.response
13855
+ };
13856
+ });
13857
+ validateEmbeddingCount({
13858
+ embeddings: result.embeddings,
13859
+ values: chunk
13860
+ });
13861
+ return result;
13862
+ })
13863
+ );
13864
+ for (const result of results) {
13865
+ embeddings.push(...result.embeddings);
13866
+ warnings.push(...result.warnings);
13867
+ responses.push(result.response);
13868
+ tokens += result.usage.tokens;
13869
+ if (result.providerMetadata) {
13870
+ if (!providerMetadata) {
13871
+ providerMetadata = { ...result.providerMetadata };
13872
+ } else {
13873
+ for (const [providerName, metadata] of Object.entries(
13874
+ result.providerMetadata
13875
+ )) {
13876
+ providerMetadata[providerName] = {
13877
+ ...(_a26 = providerMetadata[providerName]) != null ? _a26 : {},
13878
+ ...metadata
13879
+ };
13880
+ }
13881
+ }
13882
+ }
13730
13883
  }
13731
- } else {
13732
- (_b25 = providerMetadata[providerName]) != null ? _b25 : providerMetadata[providerName] = { images: [] };
13733
- providerMetadata[providerName].images.push(...metadata.images);
13734
13884
  }
13885
+ logWarnings({
13886
+ warnings,
13887
+ provider: model.provider,
13888
+ model: model.modelId
13889
+ });
13890
+ await notify({
13891
+ event: {
13892
+ callId,
13893
+ operationId: "ai.embedMany",
13894
+ runtimeContext,
13895
+ provider: model.provider,
13896
+ modelId: model.modelId,
13897
+ value: values,
13898
+ embedding: embeddings,
13899
+ usage: { tokens },
13900
+ warnings,
13901
+ providerMetadata,
13902
+ response: responses
13903
+ },
13904
+ callbacks: [resolvedOnEnd, telemetryDispatcher.onEnd]
13905
+ });
13906
+ return new DefaultEmbedManyResult({
13907
+ values,
13908
+ embeddings,
13909
+ usage: { tokens },
13910
+ warnings,
13911
+ providerMetadata,
13912
+ responses
13913
+ });
13914
+ } catch (error) {
13915
+ await ((_b25 = telemetryDispatcher.onError) == null ? void 0 : _b25.call(telemetryDispatcher, { callId, error }));
13916
+ throw error;
13735
13917
  }
13736
13918
  }
13737
- responses.push(result.response);
13738
- }
13739
- logWarnings({ warnings, provider: model.provider, model: model.modelId });
13740
- if (!images.length) {
13741
- throw new NoImageGeneratedError({ calls, responses });
13742
- }
13743
- return new DefaultGenerateImageResult({
13744
- images,
13745
- calls,
13746
- warnings,
13747
- responses,
13748
- providerMetadata,
13749
- usage: totalUsage
13750
13919
  });
13751
13920
  }
13752
- var DefaultGenerateImageResult = class {
13753
- constructor(options) {
13754
- this.images = options.images;
13755
- this.calls = options.calls;
13756
- this.warnings = options.warnings;
13757
- this.responses = options.responses;
13758
- this.providerMetadata = options.providerMetadata;
13759
- this.usage = options.usage;
13760
- }
13761
- get image() {
13762
- return this.images[0];
13763
- }
13764
- };
13765
- function getImageProviderMetadata(providerMetadata, imageIndex) {
13766
- var _a25;
13767
- if (providerMetadata == null) {
13768
- return void 0;
13769
- }
13770
- let imageMetadata;
13771
- for (const [providerName, metadata] of Object.entries(providerMetadata)) {
13772
- const value = (_a25 = metadata.images) == null ? void 0 : _a25[imageIndex];
13773
- if (isJSONObject(value) && !Array.isArray(value)) {
13774
- (imageMetadata != null ? imageMetadata : imageMetadata = {})[providerName] = value;
13775
- }
13776
- }
13777
- return imageMetadata;
13778
- }
13779
- async function invokeModelMaxImagesPerCall(model) {
13780
- const isFunction = model.maxImagesPerCall instanceof Function;
13781
- if (!isFunction) {
13782
- return model.maxImagesPerCall;
13921
+ function validateEmbeddingCount({
13922
+ embeddings,
13923
+ values
13924
+ }) {
13925
+ if (embeddings.length !== values.length) {
13926
+ throw new InvalidResponseDataError2({
13927
+ data: embeddings,
13928
+ message: `Expected ${values.length} embeddings, but received ${embeddings.length}.`
13929
+ });
13783
13930
  }
13784
- return model.maxImagesPerCall({
13785
- modelId: model.modelId
13786
- });
13787
13931
  }
13788
- function addDecimalStrings(value1, value2) {
13789
- if (typeof value1 !== "string" || typeof value2 !== "string" || !/^\d+(?:\.\d+)?$/.test(value1) || !/^\d+(?:\.\d+)?$/.test(value2)) {
13790
- return void 0;
13932
+ var textEncoder = new TextEncoder();
13933
+ function splitByEmbeddingLimits({
13934
+ values,
13935
+ maxEmbeddingsPerCall,
13936
+ maxInputBytesPerCall
13937
+ }) {
13938
+ if (maxEmbeddingsPerCall <= 0) {
13939
+ throw new Error("maxEmbeddingsPerCall must be greater than 0");
13791
13940
  }
13792
- const [integer1, fraction1 = ""] = value1.split(".");
13793
- const [integer2, fraction2 = ""] = value2.split(".");
13794
- const precision = Math.max(fraction1.length, fraction2.length);
13795
- const sum = BigInt(integer1 + fraction1.padEnd(precision, "0")) + BigInt(integer2 + fraction2.padEnd(precision, "0"));
13796
- const sumString = sum.toString().padStart(precision + 1, "0");
13797
- return precision === 0 ? sumString : `${sumString.slice(0, -precision)}.${sumString.slice(
13798
- -precision
13799
- )}`.replace(/\.?0+$/, "");
13800
- }
13801
- function normalizePrompt(prompt) {
13802
- if (typeof prompt === "string") {
13803
- return { prompt, files: void 0, mask: void 0 };
13941
+ if (maxInputBytesPerCall <= 0) {
13942
+ throw new Error("maxInputBytesPerCall must be greater than 0");
13804
13943
  }
13805
- return {
13806
- prompt: prompt.text,
13807
- files: prompt.images.map(toImageModelV4File),
13808
- mask: prompt.mask ? toImageModelV4File(prompt.mask) : void 0
13809
- };
13810
- }
13811
- function toImageModelV4File(dataContent) {
13812
- if (typeof dataContent === "string" && dataContent.startsWith("http")) {
13813
- return {
13814
- type: "url",
13815
- url: dataContent
13816
- };
13944
+ if (values.length === 0) {
13945
+ return [];
13817
13946
  }
13818
- if (typeof dataContent === "string" && dataContent.startsWith("data:")) {
13819
- const { mediaType: dataUrlMediaType, base64Content } = splitDataUrl(dataContent);
13820
- if (base64Content != null) {
13821
- const uint8Data2 = convertBase64ToUint8Array4(base64Content);
13822
- return {
13823
- type: "file",
13824
- data: uint8Data2,
13825
- mediaType: dataUrlMediaType || detectMediaType2({
13826
- data: uint8Data2,
13827
- topLevelType: "image"
13828
- }) || "image/png"
13829
- };
13947
+ const chunks = [];
13948
+ let currentChunk = [];
13949
+ let currentInputBytes = 0;
13950
+ for (const value of values) {
13951
+ const inputBytes = textEncoder.encode(value).length;
13952
+ if (currentChunk.length > 0 && (currentChunk.length >= maxEmbeddingsPerCall || currentInputBytes + inputBytes > maxInputBytesPerCall)) {
13953
+ chunks.push(currentChunk);
13954
+ currentChunk = [];
13955
+ currentInputBytes = 0;
13830
13956
  }
13957
+ currentChunk.push(value);
13958
+ currentInputBytes += inputBytes;
13831
13959
  }
13832
- const uint8Data = convertDataContentToUint8Array(dataContent);
13833
- return {
13834
- type: "file",
13835
- data: uint8Data,
13836
- mediaType: detectMediaType2({
13837
- data: uint8Data,
13838
- topLevelType: "image"
13839
- }) || "image/png"
13840
- };
13960
+ chunks.push(currentChunk);
13961
+ return chunks;
13841
13962
  }
13963
+ var DefaultEmbedManyResult = class {
13964
+ constructor(options) {
13965
+ this.values = options.values;
13966
+ this.embeddings = options.embeddings;
13967
+ this.usage = options.usage;
13968
+ this.warnings = options.warnings;
13969
+ this.providerMetadata = options.providerMetadata;
13970
+ this.responses = options.responses;
13971
+ }
13972
+ };
13842
13973
 
13843
13974
  // src/generate-object/generate-object.ts
13844
13975
  import {
@@ -15230,7 +15361,7 @@ var DefaultStreamObjectResult = class {
15230
15361
 
15231
15362
  // src/generate-speech/generate-speech.ts
15232
15363
  import {
15233
- detectMediaType as detectMediaType3,
15364
+ detectMediaType as detectMediaType4,
15234
15365
  withUserAgentSuffix as withUserAgentSuffix9
15235
15366
  } from "@ai-sdk/provider-utils";
15236
15367
 
@@ -15310,7 +15441,7 @@ async function generateSpeech({
15310
15441
  return new DefaultSpeechResult({
15311
15442
  audio: new DefaultGeneratedAudioFile({
15312
15443
  data: result.audio,
15313
- mediaType: (_a25 = detectMediaType3({
15444
+ mediaType: (_a25 = detectMediaType4({
15314
15445
  data: result.audio,
15315
15446
  topLevelType: "audio"
15316
15447
  })) != null ? _a25 : "audio/mp3"
@@ -15589,7 +15720,7 @@ import {
15589
15720
  delay as defaultDelay,
15590
15721
  generateId,
15591
15722
  withUserAgentSuffix as withUserAgentSuffix10,
15592
- detectMediaType as detectMediaType4
15723
+ detectMediaType as detectMediaType5
15593
15724
  } from "@ai-sdk/provider-utils";
15594
15725
  var defaultDownload = createDownload();
15595
15726
  async function experimental_generateVideo({
@@ -15697,7 +15828,7 @@ async function experimental_generateVideo({
15697
15828
  abortSignal
15698
15829
  });
15699
15830
  const isUsableMediaType = (type) => !!type && type !== "application/octet-stream";
15700
- const mediaType = isUsableMediaType(videoData.mediaType) && videoData.mediaType || isUsableMediaType(downloadedMediaType) && downloadedMediaType || detectMediaType4({
15831
+ const mediaType = isUsableMediaType(videoData.mediaType) && videoData.mediaType || isUsableMediaType(downloadedMediaType) && downloadedMediaType || detectMediaType5({
15701
15832
  data,
15702
15833
  topLevelType: "video"
15703
15834
  }) || "video/mp4";
@@ -15719,7 +15850,7 @@ async function experimental_generateVideo({
15719
15850
  break;
15720
15851
  }
15721
15852
  case "binary": {
15722
- const mediaType = videoData.mediaType || detectMediaType4({
15853
+ const mediaType = videoData.mediaType || detectMediaType5({
15723
15854
  data: videoData.data,
15724
15855
  topLevelType: "video"
15725
15856
  }) || "video/mp4";
@@ -15957,7 +16088,7 @@ function normalizeVideoCallInputs({
15957
16088
  };
15958
16089
  }
15959
16090
  function detectFileMediaType(data, restrictToImages) {
15960
- const detected = restrictToImages ? detectMediaType4({ data, topLevelType: "image" }) : detectMediaType4({ data });
16091
+ const detected = restrictToImages ? detectMediaType5({ data, topLevelType: "image" }) : detectMediaType5({ data });
15961
16092
  return detected != null ? detected : "image/png";
15962
16093
  }
15963
16094
  function normalizeImageData(dataContent, { restrictToImages = true } = {}) {
@@ -18059,9 +18190,44 @@ var DefaultProviderRegistry = class {
18059
18190
  };
18060
18191
 
18061
18192
  // src/rerank/rerank.ts
18193
+ import {
18194
+ InvalidResponseDataError as InvalidResponseDataError3
18195
+ } from "@ai-sdk/provider";
18062
18196
  import {
18063
18197
  createIdGenerator as createIdGenerator8
18064
18198
  } from "@ai-sdk/provider-utils";
18199
+
18200
+ // src/rerank/restricted-telemetry-dispatcher.ts
18201
+ function createRestrictedTelemetryDispatcher3({
18202
+ telemetry
18203
+ }) {
18204
+ const dispatcher = createTelemetryDispatcher({ telemetry });
18205
+ return {
18206
+ ...dispatcher,
18207
+ onStart: (event) => {
18208
+ var _a25;
18209
+ return (_a25 = dispatcher.onStart) == null ? void 0 : _a25.call(dispatcher, {
18210
+ ...event,
18211
+ runtimeContext: filterIncludedContext({
18212
+ context: event.runtimeContext,
18213
+ includeContext: telemetry == null ? void 0 : telemetry.includeRuntimeContext
18214
+ })
18215
+ });
18216
+ },
18217
+ onEnd: (event) => {
18218
+ var _a25;
18219
+ return (_a25 = dispatcher.onEnd) == null ? void 0 : _a25.call(dispatcher, {
18220
+ ...event,
18221
+ runtimeContext: filterIncludedContext({
18222
+ context: event.runtimeContext,
18223
+ includeContext: telemetry == null ? void 0 : telemetry.includeRuntimeContext
18224
+ })
18225
+ });
18226
+ }
18227
+ };
18228
+ }
18229
+
18230
+ // src/rerank/rerank.ts
18065
18231
  var originalGenerateCallId6 = createIdGenerator8({
18066
18232
  prefix: "call",
18067
18233
  size: 24
@@ -18077,6 +18243,7 @@ async function rerank({
18077
18243
  providerOptions,
18078
18244
  experimental_telemetry,
18079
18245
  telemetry = experimental_telemetry,
18246
+ runtimeContext = {},
18080
18247
  onStart,
18081
18248
  experimental_onStart,
18082
18249
  onEnd,
@@ -18088,7 +18255,7 @@ async function rerank({
18088
18255
  const callId = generateCallId();
18089
18256
  const resolvedOnStart = onStart != null ? onStart : experimental_onStart;
18090
18257
  const resolvedOnEnd = onEnd != null ? onEnd : experimental_onEnd;
18091
- const telemetryDispatcher = createTelemetryDispatcher({
18258
+ const telemetryDispatcher = createRestrictedTelemetryDispatcher3({
18092
18259
  telemetry
18093
18260
  });
18094
18261
  const runInTracingChannelSpan = (_a25 = telemetryDispatcher.runInTracingChannelSpan) != null ? _a25 : (async ({ execute }) => await execute());
@@ -18097,6 +18264,7 @@ async function rerank({
18097
18264
  event: {
18098
18265
  callId,
18099
18266
  operationId: "ai.rerank",
18267
+ runtimeContext,
18100
18268
  provider: model.provider,
18101
18269
  modelId: model.modelId,
18102
18270
  documents,
@@ -18112,6 +18280,7 @@ async function rerank({
18112
18280
  event: {
18113
18281
  callId,
18114
18282
  operationId: "ai.rerank",
18283
+ runtimeContext,
18115
18284
  provider: model.provider,
18116
18285
  modelId: model.modelId,
18117
18286
  documents,
@@ -18144,6 +18313,7 @@ async function rerank({
18144
18313
  const startEvent = {
18145
18314
  callId,
18146
18315
  operationId: "ai.rerank",
18316
+ runtimeContext,
18147
18317
  provider: model.provider,
18148
18318
  modelId: model.modelId,
18149
18319
  documents,
@@ -18206,6 +18376,7 @@ async function rerank({
18206
18376
  };
18207
18377
  }
18208
18378
  );
18379
+ validateRankingIndices({ ranking, documents });
18209
18380
  logWarnings({
18210
18381
  warnings: warnings != null ? warnings : [],
18211
18382
  provider: model.provider,
@@ -18215,14 +18386,15 @@ async function rerank({
18215
18386
  event: {
18216
18387
  callId,
18217
18388
  operationId: "ai.rerank",
18389
+ runtimeContext,
18218
18390
  provider: model.provider,
18219
18391
  modelId: model.modelId,
18220
18392
  documents,
18221
18393
  query,
18222
- ranking: ranking.map((r) => ({
18223
- originalIndex: r.index,
18224
- score: r.relevanceScore,
18225
- document: documents[r.index]
18394
+ ranking: ranking.map((ranking2) => ({
18395
+ originalIndex: ranking2.index,
18396
+ score: ranking2.relevanceScore,
18397
+ document: documents[ranking2.index]
18226
18398
  })),
18227
18399
  warnings: warnings != null ? warnings : [],
18228
18400
  providerMetadata,
@@ -18259,6 +18431,19 @@ async function rerank({
18259
18431
  }
18260
18432
  });
18261
18433
  }
18434
+ function validateRankingIndices({
18435
+ ranking,
18436
+ documents
18437
+ }) {
18438
+ for (const { index } of ranking) {
18439
+ if (!Number.isInteger(index) || index < 0 || index >= documents.length) {
18440
+ throw new InvalidResponseDataError3({
18441
+ data: ranking,
18442
+ message: `Invalid ranking index ${index}. Expected an integer between 0 and ${documents.length - 1}.`
18443
+ });
18444
+ }
18445
+ }
18446
+ }
18262
18447
  var DefaultRerankResult = class {
18263
18448
  constructor(options) {
18264
18449
  this.originalDocuments = options.originalDocuments;
@@ -18273,7 +18458,7 @@ var DefaultRerankResult = class {
18273
18458
 
18274
18459
  // src/transcribe/transcribe.ts
18275
18460
  import {
18276
- detectMediaType as detectMediaType5,
18461
+ detectMediaType as detectMediaType6,
18277
18462
  withUserAgentSuffix as withUserAgentSuffix13
18278
18463
  } from "@ai-sdk/provider-utils";
18279
18464
  var defaultDownload2 = createDownload();
@@ -18307,7 +18492,7 @@ async function transcribe({
18307
18492
  abortSignal,
18308
18493
  headers: headersWithUserAgent,
18309
18494
  providerOptions,
18310
- mediaType: (_a25 = detectMediaType5({
18495
+ mediaType: (_a25 = detectMediaType6({
18311
18496
  data: audioData,
18312
18497
  topLevelType: "audio"
18313
18498
  })) != null ? _a25 : "audio/wav"
@@ -19676,7 +19861,7 @@ var TextStreamChatTransport = class extends HttpChatTransport {
19676
19861
  // src/upload-file/upload-file.ts
19677
19862
  import {
19678
19863
  convertBase64ToUint8Array as convertBase64ToUint8Array6,
19679
- detectMediaType as detectMediaType6
19864
+ detectMediaType as detectMediaType7
19680
19865
  } from "@ai-sdk/provider-utils";
19681
19866
  async function uploadFile({
19682
19867
  api,
@@ -19689,7 +19874,7 @@ async function uploadFile({
19689
19874
  }) {
19690
19875
  var _a25;
19691
19876
  const data = dataArg instanceof Uint8Array || typeof dataArg === "string" ? { type: "data", data: dataArg } : dataArg;
19692
- const mediaType = mediaTypeArg != null ? mediaTypeArg : data.type === "text" ? "text/plain" : data.type === "stream" ? "application/octet-stream" : (_a25 = detectMediaType6({ data: data.data })) != null ? _a25 : isLikelyText(data.data) ? "text/plain" : "application/octet-stream";
19877
+ const mediaType = mediaTypeArg != null ? mediaTypeArg : data.type === "text" ? "text/plain" : data.type === "stream" ? "application/octet-stream" : (_a25 = detectMediaType7({ data: data.data })) != null ? _a25 : isLikelyText(data.data) ? "text/plain" : "application/octet-stream";
19693
19878
  let result;
19694
19879
  try {
19695
19880
  const filesApi = "uploadFile" in api ? api : typeof api.files === "function" ? api.files() : (() => {
@@ -19906,6 +20091,7 @@ export {
19906
20091
  isStaticToolUIPart,
19907
20092
  isStepCount,
19908
20093
  isTextUIPart,
20094
+ isToolOutputErrorUIPart,
19909
20095
  isToolUIPart,
19910
20096
  jsonSchema,
19911
20097
  lastAssistantMessageIsCompleteWithApprovalResponses,