{"version":3,"sources":["../../src/googleai/lyria.ts"],"sourcesContent":["/**\n * Copyright 2025 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 { ActionMetadata, modelActionMetadata, z } from 'genkit';\nimport { ModelAction, ModelInfo, ModelReference, modelRef } from 'genkit/model';\nimport { model as pluginModel } from 'genkit/plugin';\nimport {\n  ensureToolIds,\n  fromInteractionSync,\n  toInteractionSteps,\n} from '../common/interaction-converters.mjs';\nimport { ResponseModality } from '../common/interaction-types.mjs';\nimport { isKnownKey } from '../common/utils.mjs';\nimport { createInteraction } from './client.mjs';\nimport {\n  ClientOptions,\n  CreateInteractionRequest,\n  GoogleAIPluginOptions,\n  Model,\n} from './types.mjs';\nimport {\n  calculateApiKey,\n  checkApiKey,\n  checkModelName,\n  extractVersion,\n  modelName,\n} from './utils.mjs';\n\nexport const LyriaConfigSchema = z\n  .object({\n    apiKey: z\n      .string()\n      .describe('Override the API key provided at plugin initialization.')\n      .optional(),\n    baseUrl: z\n      .string()\n      .describe(\n        'Overrides the plugin-configured or default baseUrl, if specified.'\n      )\n      .optional(),\n    apiVersion: z\n      .string()\n      .describe(\n        'Overrides the plugin-configured or default apiVersion, if specified.'\n      )\n      .optional(),\n    responseModalities: z\n      .array(z.enum(['TEXT', 'IMAGE', 'AUDIO']))\n      .describe(\n        'The modalities to be used in response. Defaults to AUDIO and TEXT for Lyria.'\n      )\n      .optional(),\n  })\n  .passthrough();\n\nexport type LyriaConfigSchemaType = typeof LyriaConfigSchema;\nexport type LyriaConfig = z.infer<LyriaConfigSchemaType>;\n\ntype ConfigSchemaType = LyriaConfigSchemaType;\n\nfunction commonRef(\n  name: string,\n  info?: ModelInfo,\n  configSchema: ConfigSchemaType = LyriaConfigSchema\n): ModelReference<ConfigSchemaType> {\n  return modelRef({\n    name: `googleai/${name}`,\n    configSchema,\n    info:\n      info ??\n      ({\n        supports: {\n          multiturn: false,\n          media: true, // Lyria supports images as multimodal input\n          tools: false,\n          toolChoice: false,\n          systemRole: false,\n          output: ['media', 'text'],\n        },\n      } as ModelInfo),\n  });\n}\n\nconst GENERIC_MODEL = commonRef('lyria-3');\n\nconst KNOWN_MODELS = {\n  'lyria-3.5': commonRef('lyria-3.5'),\n  'lyria-3-clip-preview': commonRef('lyria-3-clip-preview'),\n  'lyria-3-pro-preview': commonRef('lyria-3-pro-preview'),\n} as const;\n\nexport type KnownModels = keyof typeof KNOWN_MODELS;\n\nexport type LyriaModelName = `lyria-${string}`;\nexport function isLyriaModelName(value?: string): value is LyriaModelName {\n  return !!value?.startsWith('lyria-');\n}\n\nexport function model(\n  version: string,\n  config: LyriaConfig = {}\n): ModelReference<ConfigSchemaType> {\n  const name = checkModelName(version);\n\n  if (isKnownKey(name, KNOWN_MODELS)) {\n    return KNOWN_MODELS[name].withConfig(config);\n  }\n\n  return modelRef({\n    name: `googleai/${name}`,\n    config,\n    configSchema: LyriaConfigSchema,\n    info: { ...GENERIC_MODEL.info },\n  });\n}\n\nexport function listActions(models: Model[]): ActionMetadata[] {\n  return models\n    .filter((m) => isLyriaModelName(modelName(m.name)))\n    .filter((m) => !m.description || !m.description.includes('deprecated'))\n    .map((m) => {\n      const ref = model(m.name);\n      return modelActionMetadata({\n        name: ref.name,\n        info: ref.info,\n        configSchema: ref.configSchema,\n      });\n    });\n}\n\nexport function listKnownModels(options?: GoogleAIPluginOptions) {\n  return Object.keys(KNOWN_MODELS).map((name: string) =>\n    defineModel(name, options)\n  );\n}\n\nexport function defineModel(\n  name: string,\n  pluginOptions?: GoogleAIPluginOptions\n): ModelAction<LyriaConfigSchemaType> {\n  checkApiKey(pluginOptions?.apiKey);\n  const ref = model(name);\n  const clientOptions: ClientOptions = {\n    apiVersion: pluginOptions?.apiVersion,\n    baseUrl: pluginOptions?.baseUrl,\n    customHeaders: pluginOptions?.customHeaders,\n    experimental_debugTraces: pluginOptions?.experimental_debugTraces,\n  };\n\n  return pluginModel(\n    {\n      name: ref.name,\n      ...ref.info,\n      configSchema: ref.configSchema,\n    },\n    async (request) => {\n      const {\n        apiKey: apiKeyConfig,\n        baseUrl,\n        apiVersion,\n        responseModalities,\n        ...rest\n      } = request.config || {};\n\n      const apiKey = calculateApiKey(pluginOptions?.apiKey, apiKeyConfig);\n      const newClientOptions: ClientOptions = {\n        ...clientOptions,\n        apiKey,\n        baseUrl: baseUrl || clientOptions.baseUrl,\n        apiVersion: apiVersion || clientOptions.apiVersion,\n      };\n\n      const messages = structuredClone(request.messages);\n\n      let responseModalitiesConverted: ResponseModality[] = ['audio', 'text'];\n      if (responseModalities) {\n        responseModalitiesConverted = responseModalities.map(\n          (m) => m.toLowerCase() as ResponseModality\n        );\n      }\n\n      const req: CreateInteractionRequest = {\n        model: extractVersion(ref),\n        input: toInteractionSteps(ensureToolIds(messages)),\n        response_modalities: responseModalitiesConverted,\n        ...rest,\n      };\n\n      const response = await createInteraction(apiKey, req, newClientOptions);\n\n      return fromInteractionSync(response);\n    }\n  );\n}\n\nexport const TEST_ONLY = { KNOWN_MODELS };\n"],"mappings":"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","names":[]}