@genkit-ai/compat-oai 1.15.4 → 1.16.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.
@@ -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/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 {
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 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:\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 {
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 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:\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,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,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;
package/lib/index.js CHANGED
@@ -18,12 +18,30 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var index_exports = {};
20
20
  __export(index_exports, {
21
+ ChatCompletionCommonConfigSchema: () => import_model.ChatCompletionCommonConfigSchema,
22
+ ImageGenerationCommonConfigSchema: () => import_image.ImageGenerationCommonConfigSchema,
23
+ SpeechConfigSchema: () => import_audio.SpeechConfigSchema,
24
+ TranscriptionConfigSchema: () => import_audio.TranscriptionConfigSchema,
25
+ compatOaiImageModelRef: () => import_image.compatOaiImageModelRef,
26
+ compatOaiModelRef: () => import_model.compatOaiModelRef,
27
+ compatOaiSpeechModelRef: () => import_audio.compatOaiSpeechModelRef,
28
+ compatOaiTranscriptionModelRef: () => import_audio.compatOaiTranscriptionModelRef,
21
29
  default: () => index_default,
22
- openAICompatible: () => openAICompatible
30
+ defineCompatOpenAIEmbedder: () => import_embedder.defineCompatOpenAIEmbedder,
31
+ defineCompatOpenAIImageModel: () => import_image.defineCompatOpenAIImageModel,
32
+ defineCompatOpenAIModel: () => import_model.defineCompatOpenAIModel,
33
+ defineCompatOpenAISpeechModel: () => import_audio.defineCompatOpenAISpeechModel,
34
+ defineCompatOpenAITranscriptionModel: () => import_audio.defineCompatOpenAITranscriptionModel,
35
+ openAICompatible: () => openAICompatible,
36
+ openAIModelRunner: () => import_model.openAIModelRunner
23
37
  });
24
38
  module.exports = __toCommonJS(index_exports);
25
39
  var import_plugin = require("genkit/plugin");
26
40
  var import_openai = require("openai");
41
+ var import_audio = require("./audio.js");
42
+ var import_embedder = require("./embedder.js");
43
+ var import_image = require("./image.js");
44
+ var import_model = require("./model.js");
27
45
  const openAICompatible = (options) => {
28
46
  const client = new import_openai.OpenAI(options);
29
47
  let listActionsCache;
@@ -39,18 +57,30 @@ const openAICompatible = (options) => {
39
57
  await options.resolver(ai, client, actionType, actionName);
40
58
  }
41
59
  },
42
- async () => {
43
- if (options.listActions) {
44
- if (listActionsCache) return listActionsCache;
45
- listActionsCache = await options.listActions(client);
46
- return listActionsCache;
47
- }
48
- }
60
+ options.listActions ? async () => {
61
+ if (listActionsCache) return listActionsCache;
62
+ listActionsCache = await options.listActions(client);
63
+ return listActionsCache;
64
+ } : void 0
49
65
  );
50
66
  };
51
67
  var index_default = openAICompatible;
52
68
  // Annotate the CommonJS export names for ESM import in node:
53
69
  0 && (module.exports = {
54
- openAICompatible
70
+ ChatCompletionCommonConfigSchema,
71
+ ImageGenerationCommonConfigSchema,
72
+ SpeechConfigSchema,
73
+ TranscriptionConfigSchema,
74
+ compatOaiImageModelRef,
75
+ compatOaiModelRef,
76
+ compatOaiSpeechModelRef,
77
+ compatOaiTranscriptionModelRef,
78
+ defineCompatOpenAIEmbedder,
79
+ defineCompatOpenAIImageModel,
80
+ defineCompatOpenAIModel,
81
+ defineCompatOpenAISpeechModel,
82
+ defineCompatOpenAITranscriptionModel,
83
+ openAICompatible,
84
+ openAIModelRunner
55
85
  });
