@genkit-ai/compat-oai 1.15.5 → 1.16.1

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 (51) hide show
  1. package/lib/audio.js +3 -3
  2. package/lib/audio.js.map +1 -1
  3. package/lib/audio.mjs +3 -3
  4. package/lib/audio.mjs.map +1 -1
  5. package/lib/deepseek/index.d.mts +5 -0
  6. package/lib/deepseek/index.d.ts +5 -0
  7. package/lib/embedder.js +2 -2
  8. package/lib/embedder.js.map +1 -1
  9. package/lib/embedder.mjs +2 -2
  10. package/lib/embedder.mjs.map +1 -1
  11. package/lib/image.d.mts +7 -7
  12. package/lib/image.d.ts +7 -7
  13. package/lib/image.js +3 -3
  14. package/lib/image.js.map +1 -1
  15. package/lib/image.mjs +3 -3
  16. package/lib/image.mjs.map +1 -1
  17. package/lib/index.d.mts +8 -0
  18. package/lib/index.d.ts +8 -0
  19. package/lib/index.js +42 -10
  20. package/lib/index.js.map +1 -1
  21. package/lib/index.mjs +43 -9
  22. package/lib/index.mjs.map +1 -1
  23. package/lib/model.d.mts +2 -2
  24. package/lib/model.d.ts +2 -2
  25. package/lib/model.js +6 -7
  26. package/lib/model.js.map +1 -1
  27. package/lib/model.mjs +6 -7
  28. package/lib/model.mjs.map +1 -1
  29. package/lib/openai/dalle.d.mts +37 -2
  30. package/lib/openai/dalle.d.ts +37 -2
  31. package/lib/openai/dalle.js +38 -1
  32. package/lib/openai/dalle.js.map +1 -1
  33. package/lib/openai/dalle.mjs +41 -2
  34. package/lib/openai/dalle.mjs.map +1 -1
  35. package/lib/openai/gpt.d.mts +172 -0
  36. package/lib/openai/gpt.d.ts +172 -0
  37. package/lib/openai/gpt.js +36 -1
  38. package/lib/openai/gpt.js.map +1 -1
  39. package/lib/openai/gpt.mjs +36 -1
  40. package/lib/openai/gpt.mjs.map +1 -1
  41. package/lib/openai/index.d.mts +3 -0
  42. package/lib/openai/index.d.ts +3 -0
  43. package/lib/openai/index.js +2 -1
  44. package/lib/openai/index.js.map +1 -1
  45. package/lib/openai/index.mjs +7 -2
  46. package/lib/openai/index.mjs.map +1 -1
  47. package/lib/xai/grok-image.d.mts +2 -1
  48. package/lib/xai/grok-image.d.ts +2 -1
  49. package/lib/xai/index.d.mts +4 -0
  50. package/lib/xai/index.d.ts +4 -0
  51. package/package.json +2 -2
package/lib/audio.js CHANGED
@@ -131,7 +131,7 @@ async function toGenerateResponse(response, responseFormat = "mp3") {
131
131
  }
