@genkit-ai/ai
Version:
Genkit AI framework generative AI APIs.
1 lines • 21.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/model.ts"],"sourcesContent":["/**\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ActionFnArg,\n BackgroundAction,\n GenkitError,\n Operation,\n OperationSchema,\n action,\n backgroundAction,\n defineAction,\n registerBackgroundAction,\n z,\n type Action,\n type ActionMetadata,\n type ActionParams,\n type SimpleMiddleware,\n type StreamingCallback,\n} from '@genkit-ai/core';\nimport { logger } from '@genkit-ai/core/logging';\nimport type { Registry } from '@genkit-ai/core/registry';\nimport { toJsonSchema } from '@genkit-ai/core/schema';\nimport { performance } from 'node:perf_hooks';\nimport {\n CustomPartSchema,\n DataPartSchema,\n MediaPartSchema,\n TextPartSchema,\n ToolRequestPartSchema,\n ToolResponsePartSchema,\n type CustomPart,\n type DataPart,\n type MediaPart,\n type TextPart,\n type ToolRequestPart,\n type ToolResponsePart,\n} from './document.js';\nimport {\n CandidateData,\n GenerateRequest,\n GenerateRequestSchema,\n GenerateResponseChunkData,\n GenerateResponseChunkSchema,\n GenerateResponseData,\n GenerateResponseSchema,\n GenerationUsage,\n MessageData,\n ModelInfo,\n Part,\n} from './model-types.js';\nimport {\n augmentWithContext,\n simulateConstrainedGeneration,\n} from './model/middleware.js';\nexport { defineGenerateAction } from './generate/action.js';\nexport * from './model-types.js';\nexport {\n CustomPartSchema,\n DataPartSchema,\n MediaPartSchema,\n TextPartSchema,\n ToolRequestPartSchema,\n ToolResponsePartSchema,\n simulateConstrainedGeneration,\n type CustomPart,\n type DataPart,\n type MediaPart,\n type TextPart,\n type ToolRequestPart,\n type ToolResponsePart,\n};\n\nexport type ModelAction<\n CustomOptionsSchema extends z.ZodTypeAny = z.ZodTypeAny,\n> = Action<\n typeof GenerateRequestSchema,\n typeof GenerateResponseSchema,\n typeof GenerateResponseChunkSchema\n> & {\n __configSchema: CustomOptionsSchema;\n};\n\nexport type BackgroundModelAction<\n CustomOptionsSchema extends z.ZodTypeAny = z.ZodTypeAny,\n> = BackgroundAction<\n typeof GenerateRequestSchema,\n typeof GenerateResponseSchema\n> & {\n __configSchema: CustomOptionsSchema;\n};\n\nexport type ModelMiddleware = SimpleMiddleware<\n z.infer<typeof GenerateRequestSchema>,\n z.infer<typeof GenerateResponseSchema>\n>;\n\nexport type DefineModelOptions<\n CustomOptionsSchema extends z.ZodTypeAny = z.ZodTypeAny,\n> = {\n name: string;\n /** Known version names for this model, e.g. `gemini-1.0-pro-001`. */\n versions?: string[];\n /** Capabilities this model supports. */\n supports?: ModelInfo['supports'];\n /** Custom options schema for this model. */\n configSchema?: CustomOptionsSchema;\n /** Descriptive name for this model e.g. 'Google AI - Gemini Pro'. */\n label?: string;\n /** Middleware to be used with this model. */\n use?: ModelMiddleware[];\n};\n\nexport function model<CustomOptionsSchema extends z.ZodTypeAny = z.ZodTypeAny>(\n options: DefineModelOptions<CustomOptionsSchema>,\n runner: (\n request: GenerateRequest<CustomOptionsSchema>,\n options: ActionFnArg<GenerateResponseChunkData>\n ) => Promise<GenerateResponseData>\n): ModelAction<CustomOptionsSchema> {\n const act = action(modelActionOptions(options), (input, ctx) => {\n const startTimeMs = performance.now();\n return runner(input, ctx).then((response) => {\n const timedResponse = {\n ...response,\n latencyMs: performance.now() - startTimeMs,\n };\n return timedResponse;\n });\n });\n Object.assign(act, {\n __configSchema: options.configSchema || z.unknown(),\n });\n return act as ModelAction<CustomOptionsSchema>;\n}\n\nfunction modelActionOptions<\n CustomOptionsSchema extends z.ZodTypeAny = z.ZodTypeAny,\n>(\n options: DefineModelOptions<CustomOptionsSchema>\n): ActionParams<typeof GenerateRequestSchema, typeof GenerateResponseSchema> {\n const label = options.label || options.name;\n const middleware = getModelMiddleware(options);\n return {\n actionType: 'model',\n name: options.name,\n description: label,\n inputSchema: GenerateRequestSchema,\n outputSchema: GenerateResponseSchema,\n metadata: {\n model: {\n label,\n customOptions: options.configSchema\n ? toJsonSchema({ schema: options.configSchema })\n : undefined,\n versions: options.versions,\n supports: options.supports,\n },\n },\n use: middleware,\n };\n}\n\n/**\n * Defines a new model and adds it to the registry.\n */\nexport function defineModel<\n CustomOptionsSchema extends z.ZodTypeAny = z.ZodTypeAny,\n>(\n registry: Registry,\n options: {\n apiVersion: 'v2';\n } & DefineModelOptions<CustomOptionsSchema>,\n runner: (\n request: GenerateRequest<CustomOptionsSchema>,\n options: ActionFnArg<GenerateResponseChunkData>\n ) => Promise<GenerateResponseData>\n): ModelAction<CustomOptionsSchema>;\n\n/**\n * Defines a new model and adds it to the registry.\n */\nexport function defineModel<\n CustomOptionsSchema extends z.ZodTypeAny = z.ZodTypeAny,\n>(\n registry: Registry,\n options: DefineModelOptions<CustomOptionsSchema>,\n runner: (\n request: GenerateRequest<CustomOptionsSchema>,\n streamingCallback?: StreamingCallback<GenerateResponseChunkData>\n ) => Promise<GenerateResponseData>\n): ModelAction<CustomOptionsSchema>;\n\nexport function defineModel<\n CustomOptionsSchema extends z.ZodTypeAny = z.ZodTypeAny,\n>(\n registry: Registry,\n options: any,\n runner: (\n request: GenerateRequest<CustomOptionsSchema>,\n options: any\n ) => Promise<GenerateResponseData>\n): ModelAction<CustomOptionsSchema> {\n const act = defineAction(\n registry,\n modelActionOptions(options),\n (input, ctx) => {\n const startTimeMs = performance.now();\n const secondParam =\n options.apiVersion === 'v2'\n ? ctx\n : ctx.streamingRequested\n ? ctx.sendChunk\n : undefined;\n return runner(input, secondParam).then((response) => {\n const timedResponse = {\n ...response,\n latencyMs: performance.now() - startTimeMs,\n };\n return timedResponse;\n });\n }\n );\n Object.assign(act, {\n __configSchema: options.configSchema || z.unknown(),\n });\n return act as ModelAction<CustomOptionsSchema>;\n}\n\nexport type DefineBackgroundModelOptions<\n CustomOptionsSchema extends z.ZodTypeAny = z.ZodTypeAny,\n> = DefineModelOptions<CustomOptionsSchema> & {\n start: (\n request: GenerateRequest<CustomOptionsSchema>\n ) => Promise<Operation<GenerateResponseData>>;\n check: (\n operation: Operation<GenerateResponseData>\n ) => Promise<Operation<GenerateResponseData>>;\n cancel?: (\n operation: Operation<GenerateResponseData>\n ) => Promise<Operation<GenerateResponseData>>;\n};\n\n/**\n * Defines a new model that runs in the background.\n */\nexport function defineBackgroundModel<\n CustomOptionsSchema extends z.ZodTypeAny = z.ZodTypeAny,\n>(\n registry: Registry,\n options: DefineBackgroundModelOptions<CustomOptionsSchema>\n): BackgroundModelAction<CustomOptionsSchema> {\n const act = backgroundModel(options);\n registerBackgroundAction(registry, act);\n return act;\n}\n/**\n * Defines a new model that runs in the background.\n */\nexport function backgroundModel<\n CustomOptionsSchema extends z.ZodTypeAny = z.ZodTypeAny,\n>(\n options: DefineBackgroundModelOptions<CustomOptionsSchema>\n): BackgroundModelAction<CustomOptionsSchema> {\n const label = options.label || options.name;\n const middleware = getModelMiddleware(options);\n const act = backgroundAction({\n actionType: 'background-model',\n name: options.name,\n description: label,\n inputSchema: GenerateRequestSchema,\n outputSchema: GenerateResponseSchema,\n metadata: {\n model: {\n label,\n customOptions: options.configSchema\n ? toJsonSchema({ schema: options.configSchema })\n : undefined,\n versions: options.versions,\n supports: options.supports,\n },\n },\n use: middleware,\n async start(request) {\n const startTimeMs = performance.now();\n const response = await options.start(request);\n Object.assign(response, {\n latencyMs: performance.now() - startTimeMs,\n });\n return response;\n },\n async check(op) {\n return options.check(op);\n },\n cancel: options.cancel\n ? async (op) => {\n if (!options.cancel) {\n throw new GenkitError({\n status: 'UNIMPLEMENTED',\n message: 'cancel not implemented',\n });\n }\n return options.cancel(op);\n }\n : undefined,\n }) as BackgroundModelAction<CustomOptionsSchema>;\n Object.assign(act, {\n __configSchema: options.configSchema || z.unknown(),\n });\n return act;\n}\n\nfunction getModelMiddleware(options: {\n use?: ModelMiddleware[];\n name: string;\n supports?: ModelInfo['supports'];\n}) {\n const middleware: ModelMiddleware[] = options.use || [];\n if (!options?.supports?.context) middleware.push(augmentWithContext());\n const constratedSimulator = simulateConstrainedGeneration();\n middleware.push((req, next) => {\n if (\n !options?.supports?.constrained ||\n options?.supports?.constrained === 'none' ||\n (options?.supports?.constrained === 'no-tools' &&\n (req.tools?.length ?? 0) > 0)\n ) {\n return constratedSimulator(req, next);\n }\n return next(req);\n });\n\n return middleware;\n}\n\nexport interface ModelReference<CustomOptions extends z.ZodTypeAny> {\n name: string;\n configSchema?: CustomOptions;\n info?: ModelInfo;\n version?: string;\n config?: z.infer<CustomOptions>;\n\n withConfig(cfg: z.infer<CustomOptions>): ModelReference<CustomOptions>;\n withVersion(version: string): ModelReference<CustomOptions>;\n}\n\n/**\n * Packages model information into ActionMetadata object.\n */\nexport function modelActionMetadata({\n name,\n info,\n configSchema,\n background,\n}: {\n name: string;\n info?: ModelInfo;\n configSchema?: z.ZodTypeAny;\n background?: boolean;\n}): ActionMetadata {\n return {\n actionType: background ? 'background-model' : 'model',\n name: name,\n inputJsonSchema: toJsonSchema({ schema: GenerateRequestSchema }),\n outputJsonSchema: background\n ? toJsonSchema({ schema: OperationSchema })\n : toJsonSchema({ schema: GenerateResponseSchema }),\n metadata: {\n model: {\n ...info,\n customOptions: configSchema\n ? toJsonSchema({ schema: configSchema })\n : undefined,\n },\n },\n } as ActionMetadata;\n}\n\n/** Cretes a model reference. */\nexport function modelRef<\n CustomOptionsSchema extends z.ZodTypeAny = z.ZodTypeAny,\n>(\n options: Omit<\n ModelReference<CustomOptionsSchema>,\n 'withConfig' | 'withVersion'\n > & {\n namespace?: string;\n }\n): ModelReference<CustomOptionsSchema> {\n let name = options.name;\n if (options.namespace && !name.startsWith(options.namespace + '/')) {\n name = `${options.namespace}/${name}`;\n }\n const ref: Partial<ModelReference<CustomOptionsSchema>> = {\n ...options,\n name,\n };\n ref.withConfig = (\n cfg: z.infer<CustomOptionsSchema>\n ): ModelReference<CustomOptionsSchema> => {\n return modelRef({\n ...options,\n name,\n config: cfg,\n });\n };\n ref.withVersion = (version: string): ModelReference<CustomOptionsSchema> => {\n return modelRef({\n ...options,\n name,\n version,\n });\n };\n return ref as ModelReference<CustomOptionsSchema>;\n}\n\n/** Container for counting usage stats for a single input/output {Part} */\ntype PartCounts = {\n characters: number;\n images: number;\n videos: number;\n audio: number;\n};\n\n/**\n * Calculates basic usage statistics from the given model inputs and outputs.\n */\nexport function getBasicUsageStats(\n input: MessageData[],\n response: MessageData | CandidateData[]\n): GenerationUsage {\n const inputCounts = getPartCounts(input.flatMap((md) => md.content));\n const outputCounts = getPartCounts(\n Array.isArray(response)\n ? response.flatMap((c) => c.message.content)\n : response.content\n );\n return {\n inputCharacters: inputCounts.characters,\n inputImages: inputCounts.images,\n inputVideos: inputCounts.videos,\n inputAudioFiles: inputCounts.audio,\n outputCharacters: outputCounts.characters,\n outputImages: outputCounts.images,\n outputVideos: outputCounts.videos,\n outputAudioFiles: outputCounts.audio,\n };\n}\n\nfunction getPartCounts(parts: Part[]): PartCounts {\n return parts.reduce(\n (counts, part) => {\n const isImage =\n part.media?.contentType?.startsWith('image') ||\n part.media?.url?.startsWith('data:image');\n const isVideo =\n part.media?.contentType?.startsWith('video') ||\n part.media?.url?.startsWith('data:video');\n const isAudio =\n part.media?.contentType?.startsWith('audio') ||\n part.media?.url?.startsWith('data:audio');\n return {\n characters: counts.characters + (part.text?.length || 0),\n images: counts.images + (isImage ? 1 : 0),\n videos: counts.videos + (isVideo ? 1 : 0),\n audio: counts.audio + (isAudio ? 1 : 0),\n };\n },\n { characters: 0, images: 0, videos: 0, audio: 0 }\n );\n}\n\nexport type ModelArgument<CustomOptions extends z.ZodTypeAny = z.ZodTypeAny> =\n | ModelAction<CustomOptions>\n | ModelReference<CustomOptions>\n | string;\n\nexport interface ResolvedModel<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n> {\n modelAction: ModelAction;\n config?: z.infer<CustomOptions>;\n version?: string;\n}\n\nexport async function resolveModel<C extends z.ZodTypeAny = z.ZodTypeAny>(\n registry: Registry,\n model: ModelArgument<C> | undefined,\n options?: { warnDeprecated?: boolean }\n): Promise<ResolvedModel<C>> {\n let out: ResolvedModel<C>;\n let modelId: string;\n\n if (!model) {\n model = await registry.lookupValue('defaultModel', 'defaultModel');\n }\n if (!model) {\n throw new GenkitError({\n status: 'INVALID_ARGUMENT',\n message: 'Must supply a `model` to `generate()` calls.',\n });\n }\n if (typeof model === 'string') {\n modelId = model;\n out = { modelAction: await lookupModel(registry, model) };\n } else if (model.hasOwnProperty('__action')) {\n modelId = (model as ModelAction).__action.name;\n out = { modelAction: model as ModelAction };\n } else {\n const ref = model as ModelReference<any>;\n modelId = ref.name;\n out = {\n modelAction: await lookupModel(registry, ref.name),\n config: {\n ...ref.config,\n },\n version: ref.version,\n };\n }\n\n if (!out.modelAction) {\n throw new GenkitError({\n status: 'NOT_FOUND',\n message: `Model '${modelId}' not found`,\n });\n }\n\n if (\n options?.warnDeprecated &&\n out.modelAction.__action.metadata?.model?.stage === 'deprecated'\n ) {\n logger.warn(\n `Model '${out.modelAction.__action.name}' is deprecated and may be removed in a future release.`\n );\n }\n\n return out;\n}\n\nasync function lookupModel(\n registry: Registry,\n model: string\n): Promise<ModelAction> {\n return (\n (await registry.lookupAction(`/model/${model}`)) ||\n (await registry.lookupAction(`/background-model/${model}`))\n );\n}\n"],"mappings":"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","names":["model"]}