{"version":3,"sources":["../../src/vertexai/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 {\n  ActionMetadata,\n  GenerateRequest,\n  modelActionMetadata,\n  modelRef,\n  ModelReference,\n  z,\n} from 'genkit';\nimport { ModelAction, ModelInfo } from 'genkit/model';\nimport { model as pluginModel } from 'genkit/plugin';\nimport {\n  ensureToolIds,\n  fromInteractionSync,\n  toInteractionSteps,\n} from '../common/interaction-converters.mjs';\nimport {\n  CreateInteractionRequest,\n  ResponseModality,\n} from '../common/interaction-types.mjs';\nimport { isKnownKey } from '../common/utils.mjs';\nimport { createInteraction, lyriaPredict } from './client.mjs';\nimport { fromLyriaResponse, toLyriaPredictRequest } from './converters.mjs';\nimport { ClientOptions, Model, VertexPluginOptions } from './types.mjs';\nimport {\n  calculateRequestOptions,\n  checkModelName,\n  extractVersion,\n  shouldUseLegacyEndpoint,\n  toInteractionsClientOptions,\n} from './utils.mjs';\n\nexport const LyriaConfigSchema = z\n  .object({\n    negativePrompt: z\n      .string()\n      .optional()\n      .describe(\n        'Optional. A description of what to exclude from the generated audio.'\n      ),\n    seed: z\n      .number()\n      .optional()\n      .describe(\n        'Optional. A seed for deterministic generation. If provided, the model will attempt to produce the same audio given the same prompt and other parameters. Cannot be used with sample_count in the same request.'\n      ),\n    sampleCount: z\n      .number()\n      .optional()\n      .describe(\n        'Optional. The number of audio samples to generate. Default is 1 if not specified and seed is not used. Cannot be used with seed in the same request.'\n      ),\n    location: z\n      .string()\n      .describe(\n        'Lyria is only available in global. If you initialize your plugin with a different region, you must set this to global.'\n      )\n      .optional(),\n  })\n  .passthrough();\nexport type LyriaConfigSchemaType = typeof LyriaConfigSchema;\nexport type LyriaConfig = z.infer<LyriaConfigSchemaType>;\n\nexport const Lyria3ConfigSchema = z\n  .object({\n    location: z\n      .string()\n      .describe(\n        'Lyria is only available in global. If you initialize your plugin with a different region, you must set this to global.'\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();\nexport type Lyria3ConfigSchemaType = typeof Lyria3ConfigSchema;\nexport type Lyria3Config = z.infer<Lyria3ConfigSchemaType>;\n\ntype ConfigSchemaType = LyriaConfigSchemaType | Lyria3ConfigSchemaType;\ntype ConfigSchema = z.infer<ConfigSchemaType>;\n\nfunction isLegacyLyriaRequest(\n  request: GenerateRequest<ConfigSchemaType>,\n  name: string\n): request is GenerateRequest<LyriaConfigSchemaType> {\n  return shouldUseLegacyEndpoint(name);\n}\n\nfunction isLyria3Request(\n  request: GenerateRequest<ConfigSchemaType>,\n  name: string\n): request is GenerateRequest<Lyria3ConfigSchemaType> {\n  return !shouldUseLegacyEndpoint(name);\n}\n\nfunction commonRef(\n  name: string,\n  info?: ModelInfo,\n  configSchema: ConfigSchemaType = Lyria3ConfigSchema\n): ModelReference<ConfigSchemaType> {\n  return modelRef({\n    name: `vertexai/${name}`,\n    configSchema,\n    info: info ?? {\n      supports: {\n        media: true,\n        multiturn: false,\n        tools: false,\n        systemRole: false,\n        output: ['text', 'media'],\n      },\n    },\n  });\n}\n\nconst GENERIC_MODEL = commonRef('lyria');\nconst GENERIC_LEGACY_MODEL = commonRef(\n  'lyria-002',\n  {\n    supports: {\n      media: true,\n      multiturn: false,\n      tools: false,\n      systemRole: false,\n      output: ['media'],\n    },\n  },\n  LyriaConfigSchema\n);\n\nconst KNOWN_LYRIA_LEGACY_MODELS = {\n  'lyria-002': commonRef(\n    'lyria-002',\n    { ...GENERIC_LEGACY_MODEL.info },\n    LyriaConfigSchema\n  ),\n} as const;\nexport type KnownLyriaLegacyModels = keyof typeof KNOWN_LYRIA_LEGACY_MODELS; // For autocorrect\nexport type LyriaLegacyModelName = `lyria-002`;\n\nconst KNOWN_LYRIA_INTERACTIONS_MODELS = {\n  'lyria-3-clip-preview': commonRef('lyria-3-clip-preview'),\n  'lyria-3-pro-preview': commonRef('lyria-3-pro-preview'),\n} as const;\nexport type KnownLyriaInteractionsModels =\n  keyof typeof KNOWN_LYRIA_INTERACTIONS_MODELS;\n\nconst KNOWN_MODELS = {\n  ...KNOWN_LYRIA_LEGACY_MODELS,\n  ...KNOWN_LYRIA_INTERACTIONS_MODELS,\n};\nexport type KnownModels = keyof typeof KNOWN_MODELS;\n\n// Models we no longer suggest, but that still work: they still resolve and\n// are still registered as actions, but aren't in the KnownModels type, so\n// they don't show up in autocomplete. Set `stage` on each one (keeping the\n// default `supports`). Remove a model once the server returns 404 for it.\nconst HIDDEN_MODELS = {} as const;\n\nconst ALL_MODELS = {\n  ...HIDDEN_MODELS,\n  ...KNOWN_MODELS,\n};\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: ConfigSchema = {}\n): ModelReference<ConfigSchemaType> {\n  const name = checkModelName(version);\n\n  if (isKnownKey(name, ALL_MODELS)) {\n    return ALL_MODELS[name].withConfig(config);\n  }\n\n  return modelRef({\n    name: `vertexai/${name}`,\n    config,\n    configSchema: Lyria3ConfigSchema,\n    info: { ...GENERIC_MODEL.info },\n  });\n}\n\nexport function listActions(models: Model[]): ActionMetadata[] {\n  return models\n    .filter((m: Model) => isLyriaModelName(m.name))\n    .map((m: Model) => {\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(\n  clientOptions: ClientOptions,\n  pluginOptions?: VertexPluginOptions\n) {\n  return Object.keys(ALL_MODELS).map((name: string) =>\n    defineModel(name, clientOptions, pluginOptions)\n  );\n}\n\nexport function defineModel(\n  name: string,\n  clientOptions: ClientOptions,\n  pluginOptions?: VertexPluginOptions\n): ModelAction<ConfigSchemaType> {\n  const ref = model(name);\n\n  return pluginModel(\n    {\n      name: ref.name,\n      ...ref.info,\n      configSchema: ref.configSchema,\n    },\n    async (request, { abortSignal }) => {\n      const clientOpt = calculateRequestOptions(\n        { ...clientOptions, signal: abortSignal },\n        request.config\n      );\n      if (isLegacyLyriaRequest(request, name)) {\n        const lyriaPredictRequest = toLyriaPredictRequest(request);\n\n        const response = await lyriaPredict(\n          extractVersion(ref),\n          lyriaPredictRequest,\n          clientOpt\n        );\n\n        if (!response.predictions || response.predictions.length == 0) {\n          throw new Error(\n            'Model returned no predictions. Possibly due to content filters.'\n          );\n        }\n\n        return fromLyriaResponse(response, request);\n      } else if (isLyria3Request(request, name)) {\n        const messages = [...request.messages];\n        if (messages.length === 0) throw new Error('No messages provided');\n\n        let responseModalitiesConverted: ResponseModality[] = ['audio', 'text'];\n        if (request.config?.responseModalities) {\n          responseModalitiesConverted = request.config.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        };\n\n        // Lyria 3 is only on global: a defaulted location becomes global.\n        const response = await createInteraction(\n          req,\n          toInteractionsClientOptions(clientOpt)\n        );\n\n        return fromInteractionSync(response);\n      } else {\n        throw new Error(`Unsupported model config schema for ${name}`);\n      }\n    }\n  );\n}\n\nexport const TEST_ONLY = {\n  GENERIC_MODEL,\n  KNOWN_MODELS,\n  KNOWN_LYRIA_LEGACY_MODELS,\n  KNOWN_LYRIA_INTERACTIONS_MODELS,\n  HIDDEN_MODELS,\n  ALL_MODELS,\n};\n"],"mappings":"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","names":[]}