{"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":[]}