@aigne/openai 1.74.0-beta.1 → 1.74.0-beta.11

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 (35) hide show
  1. package/README.md +4 -4
  2. package/dist/index.cjs +2 -0
  3. package/dist/index.d.cts +2 -1
  4. package/dist/index.d.mts +2 -1
  5. package/dist/index.mjs +2 -1
  6. package/dist/openai-chat-model.cjs +18 -18
  7. package/dist/openai-chat-model.d.cts +25 -63
  8. package/dist/openai-chat-model.d.cts.map +1 -1
  9. package/dist/openai-chat-model.d.mts +25 -63
  10. package/dist/openai-chat-model.d.mts.map +1 -1
  11. package/dist/openai-chat-model.mjs +7 -7
  12. package/dist/openai-chat-model.mjs.map +1 -1
  13. package/dist/openai-embedding-model.cjs +68 -0
  14. package/dist/openai-embedding-model.d.cts +28 -0
  15. package/dist/openai-embedding-model.d.cts.map +1 -0
  16. package/dist/openai-embedding-model.d.mts +28 -0
  17. package/dist/openai-embedding-model.d.mts.map +1 -0
  18. package/dist/openai-embedding-model.mjs +68 -0
  19. package/dist/openai-embedding-model.mjs.map +1 -0
  20. package/dist/openai-image-model.cjs +7 -7
  21. package/dist/openai-image-model.d.cts +23 -23
  22. package/dist/openai-image-model.d.cts.map +1 -1
  23. package/dist/openai-image-model.d.mts +23 -23
  24. package/dist/openai-image-model.d.mts.map +1 -1
  25. package/dist/openai-image-model.mjs +3 -3
  26. package/dist/openai-image-model.mjs.map +1 -1
  27. package/dist/openai-video-model.cjs +9 -9
  28. package/dist/openai-video-model.d.cts +42 -42
  29. package/dist/openai-video-model.d.cts.map +1 -1
  30. package/dist/openai-video-model.d.mts +42 -42
  31. package/dist/openai-video-model.d.mts.map +1 -1
  32. package/dist/openai-video-model.mjs +3 -3
  33. package/dist/openai-video-model.mjs.map +1 -1
  34. package/package.json +4 -7
  35. package/LICENSE.md +0 -93