56
86
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Copyright 2024 The Fire Company\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ActionMetadata, type Genkit } from 'genkit';\nimport { genkitPlugin } from 'genkit/plugin';\nimport { ActionType } from 'genkit/registry';\nimport { OpenAI, type ClientOptions } from 'openai';\n\nexport interface PluginOptions extends Partial<ClientOptions> {\n name: string;\n initializer?: (ai: Genkit, client: OpenAI) => Promise<void>;\n resolver?: (\n ai: Genkit,\n client: OpenAI,\n actionType: ActionType,\n actionName: string\n ) => Promise<void>;\n listActions?: (client: OpenAI) => Promise<ActionMetadata[]>;\n}\n\n/**\n * This module provides the `openAICompatible` plugin factory for Genkit. It\n * enables interaction with OpenAI-compatible API endpoints, allowing users to\n * leverage various AI models by configuring API keys and other client options.\n *\n * The core export is `openAICompatible`, a function that accepts\n * `PluginOptions` and returns a Genkit plugin.\n *\n * Key `PluginOptions` include:\n * - `name`: A string to uniquely identify this plugin instance\n * (e.g., 'deepSeek', 'customOpenAI').\n * - `apiKey`: The API key for the service. If not provided directly, the\n * plugin will attempt to use the `OPENAI_API_KEY` environment variable.\n * - `initializer`: An optional asynchronous function for custom setup after\n * the OpenAI client is initialized. It receives the Genkit instance and the\n * OpenAI client.\n * - Additional properties from OpenAI's `ClientOptions` (like `baseURL`,\n * `timeout`, etc.) can be passed to customize the OpenAI client.\n *\n * The returned plugin initializes an OpenAI client tailored to the provided\n * options, making configured models available for use within Genkit flows.\n *\n * @param {PluginOptions} options - Configuration options for the plugin.\n * @returns A Genkit plugin configured for an OpenAI-compatible service.\n *\n * Usage: Import `openAICompatible` (or your chosen import name for the default\n * export) from this package (e.g., `genkitx-openai`). Then, invoke it within\n * the `plugins` array of `configureGenkit`, providing the necessary\n * `PluginOptions`.\n *\n * Example:\n * ```typescript\n * import myOpenAICompatiblePlugin from 'genkitx-openai'; // Default import\n *\n * export default configureGenkit({\n * plugins: [\n * myOpenAICompatiblePlugin({\n * name: 'gpt4o', // Name for this specific plugin configuration\n * apiKey: process.env.OPENAI_API_KEY,\n * // For a non-OpenAI compatible endpoint:\n * // baseURL: 'https://api.custom-llm-provider.com/v1',\n * }),\n * myOpenAICompatiblePlugin({\n * name: 'localLlama',\n * apiKey: 'ollama', // Or specific key if required by local server\n * baseURL: 'http://localhost:11434/v1', // Example for Ollama\n * }),\n * // ... other plugins\n * ],\n * });\n * ```\n */\nexport const openAICompatible = (options: PluginOptions) => {\n const client = new OpenAI(options);\n let listActionsCache;\n return genkitPlugin(\n options.name,\n async (ai: Genkit) => {\n if (options.initializer) {\n await options.initializer(ai, client);\n }\n },\n async (ai: Genkit, actionType: ActionType, actionName: string) => {\n if (options.resolver) {\n await options.resolver(ai, client, actionType, actionName);\n }\n },\n async () => {\n if (options.listActions) {\n if (listActionsCache) return listActionsCache;\n listActionsCache = await options.listActions(client);\n return listActionsCache;\n }\n }\n );\n};\n\nexport default openAICompatible;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBA,oBAA6B;AAE7B,oBAA2C;AAkEpC,MAAM,mBAAmB,CAAC,YAA2B;AAC1D,QAAM,SAAS,IAAI,qBAAO,OAAO;AACjC,MAAI;AACJ,aAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,OAAe;AACpB,UAAI,QAAQ,aAAa;AACvB,cAAM,QAAQ,YAAY,IAAI,MAAM;AAAA,MACtC;AAAA,IACF;AAAA,IACA,OAAO,IAAY,YAAwB,eAAuB;AAChE,UAAI,QAAQ,UAAU;AACpB,cAAM,QAAQ,SAAS,IAAI,QAAQ,YAAY,UAAU;AAAA,MAC3D;AAAA,IACF;AAAA,IACA,YAAY;AACV,UAAI,QAAQ,aAAa;AACvB,YAAI,iBAAkB,QAAO;AAC7B,2BAAmB,MAAM,QAAQ,YAAY,MAAM;AACnD,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAO,gBAAQ;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Copyright 2024 The Fire Company\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ActionMetadata, type Genkit } from 'genkit';\nimport { genkitPlugin } from 'genkit/plugin';\nimport { ActionType } from 'genkit/registry';\nimport { OpenAI, type ClientOptions } from 'openai';\n\nexport {\n SpeechConfigSchema,\n TranscriptionConfigSchema,\n compatOaiSpeechModelRef,\n compatOaiTranscriptionModelRef,\n defineCompatOpenAISpeechModel,\n defineCompatOpenAITranscriptionModel,\n type SpeechRequestBuilder,\n type TranscriptionRequestBuilder,\n} from './audio.js';\nexport { defineCompatOpenAIEmbedder } from './embedder.js';\nexport {\n ImageGenerationCommonConfigSchema,\n compatOaiImageModelRef,\n defineCompatOpenAIImageModel,\n type ImageRequestBuilder,\n} from './image.js';\nexport {\n ChatCompletionCommonConfigSchema,\n compatOaiModelRef,\n defineCompatOpenAIModel,\n openAIModelRunner,\n type ModelRequestBuilder,\n} from './model.js';\n\nexport interface PluginOptions extends Partial<ClientOptions> {\n name: string;\n initializer?: (ai: Genkit, client: OpenAI) => Promise<void>;\n resolver?: (\n ai: Genkit,\n client: OpenAI,\n actionType: ActionType,\n actionName: string\n ) => Promise<void>;\n listActions?: (client: OpenAI) => Promise<ActionMetadata[]>;\n}\n\n/**\n * This module provides the `openAICompatible` plugin factory for Genkit. It\n * enables interaction with OpenAI-compatible API endpoints, allowing users to\n * leverage various AI models by configuring API keys and other client options.\n *\n * The core export is `openAICompatible`, a function that accepts\n * `PluginOptions` and returns a Genkit plugin.\n *\n * Key `PluginOptions` include:\n * - `name`: A string to uniquely identify this plugin instance\n * (e.g., 'deepSeek', 'customOpenAI').\n * - `apiKey`: The API key for the service. If not provided directly, the\n * plugin will attempt to use the `OPENAI_API_KEY` environment variable.\n * - `initializer`: An optional asynchronous function for custom setup after\n * the OpenAI client is initialized. It receives the Genkit instance and the\n * OpenAI client.\n * - Additional properties from OpenAI's `ClientOptions` (like `baseURL`,\n * `timeout`, etc.) can be passed to customize the OpenAI client.\n *\n * The returned plugin initializes an OpenAI client tailored to the provided\n * options, making configured models available for use within Genkit flows.\n *\n * @param {PluginOptions} options - Configuration options for the plugin.\n * @returns A Genkit plugin configured for an OpenAI-compatible service.\n *\n * Usage: Import `openAICompatible` (or your chosen import name for the default\n * export) from this package (e.g., `genkitx-openai`). Then, invoke it within\n * the `plugins` array of `configureGenkit`, providing the necessary\n * `PluginOptions`.\n *\n * Example:\n * ```typescript\n * import myOpenAICompatiblePlugin from 'genkitx-openai'; // Default import\n *\n * export default configureGenkit({\n * plugins: [\n * myOpenAICompatiblePlugin({\n * name: 'gpt4o', // Name for this specific plugin configuration\n * apiKey: process.env.OPENAI_API_KEY,\n * // For a non-OpenAI compatible endpoint:\n * // baseURL: 'https://api.custom-llm-provider.com/v1',\n * }),\n * myOpenAICompatiblePlugin({\n * name: 'localLlama',\n * apiKey: 'ollama', // Or specific key if required by local server\n * baseURL: 'http://localhost:11434/v1', // Example for Ollama\n * }),\n * // ... other plugins\n * ],\n * });\n * ```\n */\nexport const openAICompatible = (options: PluginOptions) => {\n const client = new OpenAI(options);\n let listActionsCache;\n return genkitPlugin(\n options.name,\n async (ai: Genkit) => {\n if (options.initializer) {\n await options.initializer(ai, client);\n }\n },\n async (ai: Genkit, actionType: ActionType, actionName: string) => {\n if (options.resolver) {\n await options.resolver(ai, client, actionType, actionName);\n }\n },\n options.listActions\n ? async () => {\n if (listActionsCache) return listActionsCache;\n listActionsCache = await options.listActions!(client);\n return listActionsCache;\n }\n : undefined\n );\n};\n\nexport default openAICompatible;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBA,oBAA6B;AAE7B,oBAA2C;AAE3C,mBASO;AACP,sBAA2C;AAC3C,mBAKO;AACP,mBAMO;AAkEA,MAAM,mBAAmB,CAAC,YAA2B;AAC1D,QAAM,SAAS,IAAI,qBAAO,OAAO;AACjC,MAAI;AACJ,aAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,OAAe;AACpB,UAAI,QAAQ,aAAa;AACvB,cAAM,QAAQ,YAAY,IAAI,MAAM;AAAA,MACtC;AAAA,IACF;AAAA,IACA,OAAO,IAAY,YAAwB,eAAuB;AAChE,UAAI,QAAQ,UAAU;AACpB,cAAM,QAAQ,SAAS,IAAI,QAAQ,YAAY,UAAU;AAAA,MAC3D;AAAA,IACF;AAAA,IACA,QAAQ,cACJ,YAAY;AACV,UAAI,iBAAkB,QAAO;AAC7B,yBAAmB,MAAM,QAAQ,YAAa,MAAM;AACpD,aAAO;AAAA,IACT,IACA;AAAA,EACN;AACF;AAEA,IAAO,gBAAQ;","names":[]}
package/lib/index.mjs CHANGED
@@ -1,5 +1,25 @@
1
1
  import { genkitPlugin } from "genkit/plugin";
2
2
  import { OpenAI } from "openai";
3
+ import {
4
+ SpeechConfigSchema,
5
+ TranscriptionConfigSchema,
6
+ compatOaiSpeechModelRef,
7
+ compatOaiTranscriptionModelRef,
8
+ defineCompatOpenAISpeechModel,
9
+ defineCompatOpenAITranscriptionModel
10
+ } from "./audio.js";
11
+ import { defineCompatOpenAIEmbedder } from "./embedder.js";
12
+ import {
13
+ ImageGenerationCommonConfigSchema,
14
+ compatOaiImageModelRef,
15
+ defineCompatOpenAIImageModel
16
+ } from "./image.js";
17
+ import {
18
+ ChatCompletionCommonConfigSchema,
19
+ compatOaiModelRef,
20
+ defineCompatOpenAIModel,
21
+ openAIModelRunner
22
+ } from "./model.js";
3
23
  const openAICompatible = (options) => {
4
24
  const client = new OpenAI(options);
5
25
  let listActionsCache;
@@ -15,18 +35,30 @@ const openAICompatible = (options) => {
15
35
  await options.resolver(ai, client, actionType, actionName);
16
36
  }
17
37
  },
