@ai-sdk/provider-utils
Version:
1,417 lines (1,359 loc) • 94.4 kB
TypeScript
import { SharedV4FileDataUrl, SharedV4FileDataReference, SharedV4FileDataText, SharedV4ProviderOptions, SharedV4ProviderReference, JSONValue, ImageModelV4File, LanguageModelV4FunctionTool, LanguageModelV4ProviderTool, AISDKError, JSONSchema7, JSONParseError, TypeValidationError, APICallError, LanguageModelV4Prompt, LanguageModelV4CallOptions, SharedV4Warning, JSONObject, LanguageModelV4FilePart, LanguageModelV4StreamPart, SharedV4ProviderMetadata, TypeValidationContext } from '@ai-sdk/provider';
export { getErrorMessage } 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 { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from '@workflow/serde';
export { EventSourceMessage, EventSourceParserStream } from 'eventsource-parser/stream';
/**
* A value that can be provided either as a single item, an array of items,
* or be left undefined.
*/
type Arrayable<T> = T | T[] | undefined;
/**
* Normalizes a possibly undefined or non-array value into an array.
*/
declare function asArray<T>(value: Arrayable<T>): T[];
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>;
/**
* Data content. Can either be a base64-encoded string, a Uint8Array, an ArrayBuffer, or a Buffer.
*/
type DataContent = string | Uint8Array | ArrayBuffer | Buffer;
/**
* File data variant containing raw bytes (`Uint8Array`, `ArrayBuffer`, or
* `Buffer`) or a base64-encoded string.
*
* This is slightly more permissive than `SharedV4FileDataData`.
*/
interface FileDataData {
type: 'data';
data: DataContent;
}
/**
* File data variant containing a URL that points to the file.
*/
type FileDataUrl = SharedV4FileDataUrl;
/**
* File data variant containing a provider reference (`{ [provider]: id }`).
*/
type FileDataReference = SharedV4FileDataReference;
/**
* File data variant containing inline text content (e.g. an inline text
* document).
*/
type FileDataText = SharedV4FileDataText;
/**
* File data as a tagged discriminated union:
*
* - `{ type: 'data', data }`: raw bytes (`Uint8Array`, `ArrayBuffer`, or
* `Buffer`) or a base64-encoded string.
* - `{ type: 'url', url }`: a URL that points to the file.
* - `{ type: 'reference', reference }`: a provider reference (`{ [provider]: id }`).
* - `{ type: 'text', text }`: inline text content (e.g. an inline text document).
*/
type FileData = FileDataData | FileDataUrl | FileDataReference | FileDataText;
/**
* 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 = SharedV4ProviderOptions;
/**
* A mapping of provider names to provider-specific file identifiers.
*
* Provider references allow files to be identified across different
* providers without re-uploading, by storing each provider's own
* identifier for the same logical file.
*/
type ProviderReference = SharedV4ProviderReference;
/**
* 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.
*
* @deprecated Use `FilePart` with `mediaType: 'image'` instead:
* `{ type: 'file', mediaType: 'image', data: { type: 'data', data } }`.
*/
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
* - ProviderReference: a provider reference from `uploadFile`
*/
image: DataContent | URL | ProviderReference;
/**
* 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. Either a tagged shape or a bare shorthand:
*
* - `{ type: 'data', data }` or bare `DataContent`: raw bytes
* (base64 string, Uint8Array, ArrayBuffer, Buffer)
* - `{ type: 'url', url }` or bare `URL`: a URL that points to the file
* - `{ type: 'reference', reference }` or bare `ProviderReference`:
* a provider reference from `uploadFile`
* - `{ type: 'text', text }`: inline text content (tagged only)
*/
data: FileData | DataContent | URL | ProviderReference;
/**
* Optional filename of the file.
*/
filename?: string;
/**
* Either a full IANA media type (`type/subtype`, e.g. `image/png`) or just
* the top-level IANA segment (e.g. `image`, `audio`, `video`, `text`).
*
* `*`-subtype wildcards (e.g. `image/*`) are normalized as equivalent to the
* top-level segment alone (e.g. `image`). Providers can use the helpers in
* `@ai-sdk/provider-utils` (`isFullMediaType`, `getTopLevelMediaType`,
* `detectMediaType`) to resolve the field according to their API
* requirements.
*
* @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;
}
/**
* Custom content part of a prompt. It contains no standardized payload beyond
* provider-specific options.
*/
interface CustomPart {
type: 'custom';
/**
* The kind of custom content, in the format `{provider}.{provider-type}`.
*/
kind: `${string}.${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 file content part of a prompt. It contains a file generated as part of reasoning.
*/
interface ReasoningFilePart {
type: 'reasoning-file';
/**
* Reasoning file data.
*
* Reasoning files originate from a model's reasoning output and are always
* raw bytes or a fetchable URL. Unlike `FilePart.data`, the `reference` and
* `text` shapes are not supported here: provider references describe files
* uploaded by the user (not produced as model output), and reasoning text is
* carried by `ReasoningPart` rather than as a file.
*
* Either a tagged shape or a bare shorthand:
*
* - `{ type: 'data', data }` or bare `DataContent`: raw bytes
* (base64 string, Uint8Array, ArrayBuffer, Buffer)
* - `{ type: 'url', url }` or bare `URL`: a URL that points to the file
*/
data: FileDataData | FileDataUrl | DataContent | URL;
/**
* 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;
}
/**
* 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;
} | {
type: 'file';
/**
* File data as a tagged discriminated union:
*
* - `{ type: 'data', data }`: raw bytes
* (base64 string, Uint8Array, ArrayBuffer, Buffer)
* - `{ type: 'url', url }`: a URL that points to the file
* - `{ type: 'reference', reference }`: a provider reference
* from `uploadFile`
* - `{ type: 'text', text }`: inline text content (e.g. an inline
* text document)
*/
data: FileData;
/**
* Either a full IANA media type (`type/subtype`, e.g. `image/png`) or just
* the top-level IANA segment (e.g. `image`, `audio`, `video`, `text`).
*
* `*`-subtype wildcards (e.g. `image/*`) are normalized as equivalent to the
* top-level segment alone (e.g. `image`). Providers can use the helpers in
* `@ai-sdk/provider-utils` (`isFullMediaType`, `getTopLevelMediaType`,
* `detectMediaType`) to resolve the field according to their API
* requirements.
*
* @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;
} | {
/**
* @deprecated Use 'file' with mediaType + tagged data instead:
* `{ type: 'file', mediaType, data: { type: 'data', data } }`.
*/
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;
} | {
/**
* @deprecated Use 'file' with mediaType and tagged data instead:
* `{ type: 'file', mediaType, data: { type: 'url', url: new URL(url) } }`.
*/
type: 'file-url';
/**
* URL of the file.
*/
url: string;
/**
* IANA media type.
* @see https://www.iana.org/assignments/media-types/media-types.xhtml
*/
mediaType?: string;
/**
* Provider-specific options.
*/
providerOptions?: ProviderOptions;
} | {
/**
* @deprecated Use 'file' with tagged data instead:
* `{ type: 'file', mediaType, data: { type: 'reference', reference } }`.
*/
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;
} | {
/**
* @deprecated Use 'file' with tagged data instead:
* `{ type: 'file', mediaType, data: { type: 'reference', reference } }`.
*/
type: 'file-reference';
/**
* Provider-specific references for the file.
* The key is the provider name, e.g. 'openai' or 'anthropic'.
*/
providerReference: ProviderReference;
/**
* Provider-specific options.
*/
providerOptions?: ProviderOptions;
} | {
/**
* @deprecated Use 'file' with mediaType (e.g. 'image' or a specific
* `image/*` subtype) and tagged data instead:
* `{ type: 'file', mediaType: 'image', data: { type: 'data', 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;
} | {
/**
* @deprecated Use 'file' with `mediaType: 'image'` (or a specific
* `image/*` subtype) and tagged data instead:
* `{ type: 'file', mediaType: 'image', data: { type: 'url', url: new URL(url) } }`.
*/
type: 'image-url';
/**
* URL of the image.
*/
url: string;
/**
* Provider-specific options.
*/
providerOptions?: ProviderOptions;
} | {
/**
* @deprecated Use 'file' with `mediaType: 'image'` (or a specific
* `image/*` subtype) and tagged data instead:
* `{ type: 'file', mediaType: 'image', data: { type: 'reference', reference } }`.
*/
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;
} | {
/**
* @deprecated Use 'file' with `mediaType: 'image'` (or a specific
* `image/*` subtype) and tagged data instead:
* `{ type: 'file', mediaType: 'image', data: { type: 'reference', reference } }`.
*/
type: 'image-file-reference';
/**
* Provider-specific references for the image file.
* The key is the provider name, e.g. 'openai' or 'anthropic'.
*/
providerReference: ProviderReference;
/**
* 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;
}>;
};
type InlineFileData = Extract<FilePart['data'], {
type: 'data';
} | {
type: 'text';
}>;
/**
* Converts inline file data (a tagged `data` or `text` shape) into raw bytes.
*
* - `{ type: 'text', text }` → UTF-8 encoded bytes
* - `{ type: 'data', data: Uint8Array | Buffer }` → returned as-is
* - `{ type: 'data', data: ArrayBuffer }` → wrapped in a `Uint8Array`
* - `{ type: 'data', data: string }` → decoded as base64
*/
declare function convertInlineFileDataToUint8Array(data: InlineFileData): Uint8Array;
/**
* Convert an ImageModelV4File 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: ImageModelV4File): 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;
/**
* 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, }: {
/**
* Tools that were passed to the language model.
*/
tools: Array<LanguageModelV4FunctionTool | LanguageModelV4ProviderTool> | undefined;
/**
* Maps the provider tool ids to the provider tool names.
*/
providerToolNames: Record<`${string}.${string}`, string>;
}): 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;
}
/**
* Detect the IANA media type of a file from its raw bytes or base64 string.
*
* - When `topLevelType` is omitted, every known signature is considered
* (image, audio, video, and application). Returns `undefined` when the
* bytes do not match any known signature.
* - When `topLevelType` is provided, only signatures for that top-level
* segment are considered. Returns `undefined` for unsupported segments
* (e.g. `"text"`) or when no signature matches.
*/
declare function detectMediaType({ data, topLevelType, }: {
data: Uint8Array | string;
topLevelType?: string;
}): string | undefined;
/**
* Returns the top-level segment of a media type (the portion before `/`).
*
* Examples:
* - `"image/png"` -> `"image"`
* - `"image/*"` -> `"image"`
* - `"image"` -> `"image"`
* - `"image/"` -> `"image"`
* - `""` -> `""`
* - `"/"` -> `""`
*/
declare function getTopLevelMediaType(mediaType: string): string;
/**
* Returns `true` only when the given media type has a non-empty, non-wildcard
* subtype (i.e. matches the form `type/subtype`, and `subtype` is not `*`).
*
* Examples:
* - `"image/png"` -> `true`
* - `"image/*"` -> `false`
* - `"image"` -> `false`
* - `"image/"` -> `false`
* - `""` -> `false`
* - `"/"` -> `false`
*/
declare function isFullMediaType(mediaType: string): boolean;
/**
* 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;
}
/**
* Fetches a URL while enforcing the SSRF download guard on every hop.
*
* Redirects are followed manually (`redirect: 'manual'`) so each hop is
* validated with {@link validateDownloadUrl} *before* it is requested. Relying
* on the default `redirect: 'follow'` would issue the request to a redirect
* target (e.g. an internal address) before we ever see its URL, defeating the
* SSRF guard.
*
* A `redirect: 'manual'` request yields an unreadable opaque response in the
* browser (and in other spec-compliant fetch implementations), so the redirect
* target cannot be validated here. In a real browser this is safe to follow
* natively because SSRF is not reachable (fetch is constrained by CORS and
* cannot reach a server's internal network or cloud-metadata). On any other
* runtime we cannot validate the hop, so we fail closed rather than follow it
* blindly and bypass the SSRF guard.
*
* The returned response is the final (non-redirect) response. The caller is
* responsible for checking `response.ok` and reading the body.
*
* @throws DownloadError if a hop is unsafe, the redirect limit is exceeded, or
* a redirect cannot be validated on a non-browser runtime.
*/
declare function fetchWithValidatedRedirects({ url, headers, abortSignal, maxRedirects, }: {
url: string;
headers?: HeadersInit;
abortSignal?: AbortSignal;
maxRedirects?: number;
}): Promise<Response>;
/**
* Extracts a 1-based inclusive line range from `text`, auto-detecting the
* file's line ending (`\r\n`, `\n`, or `\r`, in that priority).
*
* Mixed line endings are not supported: detection picks one and uses it for
* both the split and the rejoin, so files that mix conventions will not slice
* cleanly. When neither `startLine` nor `endLine` is provided, the input is
* returned unchanged. `endLine` past EOF clamps to the last line.
*/
declare function extractLines({ text, startLine, endLine, }: {
text: string;
startLine?: number;
endLine?: number;
}): string;
/**
* 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;
};
/**
* Fetch function type (standardizes the version of fetch used).
*/
type FetchFunction = typeof globalThis.fetch;
/**
* Filters `null` and `undefined` values out of a list of values.
*
* @param values - The values to filter.
* @returns A new array containing only non-nullish values.
*/
declare function filterNullable<T>(...values: Array<T | undefined | null>): Array<T>;
/**
* 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;
/**
* 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;
/**
* Checks if an object has required keys.
* @param OBJECT - The object to check.
* @returns True if the object has required keys, false otherwise.
*/
type HasRequiredKey<OBJECT> = {} extends OBJECT ? false : true;
declare function injectJsonInstructionIntoMessages({ messages, schema, schemaPrefix, schemaSuffix, }: {
messages: LanguageModelV4Prompt;
schema?: JSONSchema7;
schemaPrefix?: string;
schemaSuffix?: string;
}): LanguageModelV4Prompt;
declare function isAbortError(error: unknown): error is Error;
/**
* Returns `true` when running in a browser.
*
* Detection keys on the presence of a global `window`, matching the browser
* check used elsewhere in this package (see `getRuntimeEnvironmentUserAgent`)
* so the SDK has a single, consistent definition of "browser". Server runtimes
* (Node.js, Deno, Bun, edge/workers) do not define `window`.
*/
declare function isBrowserRuntime(globalThisAny?: any): boolean;
/**
* Type-guard for Node.js `Buffer` instances.
*
* Uses optional chaining on `globalThis.Buffer` so it returns `false` in
* runtimes where `Buffer` is not available (e.g. CloudFlare Workers).
*/
declare function isBuffer(value: unknown): value is Buffer;
/**
* Returns true when `url` has the same origin (scheme + host + port) as
* `baseUrl`.
*
* Used to decide whether provider credentials may be attached to a request to a
* URL taken from a provider response (e.g. a polling or media-download URL).
* Credentials must only be sent to the provider's own origin; a response that
* names a foreign host (a CDN, or an attacker-controlled host if the response
* is tampered with) must not receive the API key.
*
* Returns false if either value is not a valid absolute URL (fail-closed).
*/
declare function isSameOrigin(url: string, baseUrl: string): boolean;
/**
* 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 whether a value is a provider reference (a mapping of provider names
* to provider-specific identifiers) as opposed to raw bytes, a URL, or a
* tagged `{ type: ... }` object.
*/
declare function isProviderReference(data: unknown): data is SharedV4ProviderReference;
/**
* Checks if the given URL is supported natively by the model.
*
* @param mediaType - The media type of the URL. Case-sensitive. May be a full
* `type/subtype`, a wildcard `type/*`, or just the
* top-level segment (e.g. `image`).
* @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 ReasoningLevel = Exclude<LanguageModelV4CallOptions['reasoning'], 'none' | 'provider-default' | undefined>;
declare function isCustomReasoning(reasoning: LanguageModelV4CallOptions['reasoning']): reasoning is Exclude<LanguageModelV4CallOptions['reasoning'], 'provider-default' | undefined>;
/**
* Maps a top-level reasoning level to a provider-specific effort string using
* the given effort map. Pushes a compatibility warning if the reasoning level
* maps to a different string, or an unsupported warning if the level is not
* present in the map.
*
* @returns The mapped effort string, or `undefined` if the level is not
* supported.
*/
declare function mapReasoningToProviderEffort<T extends string>({ reasoning, effortMap, warnings, }: {
reasoning: ReasoningLevel;
effortMap: Partial<Record<ReasoningLevel, T>>;
warnings: SharedV4Warning[];
}): T | undefined;
/**
* Maps a top-level reasoning level to an absolute token budget by multiplying
* the model's max output tokens by a percentage from the budget percentages
* map. The result is clamped between `minReasoningBudget` (default 1024) and
* `maxReasoningBudget`. Pushes an unsupported warning if the level is not
* present in the budget percentages map.
*
* @returns The computed token budget, or `undefined` if the level is not
* supported.
*/
declare function mapReasoningToProviderBudget({ reasoning, maxOutputTokens, maxReasoningBudget, minReasoningBudget, budgetPercentages, warnings, }: {
reasoning: ReasoningLevel;
maxOutputTokens: number;
maxReasoningBudget: number;
minReasoningBudget?: number;
budgetPercentages?: Partial<Record<ReasoningLevel, number>>;
warnings: SharedV4Warning[];
}): number | undefined;
/**
* A value that can be provided either synchronously or as a promise-like.
*/
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>;
}>;
/**
* A context object that is passed into tool execution.
*/
type Context = Record<string, unknown>;
/**
* A tool that is guaranteed to expose an execute function.
*/
type ExecutableTool<TOOL extends Tool = Tool> = TOOL & {
execute: NonNullable<TOOL['execute']>;
};
/**
* Checks whether a tool exposes an execute function.
*/
declare function isExecutableTool<TOOL extends Tool>(tool: TOOL | undefined): tool is ExecutableTool<TOOL>;
type NeverOptional<N, T> = 0 extends 1 & N ? Partial<T> : [N] extends [never] ? Partial<Record<keyof T, undefined>> : T;
/**
* 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;
/**
* Flag indicating whether the tool was automatically approved or denied.
*
* @default false
*/
isAutomatic?: boolean;
/**
* HMAC-SHA256 signature binding this approval to its tool call.
* Present only when `experimental_toolApprovalSecret` is configured.
*/
signature?: 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 | CustomPart | FilePart | ReasoningPart | ReasoningFilePart | 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;
/**
* Options for executing a command in the sandbox via `run` or `spawn`.
*/
type SandboxProcessOptions = {
/**
* Command to execute in the sandbox.
*/
command: string;
/**
* Working directory to execute the command in.
*/
workingDirectory?: string;
/**
* Environment variables to set for this command. Merged with the
* sandbox's default environment; values here take precedence.
* Supporting environment variables as an option is preferable from a
* security perspective, e.g. to avoid them leaking in logs.
*/
env?: Record<string, string>;
/**
* Signal that can be used to abort the command. When aborted, the running
* process is killed; for `spawn`, `wait()` rejects with the abort reason.
*/
abortSignal?: AbortSignal;
};
/**
* Options for reading a file from the sandbox.
*/
type ReadFileOptions = {
/**
* Path of the file to read.
*/
path: string;
/**
* Signal that can be used to abort the read.
*/
abortSignal?: AbortSignal;
};
/**
* Options for writing a file to the sandbox. `CONTENT` is the payload written
* to the file: a byte stream, raw bytes, or a string.
*/
type WriteFileOptions<CONTENT> = {
/**
* Path of the file to write.
*/
path: string;
/*