@genkit-ai/googleai
Version:
Genkit AI framework plugin for Google AI APIs, including Gemini APIs.
1 lines • 8.42 kB
Source Map (JSON)
{"version":3,"sources":["../src/veo.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 GenerateResponseData,\n GenkitError,\n Operation,\n z,\n type Genkit,\n} from 'genkit';\nimport {\n BackgroundModelAction,\n modelRef,\n type GenerateRequest,\n type ModelInfo,\n type ModelReference,\n} from 'genkit/model';\nimport { getApiKeyFromEnvVar } from './common.js';\nimport { Operation as ApiOperation, checkOp, predictModel } from './predict.js';\n\n/**\n * @deprecated\n */\nexport type KNOWN_VEO_MODELS = 'veo-2.0-generate-001';\n\n/**\n * See https://ai.google.dev/gemini-api/docs/video\n * @deprecated\n */\nexport const VeoConfigSchema = z\n .object({\n // NOTE: Documentation notes numberOfVideos parameter to pick the number of\n // output videos, but this setting does not seem to work\n negativePrompt: z.string().optional(),\n aspectRatio: z\n .enum(['9:16', '16:9'])\n .describe('Desired aspect ratio of the output video.')\n .optional(),\n personGeneration: z\n .enum(['dont_allow', 'allow_adult', 'allow_all'])\n .describe(\n 'Control if/how images of people will be generated by the model.'\n )\n .optional(),\n durationSeconds: z\n .number()\n .step(1)\n .min(5)\n .max(8)\n .describe('Length of each output video in seconds, between 5 and 8.')\n .optional(),\n enhance_prompt: z\n .boolean()\n .describe('Enable or disable the prompt rewriter. Enabled by default.')\n .optional(),\n })\n .passthrough();\n\nfunction extractText(request: GenerateRequest) {\n return request.messages\n .at(-1)!\n .content.map((c) => c.text || '')\n .join('');\n}\n\ninterface VeoParameters {\n sampleCount?: number;\n aspectRatio?: string;\n personGeneration?: string;\n}\n\nfunction toParameters(\n request: GenerateRequest<typeof VeoConfigSchema>\n): VeoParameters {\n const out = {\n ...request?.config,\n };\n\n for (const k in out) {\n if (!out[k]) delete out[k];\n }\n\n return out;\n}\n\nfunction extractImage(request: GenerateRequest): VeoImage | undefined {\n const media = request.messages.at(-1)?.content.find((p) => !!p.media)?.media;\n if (media) {\n const img = media?.url.split(',')[1];\n return {\n bytesBase64Encoded: img,\n mimeType: media.contentType!,\n };\n }\n return undefined;\n}\n\ninterface VeoImage {\n bytesBase64Encoded: string;\n mimeType: string;\n}\n\ninterface VeoInstance {\n prompt: string;\n image?: VeoImage;\n}\n\n/**\n * @deprecated\n */\nexport const GENERIC_VEO_INFO = {\n label: `Google AI - Generic Veo`,\n supports: {\n media: true,\n multiturn: false,\n tools: false,\n systemRole: false,\n output: ['media'],\n longRunning: true,\n },\n} as ModelInfo;\n\n/**\n * @deprecated\n */\nexport function defineVeoModel(\n ai: Genkit,\n name: string,\n apiKey?: string | false\n): BackgroundModelAction<typeof VeoConfigSchema> {\n if (apiKey !== false) {\n apiKey = apiKey || getApiKeyFromEnvVar();\n if (!apiKey) {\n throw new GenkitError({\n status: 'FAILED_PRECONDITION',\n message:\n 'Please pass in the API key or set the GEMINI_API_KEY or GOOGLE_API_KEY environment variable.\\n' +\n 'For more details see https://genkit.dev/docs/plugins/google-genai',\n });\n }\n }\n const modelName = `googleai/${name}`;\n const model: ModelReference<z.ZodTypeAny> = modelRef({\n name: modelName,\n info: {\n ...GENERIC_VEO_INFO,\n label: `Google AI - ${name}`,\n },\n configSchema: VeoConfigSchema,\n });\n\n return ai.defineBackgroundModel({\n name: modelName,\n ...model.info,\n configSchema: VeoConfigSchema,\n async start(request) {\n const instance: VeoInstance = {\n prompt: extractText(request),\n };\n const image = extractImage(request);\n if (image) {\n instance.image = image;\n }\n\n const predictClient = predictModel<\n VeoInstance,\n ApiOperation,\n VeoParameters\n >(model.version || name, apiKey as string, 'predictLongRunning');\n const response = await predictClient([instance], toParameters(request));\n\n return toGenkitOp(response);\n },\n async check(operation) {\n const newOp = await checkOp(operation.id, apiKey as string);\n return toGenkitOp(newOp);\n },\n });\n}\n\nfunction toGenkitOp(apiOp: ApiOperation): Operation<GenerateResponseData> {\n const res = { id: apiOp.name } as Operation<GenerateResponseData>;\n if (apiOp.done !== undefined) {\n res.done = apiOp.done;\n }\n\n if (apiOp.error) {\n res.error = { message: apiOp.error.message };\n }\n\n if (\n apiOp.response &&\n apiOp.response.generateVideoResponse &&\n apiOp.response.generateVideoResponse.generatedSamples\n ) {\n res.output = {\n finishReason: 'stop',\n raw: apiOp.response,\n message: {\n role: 'model',\n content: apiOp.response.generateVideoResponse.generatedSamples.map(\n (s) => {\n return {\n media: {\n url: s.video.uri,\n },\n };\n }\n ),\n },\n };\n }\n\n return res;\n}\n"],"mappings":"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","names":[]}