@@ -0,0 +1,68 @@
1
+ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
+ const require_openai = require('./openai.cjs');
3
+ let _aigne_model_base = require("@aigne/model-base");
4
+ let _aigne_model_base_utils_type_utils = require("@aigne/model-base/utils/type-utils");
5
+ let zod = require("zod");
6
+
7
+ //#region src/openai-embedding-model.ts
8
+ const DEFAULT_MODEL = "text-embedding-3-small";
9
+ const openAIEmbeddingModelInputSchema = _aigne_model_base.embeddingModelInputSchema.extend({});
10
+ const openAIEmbeddingModelOptionsSchema = zod.z.object({
11
+ apiKey: zod.z.string().optional(),
12
+ baseURL: zod.z.string().optional(),
13
+ model: zod.z.string().optional(),
14
+ modelOptions: zod.z.object({}).optional(),
15
+ clientOptions: zod.z.object({}).optional()
16
+ });
17
+ var OpenAIEmbeddingModel = class extends _aigne_model_base.EmbeddingModel {
18
+ constructor(options) {
19
+ super({
20
+ ...options,
21
+ inputSchema: openAIEmbeddingModelInputSchema,
22
+ description: options?.description ?? "Generate embeddings by OpenAI embedding models"
23
+ });
24
+ this.options = options;
25
+ if (options) (0, _aigne_model_base_utils_type_utils.checkArguments)(this.name, openAIEmbeddingModelOptionsSchema, options);
26
+ }
27
+ _client;
28
+ apiKeyEnvName = "OPENAI_API_KEY";
29
+ get client() {
30
+ if (this._client) return this._client;
31
+ const { apiKey, url } = this.credential;
32
+ if (!apiKey) throw new Error(`${this.name} requires an API key. Please provide it via \`options.apiKey\`, or set the \`${this.apiKeyEnvName}\` environment variable`);
33
+ this._client ??= new require_openai.CustomOpenAI({
34
+ baseURL: url,
35
+ apiKey,
36
+ ...this.options?.clientOptions
37
+ });
38
+ return this._client;
39
+ }
40
+ get credential() {
41
+ return {
42
+ url: this.options?.baseURL || process.env.OPENAI_BASE_URL,
43
+ apiKey: this.options?.apiKey || process.env[this.apiKeyEnvName],
44
+ model: this.options?.model || DEFAULT_MODEL
45
+ };
46
+ }
47
+ async process(input, _options) {
48
+ const model = input.modelOptions?.model || this.credential.model;
49
+ const body = {
50
+ input: input.input,
51
+ model,
52
+ ...input.dimensions ? { dimensions: input.dimensions } : {},
53
+ ...input.modelOptions?.encoding_format ? { encoding_format: input.modelOptions.encoding_format } : {}
54
+ };
55
+ const response = await this.client.embeddings.create(body);
56
+ return {
57
+ embeddings: response.data.map((item) => item.embedding),
58
+ usage: {
59
+ inputTokens: response.usage?.prompt_tokens ?? 0,
60
+ outputTokens: 0
61
+ },
62
+ model: response.model
63
+ };
64
+ }
65
+ };
66
+
67
+ //#endregion
68
+ exports.OpenAIEmbeddingModel = OpenAIEmbeddingModel;
@@ -0,0 +1,28 @@
1
+ import { EmbeddingModel, EmbeddingModelInput, EmbeddingModelOptions, EmbeddingModelOutput, ModelInvokeOptions } from "@aigne/model-base";
2
+ import OpenAI, { ClientOptions } from "openai";
3
+
4
+ //#region src/openai-embedding-model.d.ts
5
+ interface OpenAIEmbeddingModelInput extends EmbeddingModelInput {}
6
+ interface OpenAIEmbeddingModelOutput extends EmbeddingModelOutput {}
7
+ interface OpenAIEmbeddingModelOptions extends EmbeddingModelOptions<OpenAIEmbeddingModelInput, OpenAIEmbeddingModelOutput> {
8
+ apiKey?: string;
9
+ baseURL?: string;
10
+ model?: string;
11
+ clientOptions?: Partial<ClientOptions>;
12
+ }
13
+ declare class OpenAIEmbeddingModel extends EmbeddingModel<OpenAIEmbeddingModelInput, OpenAIEmbeddingModelOutput> {
14
+ options?: OpenAIEmbeddingModelOptions | undefined;
15
+ constructor(options?: OpenAIEmbeddingModelOptions | undefined);
16
+ protected _client?: OpenAI;
17
+ protected apiKeyEnvName: string;
18
+ get client(): OpenAI;
19
+ get credential(): {
20
+ url: string | undefined;
21
+ apiKey: string | undefined;
22
+ model: string;
23
+ };
24
+ process(input: OpenAIEmbeddingModelInput, _options: ModelInvokeOptions): Promise<OpenAIEmbeddingModelOutput>;
25
+ }
26
+ //#endregion
27
+ export { OpenAIEmbeddingModel, OpenAIEmbeddingModelInput, OpenAIEmbeddingModelOptions, OpenAIEmbeddingModelOutput };
28
+ //# sourceMappingURL=openai-embedding-model.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-embedding-model.d.cts","names":[],"sources":["../src/openai-embedding-model.ts"],"mappings":";;;;UAgBiB,yBAAA,SAAkC,mBAAA;AAAA,UAElC,0BAAA,SAAmC,oBAAA;AAAA,UAEnC,2BAAA,SACP,qBAAA,CAAsB,yBAAA,EAA2B,0BAAA;EACzD,MAAA;EACA,OAAA;EACA,KAAA;EACA,aAAA,GAAgB,OAAA,CAAQ,aAAA;AAAA;AAAA,cAab,oBAAA,SAA6B,cAAA,CACxC,yBAAA,EACA,0BAAA;EAE4B,OAAA,GAAU,2BAAA;cAAV,OAAA,GAAU,2BAAA;EAAA,UAS5B,OAAA,GAAU,MAAA;EAAA,UAEV,aAAA;EAAA,IAEN,MAAA,CAAA,GAAM,MAAA;EAAA,IAmBG,UAAA,CAAA;;;;;EAQE,OAAA,CACb,KAAA,EAAO,yBAAA,EACP,QAAA,EAAU,kBAAA,GACT,OAAA,CAAQ,0BAAA;AAAA"}
@@ -0,0 +1,28 @@
1
+ import { EmbeddingModel, EmbeddingModelInput, EmbeddingModelOptions, EmbeddingModelOutput, ModelInvokeOptions } from "@aigne/model-base";
2
+ import OpenAI, { ClientOptions } from "openai";
3
+
4
+ //#region src/openai-embedding-model.d.ts
5
+ interface OpenAIEmbeddingModelInput extends EmbeddingModelInput {}
6
+ interface OpenAIEmbeddingModelOutput extends EmbeddingModelOutput {}
7
+ interface OpenAIEmbeddingModelOptions extends EmbeddingModelOptions<OpenAIEmbeddingModelInput, OpenAIEmbeddingModelOutput> {
8
+ apiKey?: string;
9
+ baseURL?: string;
10
+ model?: string;
11
+ clientOptions?: Partial<ClientOptions>;
12
+ }
13
+ declare class OpenAIEmbeddingModel extends EmbeddingModel<OpenAIEmbeddingModelInput, OpenAIEmbeddingModelOutput> {
14
+ options?: OpenAIEmbeddingModelOptions | undefined;
15
+ constructor(options?: OpenAIEmbeddingModelOptions | undefined);
16
+ protected _client?: OpenAI;
17
+ protected apiKeyEnvName: string;
18
+ get client(): OpenAI;
19
+ get credential(): {
20
+ url: string | undefined;
21
+ apiKey: string | undefined;
22
+ model: string;
23
+ };
24
+ process(input: OpenAIEmbeddingModelInput, _options: ModelInvokeOptions): Promise<OpenAIEmbeddingModelOutput>;
25
+ }
26
+ //#endregion
27
+ export { OpenAIEmbeddingModel, OpenAIEmbeddingModelInput, OpenAIEmbeddingModelOptions, OpenAIEmbeddingModelOutput };
28
+ //# sourceMappingURL=openai-embedding-model.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-embedding-model.d.mts","names":[],"sources":["../src/openai-embedding-model.ts"],"mappings":";;;;UAgBiB,yBAAA,SAAkC,mBAAA;AAAA,UAElC,0BAAA,SAAmC,oBAAA;AAAA,UAEnC,2BAAA,SACP,qBAAA,CAAsB,yBAAA,EAA2B,0BAAA;EACzD,MAAA;EACA,OAAA;EACA,KAAA;EACA,aAAA,GAAgB,OAAA,CAAQ,aAAA;AAAA;AAAA,cAab,oBAAA,SAA6B,cAAA,CACxC,yBAAA,EACA,0BAAA;EAE4B,OAAA,GAAU,2BAAA;cAAV,OAAA,GAAU,2BAAA;EAAA,UAS5B,OAAA,GAAU,MAAA;EAAA,UAEV,aAAA;EAAA,IAEN,MAAA,CAAA,GAAM,MAAA;EAAA,IAmBG,UAAA,CAAA;;;;;EAQE,OAAA,CACb,KAAA,EAAO,yBAAA,EACP,QAAA,EAAU,kBAAA,GACT,OAAA,CAAQ,0BAAA;AAAA"}
@@ -0,0 +1,68 @@
1
+ import { CustomOpenAI } from "./openai.mjs";
2
+ import { EmbeddingModel, embeddingModelInputSchema } from "@aigne/model-base";
3
+ import { checkArguments } from "@aigne/model-base/utils/type-utils";
4
+ import { z } from "zod";
5
+
6
+ //#region src/openai-embedding-model.ts
7
+ const DEFAULT_MODEL = "text-embedding-3-small";
8
+ const openAIEmbeddingModelInputSchema = embeddingModelInputSchema.extend({});
9
+ const openAIEmbeddingModelOptionsSchema = z.object({
10
+ apiKey: z.string().optional(),
11
+ baseURL: z.string().optional(),
12
+ model: z.string().optional(),
13
+ modelOptions: z.object({}).optional(),
14
+ clientOptions: z.object({}).optional()
15
+ });
16
+ var OpenAIEmbeddingModel = class extends EmbeddingModel {
17
+ constructor(options) {
18
+ super({
19
+ ...options,
20
+ inputSchema: openAIEmbeddingModelInputSchema,
21
+ description: options?.description ?? "Generate embeddings by OpenAI embedding models"
22
+ });
23
+ this.options = options;
24
+ if (options) checkArguments(this.name, openAIEmbeddingModelOptionsSchema, options);
25
+ }
26
+ _client;
27
+ apiKeyEnvName = "OPENAI_API_KEY";
28
+ get client() {
29
+ if (this._client) return this._client;
30
+ const { apiKey, url } = this.credential;
31
+ if (!apiKey) throw new Error(`${this.name} requires an API key. Please provide it via \`options.apiKey\`, or set the \`${this.apiKeyEnvName}\` environment variable`);
32
+ this._client ??= new CustomOpenAI({
33
+ baseURL: url,
34
+ apiKey,
35
+ ...this.options?.clientOptions
36
+ });
37
+ return this._client;
38
+ }
39
+ get credential() {
40
+ return {
41
+ url: this.options?.baseURL || process.env.OPENAI_BASE_URL,
42
+ apiKey: this.options?.apiKey || process.env[this.apiKeyEnvName],
43
+ model: this.options?.model || DEFAULT_MODEL
44
+ };
45
+ }
46
+ async process(input, _options) {
47
+ const model = input.modelOptions?.model || this.credential.model;
48
+ const body = {
49
+ input: input.input,
50
+ model,
51
+ ...input.dimensions ? { dimensions: input.dimensions } : {},
52
+ ...input.modelOptions?.encoding_format ? { encoding_format: input.modelOptions.encoding_format } : {}
53
+ };
54
+ const response = await this.client.embeddings.create(body);
55
+ return {
56
+ embeddings: response.data.map((item) => item.embedding),
57
+ usage: {
58
+ inputTokens: response.usage?.prompt_tokens ?? 0,
59
+ outputTokens: 0
60
+ },
61
+ model: response.model
62
+ };
63
+ }
64
+ };
65
+
66
+ //#endregion
67
+ export { OpenAIEmbeddingModel };
68
+ //# sourceMappingURL=openai-embedding-model.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-embedding-model.mjs","names":[],"sources":["../src/openai-embedding-model.ts"],"sourcesContent":["import {\n EmbeddingModel,\n type EmbeddingModelInput,\n type EmbeddingModelOptions,\n type EmbeddingModelOutput,\n embeddingModelInputSchema,\n type ModelInvokeOptions,\n} from \"@aigne/model-base\";\nimport { checkArguments } from \"@aigne/model-base/utils/type-utils\";\nimport type OpenAI from \"openai\";\nimport type { ClientOptions } from \"openai\";\nimport { z } from \"zod\";\nimport { CustomOpenAI } from \"./openai.js\";\n\nconst DEFAULT_MODEL = \"text-embedding-3-small\";\n\nexport interface OpenAIEmbeddingModelInput extends EmbeddingModelInput {}\n\nexport interface OpenAIEmbeddingModelOutput extends EmbeddingModelOutput {}\n\nexport interface OpenAIEmbeddingModelOptions\n extends EmbeddingModelOptions<OpenAIEmbeddingModelInput, OpenAIEmbeddingModelOutput> {\n apiKey?: string;\n baseURL?: string;\n model?: string;\n clientOptions?: Partial<ClientOptions>;\n}\n\nconst openAIEmbeddingModelInputSchema = embeddingModelInputSchema.extend({});\n\nconst openAIEmbeddingModelOptionsSchema = z.object({\n apiKey: z.string().optional(),\n baseURL: z.string().optional(),\n model: z.string().optional(),\n modelOptions: z.object({}).optional(),\n clientOptions: z.object({}).optional(),\n});\n\nexport class OpenAIEmbeddingModel extends EmbeddingModel<\n OpenAIEmbeddingModelInput,\n OpenAIEmbeddingModelOutput\n> {\n constructor(public override options?: OpenAIEmbeddingModelOptions) {\n super({\n ...options,\n inputSchema: openAIEmbeddingModelInputSchema,\n description: options?.description ?? \"Generate embeddings by OpenAI embedding models\",\n });\n if (options) checkArguments(this.name, openAIEmbeddingModelOptionsSchema, options);\n }\n\n protected _client?: OpenAI;\n\n protected apiKeyEnvName = \"OPENAI_API_KEY\";\n\n get client() {\n if (this._client) return this._client;\n\n const { apiKey, url } = this.credential;\n\n if (!apiKey)\n throw new Error(\n `${this.name} requires an API key. Please provide it via \\`options.apiKey\\`, or set the \\`${this.apiKeyEnvName}\\` environment variable`,\n );\n\n this._client ??= new CustomOpenAI({\n baseURL: url,\n apiKey,\n ...this.options?.clientOptions,\n });\n\n return this._client;\n }\n\n override get credential() {\n return {\n url: this.options?.baseURL || process.env.OPENAI_BASE_URL,\n apiKey: this.options?.apiKey || process.env[this.apiKeyEnvName],\n model: this.options?.model || DEFAULT_MODEL,\n };\n }\n\n override async process(\n input: OpenAIEmbeddingModelInput,\n _options: ModelInvokeOptions,\n ): Promise<OpenAIEmbeddingModelOutput> {\n const model = input.modelOptions?.model || this.credential.model;\n\n const body: OpenAI.EmbeddingCreateParams = {\n input: input.input,\n model,\n ...(input.dimensions ? { dimensions: input.dimensions } : {}),\n ...(input.modelOptions?.encoding_format\n ? { encoding_format: input.modelOptions.encoding_format as \"float\" | \"base64\" }\n : {}),\n };\n\n const response = await this.client.embeddings.create(body);\n\n return {\n embeddings: response.data.map((item) => item.embedding),\n usage: {\n inputTokens: response.usage?.prompt_tokens ?? 0,\n outputTokens: 0,\n },\n model: response.model,\n };\n }\n}\n"],"mappings":";;;;;;AAcA,MAAM,gBAAgB;AActB,MAAM,kCAAkC,0BAA0B,OAAO,EAAE,CAAC;AAE5E,MAAM,oCAAoC,EAAE,OAAO;CACjD,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,SAAS,EAAE,QAAQ,CAAC,UAAU;CAC9B,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC,UAAU;CACrC,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC,UAAU;CACvC,CAAC;AAEF,IAAa,uBAAb,cAA0C,eAGxC;CACA,YAAY,AAAgB,SAAuC;AACjE,QAAM;GACJ,GAAG;GACH,aAAa;GACb,aAAa,SAAS,eAAe;GACtC,CAAC;EALwB;AAM1B,MAAI,QAAS,gBAAe,KAAK,MAAM,mCAAmC,QAAQ;;CAGpF,AAAU;CAEV,AAAU,gBAAgB;CAE1B,IAAI,SAAS;AACX,MAAI,KAAK,QAAS,QAAO,KAAK;EAE9B,MAAM,EAAE,QAAQ,QAAQ,KAAK;AAE7B,MAAI,CAAC,OACH,OAAM,IAAI,MACR,GAAG,KAAK,KAAK,+EAA+E,KAAK,cAAc,yBAChH;AAEH,OAAK,YAAY,IAAI,aAAa;GAChC,SAAS;GACT;GACA,GAAG,KAAK,SAAS;GAClB,CAAC;AAEF,SAAO,KAAK;;CAGd,IAAa,aAAa;AACxB,SAAO;GACL,KAAK,KAAK,SAAS,WAAW,QAAQ,IAAI;GAC1C,QAAQ,KAAK,SAAS,UAAU,QAAQ,IAAI,KAAK;GACjD,OAAO,KAAK,SAAS,SAAS;GAC/B;;CAGH,MAAe,QACb,OACA,UACqC;EACrC,MAAM,QAAQ,MAAM,cAAc,SAAS,KAAK,WAAW;EAE3D,MAAM,OAAqC;GACzC,OAAO,MAAM;GACb;GACA,GAAI,MAAM,aAAa,EAAE,YAAY,MAAM,YAAY,GAAG,EAAE;GAC5D,GAAI,MAAM,cAAc,kBACpB,EAAE,iBAAiB,MAAM,aAAa,iBAAuC,GAC7E,EAAE;GACP;EAED,MAAM,WAAW,MAAM,KAAK,OAAO,WAAW,OAAO,KAAK;AAE1D,SAAO;GACL,YAAY,SAAS,KAAK,KAAK,SAAS,KAAK,UAAU;GACvD,OAAO;IACL,aAAa,SAAS,OAAO,iBAAiB;IAC9C,cAAc;IACf;GACD,OAAO,SAAS;GACjB"}
@@ -1,9 +1,9 @@
1
1
  const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