132
132
  function defineCompatOpenAISpeechModel(params) {
133
133
  const { ai, name, client, modelRef: modelRef2, requestBuilder } = params;
134
- const model = name.split("/").pop();
134
+ const modelName = name.substring(name.indexOf("/") + 1);
135
135
  return ai.defineModel(
136
136
  {
137
137
  name,
@@ -140,7 +140,7 @@ function defineCompatOpenAISpeechModel(params) {
140
140
  configSchema: modelRef2?.configSchema
141
141
  },
142
142
  async (request, { abortSignal }) => {
143
- const ttsRequest = toTTSRequest(model, request, requestBuilder);
143
+ const ttsRequest = toTTSRequest(modelName, request, requestBuilder);
144
144
  const result = await client.audio.speech.create(ttsRequest, {
145
145
  signal: abortSignal
146
146
  });
@@ -243,7 +243,7 @@ function defineCompatOpenAITranscriptionModel(params) {
243
243
  configSchema: modelRef2?.configSchema
244
244
  },
245
245
  async (request, { abortSignal }) => {
246
- const modelName = name.split("/").pop();
246
+ const modelName = name.substring(name.indexOf("/") + 1);
247
247
  const params2 = toSttRequest(modelName, request, requestBuilder);
248
248
  const result = await client.audio.transcriptions.create(
249
249
  {
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 Genkit,\n ModelReference,\n} from 'genkit';\nimport { GenerationCommonConfigSchema, Message, modelRef, z } from 'genkit';\nimport type { ModelAction, ModelInfo } from 'genkit/model';\nimport type OpenAI from 'openai';\nimport { Response } from 'openai/core.mjs';\nimport type {\n SpeechCreateParams,\n Transcription,\n TranscriptionCreateParams,\n} from 'openai/resources/audio/index.mjs';\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\nfunction 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\nasync function toGenerateResponse(\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 ai: Genkit;\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: SpeechRequestBuilder;\n}): ModelAction {\n const { ai, name, client, modelRef, requestBuilder } = params;\n\n const model = name.split('/').pop();\n return ai.defineModel(\n {\n name,\n apiVersion: 'v2',\n ...modelRef?.info,\n configSchema: modelRef?.configSchema,\n },\n async (request, { abortSignal }) => {\n const ttsRequest = toTTSRequest(model!, request, requestBuilder);\n const result = await client.audio.speech.create(ttsRequest, {\n signal: abortSignal,\n });\n return await toGenerateResponse(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}) {\n const {\n name,\n info = SPEECH_MODEL_INFO,\n configSchema,\n config = undefined,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (SpeechConfigSchema as any),\n info,\n config,\n });\n}\n\nfunction 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\nfunction 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 ai: Genkit;\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: TranscriptionRequestBuilder;\n}): ModelAction {\n const { ai, name, client, modelRef, requestBuilder } = params;\n\n return ai.defineModel(\n {\n name,\n apiVersion: 'v2',\n ...modelRef?.info,\n configSchema: modelRef?.configSchema,\n },\n async (request, { abortSignal }) => {\n const modelName = name.split('/').pop();\n const params = toSttRequest(modelName!, request, requestBuilder);\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}) {\n const {\n name,\n info = TRANSCRIPTION_MODEL_INFO,\n configSchema,\n config = undefined,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (TranscriptionConfigSchema as any),\n info,\n config,\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 */\nimport type {\n GenerateRequest,\n GenerateResponseData,\n Genkit,\n ModelReference,\n} from 'genkit';\nimport { GenerationCommonConfigSchema, Message, modelRef, z } from 'genkit';\nimport type { ModelAction, ModelInfo } from 'genkit/model';\nimport type OpenAI from 'openai';\nimport { Response } from 'openai/core.mjs';\nimport type {\n SpeechCreateParams,\n Transcription,\n TranscriptionCreateParams,\n} from 'openai/resources/audio/index.mjs';\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\nfunction 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\nasync function toGenerateResponse(\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 ai: Genkit;\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: SpeechRequestBuilder;\n}): ModelAction {\n const { ai, name, client, modelRef, requestBuilder } = params;\n const modelName = name.substring(name.indexOf('/') + 1);\n\n return ai.defineModel(\n {\n name,\n apiVersion: 'v2',\n ...modelRef?.info,\n configSchema: modelRef?.configSchema,\n },\n async (request, { abortSignal }) => {\n const ttsRequest = toTTSRequest(modelName!, request, requestBuilder);\n const result = await client.audio.speech.create(ttsRequest, {\n signal: abortSignal,\n });\n return await toGenerateResponse(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}) {\n const {\n name,\n info = SPEECH_MODEL_INFO,\n configSchema,\n config = undefined,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (SpeechConfigSchema as any),\n info,\n config,\n });\n}\n\nfunction 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\nfunction 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 ai: Genkit;\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: TranscriptionRequestBuilder;\n}): ModelAction {\n const { ai, name, client, modelRef, requestBuilder } = params;\n\n return ai.defineModel(\n {\n name,\n apiVersion: 'v2',\n ...modelRef?.info,\n configSchema: modelRef?.configSchema,\n },\n async (request, { abortSignal }) => {\n const modelName = name.substring(name.indexOf('/') + 1);\n\n const params = toSttRequest(modelName!, request, requestBuilder);\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}) {\n const {\n name,\n info = TRANSCRIPTION_MODEL_INFO,\n configSchema,\n config = undefined,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (TranscriptionConfigSchema as any),\n info,\n config,\n });\n}\n"],"mappings":"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","names":["modelRef","params"]}
package/lib/audio.mjs CHANGED
@@ -100,7 +100,7 @@ async function toGenerateResponse(response, responseFormat = "mp3") {
100
100
  }
101
101
  function defineCompatOpenAISpeechModel(params) {
102
102
  const { ai, name, client, modelRef: modelRef2, requestBuilder } = params;
103
- const model = name.split("/").pop();
103
+ const modelName = name.substring(name.indexOf("/") + 1);
104
104
  return ai.defineModel(
105
105
  {
106
106
  name,
@@ -109,7 +109,7 @@ function defineCompatOpenAISpeechModel(params) {
109
109
  configSchema: modelRef2?.configSchema
110
110
  },
111
111
  async (request, { abortSignal }) => {
112
- const ttsRequest = toTTSRequest(model, request, requestBuilder);
112
+ const ttsRequest = toTTSRequest(modelName, request, requestBuilder);
113
113
  const result = await client.audio.speech.create(ttsRequest, {
114
114
  signal: abortSignal
115
115
  });
@@ -212,7 +212,7 @@ function defineCompatOpenAITranscriptionModel(params) {
212
212
  configSchema: modelRef2?.configSchema
213
213
  },
214
214
  async (request, { abortSignal }) => {
215
- const modelName = name.split("/").pop();
215
+ const modelName = name.substring(name.indexOf("/") + 1);
216
216
  const params2 = toSttRequest(modelName, request, requestBuilder);
217
217
  const result = await client.audio.transcriptions.create(
218
218
  {
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 Genkit,\n ModelReference,\n} from 'genkit';\nimport { GenerationCommonConfigSchema, Message, modelRef, z } from 'genkit';\nimport type { ModelAction, ModelInfo } from 'genkit/model';\nimport type OpenAI from 'openai';\nimport { Response } from 'openai/core.mjs';\nimport type {\n SpeechCreateParams,\n Transcription,\n TranscriptionCreateParams,\n} from 'openai/resources/audio/index.mjs';\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\nfunction 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\nasync function toGenerateResponse(\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 ai: Genkit;\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: SpeechRequestBuilder;\n}): ModelAction {\n const { ai, name, client, modelRef, requestBuilder } = params;\n\n const model = name.split('/').pop();\n return ai.defineModel(\n {\n name,\n apiVersion: 'v2',\n ...modelRef?.info,\n configSchema: modelRef?.configSchema,\n },\n async (request, { abortSignal }) => {\n const ttsRequest = toTTSRequest(model!, request, requestBuilder);\n const result = await client.audio.speech.create(ttsRequest, {\n signal: abortSignal,\n });\n return await toGenerateResponse(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}) {\n const {\n name,\n info = SPEECH_MODEL_INFO,\n configSchema,\n config = undefined,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (SpeechConfigSchema as any),\n info,\n config,\n });\n}\n\nfunction 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\nfunction 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 ai: Genkit;\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: TranscriptionRequestBuilder;\n}): ModelAction {\n const { ai, name, client, modelRef, requestBuilder } = params;\n\n return ai.defineModel(\n {\n name,\n apiVersion: 'v2',\n ...modelRef?.info,\n configSchema: modelRef?.configSchema,\n },\n async (request, { abortSignal }) => {\n const modelName = name.split('/').pop();\n const params = toSttRequest(modelName!, request, requestBuilder);\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}) {\n const {\n name,\n info = TRANSCRIPTION_MODEL_INFO,\n configSchema,\n config = undefined,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (TranscriptionConfigSchema as any),\n info,\n config,\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 */\nimport type {\n GenerateRequest,\n GenerateResponseData,\n Genkit,\n ModelReference,\n} from 'genkit';\nimport { GenerationCommonConfigSchema, Message, modelRef, z } from 'genkit';\nimport type { ModelAction, ModelInfo } from 'genkit/model';\nimport type OpenAI from 'openai';\nimport { Response } from 'openai/core.mjs';\nimport type {\n SpeechCreateParams,\n Transcription,\n TranscriptionCreateParams,\n} from 'openai/resources/audio/index.mjs';\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\nfunction 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\nasync function toGenerateResponse(\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 ai: Genkit;\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: SpeechRequestBuilder;\n}): ModelAction {\n const { ai, name, client, modelRef, requestBuilder } = params;\n const modelName = name.substring(name.indexOf('/') + 1);\n\n return ai.defineModel(\n {\n name,\n apiVersion: 'v2',\n ...modelRef?.info,\n configSchema: modelRef?.configSchema,\n },\n async (request, { abortSignal }) => {\n const ttsRequest = toTTSRequest(modelName!, request, requestBuilder);\n const result = await client.audio.speech.create(ttsRequest, {\n signal: abortSignal,\n });\n return await toGenerateResponse(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}) {\n const {\n name,\n info = SPEECH_MODEL_INFO,\n configSchema,\n config = undefined,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (SpeechConfigSchema as any),\n info,\n config,\n });\n}\n\nfunction 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\nfunction 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 ai: Genkit;\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: TranscriptionRequestBuilder;\n}): ModelAction {\n const { ai, name, client, modelRef, requestBuilder } = params;\n\n return ai.defineModel(\n {\n name,\n apiVersion: 'v2',\n ...modelRef?.info,\n configSchema: modelRef?.configSchema,\n },\n async (request, { abortSignal }) => {\n const modelName = name.substring(name.indexOf('/') + 1);\n\n const params = toSttRequest(modelName!, request, requestBuilder);\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}) {\n const {\n name,\n info = TRANSCRIPTION_MODEL_INFO,\n configSchema,\n config = undefined,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (TranscriptionConfigSchema as any),\n info,\n config,\n });\n}\n"],"mappings":"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","names":["modelRef","params"]}
@@ -4,7 +4,12 @@ import { PluginOptions } from '../index.mjs';
4
4
  import { SUPPORTED_DEEPSEEK_MODELS, DeepSeekChatCompletionConfigSchema } from './deepseek.mjs';
5
5
  import 'genkit/registry';
6
6
  import 'openai';
7
+ import '../audio.mjs';
7
8
  import 'genkit/model';
9
+ import 'openai/resources/audio/index.mjs';
10
+ import '../embedder.mjs';
11
+ import '../image.mjs';
12
+ import 'openai/resources/images.mjs';
8
13
  import '../model.mjs';
9
14
  import 'openai/resources/index.mjs';
10
15
 
@@ -4,7 +4,12 @@ import { PluginOptions } from '../index.js';
4
4
  import { SUPPORTED_DEEPSEEK_MODELS, DeepSeekChatCompletionConfigSchema } from './deepseek.js';
5
5
  import 'genkit/registry';
6
6
  import 'openai';
7
+ import '../audio.js';
7
8
  import 'genkit/model';
9
+ import 'openai/resources/audio/index.mjs';
10
+ import '../embedder.js';
11
+ import '../image.js';
12
+ import 'openai/resources/images.mjs';
8
13
  import '../model.js';
9
14
  import 'openai/resources/index.mjs';
10
15
 
package/lib/embedder.js CHANGED
@@ -23,7 +23,7 @@ __export(embedder_exports, {
23
23
  module.exports = __toCommonJS(embedder_exports);
24
24
  function defineCompatOpenAIEmbedder(params) {
25
25
  const { ai, name, client, embedderRef } = params;
26
- const model = name.split("/").pop();
26
+ const modelName = name.substring(name.indexOf("/") + 1);
27
27
  return ai.defineEmbedder(
28
28
  {
29
29
  name,
@@ -33,7 +33,7 @@ function defineCompatOpenAIEmbedder(params) {
33
33
  async (input, options) => {
34
34
  const { encodingFormat: encoding_format, ...restOfConfig } = options;
35
35
  const embeddings = await client.embeddings.create({
36
- model,
36
+ model: modelName,
37
37
  input: input.map((d) => d.text),
38
38
  encoding_format,
39
39
  ...restOfConfig
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/embedder.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\n// import { defineEmbedder, embedderRef } from '@genkit-ai/ai/embedder';\n\nimport type { EmbedderAction, EmbedderReference, Genkit } from 'genkit';\nimport OpenAI from 'openai';\n\n/**\n * Method to define a new Genkit Embedder that is compatibale with the Open AI\n * Embeddings API. \n *\n * @param params An object containing parameters for defining the OpenAI embedder.\n * @param params.ai The Genkit AI instance.\n * @param params.name The name of the embedder.\n * @param params.client The OpenAI client instance.\n * @param params.embedderRef Optional reference to the embedder's configuration and\n * custom options.\n\n * @returns the created {@link EmbedderAction}\n */\nexport function defineCompatOpenAIEmbedder(params: {\n ai: Genkit;\n name: string;\n client: OpenAI;\n embedderRef?: EmbedderReference;\n}): EmbedderAction {\n const { ai, name, client, embedderRef } = params;\n const model = name.split('/').pop();\n return ai.defineEmbedder(\n {\n name,\n configSchema: embedderRef?.configSchema,\n ...embedderRef?.info,\n },\n async (input, options) => {\n const { encodingFormat: encoding_format, ...restOfConfig } = options;\n const embeddings = await client.embeddings.create({\n model: model!,\n input: input.map((d) => d.text),\n encoding_format,\n ...restOfConfig,\n });\n return {\n embeddings: embeddings.data.map((d) => ({ embedding: d.embedding })),\n };\n }\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAmCO,SAAS,2BAA2B,QAKxB;AACjB,QAAM,EAAE,IAAI,MAAM,QAAQ,YAAY,IAAI;AAC1C,QAAM,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI;AAClC,SAAO,GAAG;AAAA,IACR;AAAA,MACE;AAAA,MACA,cAAc,aAAa;AAAA,MAC3B,GAAG,aAAa;AAAA,IAClB;AAAA,IACA,OAAO,OAAO,YAAY;AACxB,YAAM,EAAE,gBAAgB,iBAAiB,GAAG,aAAa,IAAI;AAC7D,YAAM,aAAa,MAAM,OAAO,WAAW,OAAO;AAAA,QAChD;AAAA,QACA,OAAO,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,QAC9B;AAAA,QACA,GAAG;AAAA,MACL,CAAC;AACD,aAAO;AAAA,QACL,YAAY,WAAW,KAAK,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/embedder.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\n// import { defineEmbedder, embedderRef } from '@genkit-ai/ai/embedder';\n\nimport type { EmbedderAction, EmbedderReference, Genkit } from 'genkit';\nimport OpenAI from 'openai';\n\n/**\n * Method to define a new Genkit Embedder that is compatibale with the Open AI\n * Embeddings API. \n *\n * @param params An object containing parameters for defining the OpenAI embedder.\n * @param params.ai The Genkit AI instance.\n * @param params.name The name of the embedder.\n * @param params.client The OpenAI client instance.\n * @param params.embedderRef Optional reference to the embedder's configuration and\n * custom options.\n\n * @returns the created {@link EmbedderAction}\n */\nexport function defineCompatOpenAIEmbedder(params: {\n ai: Genkit;\n name: string;\n client: OpenAI;\n embedderRef?: EmbedderReference;\n}): EmbedderAction {\n const { ai, name, client, embedderRef } = params;\n const modelName = name.substring(name.indexOf('/') + 1);\n\n return ai.defineEmbedder(\n {\n name,\n configSchema: embedderRef?.configSchema,\n ...embedderRef?.info,\n },\n async (input, options) => {\n const { encodingFormat: encoding_format, ...restOfConfig } = options;\n const embeddings = await client.embeddings.create({\n model: modelName!,\n input: input.map((d) => d.text),\n encoding_format,\n ...restOfConfig,\n });\n return {\n embeddings: embeddings.data.map((d) => ({ embedding: d.embedding })),\n };\n }\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAmCO,SAAS,2BAA2B,QAKxB;AACjB,QAAM,EAAE,IAAI,MAAM,QAAQ,YAAY,IAAI;AAC1C,QAAM,YAAY,KAAK,UAAU,KAAK,QAAQ,GAAG,IAAI,CAAC;AAEtD,SAAO,GAAG;AAAA,IACR;AAAA,MACE;AAAA,MACA,cAAc,aAAa;AAAA,MAC3B,GAAG,aAAa;AAAA,IAClB;AAAA,IACA,OAAO,OAAO,YAAY;AACxB,YAAM,EAAE,gBAAgB,iBAAiB,GAAG,aAAa,IAAI;AAC7D,YAAM,aAAa,MAAM,OAAO,WAAW,OAAO;AAAA,QAChD,OAAO;AAAA,QACP,OAAO,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,QAC9B;AAAA,QACA,GAAG;AAAA,MACL,CAAC;AACD,aAAO;AAAA,QACL,YAAY,WAAW,KAAK,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
package/lib/embedder.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  function defineCompatOpenAIEmbedder(params) {
2
2
  const { ai, name, client, embedderRef } = params;
3
- const model = name.split("/").pop();
3
+ const modelName = name.substring(name.indexOf("/") + 1);
4
4
  return ai.defineEmbedder(
5
5
  {
6
6
  name,
@@ -10,7 +10,7 @@ function defineCompatOpenAIEmbedder(params) {
10
10
  async (input, options) => {
11
11
  const { encodingFormat: encoding_format, ...restOfConfig } = options;
12
12
  const embeddings = await client.embeddings.create({
13
- model,
13
+ model: modelName,
14
14
  input: input.map((d) => d.text),
15
15
  encoding_format,
16
16
  ...restOfConfig
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/embedder.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\n// import { defineEmbedder, embedderRef } from '@genkit-ai/ai/embedder';\n\nimport type { EmbedderAction, EmbedderReference, Genkit } from 'genkit';\nimport OpenAI from 'openai';\n\n/**\n * Method to define a new Genkit Embedder that is compatibale with the Open AI\n * Embeddings API. \n *\n * @param params An object containing parameters for defining the OpenAI embedder.\n * @param params.ai The Genkit AI instance.\n * @param params.name The name of the embedder.\n * @param params.client The OpenAI client instance.\n * @param params.embedderRef Optional reference to the embedder's configuration and\n * custom options.\n\n * @returns the created {@link EmbedderAction}\n */\nexport function defineCompatOpenAIEmbedder(params: {\n ai: Genkit;\n name: string;\n client: OpenAI;\n embedderRef?: EmbedderReference;\n}): EmbedderAction {\n const { ai, name, client, embedderRef } = params;\n const model = name.split('/').pop();\n return ai.defineEmbedder(\n {\n name,\n configSchema: embedderRef?.configSchema,\n ...embedderRef?.info,\n },\n async (input, options) => {\n const { encodingFormat: encoding_format, ...restOfConfig } = options;\n const embeddings = await client.embeddings.create({\n model: model!,\n input: input.map((d) => d.text),\n encoding_format,\n ...restOfConfig,\n });\n return {\n embeddings: embeddings.data.map((d) => ({ embedding: d.embedding })),\n };\n }\n );\n}\n"],"mappings":"AAmCO,SAAS,2BAA2B,QAKxB;AACjB,QAAM,EAAE,IAAI,MAAM,QAAQ,YAAY,IAAI;AAC1C,QAAM,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI;AAClC,SAAO,GAAG;AAAA,IACR;AAAA,MACE;AAAA,MACA,cAAc,aAAa;AAAA,MAC3B,GAAG,aAAa;AAAA,IAClB;AAAA,IACA,OAAO,OAAO,YAAY;AACxB,YAAM,EAAE,gBAAgB,iBAAiB,GAAG,aAAa,IAAI;AAC7D,YAAM,aAAa,MAAM,OAAO,WAAW,OAAO;AAAA,QAChD;AAAA,QACA,OAAO,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,QAC9B;AAAA,QACA,GAAG;AAAA,MACL,CAAC;AACD,aAAO;AAAA,QACL,YAAY,WAAW,KAAK,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/embedder.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\n// import { defineEmbedder, embedderRef } from '@genkit-ai/ai/embedder';\n\nimport type { EmbedderAction, EmbedderReference, Genkit } from 'genkit';\nimport OpenAI from 'openai';\n\n/**\n * Method to define a new Genkit Embedder that is compatibale with the Open AI\n * Embeddings API. \n *\n * @param params An object containing parameters for defining the OpenAI embedder.\n * @param params.ai The Genkit AI instance.\n * @param params.name The name of the embedder.\n * @param params.client The OpenAI client instance.\n * @param params.embedderRef Optional reference to the embedder's configuration and\n * custom options.\n\n * @returns the created {@link EmbedderAction}\n */\nexport function defineCompatOpenAIEmbedder(params: {\n ai: Genkit;\n name: string;\n client: OpenAI;\n embedderRef?: EmbedderReference;\n}): EmbedderAction {\n const { ai, name, client, embedderRef } = params;\n const modelName = name.substring(name.indexOf('/') + 1);\n\n return ai.defineEmbedder(\n {\n name,\n configSchema: embedderRef?.configSchema,\n ...embedderRef?.info,\n },\n async (input, options) => {\n const { encodingFormat: encoding_format, ...restOfConfig } = options;\n const embeddings = await client.embeddings.create({\n model: modelName!,\n input: input.map((d) => d.text),\n encoding_format,\n ...restOfConfig,\n });\n return {\n embeddings: embeddings.data.map((d) => ({ embedding: d.embedding })),\n };\n }\n );\n}\n"],"mappings":"AAmCO,SAAS,2BAA2B,QAKxB;AACjB,QAAM,EAAE,IAAI,MAAM,QAAQ,YAAY,IAAI;AAC1C,QAAM,YAAY,KAAK,UAAU,KAAK,QAAQ,GAAG,IAAI,CAAC;AAEtD,SAAO,GAAG;AAAA,IACR;AAAA,MACE;AAAA,MACA,cAAc,aAAa;AAAA,MAC3B,GAAG,aAAa;AAAA,IAClB;AAAA,IACA,OAAO,OAAO,YAAY;AACxB,YAAM,EAAE,gBAAgB,iBAAiB,GAAG,aAAa,IAAI;AAC7D,YAAM,aAAa,MAAM,OAAO,WAAW,OAAO;AAAA,QAChD,OAAO;AAAA,QACP,OAAO,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,QAC9B;AAAA,QACA,GAAG;AAAA,MACL,CAAC;AACD,aAAO;AAAA,QACL,YAAY,WAAW,KAAK,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
package/lib/image.d.mts CHANGED
@@ -28,21 +28,21 @@ declare const ImageGenerationCommonConfigSchema: z.ZodObject<{
28
28
  user: z.ZodOptional<z.ZodString>;
29
29
  n: z.ZodDefault<z.ZodNumber>;
30
30
  quality: z.ZodOptional<z.ZodEnum<["standard", "hd"]>>;
31
- response_format: z.ZodOptional<z.ZodEnum<["b64_json", "url"]>>;
31
+ response_format: z.ZodOptional<z.ZodDefault<z.ZodEnum<["b64_json", "url"]>>>;
32
32
  }, "strip", z.ZodTypeAny, {
33
33
  n: number;
34
- user?: string | undefined;
35
- response_format?: "b64_json" | "url" | undefined;
36
34
  size?: "1024x1024" | "1792x1024" | "1024x1792" | undefined;
37
35
  style?: "vivid" | "natural" | undefined;
38
- quality?: "standard" | "hd" | undefined;
39
- }, {
40
36
  user?: string | undefined;
41
- n?: number | undefined;
37
+ quality?: "standard" | "hd" | undefined;
42
38
  response_format?: "b64_json" | "url" | undefined;
39
+ }, {
43
40
  size?: "1024x1024" | "1792x1024" | "1024x1792" | undefined;
44
41
  style?: "vivid" | "natural" | undefined;
42
+ user?: string | undefined;
43
+ n?: number | undefined;
45
44
  quality?: "standard" | "hd" | undefined;
45
+ response_format?: "b64_json" | "url" | undefined;
46
46
  }>;
47
47
  /**
48
48
  * Method to define a new Genkit Model that is compatible with Open AI
@@ -74,6 +74,6 @@ declare function compatOaiImageModelRef<CustomOptions extends z.ZodTypeAny = z.Z
74
74
  info?: ModelInfo;
75
75
  configSchema?: CustomOptions;
76
76
  config?: any;
77
- }): ModelReference<any>;
77
+ }): ModelReference<CustomOptions | z.AnyZodObject>;
78
78
 
79
79
  export { IMAGE_GENERATION_MODEL_INFO, ImageGenerationCommonConfigSchema, type ImageRequestBuilder, compatOaiImageModelRef, defineCompatOpenAIImageModel };
package/lib/image.d.ts CHANGED
@@ -28,21 +28,21 @@ declare const ImageGenerationCommonConfigSchema: z.ZodObject<{
28
28
  user: z.ZodOptional<z.ZodString>;
29
29
  n: z.ZodDefault<z.ZodNumber>;
30
30
  quality: z.ZodOptional<z.ZodEnum<["standard", "hd"]>>;
31
- response_format: z.ZodOptional<z.ZodEnum<["b64_json", "url"]>>;
31
+ response_format: z.ZodOptional<z.ZodDefault<z.ZodEnum<["b64_json", "url"]>>>;
32
32
  }, "strip", z.ZodTypeAny, {
33
33
  n: number;
34
- user?: string | undefined;
35
- response_format?: "b64_json" | "url" | undefined;
36
34
  size?: "1024x1024" | "1792x1024" | "1024x1792" | undefined;
37
35
  style?: "vivid" | "natural" | undefined;
38
- quality?: "standard" | "hd" | undefined;
39
- }, {
40
36
  user?: string | undefined;
41
- n?: number | undefined;
37
+ quality?: "standard" | "hd" | undefined;
42
38
  response_format?: "b64_json" | "url" | undefined;
39
+ }, {
43
40
  size?: "1024x1024" | "1792x1024" | "1024x1792" | undefined;
44
41
  style?: "vivid" | "natural" | undefined;
42
+ user?: string | undefined;
43
+ n?: number | undefined;
45
44
  quality?: "standard" | "hd" | undefined;
45
+ response_format?: "b64_json" | "url" | undefined;
46
46
  }>;
47
47
  /**
48
48
  * Method to define a new Genkit Model that is compatible with Open AI
@@ -74,6 +74,6 @@ declare function compatOaiImageModelRef<CustomOptions extends z.ZodTypeAny = z.Z
74
74
  info?: ModelInfo;
75
75
  configSchema?: CustomOptions;
76
76
  config?: any;
77
- }): ModelReference<any>;
77
+ }): ModelReference<CustomOptions | z.AnyZodObject>;
78
78
 
79
79
  export { IMAGE_GENERATION_MODEL_INFO, ImageGenerationCommonConfigSchema, type ImageRequestBuilder, compatOaiImageModelRef, defineCompatOpenAIImageModel };
package/lib/image.js CHANGED
@@ -40,7 +40,7 @@ const ImageGenerationCommonConfigSchema = import_genkit.z.object({
40
40
  user: import_genkit.z.string().optional(),
41
41
  n: import_genkit.z.number().int().min(1).max(10).default(1),
42
42
  quality: import_genkit.z.enum(["standard", "hd"]).optional(),
43
- response_format: import_genkit.z.enum(["b64_json", "url"]).optional()
43
+ response_format: import_genkit.z.enum(["b64_json", "url"]).default("b64_json").optional()
44
44
  });
45
45
  function toImageGenerateParams(modelName, request, requestBuilder) {
46
46
  const {
@@ -86,7 +86,7 @@ function toGenerateResponse(result) {
86
86
  }
87
87
  function defineCompatOpenAIImageModel(params) {
88
88
  const { ai, name, client, modelRef: modelRef2, requestBuilder } = params;
89
- const model = name.split("/").pop();
89
+ const modelName = name.substring(name.indexOf("/") + 1);
90
90
  return ai.defineModel(
91
91
  {
92
92
  name,
@@ -96,7 +96,7 @@ function defineCompatOpenAIImageModel(params) {
96
96
  },
97
97
  async (request, { abortSignal }) => {
98
98
  const result = await client.images.generate(
99
- toImageGenerateParams(model, request, requestBuilder),
99
+ toImageGenerateParams(modelName, request, requestBuilder),
100
100
  { signal: abortSignal }
101
101
  );
102
102
  return toGenerateResponse(result);
package/lib/image.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/image.ts"],"sourcesContent":["/**\n * Copyright 2024 The Fire Company\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport type {\n GenerateRequest,\n GenerateResponseData,\n Genkit,\n ModelReference,\n} from 'genkit';\nimport { Message, modelRef, z } from 'genkit';\nimport { ModelAction, ModelInfo } from 'genkit/model';\nimport OpenAI from 'openai';\nimport type {\n ImageGenerateParams,\n ImagesResponse,\n} from 'openai/resources/images.mjs';\n\nexport type ImageRequestBuilder = (\n req: GenerateRequest,\n params: ImageGenerateParams\n) => void;\n\nexport const IMAGE_GENERATION_MODEL_INFO: ModelInfo = {\n supports: {\n media: false,\n output: ['media'],\n multiturn: false,\n systemRole: false,\n tools: false,\n },\n};\n\nexport const ImageGenerationCommonConfigSchema = z.object({\n size: z.enum(['1024x1024', '1792x1024', '1024x1792']).optional(),\n style: z.enum(['vivid', 'natural']).optional(),\n user: z.string().optional(),\n n: z.number().int().min(1).max(10).default(1),\n quality: z.enum(['standard', 'hd']).optional(),\n response_format: z.enum(['b64_json', 'url']).optional(),\n});\n\nfunction toImageGenerateParams(\n modelName: string,\n request: GenerateRequest,\n requestBuilder?: ImageRequestBuilder\n): ImageGenerateParams {\n const {\n temperature,\n version: modelVersion,\n maxOutputTokens,\n stopSequences,\n topK,\n topP,\n response_format,\n ...restOfConfig\n } = request.config ?? {};\n\n let options: ImageGenerateParams = {\n model: modelVersion ?? modelName,\n prompt: new Message(request.messages[0]).text,\n response_format: response_format || 'b64_json',\n };\n if (requestBuilder) {\n requestBuilder(request, options);\n } else {\n options = { ...options, ...restOfConfig };\n }\n for (const k in options) {\n if (options[k] === undefined) {\n delete options[k];\n }\n }\n return options;\n}\n\nfunction toGenerateResponse(result: ImagesResponse): GenerateResponseData {\n const images = result.data;\n if (!images) {\n return { finishReason: 'stop' };\n } else {\n const content = (result.data ?? []).map((image) => ({\n media: {\n contentType: 'image/png',\n url: image.url || `data:image/png;base64,${image.b64_json}`,\n },\n }));\n return { message: { role: 'model', content }, raw: result };\n }\n}\n\n/**\n * Method to define a new Genkit Model that is compatible with Open AI\n * Images API. \n *\n * These models are to be used to create images from a user prompt.\n *\n * @param params An object containing parameters for defining the OpenAI\n * image model.\n * @param params.ai The Genkit AI instance.\n * @param params.name The name of the model.\n * @param params.client The OpenAI client instance.\n * @param params.modelRef Optional reference to the model's configuration and\n * custom options.\n\n * @returns the created {@link ModelAction}\n */\nexport function defineCompatOpenAIImageModel<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n ai: Genkit;\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: ImageRequestBuilder;\n}): ModelAction<CustomOptions> {\n const { ai, name, client, modelRef, requestBuilder } = params;\n const model = name.split('/').pop();\n\n return ai.defineModel(\n {\n name,\n ...modelRef?.info,\n apiVersion: 'v2',\n configSchema: modelRef?.configSchema,\n },\n async (request, { abortSignal }) => {\n const result = await client.images.generate(\n toImageGenerateParams(model!, request, requestBuilder),\n { signal: abortSignal }\n );\n return toGenerateResponse(result);\n }\n );\n}\n\n/** Image generation ModelRef helper, with reasonable defaults for\n * OpenAI-compatible providers */\nexport function compatOaiImageModelRef<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n name: string;\n info?: ModelInfo;\n configSchema?: CustomOptions;\n config?: any;\n}) {\n const {\n name,\n info = IMAGE_GENERATION_MODEL_INFO,\n configSchema,\n config = undefined,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (ImageGenerationCommonConfigSchema as any),\n info,\n config,\n });\n}\n"],"mappings":"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","names":["modelRef"]}
1
+ {"version":3,"sources":["../src/image.ts"],"sourcesContent":["/**\n * Copyright 2024 The Fire Company\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport type {\n GenerateRequest,\n GenerateResponseData,\n Genkit,\n ModelReference,\n} from 'genkit';\nimport { Message, modelRef, z } from 'genkit';\nimport { ModelAction, ModelInfo } from 'genkit/model';\nimport OpenAI from 'openai';\nimport type {\n ImageGenerateParams,\n ImagesResponse,\n} from 'openai/resources/images.mjs';\n\nexport type ImageRequestBuilder = (\n req: GenerateRequest,\n params: ImageGenerateParams\n) => void;\n\nexport const IMAGE_GENERATION_MODEL_INFO: ModelInfo = {\n supports: {\n media: false,\n output: ['media'],\n multiturn: false,\n systemRole: false,\n tools: false,\n },\n};\n\nexport const ImageGenerationCommonConfigSchema = z.object({\n size: z.enum(['1024x1024', '1792x1024', '1024x1792']).optional(),\n style: z.enum(['vivid', 'natural']).optional(),\n user: z.string().optional(),\n n: z.number().int().min(1).max(10).default(1),\n quality: z.enum(['standard', 'hd']).optional(),\n response_format: z.enum(['b64_json', 'url']).default('b64_json').optional(),\n});\n\nfunction toImageGenerateParams(\n modelName: string,\n request: GenerateRequest,\n requestBuilder?: ImageRequestBuilder\n): ImageGenerateParams {\n const {\n temperature,\n version: modelVersion,\n maxOutputTokens,\n stopSequences,\n topK,\n topP,\n response_format,\n ...restOfConfig\n } = request.config ?? {};\n\n let options: ImageGenerateParams = {\n model: modelVersion ?? modelName,\n prompt: new Message(request.messages[0]).text,\n response_format: response_format || 'b64_json',\n };\n if (requestBuilder) {\n requestBuilder(request, options);\n } else {\n options = { ...options, ...restOfConfig };\n }\n for (const k in options) {\n if (options[k] === undefined) {\n delete options[k];\n }\n }\n return options;\n}\n\nfunction toGenerateResponse(result: ImagesResponse): GenerateResponseData {\n const images = result.data;\n if (!images) {\n return { finishReason: 'stop' };\n } else {\n const content = (result.data ?? []).map((image) => ({\n media: {\n contentType: 'image/png',\n url: image.url || `data:image/png;base64,${image.b64_json}`,\n },\n }));\n return { message: { role: 'model', content }, raw: result };\n }\n}\n\n/**\n * Method to define a new Genkit Model that is compatible with Open AI\n * Images API. \n *\n * These models are to be used to create images from a user prompt.\n *\n * @param params An object containing parameters for defining the OpenAI\n * image model.\n * @param params.ai The Genkit AI instance.\n * @param params.name The name of the model.\n * @param params.client The OpenAI client instance.\n * @param params.modelRef Optional reference to the model's configuration and\n * custom options.\n\n * @returns the created {@link ModelAction}\n */\nexport function defineCompatOpenAIImageModel<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n ai: Genkit;\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: ImageRequestBuilder;\n}): ModelAction<CustomOptions> {\n const { ai, name, client, modelRef, requestBuilder } = params;\n const modelName = name.substring(name.indexOf('/') + 1);\n\n return ai.defineModel(\n {\n name,\n ...modelRef?.info,\n apiVersion: 'v2',\n configSchema: modelRef?.configSchema,\n },\n async (request, { abortSignal }) => {\n const result = await client.images.generate(\n toImageGenerateParams(modelName!, request, requestBuilder),\n { signal: abortSignal }\n );\n return toGenerateResponse(result);\n }\n );\n}\n\n/** Image generation ModelRef helper, with reasonable defaults for\n * OpenAI-compatible providers */\nexport function compatOaiImageModelRef<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n name: string;\n info?: ModelInfo;\n configSchema?: CustomOptions;\n config?: any;\n}) {\n const {\n name,\n info = IMAGE_GENERATION_MODEL_INFO,\n configSchema,\n config = undefined,\n } = params;\n return modelRef({\n name,\n configSchema:\n configSchema || (ImageGenerationCommonConfigSchema as z.AnyZodObject),\n info,\n config,\n });\n}\n"],"mappings":"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","names":["modelRef"]}
package/lib/image.mjs CHANGED
@@ -14,7 +14,7 @@ const ImageGenerationCommonConfigSchema = z.object({
14
14
  user: z.string().optional(),
15
15
  n: z.number().int().min(1).max(10).default(1),
16
16
  quality: z.enum(["standard", "hd"]).optional(),
17
- response_format: z.enum(["b64_json", "url"]).optional()
17
+ response_format: z.enum(["b64_json", "url"]).default("b64_json").optional()
18
18
  });
19
19
  function toImageGenerateParams(modelName, request, requestBuilder) {
20
20
  const {
@@ -60,7 +60,7 @@ function toGenerateResponse(result) {
60
60
  }
61
61
  function defineCompatOpenAIImageModel(params) {
62
62
  const { ai, name, client, modelRef: modelRef2, requestBuilder } = params;
63
- const model = name.split("/").pop();
63
+ const modelName = name.substring(name.indexOf("/") + 1);
64
64
  return ai.defineModel(
65
65
  {
66
66
  name,
@@ -70,7 +70,7 @@ function defineCompatOpenAIImageModel(params) {
70
70
  },
71
71
  async (request, { abortSignal }) => {
72
72
  const result = await client.images.generate(
73
- toImageGenerateParams(model, request, requestBuilder),
73
+ toImageGenerateParams(modelName, request, requestBuilder),
74
74
  { signal: abortSignal }
75
75
  );
76
76
  return toGenerateResponse(result);
package/lib/image.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/image.ts"],"sourcesContent":["/**\n * Copyright 2024 The Fire Company\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport type {\n GenerateRequest,\n GenerateResponseData,\n Genkit,\n ModelReference,\n} from 'genkit';\nimport { Message, modelRef, z } from 'genkit';\nimport { ModelAction, ModelInfo } from 'genkit/model';\nimport OpenAI from 'openai';\nimport type {\n ImageGenerateParams,\n ImagesResponse,\n} from 'openai/resources/images.mjs';\n\nexport type ImageRequestBuilder = (\n req: GenerateRequest,\n params: ImageGenerateParams\n) => void;\n\nexport const IMAGE_GENERATION_MODEL_INFO: ModelInfo = {\n supports: {\n media: false,\n output: ['media'],\n multiturn: false,\n systemRole: false,\n tools: false,\n },\n};\n\nexport const ImageGenerationCommonConfigSchema = z.object({\n size: z.enum(['1024x1024', '1792x1024', '1024x1792']).optional(),\n style: z.enum(['vivid', 'natural']).optional(),\n user: z.string().optional(),\n n: z.number().int().min(1).max(10).default(1),\n quality: z.enum(['standard', 'hd']).optional(),\n response_format: z.enum(['b64_json', 'url']).optional(),\n});\n\nfunction toImageGenerateParams(\n modelName: string,\n request: GenerateRequest,\n requestBuilder?: ImageRequestBuilder\n): ImageGenerateParams {\n const {\n temperature,\n version: modelVersion,\n maxOutputTokens,\n stopSequences,\n topK,\n topP,\n response_format,\n ...restOfConfig\n } = request.config ?? {};\n\n let options: ImageGenerateParams = {\n model: modelVersion ?? modelName,\n prompt: new Message(request.messages[0]).text,\n response_format: response_format || 'b64_json',\n };\n if (requestBuilder) {\n requestBuilder(request, options);\n } else {\n options = { ...options, ...restOfConfig };\n }\n for (const k in options) {\n if (options[k] === undefined) {\n delete options[k];\n }\n }\n return options;\n}\n\nfunction toGenerateResponse(result: ImagesResponse): GenerateResponseData {\n const images = result.data;\n if (!images) {\n return { finishReason: 'stop' };\n } else {\n const content = (result.data ?? []).map((image) => ({\n media: {\n contentType: 'image/png',\n url: image.url || `data:image/png;base64,${image.b64_json}`,\n },\n }));\n return { message: { role: 'model', content }, raw: result };\n }\n}\n\n/**\n * Method to define a new Genkit Model that is compatible with Open AI\n * Images API. \n *\n * These models are to be used to create images from a user prompt.\n *\n * @param params An object containing parameters for defining the OpenAI\n * image model.\n * @param params.ai The Genkit AI instance.\n * @param params.name The name of the model.\n * @param params.client The OpenAI client instance.\n * @param params.modelRef Optional reference to the model's configuration and\n * custom options.\n\n * @returns the created {@link ModelAction}\n */\nexport function defineCompatOpenAIImageModel<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n ai: Genkit;\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: ImageRequestBuilder;\n}): ModelAction<CustomOptions> {\n const { ai, name, client, modelRef, requestBuilder } = params;\n const model = name.split('/').pop();\n\n return ai.defineModel(\n {\n name,\n ...modelRef?.info,\n apiVersion: 'v2',\n configSchema: modelRef?.configSchema,\n },\n async (request, { abortSignal }) => {\n const result = await client.images.generate(\n toImageGenerateParams(model!, request, requestBuilder),\n { signal: abortSignal }\n );\n return toGenerateResponse(result);\n }\n );\n}\n\n/** Image generation ModelRef helper, with reasonable defaults for\n * OpenAI-compatible providers */\nexport function compatOaiImageModelRef<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n name: string;\n info?: ModelInfo;\n configSchema?: CustomOptions;\n config?: any;\n}) {\n const {\n name,\n info = IMAGE_GENERATION_MODEL_INFO,\n configSchema,\n config = undefined,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (ImageGenerationCommonConfigSchema as any),\n info,\n config,\n });\n}\n"],"mappings":"AAsBA,SAAS,SAAS,UAAU,SAAS;AAa9B,MAAM,8BAAyC;AAAA,EACpD,UAAU;AAAA,IACR,OAAO;AAAA,IACP,QAAQ,CAAC,OAAO;AAAA,IAChB,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AACF;AAEO,MAAM,oCAAoC,EAAE,OAAO;AAAA,EACxD,MAAM,EAAE,KAAK,CAAC,aAAa,aAAa,WAAW,CAAC,EAAE,SAAS;AAAA,EAC/D,OAAO,EAAE,KAAK,CAAC,SAAS,SAAS,CAAC,EAAE,SAAS;AAAA,EAC7C,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC;AAAA,EAC5C,SAAS,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,SAAS;AAAA,EAC7C,iBAAiB,EAAE,KAAK,CAAC,YAAY,KAAK,CAAC,EAAE,SAAS;AACxD,CAAC;AAED,SAAS,sBACP,WACA,SACA,gBACqB;AACrB,QAAM;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI,QAAQ,UAAU,CAAC;AAEvB,MAAI,UAA+B;AAAA,IACjC,OAAO,gBAAgB;AAAA,IACvB,QAAQ,IAAI,QAAQ,QAAQ,SAAS,CAAC,CAAC,EAAE;AAAA,IACzC,iBAAiB,mBAAmB;AAAA,EACtC;AACA,MAAI,gBAAgB;AAClB,mBAAe,SAAS,OAAO;AAAA,EACjC,OAAO;AACL,cAAU,EAAE,GAAG,SAAS,GAAG,aAAa;AAAA,EAC1C;AACA,aAAW,KAAK,SAAS;AACvB,QAAI,QAAQ,CAAC,MAAM,QAAW;AAC5B,aAAO,QAAQ,CAAC;AAAA,IAClB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,QAA8C;AACxE,QAAM,SAAS,OAAO;AACtB,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,cAAc,OAAO;AAAA,EAChC,OAAO;AACL,UAAM,WAAW,OAAO,QAAQ,CAAC,GAAG,IAAI,CAAC,WAAW;AAAA,MAClD,OAAO;AAAA,QACL,aAAa;AAAA,QACb,KAAK,MAAM,OAAO,yBAAyB,MAAM,QAAQ;AAAA,MAC3D;AAAA,IACF,EAAE;AACF,WAAO,EAAE,SAAS,EAAE,MAAM,SAAS,QAAQ,GAAG,KAAK,OAAO;AAAA,EAC5D;AACF;AAkBO,SAAS,6BAEd,QAM6B;AAC7B,QAAM,EAAE,IAAI,MAAM,QAAQ,UAAAA,WAAU,eAAe,IAAI;AACvD,QAAM,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI;AAElC,SAAO,GAAG;AAAA,IACR;AAAA,MACE;AAAA,MACA,GAAGA,WAAU;AAAA,MACb,YAAY;AAAA,MACZ,cAAcA,WAAU;AAAA,IAC1B;AAAA,IACA,OAAO,SAAS,EAAE,YAAY,MAAM;AAClC,YAAM,SAAS,MAAM,OAAO,OAAO;AAAA,QACjC,sBAAsB,OAAQ,SAAS,cAAc;AAAA,QACrD,EAAE,QAAQ,YAAY;AAAA,MACxB;AACA,aAAO,mBAAmB,MAAM;AAAA,IAClC;AAAA,EACF;AACF;AAIO,SAAS,uBAEd,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,EACF,CAAC;AACH;","names":["modelRef"]}
1
+ {"version":3,"sources":["../src/image.ts"],"sourcesContent":["/**\n * Copyright 2024 The Fire Company\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport type {\n GenerateRequest,\n GenerateResponseData,\n Genkit,\n ModelReference,\n} from 'genkit';\nimport { Message, modelRef, z } from 'genkit';\nimport { ModelAction, ModelInfo } from 'genkit/model';\nimport OpenAI from 'openai';\nimport type {\n ImageGenerateParams,\n ImagesResponse,\n} from 'openai/resources/images.mjs';\n\nexport type ImageRequestBuilder = (\n req: GenerateRequest,\n params: ImageGenerateParams\n) => void;\n\nexport const IMAGE_GENERATION_MODEL_INFO: ModelInfo = {\n supports: {\n media: false,\n output: ['media'],\n multiturn: false,\n systemRole: false,\n tools: false,\n },\n};\n\nexport const ImageGenerationCommonConfigSchema = z.object({\n size: z.enum(['1024x1024', '1792x1024', '1024x1792']).optional(),\n style: z.enum(['vivid', 'natural']).optional(),\n user: z.string().optional(),\n n: z.number().int().min(1).max(10).default(1),\n quality: z.enum(['standard', 'hd']).optional(),\n response_format: z.enum(['b64_json', 'url']).default('b64_json').optional(),\n});\n\nfunction toImageGenerateParams(\n modelName: string,\n request: GenerateRequest,\n requestBuilder?: ImageRequestBuilder\n): ImageGenerateParams {\n const {\n temperature,\n version: modelVersion,\n maxOutputTokens,\n stopSequences,\n topK,\n topP,\n response_format,\n ...restOfConfig\n } = request.config ?? {};\n\n let options: ImageGenerateParams = {\n model: modelVersion ?? modelName,\n prompt: new Message(request.messages[0]).text,\n response_format: response_format || 'b64_json',\n };\n if (requestBuilder) {\n requestBuilder(request, options);\n } else {\n options = { ...options, ...restOfConfig };\n }\n for (const k in options) {\n if (options[k] === undefined) {\n delete options[k];\n }\n }\n return options;\n}\n\nfunction toGenerateResponse(result: ImagesResponse): GenerateResponseData {\n const images = result.data;\n if (!images) {\n return { finishReason: 'stop' };\n } else {\n const content = (result.data ?? []).map((image) => ({\n media: {\n contentType: 'image/png',\n url: image.url || `data:image/png;base64,${image.b64_json}`,\n },\n }));\n return { message: { role: 'model', content }, raw: result };\n }\n}\n\n/**\n * Method to define a new Genkit Model that is compatible with Open AI\n * Images API. \n *\n * These models are to be used to create images from a user prompt.\n *\n * @param params An object containing parameters for defining the OpenAI\n * image model.\n * @param params.ai The Genkit AI instance.\n * @param params.name The name of the model.\n * @param params.client The OpenAI client instance.\n * @param params.modelRef Optional reference to the model's configuration and\n * custom options.\n\n * @returns the created {@link ModelAction}\n */\nexport function defineCompatOpenAIImageModel<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n ai: Genkit;\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: ImageRequestBuilder;\n}): ModelAction<CustomOptions> {\n const { ai, name, client, modelRef, requestBuilder } = params;\n const modelName = name.substring(name.indexOf('/') + 1);\n\n return ai.defineModel(\n {\n name,\n ...modelRef?.info,\n apiVersion: 'v2',\n configSchema: modelRef?.configSchema,\n },\n async (request, { abortSignal }) => {\n const result = await client.images.generate(\n toImageGenerateParams(modelName!, request, requestBuilder),\n { signal: abortSignal }\n );\n return toGenerateResponse(result);\n }\n );\n}\n\n/** Image generation ModelRef helper, with reasonable defaults for\n * OpenAI-compatible providers */\nexport function compatOaiImageModelRef<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n name: string;\n info?: ModelInfo;\n configSchema?: CustomOptions;\n config?: any;\n}) {\n const {\n name,\n info = IMAGE_GENERATION_MODEL_INFO,\n configSchema,\n config = undefined,\n } = params;\n return modelRef({\n name,\n configSchema:\n configSchema || (ImageGenerationCommonConfigSchema as z.AnyZodObject),\n info,\n config,\n });\n}\n"],"mappings":"AAsBA,SAAS,SAAS,UAAU,SAAS;AAa9B,MAAM,8BAAyC;AAAA,EACpD,UAAU;AAAA,IACR,OAAO;AAAA,IACP,QAAQ,CAAC,OAAO;AAAA,IAChB,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AACF;AAEO,MAAM,oCAAoC,EAAE,OAAO;AAAA,EACxD,MAAM,EAAE,KAAK,CAAC,aAAa,aAAa,WAAW,CAAC,EAAE,SAAS;AAAA,EAC/D,OAAO,EAAE,KAAK,CAAC,SAAS,SAAS,CAAC,EAAE,SAAS;AAAA,EAC7C,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC;AAAA,EAC5C,SAAS,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,SAAS;AAAA,EAC7C,iBAAiB,EAAE,KAAK,CAAC,YAAY,KAAK,CAAC,EAAE,QAAQ,UAAU,EAAE,SAAS;AAC5E,CAAC;AAED,SAAS,sBACP,WACA,SACA,gBACqB;AACrB,QAAM;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI,QAAQ,UAAU,CAAC;AAEvB,MAAI,UAA+B;AAAA,IACjC,OAAO,gBAAgB;AAAA,IACvB,QAAQ,IAAI,QAAQ,QAAQ,SAAS,CAAC,CAAC,EAAE;AAAA,IACzC,iBAAiB,mBAAmB;AAAA,EACtC;AACA,MAAI,gBAAgB;AAClB,mBAAe,SAAS,OAAO;AAAA,EACjC,OAAO;AACL,cAAU,EAAE,GAAG,SAAS,GAAG,aAAa;AAAA,EAC1C;AACA,aAAW,KAAK,SAAS;AACvB,QAAI,QAAQ,CAAC,MAAM,QAAW;AAC5B,aAAO,QAAQ,CAAC;AAAA,IAClB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,QAA8C;AACxE,QAAM,SAAS,OAAO;AACtB,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,cAAc,OAAO;AAAA,EAChC,OAAO;AACL,UAAM,WAAW,OAAO,QAAQ,CAAC,GAAG,IAAI,CAAC,WAAW;AAAA,MAClD,OAAO;AAAA,QACL,aAAa;AAAA,QACb,KAAK,MAAM,OAAO,yBAAyB,MAAM,QAAQ;AAAA,MAC3D;AAAA,IACF,EAAE;AACF,WAAO,EAAE,SAAS,EAAE,MAAM,SAAS,QAAQ,GAAG,KAAK,OAAO;AAAA,EAC5D;AACF;AAkBO,SAAS,6BAEd,QAM6B;AAC7B,QAAM,EAAE,IAAI,MAAM,QAAQ,UAAAA,WAAU,eAAe,IAAI;AACvD,QAAM,YAAY,KAAK,UAAU,KAAK,QAAQ,GAAG,IAAI,CAAC;AAEtD,SAAO,GAAG;AAAA,IACR;AAAA,MACE;AAAA,MACA,GAAGA,WAAU;AAAA,MACb,YAAY;AAAA,MACZ,cAAcA,WAAU;AAAA,IAC1B;AAAA,IACA,OAAO,SAAS,EAAE,YAAY,MAAM;AAClC,YAAM,SAAS,MAAM,OAAO,OAAO;AAAA,QACjC,sBAAsB,WAAY,SAAS,cAAc;AAAA,QACzD,EAAE,QAAQ,YAAY;AAAA,MACxB;AACA,aAAO,mBAAmB,MAAM;AAAA,IAClC;AAAA,EACF;AACF;AAIO,SAAS,uBAEd,QAKC;AACD,QAAM;AAAA,IACJ;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,SAAS;AAAA,EACX,IAAI;AACJ,SAAO,SAAS;AAAA,IACd;AAAA,IACA,cACE,gBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,EACF,CAAC;AACH;","names":["modelRef"]}
package/lib/index.d.mts CHANGED
@@ -2,6 +2,14 @@ import * as genkit_plugin from 'genkit/plugin';
2
2
  import { Genkit, ActionMetadata } from 'genkit';
3
3
  import { ActionType } from 'genkit/registry';
4
4
  import { ClientOptions, OpenAI } from 'openai';
5
+ export { SpeechConfigSchema, SpeechRequestBuilder, TranscriptionConfigSchema, TranscriptionRequestBuilder, compatOaiSpeechModelRef, compatOaiTranscriptionModelRef, defineCompatOpenAISpeechModel, defineCompatOpenAITranscriptionModel } from './audio.mjs';
6
+ export { defineCompatOpenAIEmbedder } from './embedder.mjs';
7
+ export { ImageGenerationCommonConfigSchema, ImageRequestBuilder, compatOaiImageModelRef, defineCompatOpenAIImageModel } from './image.mjs';
8
+ export { ChatCompletionCommonConfigSchema, ModelRequestBuilder, compatOaiModelRef, defineCompatOpenAIModel, openAIModelRunner } from './model.mjs';
9
+ import 'genkit/model';
10
+ import 'openai/resources/audio/index.mjs';
11
+ import 'openai/resources/images.mjs';
12
+ import 'openai/resources/index.mjs';
5
13
 
6
14
  interface PluginOptions extends Partial<ClientOptions> {
7
15
  name: string;
package/lib/index.d.ts CHANGED
@@ -2,6 +2,14 @@ import * as genkit_plugin from 'genkit/plugin';
2
2
  import { Genkit, ActionMetadata } from 'genkit';
3
3
  import { ActionType } from 'genkit/registry';
4
4
  import { ClientOptions, OpenAI } from 'openai';
5
+ export { SpeechConfigSchema, SpeechRequestBuilder, TranscriptionConfigSchema, TranscriptionRequestBuilder, compatOaiSpeechModelRef, compatOaiTranscriptionModelRef, defineCompatOpenAISpeechModel, defineCompatOpenAITranscriptionModel } from './audio.js';
6
+ export { defineCompatOpenAIEmbedder } from './embedder.js';
7
+ export { ImageGenerationCommonConfigSchema, ImageRequestBuilder, compatOaiImageModelRef, defineCompatOpenAIImageModel } from './image.js';
8
+ export { ChatCompletionCommonConfigSchema, ModelRequestBuilder, compatOaiModelRef, defineCompatOpenAIModel, openAIModelRunner } from './model.js';
9
+ import 'genkit/model';
10
+ import 'openai/resources/audio/index.mjs';
11
+ import 'openai/resources/images.mjs';
12
+ import 'openai/resources/index.mjs';
5
13
 
6
14
  interface PluginOptions extends Partial<ClientOptions> {
7
15
  name: string;