18
- async () => {
19
- if (options.listActions) {
20
- if (listActionsCache) return listActionsCache;
21
- listActionsCache = await options.listActions(client);
22
- return listActionsCache;
23
- }
24
- }
38
+ options.listActions ? async () => {
39
+ if (listActionsCache) return listActionsCache;
40
+ listActionsCache = await options.listActions(client);
41
+ return listActionsCache;
42
+ } : void 0
25
43
  );
26
44
  };
27
45
  var index_default = openAICompatible;
28
46
  export {
47
+ ChatCompletionCommonConfigSchema,
48
+ ImageGenerationCommonConfigSchema,
49
+ SpeechConfigSchema,
50
+ TranscriptionConfigSchema,
51
+ compatOaiImageModelRef,
52
+ compatOaiModelRef,
53
+ compatOaiSpeechModelRef,
54
+ compatOaiTranscriptionModelRef,
29
55
  index_default as default,
30
- openAICompatible
56
+ defineCompatOpenAIEmbedder,
57
+ defineCompatOpenAIImageModel,
58
+ defineCompatOpenAIModel,
59
+ defineCompatOpenAISpeechModel,
60
+ defineCompatOpenAITranscriptionModel,
61
+ openAICompatible,
62
+ openAIModelRunner
31
63
  };
32
64
  //# sourceMappingURL=index.mjs.map
package/lib/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Copyright 2024 The Fire Company\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ActionMetadata, type Genkit } from 'genkit';\nimport { genkitPlugin } from 'genkit/plugin';\nimport { ActionType } from 'genkit/registry';\nimport { OpenAI, type ClientOptions } from 'openai';\n\nexport interface PluginOptions extends Partial<ClientOptions> {\n name: string;\n initializer?: (ai: Genkit, client: OpenAI) => Promise<void>;\n resolver?: (\n ai: Genkit,\n client: OpenAI,\n actionType: ActionType,\n actionName: string\n ) => Promise<void>;\n listActions?: (client: OpenAI) => Promise<ActionMetadata[]>;\n}\n\n/**\n * This module provides the `openAICompatible` plugin factory for Genkit. It\n * enables interaction with OpenAI-compatible API endpoints, allowing users to\n * leverage various AI models by configuring API keys and other client options.\n *\n * The core export is `openAICompatible`, a function that accepts\n * `PluginOptions` and returns a Genkit plugin.\n *\n * Key `PluginOptions` include:\n * - `name`: A string to uniquely identify this plugin instance\n * (e.g., 'deepSeek', 'customOpenAI').\n * - `apiKey`: The API key for the service. If not provided directly, the\n * plugin will attempt to use the `OPENAI_API_KEY` environment variable.\n * - `initializer`: An optional asynchronous function for custom setup after\n * the OpenAI client is initialized. It receives the Genkit instance and the\n * OpenAI client.\n * - Additional properties from OpenAI's `ClientOptions` (like `baseURL`,\n * `timeout`, etc.) can be passed to customize the OpenAI client.\n *\n * The returned plugin initializes an OpenAI client tailored to the provided\n * options, making configured models available for use within Genkit flows.\n *\n * @param {PluginOptions} options - Configuration options for the plugin.\n * @returns A Genkit plugin configured for an OpenAI-compatible service.\n *\n * Usage: Import `openAICompatible` (or your chosen import name for the default\n * export) from this package (e.g., `genkitx-openai`). Then, invoke it within\n * the `plugins` array of `configureGenkit`, providing the necessary\n * `PluginOptions`.\n *\n * Example:\n * ```typescript\n * import myOpenAICompatiblePlugin from 'genkitx-openai'; // Default import\n *\n * export default configureGenkit({\n * plugins: [\n * myOpenAICompatiblePlugin({\n * name: 'gpt4o', // Name for this specific plugin configuration\n * apiKey: process.env.OPENAI_API_KEY,\n * // For a non-OpenAI compatible endpoint:\n * // baseURL: 'https://api.custom-llm-provider.com/v1',\n * }),\n * myOpenAICompatiblePlugin({\n * name: 'localLlama',\n * apiKey: 'ollama', // Or specific key if required by local server\n * baseURL: 'http://localhost:11434/v1', // Example for Ollama\n * }),\n * // ... other plugins\n * ],\n * });\n * ```\n */\nexport const openAICompatible = (options: PluginOptions) => {\n const client = new OpenAI(options);\n let listActionsCache;\n return genkitPlugin(\n options.name,\n async (ai: Genkit) => {\n if (options.initializer) {\n await options.initializer(ai, client);\n }\n },\n async (ai: Genkit, actionType: ActionType, actionName: string) => {\n if (options.resolver) {\n await options.resolver(ai, client, actionType, actionName);\n }\n },\n async () => {\n if (options.listActions) {\n if (listActionsCache) return listActionsCache;\n listActionsCache = await options.listActions(client);\n return listActionsCache;\n }\n }\n );\n};\n\nexport default openAICompatible;\n"],"mappings":"AAiBA,SAAS,oBAAoB;AAE7B,SAAS,cAAkC;AAkEpC,MAAM,mBAAmB,CAAC,YAA2B;AAC1D,QAAM,SAAS,IAAI,OAAO,OAAO;AACjC,MAAI;AACJ,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,OAAe;AACpB,UAAI,QAAQ,aAAa;AACvB,cAAM,QAAQ,YAAY,IAAI,MAAM;AAAA,MACtC;AAAA,IACF;AAAA,IACA,OAAO,IAAY,YAAwB,eAAuB;AAChE,UAAI,QAAQ,UAAU;AACpB,cAAM,QAAQ,SAAS,IAAI,QAAQ,YAAY,UAAU;AAAA,MAC3D;AAAA,IACF;AAAA,IACA,YAAY;AACV,UAAI,QAAQ,aAAa;AACvB,YAAI,iBAAkB,QAAO;AAC7B,2BAAmB,MAAM,QAAQ,YAAY,MAAM;AACnD,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAO,gBAAQ;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Copyright 2024 The Fire Company\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ActionMetadata, type Genkit } from 'genkit';\nimport { genkitPlugin } from 'genkit/plugin';\nimport { ActionType } from 'genkit/registry';\nimport { OpenAI, type ClientOptions } from 'openai';\n\nexport {\n SpeechConfigSchema,\n TranscriptionConfigSchema,\n compatOaiSpeechModelRef,\n compatOaiTranscriptionModelRef,\n defineCompatOpenAISpeechModel,\n defineCompatOpenAITranscriptionModel,\n type SpeechRequestBuilder,\n type TranscriptionRequestBuilder,\n} from './audio.js';\nexport { defineCompatOpenAIEmbedder } from './embedder.js';\nexport {\n ImageGenerationCommonConfigSchema,\n compatOaiImageModelRef,\n defineCompatOpenAIImageModel,\n type ImageRequestBuilder,\n} from './image.js';\nexport {\n ChatCompletionCommonConfigSchema,\n compatOaiModelRef,\n defineCompatOpenAIModel,\n openAIModelRunner,\n type ModelRequestBuilder,\n} from './model.js';\n\nexport interface PluginOptions extends Partial<ClientOptions> {\n name: string;\n initializer?: (ai: Genkit, client: OpenAI) => Promise<void>;\n resolver?: (\n ai: Genkit,\n client: OpenAI,\n actionType: ActionType,\n actionName: string\n ) => Promise<void>;\n listActions?: (client: OpenAI) => Promise<ActionMetadata[]>;\n}\n\n/**\n * This module provides the `openAICompatible` plugin factory for Genkit. It\n * enables interaction with OpenAI-compatible API endpoints, allowing users to\n * leverage various AI models by configuring API keys and other client options.\n *\n * The core export is `openAICompatible`, a function that accepts\n * `PluginOptions` and returns a Genkit plugin.\n *\n * Key `PluginOptions` include:\n * - `name`: A string to uniquely identify this plugin instance\n * (e.g., 'deepSeek', 'customOpenAI').\n * - `apiKey`: The API key for the service. If not provided directly, the\n * plugin will attempt to use the `OPENAI_API_KEY` environment variable.\n * - `initializer`: An optional asynchronous function for custom setup after\n * the OpenAI client is initialized. It receives the Genkit instance and the\n * OpenAI client.\n * - Additional properties from OpenAI's `ClientOptions` (like `baseURL`,\n * `timeout`, etc.) can be passed to customize the OpenAI client.\n *\n * The returned plugin initializes an OpenAI client tailored to the provided\n * options, making configured models available for use within Genkit flows.\n *\n * @param {PluginOptions} options - Configuration options for the plugin.\n * @returns A Genkit plugin configured for an OpenAI-compatible service.\n *\n * Usage: Import `openAICompatible` (or your chosen import name for the default\n * export) from this package (e.g., `genkitx-openai`). Then, invoke it within\n * the `plugins` array of `configureGenkit`, providing the necessary\n * `PluginOptions`.\n *\n * Example:\n * ```typescript\n * import myOpenAICompatiblePlugin from 'genkitx-openai'; // Default import\n *\n * export default configureGenkit({\n * plugins: [\n * myOpenAICompatiblePlugin({\n * name: 'gpt4o', // Name for this specific plugin configuration\n * apiKey: process.env.OPENAI_API_KEY,\n * // For a non-OpenAI compatible endpoint:\n * // baseURL: 'https://api.custom-llm-provider.com/v1',\n * }),\n * myOpenAICompatiblePlugin({\n * name: 'localLlama',\n * apiKey: 'ollama', // Or specific key if required by local server\n * baseURL: 'http://localhost:11434/v1', // Example for Ollama\n * }),\n * // ... other plugins\n * ],\n * });\n * ```\n */\nexport const openAICompatible = (options: PluginOptions) => {\n const client = new OpenAI(options);\n let listActionsCache;\n return genkitPlugin(\n options.name,\n async (ai: Genkit) => {\n if (options.initializer) {\n await options.initializer(ai, client);\n }\n },\n async (ai: Genkit, actionType: ActionType, actionName: string) => {\n if (options.resolver) {\n await options.resolver(ai, client, actionType, actionName);\n }\n },\n options.listActions\n ? async () => {\n if (listActionsCache) return listActionsCache;\n listActionsCache = await options.listActions!(client);\n return listActionsCache;\n }\n : undefined\n );\n};\n\nexport default openAICompatible;\n"],"mappings":"AAiBA,SAAS,oBAAoB;AAE7B,SAAS,cAAkC;AAE3C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP,SAAS,kCAAkC;AAC3C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAkEA,MAAM,mBAAmB,CAAC,YAA2B;AAC1D,QAAM,SAAS,IAAI,OAAO,OAAO;AACjC,MAAI;AACJ,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,OAAe;AACpB,UAAI,QAAQ,aAAa;AACvB,cAAM,QAAQ,YAAY,IAAI,MAAM;AAAA,MACtC;AAAA,IACF;AAAA,IACA,OAAO,IAAY,YAAwB,eAAuB;AAChE,UAAI,QAAQ,UAAU;AACpB,cAAM,QAAQ,SAAS,IAAI,QAAQ,YAAY,UAAU;AAAA,MAC3D;AAAA,IACF;AAAA,IACA,QAAQ,cACJ,YAAY;AACV,UAAI,iBAAkB,QAAO;AAC7B,yBAAmB,MAAM,QAAQ,YAAa,MAAM;AACpD,aAAO;AAAA,IACT,IACA;AAAA,EACN;AACF;AAEA,IAAO,gBAAQ;","names":[]}
package/lib/model.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { GenerateRequest, z, Role, Part, MessageData, ToolRequestPart, GenerateResponseData, StreamingCallback, GenerateResponseChunkData, Genkit, ModelReference } from 'genkit';
2
- import { ToolDefinition, ModelAction, ModelInfo } from 'genkit/model';
1
+ import { z, ModelReference, Genkit, GenerateRequest, StreamingCallback, GenerateResponseChunkData, GenerateResponseData, Role, Part, MessageData, ToolRequestPart } from 'genkit';
2
+ import { ModelInfo, ModelAction, ToolDefinition } from 'genkit/model';
3
3
  import OpenAI from 'openai';
