UNPKG

@genkit-ai/compat-oai

Version:

Genkit AI framework plugin for OpenAI APIs.

1 lines 6.16 kB
{"version":3,"sources":["../../src/openai/whisper.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 type { ModelReference } from 'genkit';\nimport { modelRef, z } from 'genkit';\nimport type { ModelAction, ModelInfo } from 'genkit/model';\nimport { model } from 'genkit/plugin';\nimport OpenAI from 'openai';\nimport {\n TranscriptionConfigSchema,\n toSttRequest,\n transcriptionToGenerateResponse,\n} from '../audio.mjs';\nimport type { PluginOptions } from '../index.mjs';\nimport {\n toTranslationRequest,\n translationToGenerateResponse,\n} from '../translate.mjs';\nimport { maybeCreateRequestScopedOpenAIClient, toModelName } from '../utils.mjs';\n\nexport const WHISPER_MODEL_INFO: ModelInfo = {\n supports: {\n media: true,\n output: ['text', 'json'],\n multiturn: false,\n systemRole: false,\n tools: false,\n },\n};\n\n/**\n * Config schema for Whisper models. Extends the transcription config with\n * a `translate` flag that switches between transcription and translation APIs.\n */\nexport const WhisperConfigSchema = TranscriptionConfigSchema.extend({\n /** When true, uses Translation API instead of Transcription. Default: false */\n translate: z.boolean().optional().default(false),\n});\n\n/**\n * Method to define an OpenAI Whisper model that can perform both transcription and\n * translation based on the `translate` config flag.\n *\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 defineOpenAIWhisperModel<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n pluginOptions?: PluginOptions;\n}): ModelAction {\n const { name, client: defaultClient, pluginOptions, modelRef } = params;\n const modelName = toModelName(name, pluginOptions?.name);\n const actionName =\n modelRef?.name ?? `${pluginOptions?.name ?? 'openai'}/${modelName}`;\n\n return model(\n {\n name: actionName,\n ...modelRef?.info,\n configSchema: modelRef?.configSchema,\n },\n async (request, { abortSignal }) => {\n const { translate, ...cleanConfig } = (request.config ?? {}) as Record<\n string,\n unknown\n >;\n const cleanRequest = { ...request, config: cleanConfig };\n const client = maybeCreateRequestScopedOpenAIClient(\n pluginOptions,\n request,\n defaultClient\n );\n\n if (translate === true) {\n const params = toTranslationRequest(modelName, cleanRequest);\n const result = await client.audio.translations.create(params, {\n signal: abortSignal,\n });\n return translationToGenerateResponse(result);\n } else {\n const params = toSttRequest(modelName, cleanRequest);\n // Explicitly setting stream to false ensures we use the non-streaming overload\n const result = await client.audio.transcriptions.create(\n {\n ...params,\n stream: false,\n },\n { signal: abortSignal }\n );\n return transcriptionToGenerateResponse(result);\n }\n }\n );\n}\n\n/** OpenAI whisper ModelRef helper. */\nexport function openAIWhisperModelRef<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n name: string;\n info?: ModelInfo;\n configSchema?: CustomOptions;\n config?: any;\n}) {\n const {\n name,\n info = WHISPER_MODEL_INFO,\n configSchema,\n config = undefined,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (WhisperConfigSchema as any),\n info,\n config,\n namespace: 'openai',\n });\n}\n\nexport const SUPPORTED_WHISPER_MODELS = {\n 'whisper-1': openAIWhisperModelRef({\n name: 'whisper-1',\n }),\n};\n"],"mappings":"AAkBA,SAAS,UAAU,SAAS;AAE5B,SAAS,aAAa;AAEtB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,sCAAsC,mBAAmB;AAE3D,MAAM,qBAAgC;AAAA,EAC3C,UAAU;AAAA,IACR,OAAO;AAAA,IACP,QAAQ,CAAC,QAAQ,MAAM;AAAA,IACvB,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AACF;AAMO,MAAM,sBAAsB,0BAA0B,OAAO;AAAA;AAAA,EAElE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AACjD,CAAC;AAcM,SAAS,yBAEd,QAKc;AACd,QAAM,EAAE,MAAM,QAAQ,eAAe,eAAe,UAAAA,UAAS,IAAI;AACjE,QAAM,YAAY,YAAY,MAAM,eAAe,IAAI;AACvD,QAAM,aACJA,WAAU,QAAQ,GAAG,eAAe,QAAQ,QAAQ,IAAI,SAAS;AAEnE,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,GAAGA,WAAU;AAAA,MACb,cAAcA,WAAU;AAAA,IAC1B;AAAA,IACA,OAAO,SAAS,EAAE,YAAY,MAAM;AAClC,YAAM,EAAE,WAAW,GAAG,YAAY,IAAK,QAAQ,UAAU,CAAC;AAI1D,YAAM,eAAe,EAAE,GAAG,SAAS,QAAQ,YAAY;AACvD,YAAM,SAAS;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,cAAc,MAAM;AACtB,cAAMC,UAAS,qBAAqB,WAAW,YAAY;AAC3D,cAAM,SAAS,MAAM,OAAO,MAAM,aAAa,OAAOA,SAAQ;AAAA,UAC5D,QAAQ;AAAA,QACV,CAAC;AACD,eAAO,8BAA8B,MAAM;AAAA,MAC7C,OAAO;AACL,cAAMA,UAAS,aAAa,WAAW,YAAY;AAEnD,cAAM,SAAS,MAAM,OAAO,MAAM,eAAe;AAAA,UAC/C;AAAA,YACE,GAAGA;AAAA,YACH,QAAQ;AAAA,UACV;AAAA,UACA,EAAE,QAAQ,YAAY;AAAA,QACxB;AACA,eAAO,gCAAgC,MAAM;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AACF;AAGO,SAAS,sBAEd,QAKC;AACD,QAAM;AAAA,IACJ;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,SAAS;AAAA,EACX,IAAI;AACJ,SAAO,SAAS;AAAA,IACd;AAAA,IACA,cAAc,gBAAiB;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb,CAAC;AACH;AAEO,MAAM,2BAA2B;AAAA,EACtC,aAAa,sBAAsB;AAAA,IACjC,MAAM;AAAA,EACR,CAAC;AACH;","names":["modelRef","params"]}