UNPKG

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.

298 lines (277 loc) • 8.47 kB
import { isBuffer, type CustomPart, type DataContent, type FilePart, type ImagePart, type ProviderOptions, type ReasoningFilePart, type ReasoningPart, type TextPart, type ToolApprovalRequest, type ToolApprovalResponse, type ToolResultOutput, type ToolResultPart, } from '@ai-sdk/provider-utils'; import { z } from 'zod/v4'; import { jsonValueSchema } from '../types/json-value'; import { providerMetadataSchema } from '../types/provider-metadata'; const fileInlineDataSchema: z.ZodType<DataContent> = z.union([ z.string(), z.instanceof(Uint8Array), z.instanceof(ArrayBuffer), z.custom<Buffer>(isBuffer, { message: 'Must be a Buffer' }), ]); const providerReferenceSchema = z.record(z.string(), z.string()); /** * @internal */ export const textPartSchema: z.ZodType<TextPart> = z.object({ type: z.literal('text'), text: z.string(), providerOptions: providerMetadataSchema.optional(), }); /** * @internal * @deprecated Use `filePartSchema` with `mediaType: 'image'` instead: * `{ type: 'file', mediaType: 'image', data: { type: 'data', data } }`. */ export const imagePartSchema: z.ZodType<ImagePart> = z.object({ type: z.literal('image'), image: z.union([ fileInlineDataSchema, z.instanceof(URL), providerReferenceSchema, ]), mediaType: z.string().optional(), providerOptions: providerMetadataSchema.optional(), }); const taggedFileDataSchema = z.discriminatedUnion('type', [ z.object({ type: z.literal('data'), data: fileInlineDataSchema }), z.object({ type: z.literal('url'), url: z.instanceof(URL) }), z.object({ type: z.literal('reference'), reference: providerReferenceSchema, }), z.object({ type: z.literal('text'), text: z.string() }), ]); const taggedReasoningFileDataSchema = z.discriminatedUnion('type', [ z.object({ type: z.literal('data'), data: fileInlineDataSchema }), z.object({ type: z.literal('url'), url: z.instanceof(URL) }), ]); /** * @internal */ export const filePartSchema: z.ZodType<FilePart> = z.object({ type: z.literal('file'), data: z.union([ taggedFileDataSchema, fileInlineDataSchema, z.instanceof(URL), providerReferenceSchema, ]), filename: z.string().optional(), mediaType: z.string(), providerOptions: providerMetadataSchema.optional(), }); /** * @internal */ export const reasoningPartSchema: z.ZodType<ReasoningPart> = z.object({ type: z.literal('reasoning'), text: z.string(), providerOptions: providerMetadataSchema.optional(), }); /** * @internal */ export const customPartSchema: z.ZodType<CustomPart> = z.object({ type: z.literal('custom'), kind: z.string().transform(value => value as `${string}.${string}`), providerOptions: providerMetadataSchema.optional(), }); /** * @internal */ export const reasoningFilePartSchema: z.ZodType<ReasoningFilePart> = z.object({ type: z.literal('reasoning-file'), data: z.union([ taggedReasoningFileDataSchema, fileInlineDataSchema, z.instanceof(URL), ]), mediaType: z.string(), providerOptions: providerMetadataSchema.optional(), }); /** * Tool call content part of a prompt. It contains a tool call (usually generated by the AI model). */ export 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; } /** * @internal */ export const toolCallPartSchema: z.ZodType<ToolCallPart> = z.object({ type: z.literal('tool-call'), toolCallId: z.string(), toolName: z.string(), input: z.unknown(), providerOptions: providerMetadataSchema.optional(), providerExecuted: z.boolean().optional(), }) as z.ZodType<ToolCallPart>; // necessary bc input is optional on Zod type /** * @internal */ export const outputSchema: z.ZodType<ToolResultOutput> = z.discriminatedUnion( 'type', [ z.object({ type: z.literal('text'), value: z.string(), providerOptions: providerMetadataSchema.optional(), }), z.object({ type: z.literal('json'), value: jsonValueSchema, providerOptions: providerMetadataSchema.optional(), }), z.object({ type: z.literal('execution-denied'), reason: z.string().optional(), providerOptions: providerMetadataSchema.optional(), }), z.object({ type: z.literal('error-text'), value: z.string(), providerOptions: providerMetadataSchema.optional(), }), z.object({ type: z.literal('error-json'), value: jsonValueSchema, providerOptions: providerMetadataSchema.optional(), }), z.object({ type: z.literal('content'), value: z.array( z.union([ z.object({ type: z.literal('text'), text: z.string(), providerOptions: providerMetadataSchema.optional(), }), z.object({ type: z.literal('file'), data: taggedFileDataSchema, mediaType: z.string(), filename: z.string().optional(), providerOptions: providerMetadataSchema.optional(), }), z.object({ // Deprecated. type: z.literal('file-data'), data: z.string(), mediaType: z.string(), filename: z.string().optional(), providerOptions: providerMetadataSchema.optional(), }), z.object({ // Deprecated. type: z.literal('file-url'), url: z.string(), mediaType: z.string().optional(), providerOptions: providerMetadataSchema.optional(), }), z.object({ // Deprecated. type: z.literal('file-id'), fileId: z.union([z.string(), z.record(z.string(), z.string())]), providerOptions: providerMetadataSchema.optional(), }), z.object({ // Deprecated. type: z.literal('file-reference'), providerReference: z.record(z.string(), z.string()), providerOptions: providerMetadataSchema.optional(), }), z.object({ // Deprecated. type: z.literal('image-data'), data: z.string(), mediaType: z.string(), providerOptions: providerMetadataSchema.optional(), }), z.object({ // Deprecated. type: z.literal('image-url'), url: z.string(), providerOptions: providerMetadataSchema.optional(), }), z.object({ // Deprecated. type: z.literal('image-file-id'), fileId: z.union([z.string(), z.record(z.string(), z.string())]), providerOptions: providerMetadataSchema.optional(), }), z.object({ // Deprecated. type: z.literal('image-file-reference'), providerReference: z.record(z.string(), z.string()), providerOptions: providerMetadataSchema.optional(), }), z.object({ type: z.literal('custom'), providerOptions: providerMetadataSchema.optional(), }), ]), ), }), ], ); /** * @internal */ export const toolResultPartSchema: z.ZodType<ToolResultPart> = z.object({ type: z.literal('tool-result'), toolCallId: z.string(), toolName: z.string(), output: outputSchema, providerOptions: providerMetadataSchema.optional(), }) as z.ZodType<ToolResultPart>; // necessary bc result is optional on Zod type /** * @internal */ export const toolApprovalRequestSchema: z.ZodType<ToolApprovalRequest> = z.object({ type: z.literal('tool-approval-request'), approvalId: z.string(), toolCallId: z.string(), }); /** * @internal */ export const toolApprovalResponseSchema: z.ZodType<ToolApprovalResponse> = z.object({ type: z.literal('tool-approval-response'), approvalId: z.string(), approved: z.boolean(), reason: z.string().optional(), });