@ai-sdk/provider-utils
Version:
1,426 lines (1,369 loc) • 52.5 kB
text/typescript
import { LanguageModelV3FunctionTool, LanguageModelV3ProviderTool, ImageModelV3File, AISDKError, JSONSchema7, JSONParseError, TypeValidationError, JSONValue, APICallError, LanguageModelV3Prompt, SharedV3ProviderOptions, JSONObject, TypeValidationContext } from '@ai-sdk/provider';
import { StandardSchemaV1, StandardJSONSchemaV1 } from '@standard-schema/spec';
export * from '@standard-schema/spec';
import * as z3 from 'zod/v3';
import * as z4 from 'zod/v4';
export { EventSourceMessage, EventSourceParserStream } from 'eventsource-parser/stream';
declare function combineHeaders(...headers: Array<Record<string, string | undefined> | undefined>): Record<string, string | undefined>;
/**
* Converts an AsyncIterator to a ReadableStream.
*
* @template T - The type of elements produced by the AsyncIterator.
* @param { <T>} iterator - The AsyncIterator to convert.
* @returns {ReadableStream<T>} - A ReadableStream that provides the same data as the AsyncIterator.
*/
declare function convertAsyncIteratorToReadableStream<T>(iterator: AsyncIterator<T>): ReadableStream<T>;
/**
* Interface for mapping between custom tool names and provider tool names.
*/
interface ToolNameMapping {
/**
* Maps a custom tool name (used by the client) to the provider's tool name.
* If the custom tool name does not have a mapping, returns the input name.
*
* @param customToolName - The custom name of the tool defined by the client.
* @returns The corresponding provider tool name, or the input name if not mapped.
*/
toProviderToolName: (customToolName: string) => string;
/**
* Maps a provider tool name to the custom tool name used by the client.
* If the provider tool name does not have a mapping, returns the input name.
*
* @param providerToolName - The name of the tool as understood by the provider.
* @returns The corresponding custom tool name, or the input name if not mapped.
*/
toCustomToolName: (providerToolName: string) => string;
}
/**
* @param tools - Tools that were passed to the language model.
* @param providerToolNames - Maps the provider tool ids to the provider tool names.
*/
declare function createToolNameMapping({ tools, providerToolNames, resolveProviderToolName, }: {
/**
* Tools that were passed to the language model.
*/
tools: Array<LanguageModelV3FunctionTool | LanguageModelV3ProviderTool> | undefined;
/**
* Maps the provider tool ids to the provider tool names.
*/
providerToolNames: Record<`${string}.${string}`, string>;
/**
* Optional resolver for provider tool names that cannot be represented as
* static id -> name mappings (e.g. dynamic provider names).
*/
resolveProviderToolName?: (tool: LanguageModelV3ProviderTool) => string | undefined;
}): ToolNameMapping;
/**
* Creates a Promise that resolves after a specified delay
* @param delayInMs - The delay duration in milliseconds. If null or undefined, resolves immediately.
* @param signal - Optional AbortSignal to cancel the delay
* @returns A Promise that resolves after the specified delay
* @throws {DOMException} When the signal is aborted
*/
declare function delay(delayInMs?: number | null, options?: {
abortSignal?: AbortSignal;
}): Promise<void>;
/**
* Delayed promise. It is only constructed once the value is accessed.
* This is useful to avoid unhandled promise rejections when the promise is created
* but not accessed.
*/
declare class DelayedPromise<T> {
private status;
private _promise;
private _resolve;
private _reject;
get promise(): Promise<T>;
resolve(value: T): void;
reject(error: unknown): void;
isResolved(): boolean;
isRejected(): boolean;
isPending(): boolean;
}
/**
* Extracts the headers from a response object and returns them as a key-value object.
*
* @param response - The response object to extract headers from.
* @returns The headers as a key-value object.
*/
declare function extractResponseHeaders(response: Response): {
[k: string]: string;
};
/**
* Convert an ImageModelV3File to a URL or data URI string.
*
* If the file is a URL, it returns the URL as-is.
* If the file is base64 data, it returns a data URI with the base64 data.
* If the file is a Uint8Array, it converts it to base64 and returns a data URI.
*/
declare function convertImageModelFileToDataUri(file: ImageModelV3File): string;
/**
* Converts an input object to FormData for multipart/form-data requests.
*
* Handles the following cases:
* - `null` or `undefined` values are skipped
* - Arrays with a single element are appended as a single value
* - Arrays with multiple elements are appended with `[]` suffix (e.g., `image[]`)
* unless `useArrayBrackets` is set to `false`
* - All other values are appended directly
*
* @param input - The input object to convert. Use a generic type for type validation.
* @param options - Optional configuration object.
* @param options.useArrayBrackets - Whether to add `[]` suffix for multi-element arrays.
* Defaults to `true`. Set to `false` for APIs that expect repeated keys without brackets.
* @returns A FormData object containing the input values.
*
* @example
* ```ts
* type MyInput = {
* model: string;
* prompt: string;
* images: Blob[];
* };
*
* const formData = convertToFormData<MyInput>({
* model: 'gpt-image-1',
* prompt: 'A cat',
* images: [blob1, blob2],
* });
* ```
*/
declare function convertToFormData<T extends Record<string, unknown>>(input: T, options?: {
useArrayBrackets?: boolean;
}): FormData;
/**
* Download a file from a URL and return it as a Blob.
*
* @param url - The URL to download from.
* @param options - Optional settings for the download.
* @param options.maxBytes - Maximum allowed download size in bytes. Defaults to 100 MiB.
* @param options.abortSignal - An optional abort signal to cancel the download.
* @returns A Promise that resolves to the downloaded Blob.
*
* @throws DownloadError if the download fails or exceeds maxBytes.
*/
declare function downloadBlob(url: string, options?: {
maxBytes?: number;
abortSignal?: AbortSignal;
}): Promise<Blob>;
declare const symbol: unique symbol;
declare class DownloadError extends AISDKError {
private readonly [symbol];
readonly url: string;
readonly statusCode?: number;
readonly statusText?: string;
constructor({ url, statusCode, statusText, cause, message, }: {
url: string;
statusCode?: number;
statusText?: string;
message?: string;
cause?: unknown;
});
static isInstance(error: unknown): error is DownloadError;
}
/**
* Default maximum download size: 2 GiB.
*
* `fetch().arrayBuffer()` has ~2x peak memory overhead (undici buffers the
* body internally, then creates the JS ArrayBuffer), so very large downloads
* risk exceeding the default V8 heap limit on 64-bit systems and terminating
* the process with an out-of-memory error.
*
* Setting this limit converts an unrecoverable OOM crash into a catchable
* `DownloadError`.
*/
declare const DEFAULT_MAX_DOWNLOAD_SIZE: number;
/**
* Reads a fetch Response body with a size limit to prevent memory exhaustion.
*
* Checks the Content-Length header for early rejection, then reads the body
* incrementally via ReadableStream and aborts with a DownloadError when the
* limit is exceeded.
*
* @param response - The fetch Response to read.
* @param url - The URL being downloaded (used in error messages).
* @param maxBytes - Maximum allowed bytes. Defaults to DEFAULT_MAX_DOWNLOAD_SIZE.
* @returns A Uint8Array containing the response body.
* @throws DownloadError if the response exceeds maxBytes.
*/
declare function readResponseWithSizeLimit({ response, url, maxBytes, }: {
response: Response;
url: string;
maxBytes?: number;
}): Promise<Uint8Array>;
/**
* Fetch function type (standardizes the version of fetch used).
*/
type FetchFunction = typeof globalThis.fetch;
/**
* Creates an ID generator.
* The total length of the ID is the sum of the prefix, separator, and random part length.
* Not cryptographically secure.
*
* @param alphabet - The alphabet to use for the ID. Default: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.
* @param prefix - The prefix of the ID to generate. Optional.
* @param separator - The separator between the prefix and the random part of the ID. Default: '-'.
* @param size - The size of the random part of the ID to generate. Default: 16.
*/
declare const createIdGenerator: ({ prefix, size, alphabet, separator, }?: {
prefix?: string;
separator?: string;
size?: number;
alphabet?: string;
}) => IdGenerator;
/**
* A function that generates an ID.
*/
type IdGenerator = () => string;
/**
* Generates a 16-character random string to use for IDs.
* Not cryptographically secure.
*/
declare const generateId: IdGenerator;
declare function getErrorMessage(error: unknown | undefined): string;
/**
* Used to mark schemas so we can support both Zod and custom schemas.
*/
declare const schemaSymbol: unique symbol;
type ValidationResult<OBJECT> = {
success: true;
value: OBJECT;
} | {
success: false;
error: Error;
};
type Schema<OBJECT = unknown> = {
/**
* Used to mark schemas so we can support both Zod and custom schemas.
*/
[schemaSymbol]: true;
/**
* Schema type for inference.
*/
_type: OBJECT;
/**
* Optional. Validates that the structure of a value matches this schema,
* and returns a typed version of the value if it does.
*/
readonly validate?: (value: unknown) => ValidationResult<OBJECT> | PromiseLike<ValidationResult<OBJECT>>;
/**
* The JSON Schema for the schema. It is passed to the providers.
*/
readonly jsonSchema: JSONSchema7 | PromiseLike<JSONSchema7>;
};
/**
* Creates a schema with deferred creation.
* This is important to reduce the startup time of the library
* and to avoid initializing unused validators.
*
* @param createValidator A function that creates a schema.
* @returns A function that returns a schema.
*/
declare function lazySchema<SCHEMA>(createSchema: () => Schema<SCHEMA>): LazySchema<SCHEMA>;
type LazySchema<SCHEMA> = () => Schema<SCHEMA>;
type ZodSchema<SCHEMA = any> = z3.Schema<SCHEMA, z3.ZodTypeDef, any> | z4.core.$ZodType<SCHEMA, any>;
type StandardSchema<SCHEMA = any> = StandardSchemaV1<unknown, SCHEMA> & StandardJSONSchemaV1<unknown, SCHEMA>;
type FlexibleSchema<SCHEMA = any> = Schema<SCHEMA> | LazySchema<SCHEMA> | ZodSchema<SCHEMA> | StandardSchema<SCHEMA>;
type InferSchema<SCHEMA> = SCHEMA extends ZodSchema<infer T> ? T : SCHEMA extends StandardSchema<infer T> ? T : SCHEMA extends LazySchema<infer T> ? T : SCHEMA extends Schema<infer T> ? T : never;
/**
* Create a schema using a JSON Schema.
*
* @param jsonSchema The JSON Schema for the schema.
* @param options.validate Optional. A validation function for the schema.
*/
declare function jsonSchema<OBJECT = unknown>(jsonSchema: JSONSchema7 | PromiseLike<JSONSchema7> | (() => JSONSchema7 | PromiseLike<JSONSchema7>), { validate, }?: {
validate?: (value: unknown) => ValidationResult<OBJECT> | PromiseLike<ValidationResult<OBJECT>>;
}): Schema<OBJECT>;
declare function asSchema<OBJECT>(schema: FlexibleSchema<OBJECT> | undefined): Schema<OBJECT>;
declare function zodSchema<OBJECT>(zodSchema: z4.core.$ZodType<OBJECT, any> | z3.Schema<OBJECT, z3.ZodTypeDef, any>, options?: {
/**
* Enables support for references in the schema.
* This is required for recursive schemas, e.g. with `z.lazy`.
* However, not all language models and providers support such references.
* Defaults to `false`.
*/
useReferences?: boolean;
}): Schema<OBJECT>;
/**
* Parses a JSON string into an unknown object.
*
* @param text - The JSON string to parse.
* @returns {JSONValue} - The parsed JSON object.
*/
declare function parseJSON(options: {
text: string;
schema?: undefined;
}): Promise<JSONValue>;
/**
* Parses a JSON string into a strongly-typed object using the provided schema.
*
* @template T - The type of the object to parse the JSON into.
* @param {string} text - The JSON string to parse.
* @param {Validator<T>} schema - The schema to use for parsing the JSON.
* @returns {Promise<T>} - The parsed object.
*/
declare function parseJSON<T>(options: {
text: string;
schema: FlexibleSchema<T>;
}): Promise<T>;
type ParseResult<T> = {
success: true;
value: T;
rawValue: unknown;
} | {
success: false;
error: JSONParseError | TypeValidationError;
rawValue: unknown;
};
/**
* Safely parses a JSON string and returns the result as an object of type `unknown`.
*
* @param text - The JSON string to parse.
* @returns {Promise<object>} Either an object with `success: true` and the parsed data, or an object with `success: false` and the error that occurred.
*/
declare function safeParseJSON(options: {
text: string;
schema?: undefined;
}): Promise<ParseResult<JSONValue>>;
/**
* Safely parses a JSON string into a strongly-typed object, using a provided schema to validate the object.
*
* @template T - The type of the object to parse the JSON into.
* @param {string} text - The JSON string to parse.
* @param {Validator<T>} schema - The schema to use for parsing the JSON.
* @returns An object with either a `success` flag and the parsed and typed data, or a `success` flag and an error object.
*/
declare function safeParseJSON<T>(options: {
text: string;
schema: FlexibleSchema<T>;
}): Promise<ParseResult<T>>;
declare function isParsableJson(input: string): boolean;
type ResponseHandler<RETURN_TYPE> = (options: {
url: string;
requestBodyValues: unknown;
response: Response;
}) => PromiseLike<{
value: RETURN_TYPE;
rawValue?: unknown;
responseHeaders?: Record<string, string>;
}>;
declare const createJsonErrorResponseHandler: <T>({ errorSchema, errorToMessage, isRetryable, }: {
errorSchema: FlexibleSchema<T>;
errorToMessage: (error: T) => string;
isRetryable?: (response: Response, error?: T) => boolean;
}) => ResponseHandler<APICallError>;
declare const createEventSourceResponseHandler: <T>(chunkSchema: FlexibleSchema<T>) => ResponseHandler<ReadableStream<ParseResult<T>>>;
declare const createJsonResponseHandler: <T>(responseSchema: FlexibleSchema<T>) => ResponseHandler<T>;
declare const createBinaryResponseHandler: () => ResponseHandler<Uint8Array>;
declare const createStatusCodeErrorResponseHandler: () => ResponseHandler<APICallError>;
declare const getFromApi: <T>({ url, headers, successfulResponseHandler, failedResponseHandler, abortSignal, fetch, }: {
url: string;
headers?: Record<string, string | undefined>;
failedResponseHandler: ResponseHandler<Error>;
successfulResponseHandler: ResponseHandler<T>;
abortSignal?: AbortSignal;
fetch?: FetchFunction;
}) => Promise<{
value: T;
rawValue?: unknown;
responseHeaders?: Record<string, string>;
}>;
declare function getRuntimeEnvironmentUserAgent(globalThisAny?: any): string;
declare function injectJsonInstructionIntoMessages({ messages, schema, schemaPrefix, schemaSuffix, }: {
messages: LanguageModelV3Prompt;
schema?: JSONSchema7;
schemaPrefix?: string;
schemaSuffix?: string;
}): LanguageModelV3Prompt;
declare function isAbortError(error: unknown): error is Error;
/**
* Type guard that checks whether a value is not `null` or `undefined`.
*
* @template T - The type of the value to check.
* @param value - The value to check.
* @returns `true` if the value is neither `null` nor `undefined`, otherwise `false`.
*/
declare function isNonNullable<T>(value: T | undefined | null): value is NonNullable<T>;
/**
* Checks if the given URL is supported natively by the model.
*
* @param mediaType - The media type of the URL. Case-sensitive.
* @param url - The URL to check.
* @param supportedUrls - A record where keys are case-sensitive media types (or '*')
* and values are arrays of RegExp patterns for URLs.
*
* @returns `true` if the URL matches a pattern under the specific media type
* or the wildcard '*', `false` otherwise.
*/
declare function isUrlSupported({ mediaType, url, supportedUrls, }: {
mediaType: string;
url: string;
supportedUrls: Record<string, RegExp[]>;
}): boolean;
declare function loadApiKey({ apiKey, environmentVariableName, apiKeyParameterName, description, }: {
apiKey: string | undefined;
environmentVariableName: string;
apiKeyParameterName?: string;
description: string;
}): string;
/**
* Loads an optional `string` setting from the environment or a parameter.
*
* @param settingValue - The setting value.
* @param environmentVariableName - The environment variable name.
* @returns The setting value.
*/
declare function loadOptionalSetting({ settingValue, environmentVariableName, }: {
settingValue: string | undefined;
environmentVariableName: string;
}): string | undefined;
/**
* Loads a `string` setting from the environment or a parameter.
*
* @param settingValue - The setting value.
* @param environmentVariableName - The environment variable name.
* @param settingName - The setting name.
* @param description - The description of the setting.
* @returns The setting value.
*/
declare function loadSetting({ settingValue, environmentVariableName, settingName, description, }: {
settingValue: string | undefined;
environmentVariableName: string;
settingName: string;
description: string;
}): string;
type MaybePromiseLike<T> = T | PromiseLike<T>;
/**
* Maps a media type to its corresponding file extension.
* It was originally introduced to set a filename for audio file uploads
* in https://github.com/vercel/ai/pull/8159.
*
* @param mediaType The media type to map.
* @returns The corresponding file extension
* @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/MIME_types/Common_types
*/
declare function mediaTypeToExtension(mediaType: string): string;
/**
* Normalizes different header inputs into a plain record with lower-case keys.
* Entries with `undefined` or `null` values are removed.
*
* @param headers - Input headers (`Headers`, tuples array, plain record) to normalize.
* @returns A record containing the normalized header entries.
*/
declare function normalizeHeaders(headers: HeadersInit | Record<string, string | undefined> | Array<[string, string | undefined]> | undefined): Record<string, string>;
/**
* Parses a JSON event stream into a stream of parsed JSON objects.
*/
declare function parseJsonEventStream<T>({ stream, schema, }: {
stream: ReadableStream<Uint8Array>;
schema: FlexibleSchema<T>;
}): ReadableStream<ParseResult<T>>;
declare function parseProviderOptions<OPTIONS>({ provider, providerOptions, schema, }: {
provider: string;
providerOptions: Record<string, unknown> | undefined;
schema: FlexibleSchema<OPTIONS>;
}): Promise<OPTIONS | undefined>;
declare const postJsonToApi: <T>({ url, headers, body, failedResponseHandler, successfulResponseHandler, abortSignal, fetch, }: {
url: string;
headers?: Record<string, string | undefined>;
body: unknown;
failedResponseHandler: ResponseHandler<APICallError>;
successfulResponseHandler: ResponseHandler<T>;
abortSignal?: AbortSignal;
fetch?: FetchFunction;
}) => Promise<{
value: T;
rawValue?: unknown;
responseHeaders?: Record<string, string>;
}>;
declare const postFormDataToApi: <T>({ url, headers, formData, failedResponseHandler, successfulResponseHandler, abortSignal, fetch, }: {
url: string;
headers?: Record<string, string | undefined>;
formData: FormData;
failedResponseHandler: ResponseHandler<APICallError>;
successfulResponseHandler: ResponseHandler<T>;
abortSignal?: AbortSignal;
fetch?: FetchFunction;
}) => Promise<{
value: T;
rawValue?: unknown;
responseHeaders?: Record<string, string>;
}>;
declare const postToApi: <T>({ url, headers, body, successfulResponseHandler, failedResponseHandler, abortSignal, fetch, }: {
url: string;
headers?: Record<string, string | undefined>;
body: {
content: string | FormData | Uint8Array;
values: unknown;
};
failedResponseHandler: ResponseHandler<Error>;
successfulResponseHandler: ResponseHandler<T>;
abortSignal?: AbortSignal;
fetch?: FetchFunction;
}) => Promise<{
value: T;
rawValue?: unknown;
responseHeaders?: Record<string, string>;
}>;
/**
* Data content. Can either be a base64-encoded string, a Uint8Array, an ArrayBuffer, or a Buffer.
*/
type DataContent = string | Uint8Array | ArrayBuffer | Buffer;
/**
* Additional provider-specific options.
*
* They are passed through to the provider from the AI SDK and enable
* provider-specific functionality that can be fully encapsulated in the provider.
*/
type ProviderOptions = SharedV3ProviderOptions;
/**
* Text content part of a prompt. It contains a string of text.
*/
interface TextPart {
type: 'text';
/**
* The text content.
*/
text: string;
/**
* Additional provider-specific metadata. They are passed through
* to the provider from the AI SDK and enable provider-specific
* functionality that can be fully encapsulated in the provider.
*/
providerOptions?: ProviderOptions;
}
/**
* Image content part of a prompt. It contains an image.
*/
interface ImagePart {
type: 'image';
/**
* Image data. Can either be:
*
* - data: a base64-encoded string, a Uint8Array, an ArrayBuffer, or a Buffer
* - URL: a URL that points to the image
*/
image: DataContent | URL;
/**
* Optional IANA media type of the image.
*
* @see https://www.iana.org/assignments/media-types/media-types.xhtml
*/
mediaType?: string;
/**
* Additional provider-specific metadata. They are passed through
* to the provider from the AI SDK and enable provider-specific
* functionality that can be fully encapsulated in the provider.
*/
providerOptions?: ProviderOptions;
}
/**
* File content part of a prompt. It contains a file.
*/
interface FilePart {
type: 'file';
/**
* File data. Can either be:
*
* - data: a base64-encoded string, a Uint8Array, an ArrayBuffer, or a Buffer
* - URL: a URL that points to the image
*/
data: DataContent | URL;
/**
* Optional filename of the file.
*/
filename?: string;
/**
* IANA media type of the file.
*
* @see https://www.iana.org/assignments/media-types/media-types.xhtml
*/
mediaType: string;
/**
* Additional provider-specific metadata. They are passed through
* to the provider from the AI SDK and enable provider-specific
* functionality that can be fully encapsulated in the provider.
*/
providerOptions?: ProviderOptions;
}
/**
* Reasoning content part of a prompt. It contains a reasoning.
*/
interface ReasoningPart {
type: 'reasoning';
/**
* The reasoning text.
*/
text: string;
/**
* Additional provider-specific metadata. They are passed through
* to the provider from the AI SDK and enable provider-specific
* functionality that can be fully encapsulated in the provider.
*/
providerOptions?: ProviderOptions;
}
/**
* Tool call content part of a prompt. It contains a tool call (usually generated by the AI model).
*/
interface ToolCallPart {
type: 'tool-call';
/**
* ID of the tool call. This ID is used to match the tool call with the tool result.
*/
toolCallId: string;
/**
* Name of the tool that is being called.
*/
toolName: string;
/**
* Arguments of the tool call. This is a JSON-serializable object that matches the tool's input schema.
*/
input: unknown;
/**
* Additional provider-specific metadata. They are passed through
* to the provider from the AI SDK and enable provider-specific
* functionality that can be fully encapsulated in the provider.
*/
providerOptions?: ProviderOptions;
/**
* Whether the tool call was executed by the provider.
*/
providerExecuted?: boolean;
}
/**
* Tool result content part of a prompt. It contains the result of the tool call with the matching ID.
*/
interface ToolResultPart {
type: 'tool-result';
/**
* ID of the tool call that this result is associated with.
*/
toolCallId: string;
/**
* Name of the tool that generated this result.
*/
toolName: string;
/**
* Result of the tool call. This is a JSON-serializable object.
*/
output: ToolResultOutput;
/**
* Additional provider-specific metadata. They are passed through
* to the provider from the AI SDK and enable provider-specific
* functionality that can be fully encapsulated in the provider.
*/
providerOptions?: ProviderOptions;
}
/**
* Output of a tool result.
*/
type ToolResultOutput = {
/**
* Text tool output that should be directly sent to the API.
*/
type: 'text';
value: string;
/**
* Provider-specific options.
*/
providerOptions?: ProviderOptions;
} | {
type: 'json';
value: JSONValue;
/**
* Provider-specific options.
*/
providerOptions?: ProviderOptions;
} | {
/**
* Type when the user has denied the execution of the tool call.
*/
type: 'execution-denied';
/**
* Optional reason for the execution denial.
*/
reason?: string;
/**
* Provider-specific options.
*/
providerOptions?: ProviderOptions;
} | {
type: 'error-text';
value: string;
/**
* Provider-specific options.
*/
providerOptions?: ProviderOptions;
} | {
type: 'error-json';
value: JSONValue;
/**
* Provider-specific options.
*/
providerOptions?: ProviderOptions;
} | {
type: 'content';
value: Array<{
type: 'text';
/**
* Text content.
*/
text: string;
/**
* Provider-specific options.
*/
providerOptions?: ProviderOptions;
} | {
/**
* @deprecated Use image-data or file-data instead.
*/
type: 'media';
data: string;
mediaType: string;
} | {
type: 'file-data';
/**
* Base-64 encoded media data.
*/
data: string;
/**
* IANA media type.
* @see https://www.iana.org/assignments/media-types/media-types.xhtml
*/
mediaType: string;
/**
* Optional filename of the file.
*/
filename?: string;
/**
* Provider-specific options.
*/
providerOptions?: ProviderOptions;
} | {
type: 'file-url';
/**
* URL of the file.
*/
url: string;
/**
* Provider-specific options.
*/
providerOptions?: ProviderOptions;
} | {
type: 'file-id';
/**
* ID of the file.
*
* If you use multiple providers, you need to
* specify the provider specific ids using
* the Record option. The key is the provider
* name, e.g. 'openai' or 'anthropic'.
*/
fileId: string | Record<string, string>;
/**
* Provider-specific options.
*/
providerOptions?: ProviderOptions;
} | {
/**
* Images that are referenced using base64 encoded data.
*/
type: 'image-data';
/**
* Base-64 encoded image data.
*/
data: string;
/**
* IANA media type.
* @see https://www.iana.org/assignments/media-types/media-types.xhtml
*/
mediaType: string;
/**
* Provider-specific options.
*/
providerOptions?: ProviderOptions;
} | {
/**
* Images that are referenced using a URL.
*/
type: 'image-url';
/**
* URL of the image.
*/
url: string;
/**
* Provider-specific options.
*/
providerOptions?: ProviderOptions;
} | {
/**
* Images that are referenced using a provider file id.
*/
type: 'image-file-id';
/**
* Image that is referenced using a provider file id.
*
* If you use multiple providers, you need to
* specify the provider specific ids using
* the Record option. The key is the provider
* name, e.g. 'openai' or 'anthropic'.
*/
fileId: string | Record<string, string>;
/**
* Provider-specific options.
*/
providerOptions?: ProviderOptions;
} | {
/**
* Custom content part. This can be used to implement
* provider-specific content parts.
*/
type: 'custom';
/**
* Provider-specific options.
*/
providerOptions?: ProviderOptions;
}>;
};
/**
* Tool approval request prompt part.
*/
type ToolApprovalRequest = {
type: 'tool-approval-request';
/**
* ID of the tool approval.
*/
approvalId: string;
/**
* ID of the tool call that the approval request is for.
*/
toolCallId: string;
};
/**
* An assistant message. It can contain text, tool calls, or a combination of text and tool calls.
*/
type AssistantModelMessage = {
role: 'assistant';
content: AssistantContent;
/**
* Additional provider-specific metadata. They are passed through
* to the provider from the AI SDK and enable provider-specific
* functionality that can be fully encapsulated in the provider.
*/
providerOptions?: ProviderOptions;
};
/**
* Content of an assistant message.
* It can be a string or an array of text, image, reasoning, redacted reasoning, and tool call parts.
*/
type AssistantContent = string | Array<TextPart | FilePart | ReasoningPart | ToolCallPart | ToolResultPart | ToolApprovalRequest>;
/**
* A system message. It can contain system information.
*
* Note: using the "system" part of the prompt is strongly preferred
* to increase the resilience against prompt injection attacks,
* and because not all providers support several system messages.
*/
type SystemModelMessage = {
role: 'system';
content: string;
/**
* Additional provider-specific metadata. They are passed through
* to the provider from the AI SDK and enable provider-specific
* functionality that can be fully encapsulated in the provider.
*/
providerOptions?: ProviderOptions;
};
/**
* Tool approval response prompt part.
*/
type ToolApprovalResponse = {
type: 'tool-approval-response';
/**
* ID of the tool approval.
*/
approvalId: string;
/**
* Flag indicating whether the approval was granted or denied.
*/
approved: boolean;
/**
* Optional reason for the approval or denial.
*/
reason?: string;
/**
* Flag indicating whether the tool call is provider-executed.
* Only provider-executed tool approval responses should be sent to the model.
*/
providerExecuted?: boolean;
};
/**
* A tool message. It contains the result of one or more tool calls.
*/
type ToolModelMessage = {
role: 'tool';
content: ToolContent;
/**
* Additional provider-specific metadata. They are passed through
* to the provider from the AI SDK and enable provider-specific
* functionality that can be fully encapsulated in the provider.
*/
providerOptions?: ProviderOptions;
};
/**
* Content of a tool message. It is an array of tool result parts.
*/
type ToolContent = Array<ToolResultPart | ToolApprovalResponse>;
/**
* A user message. It can contain text or a combination of text and images.
*/
type UserModelMessage = {
role: 'user';
content: UserContent;
/**
* Additional provider-specific metadata. They are passed through
* to the provider from the AI SDK and enable provider-specific
* functionality that can be fully encapsulated in the provider.
*/
providerOptions?: ProviderOptions;
};
/**
* Content of a user message. It can be a string or an array of text and image parts.
*/
type UserContent = string | Array<TextPart | ImagePart | FilePart>;
/**
* A message that can be used in the `messages` field of a prompt.
* It can be a user message, an assistant message, or a tool message.
*/
type ModelMessage = SystemModelMessage | UserModelMessage | AssistantModelMessage | ToolModelMessage;
/**
* Additional options that are sent into each tool call.
*/
interface ToolExecutionOptions {
/**
* The ID of the tool call. You can use it e.g. when sending tool-call related information with stream data.
*/
toolCallId: string;
/**
* Messages that were sent to the language model to initiate the response that contained the tool call.
* The messages **do not** include the system prompt nor the assistant response that contained the tool call.
*/
messages: ModelMessage[];
/**
* An optional abort signal that indicates that the overall operation should be aborted.
*/
abortSignal?: AbortSignal;
/**
* User-defined context.
*
* Treat the context object as immutable inside tools.
* Mutating the context object can lead to race conditions and unexpected results
* when tools are called in parallel.
*
* If you need to mutate the context, analyze the tool calls and results
* in `prepareStep` and update it there.
*
* Experimental (can break in patch releases).
*/
experimental_context?: unknown;
}
/**
* Function that is called to determine if the tool needs approval before it can be executed.
*/
type ToolNeedsApprovalFunction<INPUT> = (input: INPUT, options: {
/**
* The ID of the tool call. You can use it e.g. when sending tool-call related information with stream data.
*/
toolCallId: string;
/**
* Messages that were sent to the language model to initiate the response that contained the tool call.
* The messages **do not** include the system prompt nor the assistant response that contained the tool call.
*/
messages: ModelMessage[];
/**
* Additional context.
*
* Experimental (can break in patch releases).
*/
experimental_context?: unknown;
}) => boolean | PromiseLike<boolean>;
type ToolExecuteFunction<INPUT, OUTPUT> = (input: INPUT, options: ToolExecutionOptions) => AsyncIterable<OUTPUT> | PromiseLike<OUTPUT> | OUTPUT;
type NeverOptional<N, T> = 0 extends 1 & N ? Partial<T> : [N] extends [never] ? Partial<Record<keyof T, undefined>> : T;
type ToolOutputProperties<INPUT, OUTPUT> = NeverOptional<OUTPUT, {
/**
* An async function that is called with the arguments from the tool call and produces a result.
* If not provided, the tool will not be executed automatically.
*
* @args is the input of the tool call.
* @options.abortSignal is a signal that can be used to abort the tool call.
*/
execute: ToolExecuteFunction<INPUT, OUTPUT>;
outputSchema?: FlexibleSchema<OUTPUT>;
} | {
outputSchema: FlexibleSchema<OUTPUT>;
execute?: never;
}>;
/**
* A tool contains the description and the schema of the input that the tool expects.
* This enables the language model to generate the input.
*
* The tool can also contain an optional execute function for the actual execution function of the tool.
*/
type Tool<INPUT extends JSONValue | unknown | never = any, OUTPUT extends JSONValue | unknown | never = any> = {
/**
* An optional description of what the tool does.
* Will be used by the language model to decide whether to use the tool.
* Not used for provider-defined tools.
*/
description?: string;
/**
* An optional title of the tool.
*/
title?: string;
/**
* Additional provider-specific metadata. They are passed through
* to the provider from the AI SDK and enable provider-specific
* functionality that can be fully encapsulated in the provider.
*/
providerOptions?: ProviderOptions;
/**
* Optional metadata about the tool itself (e.g. its source).
*
* Unlike `providerOptions`, this metadata is not sent to the language
* model. Instead, it is propagated onto the resulting tool call's
* `toolMetadata` so consumers can read it from tool call / result parts
* and UI message parts. This is useful for sources of dynamic tools (e.g.
* an MCP server) to identify themselves.
*/
metadata?: JSONObject;
/**
* The schema of the input that the tool expects.
* The language model will use this to generate the input.
* It is also used to validate the output of the language model.
*
* You can use descriptions on the schema properties to make the input understandable for the language model.
*/
inputSchema: FlexibleSchema<INPUT>;
/**
* An optional list of input examples that show the language
* model what the input should look like.
*/
inputExamples?: Array<{
input: NoInfer<INPUT>;
}>;
/**
* Whether the tool needs approval before it can be executed.
*/
needsApproval?: boolean | ToolNeedsApprovalFunction<[INPUT] extends [never] ? unknown : INPUT>;
/**
* Strict mode setting for the tool.
*
* Providers that support strict mode will use this setting to determine
* how the input should be generated. Strict mode will always produce
* valid inputs, but it might limit what input schemas are supported.
*/
strict?: boolean;
/**
* Optional function that is called when the argument streaming starts.
* Only called when the tool is used in a streaming context.
*/
onInputStart?: (options: ToolExecutionOptions) => void | PromiseLike<void>;
/**
* Optional function that is called when an argument streaming delta is available.
* Only called when the tool is used in a streaming context.
*/
onInputDelta?: (options: {
inputTextDelta: string;
} & ToolExecutionOptions) => void | PromiseLike<void>;
/**
* Optional function that is called when a tool call can be started,
* even if the execute function is not provided.
*/
onInputAvailable?: (options: {
input: [INPUT] extends [never] ? unknown : INPUT;
} & ToolExecutionOptions) => void | PromiseLike<void>;
} & ToolOutputProperties<INPUT, OUTPUT> & {
/**
* Optional conversion function that maps the tool result to an output that can be used by the language model.
*
* If not provided, the tool result will be sent as a JSON object.
*/
toModelOutput?: (options: {
/**
* The ID of the tool call. You can use it e.g. when sending tool-call related information with stream data.
*/
toolCallId: string;
/**
* The input of the tool call.
*/
input: [INPUT] extends [never] ? unknown : INPUT;
/**
* The output of the tool call.
*/
output: 0 extends 1 & OUTPUT ? any : [OUTPUT] extends [never] ? any : NoInfer<OUTPUT>;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>;
} & ({
/**
* Tool with user-defined input and output schemas.
*/
type?: undefined | 'function';
} | {
/**
* Tool that is defined at runtime (e.g. an MCP tool).
* The types of input and output are not known at development time.
*/
type: 'dynamic';
} | {
/**
* Tool with provider-defined input and output schemas.
*/
type: 'provider';
/**
* The ID of the tool. Must follow the format `<provider-name>.<unique-tool-name>`.
*/
id: `${string}.${string}`;
/**
* The arguments for configuring the tool. Must match the expected arguments defined by the provider for this tool.
*/
args: Record<string, unknown>;
/**
* Whether this provider-executed tool supports deferred results.
*
* When true, the tool result may not be returned in the same turn as the
* tool call (e.g., when using programmatic tool calling where a server tool
* triggers a client-executed tool, and the server tool's result is deferred
* until the client tool is resolved).
*
* This flag allows the AI SDK to handle tool results that arrive without
* a matching tool call in the current response.
*
* @default false
*/
supportsDeferredResults?: boolean;
});
/**
* Infer the input type of a tool.
*/
type InferToolInput<TOOL extends Tool> = TOOL extends Tool<infer INPUT, any> ? INPUT : never;
/**
* Infer the output type of a tool.
*/
type InferToolOutput<TOOL extends Tool> = TOOL extends Tool<any, infer OUTPUT> ? OUTPUT : never;
/**
* Helper function for inferring the execute args of a tool.
*/
declare function tool<INPUT, OUTPUT>(tool: Tool<INPUT, OUTPUT>): Tool<INPUT, OUTPUT>;
declare function tool<INPUT>(tool: Tool<INPUT, never>): Tool<INPUT, never>;
declare function tool<OUTPUT>(tool: Tool<never, OUTPUT>): Tool<never, OUTPUT>;
declare function tool(tool: Tool<never, never>): Tool<never, never>;
/**
* Defines a dynamic tool.
*/
declare function dynamicTool(tool: {
description?: string;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<unknown>;
execute: ToolExecuteFunction<unknown, unknown>;
/**
* Optional conversion function that maps the tool result to an output that can be used by the language model.
*
* If not provided, the tool result will be sent as a JSON object.
*/
toModelOutput?: (options: {
/**
* The ID of the tool call. You can use it e.g. when sending tool-call related information with stream data.
*/
toolCallId: string;
/**
* The input of the tool call.
*/
input: unknown;
/**
* The output of the tool call.
*/
output: unknown;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>;
/**
* Whether the tool needs approval before it can be executed.
*/
needsApproval?: boolean | ToolNeedsApprovalFunction<unknown>;
}): Tool<unknown, unknown> & {
type: 'dynamic';
};
type ProviderToolFactory<INPUT, ARGS extends object> = <OUTPUT>(options: ARGS & {
execute?: ToolExecuteFunction<INPUT, OUTPUT>;
needsApproval?: Tool<INPUT, OUTPUT>['needsApproval'];
toModelOutput?: Tool<INPUT, OUTPUT>['toModelOutput'];
onInputStart?: Tool<INPUT, OUTPUT>['onInputStart'];
onInputDelta?: Tool<INPUT, OUTPUT>['onInputDelta'];
onInputAvailable?: Tool<INPUT, OUTPUT>['onInputAvailable'];
}) => Tool<INPUT, OUTPUT>;
declare function createProviderToolFactory<INPUT, ARGS extends object>({ id, inputSchema, }: {
id: `${string}.${string}`;
inputSchema: FlexibleSchema<INPUT>;
}): ProviderToolFactory<INPUT, ARGS>;
type ProviderToolFactoryWithOutputSchema<INPUT, OUTPUT, ARGS extends object> = (options: ARGS & {
execute?: ToolExecuteFunction<INPUT, OUTPUT>;
needsApproval?: Tool<INPUT, OUTPUT>['needsApproval'];
toModelOutput?: Tool<INPUT, OUTPUT>['toModelOutput'];
onInputStart?: Tool<INPUT, OUTPUT>['onInputStart'];
onInputDelta?: Tool<INPUT, OUTPUT>['onInputDelta'];
onInputAvailable?: Tool<INPUT, OUTPUT>['onInputAvailable'];
}) => Tool<INPUT, OUTPUT>;
declare function createProviderToolFactoryWithOutputSchema<INPUT, OUTPUT, ARGS extends object>({ id, inputSchema, outputSchema, supportsDeferredResults, }: {
id: `${string}.${string}`;
inputSchema: FlexibleSchema<INPUT>;
outputSchema: FlexibleSchema<OUTPUT>;
/**
* Whether this provider-executed tool supports deferred results.
*
* When true, the tool result may not be returned in the same turn as the
* tool call (e.g., when using programmatic tool calling where a server tool
* triggers a client-executed tool, and the server tool's result is deferred
* until the client tool is resolved).
*
* @default false
*/
supportsDeferredResults?: boolean;
}): ProviderToolFactoryWithOutputSchema<INPUT, OUTPUT, ARGS>;
/**
* Removes entries from a record where the value is null or undefined.
* @param record - The input object whose entries may be null or undefined.
* @returns A new object containing only entries with non-null and non-undefined values.
*/
declare function removeUndefinedEntries<T>(record: Record<string, T | undefined>): Record<string, T>;
type Resolvable<T> = MaybePromiseLike<T> | (() => MaybePromiseLike<T>);
/**
* Resolves a value that could be a raw value, a Promise, a function returning a value,
* or a function returning a Promise.
*/
declare function resolve<T>(value: Resolvable<T>): Promise<T>;
/**
* Strips file extension segments from a filename.
*
* Examples:
* - "report.pdf" -> "report"
* - "archive.tar.gz" -> "archive"
* - "filename" -> "filename"
*/
declare function stripFileExtension(filename: string): string;
declare function convertBase64ToUint8Array(base64String: string): Uint8Array<ArrayBuffer>;
declare function convertUint8ArrayToBase64(array: Uint8Array): string;
declare function convertToBase64(value: string | Uint8Array): string;
/**
* Validates that a URL is safe to download from, blocking private/internal addresses
* to prevent SSRF attacks.
*
* @param url - The URL string to validate.
* @throws DownloadError if the URL is unsafe.
*/
declare function validateDownloadUrl(url: string): void;
/**
* Validates the types of an unknown object using a schema and
* return a strongly-typed object.
*
* @template T - The type of the object to validate.
* @param {string} options.value - The object to validate.
* @param {Validator<T>} options.schema - The schema to use for validating the JSON.
* @param {TypeValidationContext} options.context - Optional context about what is being validated.
* @returns {Promise<T>} - The typed object.
*/
declare function validateTypes<OBJECT>({ value, schema, context, }: {
value: unknown;
schema: FlexibleSchema<OBJECT>;
context?: TypeValidationContext;
}): Promise<OBJECT>;
/**
* Safely validates the types of an unknown object using a schema and
* return a strongly-typed object.
*
* @template T - The type of the object to validate.
* @param {string} options.value - The JSON object to validate.
* @param {Validator<T>} options.schema - The schema to use for validating the JSON.
* @param {TypeValidationContext} options.context - Optional context about what is being validated.
* @returns An object with either a `success` flag and the parsed and typed data, or a `success` flag and an error object.
*/
declare function safeValidateTypes<OBJECT>({ value, schema, context, }: {
value: unknown;
schema: FlexibleSchema<OBJECT>;
context?: TypeValidationContext;
}): Promise<{
success: true;
value: OBJECT;
rawValue: unknown;
} | {
success: false;
error: TypeValidationError;
rawValue: unknown;
}>;
declare const VERSION: string;
/**
* Appends suffix parts to the `user-agent` header.
* If a `user-agent` header already exists, the suffix parts are appended to it.
* If no `user-agent` header exists, a new one is created with the suffix parts.
* Automatically removes undefined entries from the headers.
*
* @param headers - The original headers.
* @param userAgentSuffixParts - The parts to append to the `user-agent` header.
* @returns The new headers with the `user-agent` header set or updated.
*/
declare function withUserAgentSuffix(headers: HeadersInit | Record<string, string | undefined> | undefined, ...userAgentSuffixParts: string[]): Record<string, string>;
declare function withoutTrailingSlash(url: string | undefined): string | undefined;
declare function executeTool<INPUT, OUTPUT>({ execute, input, options, }: {
execute: ToolExecuteFunction<INPUT, OUTPUT>;
input: INPUT;
options: ToolExecutionOptions;
}): AsyncGenerator<{
type: 'preliminary';
output: OUTPUT;
} | {
type: 'final';
output: OUTPUT;
}>;
/**
* Typed tool call that is returned by generateText and streamText.
* It contains the tool call ID, the tool name, and the tool arguments.
*/
interface ToolCall<NAME extends string, INPUT> {
/**
* ID of the tool call. This ID is used to match the tool call with the tool result.
*/
toolCallId: string;
/**
* Name of the tool that is being called.
*/
toolName: NAME;
/**
* Arguments of the tool call. This is a JSON-serializable object that matches the tool's input schema.
*/
input: INPUT;
/**
* Whether the tool call will be executed by the provider.
* If this flag is not set or is false, the tool call will be executed by the client.
*/
providerExecuted?: boolean;
/**
* Whether the tool is dynamic.
*/
dynamic?: boolean;
}
/**
* Typed tool result that is returned by `generateText` and `streamText`.
* It contains the tool call ID, the tool name, the tool arguments, and the tool result.
*/
interface ToolResult<NAME extends string, INPUT, OUTPUT> {
/**
* ID of the tool call. This ID is used to match the tool call with the tool result.
*/
toolCallId: string;
/**
* Name of the tool that was called.
*/
toolName: NAME;
/**
* Arguments of the tool call. This is a JSON-serializable object that matches the tool's input schema.
*/
input: INPUT;
/**