{"version":3,"sources":["../src/image.ts"],"sourcesContent":["/**\n * Copyright 2024 The Fire Company\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 */\nimport type {\n  GenerateRequest,\n  GenerateResponseData,\n  ModelReference,\n} from 'genkit';\nimport { Message, modelRef, z } from 'genkit';\nimport { ModelAction, ModelInfo } from 'genkit/model';\nimport { model } from 'genkit/plugin';\nimport OpenAI from 'openai';\nimport type {\n  ImageGenerateParams,\n  ImagesResponse,\n} from 'openai/resources/images.mjs';\nimport { PluginOptions } from './index.js';\nimport { maybeCreateRequestScopedOpenAIClient, toModelName } from './utils.js';\n\nexport type ImageRequestBuilder = (\n  req: GenerateRequest,\n  params: ImageGenerateParams\n) => void;\n\nexport const IMAGE_GENERATION_MODEL_INFO: ModelInfo = {\n  supports: {\n    media: false,\n    output: ['media'],\n    multiturn: false,\n    systemRole: false,\n    tools: false,\n  },\n};\n\nexport const ImageGenerationCommonConfigSchema = z.object({\n  size: z.enum(['1024x1024', '1792x1024', '1024x1792']).optional(),\n  style: z.enum(['vivid', 'natural']).optional(),\n  user: z.string().optional(),\n  n: z.number().int().min(1).max(10).default(1),\n  quality: z.enum(['standard', 'hd']).optional(),\n  response_format: z.enum(['b64_json', 'url']).default('b64_json').optional(),\n});\n\nfunction toImageGenerateParams(\n  modelName: string,\n  request: GenerateRequest,\n  requestBuilder?: ImageRequestBuilder\n): ImageGenerateParams {\n  const {\n    temperature,\n    version: modelVersion,\n    maxOutputTokens,\n    stopSequences,\n    topK,\n    topP,\n    response_format,\n    ...restOfConfig\n  } = request.config ?? {};\n\n  let options: ImageGenerateParams = {\n    model: modelVersion ?? modelName,\n    prompt: new Message(request.messages[0]).text,\n    response_format: response_format || 'b64_json',\n  };\n  if (requestBuilder) {\n    requestBuilder(request, options);\n  } else {\n    options = { ...options, ...restOfConfig };\n  }\n  for (const k in options) {\n    if (options[k] === undefined) {\n      delete options[k];\n    }\n  }\n  return options;\n}\n\nfunction toGenerateResponse(result: ImagesResponse): GenerateResponseData {\n  const images = result.data;\n  if (!images) {\n    return { finishReason: 'stop' };\n  } else {\n    const content = (result.data ?? []).map((image) => ({\n      media: {\n        contentType: 'image/png',\n        url: image.url || `data:image/png;base64,${image.b64_json}`,\n      },\n    }));\n    return { message: { role: 'model', content }, raw: result };\n  }\n}\n\n/**\n * Method to define a new Genkit Model that is compatible with Open AI\n * Images API. \n *\n * These models are to be used to create images from a user prompt.\n *\n * @param params An object containing parameters for defining the OpenAI\n * image model.\n * @param params.ai The Genkit AI instance.\n * @param params.name The name of the model.\n * @param params.client The OpenAI client instance.\n * @param params.modelRef Optional reference to the model's configuration and\n * custom options.\n\n * @returns the created {@link ModelAction}\n */\nexport function defineCompatOpenAIImageModel<\n  CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n  name: string;\n  client: OpenAI;\n  pluginOptions?: PluginOptions;\n  modelRef?: ModelReference<CustomOptions>;\n  requestBuilder?: ImageRequestBuilder;\n}): ModelAction<CustomOptions> {\n  const {\n    name,\n    client: defaultClient,\n    pluginOptions,\n    modelRef,\n    requestBuilder,\n  } = params;\n\n  const modelName = toModelName(name, pluginOptions?.name);\n  const actionName =\n    modelRef?.name ?? `${pluginOptions?.name ?? 'compat-oai'}/${modelName}`;\n\n  return model(\n    {\n      name: actionName,\n      ...modelRef?.info,\n      configSchema: modelRef?.configSchema,\n    },\n    async (request, { abortSignal }) => {\n      const client = maybeCreateRequestScopedOpenAIClient(\n        pluginOptions,\n        request,\n        defaultClient\n      );\n      const result = await client.images.generate(\n        toImageGenerateParams(modelName, request, requestBuilder),\n        { signal: abortSignal }\n      );\n      return toGenerateResponse(result);\n    }\n  );\n}\n\n/** Image generation ModelRef helper, with reasonable defaults for\n * OpenAI-compatible providers */\nexport function compatOaiImageModelRef<\n  CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n  name: string;\n  info?: ModelInfo;\n  configSchema?: CustomOptions;\n  config?: any;\n  namespace?: string;\n}) {\n  const {\n    name,\n    info = IMAGE_GENERATION_MODEL_INFO,\n    configSchema,\n    config = undefined,\n    namespace,\n  } = params;\n  return modelRef({\n    name,\n    configSchema:\n      configSchema || (ImageGenerationCommonConfigSchema as z.AnyZodObject),\n    info,\n    config,\n    namespace,\n  });\n}\n"],"mappings":"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","names":["modelRef"]}