4
4
  import { ChatCompletionCreateParams, ChatCompletionRole, ChatCompletionTool, ChatCompletionContentPart, ChatCompletionMessageParam, ChatCompletionMessageToolCall, ChatCompletionChunk, ChatCompletion } from 'openai/resources/index.mjs';
5
5
 
package/lib/model.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { GenerateRequest, z, Role, Part, MessageData, ToolRequestPart, GenerateResponseData, StreamingCallback, GenerateResponseChunkData, Genkit, ModelReference } from 'genkit';
2
- import { ToolDefinition, ModelAction, ModelInfo } from 'genkit/model';
1
+ import { z, ModelReference, Genkit, GenerateRequest, StreamingCallback, GenerateResponseChunkData, GenerateResponseData, Role, Part, MessageData, ToolRequestPart } from 'genkit';
2
+ import { ModelInfo, ModelAction, ToolDefinition } from 'genkit/model';
3
3
  import OpenAI from 'openai';
4
4
  import { ChatCompletionCreateParams, ChatCompletionRole, ChatCompletionTool, ChatCompletionContentPart, ChatCompletionMessageParam, ChatCompletionMessageToolCall, ChatCompletionChunk, ChatCompletion } from 'openai/resources/index.mjs';
5
5
 
package/lib/model.js CHANGED
@@ -344,12 +344,11 @@ function defineCompatOpenAIModel(params) {
344
344
  }
345
345
  const GENERIC_MODEL_INFO = {
346
346
  supports: {
347
- multiturn: false,
348
- media: false,
349
- tools: false,
350
- toolChoice: false,
351
- systemRole: false,
352
- constrained: "no-tools"
347
+ multiturn: true,
348
+ media: true,
349
+ tools: true,
350
+ toolChoice: true,
351
+ systemRole: true
353
352
  }
354
353
  };
