ai
Version:
AI SDK by Vercel - The AI Toolkit for TypeScript and JavaScript
1,021 lines (994 loc) • 27.4 kB
JavaScript
// internal/index.ts
import { convertAsyncIteratorToReadableStream } from "@ai-sdk/provider-utils";
// src/prompt/convert-to-language-model-prompt.ts
import {
isUrlSupported
} from "@ai-sdk/provider-utils";
// src/util/detect-media-type.ts
import { convertBase64ToUint8Array } from "@ai-sdk/provider-utils";
var imageMediaTypeSignatures = [
{
mediaType: "image/gif",
bytesPrefix: [71, 73, 70],
base64Prefix: "R0lG"
},
{
mediaType: "image/png",
bytesPrefix: [137, 80, 78, 71],
base64Prefix: "iVBORw"
},
{
mediaType: "image/jpeg",
bytesPrefix: [255, 216],
base64Prefix: "/9j/"
},
{
mediaType: "image/webp",
bytesPrefix: [82, 73, 70, 70],
base64Prefix: "UklGRg"
},
{
mediaType: "image/bmp",
bytesPrefix: [66, 77],
base64Prefix: "Qk"
},
{
mediaType: "image/tiff",
bytesPrefix: [73, 73, 42, 0],
base64Prefix: "SUkqAA"
},
{
mediaType: "image/tiff",
bytesPrefix: [77, 77, 0, 42],
base64Prefix: "TU0AKg"
},
{
mediaType: "image/avif",
bytesPrefix: [
0,
0,
0,
32,
102,
116,
121,
112,
97,
118,
105,
102
],
base64Prefix: "AAAAIGZ0eXBhdmlm"
},
{
mediaType: "image/heic",
bytesPrefix: [
0,
0,
0,
32,
102,
116,
121,
112,
104,
101,
105,
99
],
base64Prefix: "AAAAIGZ0eXBoZWlj"
}
];
var stripID3 = (data) => {
const bytes = typeof data === "string" ? convertBase64ToUint8Array(data) : data;
const id3Size = (bytes[6] & 127) << 21 | (bytes[7] & 127) << 14 | (bytes[8] & 127) << 7 | bytes[9] & 127;
return bytes.slice(id3Size + 10);
};
function stripID3TagsIfPresent(data) {
const hasId3 = typeof data === "string" && data.startsWith("SUQz") || typeof data !== "string" && data.length > 10 && data[0] === 73 && // 'I'
data[1] === 68 && // 'D'
data[2] === 51;
return hasId3 ? stripID3(data) : data;
}
function detectMediaType({
data,
signatures
}) {
const processedData = stripID3TagsIfPresent(data);
for (const signature of signatures) {
if (typeof processedData === "string" ? processedData.startsWith(signature.base64Prefix) : processedData.length >= signature.bytesPrefix.length && signature.bytesPrefix.every(
(byte, index) => processedData[index] === byte
)) {
return signature.mediaType;
}
}
return void 0;
}
// src/util/download/download-error.ts
import { AISDKError } from "@ai-sdk/provider";
var name = "AI_DownloadError";
var marker = `vercel.ai.error.${name}`;
var symbol = Symbol.for(marker);
var _a;
var DownloadError = class extends AISDKError {
constructor({
url,
statusCode,
statusText,
cause,
message = cause == null ? `Failed to download ${url}: ${statusCode} ${statusText}` : `Failed to download ${url}: ${cause}`
}) {
super({ name, message, cause });
this[_a] = true;
this.url = url;
this.statusCode = statusCode;
this.statusText = statusText;
}
static isInstance(error) {
return AISDKError.hasMarker(error, marker);
}
};
_a = symbol;
// src/util/download/download.ts
var download = async ({ url }) => {
var _a5;
const urlText = url.toString();
try {
const response = await fetch(urlText);
if (!response.ok) {
throw new DownloadError({
url: urlText,
statusCode: response.status,
statusText: response.statusText
});
}
return {
data: new Uint8Array(await response.arrayBuffer()),
mediaType: (_a5 = response.headers.get("content-type")) != null ? _a5 : void 0
};
} catch (error) {
if (DownloadError.isInstance(error)) {
throw error;
}
throw new DownloadError({ url: urlText, cause: error });
}
};
// src/util/download/download-function.ts
var createDefaultDownloadFunction = (download2 = download) => (requestedDownloads) => Promise.all(
requestedDownloads.map(
async (requestedDownload) => requestedDownload.isUrlSupportedByModel ? null : download2(requestedDownload)
)
);
// src/prompt/data-content.ts
import { AISDKError as AISDKError2 } from "@ai-sdk/provider";
import {
convertBase64ToUint8Array as convertBase64ToUint8Array2,
convertUint8ArrayToBase64
} from "@ai-sdk/provider-utils";
import { z } from "zod/v4";
// src/prompt/split-data-url.ts
function splitDataUrl(dataUrl) {
try {
const [header, base64Content] = dataUrl.split(",");
return {
mediaType: header.split(";")[0].split(":")[1],
base64Content
};
} catch (error) {
return {
mediaType: void 0,
base64Content: void 0
};
}
}
// src/prompt/data-content.ts
var dataContentSchema = z.union([
z.string(),
z.instanceof(Uint8Array),
z.instanceof(ArrayBuffer),
z.custom(
// Buffer might not be available in some environments such as CloudFlare:
(value) => {
var _a5, _b;
return (_b = (_a5 = globalThis.Buffer) == null ? void 0 : _a5.isBuffer(value)) != null ? _b : false;
},
{ message: "Must be a Buffer" }
)
]);
function convertToLanguageModelV2DataContent(content) {
if (content instanceof Uint8Array) {
return { data: content, mediaType: void 0 };
}
if (content instanceof ArrayBuffer) {
return { data: new Uint8Array(content), mediaType: void 0 };
}
if (typeof content === "string") {
try {
content = new URL(content);
} catch (error) {
}
}
if (content instanceof URL && content.protocol === "data:") {
const { mediaType: dataUrlMediaType, base64Content } = splitDataUrl(
content.toString()
);
if (dataUrlMediaType == null || base64Content == null) {
throw new AISDKError2({
name: "InvalidDataContentError",
message: `Invalid data URL format in content ${content.toString()}`
});
}
return { data: base64Content, mediaType: dataUrlMediaType };
}
return { data: content, mediaType: void 0 };
}
// src/prompt/invalid-message-role-error.ts
import { AISDKError as AISDKError3 } from "@ai-sdk/provider";
var name2 = "AI_InvalidMessageRoleError";
var marker2 = `vercel.ai.error.${name2}`;
var symbol2 = Symbol.for(marker2);
var _a2;
var InvalidMessageRoleError = class extends AISDKError3 {
constructor({
role,
message = `Invalid message role: '${role}'. Must be one of: "system", "user", "assistant", "tool".`
}) {
super({ name: name2, message });
this[_a2] = true;
this.role = role;
}
static isInstance(error) {
return AISDKError3.hasMarker(error, marker2);
}
};
_a2 = symbol2;
// src/prompt/convert-to-language-model-prompt.ts
async function convertToLanguageModelPrompt({
prompt,
supportedUrls,
download: download2 = createDefaultDownloadFunction()
}) {
const downloadedAssets = await downloadAssets(
prompt.messages,
download2,
supportedUrls
);
return [
...prompt.system != null ? [{ role: "system", content: prompt.system }] : [],
...prompt.messages.map(
(message) => convertToLanguageModelMessage({ message, downloadedAssets })
)
];
}
function convertToLanguageModelMessage({
message,
downloadedAssets
}) {
const role = message.role;
switch (role) {
case "system": {
return {
role: "system",
content: message.content,
providerOptions: message.providerOptions
};
}
case "user": {
if (typeof message.content === "string") {
return {
role: "user",
content: [{ type: "text", text: message.content }],
providerOptions: message.providerOptions
};
}
return {
role: "user",
content: message.content.map((part) => convertPartToLanguageModelPart(part, downloadedAssets)).filter((part) => part.type !== "text" || part.text !== ""),
providerOptions: message.providerOptions
};
}
case "assistant": {
if (typeof message.content === "string") {
return {
role: "assistant",
content: [{ type: "text", text: message.content }],
providerOptions: message.providerOptions
};
}
return {
role: "assistant",
content: message.content.filter(
// remove empty text parts:
(part) => part.type !== "text" || part.text !== ""
).map((part) => {
const providerOptions = part.providerOptions;
switch (part.type) {
case "file": {
const { data, mediaType } = convertToLanguageModelV2DataContent(
part.data
);
return {
type: "file",
data,
filename: part.filename,
mediaType: mediaType != null ? mediaType : part.mediaType,
providerOptions
};
}
case "reasoning": {
return {
type: "reasoning",
text: part.text,
providerOptions
};
}
case "text": {
return {
type: "text",
text: part.text,
providerOptions
};
}
case "tool-call": {
return {
type: "tool-call",
toolCallId: part.toolCallId,
toolName: part.toolName,
input: part.input,
providerExecuted: part.providerExecuted,
providerOptions
};
}
case "tool-result": {
return {
type: "tool-result",
toolCallId: part.toolCallId,
toolName: part.toolName,
output: part.output,
providerOptions
};
}
}
}),
providerOptions: message.providerOptions
};
}
case "tool": {
return {
role: "tool",
content: message.content.map((part) => ({
type: "tool-result",
toolCallId: part.toolCallId,
toolName: part.toolName,
output: part.output,
providerOptions: part.providerOptions
})),
providerOptions: message.providerOptions
};
}
default: {
const _exhaustiveCheck = role;
throw new InvalidMessageRoleError({ role: _exhaustiveCheck });
}
}
}
async function downloadAssets(messages, download2, supportedUrls) {
const plannedDownloads = messages.filter((message) => message.role === "user").map((message) => message.content).filter(
(content) => Array.isArray(content)
).flat().filter(
(part) => part.type === "image" || part.type === "file"
).map((part) => {
var _a5;
const mediaType = (_a5 = part.mediaType) != null ? _a5 : part.type === "image" ? "image/*" : void 0;
let data = part.type === "image" ? part.image : part.data;
if (typeof data === "string") {
try {
data = new URL(data);
} catch (ignored) {
}
}
return { mediaType, data };
}).filter(
(part) => part.data instanceof URL
).map((part) => ({
url: part.data,
isUrlSupportedByModel: part.mediaType != null && isUrlSupported({
url: part.data.toString(),
mediaType: part.mediaType,
supportedUrls
})
}));
const downloadedFiles = await download2(plannedDownloads);
return Object.fromEntries(
downloadedFiles.filter(
(downloadedFile) => (downloadedFile == null ? void 0 : downloadedFile.data) != null
).map(({ data, mediaType }, index) => [
plannedDownloads[index].url.toString(),
{ data, mediaType }
])
);
}
function convertPartToLanguageModelPart(part, downloadedAssets) {
var _a5;
if (part.type === "text") {
return {
type: "text",
text: part.text,
providerOptions: part.providerOptions
};
}
let originalData;
const type = part.type;
switch (type) {
case "image":
originalData = part.image;
break;
case "file":
originalData = part.data;
break;
default:
throw new Error(`Unsupported part type: ${type}`);
}
const { data: convertedData, mediaType: convertedMediaType } = convertToLanguageModelV2DataContent(originalData);
let mediaType = convertedMediaType != null ? convertedMediaType : part.mediaType;
let data = convertedData;
if (data instanceof URL) {
const downloadedFile = downloadedAssets[data.toString()];
if (downloadedFile) {
data = downloadedFile.data;
mediaType != null ? mediaType : mediaType = downloadedFile.mediaType;
}
}
switch (type) {
case "image": {
if (data instanceof Uint8Array || typeof data === "string") {
mediaType = (_a5 = detectMediaType({ data, signatures: imageMediaTypeSignatures })) != null ? _a5 : mediaType;
}
return {
type: "file",
mediaType: mediaType != null ? mediaType : "image/*",
// any image
filename: void 0,
data,
providerOptions: part.providerOptions
};
}
case "file": {
if (mediaType == null) {
throw new Error(`Media type is missing for file part`);
}
return {
type: "file",
mediaType,
filename: part.filename,
data,
providerOptions: part.providerOptions
};
}
}
}
// src/prompt/prepare-tools-and-tool-choice.ts
import { asSchema } from "@ai-sdk/provider-utils";
// src/util/is-non-empty-object.ts
function isNonEmptyObject(object) {
return object != null && Object.keys(object).length > 0;
}
// src/prompt/prepare-tools-and-tool-choice.ts
function prepareToolsAndToolChoice({
tools,
toolChoice,
activeTools
}) {
if (!isNonEmptyObject(tools)) {
return {
tools: void 0,
toolChoice: void 0
};
}
const filteredTools = activeTools != null ? Object.entries(tools).filter(
([name5]) => activeTools.includes(name5)
) : Object.entries(tools);
return {
tools: filteredTools.map(([name5, tool]) => {
const toolType = tool.type;
switch (toolType) {
case void 0:
case "dynamic":
case "function":
return {
type: "function",
name: name5,
description: tool.description,
inputSchema: asSchema(tool.inputSchema).jsonSchema,
providerOptions: tool.providerOptions
};
case "provider-defined":
return {
type: "provider-defined",
name: name5,
id: tool.id,
args: tool.args
};
default: {
const exhaustiveCheck = toolType;
throw new Error(`Unsupported tool type: ${exhaustiveCheck}`);
}
}
}),
toolChoice: toolChoice == null ? { type: "auto" } : typeof toolChoice === "string" ? { type: toolChoice } : { type: "tool", toolName: toolChoice.toolName }
};
}
// src/prompt/standardize-prompt.ts
import { InvalidPromptError } from "@ai-sdk/provider";
import { safeValidateTypes } from "@ai-sdk/provider-utils";
import { z as z6 } from "zod/v4";
// src/prompt/message.ts
import { z as z5 } from "zod/v4";
// src/types/provider-metadata.ts
import { z as z3 } from "zod/v4";
// src/types/json-value.ts
import { z as z2 } from "zod/v4";
var jsonValueSchema = z2.lazy(
() => z2.union([
z2.null(),
z2.string(),
z2.number(),
z2.boolean(),
z2.record(z2.string(), jsonValueSchema),
z2.array(jsonValueSchema)
])
);
// src/types/provider-metadata.ts
var providerMetadataSchema = z3.record(
z3.string(),
z3.record(z3.string(), jsonValueSchema)
);
// src/prompt/content-part.ts
import { z as z4 } from "zod/v4";
var textPartSchema = z4.object({
type: z4.literal("text"),
text: z4.string(),
providerOptions: providerMetadataSchema.optional()
});
var imagePartSchema = z4.object({
type: z4.literal("image"),
image: z4.union([dataContentSchema, z4.instanceof(URL)]),
mediaType: z4.string().optional(),
providerOptions: providerMetadataSchema.optional()
});
var filePartSchema = z4.object({
type: z4.literal("file"),
data: z4.union([dataContentSchema, z4.instanceof(URL)]),
filename: z4.string().optional(),
mediaType: z4.string(),
providerOptions: providerMetadataSchema.optional()
});
var reasoningPartSchema = z4.object({
type: z4.literal("reasoning"),
text: z4.string(),
providerOptions: providerMetadataSchema.optional()
});
var toolCallPartSchema = z4.object({
type: z4.literal("tool-call"),
toolCallId: z4.string(),
toolName: z4.string(),
input: z4.unknown(),
providerOptions: providerMetadataSchema.optional(),
providerExecuted: z4.boolean().optional()
});
var outputSchema = z4.discriminatedUnion("type", [
z4.object({
type: z4.literal("text"),
value: z4.string()
}),
z4.object({
type: z4.literal("json"),
value: jsonValueSchema
}),
z4.object({
type: z4.literal("error-text"),
value: z4.string()
}),
z4.object({
type: z4.literal("error-json"),
value: jsonValueSchema
}),
z4.object({
type: z4.literal("content"),
value: z4.array(
z4.union([
z4.object({
type: z4.literal("text"),
text: z4.string()
}),
z4.object({
type: z4.literal("media"),
data: z4.string(),
mediaType: z4.string()
})
])
)
})
]);
var toolResultPartSchema = z4.object({
type: z4.literal("tool-result"),
toolCallId: z4.string(),
toolName: z4.string(),
output: outputSchema,
providerOptions: providerMetadataSchema.optional()
});
// src/prompt/message.ts
var systemModelMessageSchema = z5.object(
{
role: z5.literal("system"),
content: z5.string(),
providerOptions: providerMetadataSchema.optional()
}
);
var userModelMessageSchema = z5.object({
role: z5.literal("user"),
content: z5.union([
z5.string(),
z5.array(z5.union([textPartSchema, imagePartSchema, filePartSchema]))
]),
providerOptions: providerMetadataSchema.optional()
});
var assistantModelMessageSchema = z5.object({
role: z5.literal("assistant"),
content: z5.union([
z5.string(),
z5.array(
z5.union([
textPartSchema,
filePartSchema,
reasoningPartSchema,
toolCallPartSchema,
toolResultPartSchema
])
)
]),
providerOptions: providerMetadataSchema.optional()
});
var toolModelMessageSchema = z5.object({
role: z5.literal("tool"),
content: z5.array(toolResultPartSchema),
providerOptions: providerMetadataSchema.optional()
});
var modelMessageSchema = z5.union([
systemModelMessageSchema,
userModelMessageSchema,
assistantModelMessageSchema,
toolModelMessageSchema
]);
// src/prompt/standardize-prompt.ts
async function standardizePrompt(prompt) {
if (prompt.prompt == null && prompt.messages == null) {
throw new InvalidPromptError({
prompt,
message: "prompt or messages must be defined"
});
}
if (prompt.prompt != null && prompt.messages != null) {
throw new InvalidPromptError({
prompt,
message: "prompt and messages cannot be defined at the same time"
});
}
if (prompt.system != null && typeof prompt.system !== "string") {
throw new InvalidPromptError({
prompt,
message: "system must be a string"
});
}
let messages;
if (prompt.prompt != null && typeof prompt.prompt === "string") {
messages = [{ role: "user", content: prompt.prompt }];
} else if (prompt.prompt != null && Array.isArray(prompt.prompt)) {
messages = prompt.prompt;
} else if (prompt.messages != null) {
messages = prompt.messages;
} else {
throw new InvalidPromptError({
prompt,
message: "prompt or messages must be defined"
});
}
if (messages.length === 0) {
throw new InvalidPromptError({
prompt,
message: "messages must not be empty"
});
}
const validationResult = await safeValidateTypes({
value: messages,
schema: z6.array(modelMessageSchema)
});
if (!validationResult.success) {
throw new InvalidPromptError({
prompt,
message: "The messages must be a ModelMessage[]. If you have passed a UIMessage[], you can use convertToModelMessages to convert them.",
cause: validationResult.error
});
}
return {
messages,
system: prompt.system
};
}
// src/error/invalid-argument-error.ts
import { AISDKError as AISDKError4 } from "@ai-sdk/provider";
var name3 = "AI_InvalidArgumentError";
var marker3 = `vercel.ai.error.${name3}`;
var symbol3 = Symbol.for(marker3);
var _a3;
var InvalidArgumentError = class extends AISDKError4 {
constructor({
parameter,
value,
message
}) {
super({
name: name3,
message: `Invalid argument for parameter ${parameter}: ${message}`
});
this[_a3] = true;
this.parameter = parameter;
this.value = value;
}
static isInstance(error) {
return AISDKError4.hasMarker(error, marker3);
}
};
_a3 = symbol3;
// src/prompt/prepare-call-settings.ts
function prepareCallSettings({
maxOutputTokens,
temperature,
topP,
topK,
presencePenalty,
frequencyPenalty,
seed,
stopSequences
}) {
if (maxOutputTokens != null) {
if (!Number.isInteger(maxOutputTokens)) {
throw new InvalidArgumentError({
parameter: "maxOutputTokens",
value: maxOutputTokens,
message: "maxOutputTokens must be an integer"
});
}
if (maxOutputTokens < 1) {
throw new InvalidArgumentError({
parameter: "maxOutputTokens",
value: maxOutputTokens,
message: "maxOutputTokens must be >= 1"
});
}
}
if (temperature != null) {
if (typeof temperature !== "number") {
throw new InvalidArgumentError({
parameter: "temperature",
value: temperature,
message: "temperature must be a number"
});
}
}
if (topP != null) {
if (typeof topP !== "number") {
throw new InvalidArgumentError({
parameter: "topP",
value: topP,
message: "topP must be a number"
});
}
}
if (topK != null) {
if (typeof topK !== "number") {
throw new InvalidArgumentError({
parameter: "topK",
value: topK,
message: "topK must be a number"
});
}
}
if (presencePenalty != null) {
if (typeof presencePenalty !== "number") {
throw new InvalidArgumentError({
parameter: "presencePenalty",
value: presencePenalty,
message: "presencePenalty must be a number"
});
}
}
if (frequencyPenalty != null) {
if (typeof frequencyPenalty !== "number") {
throw new InvalidArgumentError({
parameter: "frequencyPenalty",
value: frequencyPenalty,
message: "frequencyPenalty must be a number"
});
}
}
if (seed != null) {
if (!Number.isInteger(seed)) {
throw new InvalidArgumentError({
parameter: "seed",
value: seed,
message: "seed must be an integer"
});
}
}
return {
maxOutputTokens,
temperature,
topP,
topK,
presencePenalty,
frequencyPenalty,
stopSequences,
seed
};
}
// src/util/retry-with-exponential-backoff.ts
import { APICallError } from "@ai-sdk/provider";
import { delay, getErrorMessage, isAbortError } from "@ai-sdk/provider-utils";
// src/util/retry-error.ts
import { AISDKError as AISDKError5 } from "@ai-sdk/provider";
var name4 = "AI_RetryError";
var marker4 = `vercel.ai.error.${name4}`;
var symbol4 = Symbol.for(marker4);
var _a4;
var RetryError = class extends AISDKError5 {
constructor({
message,
reason,
errors
}) {
super({ name: name4, message });
this[_a4] = true;
this.reason = reason;
this.errors = errors;
this.lastError = errors[errors.length - 1];
}
static isInstance(error) {
return AISDKError5.hasMarker(error, marker4);
}
};
_a4 = symbol4;
// src/util/retry-with-exponential-backoff.ts
function getRetryDelayInMs({
error,
exponentialBackoffDelay
}) {
const headers = error.responseHeaders;
if (!headers)
return exponentialBackoffDelay;
let ms;
const retryAfterMs = headers["retry-after-ms"];
if (retryAfterMs) {
const timeoutMs = parseFloat(retryAfterMs);
if (!Number.isNaN(timeoutMs)) {
ms = timeoutMs;
}
}
const retryAfter = headers["retry-after"];
if (retryAfter && ms === void 0) {
const timeoutSeconds = parseFloat(retryAfter);
if (!Number.isNaN(timeoutSeconds)) {
ms = timeoutSeconds * 1e3;
} else {
ms = Date.parse(retryAfter) - Date.now();
}
}
if (ms != null && !Number.isNaN(ms) && 0 <= ms && (ms < 60 * 1e3 || ms < exponentialBackoffDelay)) {
return ms;
}
return exponentialBackoffDelay;
}
var retryWithExponentialBackoffRespectingRetryHeaders = ({
maxRetries = 2,
initialDelayInMs = 2e3,
backoffFactor = 2,
abortSignal
} = {}) => async (f) => _retryWithExponentialBackoff(f, {
maxRetries,
delayInMs: initialDelayInMs,
backoffFactor,
abortSignal
});
async function _retryWithExponentialBackoff(f, {
maxRetries,
delayInMs,
backoffFactor,
abortSignal
}, errors = []) {
try {
return await f();
} catch (error) {
if (isAbortError(error)) {
throw error;
}
if (maxRetries === 0) {
throw error;
}
const errorMessage = getErrorMessage(error);
const newErrors = [...errors, error];
const tryNumber = newErrors.length;
if (tryNumber > maxRetries) {
throw new RetryError({
message: `Failed after ${tryNumber} attempts. Last error: ${errorMessage}`,
reason: "maxRetriesExceeded",
errors: newErrors
});
}
if (error instanceof Error && APICallError.isInstance(error) && error.isRetryable === true && tryNumber <= maxRetries) {
await delay(
getRetryDelayInMs({
error,
exponentialBackoffDelay: delayInMs
}),
{ abortSignal }
);
return _retryWithExponentialBackoff(
f,
{
maxRetries,
delayInMs: backoffFactor * delayInMs,
backoffFactor,
abortSignal
},
newErrors
);
}
if (tryNumber === 1) {
throw error;
}
throw new RetryError({
message: `Failed after ${tryNumber} attempts with non-retryable error: '${errorMessage}'`,
reason: "errorNotRetryable",
errors: newErrors
});
}
}
// src/util/prepare-retries.ts
function prepareRetries({
maxRetries,
abortSignal
}) {
if (maxRetries != null) {
if (!Number.isInteger(maxRetries)) {
throw new InvalidArgumentError({
parameter: "maxRetries",
value: maxRetries,
message: "maxRetries must be an integer"
});
}
if (maxRetries < 0) {
throw new InvalidArgumentError({
parameter: "maxRetries",
value: maxRetries,
message: "maxRetries must be >= 0"
});
}
}
const maxRetriesResult = maxRetries != null ? maxRetries : 2;
return {
maxRetries: maxRetriesResult,
retry: retryWithExponentialBackoffRespectingRetryHeaders({
maxRetries: maxRetriesResult,
abortSignal
})
};
}
export {
convertAsyncIteratorToReadableStream,
convertToLanguageModelPrompt,
prepareCallSettings,
prepareRetries,
prepareToolsAndToolChoice,
standardizePrompt
};
//# sourceMappingURL=index.mjs.map