ai
Version:
AI SDK by Vercel - build apps like ChatGPT, Claude, Gemini, and more with a single interface for any model using the Vercel AI Gateway or go direct to OpenAI, Anthropic, Google, or any other model provider.
1,704 lines (1,650 loc) • 557 kB
JavaScript
var __defProp = Object.defineProperty;
var __export = (target, all) => {
for (var name22 in all)
__defProp(target, name22, { get: all[name22], enumerable: true });
};
// src/index.ts
import { createGateway, gateway as gateway2 } from "@ai-sdk/gateway";
import {
asSchema as asSchema8,
createIdGenerator as createIdGenerator9,
dynamicTool,
generateId,
jsonSchema,
parseJsonEventStream as parseJsonEventStream3,
tool,
zodSchema as zodSchema3
} from "@ai-sdk/provider-utils";
// src/agent/tool-loop-agent.ts
import {
validateTypes as validateTypes3,
withUserAgentSuffix as withUserAgentSuffix3
} from "@ai-sdk/provider-utils";
// src/generate-text/generate-text.ts
import {
asArray as asArray5,
createIdGenerator,
getErrorMessage as getErrorMessage4,
withUserAgentSuffix as withUserAgentSuffix2
} from "@ai-sdk/provider-utils";
// src/error/index.ts
import {
AISDKError as AISDKError22,
APICallError,
EmptyResponseBodyError,
InvalidPromptError,
InvalidResponseDataError,
JSONParseError,
LoadAPIKeyError,
LoadSettingError,
NoContentGeneratedError,
NoSuchModelError,
NoSuchProviderReferenceError,
TooManyEmbeddingValuesForCallError,
TypeValidationError,
UnsupportedFunctionalityError
} from "@ai-sdk/provider";
// src/error/invalid-argument-error.ts
import { AISDKError } from "@ai-sdk/provider";
var name = "AI_InvalidArgumentError";
var marker = `vercel.ai.error.${name}`;
var symbol = Symbol.for(marker);
var _a;
var InvalidArgumentError = class extends AISDKError {
constructor({
parameter,
value,
message
}) {
super({
name,
message: `Invalid argument for parameter ${parameter}: ${message}`
});
this[_a] = true;
this.parameter = parameter;
this.value = value;
}
static isInstance(error) {
return AISDKError.hasMarker(error, marker);
}
};
_a = symbol;
// src/error/invalid-stream-part-error.ts
import { AISDKError as AISDKError2 } from "@ai-sdk/provider";
var name2 = "AI_InvalidStreamPartError";
var marker2 = `vercel.ai.error.${name2}`;
var symbol2 = Symbol.for(marker2);
var _a2;
var InvalidStreamPartError = class extends AISDKError2 {
constructor({
chunk,
message
}) {
super({ name: name2, message });
this[_a2] = true;
this.chunk = chunk;
}
static isInstance(error) {
return AISDKError2.hasMarker(error, marker2);
}
};
_a2 = symbol2;
// src/error/invalid-tool-approval-error.ts
import { AISDKError as AISDKError3 } from "@ai-sdk/provider";
var name3 = "AI_InvalidToolApprovalError";
var marker3 = `vercel.ai.error.${name3}`;
var symbol3 = Symbol.for(marker3);
var _a3;
var InvalidToolApprovalError = class extends AISDKError3 {
constructor({ approvalId }) {
super({
name: name3,
message: `Tool approval response references unknown approvalId: "${approvalId}". No matching tool-approval-request found in message history.`
});
this[_a3] = true;
this.approvalId = approvalId;
}
static isInstance(error) {
return AISDKError3.hasMarker(error, marker3);
}
};
_a3 = symbol3;
// src/error/invalid-tool-approval-signature-error.ts
import { AISDKError as AISDKError4 } from "@ai-sdk/provider";
var name4 = "AI_InvalidToolApprovalSignatureError";
var marker4 = `vercel.ai.error.${name4}`;
var symbol4 = Symbol.for(marker4);
var _a4;
var InvalidToolApprovalSignatureError = class extends AISDKError4 {
constructor({
approvalId,
toolCallId,
reason
}) {
super({
name: name4,
message: `Tool approval signature verification failed for approval "${approvalId}" (tool call "${toolCallId}"): ${reason}`
});
this[_a4] = true;
this.approvalId = approvalId;
this.toolCallId = toolCallId;
}
static isInstance(error) {
return AISDKError4.hasMarker(error, marker4);
}
};
_a4 = symbol4;
// src/error/invalid-tool-input-error.ts
import { AISDKError as AISDKError5, getErrorMessage } from "@ai-sdk/provider";
var name5 = "AI_InvalidToolInputError";
var marker5 = `vercel.ai.error.${name5}`;
var symbol5 = Symbol.for(marker5);
var _a5;
var InvalidToolInputError = class extends AISDKError5 {
constructor({
toolInput,
toolName,
cause,
message = `Invalid input for tool ${toolName}: ${getErrorMessage(cause)}`
}) {
super({ name: name5, message, cause });
this[_a5] = true;
this.toolInput = toolInput;
this.toolName = toolName;
}
static isInstance(error) {
return AISDKError5.hasMarker(error, marker5);
}
};
_a5 = symbol5;
// src/error/tool-call-not-found-for-approval-error.ts
import { AISDKError as AISDKError6 } from "@ai-sdk/provider";
var name6 = "AI_ToolCallNotFoundForApprovalError";
var marker6 = `vercel.ai.error.${name6}`;
var symbol6 = Symbol.for(marker6);
var _a6;
var ToolCallNotFoundForApprovalError = class extends AISDKError6 {
constructor({
toolCallId,
approvalId
}) {
super({
name: name6,
message: `Tool call "${toolCallId}" not found for approval request "${approvalId}".`
});
this[_a6] = true;
this.toolCallId = toolCallId;
this.approvalId = approvalId;
}
static isInstance(error) {
return AISDKError6.hasMarker(error, marker6);
}
};
_a6 = symbol6;
// src/error/missing-tool-result-error.ts
import { AISDKError as AISDKError7 } from "@ai-sdk/provider";
var name7 = "AI_MissingToolResultsError";
var marker7 = `vercel.ai.error.${name7}`;
var symbol7 = Symbol.for(marker7);
var _a7;
var MissingToolResultsError = class extends AISDKError7 {
constructor({ toolCallIds }) {
super({
name: name7,
message: `Tool result${toolCallIds.length > 1 ? "s are" : " is"} missing for tool call${toolCallIds.length > 1 ? "s" : ""} ${toolCallIds.join(
", "
)}.`
});
this[_a7] = true;
this.toolCallIds = toolCallIds;
}
static isInstance(error) {
return AISDKError7.hasMarker(error, marker7);
}
};
_a7 = symbol7;
// src/error/no-image-generated-error.ts
import { AISDKError as AISDKError8 } from "@ai-sdk/provider";
var name8 = "AI_NoImageGeneratedError";
var marker8 = `vercel.ai.error.${name8}`;
var symbol8 = Symbol.for(marker8);
var _a8;
var NoImageGeneratedError = class extends AISDKError8 {
constructor({
message = "No image generated.",
cause,
responses
}) {
super({ name: name8, message, cause });
this[_a8] = true;
this.responses = responses;
}
static isInstance(error) {
return AISDKError8.hasMarker(error, marker8);
}
};
_a8 = symbol8;
// src/error/no-object-generated-error.ts
import { AISDKError as AISDKError9 } from "@ai-sdk/provider";
var name9 = "AI_NoObjectGeneratedError";
var marker9 = `vercel.ai.error.${name9}`;
var symbol9 = Symbol.for(marker9);
var _a9;
var NoObjectGeneratedError = class extends AISDKError9 {
constructor({
message = "No object generated.",
cause,
text: text2,
response,
usage,
finishReason
}) {
super({ name: name9, message, cause });
this[_a9] = true;
this.text = text2;
this.response = response;
this.usage = usage;
this.finishReason = finishReason;
}
static isInstance(error) {
return AISDKError9.hasMarker(error, marker9);
}
};
_a9 = symbol9;
// src/error/no-output-generated-error.ts
import { AISDKError as AISDKError10 } from "@ai-sdk/provider";
var name10 = "AI_NoOutputGeneratedError";
var marker10 = `vercel.ai.error.${name10}`;
var symbol10 = Symbol.for(marker10);
var _a10;
var NoOutputGeneratedError = class extends AISDKError10 {
// used in isInstance
constructor({
message = "No output generated.",
cause
} = {}) {
super({ name: name10, message, cause });
this[_a10] = true;
}
static isInstance(error) {
return AISDKError10.hasMarker(error, marker10);
}
};
_a10 = symbol10;
// src/error/no-speech-generated-error.ts
import { AISDKError as AISDKError11 } from "@ai-sdk/provider";
var name11 = "AI_NoSpeechGeneratedError";
var marker11 = `vercel.ai.error.${name11}`;
var symbol11 = Symbol.for(marker11);
var _a11;
var NoSpeechGeneratedError = class extends AISDKError11 {
constructor(options) {
super({
name: name11,
message: "No speech audio generated."
});
this[_a11] = true;
this.responses = options.responses;
}
static isInstance(error) {
return AISDKError11.hasMarker(error, marker11);
}
};
_a11 = symbol11;
// src/error/no-transcript-generated-error.ts
import { AISDKError as AISDKError12 } from "@ai-sdk/provider";
var name12 = "AI_NoTranscriptGeneratedError";
var marker12 = `vercel.ai.error.${name12}`;
var symbol12 = Symbol.for(marker12);
var _a12;
var NoTranscriptGeneratedError = class extends AISDKError12 {
constructor(options) {
super({
name: name12,
message: "No transcript generated."
});
this[_a12] = true;
this.responses = options.responses;
}
static isInstance(error) {
return AISDKError12.hasMarker(error, marker12);
}
};
_a12 = symbol12;
// src/error/no-video-generated-error.ts
import { AISDKError as AISDKError13 } from "@ai-sdk/provider";
var name13 = "AI_NoVideoGeneratedError";
var marker13 = `vercel.ai.error.${name13}`;
var symbol13 = Symbol.for(marker13);
var _a13;
var NoVideoGeneratedError = class extends AISDKError13 {
constructor({
message = "No video generated.",
cause,
responses
}) {
super({ name: name13, message, cause });
this[_a13] = true;
this.responses = responses;
}
static isInstance(error) {
return AISDKError13.hasMarker(error, marker13);
}
/**
* @deprecated use `isInstance` instead
*/
static isNoVideoGeneratedError(error) {
return error instanceof Error && error.name === name13 && typeof error.responses !== "undefined" ? true : false;
}
/**
* @deprecated Do not use this method. It will be removed in the next major version.
*/
toJSON() {
return {
name: this.name,
message: this.message,
stack: this.stack,
cause: this.cause,
responses: this.responses
};
}
};
_a13 = symbol13;
// src/error/no-such-tool-error.ts
import { AISDKError as AISDKError14 } from "@ai-sdk/provider";
var name14 = "AI_NoSuchToolError";
var marker14 = `vercel.ai.error.${name14}`;
var symbol14 = Symbol.for(marker14);
var _a14;
var NoSuchToolError = class extends AISDKError14 {
constructor({
toolName,
availableTools = void 0,
message = `Model tried to call unavailable tool '${toolName}'. ${availableTools === void 0 ? "No tools are available." : `Available tools: ${availableTools.join(", ")}.`}`
}) {
super({ name: name14, message });
this[_a14] = true;
this.toolName = toolName;
this.availableTools = availableTools;
}
static isInstance(error) {
return AISDKError14.hasMarker(error, marker14);
}
};
_a14 = symbol14;
// src/error/tool-call-repair-error.ts
import { AISDKError as AISDKError15, getErrorMessage as getErrorMessage2 } from "@ai-sdk/provider";
var name15 = "AI_ToolCallRepairError";
var marker15 = `vercel.ai.error.${name15}`;
var symbol15 = Symbol.for(marker15);
var _a15;
var ToolCallRepairError = class extends AISDKError15 {
constructor({
cause,
originalError,
message = `Error repairing tool call: ${getErrorMessage2(cause)}`
}) {
super({ name: name15, message, cause });
this[_a15] = true;
this.originalError = originalError;
}
static isInstance(error) {
return AISDKError15.hasMarker(error, marker15);
}
};
_a15 = symbol15;
// src/error/unsupported-model-version-error.ts
import { AISDKError as AISDKError16 } from "@ai-sdk/provider";
var UnsupportedModelVersionError = class extends AISDKError16 {
constructor(options) {
super({
name: "AI_UnsupportedModelVersionError",
message: `Unsupported model version ${options.version} for provider "${options.provider}" and model "${options.modelId}". AI SDK 5 only supports models that implement specification version "v2".`
});
this.version = options.version;
this.provider = options.provider;
this.modelId = options.modelId;
}
};
// src/error/ui-message-stream-error.ts
import { AISDKError as AISDKError17 } from "@ai-sdk/provider";
var name16 = "AI_UIMessageStreamError";
var marker16 = `vercel.ai.error.${name16}`;
var symbol16 = Symbol.for(marker16);
var _a16;
var UIMessageStreamError = class extends AISDKError17 {
constructor({
chunkType,
chunkId,
message
}) {
super({ name: name16, message });
this[_a16] = true;
this.chunkType = chunkType;
this.chunkId = chunkId;
}
static isInstance(error) {
return AISDKError17.hasMarker(error, marker16);
}
};
_a16 = symbol16;
// src/prompt/invalid-data-content-error.ts
import { AISDKError as AISDKError18 } from "@ai-sdk/provider";
var name17 = "AI_InvalidDataContentError";
var marker17 = `vercel.ai.error.${name17}`;
var symbol17 = Symbol.for(marker17);
var _a17;
var InvalidDataContentError = class extends AISDKError18 {
constructor({
content,
cause,
message = `Invalid data content. Expected a base64 string, Uint8Array, ArrayBuffer, or Buffer, but got ${typeof content}.`
}) {
super({ name: name17, message, cause });
this[_a17] = true;
this.content = content;
}
static isInstance(error) {
return AISDKError18.hasMarker(error, marker17);
}
};
_a17 = symbol17;
// src/prompt/invalid-message-role-error.ts
import { AISDKError as AISDKError19 } from "@ai-sdk/provider";
var name18 = "AI_InvalidMessageRoleError";
var marker18 = `vercel.ai.error.${name18}`;
var symbol18 = Symbol.for(marker18);
var _a18;
var InvalidMessageRoleError = class extends AISDKError19 {
constructor({
role,
message = `Invalid message role: '${role}'. Must be one of: "system", "user", "assistant", "tool".`
}) {
super({ name: name18, message });
this[_a18] = true;
this.role = role;
}
static isInstance(error) {
return AISDKError19.hasMarker(error, marker18);
}
};
_a18 = symbol18;
// src/prompt/message-conversion-error.ts
import { AISDKError as AISDKError20 } from "@ai-sdk/provider";
var name19 = "AI_MessageConversionError";
var marker19 = `vercel.ai.error.${name19}`;
var symbol19 = Symbol.for(marker19);
var _a19;
var MessageConversionError = class extends AISDKError20 {
constructor({
originalMessage,
message
}) {
super({ name: name19, message });
this[_a19] = true;
this.originalMessage = originalMessage;
}
static isInstance(error) {
return AISDKError20.hasMarker(error, marker19);
}
};
_a19 = symbol19;
// src/error/index.ts
import { DownloadError } from "@ai-sdk/provider-utils";
// src/util/retry-error.ts
import { AISDKError as AISDKError21 } from "@ai-sdk/provider";
var name20 = "AI_RetryError";
var marker20 = `vercel.ai.error.${name20}`;
var symbol20 = Symbol.for(marker20);
var _a20;
var RetryError = class extends AISDKError21 {
constructor({
message,
reason,
errors
}) {
super({ name: name20, message });
this[_a20] = true;
this.reason = reason;
this.errors = errors;
this.lastError = errors[errors.length - 1];
}
static isInstance(error) {
return AISDKError21.hasMarker(error, marker20);
}
};
_a20 = symbol20;
// src/logger/log-warnings.ts
function formatWarning({
warning,
provider,
model
}) {
const scope = provider != null && model != null ? ` (${provider} / ${model})` : "";
const prefix = `AI SDK Warning${scope}:`;
switch (warning.type) {
case "unsupported": {
let message = `${prefix} The feature "${warning.feature}" is not supported.`;
if (warning.details) {
message += ` ${warning.details}`;
}
return message;
}
case "compatibility": {
let message = `${prefix} The feature "${warning.feature}" is used in a compatibility mode.`;
if (warning.details) {
message += ` ${warning.details}`;
}
return message;
}
case "deprecated": {
return `${prefix} Deprecated: "${warning.setting}". ${warning.message}`;
}
case "other": {
return `${prefix} ${warning.message}`;
}
default: {
return `${prefix} ${JSON.stringify(warning, null, 2)}`;
}
}
}
var FIRST_WARNING_INFO_MESSAGE = "AI SDK Warning System: To turn off warning logging, set the AI_SDK_LOG_WARNINGS global to false.";
var hasLoggedBefore = false;
var logWarnings = (options) => {
if (options.warnings.length === 0) {
return;
}
const logger = globalThis.AI_SDK_LOG_WARNINGS;
if (logger === false) {
return;
}
if (typeof logger === "function") {
logger(options);
return;
}
if (!hasLoggedBefore) {
hasLoggedBefore = true;
console.info(FIRST_WARNING_INFO_MESSAGE);
}
for (const warning of options.warnings) {
const message = formatWarning({
warning,
provider: options.provider,
model: options.model
});
if (typeof process !== "undefined" && typeof process.emitWarning === "function") {
process.emitWarning(message, {
type: warning.type === "deprecated" ? "DeprecationWarning" : "Warning"
});
} else {
console.warn(message);
}
}
};
// src/model/resolve-model.ts
import { gateway } from "@ai-sdk/gateway";
// src/util/log-v2-compatibility-warning.ts
function logV2CompatibilityWarning({
provider,
modelId
}) {
logWarnings({
warnings: [
{
type: "compatibility",
feature: "specificationVersion",
details: `Using v2 specification compatibility mode. Some features may not be available.`
}
],
provider,
model: modelId
});
}
// src/model/as-embedding-model-v3.ts
function asEmbeddingModelV3(model) {
if (model.specificationVersion === "v3") {
return model;
}
logV2CompatibilityWarning({
provider: model.provider,
modelId: model.modelId
});
return new Proxy(model, {
get(target, prop) {
if (prop === "specificationVersion")
return "v3";
return target[prop];
}
});
}
// src/model/as-embedding-model-v4.ts
function asEmbeddingModelV4(model) {
if (model.specificationVersion === "v4") {
return model;
}
const v3Model = model.specificationVersion === "v2" ? asEmbeddingModelV3(model) : model;
return new Proxy(v3Model, {
get(target, prop) {
if (prop === "specificationVersion")
return "v4";
return target[prop];
}
});
}
// src/model/as-image-model-v3.ts
function asImageModelV3(model) {
if (model.specificationVersion === "v3") {
return model;
}
logV2CompatibilityWarning({
provider: model.provider,
modelId: model.modelId
});
return new Proxy(model, {
get(target, prop) {
if (prop === "specificationVersion")
return "v3";
return target[prop];
}
});
}
// src/model/as-image-model-v4.ts
function asImageModelV4(model) {
if (model.specificationVersion === "v4") {
return model;
}
const v3Model = model.specificationVersion === "v2" ? asImageModelV3(model) : model;
return new Proxy(v3Model, {
get(target, prop) {
if (prop === "specificationVersion")
return "v4";
return target[prop];
}
});
}
// src/model/as-language-model-v3.ts
function asLanguageModelV3(model) {
if (model.specificationVersion === "v3") {
return model;
}
logV2CompatibilityWarning({
provider: model.provider,
modelId: model.modelId
});
return new Proxy(model, {
get(target, prop) {
switch (prop) {
case "specificationVersion":
return "v3";
case "doGenerate":
return async (...args) => {
const result = await target.doGenerate(...args);
return {
...result,
finishReason: convertV2FinishReasonToV3(result.finishReason),
usage: convertV2UsageToV3(result.usage)
};
};
case "doStream":
return async (...args) => {
const result = await target.doStream(...args);
return {
...result,
stream: convertV2StreamToV3(result.stream)
};
};
default:
return target[prop];
}
}
});
}
function convertV2StreamToV3(stream) {
return stream.pipeThrough(
new TransformStream({
transform(chunk, controller) {
switch (chunk.type) {
case "finish":
controller.enqueue({
...chunk,
finishReason: convertV2FinishReasonToV3(chunk.finishReason),
usage: convertV2UsageToV3(chunk.usage)
});
break;
default:
controller.enqueue(chunk);
break;
}
}
})
);
}
function convertV2FinishReasonToV3(finishReason) {
return {
unified: finishReason === "unknown" ? "other" : finishReason,
raw: void 0
};
}
function convertV2UsageToV3(usage) {
return {
inputTokens: {
total: usage.inputTokens,
noCache: void 0,
cacheRead: usage.cachedInputTokens,
cacheWrite: void 0
},
outputTokens: {
total: usage.outputTokens,
text: void 0,
reasoning: usage.reasoningTokens
}
};
}
// src/model/as-language-model-v4.ts
function asLanguageModelV4(model) {
if (model.specificationVersion === "v4") {
return model;
}
const v3Model = model.specificationVersion === "v2" ? asLanguageModelV3(model) : model;
return new Proxy(v3Model, {
get(target, prop) {
if (prop === "specificationVersion")
return "v4";
return target[prop];
}
});
}
// src/model/as-reranking-model-v4.ts
function asRerankingModelV4(model) {
if (model.specificationVersion === "v4") {
return model;
}
return new Proxy(model, {
get(target, prop) {
if (prop === "specificationVersion")
return "v4";
return target[prop];
}
});
}
// src/model/as-speech-model-v3.ts
function asSpeechModelV3(model) {
if (model.specificationVersion === "v3") {
return model;
}
logV2CompatibilityWarning({
provider: model.provider,
modelId: model.modelId
});
return new Proxy(model, {
get(target, prop) {
if (prop === "specificationVersion")
return "v3";
return target[prop];
}
});
}
// src/model/as-speech-model-v4.ts
function asSpeechModelV4(model) {
if (model.specificationVersion === "v4") {
return model;
}
const v3Model = model.specificationVersion === "v2" ? asSpeechModelV3(model) : model;
return new Proxy(v3Model, {
get(target, prop) {
if (prop === "specificationVersion")
return "v4";
return target[prop];
}
});
}
// src/model/as-transcription-model-v3.ts
function asTranscriptionModelV3(model) {
if (model.specificationVersion === "v3") {
return model;
}
logV2CompatibilityWarning({
provider: model.provider,
modelId: model.modelId
});
return new Proxy(model, {
get(target, prop) {
if (prop === "specificationVersion")
return "v3";
return target[prop];
}
});
}
// src/model/as-transcription-model-v4.ts
function asTranscriptionModelV4(model) {
if (model.specificationVersion === "v4") {
return model;
}
const v3Model = model.specificationVersion === "v2" ? asTranscriptionModelV3(model) : model;
return new Proxy(v3Model, {
get(target, prop) {
if (prop === "specificationVersion")
return "v4";
return target[prop];
}
});
}
// src/model/as-video-model-v4.ts
function asVideoModelV4(model) {
if (model.specificationVersion === "v4") {
return model;
}
return new Proxy(model, {
get(target, prop) {
if (prop === "specificationVersion")
return "v4";
return target[prop];
}
});
}
// src/model/as-provider-v3.ts
function asProviderV3(provider) {
if ("specificationVersion" in provider && provider.specificationVersion === "v3") {
return provider;
}
const v2Provider = provider;
return {
specificationVersion: "v3",
languageModel: (modelId) => asLanguageModelV3(v2Provider.languageModel(modelId)),
embeddingModel: (modelId) => asEmbeddingModelV3(v2Provider.textEmbeddingModel(modelId)),
imageModel: (modelId) => asImageModelV3(v2Provider.imageModel(modelId)),
transcriptionModel: v2Provider.transcriptionModel ? (modelId) => asTranscriptionModelV3(v2Provider.transcriptionModel(modelId)) : void 0,
speechModel: v2Provider.speechModel ? (modelId) => asSpeechModelV3(v2Provider.speechModel(modelId)) : void 0,
rerankingModel: void 0
// v2 providers don't have reranking models
};
}
// src/model/as-provider-v4.ts
function asProviderV4(provider) {
if ("specificationVersion" in provider && provider.specificationVersion === "v4") {
return provider;
}
const v3Provider = !("specificationVersion" in provider) || provider.specificationVersion !== "v3" ? asProviderV3(provider) : provider;
return {
specificationVersion: "v4",
languageModel: (modelId) => asLanguageModelV4(v3Provider.languageModel(modelId)),
embeddingModel: (modelId) => asEmbeddingModelV4(v3Provider.embeddingModel(modelId)),
imageModel: (modelId) => asImageModelV4(v3Provider.imageModel(modelId)),
transcriptionModel: v3Provider.transcriptionModel ? (modelId) => asTranscriptionModelV4(v3Provider.transcriptionModel(modelId)) : void 0,
speechModel: v3Provider.speechModel ? (modelId) => asSpeechModelV4(v3Provider.speechModel(modelId)) : void 0,
rerankingModel: v3Provider.rerankingModel ? (modelId) => asRerankingModelV4(v3Provider.rerankingModel(modelId)) : void 0
};
}
// src/model/resolve-model.ts
function resolveLanguageModel(model) {
if (typeof model === "string") {
return getGlobalProvider().languageModel(model);
}
if (!["v4", "v3", "v2"].includes(model.specificationVersion)) {
const unsupportedModel = model;
throw new UnsupportedModelVersionError({
version: unsupportedModel.specificationVersion,
provider: unsupportedModel.provider,
modelId: unsupportedModel.modelId
});
}
return asLanguageModelV4(model);
}
function resolveEmbeddingModel(model) {
if (typeof model === "string") {
return getGlobalProvider().embeddingModel(model);
}
if (!["v4", "v3", "v2"].includes(model.specificationVersion)) {
const unsupportedModel = model;
throw new UnsupportedModelVersionError({
version: unsupportedModel.specificationVersion,
provider: unsupportedModel.provider,
modelId: unsupportedModel.modelId
});
}
return asEmbeddingModelV4(model);
}
function resolveTranscriptionModel(model) {
var _a22, _b;
if (typeof model === "string") {
return (_b = (_a22 = getGlobalProvider()).transcriptionModel) == null ? void 0 : _b.call(_a22, model);
}
if (!["v4", "v3", "v2"].includes(model.specificationVersion)) {
const unsupportedModel = model;
throw new UnsupportedModelVersionError({
version: unsupportedModel.specificationVersion,
provider: unsupportedModel.provider,
modelId: unsupportedModel.modelId
});
}
return asTranscriptionModelV4(model);
}
function resolveSpeechModel(model) {
var _a22, _b;
if (typeof model === "string") {
return (_b = (_a22 = getGlobalProvider()).speechModel) == null ? void 0 : _b.call(_a22, model);
}
if (!["v4", "v3", "v2"].includes(model.specificationVersion)) {
const unsupportedModel = model;
throw new UnsupportedModelVersionError({
version: unsupportedModel.specificationVersion,
provider: unsupportedModel.provider,
modelId: unsupportedModel.modelId
});
}
return asSpeechModelV4(model);
}
function resolveImageModel(model) {
if (typeof model === "string") {
return getGlobalProvider().imageModel(model);
}
if (!["v4", "v3", "v2"].includes(model.specificationVersion)) {
const unsupportedModel = model;
throw new UnsupportedModelVersionError({
version: unsupportedModel.specificationVersion,
provider: unsupportedModel.provider,
modelId: unsupportedModel.modelId
});
}
return asImageModelV4(model);
}
function resolveVideoModel(model) {
var _a22;
if (typeof model === "string") {
const provider = (_a22 = globalThis.AI_SDK_DEFAULT_PROVIDER) != null ? _a22 : gateway;
const videoModel = provider.videoModel;
if (!videoModel) {
throw new Error(
'The default provider does not support video models. Please use a Experimental_VideoModelV4 object from a provider (e.g., vertex.video("model-id")).'
);
}
return videoModel(model);
}
if (!["v4", "v3"].includes(model.specificationVersion)) {
const unsupportedModel = model;
throw new UnsupportedModelVersionError({
version: unsupportedModel.specificationVersion,
provider: unsupportedModel.provider,
modelId: unsupportedModel.modelId
});
}
return asVideoModelV4(model);
}
function resolveRerankingModel(model) {
if (typeof model === "string") {
const provider = getGlobalProvider();
const rerankingModel = provider.rerankingModel;
if (!rerankingModel) {
throw new Error(
'The default provider does not support reranking models. Please use a RerankingModel object from a provider (e.g., gateway.rerankingModel("model-id")).'
);
}
return rerankingModel(model);
}
if (model.specificationVersion !== "v4" && model.specificationVersion !== "v3") {
const unsupportedModel = model;
throw new UnsupportedModelVersionError({
version: unsupportedModel.specificationVersion,
provider: unsupportedModel.provider,
modelId: unsupportedModel.modelId
});
}
return asRerankingModelV4(model);
}
function getGlobalProvider() {
var _a22;
const provider = (_a22 = globalThis.AI_SDK_DEFAULT_PROVIDER) != null ? _a22 : gateway;
return asProviderV4(provider);
}
// src/prompt/clone-model-message.ts
function cloneModelMessages(messages) {
return messages.map((message) => cloneValue(message));
}
function cloneValue(value) {
if (value instanceof URL) {
return new URL(value.href);
}
if (Array.isArray(value)) {
return value.map((item) => cloneValue(item));
}
if (value instanceof Uint8Array) {
return new Uint8Array(value);
}
if (value instanceof ArrayBuffer) {
return value.slice(0);
}
if (value instanceof Date) {
return new Date(value);
}
if (value != null && typeof value === "object") {
return Object.fromEntries(
Object.entries(value).map(([key, value2]) => [key, cloneValue(value2)])
);
}
return value;
}
// src/prompt/convert-to-language-model-prompt.ts
import {
asArray,
detectMediaType,
isFullMediaType,
isUrlSupported
} from "@ai-sdk/provider-utils";
// src/util/download/download.ts
import {
cancelResponseBody,
DownloadError as DownloadError2,
readResponseWithSizeLimit,
DEFAULT_MAX_DOWNLOAD_SIZE,
fetchWithValidatedRedirects,
withUserAgentSuffix,
getRuntimeEnvironmentUserAgent
} from "@ai-sdk/provider-utils";
// src/version.ts
var VERSION = true ? "7.0.22" : "0.0.0-test";
// src/util/download/download.ts
var download = async ({
url,
maxBytes,
abortSignal
}) => {
var _a22;
const urlText = url.toString();
try {
const headers = withUserAgentSuffix(
{},
`ai-sdk/${VERSION}`,
getRuntimeEnvironmentUserAgent()
);
const response = await fetchWithValidatedRedirects({
url: urlText,
headers,
abortSignal
});
if (!response.ok) {
await cancelResponseBody(response);
throw new DownloadError2({
url: urlText,
statusCode: response.status,
statusText: response.statusText
});
}
const data = await readResponseWithSizeLimit({
response,
url: urlText,
maxBytes: maxBytes != null ? maxBytes : DEFAULT_MAX_DOWNLOAD_SIZE
});
return {
data,
mediaType: (_a22 = response.headers.get("content-type")) != null ? _a22 : void 0
};
} catch (error) {
if (DownloadError2.isInstance(error)) {
throw error;
}
throw new DownloadError2({ url: urlText, cause: error });
}
};
// src/util/download/download-function.ts
var createDefaultDownloadFunction = (download2 = download) => (requestedDownloads) => Promise.all(
requestedDownloads.map(
async (requestedDownload) => requestedDownload.isUrlSupportedByModel ? null : await download2(requestedDownload)
)
);
// src/prompt/file-part-data.ts
import {
isBuffer,
isProviderReference
} from "@ai-sdk/provider-utils";
// src/prompt/split-data-url.ts
function splitDataUrl(dataUrl) {
try {
const [header, base64Content] = dataUrl.split(",");
return {
mediaType: header.split(";")[0].split(":")[1],
base64Content
};
} catch (e) {
return {
mediaType: void 0,
base64Content: void 0
};
}
}
// src/prompt/file-part-data.ts
function isTaggedFileData(value) {
if (typeof value !== "object" || value === null)
return false;
const type = value.type;
return type === "data" || type === "url" || type === "reference" || type === "text";
}
function convertUrlToFilePartData(url) {
if (url.protocol === "data:") {
const { mediaType, base64Content } = splitDataUrl(url.toString());
if (mediaType == null || base64Content == null) {
throw new InvalidDataContentError({
content: url,
message: `Invalid data URL format in content ${url.toString()}`
});
}
return { data: { type: "data", data: base64Content }, mediaType };
}
return { data: { type: "url", url }, mediaType: void 0 };
}
function convertInlineDataToFilePartData(content) {
if (content instanceof Uint8Array) {
return { data: { type: "data", data: content }, mediaType: void 0 };
}
if (content instanceof ArrayBuffer) {
return {
data: { type: "data", data: new Uint8Array(content) },
mediaType: void 0
};
}
if (isBuffer(content)) {
return {
data: { type: "data", data: new Uint8Array(content) },
mediaType: void 0
};
}
return {
data: { type: "data", data: content },
mediaType: void 0
};
}
function convertToLanguageModelV4FilePart(content) {
if (isTaggedFileData(content)) {
switch (content.type) {
case "data":
if (typeof content.data === "string" && content.data.startsWith("data:")) {
throw new InvalidDataContentError({
content: content.data,
message: 'Data URLs are not valid inline data. Pass them as { type: "url", url } instead.'
});
}
return convertInlineDataToFilePartData(content.data);
case "url":
return convertUrlToFilePartData(content.url);
case "reference":
return {
data: { type: "reference", reference: content.reference },
mediaType: void 0
};
case "text":
return {
data: { type: "text", text: content.text },
mediaType: void 0
};
}
}
if (content instanceof URL) {
return convertUrlToFilePartData(content);
}
if (typeof content === "string") {
try {
return convertUrlToFilePartData(new URL(content));
} catch (e) {
return convertInlineDataToFilePartData(content);
}
}
if (isProviderReference(content)) {
return {
data: { type: "reference", reference: content },
mediaType: void 0
};
}
return convertInlineDataToFilePartData(content);
}
// src/prompt/convert-to-language-model-prompt.ts
async function convertToLanguageModelPrompt({
prompt,
supportedUrls,
download: download2 = createDefaultDownloadFunction(),
// `provider` is only needed here to convert legacy tool output types via `mapToolResultOutput`.
// TODO: remove in v8 when "file-id" and "image-file-id" types are removed
provider
}) {
const downloadedAssets = await downloadAssets(
prompt.messages,
download2,
supportedUrls
);
const approvalIdToToolCallId = /* @__PURE__ */ new Map();
for (const message of prompt.messages) {
if (message.role === "assistant" && Array.isArray(message.content)) {
for (const part of message.content) {
if (part.type === "tool-approval-request" && "approvalId" in part && "toolCallId" in part) {
approvalIdToToolCallId.set(
part.approvalId,
part.toolCallId
);
}
}
}
}
const approvedToolCallIds = /* @__PURE__ */ new Set();
for (const message of prompt.messages) {
if (message.role === "tool") {
for (const part of message.content) {
if (part.type === "tool-approval-response") {
const toolCallId = approvalIdToToolCallId.get(part.approvalId);
if (toolCallId) {
approvedToolCallIds.add(toolCallId);
}
}
}
}
}
const messages = [
...prompt.instructions != null ? typeof prompt.instructions === "string" ? [{ role: "system", content: prompt.instructions }] : asArray(prompt.instructions).map((message) => ({
role: "system",
content: message.content,
providerOptions: message.providerOptions
})) : [],
...prompt.messages.map(
(message) => convertToLanguageModelMessage({ message, downloadedAssets, provider })
)
];
const combinedMessages = [];
for (const message of messages) {
if (message.role !== "tool") {
combinedMessages.push(message);
continue;
}
const lastCombinedMessage = combinedMessages.at(-1);
if ((lastCombinedMessage == null ? void 0 : lastCombinedMessage.role) === "tool") {
lastCombinedMessage.content.push(...message.content);
} else {
combinedMessages.push(message);
}
}
const toolCallIds = /* @__PURE__ */ new Set();
for (const message of combinedMessages) {
switch (message.role) {
case "assistant": {
for (const content of message.content) {
if (content.type === "tool-call" && !content.providerExecuted) {
toolCallIds.add(content.toolCallId);
}
}
break;
}
case "tool": {
for (const content of message.content) {
if (content.type === "tool-result") {
toolCallIds.delete(content.toolCallId);
}
}
break;
}
case "user":
case "system":
for (const id of approvedToolCallIds) {
toolCallIds.delete(id);
}
if (toolCallIds.size > 0) {
throw new MissingToolResultsError({
toolCallIds: Array.from(toolCallIds)
});
}
break;
}
}
for (const id of approvedToolCallIds) {
toolCallIds.delete(id);
}
if (toolCallIds.size > 0) {
throw new MissingToolResultsError({ toolCallIds: Array.from(toolCallIds) });
}
return combinedMessages.filter(
// Filter out empty tool messages (e.g. if they only contained
// tool-approval-response parts that were removed).
// This prevents sending invalid empty messages to the provider.
// Note: provider-executed tool-approval-response parts are preserved.
(message) => message.role !== "tool" || message.content.length > 0
);
}
function convertToLanguageModelMessage({
message,
downloadedAssets,
// `provider` is only needed here to convert legacy tool output types via `mapToolResultOutput`.
// TODO: remove in v8 when "file-id" and "image-file-id" types are removed
provider
}) {
const warnings = [];
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
};
}
const converted = {
role: "user",
content: message.content.map((part) => {
if (part.type === "image") {
warnings.push({
type: "deprecated",
setting: '"image" content part',
message: `The "image" content part type is deprecated. Use a "file" part with mediaType: 'image' (or a more specific image/* subtype) instead.`
});
}
return convertImagePartToFilePart(part);
}).map((part) => convertPartToLanguageModelPart(part, downloadedAssets)).filter((part) => part.type !== "text" || part.text !== ""),
providerOptions: message.providerOptions
};
if (warnings.length > 0) {
logWarnings({ warnings });
}
return converted;
}
case "assistant": {
if (typeof message.content === "string") {
return {
role: "assistant",
content: [{ type: "text", text: message.content }],
providerOptions: message.providerOptions
};
}
const converted = {
role: "assistant",
content: message.content.filter(
// remove empty text parts (no text, and no provider options):
(part) => part.type !== "text" || part.text !== "" || part.providerOptions != null
).filter(
(part) => part.type !== "tool-approval-request"
).map((part) => {
const providerOptions = part.providerOptions;
switch (part.type) {
case "custom": {
return {
type: "custom",
kind: part.kind,
providerOptions
};
}
case "file": {
const { data, mediaType } = convertToLanguageModelV4FilePart(
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 "reasoning-file": {
const { data, mediaType } = convertToLanguageModelV4FilePart(
part.data
);
if (data.type !== "data" && data.type !== "url") {
throw new Error(
`Unsupported reasoning-file data type: ${data.type}`
);
}
return {
type: "reasoning-file",
data,
mediaType: mediaType != null ? mediaType : part.mediaType,
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: mapToolResultOutput({
output: part.output,
provider,
warnings,
downloadedAssets
}),
providerOptions
};
}
}
}),
providerOptions: message.providerOptions
};
if (warnings.length > 0) {
logWarnings({ warnings });
}
return converted;
}
case "tool": {
const converted = {
role: "tool",
content: message.content.filter(
// Only include tool-approval-response for provider-executed tools
(part) => part.type !== "tool-approval-response" || part.providerExecuted
).map((part) => {
switch (part.type) {
case "tool-result": {
return {
type: "tool-result",
toolCallId: part.toolCallId,
toolName: part.toolName,
output: mapToolResultOutput({
output: part.output,
provider,
warnings,
downloadedAssets
}),
providerOptions: part.providerOptions
};
}
case "tool-approval-response": {
return {
type: "tool-approval-response",
approvalId: part.approvalId,
approved: part.approved,
reason: part.reason
};
}
}
}),
providerOptions: message.providerOptions
};
if (warnings.length > 0) {
logWarnings({ warnings });
}
return converted;
}
default: {
const _exhaustiveCheck = role;
throw new InvalidMessageRoleError({ role: _exhaustiveCheck });
}
}
}
function convertImagePartToFilePart(part) {
var _a22;
if (part.type !== "image") {
return part;
}
return {
type: "file",
data: part.image,
mediaType: (_a22 = part.mediaType) != null ? _a22 : "image",
providerOptions: part.providerOptions
};
}
async function downloadAssets(messages, download2, supportedUrls) {
const downloadableFiles = [];
for (const message of messages) {
if (message.role === "user" && Array.isArray(message.content)) {
for (const part of message.content) {
const filePart = convertImagePartToFilePart(part);
if (filePart.type === "file") {
downloadableFiles.push(filePart);
}
}
}
if (message.role === "tool") {
for (const part of message.content) {
if (part.type !== "tool-result") {
continue;
}
if (part.output.type !== "content") {
continue;
}
for (const contentPart of part.output.value) {
if (contentPart.type === "file") {
downloadableFiles.push(contentPart);
}
}
}
}
if (message.role === "assistant" && Array.isArray(message.content)) {
for (const part of message.content) {
if (part.type !== "tool-result") {
continue;
}
if (part.output.type !== "content") {
continue;
}
for (const contentPart of part.output.value) {
if (contentPart.type === "file") {
downloadableFiles.push(contentPart);
}
}
}
}
}
const plannedDownloads = downloadableFiles.map((part) => {
const mediaType = part.mediaType;
const { data } = convertToLanguageModelV4FilePart(part.data);
return { mediaType, data };
}).filter((part) => part.data.type === "url").map((part) => ({
url: part.data.url,
isUrlSupportedByModel: part.mediaType != null && isUrlSupported({
url: part.data.url.toString(),
mediaType: part.mediaType,
supportedUrls
})
}));
const downloadedFiles = await download2(plannedDownloads);
return Object.fromEntries(
downloadedFiles.map(
(file, index) => file == null ? null : [
plannedDownloads[index].url.toString(),
{ data: file.data, mediaType: file.mediaType }
]
).filter((file) => file != null)
);
}
function convertPartToLanguageModelPart(part, downloadedAssets) {
if (part.type === "text") {
return {
type: "text",
text: part.text,
providerOptions: part.providerOptions
};
}
const { data: normalizedData, mediaType: dataUrlMediaType } = convertToLanguageModelV4FilePart(part.data);
let mediaType = dataUrlMediaType != null ? dataUrlMediaType : part.mediaType;
let data = normalizedData;
if (data.type === "url") {
const downloadedFile = downloadedAssets[data.url.toString()];
if (downloadedFile) {
data = { type: "data", data: downloadedFile.data };
if (downloadedFile.mediaType != null && (mediaType == null || !isFullMediaType(mediaType))) {
mediaType = downloadedFile.mediaType;
}
}
}
if (data.type === "data" && (data.data instanceof Uint8Array || typeof data.data === "string")) {
const imageMediaType = detectMediaType({
data: data.data,
topLevelType: "image"
});
if (imageMediaType != null) {
mediaType = imageMediaType;
}
}
if (mediaType == null) {
throw new Error(`Media type is missing for file part`);
}
return {
type: "file",
mediaType,
filename: part.filename,
data,
providerOptions: part.providerOptions
};
}
function mapToolResultOutput({
output,
// `provider` is only needed here to convert legacy "file-id" and "image-file-id" types to provider references, in case they are using string ID values.
// TODO: remove in v8 when "file-id" and "image-file-id" types are removed
provider,
warnings = [],
downloadedAssets
}) {
if (output.type !== "content") {
return output;
}
return {
type: "content",
value: output.value.map((item) => {
var _a22;
switch (item.type) {
case "file": {
const convertedPart = convertPartToLanguageModelPart(
item,
downloadedAssets
);
if (convertedPart.type !== "file") {
throw new Error(
"Expected tool result file content to convert to file."
);
}
return convertedPart;
}
case "file-data": {
warnings.push({
type: "deprecated",
setting: '"tool-result" content of type "file-data"',
message: `The "file-data" type for tool result content is deprecated. Use the "file" type with mediaType and { type: 'data', data } instead.`
});
return {
type: "file",
data: { type: "data", data: item.data },
filename: item.filename,
mediaType: