@genkit-ai/compat-oai 1.29.0 → 1.30.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/lib/{audio-CJ8rzf35.d.mts → audio-Cr0WtG4I.d.mts} +88 -11
  2. package/lib/{audio-CJ8rzf35.d.ts → audio-Cr0WtG4I.d.ts} +88 -11
  3. package/lib/audio.d.mts +1 -1
  4. package/lib/audio.d.ts +1 -1
  5. package/lib/audio.js.map +1 -1
  6. package/lib/audio.mjs.map +1 -1
  7. package/lib/deepseek/deepseek.d.mts +1 -1
  8. package/lib/deepseek/deepseek.d.ts +1 -1
  9. package/lib/deepseek/index.d.mts +1 -1
  10. package/lib/deepseek/index.d.ts +1 -1
  11. package/lib/embedder.d.mts +1 -1
  12. package/lib/embedder.d.ts +1 -1
  13. package/lib/image.d.mts +1 -1
  14. package/lib/image.d.ts +1 -1
  15. package/lib/index.d.mts +1 -1
  16. package/lib/index.d.ts +1 -1
  17. package/lib/index.js +7 -0
  18. package/lib/index.js.map +1 -1
  19. package/lib/index.mjs +8 -0
  20. package/lib/index.mjs.map +1 -1
  21. package/lib/model.d.mts +1 -1
  22. package/lib/model.d.ts +1 -1
  23. package/lib/openai/dalle.d.mts +1 -1
  24. package/lib/openai/dalle.d.ts +1 -1
  25. package/lib/openai/index.d.mts +4 -2
  26. package/lib/openai/index.d.ts +4 -2
  27. package/lib/openai/index.js +35 -3
  28. package/lib/openai/index.js.map +1 -1
  29. package/lib/openai/index.mjs +39 -3
  30. package/lib/openai/index.mjs.map +1 -1
  31. package/lib/openai/stt.d.mts +0 -1
  32. package/lib/openai/stt.d.ts +0 -1
  33. package/lib/openai/stt.js +0 -3
  34. package/lib/openai/stt.js.map +1 -1
  35. package/lib/openai/stt.mjs +0 -3
  36. package/lib/openai/stt.mjs.map +1 -1
  37. package/lib/openai/whisper.d.mts +160 -0
  38. package/lib/openai/whisper.d.ts +160 -0
  39. package/lib/openai/whisper.js +112 -0
  40. package/lib/openai/whisper.js.map +1 -0
  41. package/lib/openai/whisper.mjs +91 -0
  42. package/lib/openai/whisper.mjs.map +1 -0
  43. package/lib/translate.d.mts +10 -0
  44. package/lib/translate.d.ts +10 -0
  45. package/lib/translate.js +172 -0
  46. package/lib/translate.js.map +1 -0
  47. package/lib/translate.mjs +143 -0
  48. package/lib/translate.mjs.map +1 -0
  49. package/lib/utils.d.mts +1 -1
  50. package/lib/utils.d.ts +1 -1
  51. package/lib/xai/grok.d.mts +1 -1
  52. package/lib/xai/grok.d.ts +1 -1
  53. package/lib/xai/index.d.mts +1 -1
  54. package/lib/xai/index.d.ts +1 -1
  55. package/package.json +2 -2
@@ -2,7 +2,7 @@ import { EmbedderReference, EmbedderAction, GenerateRequest, z, ModelReference,
2
2
  import { ModelInfo, ModelAction, ToolDefinition } from 'genkit/model';
3
3
  import OpenAI, { ClientOptions } from 'openai';
4
4
  import { Response } from 'openai/core.mjs';
5
- import { SpeechCreateParams, TranscriptionCreateParams, Transcription } from 'openai/resources/audio/index.mjs';
5
+ import { TranslationCreateParams, TranslationCreateResponse, SpeechCreateParams, TranscriptionCreateParams, Transcription } from 'openai/resources/audio/index.mjs';
6
6
  import * as genkit_plugin from 'genkit/plugin';
7
7
  import { ResolvableAction } from 'genkit/plugin';
8
8
  import { ActionType } from 'genkit/registry';
@@ -275,6 +275,91 @@ declare function compatOaiModelRef<CustomOptions extends z.ZodTypeAny = z.ZodTyp
275
275
  namespace?: string;
276
276
  }): ModelReference<CustomOptions>;
277
277
 
278
+ /**
279
+ * Copyright 2024 The Fire Company
280
+ * Copyright 2024 Google LLC
281
+ *
282
+ * Licensed under the Apache License, Version 2.0 (the "License");
283
+ * you may not use this file except in compliance with the License.
284
+ * You may obtain a copy of the License at
285
+ *
286
+ * http://www.apache.org/licenses/LICENSE-2.0
287
+ *
288
+ * Unless required by applicable law or agreed to in writing, software
289
+ * distributed under the License is distributed on an "AS IS" BASIS,
290
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
291
+ * See the License for the specific language governing permissions and
292
+ * limitations under the License.
293
+ */
294
+
295
+ type TranslationRequestBuilder = (req: GenerateRequest, params: TranslationCreateParams) => void;
296
+ declare const TRANSLATION_MODEL_INFO: ModelInfo;
297
+ declare const TranslationConfigSchema: z.ZodObject<Pick<{
298
+ version: z.ZodOptional<z.ZodString>;
299
+ temperature: z.ZodOptional<z.ZodNumber>;
300
+ maxOutputTokens: z.ZodOptional<z.ZodNumber>;
301
+ topK: z.ZodOptional<z.ZodNumber>;
302
+ topP: z.ZodOptional<z.ZodNumber>;
303
+ stopSequences: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
304
+ apiKey: z.ZodOptional<z.ZodString>;
305
+ }, "temperature"> & {
306
+ response_format: z.ZodOptional<z.ZodEnum<["json", "text", "srt", "verbose_json", "vtt"]>>;
307
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<Pick<{
308
+ version: z.ZodOptional<z.ZodString>;
309
+ temperature: z.ZodOptional<z.ZodNumber>;
310
+ maxOutputTokens: z.ZodOptional<z.ZodNumber>;
311
+ topK: z.ZodOptional<z.ZodNumber>;
312
+ topP: z.ZodOptional<z.ZodNumber>;
313
+ stopSequences: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
314
+ apiKey: z.ZodOptional<z.ZodString>;
315
+ }, "temperature"> & {
316
+ response_format: z.ZodOptional<z.ZodEnum<["json", "text", "srt", "verbose_json", "vtt"]>>;
317
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<Pick<{
318
+ version: z.ZodOptional<z.ZodString>;
319
+ temperature: z.ZodOptional<z.ZodNumber>;
320
+ maxOutputTokens: z.ZodOptional<z.ZodNumber>;
321
+ topK: z.ZodOptional<z.ZodNumber>;
322
+ topP: z.ZodOptional<z.ZodNumber>;
323
+ stopSequences: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
324
+ apiKey: z.ZodOptional<z.ZodString>;
325
+ }, "temperature"> & {
326
+ response_format: z.ZodOptional<z.ZodEnum<["json", "text", "srt", "verbose_json", "vtt"]>>;
327
+ }, z.ZodTypeAny, "passthrough">>;
328
+ declare function toTranslationRequest(modelName: string, request: GenerateRequest, requestBuilder?: TranslationRequestBuilder): TranslationCreateParams;
329
+ declare function translationToGenerateResponse(result: TranslationCreateResponse | string): GenerateResponseData;
330
+ /**
331
+ * Method to define a new Genkit Model that is compatible with Open AI
332
+ * Translation API.
333
+ *
334
+ * These models are to be used to translate audio to text.
335
+ *
336
+ * @param params An object containing parameters for defining the OpenAI
337
+ * translation model.
338
+ * @param params.ai The Genkit AI instance.
339
+ * @param params.name The name of the model.
340
+ * @param params.client The OpenAI client instance.
341
+ * @param params.modelRef Optional reference to the model's configuration and
342
+ * custom options.
343
+ *
344
+ * @returns the created {@link ModelAction}
345
+ */
346
+ declare function defineCompatOpenAITranslationModel<CustomOptions extends z.ZodTypeAny = z.ZodTypeAny>(params: {
347
+ name: string;
348
+ client: OpenAI;
349
+ pluginOptions?: PluginOptions;
350
+ modelRef?: ModelReference<CustomOptions>;
351
+ requestBuilder?: TranslationRequestBuilder;
352
+ }): ModelAction<CustomOptions>;
353
+ /** Translation ModelRef helper, with reasonable defaults for
354
+ * OpenAI-compatible providers */
355
+ declare function compatOaiTranslationModelRef<CustomOptions extends z.ZodTypeAny = z.ZodTypeAny>(params: {
356
+ name: string;
357
+ info?: ModelInfo;
358
+ configSchema?: CustomOptions;
359
+ config?: any;
360
+ namespace?: string;
361
+ }): ModelReference<any>;
362
+
278
363
  interface PluginOptions extends Partial<Omit<ClientOptions, 'apiKey'>> {
279
364
  apiKey?: ClientOptions['apiKey'] | false;
280
365
  name: string;
@@ -355,15 +440,7 @@ declare const openAICompatible: (options: PluginOptions) => genkit_plugin.Genkit
355
440
 
356
441
  type SpeechRequestBuilder = (req: GenerateRequest, params: SpeechCreateParams) => void;
357
442
  type TranscriptionRequestBuilder = (req: GenerateRequest, params: TranscriptionCreateParams) => void;
358
- declare const TRANSCRIPTION_MODEL_INFO: {
359
- supports: {
360
- media: boolean;
361
- output: string[];
362
- multiturn: boolean;
363
- systemRole: boolean;
364
- tools: boolean;
365
- };
366
- };
443
+ declare const TRANSCRIPTION_MODEL_INFO: ModelInfo;
367
444
  declare const SPEECH_MODEL_INFO: ModelInfo;
368
445
  declare const TranscriptionConfigSchema: z.ZodObject<Pick<{
369
446
  version: z.ZodOptional<z.ZodString>;
@@ -545,4 +622,4 @@ declare function compatOaiTranscriptionModelRef<CustomOptions extends z.ZodTypeA
545
622
  namespace?: string;
546
623
  }): ModelReference<any>;
547
624
 
548
- export { speechToGenerateResponse as A, toSttRequest as B, ChatCompletionCommonConfigSchema as C, transcriptionToGenerateResponse as D, ImageGenerationCommonConfigSchema as I, type ModelRequestBuilder as M, type PluginOptions as P, RESPONSE_FORMAT_MEDIA_TYPES as R, SpeechConfigSchema as S, TranscriptionConfigSchema as T, type ImageRequestBuilder as a, IMAGE_GENERATION_MODEL_INFO as b, defineCompatOpenAIImageModel as c, defineCompatOpenAIEmbedder as d, compatOaiImageModelRef as e, toOpenAITool as f, toOpenAITextAndMedia as g, toOpenAIMessages as h, fromOpenAIToolCall as i, fromOpenAIChoice as j, fromOpenAIChunkChoice as k, toOpenAIRequestBody as l, defineCompatOpenAIModel as m, compatOaiModelRef as n, openAIModelRunner as o, openAICompatible as p, compatOaiSpeechModelRef as q, compatOaiTranscriptionModelRef as r, defineCompatOpenAISpeechModel as s, toOpenAIRole as t, defineCompatOpenAITranscriptionModel as u, type SpeechRequestBuilder as v, type TranscriptionRequestBuilder as w, TRANSCRIPTION_MODEL_INFO as x, SPEECH_MODEL_INFO as y, toTTSRequest as z };
625
+ export { defineCompatOpenAISpeechModel as A, defineCompatOpenAITranscriptionModel as B, ChatCompletionCommonConfigSchema as C, type SpeechRequestBuilder as D, type TranscriptionRequestBuilder as E, TRANSCRIPTION_MODEL_INFO as F, SPEECH_MODEL_INFO as G, toTTSRequest as H, ImageGenerationCommonConfigSchema as I, speechToGenerateResponse as J, toSttRequest as K, transcriptionToGenerateResponse as L, type ModelRequestBuilder as M, type PluginOptions as P, RESPONSE_FORMAT_MEDIA_TYPES as R, SpeechConfigSchema as S, TranscriptionConfigSchema as T, type ImageRequestBuilder as a, IMAGE_GENERATION_MODEL_INFO as b, defineCompatOpenAIImageModel as c, defineCompatOpenAIEmbedder as d, compatOaiImageModelRef as e, toOpenAITool as f, toOpenAITextAndMedia as g, toOpenAIMessages as h, fromOpenAIToolCall as i, fromOpenAIChoice as j, fromOpenAIChunkChoice as k, toOpenAIRequestBody as l, defineCompatOpenAIModel as m, compatOaiModelRef as n, openAIModelRunner as o, type TranslationRequestBuilder as p, TRANSLATION_MODEL_INFO as q, TranslationConfigSchema as r, toTranslationRequest as s, toOpenAIRole as t, translationToGenerateResponse as u, defineCompatOpenAITranslationModel as v, compatOaiTranslationModelRef as w, openAICompatible as x, compatOaiSpeechModelRef as y, compatOaiTranscriptionModelRef as z };
@@ -2,7 +2,7 @@ import { EmbedderReference, EmbedderAction, GenerateRequest, z, ModelReference,
2
2
  import { ModelInfo, ModelAction, ToolDefinition } from 'genkit/model';
3
3
  import OpenAI, { ClientOptions } from 'openai';
4
4
  import { Response } from 'openai/core.mjs';
5
- import { SpeechCreateParams, TranscriptionCreateParams, Transcription } from 'openai/resources/audio/index.mjs';
5
+ import { TranslationCreateParams, TranslationCreateResponse, SpeechCreateParams, TranscriptionCreateParams, Transcription } from 'openai/resources/audio/index.mjs';
6
6
  import * as genkit_plugin from 'genkit/plugin';
7
7
  import { ResolvableAction } from 'genkit/plugin';
8
8
  import { ActionType } from 'genkit/registry';
@@ -275,6 +275,91 @@ declare function compatOaiModelRef<CustomOptions extends z.ZodTypeAny = z.ZodTyp
275
275
  namespace?: string;
276
276
  }): ModelReference<CustomOptions>;
277
277
 
278
+ /**
279
+ * Copyright 2024 The Fire Company
280
+ * Copyright 2024 Google LLC
281
+ *
282
+ * Licensed under the Apache License, Version 2.0 (the "License");
283
+ * you may not use this file except in compliance with the License.
284
+ * You may obtain a copy of the License at
285
+ *
286
+ * http://www.apache.org/licenses/LICENSE-2.0
287
+ *
288
+ * Unless required by applicable law or agreed to in writing, software
289
+ * distributed under the License is distributed on an "AS IS" BASIS,
290
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
291
+ * See the License for the specific language governing permissions and
292
+ * limitations under the License.
293
+ */
294
+
295
+ type TranslationRequestBuilder = (req: GenerateRequest, params: TranslationCreateParams) => void;
296
+ declare const TRANSLATION_MODEL_INFO: ModelInfo;
297
+ declare const TranslationConfigSchema: z.ZodObject<Pick<{
298
+ version: z.ZodOptional<z.ZodString>;
299
+ temperature: z.ZodOptional<z.ZodNumber>;
300
+ maxOutputTokens: z.ZodOptional<z.ZodNumber>;
301
+ topK: z.ZodOptional<z.ZodNumber>;
302
+ topP: z.ZodOptional<z.ZodNumber>;
303
+ stopSequences: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
304
+ apiKey: z.ZodOptional<z.ZodString>;
305
+ }, "temperature"> & {
306
+ response_format: z.ZodOptional<z.ZodEnum<["json", "text", "srt", "verbose_json", "vtt"]>>;
307
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<Pick<{
308
+ version: z.ZodOptional<z.ZodString>;
309
+ temperature: z.ZodOptional<z.ZodNumber>;
310
+ maxOutputTokens: z.ZodOptional<z.ZodNumber>;
311
+ topK: z.ZodOptional<z.ZodNumber>;
312
+ topP: z.ZodOptional<z.ZodNumber>;
313
+ stopSequences: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
314
+ apiKey: z.ZodOptional<z.ZodString>;
315
+ }, "temperature"> & {
316
+ response_format: z.ZodOptional<z.ZodEnum<["json", "text", "srt", "verbose_json", "vtt"]>>;
317
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<Pick<{
318
+ version: z.ZodOptional<z.ZodString>;
319
+ temperature: z.ZodOptional<z.ZodNumber>;
320
+ maxOutputTokens: z.ZodOptional<z.ZodNumber>;
321
+ topK: z.ZodOptional<z.ZodNumber>;
322
+ topP: z.ZodOptional<z.ZodNumber>;
323
+ stopSequences: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
324
+ apiKey: z.ZodOptional<z.ZodString>;
325
+ }, "temperature"> & {
326
+ response_format: z.ZodOptional<z.ZodEnum<["json", "text", "srt", "verbose_json", "vtt"]>>;
327
+ }, z.ZodTypeAny, "passthrough">>;
328
+ declare function toTranslationRequest(modelName: string, request: GenerateRequest, requestBuilder?: TranslationRequestBuilder): TranslationCreateParams;
329
+ declare function translationToGenerateResponse(result: TranslationCreateResponse | string): GenerateResponseData;
330
+ /**
331
+ * Method to define a new Genkit Model that is compatible with Open AI
332
+ * Translation API.
333
+ *
334
+ * These models are to be used to translate audio to text.
335
+ *
336
+ * @param params An object containing parameters for defining the OpenAI
337
+ * translation model.
338
+ * @param params.ai The Genkit AI instance.
339
+ * @param params.name The name of the model.
340
+ * @param params.client The OpenAI client instance.
341
+ * @param params.modelRef Optional reference to the model's configuration and
342
+ * custom options.
343
+ *
344
+ * @returns the created {@link ModelAction}
345
+ */
346
+ declare function defineCompatOpenAITranslationModel<CustomOptions extends z.ZodTypeAny = z.ZodTypeAny>(params: {
347
+ name: string;
348
+ client: OpenAI;
349
+ pluginOptions?: PluginOptions;
350
+ modelRef?: ModelReference<CustomOptions>;
351
+ requestBuilder?: TranslationRequestBuilder;
352
+ }): ModelAction<CustomOptions>;
353
+ /** Translation ModelRef helper, with reasonable defaults for
354
+ * OpenAI-compatible providers */
355
+ declare function compatOaiTranslationModelRef<CustomOptions extends z.ZodTypeAny = z.ZodTypeAny>(params: {
356
+ name: string;
357
+ info?: ModelInfo;
358
+ configSchema?: CustomOptions;
359
+ config?: any;
360
+ namespace?: string;
361
+ }): ModelReference<any>;
362
+
278
363
  interface PluginOptions extends Partial<Omit<ClientOptions, 'apiKey'>> {
279
364
  apiKey?: ClientOptions['apiKey'] | false;
280
365
  name: string;
@@ -355,15 +440,7 @@ declare const openAICompatible: (options: PluginOptions) => genkit_plugin.Genkit
355
440
 
356
441
  type SpeechRequestBuilder = (req: GenerateRequest, params: SpeechCreateParams) => void;
357
442
  type TranscriptionRequestBuilder = (req: GenerateRequest, params: TranscriptionCreateParams) => void;
358
- declare const TRANSCRIPTION_MODEL_INFO: {
359
- supports: {
360
- media: boolean;
361
- output: string[];
362
- multiturn: boolean;
363
- systemRole: boolean;
364
- tools: boolean;
365
- };
366
- };
443
+ declare const TRANSCRIPTION_MODEL_INFO: ModelInfo;
367
444
  declare const SPEECH_MODEL_INFO: ModelInfo;
368
445
  declare const TranscriptionConfigSchema: z.ZodObject<Pick<{
369
446
  version: z.ZodOptional<z.ZodString>;
@@ -545,4 +622,4 @@ declare function compatOaiTranscriptionModelRef<CustomOptions extends z.ZodTypeA
545
622
  namespace?: string;
546
623
  }): ModelReference<any>;
547
624
 
548
- export { speechToGenerateResponse as A, toSttRequest as B, ChatCompletionCommonConfigSchema as C, transcriptionToGenerateResponse as D, ImageGenerationCommonConfigSchema as I, type ModelRequestBuilder as M, type PluginOptions as P, RESPONSE_FORMAT_MEDIA_TYPES as R, SpeechConfigSchema as S, TranscriptionConfigSchema as T, type ImageRequestBuilder as a, IMAGE_GENERATION_MODEL_INFO as b, defineCompatOpenAIImageModel as c, defineCompatOpenAIEmbedder as d, compatOaiImageModelRef as e, toOpenAITool as f, toOpenAITextAndMedia as g, toOpenAIMessages as h, fromOpenAIToolCall as i, fromOpenAIChoice as j, fromOpenAIChunkChoice as k, toOpenAIRequestBody as l, defineCompatOpenAIModel as m, compatOaiModelRef as n, openAIModelRunner as o, openAICompatible as p, compatOaiSpeechModelRef as q, compatOaiTranscriptionModelRef as r, defineCompatOpenAISpeechModel as s, toOpenAIRole as t, defineCompatOpenAITranscriptionModel as u, type SpeechRequestBuilder as v, type TranscriptionRequestBuilder as w, TRANSCRIPTION_MODEL_INFO as x, SPEECH_MODEL_INFO as y, toTTSRequest as z };
625
+ export { defineCompatOpenAISpeechModel as A, defineCompatOpenAITranscriptionModel as B, ChatCompletionCommonConfigSchema as C, type SpeechRequestBuilder as D, type TranscriptionRequestBuilder as E, TRANSCRIPTION_MODEL_INFO as F, SPEECH_MODEL_INFO as G, toTTSRequest as H, ImageGenerationCommonConfigSchema as I, speechToGenerateResponse as J, toSttRequest as K, transcriptionToGenerateResponse as L, type ModelRequestBuilder as M, type PluginOptions as P, RESPONSE_FORMAT_MEDIA_TYPES as R, SpeechConfigSchema as S, TranscriptionConfigSchema as T, type ImageRequestBuilder as a, IMAGE_GENERATION_MODEL_INFO as b, defineCompatOpenAIImageModel as c, defineCompatOpenAIEmbedder as d, compatOaiImageModelRef as e, toOpenAITool as f, toOpenAITextAndMedia as g, toOpenAIMessages as h, fromOpenAIToolCall as i, fromOpenAIChoice as j, fromOpenAIChunkChoice as k, toOpenAIRequestBody as l, defineCompatOpenAIModel as m, compatOaiModelRef as n, openAIModelRunner as o, type TranslationRequestBuilder as p, TRANSLATION_MODEL_INFO as q, TranslationConfigSchema as r, toTranslationRequest as s, toOpenAIRole as t, translationToGenerateResponse as u, defineCompatOpenAITranslationModel as v, compatOaiTranslationModelRef as w, openAICompatible as x, compatOaiSpeechModelRef as y, compatOaiTranscriptionModelRef as z };
package/lib/audio.d.mts CHANGED
@@ -3,7 +3,7 @@ import 'genkit/model';
3
3
  import 'openai';
4
4
  import 'openai/core.mjs';
5
5
  import 'openai/resources/audio/index.mjs';
6
- export { R as RESPONSE_FORMAT_MEDIA_TYPES, y as SPEECH_MODEL_INFO, S as SpeechConfigSchema, v as SpeechRequestBuilder, x as TRANSCRIPTION_MODEL_INFO, T as TranscriptionConfigSchema, w as TranscriptionRequestBuilder, q as compatOaiSpeechModelRef, r as compatOaiTranscriptionModelRef, s as defineCompatOpenAISpeechModel, u as defineCompatOpenAITranscriptionModel, A as speechToGenerateResponse, B as toSttRequest, z as toTTSRequest, D as transcriptionToGenerateResponse } from './audio-CJ8rzf35.mjs';
6
+ export { R as RESPONSE_FORMAT_MEDIA_TYPES, G as SPEECH_MODEL_INFO, S as SpeechConfigSchema, D as SpeechRequestBuilder, F as TRANSCRIPTION_MODEL_INFO, T as TranscriptionConfigSchema, E as TranscriptionRequestBuilder, y as compatOaiSpeechModelRef, z as compatOaiTranscriptionModelRef, A as defineCompatOpenAISpeechModel, B as defineCompatOpenAITranscriptionModel, J as speechToGenerateResponse, K as toSttRequest, H as toTTSRequest, L as transcriptionToGenerateResponse } from './audio-Cr0WtG4I.mjs';
7
7
  import 'genkit/plugin';
8
8
  import 'genkit/registry';
9
9
  import 'openai/resources/images.mjs';
package/lib/audio.d.ts CHANGED
@@ -3,7 +3,7 @@ import 'genkit/model';
3
3
  import 'openai';
4
4
  import 'openai/core.mjs';
5
5
  import 'openai/resources/audio/index.mjs';
6
- export { R as RESPONSE_FORMAT_MEDIA_TYPES, y as SPEECH_MODEL_INFO, S as SpeechConfigSchema, v as SpeechRequestBuilder, x as TRANSCRIPTION_MODEL_INFO, T as TranscriptionConfigSchema, w as TranscriptionRequestBuilder, q as compatOaiSpeechModelRef, r as compatOaiTranscriptionModelRef, s as defineCompatOpenAISpeechModel, u as defineCompatOpenAITranscriptionModel, A as speechToGenerateResponse, B as toSttRequest, z as toTTSRequest, D as transcriptionToGenerateResponse } from './audio-CJ8rzf35.js';
6
+ export { R as RESPONSE_FORMAT_MEDIA_TYPES, G as SPEECH_MODEL_INFO, S as SpeechConfigSchema, D as SpeechRequestBuilder, F as TRANSCRIPTION_MODEL_INFO, T as TranscriptionConfigSchema, E as TranscriptionRequestBuilder, y as compatOaiSpeechModelRef, z as compatOaiTranscriptionModelRef, A as defineCompatOpenAISpeechModel, B as defineCompatOpenAITranscriptionModel, J as speechToGenerateResponse, K as toSttRequest, H as toTTSRequest, L as transcriptionToGenerateResponse } from './audio-Cr0WtG4I.js';
7
7
  import 'genkit/plugin';
8
8
  import 'genkit/registry';
9
9
  import 'openai/resources/images.mjs';
package/lib/audio.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/audio.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 { GenerationCommonConfigSchema, Message, modelRef, z } from 'genkit';\nimport type { ModelAction, ModelInfo } from 'genkit/model';\nimport { model } from 'genkit/plugin';\nimport OpenAI from 'openai';\nimport { Response } from 'openai/core.mjs';\nimport type {\n SpeechCreateParams,\n Transcription,\n TranscriptionCreateParams,\n} from 'openai/resources/audio/index.mjs';\nimport { PluginOptions } from './index.js';\nimport { maybeCreateRequestScopedOpenAIClient, toModelName } from './utils.js';\n\nexport type SpeechRequestBuilder = (\n req: GenerateRequest,\n params: SpeechCreateParams\n) => void;\nexport type TranscriptionRequestBuilder = (\n req: GenerateRequest,\n params: TranscriptionCreateParams\n) => void;\n\nexport const TRANSCRIPTION_MODEL_INFO = {\n supports: {\n media: true,\n output: ['text', 'json'],\n multiturn: false,\n systemRole: false,\n tools: false,\n },\n};\n\nexport const SPEECH_MODEL_INFO: ModelInfo = {\n supports: {\n media: false,\n output: ['media'],\n multiturn: false,\n systemRole: false,\n tools: false,\n },\n};\n\nconst ChunkingStrategySchema = z.object({\n type: z.string(),\n prefix_padding_ms: z.number().int().optional(),\n silence_duration_ms: z.number().int().optional(),\n threshold: z.number().min(0).max(1.0).optional(),\n});\nexport const TranscriptionConfigSchema = GenerationCommonConfigSchema.pick({\n temperature: true,\n}).extend({\n chunking_strategy: z\n .union([z.literal('auto'), ChunkingStrategySchema])\n .optional(),\n include: z.array(z.any()).optional(),\n language: z.string().optional(),\n timestamp_granularities: z.array(z.enum(['word', 'segment'])).optional(),\n response_format: z\n .enum(['json', 'text', 'srt', 'verbose_json', 'vtt'])\n .optional(),\n // TODO stream support\n});\n\nexport const SpeechConfigSchema = z.object({\n voice: z\n .enum(['alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer'])\n .default('alloy'),\n speed: z.number().min(0.25).max(4.0).optional(),\n response_format: z\n .enum(['mp3', 'opus', 'aac', 'flac', 'wav', 'pcm'])\n .optional(),\n});\n\n/**\n * Supported media formats for Audio generation\n */\nexport const RESPONSE_FORMAT_MEDIA_TYPES = {\n mp3: 'audio/mpeg',\n opus: 'audio/opus',\n aac: 'audio/aac',\n flac: 'audio/flac',\n wav: 'audio/wav',\n pcm: 'audio/L16',\n};\n\nexport function toTTSRequest(\n modelName: string,\n request: GenerateRequest,\n requestBuilder?: SpeechRequestBuilder\n): SpeechCreateParams {\n const {\n voice,\n version: modelVersion,\n temperature,\n maxOutputTokens,\n stopSequences,\n topK,\n topP,\n ...restOfConfig\n } = request.config ?? {};\n\n let options: SpeechCreateParams = {\n model: modelVersion ?? modelName,\n input: new Message(request.messages[0]).text,\n voice: voice ?? 'alloy',\n };\n if (requestBuilder) {\n requestBuilder(request, options);\n } else {\n options = {\n ...options,\n ...restOfConfig, // passthorugh rest of the config\n };\n }\n for (const k in options) {\n if (options[k] === undefined) {\n delete options[k];\n }\n }\n return options;\n}\n\nexport async function speechToGenerateResponse(\n response: Response,\n responseFormat: 'mp3' | 'opus' | 'aac' | 'flac' | 'wav' | 'pcm' = 'mp3'\n): Promise<GenerateResponseData> {\n const resultArrayBuffer = await response.arrayBuffer();\n const resultBuffer = Buffer.from(new Uint8Array(resultArrayBuffer));\n const mediaType = RESPONSE_FORMAT_MEDIA_TYPES[responseFormat];\n return {\n message: {\n role: 'model',\n content: [\n {\n media: {\n contentType: mediaType,\n url: `data:${mediaType};base64,${resultBuffer.toString('base64')}`,\n },\n },\n ],\n },\n finishReason: 'stop',\n raw: response,\n };\n}\n\n/**\n * Method to define a new Genkit Model that is compatible with the Open AI Audio\n * API. \n *\n * These models are to be used to create audio speech from a given request.\n * @param params An object containing parameters for defining the OpenAI speech\n * 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 defineCompatOpenAISpeechModel<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: SpeechRequestBuilder;\n pluginOptions: PluginOptions;\n}): ModelAction {\n const {\n name,\n client: defaultClient,\n pluginOptions,\n modelRef,\n requestBuilder,\n } = params;\n const modelName = toModelName(name, pluginOptions?.name);\n const actionName = `${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 ttsRequest = toTTSRequest(modelName, request, requestBuilder);\n const client = maybeCreateRequestScopedOpenAIClient(\n pluginOptions,\n request,\n defaultClient\n );\n const result = await client.audio.speech.create(ttsRequest, {\n signal: abortSignal,\n });\n return await speechToGenerateResponse(result, ttsRequest.response_format);\n }\n );\n}\n\n/** Speech generation ModelRef helper, with reasonable defaults for\n * OpenAI-compatible providers */\nexport function compatOaiSpeechModelRef<\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 = SPEECH_MODEL_INFO,\n configSchema,\n config = undefined,\n namespace,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (SpeechConfigSchema as any),\n info,\n config,\n namespace,\n });\n}\n\nexport function toSttRequest(\n modelName: string,\n request: GenerateRequest,\n requestBuilder?: TranscriptionRequestBuilder\n): TranscriptionCreateParams {\n const message = new Message(request.messages[0]);\n const media = message.media;\n if (!media?.url) {\n throw new Error('No media found in the request');\n }\n const mediaBuffer = Buffer.from(\n media.url.slice(media.url.indexOf(',') + 1),\n 'base64'\n );\n const mediaFile = new File([mediaBuffer], 'input', {\n type:\n media.contentType ??\n media.url.slice('data:'.length, media.url.indexOf(';')),\n });\n const {\n temperature,\n version: modelVersion,\n maxOutputTokens,\n stopSequences,\n topK,\n topP,\n ...restOfConfig\n } = request.config ?? {};\n\n let options: TranscriptionCreateParams = {\n model: modelVersion ?? modelName,\n file: mediaFile,\n prompt: message.text,\n temperature,\n };\n if (requestBuilder) {\n requestBuilder(request, options);\n } else {\n options = {\n ...options,\n ...restOfConfig, // passthrough rest of the config\n };\n }\n const outputFormat = request.output?.format as 'json' | 'text' | 'media';\n const customFormat = request.config?.response_format;\n if (outputFormat && customFormat) {\n if (\n outputFormat === 'json' &&\n customFormat !== 'json' &&\n customFormat !== 'verbose_json'\n ) {\n throw new Error(\n `Custom response format ${customFormat} is not compatible with output format ${outputFormat}`\n );\n }\n }\n if (outputFormat === 'media') {\n throw new Error(`Output format ${outputFormat} is not supported.`);\n }\n options.response_format = customFormat || outputFormat || 'text';\n for (const k in options) {\n if (options[k] === undefined) {\n delete options[k];\n }\n }\n return options;\n}\n\nexport function transcriptionToGenerateResponse(\n result: Transcription | string\n): GenerateResponseData {\n return {\n message: {\n role: 'model',\n content: [\n {\n text: typeof result === 'string' ? result : result.text,\n },\n ],\n },\n finishReason: 'stop',\n raw: result,\n };\n}\n\n/**\n * Method to define a new Genkit Model that is compatible with Open AI\n * Transcriptions API. \n *\n * These models are to be used to transcribe audio to text.\n *\n * @param params An object containing parameters for defining the OpenAI\n * transcription 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 defineCompatOpenAITranscriptionModel<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n name: string;\n client: OpenAI;\n pluginOptions?: PluginOptions;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: TranscriptionRequestBuilder;\n}): ModelAction {\n const {\n name,\n pluginOptions,\n client: defaultClient,\n modelRef,\n requestBuilder,\n } = params;\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 params = toSttRequest(modelName, request, requestBuilder);\n const client = maybeCreateRequestScopedOpenAIClient(\n pluginOptions,\n request,\n defaultClient\n );\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/** Transcription ModelRef helper, with reasonable defaults for\n * OpenAI-compatible providers */\nexport function compatOaiTranscriptionModelRef<\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 = TRANSCRIPTION_MODEL_INFO,\n configSchema,\n config = undefined,\n namespace,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (TranscriptionConfigSchema as any),\n info,\n config,\n namespace,\n });\n}\n"],"mappings":"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","names":["modelRef","params"]}
1
+ {"version":3,"sources":["../src/audio.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 {\n GenerateRequest,\n GenerateResponseData,\n ModelReference,\n} from 'genkit';\nimport { GenerationCommonConfigSchema, Message, modelRef, z } from 'genkit';\nimport type { ModelAction, ModelInfo } from 'genkit/model';\nimport { model } from 'genkit/plugin';\nimport OpenAI from 'openai';\nimport { Response } from 'openai/core.mjs';\nimport type {\n SpeechCreateParams,\n Transcription,\n TranscriptionCreateParams,\n} from 'openai/resources/audio/index.mjs';\nimport { PluginOptions } from './index.js';\nimport { maybeCreateRequestScopedOpenAIClient, toModelName } from './utils.js';\n\nexport type SpeechRequestBuilder = (\n req: GenerateRequest,\n params: SpeechCreateParams\n) => void;\nexport type TranscriptionRequestBuilder = (\n req: GenerateRequest,\n params: TranscriptionCreateParams\n) => void;\n\nexport const TRANSCRIPTION_MODEL_INFO: ModelInfo = {\n supports: {\n media: true,\n output: ['text', 'json'],\n multiturn: false,\n systemRole: false,\n tools: false,\n },\n};\n\nexport const SPEECH_MODEL_INFO: ModelInfo = {\n supports: {\n media: false,\n output: ['media'],\n multiturn: false,\n systemRole: false,\n tools: false,\n },\n};\n\nconst ChunkingStrategySchema = z.object({\n type: z.string(),\n prefix_padding_ms: z.number().int().optional(),\n silence_duration_ms: z.number().int().optional(),\n threshold: z.number().min(0).max(1.0).optional(),\n});\nexport const TranscriptionConfigSchema = GenerationCommonConfigSchema.pick({\n temperature: true,\n}).extend({\n chunking_strategy: z\n .union([z.literal('auto'), ChunkingStrategySchema])\n .optional(),\n include: z.array(z.any()).optional(),\n language: z.string().optional(),\n timestamp_granularities: z.array(z.enum(['word', 'segment'])).optional(),\n response_format: z\n .enum(['json', 'text', 'srt', 'verbose_json', 'vtt'])\n .optional(),\n // TODO stream support\n});\n\nexport const SpeechConfigSchema = z.object({\n voice: z\n .enum(['alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer'])\n .default('alloy'),\n speed: z.number().min(0.25).max(4.0).optional(),\n response_format: z\n .enum(['mp3', 'opus', 'aac', 'flac', 'wav', 'pcm'])\n .optional(),\n});\n\n/**\n * Supported media formats for Audio generation\n */\nexport const RESPONSE_FORMAT_MEDIA_TYPES = {\n mp3: 'audio/mpeg',\n opus: 'audio/opus',\n aac: 'audio/aac',\n flac: 'audio/flac',\n wav: 'audio/wav',\n pcm: 'audio/L16',\n};\n\nexport function toTTSRequest(\n modelName: string,\n request: GenerateRequest,\n requestBuilder?: SpeechRequestBuilder\n): SpeechCreateParams {\n const {\n voice,\n version: modelVersion,\n temperature,\n maxOutputTokens,\n stopSequences,\n topK,\n topP,\n ...restOfConfig\n } = request.config ?? {};\n\n let options: SpeechCreateParams = {\n model: modelVersion ?? modelName,\n input: new Message(request.messages[0]).text,\n voice: voice ?? 'alloy',\n };\n if (requestBuilder) {\n requestBuilder(request, options);\n } else {\n options = {\n ...options,\n ...restOfConfig, // passthorugh rest of the config\n };\n }\n for (const k in options) {\n if (options[k] === undefined) {\n delete options[k];\n }\n }\n return options;\n}\n\nexport async function speechToGenerateResponse(\n response: Response,\n responseFormat: 'mp3' | 'opus' | 'aac' | 'flac' | 'wav' | 'pcm' = 'mp3'\n): Promise<GenerateResponseData> {\n const resultArrayBuffer = await response.arrayBuffer();\n const resultBuffer = Buffer.from(new Uint8Array(resultArrayBuffer));\n const mediaType = RESPONSE_FORMAT_MEDIA_TYPES[responseFormat];\n return {\n message: {\n role: 'model',\n content: [\n {\n media: {\n contentType: mediaType,\n url: `data:${mediaType};base64,${resultBuffer.toString('base64')}`,\n },\n },\n ],\n },\n finishReason: 'stop',\n raw: response,\n };\n}\n\n/**\n * Method to define a new Genkit Model that is compatible with the Open AI Audio\n * API. \n *\n * These models are to be used to create audio speech from a given request.\n * @param params An object containing parameters for defining the OpenAI speech\n * 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 defineCompatOpenAISpeechModel<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: SpeechRequestBuilder;\n pluginOptions: PluginOptions;\n}): ModelAction {\n const {\n name,\n client: defaultClient,\n pluginOptions,\n modelRef,\n requestBuilder,\n } = params;\n const modelName = toModelName(name, pluginOptions?.name);\n const actionName = `${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 ttsRequest = toTTSRequest(modelName, request, requestBuilder);\n const client = maybeCreateRequestScopedOpenAIClient(\n pluginOptions,\n request,\n defaultClient\n );\n const result = await client.audio.speech.create(ttsRequest, {\n signal: abortSignal,\n });\n return await speechToGenerateResponse(result, ttsRequest.response_format);\n }\n );\n}\n\n/** Speech generation ModelRef helper, with reasonable defaults for\n * OpenAI-compatible providers */\nexport function compatOaiSpeechModelRef<\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 = SPEECH_MODEL_INFO,\n configSchema,\n config = undefined,\n namespace,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (SpeechConfigSchema as any),\n info,\n config,\n namespace,\n });\n}\n\nexport function toSttRequest(\n modelName: string,\n request: GenerateRequest,\n requestBuilder?: TranscriptionRequestBuilder\n): TranscriptionCreateParams {\n const message = new Message(request.messages[0]);\n const media = message.media;\n if (!media?.url) {\n throw new Error('No media found in the request');\n }\n const mediaBuffer = Buffer.from(\n media.url.slice(media.url.indexOf(',') + 1),\n 'base64'\n );\n const mediaFile = new File([mediaBuffer], 'input', {\n type:\n media.contentType ??\n media.url.slice('data:'.length, media.url.indexOf(';')),\n });\n const {\n temperature,\n version: modelVersion,\n maxOutputTokens,\n stopSequences,\n topK,\n topP,\n ...restOfConfig\n } = request.config ?? {};\n\n let options: TranscriptionCreateParams = {\n model: modelVersion ?? modelName,\n file: mediaFile,\n prompt: message.text,\n temperature,\n };\n if (requestBuilder) {\n requestBuilder(request, options);\n } else {\n options = {\n ...options,\n ...restOfConfig, // passthrough rest of the config\n };\n }\n const outputFormat = request.output?.format as 'json' | 'text' | 'media';\n const customFormat = request.config?.response_format;\n if (outputFormat && customFormat) {\n if (\n outputFormat === 'json' &&\n customFormat !== 'json' &&\n customFormat !== 'verbose_json'\n ) {\n throw new Error(\n `Custom response format ${customFormat} is not compatible with output format ${outputFormat}`\n );\n }\n }\n if (outputFormat === 'media') {\n throw new Error(`Output format ${outputFormat} is not supported.`);\n }\n options.response_format = customFormat || outputFormat || 'text';\n for (const k in options) {\n if (options[k] === undefined) {\n delete options[k];\n }\n }\n return options;\n}\n\nexport function transcriptionToGenerateResponse(\n result: Transcription | string\n): GenerateResponseData {\n return {\n message: {\n role: 'model',\n content: [\n {\n text: typeof result === 'string' ? result : result.text,\n },\n ],\n },\n finishReason: 'stop',\n raw: result,\n };\n}\n\n/**\n * Method to define a new Genkit Model that is compatible with Open AI\n * Transcriptions API. \n *\n * These models are to be used to transcribe audio to text.\n *\n * @param params An object containing parameters for defining the OpenAI\n * transcription 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 defineCompatOpenAITranscriptionModel<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n name: string;\n client: OpenAI;\n pluginOptions?: PluginOptions;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: TranscriptionRequestBuilder;\n}): ModelAction {\n const {\n name,\n pluginOptions,\n client: defaultClient,\n modelRef,\n requestBuilder,\n } = params;\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 params = toSttRequest(modelName, request, requestBuilder);\n const client = maybeCreateRequestScopedOpenAIClient(\n pluginOptions,\n request,\n defaultClient\n );\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/** Transcription ModelRef helper, with reasonable defaults for\n * OpenAI-compatible providers */\nexport function compatOaiTranscriptionModelRef<\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 = TRANSCRIPTION_MODEL_INFO,\n configSchema,\n config = undefined,\n namespace,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (TranscriptionConfigSchema as any),\n info,\n config,\n namespace,\n });\n}\n"],"mappings":"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","names":["modelRef","params"]}
package/lib/audio.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/audio.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 { GenerationCommonConfigSchema, Message, modelRef, z } from 'genkit';\nimport type { ModelAction, ModelInfo } from 'genkit/model';\nimport { model } from 'genkit/plugin';\nimport OpenAI from 'openai';\nimport { Response } from 'openai/core.mjs';\nimport type {\n SpeechCreateParams,\n Transcription,\n TranscriptionCreateParams,\n} from 'openai/resources/audio/index.mjs';\nimport { PluginOptions } from './index.js';\nimport { maybeCreateRequestScopedOpenAIClient, toModelName } from './utils.js';\n\nexport type SpeechRequestBuilder = (\n req: GenerateRequest,\n params: SpeechCreateParams\n) => void;\nexport type TranscriptionRequestBuilder = (\n req: GenerateRequest,\n params: TranscriptionCreateParams\n) => void;\n\nexport const TRANSCRIPTION_MODEL_INFO = {\n supports: {\n media: true,\n output: ['text', 'json'],\n multiturn: false,\n systemRole: false,\n tools: false,\n },\n};\n\nexport const SPEECH_MODEL_INFO: ModelInfo = {\n supports: {\n media: false,\n output: ['media'],\n multiturn: false,\n systemRole: false,\n tools: false,\n },\n};\n\nconst ChunkingStrategySchema = z.object({\n type: z.string(),\n prefix_padding_ms: z.number().int().optional(),\n silence_duration_ms: z.number().int().optional(),\n threshold: z.number().min(0).max(1.0).optional(),\n});\nexport const TranscriptionConfigSchema = GenerationCommonConfigSchema.pick({\n temperature: true,\n}).extend({\n chunking_strategy: z\n .union([z.literal('auto'), ChunkingStrategySchema])\n .optional(),\n include: z.array(z.any()).optional(),\n language: z.string().optional(),\n timestamp_granularities: z.array(z.enum(['word', 'segment'])).optional(),\n response_format: z\n .enum(['json', 'text', 'srt', 'verbose_json', 'vtt'])\n .optional(),\n // TODO stream support\n});\n\nexport const SpeechConfigSchema = z.object({\n voice: z\n .enum(['alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer'])\n .default('alloy'),\n speed: z.number().min(0.25).max(4.0).optional(),\n response_format: z\n .enum(['mp3', 'opus', 'aac', 'flac', 'wav', 'pcm'])\n .optional(),\n});\n\n/**\n * Supported media formats for Audio generation\n */\nexport const RESPONSE_FORMAT_MEDIA_TYPES = {\n mp3: 'audio/mpeg',\n opus: 'audio/opus',\n aac: 'audio/aac',\n flac: 'audio/flac',\n wav: 'audio/wav',\n pcm: 'audio/L16',\n};\n\nexport function toTTSRequest(\n modelName: string,\n request: GenerateRequest,\n requestBuilder?: SpeechRequestBuilder\n): SpeechCreateParams {\n const {\n voice,\n version: modelVersion,\n temperature,\n maxOutputTokens,\n stopSequences,\n topK,\n topP,\n ...restOfConfig\n } = request.config ?? {};\n\n let options: SpeechCreateParams = {\n model: modelVersion ?? modelName,\n input: new Message(request.messages[0]).text,\n voice: voice ?? 'alloy',\n };\n if (requestBuilder) {\n requestBuilder(request, options);\n } else {\n options = {\n ...options,\n ...restOfConfig, // passthorugh rest of the config\n };\n }\n for (const k in options) {\n if (options[k] === undefined) {\n delete options[k];\n }\n }\n return options;\n}\n\nexport async function speechToGenerateResponse(\n response: Response,\n responseFormat: 'mp3' | 'opus' | 'aac' | 'flac' | 'wav' | 'pcm' = 'mp3'\n): Promise<GenerateResponseData> {\n const resultArrayBuffer = await response.arrayBuffer();\n const resultBuffer = Buffer.from(new Uint8Array(resultArrayBuffer));\n const mediaType = RESPONSE_FORMAT_MEDIA_TYPES[responseFormat];\n return {\n message: {\n role: 'model',\n content: [\n {\n media: {\n contentType: mediaType,\n url: `data:${mediaType};base64,${resultBuffer.toString('base64')}`,\n },\n },\n ],\n },\n finishReason: 'stop',\n raw: response,\n };\n}\n\n/**\n * Method to define a new Genkit Model that is compatible with the Open AI Audio\n * API. \n *\n * These models are to be used to create audio speech from a given request.\n * @param params An object containing parameters for defining the OpenAI speech\n * 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 defineCompatOpenAISpeechModel<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: SpeechRequestBuilder;\n pluginOptions: PluginOptions;\n}): ModelAction {\n const {\n name,\n client: defaultClient,\n pluginOptions,\n modelRef,\n requestBuilder,\n } = params;\n const modelName = toModelName(name, pluginOptions?.name);\n const actionName = `${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 ttsRequest = toTTSRequest(modelName, request, requestBuilder);\n const client = maybeCreateRequestScopedOpenAIClient(\n pluginOptions,\n request,\n defaultClient\n );\n const result = await client.audio.speech.create(ttsRequest, {\n signal: abortSignal,\n });\n return await speechToGenerateResponse(result, ttsRequest.response_format);\n }\n );\n}\n\n/** Speech generation ModelRef helper, with reasonable defaults for\n * OpenAI-compatible providers */\nexport function compatOaiSpeechModelRef<\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 = SPEECH_MODEL_INFO,\n configSchema,\n config = undefined,\n namespace,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (SpeechConfigSchema as any),\n info,\n config,\n namespace,\n });\n}\n\nexport function toSttRequest(\n modelName: string,\n request: GenerateRequest,\n requestBuilder?: TranscriptionRequestBuilder\n): TranscriptionCreateParams {\n const message = new Message(request.messages[0]);\n const media = message.media;\n if (!media?.url) {\n throw new Error('No media found in the request');\n }\n const mediaBuffer = Buffer.from(\n media.url.slice(media.url.indexOf(',') + 1),\n 'base64'\n );\n const mediaFile = new File([mediaBuffer], 'input', {\n type:\n media.contentType ??\n media.url.slice('data:'.length, media.url.indexOf(';')),\n });\n const {\n temperature,\n version: modelVersion,\n maxOutputTokens,\n stopSequences,\n topK,\n topP,\n ...restOfConfig\n } = request.config ?? {};\n\n let options: TranscriptionCreateParams = {\n model: modelVersion ?? modelName,\n file: mediaFile,\n prompt: message.text,\n temperature,\n };\n if (requestBuilder) {\n requestBuilder(request, options);\n } else {\n options = {\n ...options,\n ...restOfConfig, // passthrough rest of the config\n };\n }\n const outputFormat = request.output?.format as 'json' | 'text' | 'media';\n const customFormat = request.config?.response_format;\n if (outputFormat && customFormat) {\n if (\n outputFormat === 'json' &&\n customFormat !== 'json' &&\n customFormat !== 'verbose_json'\n ) {\n throw new Error(\n `Custom response format ${customFormat} is not compatible with output format ${outputFormat}`\n );\n }\n }\n if (outputFormat === 'media') {\n throw new Error(`Output format ${outputFormat} is not supported.`);\n }\n options.response_format = customFormat || outputFormat || 'text';\n for (const k in options) {\n if (options[k] === undefined) {\n delete options[k];\n }\n }\n return options;\n}\n\nexport function transcriptionToGenerateResponse(\n result: Transcription | string\n): GenerateResponseData {\n return {\n message: {\n role: 'model',\n content: [\n {\n text: typeof result === 'string' ? result : result.text,\n },\n ],\n },\n finishReason: 'stop',\n raw: result,\n };\n}\n\n/**\n * Method to define a new Genkit Model that is compatible with Open AI\n * Transcriptions API. \n *\n * These models are to be used to transcribe audio to text.\n *\n * @param params An object containing parameters for defining the OpenAI\n * transcription 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 defineCompatOpenAITranscriptionModel<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n name: string;\n client: OpenAI;\n pluginOptions?: PluginOptions;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: TranscriptionRequestBuilder;\n}): ModelAction {\n const {\n name,\n pluginOptions,\n client: defaultClient,\n modelRef,\n requestBuilder,\n } = params;\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 params = toSttRequest(modelName, request, requestBuilder);\n const client = maybeCreateRequestScopedOpenAIClient(\n pluginOptions,\n request,\n defaultClient\n );\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/** Transcription ModelRef helper, with reasonable defaults for\n * OpenAI-compatible providers */\nexport function compatOaiTranscriptionModelRef<\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 = TRANSCRIPTION_MODEL_INFO,\n configSchema,\n config = undefined,\n namespace,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (TranscriptionConfigSchema as any),\n info,\n config,\n namespace,\n });\n}\n"],"mappings":"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","names":["modelRef","params"]}
1
+ {"version":3,"sources":["../src/audio.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 {\n GenerateRequest,\n GenerateResponseData,\n ModelReference,\n} from 'genkit';\nimport { GenerationCommonConfigSchema, Message, modelRef, z } from 'genkit';\nimport type { ModelAction, ModelInfo } from 'genkit/model';\nimport { model } from 'genkit/plugin';\nimport OpenAI from 'openai';\nimport { Response } from 'openai/core.mjs';\nimport type {\n SpeechCreateParams,\n Transcription,\n TranscriptionCreateParams,\n} from 'openai/resources/audio/index.mjs';\nimport { PluginOptions } from './index.js';\nimport { maybeCreateRequestScopedOpenAIClient, toModelName } from './utils.js';\n\nexport type SpeechRequestBuilder = (\n req: GenerateRequest,\n params: SpeechCreateParams\n) => void;\nexport type TranscriptionRequestBuilder = (\n req: GenerateRequest,\n params: TranscriptionCreateParams\n) => void;\n\nexport const TRANSCRIPTION_MODEL_INFO: ModelInfo = {\n supports: {\n media: true,\n output: ['text', 'json'],\n multiturn: false,\n systemRole: false,\n tools: false,\n },\n};\n\nexport const SPEECH_MODEL_INFO: ModelInfo = {\n supports: {\n media: false,\n output: ['media'],\n multiturn: false,\n systemRole: false,\n tools: false,\n },\n};\n\nconst ChunkingStrategySchema = z.object({\n type: z.string(),\n prefix_padding_ms: z.number().int().optional(),\n silence_duration_ms: z.number().int().optional(),\n threshold: z.number().min(0).max(1.0).optional(),\n});\nexport const TranscriptionConfigSchema = GenerationCommonConfigSchema.pick({\n temperature: true,\n}).extend({\n chunking_strategy: z\n .union([z.literal('auto'), ChunkingStrategySchema])\n .optional(),\n include: z.array(z.any()).optional(),\n language: z.string().optional(),\n timestamp_granularities: z.array(z.enum(['word', 'segment'])).optional(),\n response_format: z\n .enum(['json', 'text', 'srt', 'verbose_json', 'vtt'])\n .optional(),\n // TODO stream support\n});\n\nexport const SpeechConfigSchema = z.object({\n voice: z\n .enum(['alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer'])\n .default('alloy'),\n speed: z.number().min(0.25).max(4.0).optional(),\n response_format: z\n .enum(['mp3', 'opus', 'aac', 'flac', 'wav', 'pcm'])\n .optional(),\n});\n\n/**\n * Supported media formats for Audio generation\n */\nexport const RESPONSE_FORMAT_MEDIA_TYPES = {\n mp3: 'audio/mpeg',\n opus: 'audio/opus',\n aac: 'audio/aac',\n flac: 'audio/flac',\n wav: 'audio/wav',\n pcm: 'audio/L16',\n};\n\nexport function toTTSRequest(\n modelName: string,\n request: GenerateRequest,\n requestBuilder?: SpeechRequestBuilder\n): SpeechCreateParams {\n const {\n voice,\n version: modelVersion,\n temperature,\n maxOutputTokens,\n stopSequences,\n topK,\n topP,\n ...restOfConfig\n } = request.config ?? {};\n\n let options: SpeechCreateParams = {\n model: modelVersion ?? modelName,\n input: new Message(request.messages[0]).text,\n voice: voice ?? 'alloy',\n };\n if (requestBuilder) {\n requestBuilder(request, options);\n } else {\n options = {\n ...options,\n ...restOfConfig, // passthorugh rest of the config\n };\n }\n for (const k in options) {\n if (options[k] === undefined) {\n delete options[k];\n }\n }\n return options;\n}\n\nexport async function speechToGenerateResponse(\n response: Response,\n responseFormat: 'mp3' | 'opus' | 'aac' | 'flac' | 'wav' | 'pcm' = 'mp3'\n): Promise<GenerateResponseData> {\n const resultArrayBuffer = await response.arrayBuffer();\n const resultBuffer = Buffer.from(new Uint8Array(resultArrayBuffer));\n const mediaType = RESPONSE_FORMAT_MEDIA_TYPES[responseFormat];\n return {\n message: {\n role: 'model',\n content: [\n {\n media: {\n contentType: mediaType,\n url: `data:${mediaType};base64,${resultBuffer.toString('base64')}`,\n },\n },\n ],\n },\n finishReason: 'stop',\n raw: response,\n };\n}\n\n/**\n * Method to define a new Genkit Model that is compatible with the Open AI Audio\n * API. \n *\n * These models are to be used to create audio speech from a given request.\n * @param params An object containing parameters for defining the OpenAI speech\n * 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 defineCompatOpenAISpeechModel<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: SpeechRequestBuilder;\n pluginOptions: PluginOptions;\n}): ModelAction {\n const {\n name,\n client: defaultClient,\n pluginOptions,\n modelRef,\n requestBuilder,\n } = params;\n const modelName = toModelName(name, pluginOptions?.name);\n const actionName = `${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 ttsRequest = toTTSRequest(modelName, request, requestBuilder);\n const client = maybeCreateRequestScopedOpenAIClient(\n pluginOptions,\n request,\n defaultClient\n );\n const result = await client.audio.speech.create(ttsRequest, {\n signal: abortSignal,\n });\n return await speechToGenerateResponse(result, ttsRequest.response_format);\n }\n );\n}\n\n/** Speech generation ModelRef helper, with reasonable defaults for\n * OpenAI-compatible providers */\nexport function compatOaiSpeechModelRef<\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 = SPEECH_MODEL_INFO,\n configSchema,\n config = undefined,\n namespace,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (SpeechConfigSchema as any),\n info,\n config,\n namespace,\n });\n}\n\nexport function toSttRequest(\n modelName: string,\n request: GenerateRequest,\n requestBuilder?: TranscriptionRequestBuilder\n): TranscriptionCreateParams {\n const message = new Message(request.messages[0]);\n const media = message.media;\n if (!media?.url) {\n throw new Error('No media found in the request');\n }\n const mediaBuffer = Buffer.from(\n media.url.slice(media.url.indexOf(',') + 1),\n 'base64'\n );\n const mediaFile = new File([mediaBuffer], 'input', {\n type:\n media.contentType ??\n media.url.slice('data:'.length, media.url.indexOf(';')),\n });\n const {\n temperature,\n version: modelVersion,\n maxOutputTokens,\n stopSequences,\n topK,\n topP,\n ...restOfConfig\n } = request.config ?? {};\n\n let options: TranscriptionCreateParams = {\n model: modelVersion ?? modelName,\n file: mediaFile,\n prompt: message.text,\n temperature,\n };\n if (requestBuilder) {\n requestBuilder(request, options);\n } else {\n options = {\n ...options,\n ...restOfConfig, // passthrough rest of the config\n };\n }\n const outputFormat = request.output?.format as 'json' | 'text' | 'media';\n const customFormat = request.config?.response_format;\n if (outputFormat && customFormat) {\n if (\n outputFormat === 'json' &&\n customFormat !== 'json' &&\n customFormat !== 'verbose_json'\n ) {\n throw new Error(\n `Custom response format ${customFormat} is not compatible with output format ${outputFormat}`\n );\n }\n }\n if (outputFormat === 'media') {\n throw new Error(`Output format ${outputFormat} is not supported.`);\n }\n options.response_format = customFormat || outputFormat || 'text';\n for (const k in options) {\n if (options[k] === undefined) {\n delete options[k];\n }\n }\n return options;\n}\n\nexport function transcriptionToGenerateResponse(\n result: Transcription | string\n): GenerateResponseData {\n return {\n message: {\n role: 'model',\n content: [\n {\n text: typeof result === 'string' ? result : result.text,\n },\n ],\n },\n finishReason: 'stop',\n raw: result,\n };\n}\n\n/**\n * Method to define a new Genkit Model that is compatible with Open AI\n * Transcriptions API. \n *\n * These models are to be used to transcribe audio to text.\n *\n * @param params An object containing parameters for defining the OpenAI\n * transcription 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 defineCompatOpenAITranscriptionModel<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n name: string;\n client: OpenAI;\n pluginOptions?: PluginOptions;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: TranscriptionRequestBuilder;\n}): ModelAction {\n const {\n name,\n pluginOptions,\n client: defaultClient,\n modelRef,\n requestBuilder,\n } = params;\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 params = toSttRequest(modelName, request, requestBuilder);\n const client = maybeCreateRequestScopedOpenAIClient(\n pluginOptions,\n request,\n defaultClient\n );\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/** Transcription ModelRef helper, with reasonable defaults for\n * OpenAI-compatible providers */\nexport function compatOaiTranscriptionModelRef<\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 = TRANSCRIPTION_MODEL_INFO,\n configSchema,\n config = undefined,\n namespace,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (TranscriptionConfigSchema as any),\n info,\n config,\n namespace,\n });\n}\n"],"mappings":"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","names":["modelRef","params"]}
@@ -1,6 +1,6 @@
1
1
  import { z } from 'genkit';
2
2
  import { ModelInfo, ModelReference } from 'genkit/model';
3
- import { M as ModelRequestBuilder } from '../audio-CJ8rzf35.mjs';
3
+ import { M as ModelRequestBuilder } from '../audio-Cr0WtG4I.mjs';
4
4
  import 'openai';
5
5
  import 'openai/core.mjs';
6
6
  import 'openai/resources/audio/index.mjs';
@@ -1,6 +1,6 @@
1
1
  import { z } from 'genkit';
2
2
  import { ModelInfo, ModelReference } from 'genkit/model';
3
- import { M as ModelRequestBuilder } from '../audio-CJ8rzf35.js';
3
+ import { M as ModelRequestBuilder } from '../audio-Cr0WtG4I.js';
4
4
  import 'openai';
5
5
  import 'openai/core.mjs';
6
6
  import 'openai/resources/audio/index.mjs';
@@ -1,6 +1,6 @@
1
1
  import { z, ModelReference } from 'genkit';
2
2
  import { GenkitPluginV2 } from 'genkit/plugin';
3
- import { P as PluginOptions } from '../audio-CJ8rzf35.mjs';
3
+ import { P as PluginOptions } from '../audio-Cr0WtG4I.mjs';
4
4
  import { SUPPORTED_DEEPSEEK_MODELS, DeepSeekChatCompletionConfigSchema } from './deepseek.mjs';
5
5
  import 'genkit/model';
6
6
  import 'openai';
@@ -1,6 +1,6 @@
1
1
  import { z, ModelReference } from 'genkit';
2
2
  import { GenkitPluginV2 } from 'genkit/plugin';
3
- import { P as PluginOptions } from '../audio-CJ8rzf35.js';
3
+ import { P as PluginOptions } from '../audio-Cr0WtG4I.js';
4
4
  import { SUPPORTED_DEEPSEEK_MODELS, DeepSeekChatCompletionConfigSchema } from './deepseek.js';
5
5
  import 'genkit/model';
6
6
  import 'openai';
@@ -1,6 +1,6 @@
1
1
  import 'genkit';
2
2
  import 'openai';
3
- export { d as defineCompatOpenAIEmbedder } from './audio-CJ8rzf35.mjs';
3
+ export { d as defineCompatOpenAIEmbedder } from './audio-Cr0WtG4I.mjs';
4
4
  import 'genkit/model';
5
5
  import 'openai/core.mjs';
6
6
  import 'openai/resources/audio/index.mjs';
package/lib/embedder.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import 'genkit';
2
2
  import 'openai';
3
- export { d as defineCompatOpenAIEmbedder } from './audio-CJ8rzf35.js';
3
+ export { d as defineCompatOpenAIEmbedder } from './audio-Cr0WtG4I.js';
4
4
  import 'genkit/model';
5
5
  import 'openai/core.mjs';
6
6
  import 'openai/resources/audio/index.mjs';
package/lib/image.d.mts CHANGED
@@ -2,7 +2,7 @@ import 'genkit';
2
2
  import 'genkit/model';
3
3
  import 'openai';
4
4
  import 'openai/resources/images.mjs';
5
- export { b as IMAGE_GENERATION_MODEL_INFO, I as ImageGenerationCommonConfigSchema, a as ImageRequestBuilder, e as compatOaiImageModelRef, c as defineCompatOpenAIImageModel } from './audio-CJ8rzf35.mjs';
5
+ export { b as IMAGE_GENERATION_MODEL_INFO, I as ImageGenerationCommonConfigSchema, a as ImageRequestBuilder, e as compatOaiImageModelRef, c as defineCompatOpenAIImageModel } from './audio-Cr0WtG4I.mjs';
6
6
  import 'openai/core.mjs';
7
7
  import 'openai/resources/audio/index.mjs';
8
8
  import 'genkit/plugin';
package/lib/image.d.ts CHANGED
@@ -2,7 +2,7 @@ import 'genkit';
2
2
  import 'genkit/model';
3
3
  import 'openai';
4
4
  import 'openai/resources/images.mjs';
5
- export { b as IMAGE_GENERATION_MODEL_INFO, I as ImageGenerationCommonConfigSchema, a as ImageRequestBuilder, e as compatOaiImageModelRef, c as defineCompatOpenAIImageModel } from './audio-CJ8rzf35.js';
5
+ export { b as IMAGE_GENERATION_MODEL_INFO, I as ImageGenerationCommonConfigSchema, a as ImageRequestBuilder, e as compatOaiImageModelRef, c as defineCompatOpenAIImageModel } from './audio-Cr0WtG4I.js';
6
6
  import 'openai/core.mjs';
7
7
  import 'openai/resources/audio/index.mjs';
8
8
  import 'genkit/plugin';
package/lib/index.d.mts CHANGED
@@ -2,7 +2,7 @@ import 'genkit/plugin';
2
2
  import 'genkit';
3
3
  import 'genkit/registry';
4
4
  import 'openai';
5
- export { C as ChatCompletionCommonConfigSchema, I as ImageGenerationCommonConfigSchema, a as ImageRequestBuilder, M as ModelRequestBuilder, P as PluginOptions, S as SpeechConfigSchema, v as SpeechRequestBuilder, T as TranscriptionConfigSchema, w as TranscriptionRequestBuilder, e as compatOaiImageModelRef, n as compatOaiModelRef, q as compatOaiSpeechModelRef, r as compatOaiTranscriptionModelRef, p as default, d as defineCompatOpenAIEmbedder, c as defineCompatOpenAIImageModel, m as defineCompatOpenAIModel, s as defineCompatOpenAISpeechModel, u as defineCompatOpenAITranscriptionModel, p as openAICompatible, o as openAIModelRunner } from './audio-CJ8rzf35.mjs';
5
+ export { C as ChatCompletionCommonConfigSchema, I as ImageGenerationCommonConfigSchema, a as ImageRequestBuilder, M as ModelRequestBuilder, P as PluginOptions, S as SpeechConfigSchema, D as SpeechRequestBuilder, T as TranscriptionConfigSchema, E as TranscriptionRequestBuilder, r as TranslationConfigSchema, p as TranslationRequestBuilder, e as compatOaiImageModelRef, n as compatOaiModelRef, y as compatOaiSpeechModelRef, z as compatOaiTranscriptionModelRef, w as compatOaiTranslationModelRef, x as default, d as defineCompatOpenAIEmbedder, c as defineCompatOpenAIImageModel, m as defineCompatOpenAIModel, A as defineCompatOpenAISpeechModel, B as defineCompatOpenAITranscriptionModel, v as defineCompatOpenAITranslationModel, x as openAICompatible, o as openAIModelRunner } from './audio-Cr0WtG4I.mjs';
6
6
  import 'genkit/model';
7
7
  import 'openai/core.mjs';
8
8
  import 'openai/resources/audio/index.mjs';
package/lib/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import 'genkit/plugin';
2
2
  import 'genkit';
3
3
  import 'genkit/registry';
4
4
  import 'openai';
5
- export { C as ChatCompletionCommonConfigSchema, I as ImageGenerationCommonConfigSchema, a as ImageRequestBuilder, M as ModelRequestBuilder, P as PluginOptions, S as SpeechConfigSchema, v as SpeechRequestBuilder, T as TranscriptionConfigSchema, w as TranscriptionRequestBuilder, e as compatOaiImageModelRef, n as compatOaiModelRef, q as compatOaiSpeechModelRef, r as compatOaiTranscriptionModelRef, p as default, d as defineCompatOpenAIEmbedder, c as defineCompatOpenAIImageModel, m as defineCompatOpenAIModel, s as defineCompatOpenAISpeechModel, u as defineCompatOpenAITranscriptionModel, p as openAICompatible, o as openAIModelRunner } from './audio-CJ8rzf35.js';
5
+ export { C as ChatCompletionCommonConfigSchema, I as ImageGenerationCommonConfigSchema, a as ImageRequestBuilder, M as ModelRequestBuilder, P as PluginOptions, S as SpeechConfigSchema, D as SpeechRequestBuilder, T as TranscriptionConfigSchema, E as TranscriptionRequestBuilder, r as TranslationConfigSchema, p as TranslationRequestBuilder, e as compatOaiImageModelRef, n as compatOaiModelRef, y as compatOaiSpeechModelRef, z as compatOaiTranscriptionModelRef, w as compatOaiTranslationModelRef, x as default, d as defineCompatOpenAIEmbedder, c as defineCompatOpenAIImageModel, m as defineCompatOpenAIModel, A as defineCompatOpenAISpeechModel, B as defineCompatOpenAITranscriptionModel, v as defineCompatOpenAITranslationModel, x as openAICompatible, o as openAIModelRunner } from './audio-Cr0WtG4I.js';
6
6
  import 'genkit/model';
7
7
  import 'openai/core.mjs';
8
8
  import 'openai/resources/audio/index.mjs';
package/lib/index.js CHANGED
@@ -32,16 +32,19 @@ __export(index_exports, {
32
32
  ImageGenerationCommonConfigSchema: () => import_image.ImageGenerationCommonConfigSchema,
33
33
  SpeechConfigSchema: () => import_audio.SpeechConfigSchema,
34
34
  TranscriptionConfigSchema: () => import_audio.TranscriptionConfigSchema,
35
+ TranslationConfigSchema: () => import_translate.TranslationConfigSchema,
35
36
  compatOaiImageModelRef: () => import_image.compatOaiImageModelRef,
36
37
  compatOaiModelRef: () => import_model2.compatOaiModelRef,
37
38
  compatOaiSpeechModelRef: () => import_audio.compatOaiSpeechModelRef,
38
39
  compatOaiTranscriptionModelRef: () => import_audio.compatOaiTranscriptionModelRef,
40
+ compatOaiTranslationModelRef: () => import_translate.compatOaiTranslationModelRef,
39
41
  default: () => index_default,
40
42
  defineCompatOpenAIEmbedder: () => import_embedder.defineCompatOpenAIEmbedder,
41
43
  defineCompatOpenAIImageModel: () => import_image.defineCompatOpenAIImageModel,
42
44
  defineCompatOpenAIModel: () => import_model2.defineCompatOpenAIModel,
43
45
  defineCompatOpenAISpeechModel: () => import_audio.defineCompatOpenAISpeechModel,
44
46
  defineCompatOpenAITranscriptionModel: () => import_audio.defineCompatOpenAITranscriptionModel,
47
+ defineCompatOpenAITranslationModel: () => import_translate.defineCompatOpenAITranslationModel,
45
48
  openAICompatible: () => openAICompatible,
46
49
  openAIModelRunner: () => import_model2.openAIModelRunner
47
50
  });
@@ -54,6 +57,7 @@ var import_audio = require("./audio.js");
54
57
  var import_embedder = require("./embedder.js");
55
58
  var import_image = require("./image.js");
56
59
  var import_model2 = require("./model.js");
60
+ var import_translate = require("./translate.js");
57
61
  const openAICompatible = (options) => {
58
62
  let listActionsCache;
59
63
  var client;
@@ -109,15 +113,18 @@ var index_default = openAICompatible;
109
113
  ImageGenerationCommonConfigSchema,
110
114
  SpeechConfigSchema,
111
115
  TranscriptionConfigSchema,
116
+ TranslationConfigSchema,
112
117
  compatOaiImageModelRef,
113
118
  compatOaiModelRef,
114
119
  compatOaiSpeechModelRef,
115
120
  compatOaiTranscriptionModelRef,
121
+ compatOaiTranslationModelRef,
116
122
  defineCompatOpenAIEmbedder,
117
123
  defineCompatOpenAIImageModel,
118
124
  defineCompatOpenAIModel,
119
125
  defineCompatOpenAISpeechModel,
120
126
  defineCompatOpenAITranscriptionModel,
127
+ defineCompatOpenAITranslationModel,
121
128
  openAICompatible,
122
129
  openAIModelRunner
123
130
  });