2
  const require_openai = require('./openai.cjs');
3
- let _aigne_core = require("@aigne/core");
4
- let _aigne_core_utils_type_utils = require("@aigne/core/utils/type-utils");
3
+ let _aigne_model_base = require("@aigne/model-base");
4
+ let _aigne_model_base_utils_type_utils = require("@aigne/model-base/utils/type-utils");
5
5
  let zod = require("zod");
6
- let _aigne_core_utils_camelize = require("@aigne/core/utils/camelize");
6
+ let _aigne_model_base_utils_camelize = require("@aigne/model-base/utils/camelize");
7
7
 
8
8
  //#region src/openai-image-model.ts
9
9
  const DEFAULT_MODEL = "dall-e-2";
@@ -35,7 +35,7 @@ const SUPPORTED_PARAMS = {
35
35
  ]
36
36
  };
37
37
  const SUPPORT_EDIT_MODELS = ["gpt-image-1"];
38
- const openAIImageModelInputSchema = _aigne_core.imageModelInputSchema.extend({});
38
+ const openAIImageModelInputSchema = _aigne_model_base.imageModelInputSchema.extend({});
39
39
  const openAIImageModelOptionsSchema = zod.z.object({
40
40
  apiKey: zod.z.string().optional(),
41
41
  baseURL: zod.z.string().optional(),
@@ -43,7 +43,7 @@ const openAIImageModelOptionsSchema = zod.z.object({
43
43
  modelOptions: zod.z.object({}).optional(),
44
44
  clientOptions: zod.z.object({}).optional()
45
45
  });
46
- var OpenAIImageModel = class extends _aigne_core.ImageModel {
46
+ var OpenAIImageModel = class extends _aigne_model_base.ImageModel {
47
47
  constructor(options) {
48
48
  super({
49
49
  ...options,
@@ -51,7 +51,7 @@ var OpenAIImageModel = class extends _aigne_core.ImageModel {
51
51
  description: options?.description ?? "Draw or edit image by OpenAI image models"
52
52
  });
53
53
  this.options = options;
54
- if (options) (0, _aigne_core_utils_type_utils.checkArguments)(this.name, openAIImageModelOptionsSchema, options);
54
+ if (options) (0, _aigne_model_base_utils_type_utils.checkArguments)(this.name, openAIImageModelOptionsSchema, options);
55
55
  }
56
56
  _client;
57
57
  apiKeyEnvName = "OPENAI_API_KEY";
@@ -85,7 +85,7 @@ var OpenAIImageModel = class extends _aigne_core.ImageModel {
85
85
  const model = input.modelOptions?.model || this.credential.model;
86
86
  if (input.image?.length && !SUPPORT_EDIT_MODELS.includes(model)) throw new Error(`Model ${model} does not support image editing`);
87
87
  const body = {
88
- ...(0, _aigne_core_utils_camelize.snakelize)((0, _aigne_core_utils_type_utils.pick)({
88
+ ...(0, _aigne_model_base_utils_camelize.snakelize)((0, _aigne_model_base_utils_type_utils.pick)({
89
89
  ...this.modelOptions,
90
90
  ...input.modelOptions,
91
91
  ...input
@@ -1,36 +1,36 @@
1
- import { AgentInvokeOptions, ImageModel, ImageModelInput, ImageModelOptions, ImageModelOutput } from "@aigne/core";
1
+ import { ImageModel, ImageModelInput, ImageModelOptions, ImageModelOutput, ModelInvokeOptions } from "@aigne/model-base";
2
2
  import OpenAI, { ClientOptions } from "openai";
3
- import { Camelize } from "@aigne/core/utils/camelize";
3
+ import { Camelize } from "@aigne/model-base/utils/camelize";
4
4
 
5
5
  //#region src/openai-image-model.d.ts
6
6
  interface OpenAIImageModelInput extends ImageModelInput, Camelize<Omit<OpenAI.ImageGenerateParams | OpenAI.ImageEditParams, "prompt" | "model" | "n" | "response_format">> {}
7
7
  interface OpenAIImageModelOutput extends ImageModelOutput {}
8
8
  interface OpenAIImageModelOptions extends ImageModelOptions<OpenAIImageModelInput, OpenAIImageModelOutput> {
9
9
  /**
10
- * API key for OpenAI API
11
- *
12
- * If not provided, will look for OPENAI_API_KEY in environment variables
13
- */
10
+ * API key for OpenAI API
11
+ *
12
+ * If not provided, will look for OPENAI_API_KEY in environment variables
13
+ */
14
14
  apiKey?: string;
15
15
  /**
16
- * Base URL for OpenAI API
17
- *
18
- * Useful for proxies or alternate endpoints
19
- */
16
+ * Base URL for OpenAI API
17
+ *
18
+ * Useful for proxies or alternate endpoints
19
+ */
20
20
  baseURL?: string;
21
21
  /**
22
- * OpenAI model to use
23
- *
24
- * Defaults to 'dall-e-2'
25
- */
22
+ * OpenAI model to use
23
+ *
24
+ * Defaults to 'dall-e-2'
25
+ */
26
26
  model?: string;
27
27
  /**
28
- * Additional model options to control behavior
29
- */
28
+ * Additional model options to control behavior
29
+ */
30
30
  modelOptions?: Omit<Partial<OpenAIImageModelInput>, "model">;
31
31
  /**
32
- * Client options for OpenAI API
33
- */
32
+ * Client options for OpenAI API
33
+ */
34
34
  clientOptions?: Partial<ClientOptions>;
35
35
  }
36
36
  declare class OpenAIImageModel extends ImageModel<OpenAIImageModelInput, OpenAIImageModelOutput> {
@@ -46,11 +46,11 @@ declare class OpenAIImageModel extends ImageModel<OpenAIImageModelInput, OpenAII
46
46
  };
47
47
  get modelOptions(): Omit<Partial<OpenAIImageModelInput>, "model"> | undefined;
48
48
  /**
49
- * Process the input and generate a response
50
- * @param input The input to process
51
- * @returns The generated response
52
- */
53
- process(input: OpenAIImageModelInput, _options: AgentInvokeOptions): Promise<OpenAIImageModelOutput>;
49
+ * Process the input and generate a response
50
+ * @param input The input to process
51
+ * @returns The generated response
52
+ */
53
+ process(input: OpenAIImageModelInput, _options: ModelInvokeOptions): Promise<OpenAIImageModelOutput>;
54
54
  }
55
55
  //#endregion
56
56
  export { OpenAIImageModel, OpenAIImageModelInput, OpenAIImageModelOptions, OpenAIImageModelOutput };
@@ -1 +1 @@
1
- {"version":3,"file":"openai-image-model.d.cts","names":[],"sources":["../src/openai-image-model.ts"],"mappings":";;;;;UAqCiB,qBAAA,SACP,eAAA,EACN,QAAA,CACE,IAAA,CACE,MAAA,CAAO,mBAAA,GAAsB,MAAA,CAAO,eAAA;AAAA,UAK3B,sBAAA,SAA+B,gBAAA;AAAA,UAE/B,uBAAA,SACP,iBAAA,CAAkB,qBAAA,EAAuB,sBAAA;EAAA;;;;;EAAA,MAAA;EAAA;;;;;EAAA,OAAA;EAAA;;;;;EAAA,KAAA;EAAA;;;EAAA,YAAA,GAyBlC,IAAA,CAAK,OAAA,CAAQ,qBAAA;EAAA;;;EAAA,aAAA,GAKZ,OAAA,CAAQ,aAAA;AAAA;AAAA,cAeb,gBAAA,SAAyB,UAAA,CAAW,qBAAA,EAAuB,sBAAA;EAAA,OAAA,GAChC,uBAAA;EAAA,YAAA,OAAA,GAAA,uBAAA;EAAA,UAAA,OAAA,GASlB,MAAA;EAAA,UAAA,aAAA;EAAA,IAAA,OAAA,GAIV,MAAA;EAAA,IAAA,WAAA;IAAA,GAAA;IAAA,MAAA;IAAA,KAAA;EAAA;EAAA,IAAA,aAAA,GA2BM,IAAA,CAAA,OAAA,CAAA,qBAAA;EAAA;;;;;EAAA,QAAA,KAAA,EAUP,qBAAA,EAAA,QAAA,EACG,kBAAA,GACT,OAAA,CAAQ,sBAAA;AAAA"}
1
+ {"version":3,"file":"openai-image-model.d.cts","names":[],"sources":["../src/openai-image-model.ts"],"mappings":";;;;;UAqCiB,qBAAA,SACP,eAAA,EACN,QAAA,CACE,IAAA,CACE,MAAA,CAAO,mBAAA,GAAsB,MAAA,CAAO,eAAA;AAAA,UAK3B,sBAAA,SAA+B,gBAAA;AAAA,UAE/B,uBAAA,SACP,iBAAA,CAAkB,qBAAA,EAAuB,sBAAA;EARd;;;;;EAcnC,MAAA;EAjBQ;;;;;EAwBR,OAAA;EArB0C;;;AAK5C;;EAuBE,KAAA;EAvB8C;;AAEhD;EA0BE,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,qBAAA;;;;EAK5B,aAAA,GAAgB,OAAA,CAAQ,aAAA;AAAA;AAAA,cAeb,gBAAA,SAAyB,UAAA,CAAW,qBAAA,EAAuB,sBAAA;EAC1C,OAAA,GAAU,uBAAA;cAAV,OAAA,GAAU,uBAAA;EAAA,UAS5B,OAAA,GAAU,MAAA;EAAA,UAEV,aAAA;EAAA,IAEN,MAAA,CAAA,GAAM,MAAA;EAAA,IAmBG,UAAA,CAAA;;;;;MAQT,YAAA,CAAA,GAAY,IAAA,CAAA,OAAA,CAAA,qBAAA;EA7DhB;;;;;EAsEe,OAAA,CACb,KAAA,EAAO,qBAAA,EACP,QAAA,EAAU,kBAAA,GACT,OAAA,CAAQ,sBAAA;AAAA"}
@@ -1,36 +1,36 @@
1
- import { AgentInvokeOptions, ImageModel, ImageModelInput, ImageModelOptions, ImageModelOutput } from "@aigne/core";
1
+ import { ImageModel, ImageModelInput, ImageModelOptions, ImageModelOutput, ModelInvokeOptions } from "@aigne/model-base";
2
2
  import OpenAI, { ClientOptions } from "openai";
3
- import { Camelize } from "@aigne/core/utils/camelize";
3
+ import { Camelize } from "@aigne/model-base/utils/camelize";
4
4
 
5
5
  //#region src/openai-image-model.d.ts
6
6
  interface OpenAIImageModelInput extends ImageModelInput, Camelize<Omit<OpenAI.ImageGenerateParams | OpenAI.ImageEditParams, "prompt" | "model" | "n" | "response_format">> {}
7
7
  interface OpenAIImageModelOutput extends ImageModelOutput {}
8
8
  interface OpenAIImageModelOptions extends ImageModelOptions<OpenAIImageModelInput, OpenAIImageModelOutput> {
9
9
  /**
10
- * API key for OpenAI API
11
- *
12
- * If not provided, will look for OPENAI_API_KEY in environment variables
13
- */
10
+ * API key for OpenAI API
11
+ *
12
+ * If not provided, will look for OPENAI_API_KEY in environment variables
13
+ */
14
14
  apiKey?: string;
15
15
  /**
16
- * Base URL for OpenAI API
17
- *
18
- * Useful for proxies or alternate endpoints
19
- */
16
+ * Base URL for OpenAI API
17
+ *
18
+ * Useful for proxies or alternate endpoints
19
+ */
20
20
  baseURL?: string;
21
21
  /**
22
- * OpenAI model to use
23
- *
24
- * Defaults to 'dall-e-2'
25
- */
22
+ * OpenAI model to use
23
+ *
24
+ * Defaults to 'dall-e-2'
25
+ */
26
26
  model?: string;
27
27
  /**
28
- * Additional model options to control behavior
29
- */
28
+ * Additional model options to control behavior
29
+ */
30
30
  modelOptions?: Omit<Partial<OpenAIImageModelInput>, "model">;
31
31
  /**
32
- * Client options for OpenAI API
33
- */
32
+ * Client options for OpenAI API
33
+ */
34
34
  clientOptions?: Partial<ClientOptions>;
35
35
  }
36
36
  declare class OpenAIImageModel extends ImageModel<OpenAIImageModelInput, OpenAIImageModelOutput> {
@@ -46,11 +46,11 @@ declare class OpenAIImageModel extends ImageModel<OpenAIImageModelInput, OpenAII
46
46
  };
47
47
  get modelOptions(): Omit<Partial<OpenAIImageModelInput>, "model"> | undefined;
48
48
  /**
49
- * Process the input and generate a response
50
- * @param input The input to process
51
- * @returns The generated response
52
- */
53
- process(input: OpenAIImageModelInput, _options: AgentInvokeOptions): Promise<OpenAIImageModelOutput>;
49
+ * Process the input and generate a response
50
+ * @param input The input to process
51
+ * @returns The generated response
52
+ */
53
+ process(input: OpenAIImageModelInput, _options: ModelInvokeOptions): Promise<OpenAIImageModelOutput>;
54
54
  }
55
55
  //#endregion
56
56
  export { OpenAIImageModel, OpenAIImageModelInput, OpenAIImageModelOptions, OpenAIImageModelOutput };
@@ -1 +1 @@
1
- {"version":3,"file":"openai-image-model.d.mts","names":[],"sources":["../src/openai-image-model.ts"],"mappings":";;;;;UAqCiB,qBAAA,SACP,eAAA,EACN,QAAA,CACE,IAAA,CACE,MAAA,CAAO,mBAAA,GAAsB,MAAA,CAAO,eAAA;AAAA,UAK3B,sBAAA,SAA+B,gBAAA;AAAA,UAE/B,uBAAA,SACP,iBAAA,CAAkB,qBAAA,EAAuB,sBAAA;EAAA;;;;;EAAA,MAAA;EAAA;;;;;EAAA,OAAA;EAAA;;;;;EAAA,KAAA;EAAA;;;EAAA,YAAA,GAyBlC,IAAA,CAAK,OAAA,CAAQ,qBAAA;EAAA;;;EAAA,aAAA,GAKZ,OAAA,CAAQ,aAAA;AAAA;AAAA,cAeb,gBAAA,SAAyB,UAAA,CAAW,qBAAA,EAAuB,sBAAA;EAAA,OAAA,GAChC,uBAAA;EAAA,YAAA,OAAA,GAAA,uBAAA;EAAA,UAAA,OAAA,GASlB,MAAA;EAAA,UAAA,aAAA;EAAA,IAAA,OAAA,GAIV,MAAA;EAAA,IAAA,WAAA;IAAA,GAAA;IAAA,MAAA;IAAA,KAAA;EAAA;EAAA,IAAA,aAAA,GA2BM,IAAA,CAAA,OAAA,CAAA,qBAAA;EAAA;;;;;EAAA,QAAA,KAAA,EAUP,qBAAA,EAAA,QAAA,EACG,kBAAA,GACT,OAAA,CAAQ,sBAAA;AAAA"}
1
+ {"version":3,"file":"openai-image-model.d.mts","names":[],"sources":["../src/openai-image-model.ts"],"mappings":";;;;;UAqCiB,qBAAA,SACP,eAAA,EACN,QAAA,CACE,IAAA,CACE,MAAA,CAAO,mBAAA,GAAsB,MAAA,CAAO,eAAA;AAAA,UAK3B,sBAAA,SAA+B,gBAAA;AAAA,UAE/B,uBAAA,SACP,iBAAA,CAAkB,qBAAA,EAAuB,sBAAA;EARd;;;;;EAcnC,MAAA;EAjBQ;;;;;EAwBR,OAAA;EArB0C;;;AAK5C;;EAuBE,KAAA;EAvB8C;;AAEhD;EA0BE,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,qBAAA;;;;EAK5B,aAAA,GAAgB,OAAA,CAAQ,aAAA;AAAA;AAAA,cAeb,gBAAA,SAAyB,UAAA,CAAW,qBAAA,EAAuB,sBAAA;EAC1C,OAAA,GAAU,uBAAA;cAAV,OAAA,GAAU,uBAAA;EAAA,UAS5B,OAAA,GAAU,MAAA;EAAA,UAEV,aAAA;EAAA,IAEN,MAAA,CAAA,GAAM,MAAA;EAAA,IAmBG,UAAA,CAAA;;;;;MAQT,YAAA,CAAA,GAAY,IAAA,CAAA,OAAA,CAAA,qBAAA;EA7DhB;;;;;EAsEe,OAAA,CACb,KAAA,EAAO,qBAAA,EACP,QAAA,EAAU,kBAAA,GACT,OAAA,CAAQ,sBAAA;AAAA"}
@@ -1,8 +1,8 @@
1
1
  import { CustomOpenAI } from "./openai.mjs";
2
- import { ImageModel, imageModelInputSchema } from "@aigne/core";
3
- import { checkArguments, pick } from "@aigne/core/utils/type-utils";
2
+ import { ImageModel, imageModelInputSchema } from "@aigne/model-base";
3
+ import { checkArguments, pick } from "@aigne/model-base/utils/type-utils";
4
4
  import { z } from "zod";
5
- import { snakelize } from "@aigne/core/utils/camelize";
5
+ import { snakelize } from "@aigne/model-base/utils/camelize";
6
6
 
7
7
  //#region src/openai-image-model.ts
8
8
  const DEFAULT_MODEL = "dall-e-2";
@@ -1 +1 @@
1
- {"version":3,"file":"openai-image-model.mjs","names":[],"sources":["../src/openai-image-model.ts"],"sourcesContent":["import {\n type AgentInvokeOptions,\n type FileUnionContent,\n ImageModel,\n type ImageModelInput,\n type ImageModelOptions,\n type ImageModelOutput,\n imageModelInputSchema,\n} from \"@aigne/core\";\nimport { type Camelize, snakelize } from \"@aigne/core/utils/camelize\";\nimport { checkArguments, pick } from \"@aigne/core/utils/type-utils\";\nimport type OpenAI from \"openai\";\nimport type { ClientOptions } from \"openai\";\nimport { type ZodType, z } from \"zod\";\nimport { CustomOpenAI } from \"./openai.js\";\n\nconst DEFAULT_MODEL = \"dall-e-2\";\nconst OUTPUT_MIME_TYPE = \"image/png\";\n\nconst SUPPORTED_PARAMS: { [key: string]: any[] } = {\n \"dall-e-2\": [\"prompt\", \"size\", \"n\"],\n \"dall-e-3\": [\"prompt\", \"size\", \"n\", \"quality\", \"style\", \"user\"],\n \"gpt-image-1\": [\n \"prompt\",\n \"size\",\n \"background\",\n \"moderation\",\n \"outputCompression\",\n \"outputFormat\",\n \"quality\",\n \"user\",\n \"stream\",\n ],\n};\n\nconst SUPPORT_EDIT_MODELS = [\"gpt-image-1\"];\n\nexport interface OpenAIImageModelInput\n extends ImageModelInput,\n Camelize<\n Omit<\n OpenAI.ImageGenerateParams | OpenAI.ImageEditParams,\n \"prompt\" | \"model\" | \"n\" | \"response_format\"\n >\n > {}\n\nexport interface OpenAIImageModelOutput extends ImageModelOutput {}\n\nexport interface OpenAIImageModelOptions\n extends ImageModelOptions<OpenAIImageModelInput, OpenAIImageModelOutput> {\n /**\n * API key for OpenAI API\n *\n * If not provided, will look for OPENAI_API_KEY in environment variables\n */\n apiKey?: string;\n\n /**\n * Base URL for OpenAI API\n *\n * Useful for proxies or alternate endpoints\n */\n baseURL?: string;\n\n /**\n * OpenAI model to use\n *\n * Defaults to 'dall-e-2'\n */\n model?: string;\n\n /**\n * Additional model options to control behavior\n */\n modelOptions?: Omit<Partial<OpenAIImageModelInput>, \"model\">;\n\n /**\n * Client options for OpenAI API\n */\n clientOptions?: Partial<ClientOptions>;\n}\n\nconst openAIImageModelInputSchema: ZodType<OpenAIImageModelInput> = imageModelInputSchema.extend(\n {},\n);\n\nconst openAIImageModelOptionsSchema = z.object({\n apiKey: z.string().optional(),\n baseURL: z.string().optional(),\n model: z.string().optional(),\n modelOptions: z.object({}).optional(),\n clientOptions: z.object({}).optional(),\n});\n\nexport class OpenAIImageModel extends ImageModel<OpenAIImageModelInput, OpenAIImageModelOutput> {\n constructor(public override options?: OpenAIImageModelOptions) {\n super({\n ...options,\n inputSchema: openAIImageModelInputSchema,\n description: options?.description ?? \"Draw or edit image by OpenAI image models\",\n });\n if (options) checkArguments(this.name, openAIImageModelOptionsSchema, options);\n }\n\n protected _client?: OpenAI;\n\n protected apiKeyEnvName = \"OPENAI_API_KEY\";\n\n get client() {\n if (this._client) return this._client;\n\n const { apiKey, url } = this.credential;\n\n if (!apiKey)\n throw new Error(\n `${this.name} requires an API key. Please provide it via \\`options.apiKey\\`, or set the \\`${this.apiKeyEnvName}\\` environment variable`,\n );\n\n this._client ??= new CustomOpenAI({\n baseURL: url,\n apiKey,\n ...this.options?.clientOptions,\n });\n\n return this._client;\n }\n\n override get credential() {\n return {\n url: this.options?.baseURL || process.env.OPENAI_BASE_URL,\n apiKey: this.options?.apiKey || process.env[this.apiKeyEnvName],\n model: this.options?.model || DEFAULT_MODEL,\n };\n }\n\n get modelOptions() {\n return this.options?.modelOptions;\n }\n\n /**\n * Process the input and generate a response\n * @param input The input to process\n * @returns The generated response\n */\n override async process(\n input: OpenAIImageModelInput,\n _options: AgentInvokeOptions,\n ): Promise<OpenAIImageModelOutput> {\n const model = input.modelOptions?.model || this.credential.model;\n\n if (input.image?.length && !SUPPORT_EDIT_MODELS.includes(model)) {\n throw new Error(`Model ${model} does not support image editing`);\n }\n\n const body: OpenAI.ImageGenerateParams | OpenAI.ImageEditParams = {\n ...snakelize(\n pick(\n { ...this.modelOptions, ...input.modelOptions, ...input },\n SUPPORTED_PARAMS[model] || SUPPORTED_PARAMS[DEFAULT_MODEL],\n ),\n ),\n model,\n };\n\n const response = input.image?.length\n ? ((await this.client.images.edit(\n {\n ...(body as OpenAI.ImageEditParams),\n image: await Promise.all(\n input.image.map((image) =>\n this.transformFileType(\"file\", image).then(\n (file) =>\n new File([Buffer.from(file.data, \"base64\")], file.filename || \"image.png\", {\n type: file.mimeType,\n }),\n ),\n ),\n ),\n },\n { stream: false },\n )) as OpenAI.ImagesResponse)\n : ((await this.client.images.generate(\n { ...body },\n { stream: false },\n )) as OpenAI.ImagesResponse);\n\n return {\n images: (response.data ?? []).map<FileUnionContent>((image) => {\n if (image.url) return { type: \"url\", url: image.url, mimeType: OUTPUT_MIME_TYPE };\n if (image.b64_json)\n return { type: \"file\", data: image.b64_json, mimeType: OUTPUT_MIME_TYPE };\n throw new Error(\"Image response does not contain a valid URL or base64 data\");\n }),\n usage: {\n inputTokens: response.usage?.input_tokens || 0,\n outputTokens: response.usage?.output_tokens || 0,\n },\n model,\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"openai-image-model.mjs","names":[],"sources":["../src/openai-image-model.ts"],"sourcesContent":["import {\n type FileUnionContent,\n ImageModel,\n type ImageModelInput,\n type ImageModelOptions,\n type ImageModelOutput,\n imageModelInputSchema,\n type ModelInvokeOptions,\n} from \"@aigne/model-base\";\nimport { type Camelize, snakelize } from \"@aigne/model-base/utils/camelize\";\nimport { checkArguments, pick } from \"@aigne/model-base/utils/type-utils\";\nimport type OpenAI from \"openai\";\nimport type { ClientOptions } from \"openai\";\nimport { type ZodType, z } from \"zod\";\nimport { CustomOpenAI } from \"./openai.js\";\n\nconst DEFAULT_MODEL = \"dall-e-2\";\nconst OUTPUT_MIME_TYPE = \"image/png\";\n\nconst SUPPORTED_PARAMS: { [key: string]: any[] } = {\n \"dall-e-2\": [\"prompt\", \"size\", \"n\"],\n \"dall-e-3\": [\"prompt\", \"size\", \"n\", \"quality\", \"style\", \"user\"],\n \"gpt-image-1\": [\n \"prompt\",\n \"size\",\n \"background\",\n \"moderation\",\n \"outputCompression\",\n \"outputFormat\",\n \"quality\",\n \"user\",\n \"stream\",\n ],\n};\n\nconst SUPPORT_EDIT_MODELS = [\"gpt-image-1\"];\n\nexport interface OpenAIImageModelInput\n extends ImageModelInput,\n Camelize<\n Omit<\n OpenAI.ImageGenerateParams | OpenAI.ImageEditParams,\n \"prompt\" | \"model\" | \"n\" | \"response_format\"\n >\n > {}\n\nexport interface OpenAIImageModelOutput extends ImageModelOutput {}\n\nexport interface OpenAIImageModelOptions\n extends ImageModelOptions<OpenAIImageModelInput, OpenAIImageModelOutput> {\n /**\n * API key for OpenAI API\n *\n * If not provided, will look for OPENAI_API_KEY in environment variables\n */\n apiKey?: string;\n\n /**\n * Base URL for OpenAI API\n *\n * Useful for proxies or alternate endpoints\n */\n baseURL?: string;\n\n /**\n * OpenAI model to use\n *\n * Defaults to 'dall-e-2'\n */\n model?: string;\n\n /**\n * Additional model options to control behavior\n */\n modelOptions?: Omit<Partial<OpenAIImageModelInput>, \"model\">;\n\n /**\n * Client options for OpenAI API\n */\n clientOptions?: Partial<ClientOptions>;\n}\n\nconst openAIImageModelInputSchema: ZodType<OpenAIImageModelInput> = imageModelInputSchema.extend(\n {},\n);\n\nconst openAIImageModelOptionsSchema = z.object({\n apiKey: z.string().optional(),\n baseURL: z.string().optional(),\n model: z.string().optional(),\n modelOptions: z.object({}).optional(),\n clientOptions: z.object({}).optional(),\n});\n\nexport class OpenAIImageModel extends ImageModel<OpenAIImageModelInput, OpenAIImageModelOutput> {\n constructor(public override options?: OpenAIImageModelOptions) {\n super({\n ...options,\n inputSchema: openAIImageModelInputSchema,\n description: options?.description ?? \"Draw or edit image by OpenAI image models\",\n });\n if (options) checkArguments(this.name, openAIImageModelOptionsSchema, options);\n }\n\n protected _client?: OpenAI;\n\n protected apiKeyEnvName = \"OPENAI_API_KEY\";\n\n get client() {\n if (this._client) return this._client;\n\n const { apiKey, url } = this.credential;\n\n if (!apiKey)\n throw new Error(\n `${this.name} requires an API key. Please provide it via \\`options.apiKey\\`, or set the \\`${this.apiKeyEnvName}\\` environment variable`,\n );\n\n this._client ??= new CustomOpenAI({\n baseURL: url,\n apiKey,\n ...this.options?.clientOptions,\n });\n\n return this._client;\n }\n\n override get credential() {\n return {\n url: this.options?.baseURL || process.env.OPENAI_BASE_URL,\n apiKey: this.options?.apiKey || process.env[this.apiKeyEnvName],\n model: this.options?.model || DEFAULT_MODEL,\n };\n }\n\n get modelOptions() {\n return this.options?.modelOptions;\n }\n\n /**\n * Process the input and generate a response\n * @param input The input to process\n * @returns The generated response\n */\n override async process(\n input: OpenAIImageModelInput,\n _options: ModelInvokeOptions,\n ): Promise<OpenAIImageModelOutput> {\n const model = input.modelOptions?.model || this.credential.model;\n\n if (input.image?.length && !SUPPORT_EDIT_MODELS.includes(model)) {\n throw new Error(`Model ${model} does not support image editing`);\n }\n\n const body: OpenAI.ImageGenerateParams | OpenAI.ImageEditParams = {\n ...snakelize(\n pick(\n { ...this.modelOptions, ...input.modelOptions, ...input },\n SUPPORTED_PARAMS[model] || SUPPORTED_PARAMS[DEFAULT_MODEL],\n ),\n ),\n model,\n };\n\n const response = input.image?.length\n ? ((await this.client.images.edit(\n {\n ...(body as OpenAI.ImageEditParams),\n image: await Promise.all(\n input.image.map((image) =>\n this.transformFileType(\"file\", image).then(\n (file) =>\n new File([Buffer.from(file.data, \"base64\")], file.filename || \"image.png\", {\n type: file.mimeType,\n }),\n ),\n ),\n ),\n },\n { stream: false },\n )) as OpenAI.ImagesResponse)\n : ((await this.client.images.generate(\n { ...body },\n { stream: false },\n )) as OpenAI.ImagesResponse);\n\n return {\n images: (response.data ?? []).map<FileUnionContent>((image) => {\n if (image.url) return { type: \"url\", url: image.url, mimeType: OUTPUT_MIME_TYPE };\n if (image.b64_json)\n return { type: \"file\", data: image.b64_json, mimeType: OUTPUT_MIME_TYPE };\n throw new Error(\"Image response does not contain a valid URL or base64 data\");\n }),\n usage: {\n inputTokens: response.usage?.input_tokens || 0,\n outputTokens: response.usage?.output_tokens || 0,\n },\n model,\n };\n }\n}\n"],"mappings":"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"}
@@ -1,14 +1,14 @@
1
1
  const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
2
  const require_openai = require('./openai.cjs');
3
- let _aigne_core = require("@aigne/core");
4
- let _aigne_core_utils_logger = require("@aigne/core/utils/logger");
5
- let _aigne_core_utils_type_utils = require("@aigne/core/utils/type-utils");
3
+ let _aigne_model_base = require("@aigne/model-base");
4
+ let _aigne_model_base_utils_logger = require("@aigne/model-base/utils/logger");
5
+ let _aigne_model_base_utils_type_utils = require("@aigne/model-base/utils/type-utils");
6
6
  let zod = require("zod");
7
7
 
8
8
  //#region src/openai-video-model.ts
9
9
  const DEFAULT_MODEL = "sora-2";
10
10
  const DEFAULT_SECONDS = 4;
11
- const openAIVideoModelInputSchema = _aigne_core.videoModelInputSchema.extend({
11
+ const openAIVideoModelInputSchema = _aigne_model_base.videoModelInputSchema.extend({
12
12
  model: zod.z.enum(["sora-2", "sora-2-pro"]).optional(),
13
13
  seconds: zod.z.enum([
14
14
  "4",
@@ -30,7 +30,7 @@ const openAIVideoModelOptionsSchema = zod.z.object({
30
30
  clientOptions: zod.z.object({}).optional(),
31
31
  pollingInterval: zod.z.number().optional()
32
32
  });
33
- var OpenAIVideoModel = class extends _aigne_core.VideoModel {
33
+ var OpenAIVideoModel = class extends _aigne_model_base.VideoModel {
34
34
  constructor(options) {
35
35
  super({
36
36
  ...options,
@@ -38,7 +38,7 @@ var OpenAIVideoModel = class extends _aigne_core.VideoModel {
38
38
  inputSchema: openAIVideoModelInputSchema
39
39
  });
40
40
  this.options = options;
41
- if (options) (0, _aigne_core_utils_type_utils.checkArguments)(this.name, openAIVideoModelOptionsSchema, options);
41
+ if (options) (0, _aigne_model_base_utils_type_utils.checkArguments)(this.name, openAIVideoModelOptionsSchema, options);
42
42
  }
43
43
  /**
44
44
  * @hidden
@@ -66,7 +66,7 @@ var OpenAIVideoModel = class extends _aigne_core.VideoModel {
66
66
  return this.options?.modelOptions;
67
67
  }
68
68
  async downloadToFile(videoId) {
69
- _aigne_core_utils_logger.logger.debug("Downloading video content...");
69
+ _aigne_model_base_utils_logger.logger.debug("Downloading video content...");
70
70
  const arrayBuffer = await (await this.client.videos.downloadContent(videoId)).arrayBuffer();
71
71
  return Buffer.from(arrayBuffer).toString("base64");
72
72
  }
@@ -80,14 +80,14 @@ var OpenAIVideoModel = class extends _aigne_core.VideoModel {
80
80
  if (input.size) createParams.size = input.size;
81
81
  if (input.image) createParams.input_reference = await this.transformFileType("file", input.image).then((file) => new File([Buffer.from(file.data, "base64")], file.filename || "image.png", { type: file.mimeType }));
82
82
  let video = await this.client.videos.create(createParams);
83
- _aigne_core_utils_logger.logger.debug(`Video generation started: ${video.id}`);
83
+ _aigne_model_base_utils_logger.logger.debug(`Video generation started: ${video.id}`);
84
84
  const pollingInterval = this.options?.pollingInterval ?? 2e3;
85
85
  while (video.status === "in_progress" || video.status === "queued") {
86
86
  await new Promise((resolve) => setTimeout(resolve, pollingInterval));
87
87
  video = await this.client.videos.retrieve(video.id);
88
88
  const progress = video.progress ?? 0;
89
89
  const statusText = video.status === "queued" ? "Queued" : "Processing";
90
- _aigne_core_utils_logger.logger.debug(`${statusText}: ${progress.toFixed(1)}%`);
90
+ _aigne_model_base_utils_logger.logger.debug(`${statusText}: ${progress.toFixed(1)}%`);
91
91
  }
92
92
  if (video.status === "failed") throw new Error(`Video generation failed: ${video.error?.message || "Unknown error"}`);
93
93
  if (video.status !== "completed") throw new Error(`Unexpected video status: ${video.status}`);