{"version":3,"sources":["../../src/openai/index.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 */\n\nimport {\n  ActionMetadata,\n  embedderActionMetadata,\n  embedderRef,\n  EmbedderReference,\n  modelActionMetadata,\n  ModelReference,\n  z,\n} from 'genkit';\nimport { type GenkitPluginV2, type ResolvableAction } from 'genkit/plugin';\nimport { type ActionType } from 'genkit/registry';\nimport OpenAI from 'openai';\nimport {\n  defineCompatOpenAISpeechModel,\n  defineCompatOpenAITranscriptionModel,\n  SpeechConfigSchema,\n  TranscriptionConfigSchema,\n} from '../audio.mjs';\nimport { defineCompatOpenAIEmbedder } from '../embedder.mjs';\nimport {\n  defineCompatOpenAIImageModel,\n  ImageGenerationCommonConfigSchema,\n} from '../image.mjs';\nimport { openAICompatible, PluginOptions } from '../index.mjs';\nimport { defineCompatOpenAIModel } from '../model.mjs';\nimport {\n  gptImage1RequestBuilder,\n  openAIImageModelRef,\n  SUPPORTED_IMAGE_MODELS,\n} from './dalle.mjs';\nimport {\n  SUPPORTED_EMBEDDING_MODELS,\n  TextEmbeddingConfigSchema,\n} from './embedder.mjs';\nimport {\n  OpenAIChatCompletionConfigSchema,\n  openAIModelRef,\n  SUPPORTED_GPT_MODELS,\n} from './gpt.mjs';\nimport { openAITranscriptionModelRef, SUPPORTED_STT_MODELS } from './stt.mjs';\nimport { openAISpeechModelRef, SUPPORTED_TTS_MODELS } from './tts.mjs';\nimport {\n  defineOpenAIWhisperModel,\n  openAIWhisperModelRef,\n  SUPPORTED_WHISPER_MODELS,\n  WhisperConfigSchema,\n} from './whisper.mjs';\n\nexport type OpenAIPluginOptions = Omit<PluginOptions, 'name' | 'baseURL'>;\n\nconst UNSUPPORTED_MODEL_MATCHERS = ['babbage', 'davinci', 'codex'];\n\nfunction createResolver(pluginOptions: PluginOptions) {\n  return async (client: OpenAI, actionType: ActionType, actionName: string) => {\n    if (actionType === 'embedder') {\n      return defineCompatOpenAIEmbedder({\n        name: actionName,\n        client,\n        pluginOptions,\n      });\n    } else if (\n      actionName.includes('gpt-image-1') ||\n      actionName.includes('dall-e')\n    ) {\n      const modelRef = openAIImageModelRef({ name: actionName });\n      return defineCompatOpenAIImageModel({\n        name: modelRef.name,\n        client,\n        pluginOptions,\n        modelRef,\n      });\n    } else if (actionName.includes('tts')) {\n      const modelRef = openAISpeechModelRef({ name: actionName });\n      return defineCompatOpenAISpeechModel({\n        name: modelRef.name,\n        client,\n        pluginOptions,\n        modelRef,\n      });\n    } else if (actionName.includes('whisper')) {\n      const modelRef = openAIWhisperModelRef({ name: actionName });\n      return defineOpenAIWhisperModel({\n        name: modelRef.name,\n        client,\n        pluginOptions,\n        modelRef,\n      });\n    } else if (actionName.includes('transcribe')) {\n      const modelRef = openAITranscriptionModelRef({\n        name: actionName,\n      });\n      return defineCompatOpenAITranscriptionModel({\n        name: modelRef.name,\n        client,\n        pluginOptions,\n        modelRef,\n      });\n    } else {\n      const modelRef = openAIModelRef({ name: actionName });\n      return defineCompatOpenAIModel({\n        name: modelRef.name,\n        client,\n        pluginOptions,\n        modelRef,\n      });\n    }\n  };\n}\n\nfunction filterOpenAiModels(model: OpenAI.Model): boolean {\n  return !UNSUPPORTED_MODEL_MATCHERS.some((m) => model.id.includes(m));\n}\n\nconst listActions = async (client: OpenAI): Promise<ActionMetadata[]> => {\n  return await client.models.list().then((response) =>\n    response.data.filter(filterOpenAiModels).map((model: OpenAI.Model) => {\n      if (model.id.includes('embedding')) {\n        return embedderActionMetadata({\n          name: model.id,\n          configSchema: TextEmbeddingConfigSchema,\n          info: SUPPORTED_EMBEDDING_MODELS[model.id]?.info,\n        });\n      } else if (\n        model.id.includes('gpt-image-1') ||\n        model.id.includes('dall-e')\n      ) {\n        const modelRef =\n          SUPPORTED_IMAGE_MODELS[model.id] ??\n          openAIImageModelRef({ name: model.id });\n        return modelActionMetadata({\n          name: modelRef.name,\n          info: modelRef.info,\n          configSchema: modelRef.configSchema,\n        });\n      } else if (model.id.includes('tts')) {\n        const modelRef =\n          SUPPORTED_TTS_MODELS[model.id] ??\n          openAISpeechModelRef({ name: model.id });\n        return modelActionMetadata({\n          name: modelRef.name,\n          info: modelRef.info,\n          configSchema: modelRef.configSchema,\n        });\n      } else if (model.id.includes('whisper')) {\n        const modelRef =\n          SUPPORTED_WHISPER_MODELS[model.id] ??\n          openAIWhisperModelRef({ name: model.id });\n        return modelActionMetadata({\n          name: modelRef.name,\n          info: modelRef.info,\n          configSchema: modelRef.configSchema,\n        });\n      } else if (model.id.includes('transcribe')) {\n        const modelRef =\n          SUPPORTED_STT_MODELS[model.id] ??\n          openAITranscriptionModelRef({ name: model.id });\n        return modelActionMetadata({\n          name: modelRef.name,\n          info: modelRef.info,\n          configSchema: modelRef.configSchema,\n        });\n      } else {\n        const modelRef =\n          SUPPORTED_GPT_MODELS[model.id] ?? openAIModelRef({ name: model.id });\n        return modelActionMetadata({\n          name: modelRef.name,\n          info: modelRef.info,\n          configSchema: modelRef.configSchema,\n        });\n      }\n    })\n  );\n};\n\nexport function openAIPlugin(options?: OpenAIPluginOptions): GenkitPluginV2 {\n  const pluginOptions = { name: 'openai', ...options };\n  return openAICompatible({\n    name: 'openai',\n    ...options,\n    initializer: async (client) => {\n      const models = [] as ResolvableAction[];\n      models.push(\n        ...Object.values(SUPPORTED_GPT_MODELS).map((modelRef) =>\n          defineCompatOpenAIModel({\n            name: modelRef.name,\n            client,\n            pluginOptions,\n            modelRef,\n          })\n        )\n      );\n      models.push(\n        ...Object.values(SUPPORTED_EMBEDDING_MODELS).map((embedderRef) =>\n          defineCompatOpenAIEmbedder({\n            name: embedderRef.name,\n            client,\n            pluginOptions,\n            embedderRef,\n          })\n        )\n      );\n      models.push(\n        ...Object.values(SUPPORTED_TTS_MODELS).map((modelRef) =>\n          defineCompatOpenAISpeechModel({\n            name: modelRef.name,\n            client,\n            pluginOptions,\n            modelRef,\n          })\n        )\n      );\n      models.push(\n        ...Object.values(SUPPORTED_WHISPER_MODELS).map((modelRef) =>\n          defineOpenAIWhisperModel({\n            name: modelRef.name,\n            client,\n            pluginOptions,\n            modelRef,\n          })\n        )\n      );\n      models.push(\n        ...Object.values(SUPPORTED_STT_MODELS).map((modelRef) =>\n          defineCompatOpenAITranscriptionModel({\n            name: modelRef.name,\n            client,\n            pluginOptions,\n            modelRef,\n          })\n        )\n      );\n      models.push(\n        ...Object.values(SUPPORTED_IMAGE_MODELS).map((modelRef) =>\n          defineCompatOpenAIImageModel({\n            name: modelRef.name,\n            client,\n            pluginOptions,\n            modelRef,\n            requestBuilder: modelRef.name.includes('gpt-image-1')\n              ? gptImage1RequestBuilder\n              : undefined,\n          })\n        )\n      );\n      return models;\n    },\n    resolver: createResolver(pluginOptions),\n    listActions,\n  });\n}\n\nexport type OpenAIPlugin = {\n  (params?: OpenAIPluginOptions): GenkitPluginV2;\n  model(\n    name:\n      | keyof typeof SUPPORTED_IMAGE_MODELS\n      | (`dall-e${string}` & {})\n      | (`gpt-image-${string}` & {}),\n    config?: z.infer<typeof ImageGenerationCommonConfigSchema>\n  ): ModelReference<typeof ImageGenerationCommonConfigSchema>;\n  model(\n    name:\n      | keyof typeof SUPPORTED_TTS_MODELS\n      | (`tts-${string}` & {})\n      | (`${string}-tts` & {}),\n    config?: z.infer<typeof SpeechConfigSchema>\n  ): ModelReference<typeof SpeechConfigSchema>;\n  model(\n    name: keyof typeof SUPPORTED_WHISPER_MODELS | (`whisper-${string}` & {}),\n    config?: z.infer<typeof WhisperConfigSchema>\n  ): ModelReference<typeof WhisperConfigSchema>;\n  model(\n    name: keyof typeof SUPPORTED_STT_MODELS | (`${string}-transcribe` & {}),\n    config?: z.infer<typeof TranscriptionConfigSchema>\n  ): ModelReference<typeof TranscriptionConfigSchema>;\n  model(\n    name:\n      | keyof typeof SUPPORTED_GPT_MODELS\n      | (`gpt-${string}` & {})\n      | (`o${number}` & {}),\n    config?: z.infer<typeof OpenAIChatCompletionConfigSchema>\n  ): ModelReference<typeof OpenAIChatCompletionConfigSchema>;\n  model(name: string, config?: any): ModelReference<z.ZodTypeAny>;\n  embedder(\n    name:\n      | keyof typeof SUPPORTED_EMBEDDING_MODELS\n      | (`${string}-embedding-${string}` & {}),\n    config?: z.infer<typeof TextEmbeddingConfigSchema>\n  ): EmbedderReference<typeof TextEmbeddingConfigSchema>;\n  embedder(name: string, config?: any): EmbedderReference<z.ZodTypeAny>;\n};\n\nconst model = ((name: string, config?: any): ModelReference<z.ZodTypeAny> => {\n  if (name.includes('gpt-image-1') || name.includes('dall-e')) {\n    return openAIImageModelRef({\n      name,\n      config,\n    });\n  }\n  if (name.includes('tts')) {\n    return openAISpeechModelRef({\n      name,\n      config,\n    });\n  }\n  if (name.includes('whisper')) {\n    return openAIWhisperModelRef({\n      name,\n      config,\n    });\n  }\n  if (name.includes('transcribe')) {\n    return openAITranscriptionModelRef({\n      name,\n      config,\n    });\n  }\n  return openAIModelRef({\n    name,\n    config,\n  });\n}) as OpenAIPlugin['model'];\n\nconst embedder = ((\n  name: string,\n  config?: any\n): EmbedderReference<z.ZodTypeAny> => {\n  return embedderRef({\n    name,\n    config,\n    configSchema: TextEmbeddingConfigSchema,\n    namespace: 'openai',\n  });\n}) as OpenAIPlugin['embedder'];\n\n/**\n * This module provides an interface to the OpenAI models through the Genkit\n * plugin system. It allows users to interact with various models by providing\n * an API key and optional configuration.\n *\n * The main export is the `openai` plugin, which can be configured with an API\n * key either directly or through environment variables. It initializes the\n * OpenAI client and makes available the models for use.\n *\n * Exports:\n * - openai: The main plugin function to interact with OpenAI.\n *\n * Usage:\n * To use the models, initialize the openai plugin inside `configureGenkit` and\n * pass the configuration options. If no API key is provided in the options, the\n * environment variable `OPENAI_API_KEY` must be set.\n *\n * Example:\n * ```\n * import { openAI } from '@genkit-ai/compat-oai/openai';\n *\n * export default configureGenkit({\n *  plugins: [\n *    openai()\n *    ... // other plugins\n *  ]\n * });\n * ```\n */\nexport const openAI: OpenAIPlugin = Object.assign(openAIPlugin, {\n  model,\n  embedder,\n});\n\nexport default openAI;\n"],"mappings":"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","names":["model","embedderRef"]}