355
354
  function compatOaiModelRef(params) {
package/lib/model.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/model.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 GenerateResponseChunkData,\n GenerateResponseData,\n Genkit,\n MessageData,\n ModelReference,\n Part,\n Role,\n StreamingCallback,\n ToolRequestPart,\n} from 'genkit';\nimport { GenerationCommonConfigSchema, Message, modelRef, z } from 'genkit';\nimport type { ModelAction, ModelInfo, ToolDefinition } from 'genkit/model';\nimport type OpenAI from 'openai';\nimport type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionContentPart,\n ChatCompletionCreateParams,\n ChatCompletionCreateParamsNonStreaming,\n ChatCompletionMessageParam,\n ChatCompletionMessageToolCall,\n ChatCompletionRole,\n ChatCompletionTool,\n CompletionChoice,\n} from 'openai/resources/index.mjs';\n\nconst VisualDetailLevelSchema = z.enum(['auto', 'low', 'high']).optional();\n\ntype VisualDetailLevel = z.infer<typeof VisualDetailLevelSchema>;\n\nexport type ModelRequestBuilder = (\n req: GenerateRequest,\n params: ChatCompletionCreateParams\n) => void;\n\nexport const ChatCompletionCommonConfigSchema =\n GenerationCommonConfigSchema.extend({\n temperature: z.number().min(0).max(2).optional(),\n frequencyPenalty: z.number().min(-2).max(2).optional(),\n logProbs: z.boolean().optional(),\n presencePenalty: z.number().min(-2).max(2).optional(),\n topLogProbs: z.number().int().min(0).max(20).optional(),\n });\n\nexport function toOpenAIRole(role: Role): ChatCompletionRole {\n switch (role) {\n case 'user':\n return 'user';\n case 'model':\n return 'assistant';\n case 'system':\n return 'system';\n case 'tool':\n return 'tool';\n default:\n throw new Error(`role ${role} doesn't map to an OpenAI role.`);\n }\n}\n\n/**\n * Converts a Genkit ToolDefinition to an OpenAI ChatCompletionTool object.\n * @param tool The Genkit ToolDefinition to convert.\n * @returns The converted OpenAI ChatCompletionTool object.\n */\nexport function toOpenAITool(tool: ToolDefinition): ChatCompletionTool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n parameters: tool.inputSchema !== null ? tool.inputSchema : undefined,\n },\n };\n}\n\n/**\n * Converts a Genkit Part to the corresponding OpenAI ChatCompletionContentPart.\n * @param part The Genkit Part to convert.\n * @param visualDetailLevel The visual detail level to use for media parts.\n * @returns The corresponding OpenAI ChatCompletionContentPart.\n * @throws Error if the part contains unsupported fields for the current message role.\n */\nexport function toOpenAITextAndMedia(\n part: Part,\n visualDetailLevel: VisualDetailLevel\n): ChatCompletionContentPart {\n if (part.text) {\n return {\n type: 'text',\n text: part.text,\n };\n } else if (part.media) {\n return {\n type: 'image_url',\n image_url: {\n url: part.media.url,\n detail: visualDetailLevel,\n },\n };\n }\n throw Error(\n `Unsupported genkit part fields encountered for current message role: ${JSON.stringify(part)}.`\n );\n}\n\n/**\n * Converts a Genkit MessageData array to an OpenAI ChatCompletionMessageParam array.\n * @param messages The Genkit MessageData array to convert.\n * @param visualDetailLevel The visual detail level to use for media parts.\n * @returns The converted OpenAI ChatCompletionMessageParam array.\n */\nexport function toOpenAIMessages(\n messages: MessageData[],\n visualDetailLevel: VisualDetailLevel = 'auto'\n): ChatCompletionMessageParam[] {\n const apiMessages: ChatCompletionMessageParam[] = [];\n for (const message of messages) {\n const msg = new Message(message);\n const role = toOpenAIRole(message.role);\n switch (role) {\n case 'user':\n const content = msg.content.map((part) =>\n toOpenAITextAndMedia(part, visualDetailLevel)\n );\n // Check if we have only text content\n const onlyTextContent = content.some((item) => item.type !== 'text');\n\n // If all items are strings, just add them as text\n if (!onlyTextContent) {\n content.forEach((item) => {\n if (item.type === 'text') {\n apiMessages.push({\n role: role,\n content: item.text,\n });\n }\n });\n } else {\n apiMessages.push({\n role: role,\n content: content,\n });\n }\n break;\n case 'system':\n apiMessages.push({\n role: role,\n content: msg.text,\n });\n break;\n case 'assistant': {\n const toolCalls: ChatCompletionMessageToolCall[] = msg.content\n .filter(\n (\n part\n ): part is Part & {\n toolRequest: NonNullable<Part['toolRequest']>;\n } => Boolean(part.toolRequest)\n )\n .map((part) => ({\n id: part.toolRequest.ref ?? '',\n type: 'function',\n function: {\n name: part.toolRequest.name,\n arguments: JSON.stringify(part.toolRequest.input),\n },\n }));\n if (toolCalls.length > 0) {\n apiMessages.push({\n role: role,\n tool_calls: toolCalls,\n });\n } else {\n apiMessages.push({\n role: role,\n content: msg.text,\n });\n }\n break;\n }\n case 'tool': {\n const toolResponseParts = msg.toolResponseParts();\n toolResponseParts.map((part) => {\n apiMessages.push({\n role: role,\n tool_call_id: part.toolResponse.ref ?? '',\n content:\n typeof part.toolResponse.output === 'string'\n ? part.toolResponse.output\n : JSON.stringify(part.toolResponse.output),\n });\n });\n break;\n }\n }\n }\n return apiMessages;\n}\n\nconst finishReasonMap: Record<\n // OpenAI Node SDK doesn't support tool_call in the enum, but it is returned from the API\n CompletionChoice['finish_reason'] | 'tool_calls',\n GenerateResponseData['finishReason']\n> = {\n length: 'length',\n stop: 'stop',\n tool_calls: 'stop',\n content_filter: 'blocked',\n};\n\n/**\n * Converts an OpenAI tool call to a Genkit ToolRequestPart.\n * @param toolCall The OpenAI tool call to convert.\n * @returns The converted Genkit ToolRequestPart.\n */\nexport function fromOpenAIToolCall(\n toolCall:\n | ChatCompletionMessageToolCall\n | ChatCompletionChunk.Choice.Delta.ToolCall,\n choice: ChatCompletion.Choice | ChatCompletionChunk.Choice\n): ToolRequestPart {\n if (!toolCall.function) {\n throw Error(\n `Unexpected openAI chunk choice. tool_calls was provided but one or more tool_calls is missing.`\n );\n }\n const f = toolCall.function;\n\n // Only parse arugments when it is a JSON object and the finish reason is tool_calls to avoid parsing errors\n if (choice.finish_reason === 'tool_calls') {\n return {\n toolRequest: {\n name: f.name!,\n ref: toolCall.id,\n input: f.arguments ? JSON.parse(f.arguments) : f.arguments,\n },\n };\n } else {\n return {\n toolRequest: {\n name: f.name!,\n ref: toolCall.id,\n input: '',\n },\n };\n }\n}\n\n/**\n * Converts an OpenAI message event to a Genkit GenerateResponseData object.\n * @param choice The OpenAI message event to convert.\n * @param jsonMode Whether the event is a JSON response.\n * @returns The converted Genkit GenerateResponseData object.\n */\nexport function fromOpenAIChoice(\n choice: ChatCompletion.Choice,\n jsonMode = false\n): GenerateResponseData {\n const toolRequestParts = choice.message.tool_calls?.map((toolCall) =>\n fromOpenAIToolCall(toolCall, choice)\n );\n return {\n finishReason: finishReasonMap[choice.finish_reason] || 'other',\n message: {\n role: 'model',\n content: toolRequestParts\n ? // Note: Not sure why I have to cast here exactly.\n // Otherwise it thinks toolRequest must be 'undefined' if provided\n (toolRequestParts as ToolRequestPart[])\n : [\n jsonMode\n ? { data: JSON.parse(choice.message.content!) }\n : { text: choice.message.content! },\n ],\n },\n };\n}\n\n/**\n * Converts an OpenAI message stream event to a Genkit GenerateResponseData\n * object.\n * @param choice The OpenAI message stream event to convert.\n * @param jsonMode Whether the event is a JSON response.\n * @returns The converted Genkit GenerateResponseData object.\n */\nexport function fromOpenAIChunkChoice(\n choice: ChatCompletionChunk.Choice,\n jsonMode = false\n): GenerateResponseData {\n const toolRequestParts = choice.delta.tool_calls?.map((toolCall) =>\n fromOpenAIToolCall(toolCall, choice)\n );\n return {\n finishReason: choice.finish_reason\n ? finishReasonMap[choice.finish_reason] || 'other'\n : 'unknown',\n message: {\n role: 'model',\n content: toolRequestParts\n ? // Note: Not sure why I have to cast here exactly.\n // Otherwise it thinks toolRequest must be 'undefined' if provided\n (toolRequestParts as ToolRequestPart[])\n : [\n jsonMode\n ? { data: JSON.parse(choice.delta.content!) }\n : { text: choice.delta.content! },\n ],\n },\n };\n}\n\n/**\n * Converts an OpenAI request to an OpenAI API request body.\n * @param modelName The name of the OpenAI model to use.\n * @param request The Genkit GenerateRequest to convert.\n * @returns The converted OpenAI API request body.\n * @throws An error if the specified model is not supported or if an unsupported output format is requested.\n */\nexport function toOpenAIRequestBody(\n modelName: string,\n request: GenerateRequest,\n requestBuilder?: ModelRequestBuilder\n) {\n const messages = toOpenAIMessages(\n request.messages,\n request.config?.visualDetailLevel\n );\n const {\n temperature,\n maxOutputTokens, // unused\n topK, // unused\n topP: top_p,\n frequencyPenalty: frequency_penalty,\n logProbs: logprobs,\n presencePenalty: presence_penalty,\n topLogProbs: top_logprobs,\n stopSequences: stop,\n version: modelVersion,\n tools: toolsFromConfig,\n ...restOfConfig\n } = request.config ?? {};\n\n const tools: ChatCompletionTool[] = request.tools?.map(toOpenAITool) ?? [];\n if (toolsFromConfig) {\n tools.push(...(toolsFromConfig as any[]));\n }\n let body = {\n model: modelVersion ?? modelName,\n messages,\n tools: tools.length > 0 ? tools : undefined,\n temperature,\n top_p,\n stop,\n frequency_penalty,\n presence_penalty,\n top_logprobs,\n logprobs,\n } as ChatCompletionCreateParamsNonStreaming;\n if (requestBuilder) {\n // If override provided, apply the override to the OpenAI request.\n // User must control passthrough config too.\n requestBuilder(request, body);\n } else {\n body = { ...body, ...restOfConfig }; // passthrough for other config\n }\n const response_format = request.output?.format;\n if (response_format === 'json') {\n body.response_format = {\n type: 'json_object',\n };\n } else if (response_format === 'text') {\n body.response_format = {\n type: 'text',\n };\n }\n for (const key in body) {\n if (!body[key] || (Array.isArray(body[key]) && !body[key].length))\n delete body[key];\n }\n return body;\n}\n\n/**\n * Creates the runner used by Genkit to interact with an OpenAI compatible\n * model.\n * @param name The name of the GPT model.\n * @param client The OpenAI client instance.\n * @returns The runner that Genkit will call when the model is invoked.\n */\nexport function openAIModelRunner(\n name: string,\n client: OpenAI,\n requestBuilder?: ModelRequestBuilder\n) {\n return async (\n request: GenerateRequest,\n options?: {\n streamingRequested?: boolean;\n sendChunk?: StreamingCallback<GenerateResponseChunkData>;\n abortSignal?: AbortSignal;\n }\n ): Promise<GenerateResponseData> => {\n let response: ChatCompletion;\n const body = toOpenAIRequestBody(name, request, requestBuilder);\n if (options?.streamingRequested) {\n const stream = client.beta.chat.completions.stream(\n {\n ...body,\n stream: true,\n stream_options: {\n include_usage: true,\n },\n },\n { signal: options?.abortSignal }\n );\n for await (const chunk of stream) {\n chunk.choices?.forEach((chunk) => {\n const c = fromOpenAIChunkChoice(chunk);\n options?.sendChunk!({\n index: chunk.index,\n content: c.message?.content ?? [],\n });\n });\n }\n response = await stream.finalChatCompletion();\n } else {\n response = await client.chat.completions.create(body, {\n signal: options?.abortSignal,\n });\n }\n const standardResponse: GenerateResponseData = {\n usage: {\n inputTokens: response.usage?.prompt_tokens,\n outputTokens: response.usage?.completion_tokens,\n totalTokens: response.usage?.total_tokens,\n },\n raw: response,\n };\n if (response.choices.length === 0) {\n return standardResponse;\n } else {\n const choice = response.choices[0];\n return {\n ...fromOpenAIChoice(choice, request.output?.format === 'json'),\n ...standardResponse,\n };\n }\n };\n}\n\n/**\n * Method to define a new Genkit Model that is compatible with Open AI\n * Chat Completions API. \n *\n * These models are to be used to chat with a large language model.\n *\n * @param params An object containing parameters for defining the OpenAI\n * Chat 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 defineCompatOpenAIModel<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n ai: Genkit;\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: ModelRequestBuilder;\n}): ModelAction {\n const { ai, name, client, modelRef, requestBuilder } = params;\n const modelName = name.split('/').pop();\n\n return ai.defineModel(\n {\n name,\n apiVersion: 'v2',\n ...modelRef?.info,\n configSchema: modelRef?.configSchema,\n },\n openAIModelRunner(modelName!, client, requestBuilder)\n );\n}\n\nconst GENERIC_MODEL_INFO: ModelInfo = {\n supports: {\n multiturn: false,\n media: false,\n tools: false,\n toolChoice: false,\n systemRole: false,\n constrained: 'no-tools',\n },\n};\n\n/** ModelRef helper, with reasonable defaults for OpenAI-compatible providers */\nexport function compatOaiModelRef<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n name: string;\n info?: ModelInfo;\n configSchema?: CustomOptions;\n config?: any;\n}): ModelReference<CustomOptions> {\n const {\n name,\n info = GENERIC_MODEL_INFO,\n configSchema,\n config = undefined,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (ChatCompletionCommonConfigSchema as any),\n info: info,\n config,\n });\n}\n"],"mappings":"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","names":["chunk","modelRef"]}
1
+ {"version":3,"sources":["../src/model.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 GenerateResponseChunkData,\n GenerateResponseData,\n Genkit,\n MessageData,\n ModelReference,\n Part,\n Role,\n StreamingCallback,\n ToolRequestPart,\n} from 'genkit';\nimport { GenerationCommonConfigSchema, Message, modelRef, z } from 'genkit';\nimport type { ModelAction, ModelInfo, ToolDefinition } from 'genkit/model';\nimport type OpenAI from 'openai';\nimport type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionContentPart,\n ChatCompletionCreateParams,\n ChatCompletionCreateParamsNonStreaming,\n ChatCompletionMessageParam,\n ChatCompletionMessageToolCall,\n ChatCompletionRole,\n ChatCompletionTool,\n CompletionChoice,\n} from 'openai/resources/index.mjs';\n\nconst VisualDetailLevelSchema = z.enum(['auto', 'low', 'high']).optional();\n\ntype VisualDetailLevel = z.infer<typeof VisualDetailLevelSchema>;\n\nexport type ModelRequestBuilder = (\n req: GenerateRequest,\n params: ChatCompletionCreateParams\n) => void;\n\nexport const ChatCompletionCommonConfigSchema =\n GenerationCommonConfigSchema.extend({\n temperature: z.number().min(0).max(2).optional(),\n frequencyPenalty: z.number().min(-2).max(2).optional(),\n logProbs: z.boolean().optional(),\n presencePenalty: z.number().min(-2).max(2).optional(),\n topLogProbs: z.number().int().min(0).max(20).optional(),\n });\n\nexport function toOpenAIRole(role: Role): ChatCompletionRole {\n switch (role) {\n case 'user':\n return 'user';\n case 'model':\n return 'assistant';\n case 'system':\n return 'system';\n case 'tool':\n return 'tool';\n default:\n throw new Error(`role ${role} doesn't map to an OpenAI role.`);\n }\n}\n\n/**\n * Converts a Genkit ToolDefinition to an OpenAI ChatCompletionTool object.\n * @param tool The Genkit ToolDefinition to convert.\n * @returns The converted OpenAI ChatCompletionTool object.\n */\nexport function toOpenAITool(tool: ToolDefinition): ChatCompletionTool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n parameters: tool.inputSchema !== null ? tool.inputSchema : undefined,\n },\n };\n}\n\n/**\n * Converts a Genkit Part to the corresponding OpenAI ChatCompletionContentPart.\n * @param part The Genkit Part to convert.\n * @param visualDetailLevel The visual detail level to use for media parts.\n * @returns The corresponding OpenAI ChatCompletionContentPart.\n * @throws Error if the part contains unsupported fields for the current message role.\n */\nexport function toOpenAITextAndMedia(\n part: Part,\n visualDetailLevel: VisualDetailLevel\n): ChatCompletionContentPart {\n if (part.text) {\n return {\n type: 'text',\n text: part.text,\n };\n } else if (part.media) {\n return {\n type: 'image_url',\n image_url: {\n url: part.media.url,\n detail: visualDetailLevel,\n },\n };\n }\n throw Error(\n `Unsupported genkit part fields encountered for current message role: ${JSON.stringify(part)}.`\n );\n}\n\n/**\n * Converts a Genkit MessageData array to an OpenAI ChatCompletionMessageParam array.\n * @param messages The Genkit MessageData array to convert.\n * @param visualDetailLevel The visual detail level to use for media parts.\n * @returns The converted OpenAI ChatCompletionMessageParam array.\n */\nexport function toOpenAIMessages(\n messages: MessageData[],\n visualDetailLevel: VisualDetailLevel = 'auto'\n): ChatCompletionMessageParam[] {\n const apiMessages: ChatCompletionMessageParam[] = [];\n for (const message of messages) {\n const msg = new Message(message);\n const role = toOpenAIRole(message.role);\n switch (role) {\n case 'user':\n const content = msg.content.map((part) =>\n toOpenAITextAndMedia(part, visualDetailLevel)\n );\n // Check if we have only text content\n const onlyTextContent = content.some((item) => item.type !== 'text');\n\n // If all items are strings, just add them as text\n if (!onlyTextContent) {\n content.forEach((item) => {\n if (item.type === 'text') {\n apiMessages.push({\n role: role,\n content: item.text,\n });\n }\n });\n } else {\n apiMessages.push({\n role: role,\n content: content,\n });\n }\n break;\n case 'system':\n apiMessages.push({\n role: role,\n content: msg.text,\n });\n break;\n case 'assistant': {\n const toolCalls: ChatCompletionMessageToolCall[] = msg.content\n .filter(\n (\n part\n ): part is Part & {\n toolRequest: NonNullable<Part['toolRequest']>;\n } => Boolean(part.toolRequest)\n )\n .map((part) => ({\n id: part.toolRequest.ref ?? '',\n type: 'function',\n function: {\n name: part.toolRequest.name,\n arguments: JSON.stringify(part.toolRequest.input),\n },\n }));\n if (toolCalls.length > 0) {\n apiMessages.push({\n role: role,\n tool_calls: toolCalls,\n });\n } else {\n apiMessages.push({\n role: role,\n content: msg.text,\n });\n }\n break;\n }\n case 'tool': {\n const toolResponseParts = msg.toolResponseParts();\n toolResponseParts.map((part) => {\n apiMessages.push({\n role: role,\n tool_call_id: part.toolResponse.ref ?? '',\n content:\n typeof part.toolResponse.output === 'string'\n ? part.toolResponse.output\n : JSON.stringify(part.toolResponse.output),\n });\n });\n break;\n }\n }\n }\n return apiMessages;\n}\n\nconst finishReasonMap: Record<\n // OpenAI Node SDK doesn't support tool_call in the enum, but it is returned from the API\n CompletionChoice['finish_reason'] | 'tool_calls',\n GenerateResponseData['finishReason']\n> = {\n length: 'length',\n stop: 'stop',\n tool_calls: 'stop',\n content_filter: 'blocked',\n};\n\n/**\n * Converts an OpenAI tool call to a Genkit ToolRequestPart.\n * @param toolCall The OpenAI tool call to convert.\n * @returns The converted Genkit ToolRequestPart.\n */\nexport function fromOpenAIToolCall(\n toolCall:\n | ChatCompletionMessageToolCall\n | ChatCompletionChunk.Choice.Delta.ToolCall,\n choice: ChatCompletion.Choice | ChatCompletionChunk.Choice\n): ToolRequestPart {\n if (!toolCall.function) {\n throw Error(\n `Unexpected openAI chunk choice. tool_calls was provided but one or more tool_calls is missing.`\n );\n }\n const f = toolCall.function;\n\n // Only parse arugments when it is a JSON object and the finish reason is tool_calls to avoid parsing errors\n if (choice.finish_reason === 'tool_calls') {\n return {\n toolRequest: {\n name: f.name!,\n ref: toolCall.id,\n input: f.arguments ? JSON.parse(f.arguments) : f.arguments,\n },\n };\n } else {\n return {\n toolRequest: {\n name: f.name!,\n ref: toolCall.id,\n input: '',\n },\n };\n }\n}\n\n/**\n * Converts an OpenAI message event to a Genkit GenerateResponseData object.\n * @param choice The OpenAI message event to convert.\n * @param jsonMode Whether the event is a JSON response.\n * @returns The converted Genkit GenerateResponseData object.\n */\nexport function fromOpenAIChoice(\n choice: ChatCompletion.Choice,\n jsonMode = false\n): GenerateResponseData {\n const toolRequestParts = choice.message.tool_calls?.map((toolCall) =>\n fromOpenAIToolCall(toolCall, choice)\n );\n return {\n finishReason: finishReasonMap[choice.finish_reason] || 'other',\n message: {\n role: 'model',\n content: toolRequestParts\n ? // Note: Not sure why I have to cast here exactly.\n // Otherwise it thinks toolRequest must be 'undefined' if provided\n (toolRequestParts as ToolRequestPart[])\n : [\n jsonMode\n ? { data: JSON.parse(choice.message.content!) }\n : { text: choice.message.content! },\n ],\n },\n };\n}\n\n/**\n * Converts an OpenAI message stream event to a Genkit GenerateResponseData\n * object.\n * @param choice The OpenAI message stream event to convert.\n * @param jsonMode Whether the event is a JSON response.\n * @returns The converted Genkit GenerateResponseData object.\n */\nexport function fromOpenAIChunkChoice(\n choice: ChatCompletionChunk.Choice,\n jsonMode = false\n): GenerateResponseData {\n const toolRequestParts = choice.delta.tool_calls?.map((toolCall) =>\n fromOpenAIToolCall(toolCall, choice)\n );\n return {\n finishReason: choice.finish_reason\n ? finishReasonMap[choice.finish_reason] || 'other'\n : 'unknown',\n message: {\n role: 'model',\n content: toolRequestParts\n ? // Note: Not sure why I have to cast here exactly.\n // Otherwise it thinks toolRequest must be 'undefined' if provided\n (toolRequestParts as ToolRequestPart[])\n : [\n jsonMode\n ? { data: JSON.parse(choice.delta.content!) }\n : { text: choice.delta.content! },\n ],\n },\n };\n}\n\n/**\n * Converts an OpenAI request to an OpenAI API request body.\n * @param modelName The name of the OpenAI model to use.\n * @param request The Genkit GenerateRequest to convert.\n * @returns The converted OpenAI API request body.\n * @throws An error if the specified model is not supported or if an unsupported output format is requested.\n */\nexport function toOpenAIRequestBody(\n modelName: string,\n request: GenerateRequest,\n requestBuilder?: ModelRequestBuilder\n) {\n const messages = toOpenAIMessages(\n request.messages,\n request.config?.visualDetailLevel\n );\n const {\n temperature,\n maxOutputTokens, // unused\n topK, // unused\n topP: top_p,\n frequencyPenalty: frequency_penalty,\n logProbs: logprobs,\n presencePenalty: presence_penalty,\n topLogProbs: top_logprobs,\n stopSequences: stop,\n version: modelVersion,\n tools: toolsFromConfig,\n ...restOfConfig\n } = request.config ?? {};\n\n const tools: ChatCompletionTool[] = request.tools?.map(toOpenAITool) ?? [];\n if (toolsFromConfig) {\n tools.push(...(toolsFromConfig as any[]));\n }\n let body = {\n model: modelVersion ?? modelName,\n messages,\n tools: tools.length > 0 ? tools : undefined,\n temperature,\n top_p,\n stop,\n frequency_penalty,\n presence_penalty,\n top_logprobs,\n logprobs,\n } as ChatCompletionCreateParamsNonStreaming;\n if (requestBuilder) {\n // If override provided, apply the override to the OpenAI request.\n // User must control passthrough config too.\n requestBuilder(request, body);\n } else {\n body = { ...body, ...restOfConfig }; // passthrough for other config\n }\n const response_format = request.output?.format;\n if (response_format === 'json') {\n body.response_format = {\n type: 'json_object',\n };\n } else if (response_format === 'text') {\n body.response_format = {\n type: 'text',\n };\n }\n for (const key in body) {\n if (!body[key] || (Array.isArray(body[key]) && !body[key].length))\n delete body[key];\n }\n return body;\n}\n\n/**\n * Creates the runner used by Genkit to interact with an OpenAI compatible\n * model.\n * @param name The name of the GPT model.\n * @param client The OpenAI client instance.\n * @returns The runner that Genkit will call when the model is invoked.\n */\nexport function openAIModelRunner(\n name: string,\n client: OpenAI,\n requestBuilder?: ModelRequestBuilder\n) {\n return async (\n request: GenerateRequest,\n options?: {\n streamingRequested?: boolean;\n sendChunk?: StreamingCallback<GenerateResponseChunkData>;\n abortSignal?: AbortSignal;\n }\n ): Promise<GenerateResponseData> => {\n let response: ChatCompletion;\n const body = toOpenAIRequestBody(name, request, requestBuilder);\n if (options?.streamingRequested) {\n const stream = client.beta.chat.completions.stream(\n {\n ...body,\n stream: true,\n stream_options: {\n include_usage: true,\n },\n },\n { signal: options?.abortSignal }\n );\n for await (const chunk of stream) {\n chunk.choices?.forEach((chunk) => {\n const c = fromOpenAIChunkChoice(chunk);\n options?.sendChunk!({\n index: chunk.index,\n content: c.message?.content ?? [],\n });\n });\n }\n response = await stream.finalChatCompletion();\n } else {\n response = await client.chat.completions.create(body, {\n signal: options?.abortSignal,\n });\n }\n const standardResponse: GenerateResponseData = {\n usage: {\n inputTokens: response.usage?.prompt_tokens,\n outputTokens: response.usage?.completion_tokens,\n totalTokens: response.usage?.total_tokens,\n },\n raw: response,\n };\n if (response.choices.length === 0) {\n return standardResponse;\n } else {\n const choice = response.choices[0];\n return {\n ...fromOpenAIChoice(choice, request.output?.format === 'json'),\n ...standardResponse,\n };\n }\n };\n}\n\n/**\n * Method to define a new Genkit Model that is compatible with Open AI\n * Chat Completions API. \n *\n * These models are to be used to chat with a large language model.\n *\n * @param params An object containing parameters for defining the OpenAI\n * Chat 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 defineCompatOpenAIModel<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n ai: Genkit;\n name: string;\n client: OpenAI;\n modelRef?: ModelReference<CustomOptions>;\n requestBuilder?: ModelRequestBuilder;\n}): ModelAction {\n const { ai, name, client, modelRef, requestBuilder } = params;\n const modelName = name.split('/').pop();\n\n return ai.defineModel(\n {\n name,\n apiVersion: 'v2',\n ...modelRef?.info,\n configSchema: modelRef?.configSchema,\n },\n openAIModelRunner(modelName!, client, requestBuilder)\n );\n}\n\nconst GENERIC_MODEL_INFO: ModelInfo = {\n supports: {\n multiturn: true,\n media: true,\n tools: true,\n toolChoice: true,\n systemRole: true,\n },\n};\n\n/** ModelRef helper, with reasonable defaults for OpenAI-compatible providers */\nexport function compatOaiModelRef<\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(params: {\n name: string;\n info?: ModelInfo;\n configSchema?: CustomOptions;\n config?: any;\n}): ModelReference<CustomOptions> {\n const {\n name,\n info = GENERIC_MODEL_INFO,\n configSchema,\n config = undefined,\n } = params;\n return modelRef({\n name,\n configSchema: configSchema || (ChatCompletionCommonConfigSchema as any),\n info: info,\n config,\n });\n}\n"],"mappings":"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","names":["chunk","modelRef"]}
package/lib/model.mjs CHANGED
@@ -310,12 +310,11 @@ function defineCompatOpenAIModel(params) {
310
310
  }
311
311
  const GENERIC_MODEL_INFO = {
312
312
  supports: {
313
- multiturn: false,
314
- media: false,
315
- tools: false,
316
- toolChoice: false,
317
- systemRole: false,
318
- constrained: "no-tools"
313
+ multiturn: true,
314
+ media: true,
315
+ tools: true,
316
+ toolChoice: true,
317
+ systemRole: true
319
318
  }
320
319
  };
321
320
  function compatOaiModelRef(params) {