@vitkuz/vitkuz-chat-gpt-apapter 1.4.0 → 1.6.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.
package/dist/index.d.mts CHANGED
@@ -82,14 +82,53 @@ interface CreateChatCompletionOutput {
82
82
  };
83
83
  };
84
84
  price?: PriceInfo;
85
+ input?: CreateChatCompletionInput;
86
+ }
87
+ interface CreateImageInput {
88
+ prompt: string;
89
+ model?: string;
90
+ n?: number;
91
+ quality?: 'standard' | 'hd';
92
+ response_format?: 'url' | 'b64_json';
93
+ size?: '256x256' | '512x512' | '1024x1024' | '1024x1792' | '1792x1024';
94
+ style?: 'vivid' | 'natural';
95
+ user?: string;
96
+ }
97
+ interface CreateImageOutput {
98
+ created: number;
99
+ data: {
100
+ url?: string;
101
+ b64_json?: string;
102
+ revised_prompt?: string;
103
+ }[];
104
+ price?: PriceInfo;
105
+ input?: CreateImageInput;
106
+ }
107
+ interface CreateSpeechInput {
108
+ model?: string;
109
+ input: string;
110
+ voice: 'alloy' | 'echo' | 'fable' | 'onyx' | 'nova' | 'shimmer';
111
+ response_format?: 'mp3' | 'opus' | 'aac' | 'flac' | 'wav' | 'pcm';
112
+ speed?: number;
113
+ }
114
+ interface CreateSpeechOutput {
115
+ data: Buffer | Uint8Array;
116
+ price?: PriceInfo;
117
+ input?: CreateSpeechInput;
85
118
  }
86
119
 
87
120
  declare const createChatGptClient: (config: ChatGptConfig) => OpenAI;
88
121
 
89
122
  declare const createChatCompletion: (ctx: ChatGptContext) => (input: CreateChatCompletionInput) => Promise<CreateChatCompletionOutput>;
90
123
 
124
+ declare const createImage: (ctx: ChatGptContext) => (input: CreateImageInput) => Promise<CreateImageOutput>;
125
+
126
+ declare const createSpeech: (ctx: ChatGptContext) => (input: CreateSpeechInput) => Promise<CreateSpeechOutput>;
127
+
91
128
  interface ChatGptAdapter {
92
129
  createChatCompletion: ReturnType<typeof createChatCompletion>;
130
+ createImage: ReturnType<typeof createImage>;
131
+ createSpeech: ReturnType<typeof createSpeech>;
93
132
  }
94
133
  declare const createAdapter: (config: ChatGptConfig, logger?: Logger) => ChatGptAdapter;
95
134
 
@@ -141,6 +180,8 @@ declare const CHAT_GPT_MODELS: {
141
180
  readonly GPT_3_5_TURBO: "gpt-3.5-turbo";
142
181
  readonly GPT_3_5_TURBO_INSTRUCT: "gpt-3.5-turbo-instruct";
143
182
  readonly COMPUTER_USE_PREVIEW: "computer-use-preview";
183
+ readonly DALL_E_3: "dall-e-3";
184
+ readonly DALL_E_2: "dall-e-2";
144
185
  };
145
186
  type ChatGptModel = (typeof CHAT_GPT_MODELS)[keyof typeof CHAT_GPT_MODELS];
146
187
  declare const isStructuredOutputSupported: (model: string) => boolean;
@@ -150,7 +191,13 @@ interface ModelPricing {
150
191
  output: number;
151
192
  cachedInput?: number;
152
193
  }
194
+ interface ImagePricing {
195
+ standard: Record<string, number>;
196
+ hd: Record<string, number>;
197
+ }
153
198
  declare const CHAT_GPT_PRICING: Record<string, ModelPricing>;
199
+ declare const IMAGE_PRICING: Record<string, ImagePricing>;
200
+ declare const SPEECH_PRICING: Record<string, number>;
154
201
  declare const calculatePrice: (model: string, usage?: {
155
202
  prompt_tokens?: number;
156
203
  completion_tokens?: number;
@@ -163,5 +210,7 @@ declare const calculatePrice: (model: string, usage?: {
163
210
  cached_tokens?: number;
164
211
  };
165
212
  }) => PriceInfo | undefined;
213
+ declare const calculateImagePrice: (model: string, size?: string, quality?: string, n?: number) => PriceInfo | undefined;
214
+ declare const calculateSpeechPrice: (model: string, inputLength: number) => PriceInfo | undefined;
166
215
 
167
- export { CHAT_GPT_MODELS, CHAT_GPT_PRICING, type ChatGptAdapter, type ChatGptConfig, type ChatGptContext, type ChatGptDefaults, type ChatGptModel, type ChatMessage, type ChatMessageRole, type CreateChatCompletionInput, type CreateChatCompletionOutput, type Logger, type ModelPricing, type PriceInfo, calculatePrice, createAdapter, createChatCompletion, createChatGptClient, isStructuredOutputSupported };
216
+ export { CHAT_GPT_MODELS, CHAT_GPT_PRICING, type ChatGptAdapter, type ChatGptConfig, type ChatGptContext, type ChatGptDefaults, type ChatGptModel, type ChatMessage, type ChatMessageRole, type CreateChatCompletionInput, type CreateChatCompletionOutput, type CreateImageInput, type CreateImageOutput, type CreateSpeechInput, type CreateSpeechOutput, IMAGE_PRICING, type ImagePricing, type Logger, type ModelPricing, type PriceInfo, SPEECH_PRICING, calculateImagePrice, calculatePrice, calculateSpeechPrice, createAdapter, createChatCompletion, createChatGptClient, createImage, createSpeech, isStructuredOutputSupported };
package/dist/index.d.ts CHANGED
@@ -82,14 +82,53 @@ interface CreateChatCompletionOutput {
82
82
  };
83
83
  };
84
84
  price?: PriceInfo;
85
+ input?: CreateChatCompletionInput;
86
+ }
87
+ interface CreateImageInput {
88
+ prompt: string;
89
+ model?: string;
90
+ n?: number;
91
+ quality?: 'standard' | 'hd';
92
+ response_format?: 'url' | 'b64_json';
93
+ size?: '256x256' | '512x512' | '1024x1024' | '1024x1792' | '1792x1024';
94
+ style?: 'vivid' | 'natural';
95
+ user?: string;
96
+ }
97
+ interface CreateImageOutput {
98
+ created: number;
99
+ data: {
100
+ url?: string;
101
+ b64_json?: string;
102
+ revised_prompt?: string;
103
+ }[];
104
+ price?: PriceInfo;
105
+ input?: CreateImageInput;
106
+ }
107
+ interface CreateSpeechInput {
108
+ model?: string;
109
+ input: string;
110
+ voice: 'alloy' | 'echo' | 'fable' | 'onyx' | 'nova' | 'shimmer';
111
+ response_format?: 'mp3' | 'opus' | 'aac' | 'flac' | 'wav' | 'pcm';
112
+ speed?: number;
113
+ }
114
+ interface CreateSpeechOutput {
115
+ data: Buffer | Uint8Array;
116
+ price?: PriceInfo;
117
+ input?: CreateSpeechInput;
85
118
  }
86
119
 
87
120
  declare const createChatGptClient: (config: ChatGptConfig) => OpenAI;
88
121
 
89
122
  declare const createChatCompletion: (ctx: ChatGptContext) => (input: CreateChatCompletionInput) => Promise<CreateChatCompletionOutput>;
90
123
 
124
+ declare const createImage: (ctx: ChatGptContext) => (input: CreateImageInput) => Promise<CreateImageOutput>;
125
+
126
+ declare const createSpeech: (ctx: ChatGptContext) => (input: CreateSpeechInput) => Promise<CreateSpeechOutput>;
127
+
91
128
  interface ChatGptAdapter {
92
129
  createChatCompletion: ReturnType<typeof createChatCompletion>;
130
+ createImage: ReturnType<typeof createImage>;
131
+ createSpeech: ReturnType<typeof createSpeech>;
93
132
  }
94
133
  declare const createAdapter: (config: ChatGptConfig, logger?: Logger) => ChatGptAdapter;
95
134
 
@@ -141,6 +180,8 @@ declare const CHAT_GPT_MODELS: {
141
180
  readonly GPT_3_5_TURBO: "gpt-3.5-turbo";
142
181
  readonly GPT_3_5_TURBO_INSTRUCT: "gpt-3.5-turbo-instruct";
143
182
  readonly COMPUTER_USE_PREVIEW: "computer-use-preview";
183
+ readonly DALL_E_3: "dall-e-3";
184
+ readonly DALL_E_2: "dall-e-2";
144
185
  };
145
186
  type ChatGptModel = (typeof CHAT_GPT_MODELS)[keyof typeof CHAT_GPT_MODELS];
146
187
  declare const isStructuredOutputSupported: (model: string) => boolean;
@@ -150,7 +191,13 @@ interface ModelPricing {
150
191
  output: number;
151
192
  cachedInput?: number;
152
193
  }
194
+ interface ImagePricing {
195
+ standard: Record<string, number>;
196
+ hd: Record<string, number>;
197
+ }
153
198
  declare const CHAT_GPT_PRICING: Record<string, ModelPricing>;
199
+ declare const IMAGE_PRICING: Record<string, ImagePricing>;
200
+ declare const SPEECH_PRICING: Record<string, number>;
154
201
  declare const calculatePrice: (model: string, usage?: {
155
202
  prompt_tokens?: number;
156
203
  completion_tokens?: number;
@@ -163,5 +210,7 @@ declare const calculatePrice: (model: string, usage?: {
163
210
  cached_tokens?: number;
164
211
  };
165
212
  }) => PriceInfo | undefined;
213
+ declare const calculateImagePrice: (model: string, size?: string, quality?: string, n?: number) => PriceInfo | undefined;
214
+ declare const calculateSpeechPrice: (model: string, inputLength: number) => PriceInfo | undefined;
166
215
 
167
- export { CHAT_GPT_MODELS, CHAT_GPT_PRICING, type ChatGptAdapter, type ChatGptConfig, type ChatGptContext, type ChatGptDefaults, type ChatGptModel, type ChatMessage, type ChatMessageRole, type CreateChatCompletionInput, type CreateChatCompletionOutput, type Logger, type ModelPricing, type PriceInfo, calculatePrice, createAdapter, createChatCompletion, createChatGptClient, isStructuredOutputSupported };
216
+ export { CHAT_GPT_MODELS, CHAT_GPT_PRICING, type ChatGptAdapter, type ChatGptConfig, type ChatGptContext, type ChatGptDefaults, type ChatGptModel, type ChatMessage, type ChatMessageRole, type CreateChatCompletionInput, type CreateChatCompletionOutput, type CreateImageInput, type CreateImageOutput, type CreateSpeechInput, type CreateSpeechOutput, IMAGE_PRICING, type ImagePricing, type Logger, type ModelPricing, type PriceInfo, SPEECH_PRICING, calculateImagePrice, calculatePrice, calculateSpeechPrice, createAdapter, createChatCompletion, createChatGptClient, createImage, createSpeech, isStructuredOutputSupported };
package/dist/index.js CHANGED
@@ -71,7 +71,10 @@ var CHAT_GPT_MODELS = {
71
71
  GPT_3_5_TURBO: "gpt-3.5-turbo",
72
72
  GPT_3_5_TURBO_INSTRUCT: "gpt-3.5-turbo-instruct",
73
73
  // Specialized Preview
74
- COMPUTER_USE_PREVIEW: "computer-use-preview"
74
+ COMPUTER_USE_PREVIEW: "computer-use-preview",
75
+ // Image Generation Models
76
+ DALL_E_3: "dall-e-3",
77
+ DALL_E_2: "dall-e-2"
75
78
  };
76
79
  var isStructuredOutputSupported = (model) => {
77
80
  if (model.startsWith("gpt-4o-mini")) return true;
@@ -143,6 +146,35 @@ var CHAT_GPT_PRICING = {
143
146
  // Specialized Preview
144
147
  "computer-use-preview": { input: 3, output: 12 }
145
148
  };
149
+ var IMAGE_PRICING = {
150
+ "dall-e-3": {
151
+ standard: {
152
+ "1024x1024": 0.04,
153
+ "1024x1792": 0.08,
154
+ "1792x1024": 0.08
155
+ },
156
+ hd: {
157
+ "1024x1024": 0.08,
158
+ "1024x1792": 0.12,
159
+ "1792x1024": 0.12
160
+ }
161
+ },
162
+ "dall-e-2": {
163
+ standard: {
164
+ "1024x1024": 0.02,
165
+ "512x512": 0.018,
166
+ "256x256": 0.016
167
+ },
168
+ hd: {}
169
+ // no hd for dall-e-2
170
+ }
171
+ };
172
+ var SPEECH_PRICING = {
173
+ tts: 15 / 1e6,
174
+ // per character
175
+ "tts-hd": 30 / 1e6
176
+ // per character
177
+ };
146
178
  var calculatePrice = (model, usage) => {
147
179
  if (!usage) return void 0;
148
180
  const pricing = CHAT_GPT_PRICING[model];
@@ -160,6 +192,31 @@ var calculatePrice = (model, usage) => {
160
192
  currency: "USD"
161
193
  };
162
194
  };
195
+ var calculateImagePrice = (model, size = "1024x1024", quality = "standard", n = 1) => {
196
+ const pricing = IMAGE_PRICING[model];
197
+ if (!pricing) return void 0;
198
+ const unitPrice = quality === "hd" ? pricing.hd[size] : pricing.standard[size];
199
+ if (unitPrice === void 0) return void 0;
200
+ const total = unitPrice * n;
201
+ return {
202
+ total: Number(total.toFixed(6)),
203
+ inputCost: 0,
204
+ outputCost: total,
205
+ currency: "USD"
206
+ };
207
+ };
208
+ var calculateSpeechPrice = (model, inputLength) => {
209
+ const priceKey = model.includes("hd") ? "tts-hd" : "tts";
210
+ const rate = SPEECH_PRICING[priceKey];
211
+ if (!rate) return void 0;
212
+ const total = inputLength * rate;
213
+ return {
214
+ total: Number(total.toFixed(6)),
215
+ inputCost: 0,
216
+ outputCost: total,
217
+ currency: "USD"
218
+ };
219
+ };
163
220
 
164
221
  // src/operations/create-chat-completion.ts
165
222
  var createChatCompletion = (ctx) => async (input) => {
@@ -200,7 +257,8 @@ var createChatCompletion = (ctx) => async (input) => {
200
257
  const price = calculatePrice(mergedInput.model, response.usage);
201
258
  const output = {
202
259
  ...response,
203
- price
260
+ price,
261
+ input
204
262
  };
205
263
  logger?.debug("chat-gpt:createChatCompletion:success", { data: output });
206
264
  return output;
@@ -210,21 +268,81 @@ var createChatCompletion = (ctx) => async (input) => {
210
268
  }
211
269
  };
212
270
 
271
+ // src/operations/create-image.ts
272
+ var createImage = (ctx) => async (input) => {
273
+ const { client, logger } = ctx;
274
+ const model = input.model || "dall-e-3";
275
+ const mergedInput = {
276
+ ...input,
277
+ model
278
+ };
279
+ logger?.debug("chat-gpt:createImage:start", { data: mergedInput });
280
+ try {
281
+ const response = await client.images.generate(mergedInput);
282
+ const price = calculateImagePrice(model, input.size, input.quality, input.n);
283
+ const output = {
284
+ created: response.created,
285
+ data: response.data,
286
+ price,
287
+ input
288
+ };
289
+ logger?.debug("chat-gpt:createImage:success", { data: output });
290
+ return output;
291
+ } catch (error) {
292
+ logger?.debug("chat-gpt:createImage:error", { error });
293
+ throw error;
294
+ }
295
+ };
296
+
297
+ // src/operations/create-speech.ts
298
+ var createSpeech = (ctx) => async (input) => {
299
+ const { client, logger } = ctx;
300
+ const model = input.model || "tts-1";
301
+ const mergedInput = {
302
+ ...input,
303
+ model
304
+ };
305
+ logger?.debug("chat-gpt:createSpeech:start", { data: mergedInput });
306
+ try {
307
+ const response = await client.audio.speech.create(mergedInput);
308
+ const buffer = Buffer.from(await response.arrayBuffer());
309
+ const price = calculateSpeechPrice(model, input.input.length);
310
+ const output = {
311
+ data: buffer,
312
+ price,
313
+ input
314
+ };
315
+ logger?.debug("chat-gpt:createSpeech:success", { data: { price } });
316
+ return output;
317
+ } catch (error) {
318
+ logger?.debug("chat-gpt:createSpeech:error", { error });
319
+ throw error;
320
+ }
321
+ };
322
+
213
323
  // src/adapter.ts
214
324
  var createAdapter = (config, logger) => {
215
325
  const client = createChatGptClient(config);
216
326
  const context = { client, logger, defaults: config.defaults };
217
327
  return {
218
- createChatCompletion: createChatCompletion(context)
328
+ createChatCompletion: createChatCompletion(context),
329
+ createImage: createImage(context),
330
+ createSpeech: createSpeech(context)
219
331
  };
220
332
  };
221
333
 
222
334
  exports.CHAT_GPT_MODELS = CHAT_GPT_MODELS;
223
335
  exports.CHAT_GPT_PRICING = CHAT_GPT_PRICING;
336
+ exports.IMAGE_PRICING = IMAGE_PRICING;
337
+ exports.SPEECH_PRICING = SPEECH_PRICING;
338
+ exports.calculateImagePrice = calculateImagePrice;
224
339
  exports.calculatePrice = calculatePrice;
340
+ exports.calculateSpeechPrice = calculateSpeechPrice;
225
341
  exports.createAdapter = createAdapter;
226
342
  exports.createChatCompletion = createChatCompletion;
227
343
  exports.createChatGptClient = createChatGptClient;
344
+ exports.createImage = createImage;
345
+ exports.createSpeech = createSpeech;
228
346
  exports.isStructuredOutputSupported = isStructuredOutputSupported;
229
347
  //# sourceMappingURL=index.js.map
230
348
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/models.ts","../src/pricing.ts","../src/operations/create-chat-completion.ts","../src/adapter.ts"],"names":["OpenAI","zodTextFormat"],"mappings":"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","file":"index.js","sourcesContent":["import OpenAI from 'openai';\nimport { ChatGptConfig } from './types';\n\nexport const createChatGptClient = (config: ChatGptConfig): OpenAI => {\n return new OpenAI({\n apiKey: config.apiKey,\n organization: config.organization,\n project: config.project,\n });\n};\n","export const CHAT_GPT_MODELS = {\n // GPT-5\n GPT_5_2: 'gpt-5.2',\n GPT_5_1: 'gpt-5.1',\n GPT_5: 'gpt-5',\n GPT_5_MINI: 'gpt-5-mini',\n GPT_5_NANO: 'gpt-5-nano',\n GPT_5_2_PRO: 'gpt-5.2-pro',\n GPT_5_PRO: 'gpt-5-pro',\n GPT_5_2_CHAT_LATEST: 'gpt-5.2-chat-latest',\n GPT_5_1_CHAT_LATEST: 'gpt-5.1-chat-latest',\n GPT_5_CHAT_LATEST: 'gpt-5-chat-latest',\n GPT_5_1_CODEX_MAX: 'gpt-5.1-codex-max',\n GPT_5_1_CODEX: 'gpt-5.1-codex',\n GPT_5_CODEX: 'gpt-5-codex',\n GPT_5_1_CODEX_MINI: 'gpt-5.1-codex-mini',\n GPT_5_SEARCH_API: 'gpt-5-search-api',\n\n // GPT-4.1\n GPT_4_1: 'gpt-4.1',\n GPT_4_1_MINI: 'gpt-4.1-mini',\n GPT_4_1_NANO: 'gpt-4.1-nano',\n\n // GPT-4o\n GPT_4o: 'gpt-4o',\n GPT_4o_2024_08_06: 'gpt-4o-2024-08-06',\n GPT_4o_2024_05_13: 'gpt-4o-2024-05-13',\n GPT_4o_MINI: 'gpt-4o-mini',\n GPT_4o_MINI_2024_07_18: 'gpt-4o-mini-2024-07-18',\n GPT_4o_SEARCH_PREVIEW: 'gpt-4o-search-preview',\n GPT_4o_MINI_SEARCH_PREVIEW: 'gpt-4o-mini-search-preview',\n\n // Reasoning Models (o-series)\n O1: 'o1',\n O1_PRO: 'o1-pro',\n O1_MINI: 'o1-mini',\n O3: 'o3',\n O3_PRO: 'o3-pro',\n O3_MINI: 'o3-mini',\n O3_DEEP_RESEARCH: 'o3-deep-research',\n O4_MINI: 'o4-mini',\n O4_MINI_DEEP_RESEARCH: 'o4-mini-deep-research',\n\n // Realtime & Audio\n GPT_REALTIME: 'gpt-realtime',\n GPT_REALTIME_MINI: 'gpt-realtime-mini',\n GPT_4o_REALTIME_PREVIEW: 'gpt-4o-realtime-preview',\n GPT_4o_MINI_REALTIME_PREVIEW: 'gpt-4o-mini-realtime-preview',\n GPT_AUDIO: 'gpt-audio',\n GPT_AUDIO_MINI: 'gpt-audio-mini',\n GPT_4o_AUDIO_PREVIEW: 'gpt-4o-audio-preview',\n GPT_4o_MINI_AUDIO_PREVIEW: 'gpt-4o-mini-audio-preview',\n\n // Legacy / GPT-4 & 3.5\n GPT_4_TURBO: 'gpt-4-turbo',\n GPT_4: 'gpt-4',\n GPT_3_5_TURBO: 'gpt-3.5-turbo',\n GPT_3_5_TURBO_INSTRUCT: 'gpt-3.5-turbo-instruct',\n\n // Specialized Preview\n COMPUTER_USE_PREVIEW: 'computer-use-preview',\n} as const;\n\nexport type ChatGptModel = (typeof CHAT_GPT_MODELS)[keyof typeof CHAT_GPT_MODELS];\n\nexport const isStructuredOutputSupported = (model: string): boolean => {\n // Per OpenAI docs and pricing tiers:\n // GPT-4o, GPT-4o-mini, GPT-4o-2024-08-06 and later support it.\n // Also GPT-5 and GPT-4.1 series likely support it as next-gen models.\n\n if (model.startsWith('gpt-4o-mini')) return true;\n if (model.startsWith('gpt-4o-2024-08-06')) return true;\n if (model === 'gpt-4o') return true;\n\n if (model.startsWith('gpt-5')) return true;\n if (model.startsWith('gpt-4.1')) return true;\n\n // o1 and o3 series support structured outputs in recent versions\n if (model.startsWith('o1')) return true;\n if (model.startsWith('o3')) return true;\n if (model.startsWith('o4')) return true;\n\n return false;\n};\n","import { PriceInfo } from './types';\n\nexport interface ModelPricing {\n input: number; // cost per 1M tokens\n output: number; // cost per 1M tokens\n cachedInput?: number; // cost per 1M tokens\n}\n\nexport const CHAT_GPT_PRICING: Record<string, ModelPricing> = {\n // GPT-5 (Standard)\n 'gpt-5.2': { input: 1.75, cachedInput: 0.175, output: 14.0 },\n 'gpt-5.1': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5-mini': { input: 0.25, cachedInput: 0.025, output: 2.0 },\n 'gpt-5-nano': { input: 0.05, cachedInput: 0.005, output: 0.4 },\n 'gpt-5.2-pro': { input: 21.0, output: 168.0 },\n 'gpt-5-pro': { input: 15.0, output: 120.0 },\n 'gpt-5.2-chat-latest': { input: 1.75, cachedInput: 0.175, output: 14.0 },\n 'gpt-5.1-chat-latest': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5-chat-latest': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5.1-codex-max': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5.1-codex': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5-codex': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5.1-codex-mini': { input: 0.25, cachedInput: 0.025, output: 2.0 },\n 'gpt-5-search-api': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n\n // GPT-4.1\n 'gpt-4.1': { input: 2.0, cachedInput: 0.5, output: 8.0 },\n 'gpt-4.1-mini': { input: 0.4, cachedInput: 0.1, output: 1.6 },\n 'gpt-4.1-nano': { input: 0.1, cachedInput: 0.025, output: 0.4 },\n\n // GPT-4o\n 'gpt-4o': { input: 2.5, cachedInput: 1.25, output: 10.0 },\n 'gpt-4o-2024-05-13': { input: 5.0, output: 15.0 },\n 'gpt-4o-2024-08-06': { input: 2.5, cachedInput: 1.25, output: 10.0 },\n 'gpt-4o-mini': { input: 0.15, cachedInput: 0.075, output: 0.6 },\n 'gpt-4o-mini-2024-07-18': { input: 0.15, cachedInput: 0.075, output: 0.6 },\n 'gpt-4o-mini-search-preview': { input: 0.15, output: 0.6 },\n 'gpt-4o-search-preview': { input: 2.5, output: 10.0 },\n\n // Reasoning Models (o-series)\n o1: { input: 15.0, cachedInput: 7.5, output: 60.0 },\n 'o1-pro': { input: 150.0, output: 600.0 },\n 'o1-mini': { input: 1.1, cachedInput: 0.55, output: 4.4 },\n o3: { input: 2.0, cachedInput: 0.5, output: 8.0 },\n 'o3-pro': { input: 20.0, output: 80.0 },\n 'o3-mini': { input: 1.1, cachedInput: 0.55, output: 4.4 },\n 'o3-deep-research': { input: 10.0, cachedInput: 2.5, output: 40.0 },\n 'o4-mini': { input: 1.1, cachedInput: 0.275, output: 4.4 },\n 'o4-mini-deep-research': { input: 2.0, cachedInput: 0.5, output: 8.0 },\n\n // Realtime & Audio\n 'gpt-realtime': { input: 4.0, cachedInput: 0.4, output: 16.0 },\n 'gpt-realtime-mini': { input: 0.6, cachedInput: 0.06, output: 2.4 },\n 'gpt-4o-realtime-preview': { input: 5.0, cachedInput: 2.5, output: 20.0 },\n 'gpt-4o-mini-realtime-preview': { input: 0.6, cachedInput: 0.3, output: 2.4 },\n 'gpt-audio': { input: 2.5, output: 10.0 },\n 'gpt-audio-mini': { input: 0.6, output: 2.4 },\n 'gpt-4o-audio-preview': { input: 2.5, output: 10.0 },\n 'gpt-4o-mini-audio-preview': { input: 0.15, output: 0.6 },\n\n // Legacy / GPT-4 & 3.5\n 'gpt-4-turbo': { input: 10.0, output: 30.0 },\n 'gpt-4-turbo-2024-04-09': { input: 10.0, output: 30.0 },\n 'gpt-4': { input: 30.0, output: 60.0 },\n 'gpt-3.5-turbo': { input: 0.5, output: 1.5 },\n 'gpt-3.5-turbo-instruct': { input: 1.5, output: 2.0 },\n\n // Specialized Preview\n 'computer-use-preview': { input: 3.0, output: 12.0 },\n};\n\nexport const calculatePrice = (\n model: string,\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n input_tokens?: number;\n output_tokens?: number;\n prompt_tokens_details?: { cached_tokens?: number };\n input_tokens_details?: { cached_tokens?: number };\n },\n): PriceInfo | undefined => {\n if (!usage) return undefined;\n\n const pricing = CHAT_GPT_PRICING[model];\n if (!pricing) return undefined;\n\n const inputTokens = usage.input_tokens ?? usage.prompt_tokens ?? 0;\n const outputTokens = usage.output_tokens ?? usage.completion_tokens ?? 0;\n const cachedTokens =\n usage.input_tokens_details?.cached_tokens ??\n usage.prompt_tokens_details?.cached_tokens ??\n 0;\n\n const regularInputTokens = inputTokens - cachedTokens;\n\n const inputCost =\n (regularInputTokens / 1_000_000) * pricing.input +\n (cachedTokens / 1_000_000) * (pricing.cachedInput ?? pricing.input);\n\n const outputCost = (outputTokens / 1_000_000) * pricing.output;\n\n return {\n total: Number((inputCost + outputCost).toFixed(6)),\n inputCost: Number(inputCost.toFixed(6)),\n outputCost: Number(outputCost.toFixed(6)),\n currency: 'USD',\n };\n};\n","import { zodTextFormat } from 'openai/helpers/zod';\nimport { ChatGptContext, CreateChatCompletionInput, CreateChatCompletionOutput } from '../types';\nimport { isStructuredOutputSupported } from '../models';\nimport { calculatePrice } from '../pricing';\n\nexport const createChatCompletion =\n (ctx: ChatGptContext) =>\n async (input: CreateChatCompletionInput): Promise<CreateChatCompletionOutput> => {\n const { client, logger, defaults } = ctx;\n\n const mergedInput = {\n ...defaults,\n ...input,\n };\n\n if (!mergedInput.model) {\n throw new Error('chat-gpt:createChatCompletion: model is required');\n }\n\n const { schema, schemaName, messages, ...rest } = mergedInput;\n\n logger?.debug('chat-gpt:createChatCompletion:start', { data: mergedInput });\n\n try {\n let response: any;\n if (schema) {\n if (!isStructuredOutputSupported(mergedInput.model)) {\n throw new Error(\n `chat-gpt:createChatCompletion: model ${mergedInput.model} does not support Structured Outputs. ` +\n 'See https://platform.openai.com/docs/guides/structured-outputs#supported-models',\n );\n }\n\n response = await (client.responses as any).parse({\n ...rest,\n input: messages,\n text: {\n format: zodTextFormat(schema, schemaName || 'output'),\n },\n });\n\n response = {\n ...response,\n parsed: response.output_parsed,\n };\n } else {\n // Fallback to regular chat completion for non-zod calls\n response = await client.chat.completions.create({\n ...mergedInput,\n } as any);\n }\n\n const price = calculatePrice(mergedInput.model, response.usage);\n\n const output = {\n ...response,\n price,\n } as CreateChatCompletionOutput;\n\n logger?.debug('chat-gpt:createChatCompletion:success', { data: output });\n\n return output;\n } catch (error) {\n logger?.debug('chat-gpt:createChatCompletion:error', { error });\n throw error;\n }\n };\n","import OpenAI from 'openai';\nimport { ChatGptConfig, ChatGptContext, Logger } from './types';\nimport { createChatGptClient } from './client';\nimport { createChatCompletion } from './operations/create-chat-completion';\n\nexport interface ChatGptAdapter {\n createChatCompletion: ReturnType<typeof createChatCompletion>;\n}\n\nexport const createAdapter = (config: ChatGptConfig, logger?: Logger): ChatGptAdapter => {\n const client = createChatGptClient(config);\n const context: ChatGptContext = { client, logger, defaults: config.defaults };\n\n return {\n createChatCompletion: createChatCompletion(context),\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/models.ts","../src/pricing.ts","../src/operations/create-chat-completion.ts","../src/operations/create-image.ts","../src/operations/create-speech.ts","../src/adapter.ts"],"names":["OpenAI","zodTextFormat"],"mappings":"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","file":"index.js","sourcesContent":["import OpenAI from 'openai';\nimport { ChatGptConfig } from './types';\n\nexport const createChatGptClient = (config: ChatGptConfig): OpenAI => {\n return new OpenAI({\n apiKey: config.apiKey,\n organization: config.organization,\n project: config.project,\n });\n};\n","export const CHAT_GPT_MODELS = {\n // GPT-5\n GPT_5_2: 'gpt-5.2',\n GPT_5_1: 'gpt-5.1',\n GPT_5: 'gpt-5',\n GPT_5_MINI: 'gpt-5-mini',\n GPT_5_NANO: 'gpt-5-nano',\n GPT_5_2_PRO: 'gpt-5.2-pro',\n GPT_5_PRO: 'gpt-5-pro',\n GPT_5_2_CHAT_LATEST: 'gpt-5.2-chat-latest',\n GPT_5_1_CHAT_LATEST: 'gpt-5.1-chat-latest',\n GPT_5_CHAT_LATEST: 'gpt-5-chat-latest',\n GPT_5_1_CODEX_MAX: 'gpt-5.1-codex-max',\n GPT_5_1_CODEX: 'gpt-5.1-codex',\n GPT_5_CODEX: 'gpt-5-codex',\n GPT_5_1_CODEX_MINI: 'gpt-5.1-codex-mini',\n GPT_5_SEARCH_API: 'gpt-5-search-api',\n\n // GPT-4.1\n GPT_4_1: 'gpt-4.1',\n GPT_4_1_MINI: 'gpt-4.1-mini',\n GPT_4_1_NANO: 'gpt-4.1-nano',\n\n // GPT-4o\n GPT_4o: 'gpt-4o',\n GPT_4o_2024_08_06: 'gpt-4o-2024-08-06',\n GPT_4o_2024_05_13: 'gpt-4o-2024-05-13',\n GPT_4o_MINI: 'gpt-4o-mini',\n GPT_4o_MINI_2024_07_18: 'gpt-4o-mini-2024-07-18',\n GPT_4o_SEARCH_PREVIEW: 'gpt-4o-search-preview',\n GPT_4o_MINI_SEARCH_PREVIEW: 'gpt-4o-mini-search-preview',\n\n // Reasoning Models (o-series)\n O1: 'o1',\n O1_PRO: 'o1-pro',\n O1_MINI: 'o1-mini',\n O3: 'o3',\n O3_PRO: 'o3-pro',\n O3_MINI: 'o3-mini',\n O3_DEEP_RESEARCH: 'o3-deep-research',\n O4_MINI: 'o4-mini',\n O4_MINI_DEEP_RESEARCH: 'o4-mini-deep-research',\n\n // Realtime & Audio\n GPT_REALTIME: 'gpt-realtime',\n GPT_REALTIME_MINI: 'gpt-realtime-mini',\n GPT_4o_REALTIME_PREVIEW: 'gpt-4o-realtime-preview',\n GPT_4o_MINI_REALTIME_PREVIEW: 'gpt-4o-mini-realtime-preview',\n GPT_AUDIO: 'gpt-audio',\n GPT_AUDIO_MINI: 'gpt-audio-mini',\n GPT_4o_AUDIO_PREVIEW: 'gpt-4o-audio-preview',\n GPT_4o_MINI_AUDIO_PREVIEW: 'gpt-4o-mini-audio-preview',\n\n // Legacy / GPT-4 & 3.5\n GPT_4_TURBO: 'gpt-4-turbo',\n GPT_4: 'gpt-4',\n GPT_3_5_TURBO: 'gpt-3.5-turbo',\n GPT_3_5_TURBO_INSTRUCT: 'gpt-3.5-turbo-instruct',\n\n // Specialized Preview\n COMPUTER_USE_PREVIEW: 'computer-use-preview',\n\n // Image Generation Models\n DALL_E_3: 'dall-e-3',\n DALL_E_2: 'dall-e-2',\n} as const;\n\nexport type ChatGptModel = (typeof CHAT_GPT_MODELS)[keyof typeof CHAT_GPT_MODELS];\n\nexport const isStructuredOutputSupported = (model: string): boolean => {\n // Per OpenAI docs and pricing tiers:\n // GPT-4o, GPT-4o-mini, GPT-4o-2024-08-06 and later support it.\n // Also GPT-5 and GPT-4.1 series likely support it as next-gen models.\n\n if (model.startsWith('gpt-4o-mini')) return true;\n if (model.startsWith('gpt-4o-2024-08-06')) return true;\n if (model === 'gpt-4o') return true;\n\n if (model.startsWith('gpt-5')) return true;\n if (model.startsWith('gpt-4.1')) return true;\n\n // o1 and o3 series support structured outputs in recent versions\n if (model.startsWith('o1')) return true;\n if (model.startsWith('o3')) return true;\n if (model.startsWith('o4')) return true;\n\n return false;\n};\n","import { PriceInfo } from './types';\n\nexport interface ModelPricing {\n input: number; // cost per 1M tokens\n output: number; // cost per 1M tokens\n cachedInput?: number; // cost per 1M tokens\n}\n\nexport interface ImagePricing {\n standard: Record<string, number>;\n hd: Record<string, number>;\n}\n\nexport const CHAT_GPT_PRICING: Record<string, ModelPricing> = {\n // GPT-5 (Standard)\n 'gpt-5.2': { input: 1.75, cachedInput: 0.175, output: 14.0 },\n 'gpt-5.1': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5-mini': { input: 0.25, cachedInput: 0.025, output: 2.0 },\n 'gpt-5-nano': { input: 0.05, cachedInput: 0.005, output: 0.4 },\n 'gpt-5.2-pro': { input: 21.0, output: 168.0 },\n 'gpt-5-pro': { input: 15.0, output: 120.0 },\n 'gpt-5.2-chat-latest': { input: 1.75, cachedInput: 0.175, output: 14.0 },\n 'gpt-5.1-chat-latest': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5-chat-latest': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5.1-codex-max': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5.1-codex': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5-codex': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5.1-codex-mini': { input: 0.25, cachedInput: 0.025, output: 2.0 },\n 'gpt-5-search-api': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n\n // GPT-4.1\n 'gpt-4.1': { input: 2.0, cachedInput: 0.5, output: 8.0 },\n 'gpt-4.1-mini': { input: 0.4, cachedInput: 0.1, output: 1.6 },\n 'gpt-4.1-nano': { input: 0.1, cachedInput: 0.025, output: 0.4 },\n\n // GPT-4o\n 'gpt-4o': { input: 2.5, cachedInput: 1.25, output: 10.0 },\n 'gpt-4o-2024-05-13': { input: 5.0, output: 15.0 },\n 'gpt-4o-2024-08-06': { input: 2.5, cachedInput: 1.25, output: 10.0 },\n 'gpt-4o-mini': { input: 0.15, cachedInput: 0.075, output: 0.6 },\n 'gpt-4o-mini-2024-07-18': { input: 0.15, cachedInput: 0.075, output: 0.6 },\n 'gpt-4o-mini-search-preview': { input: 0.15, output: 0.6 },\n 'gpt-4o-search-preview': { input: 2.5, output: 10.0 },\n\n // Reasoning Models (o-series)\n o1: { input: 15.0, cachedInput: 7.5, output: 60.0 },\n 'o1-pro': { input: 150.0, output: 600.0 },\n 'o1-mini': { input: 1.1, cachedInput: 0.55, output: 4.4 },\n o3: { input: 2.0, cachedInput: 0.5, output: 8.0 },\n 'o3-pro': { input: 20.0, output: 80.0 },\n 'o3-mini': { input: 1.1, cachedInput: 0.55, output: 4.4 },\n 'o3-deep-research': { input: 10.0, cachedInput: 2.5, output: 40.0 },\n 'o4-mini': { input: 1.1, cachedInput: 0.275, output: 4.4 },\n 'o4-mini-deep-research': { input: 2.0, cachedInput: 0.5, output: 8.0 },\n\n // Realtime & Audio\n 'gpt-realtime': { input: 4.0, cachedInput: 0.4, output: 16.0 },\n 'gpt-realtime-mini': { input: 0.6, cachedInput: 0.06, output: 2.4 },\n 'gpt-4o-realtime-preview': { input: 5.0, cachedInput: 2.5, output: 20.0 },\n 'gpt-4o-mini-realtime-preview': { input: 0.6, cachedInput: 0.3, output: 2.4 },\n 'gpt-audio': { input: 2.5, output: 10.0 },\n 'gpt-audio-mini': { input: 0.6, output: 2.4 },\n 'gpt-4o-audio-preview': { input: 2.5, output: 10.0 },\n 'gpt-4o-mini-audio-preview': { input: 0.15, output: 0.6 },\n\n // Legacy / GPT-4 & 3.5\n 'gpt-4-turbo': { input: 10.0, output: 30.0 },\n 'gpt-4-turbo-2024-04-09': { input: 10.0, output: 30.0 },\n 'gpt-4': { input: 30.0, output: 60.0 },\n 'gpt-3.5-turbo': { input: 0.5, output: 1.5 },\n 'gpt-3.5-turbo-instruct': { input: 1.5, output: 2.0 },\n\n // Specialized Preview\n 'computer-use-preview': { input: 3.0, output: 12.0 },\n};\n\nexport const IMAGE_PRICING: Record<string, ImagePricing> = {\n 'dall-e-3': {\n standard: {\n '1024x1024': 0.04,\n '1024x1792': 0.08,\n '1792x1024': 0.08,\n },\n hd: {\n '1024x1024': 0.08,\n '1024x1792': 0.12,\n '1792x1024': 0.12,\n },\n },\n 'dall-e-2': {\n standard: {\n '1024x1024': 0.02,\n '512x512': 0.018,\n '256x256': 0.016,\n },\n hd: {}, // no hd for dall-e-2\n },\n};\n\nexport const SPEECH_PRICING: Record<string, number> = {\n tts: 15.0 / 1_000_000, // per character\n 'tts-hd': 30.0 / 1_000_000, // per character\n};\n\nexport const calculatePrice = (\n model: string,\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n input_tokens?: number;\n output_tokens?: number;\n prompt_tokens_details?: { cached_tokens?: number };\n input_tokens_details?: { cached_tokens?: number };\n },\n): PriceInfo | undefined => {\n if (!usage) return undefined;\n\n const pricing = CHAT_GPT_PRICING[model];\n if (!pricing) return undefined;\n\n const inputTokens = usage.input_tokens ?? usage.prompt_tokens ?? 0;\n const outputTokens = usage.output_tokens ?? usage.completion_tokens ?? 0;\n const cachedTokens =\n usage.input_tokens_details?.cached_tokens ??\n usage.prompt_tokens_details?.cached_tokens ??\n 0;\n\n const regularInputTokens = inputTokens - cachedTokens;\n\n const inputCost =\n (regularInputTokens / 1_000_000) * pricing.input +\n (cachedTokens / 1_000_000) * (pricing.cachedInput ?? pricing.input);\n\n const outputCost = (outputTokens / 1_000_000) * pricing.output;\n\n return {\n total: Number((inputCost + outputCost).toFixed(6)),\n inputCost: Number(inputCost.toFixed(6)),\n outputCost: Number(outputCost.toFixed(6)),\n currency: 'USD',\n };\n};\n\nexport const calculateImagePrice = (\n model: string,\n size: string = '1024x1024',\n quality: string = 'standard',\n n: number = 1,\n): PriceInfo | undefined => {\n const pricing = IMAGE_PRICING[model];\n if (!pricing) return undefined;\n\n const unitPrice =\n quality === 'hd'\n ? pricing.hd[size as keyof typeof pricing.hd]\n : pricing.standard[size as keyof typeof pricing.standard];\n\n if (unitPrice === undefined) return undefined;\n\n const total = unitPrice * n;\n\n return {\n total: Number(total.toFixed(6)),\n inputCost: 0,\n outputCost: total,\n currency: 'USD',\n };\n};\n\nexport const calculateSpeechPrice = (model: string, inputLength: number): PriceInfo | undefined => {\n // Model in API is 'tts-1' or 'tts-1-hd'\n const priceKey = model.includes('hd') ? 'tts-hd' : 'tts';\n const rate = SPEECH_PRICING[priceKey];\n\n if (!rate) return undefined;\n\n const total = inputLength * rate;\n\n return {\n total: Number(total.toFixed(6)),\n inputCost: 0,\n outputCost: total,\n currency: 'USD',\n };\n};\n","import { zodTextFormat } from 'openai/helpers/zod';\nimport { ChatGptContext, CreateChatCompletionInput, CreateChatCompletionOutput } from '../types';\nimport { isStructuredOutputSupported } from '../models';\nimport { calculatePrice } from '../pricing';\n\nexport const createChatCompletion =\n (ctx: ChatGptContext) =>\n async (input: CreateChatCompletionInput): Promise<CreateChatCompletionOutput> => {\n const { client, logger, defaults } = ctx;\n\n const mergedInput = {\n ...defaults,\n ...input,\n };\n\n if (!mergedInput.model) {\n throw new Error('chat-gpt:createChatCompletion: model is required');\n }\n\n const { schema, schemaName, messages, ...rest } = mergedInput;\n\n logger?.debug('chat-gpt:createChatCompletion:start', { data: mergedInput });\n\n try {\n let response: any;\n if (schema) {\n if (!isStructuredOutputSupported(mergedInput.model)) {\n throw new Error(\n `chat-gpt:createChatCompletion: model ${mergedInput.model} does not support Structured Outputs. ` +\n 'See https://platform.openai.com/docs/guides/structured-outputs#supported-models',\n );\n }\n\n response = await (client.responses as any).parse({\n ...rest,\n input: messages,\n text: {\n format: zodTextFormat(schema, schemaName || 'output'),\n },\n });\n\n response = {\n ...response,\n parsed: response.output_parsed,\n };\n } else {\n // Fallback to regular chat completion for non-zod calls\n response = await client.chat.completions.create({\n ...mergedInput,\n } as any);\n }\n\n const price = calculatePrice(mergedInput.model, response.usage);\n\n const output = {\n ...response,\n price,\n input,\n } as CreateChatCompletionOutput;\n\n logger?.debug('chat-gpt:createChatCompletion:success', { data: output });\n\n return output;\n } catch (error) {\n logger?.debug('chat-gpt:createChatCompletion:error', { error });\n throw error;\n }\n };\n","import { ChatGptContext, CreateImageInput, CreateImageOutput } from '../types';\nimport { calculateImagePrice } from '../pricing';\n\nexport const createImage =\n (ctx: ChatGptContext) =>\n async (input: CreateImageInput): Promise<CreateImageOutput> => {\n const { client, logger } = ctx;\n\n const model = input.model || 'dall-e-3';\n const mergedInput = {\n ...input,\n model,\n };\n\n logger?.debug('chat-gpt:createImage:start', { data: mergedInput });\n\n try {\n const response = await client.images.generate(mergedInput as any);\n\n const price = calculateImagePrice(model, input.size, input.quality, input.n);\n\n const output: CreateImageOutput = {\n created: response.created,\n data: response.data as any,\n price,\n input,\n };\n\n logger?.debug('chat-gpt:createImage:success', { data: output });\n\n return output;\n } catch (error) {\n logger?.debug('chat-gpt:createImage:error', { error });\n throw error;\n }\n };\n","import { ChatGptContext, CreateSpeechInput, CreateSpeechOutput } from '../types';\nimport { calculateSpeechPrice } from '../pricing';\n\nexport const createSpeech =\n (ctx: ChatGptContext) =>\n async (input: CreateSpeechInput): Promise<CreateSpeechOutput> => {\n const { client, logger } = ctx;\n\n const model = input.model || 'tts-1';\n const mergedInput = {\n ...input,\n model,\n };\n\n logger?.debug('chat-gpt:createSpeech:start', { data: mergedInput });\n\n try {\n const response = await client.audio.speech.create(mergedInput as any);\n const buffer = Buffer.from(await response.arrayBuffer());\n\n const price = calculateSpeechPrice(model, input.input.length);\n\n const output: CreateSpeechOutput = {\n data: buffer,\n price,\n input,\n };\n\n logger?.debug('chat-gpt:createSpeech:success', { data: { price } });\n\n return output;\n } catch (error) {\n logger?.debug('chat-gpt:createSpeech:error', { error });\n throw error;\n }\n };\n","import OpenAI from 'openai';\nimport { ChatGptConfig, ChatGptContext, Logger } from './types';\nimport { createChatGptClient } from './client';\nimport { createChatCompletion } from './operations/create-chat-completion';\nimport { createImage } from './operations/create-image';\nimport { createSpeech } from './operations/create-speech';\n\nexport interface ChatGptAdapter {\n createChatCompletion: ReturnType<typeof createChatCompletion>;\n createImage: ReturnType<typeof createImage>;\n createSpeech: ReturnType<typeof createSpeech>;\n}\n\nexport const createAdapter = (config: ChatGptConfig, logger?: Logger): ChatGptAdapter => {\n const client = createChatGptClient(config);\n const context: ChatGptContext = { client, logger, defaults: config.defaults };\n\n return {\n createChatCompletion: createChatCompletion(context),\n createImage: createImage(context),\n createSpeech: createSpeech(context),\n };\n};\n"]}
package/dist/index.mjs CHANGED
@@ -65,7 +65,10 @@ var CHAT_GPT_MODELS = {
65
65
  GPT_3_5_TURBO: "gpt-3.5-turbo",
66
66
  GPT_3_5_TURBO_INSTRUCT: "gpt-3.5-turbo-instruct",
67
67
  // Specialized Preview
68
- COMPUTER_USE_PREVIEW: "computer-use-preview"
68
+ COMPUTER_USE_PREVIEW: "computer-use-preview",
69
+ // Image Generation Models
70
+ DALL_E_3: "dall-e-3",
71
+ DALL_E_2: "dall-e-2"
69
72
  };
70
73
  var isStructuredOutputSupported = (model) => {
71
74
  if (model.startsWith("gpt-4o-mini")) return true;
@@ -137,6 +140,35 @@ var CHAT_GPT_PRICING = {
137
140
  // Specialized Preview
138
141
  "computer-use-preview": { input: 3, output: 12 }
139
142
  };
143
+ var IMAGE_PRICING = {
144
+ "dall-e-3": {
145
+ standard: {
146
+ "1024x1024": 0.04,
147
+ "1024x1792": 0.08,
148
+ "1792x1024": 0.08
149
+ },
150
+ hd: {
151
+ "1024x1024": 0.08,
152
+ "1024x1792": 0.12,
153
+ "1792x1024": 0.12
154
+ }
155
+ },
156
+ "dall-e-2": {
157
+ standard: {
158
+ "1024x1024": 0.02,
159
+ "512x512": 0.018,
160
+ "256x256": 0.016
161
+ },
162
+ hd: {}
163
+ // no hd for dall-e-2
164
+ }
165
+ };
166
+ var SPEECH_PRICING = {
167
+ tts: 15 / 1e6,
168
+ // per character
169
+ "tts-hd": 30 / 1e6
170
+ // per character
171
+ };
140
172
  var calculatePrice = (model, usage) => {
141
173
  if (!usage) return void 0;
142
174
  const pricing = CHAT_GPT_PRICING[model];
@@ -154,6 +186,31 @@ var calculatePrice = (model, usage) => {
154
186
  currency: "USD"
155
187
  };
156
188
  };
189
+ var calculateImagePrice = (model, size = "1024x1024", quality = "standard", n = 1) => {
190
+ const pricing = IMAGE_PRICING[model];
191
+ if (!pricing) return void 0;
192
+ const unitPrice = quality === "hd" ? pricing.hd[size] : pricing.standard[size];
193
+ if (unitPrice === void 0) return void 0;
194
+ const total = unitPrice * n;
195
+ return {
196
+ total: Number(total.toFixed(6)),
197
+ inputCost: 0,
198
+ outputCost: total,
199
+ currency: "USD"
200
+ };
201
+ };
202
+ var calculateSpeechPrice = (model, inputLength) => {
203
+ const priceKey = model.includes("hd") ? "tts-hd" : "tts";
204
+ const rate = SPEECH_PRICING[priceKey];
205
+ if (!rate) return void 0;
206
+ const total = inputLength * rate;
207
+ return {
208
+ total: Number(total.toFixed(6)),
209
+ inputCost: 0,
210
+ outputCost: total,
211
+ currency: "USD"
212
+ };
213
+ };
157
214
 
158
215
  // src/operations/create-chat-completion.ts
159
216
  var createChatCompletion = (ctx) => async (input) => {
@@ -194,7 +251,8 @@ var createChatCompletion = (ctx) => async (input) => {
194
251
  const price = calculatePrice(mergedInput.model, response.usage);
195
252
  const output = {
196
253
  ...response,
197
- price
254
+ price,
255
+ input
198
256
  };
199
257
  logger?.debug("chat-gpt:createChatCompletion:success", { data: output });
200
258
  return output;
@@ -204,15 +262,69 @@ var createChatCompletion = (ctx) => async (input) => {
204
262
  }
205
263
  };
206
264
 
265
+ // src/operations/create-image.ts
266
+ var createImage = (ctx) => async (input) => {
267
+ const { client, logger } = ctx;
268
+ const model = input.model || "dall-e-3";
269
+ const mergedInput = {
270
+ ...input,
271
+ model
272
+ };
273
+ logger?.debug("chat-gpt:createImage:start", { data: mergedInput });
274
+ try {
275
+ const response = await client.images.generate(mergedInput);
276
+ const price = calculateImagePrice(model, input.size, input.quality, input.n);
277
+ const output = {
278
+ created: response.created,
279
+ data: response.data,
280
+ price,
281
+ input
282
+ };
283
+ logger?.debug("chat-gpt:createImage:success", { data: output });
284
+ return output;
285
+ } catch (error) {
286
+ logger?.debug("chat-gpt:createImage:error", { error });
287
+ throw error;
288
+ }
289
+ };
290
+
291
+ // src/operations/create-speech.ts
292
+ var createSpeech = (ctx) => async (input) => {
293
+ const { client, logger } = ctx;
294
+ const model = input.model || "tts-1";
295
+ const mergedInput = {
296
+ ...input,
297
+ model
298
+ };
299
+ logger?.debug("chat-gpt:createSpeech:start", { data: mergedInput });
300
+ try {
301
+ const response = await client.audio.speech.create(mergedInput);
302
+ const buffer = Buffer.from(await response.arrayBuffer());
303
+ const price = calculateSpeechPrice(model, input.input.length);
304
+ const output = {
305
+ data: buffer,
306
+ price,
307
+ input
308
+ };
309
+ logger?.debug("chat-gpt:createSpeech:success", { data: { price } });
310
+ return output;
311
+ } catch (error) {
312
+ logger?.debug("chat-gpt:createSpeech:error", { error });
313
+ throw error;
314
+ }
315
+ };
316
+
207
317
  // src/adapter.ts
208
318
  var createAdapter = (config, logger) => {
209
319
  const client = createChatGptClient(config);
210
320
  const context = { client, logger, defaults: config.defaults };
211
321
  return {
212
- createChatCompletion: createChatCompletion(context)
322
+ createChatCompletion: createChatCompletion(context),
323
+ createImage: createImage(context),
324
+ createSpeech: createSpeech(context)
213
325
  };
214
326
  };
215
327
 
216
- export { CHAT_GPT_MODELS, CHAT_GPT_PRICING, calculatePrice, createAdapter, createChatCompletion, createChatGptClient, isStructuredOutputSupported };
328
+ export { CHAT_GPT_MODELS, CHAT_GPT_PRICING, IMAGE_PRICING, SPEECH_PRICING, calculateImagePrice, calculatePrice, calculateSpeechPrice, createAdapter, createChatCompletion, createChatGptClient, createImage, createSpeech, isStructuredOutputSupported };
217
329
  //# sourceMappingURL=index.mjs.map
218
330
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/models.ts","../src/pricing.ts","../src/operations/create-chat-completion.ts","../src/adapter.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import OpenAI from 'openai';\nimport { ChatGptConfig } from './types';\n\nexport const createChatGptClient = (config: ChatGptConfig): OpenAI => {\n return new OpenAI({\n apiKey: config.apiKey,\n organization: config.organization,\n project: config.project,\n });\n};\n","export const CHAT_GPT_MODELS = {\n // GPT-5\n GPT_5_2: 'gpt-5.2',\n GPT_5_1: 'gpt-5.1',\n GPT_5: 'gpt-5',\n GPT_5_MINI: 'gpt-5-mini',\n GPT_5_NANO: 'gpt-5-nano',\n GPT_5_2_PRO: 'gpt-5.2-pro',\n GPT_5_PRO: 'gpt-5-pro',\n GPT_5_2_CHAT_LATEST: 'gpt-5.2-chat-latest',\n GPT_5_1_CHAT_LATEST: 'gpt-5.1-chat-latest',\n GPT_5_CHAT_LATEST: 'gpt-5-chat-latest',\n GPT_5_1_CODEX_MAX: 'gpt-5.1-codex-max',\n GPT_5_1_CODEX: 'gpt-5.1-codex',\n GPT_5_CODEX: 'gpt-5-codex',\n GPT_5_1_CODEX_MINI: 'gpt-5.1-codex-mini',\n GPT_5_SEARCH_API: 'gpt-5-search-api',\n\n // GPT-4.1\n GPT_4_1: 'gpt-4.1',\n GPT_4_1_MINI: 'gpt-4.1-mini',\n GPT_4_1_NANO: 'gpt-4.1-nano',\n\n // GPT-4o\n GPT_4o: 'gpt-4o',\n GPT_4o_2024_08_06: 'gpt-4o-2024-08-06',\n GPT_4o_2024_05_13: 'gpt-4o-2024-05-13',\n GPT_4o_MINI: 'gpt-4o-mini',\n GPT_4o_MINI_2024_07_18: 'gpt-4o-mini-2024-07-18',\n GPT_4o_SEARCH_PREVIEW: 'gpt-4o-search-preview',\n GPT_4o_MINI_SEARCH_PREVIEW: 'gpt-4o-mini-search-preview',\n\n // Reasoning Models (o-series)\n O1: 'o1',\n O1_PRO: 'o1-pro',\n O1_MINI: 'o1-mini',\n O3: 'o3',\n O3_PRO: 'o3-pro',\n O3_MINI: 'o3-mini',\n O3_DEEP_RESEARCH: 'o3-deep-research',\n O4_MINI: 'o4-mini',\n O4_MINI_DEEP_RESEARCH: 'o4-mini-deep-research',\n\n // Realtime & Audio\n GPT_REALTIME: 'gpt-realtime',\n GPT_REALTIME_MINI: 'gpt-realtime-mini',\n GPT_4o_REALTIME_PREVIEW: 'gpt-4o-realtime-preview',\n GPT_4o_MINI_REALTIME_PREVIEW: 'gpt-4o-mini-realtime-preview',\n GPT_AUDIO: 'gpt-audio',\n GPT_AUDIO_MINI: 'gpt-audio-mini',\n GPT_4o_AUDIO_PREVIEW: 'gpt-4o-audio-preview',\n GPT_4o_MINI_AUDIO_PREVIEW: 'gpt-4o-mini-audio-preview',\n\n // Legacy / GPT-4 & 3.5\n GPT_4_TURBO: 'gpt-4-turbo',\n GPT_4: 'gpt-4',\n GPT_3_5_TURBO: 'gpt-3.5-turbo',\n GPT_3_5_TURBO_INSTRUCT: 'gpt-3.5-turbo-instruct',\n\n // Specialized Preview\n COMPUTER_USE_PREVIEW: 'computer-use-preview',\n} as const;\n\nexport type ChatGptModel = (typeof CHAT_GPT_MODELS)[keyof typeof CHAT_GPT_MODELS];\n\nexport const isStructuredOutputSupported = (model: string): boolean => {\n // Per OpenAI docs and pricing tiers:\n // GPT-4o, GPT-4o-mini, GPT-4o-2024-08-06 and later support it.\n // Also GPT-5 and GPT-4.1 series likely support it as next-gen models.\n\n if (model.startsWith('gpt-4o-mini')) return true;\n if (model.startsWith('gpt-4o-2024-08-06')) return true;\n if (model === 'gpt-4o') return true;\n\n if (model.startsWith('gpt-5')) return true;\n if (model.startsWith('gpt-4.1')) return true;\n\n // o1 and o3 series support structured outputs in recent versions\n if (model.startsWith('o1')) return true;\n if (model.startsWith('o3')) return true;\n if (model.startsWith('o4')) return true;\n\n return false;\n};\n","import { PriceInfo } from './types';\n\nexport interface ModelPricing {\n input: number; // cost per 1M tokens\n output: number; // cost per 1M tokens\n cachedInput?: number; // cost per 1M tokens\n}\n\nexport const CHAT_GPT_PRICING: Record<string, ModelPricing> = {\n // GPT-5 (Standard)\n 'gpt-5.2': { input: 1.75, cachedInput: 0.175, output: 14.0 },\n 'gpt-5.1': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5-mini': { input: 0.25, cachedInput: 0.025, output: 2.0 },\n 'gpt-5-nano': { input: 0.05, cachedInput: 0.005, output: 0.4 },\n 'gpt-5.2-pro': { input: 21.0, output: 168.0 },\n 'gpt-5-pro': { input: 15.0, output: 120.0 },\n 'gpt-5.2-chat-latest': { input: 1.75, cachedInput: 0.175, output: 14.0 },\n 'gpt-5.1-chat-latest': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5-chat-latest': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5.1-codex-max': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5.1-codex': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5-codex': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5.1-codex-mini': { input: 0.25, cachedInput: 0.025, output: 2.0 },\n 'gpt-5-search-api': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n\n // GPT-4.1\n 'gpt-4.1': { input: 2.0, cachedInput: 0.5, output: 8.0 },\n 'gpt-4.1-mini': { input: 0.4, cachedInput: 0.1, output: 1.6 },\n 'gpt-4.1-nano': { input: 0.1, cachedInput: 0.025, output: 0.4 },\n\n // GPT-4o\n 'gpt-4o': { input: 2.5, cachedInput: 1.25, output: 10.0 },\n 'gpt-4o-2024-05-13': { input: 5.0, output: 15.0 },\n 'gpt-4o-2024-08-06': { input: 2.5, cachedInput: 1.25, output: 10.0 },\n 'gpt-4o-mini': { input: 0.15, cachedInput: 0.075, output: 0.6 },\n 'gpt-4o-mini-2024-07-18': { input: 0.15, cachedInput: 0.075, output: 0.6 },\n 'gpt-4o-mini-search-preview': { input: 0.15, output: 0.6 },\n 'gpt-4o-search-preview': { input: 2.5, output: 10.0 },\n\n // Reasoning Models (o-series)\n o1: { input: 15.0, cachedInput: 7.5, output: 60.0 },\n 'o1-pro': { input: 150.0, output: 600.0 },\n 'o1-mini': { input: 1.1, cachedInput: 0.55, output: 4.4 },\n o3: { input: 2.0, cachedInput: 0.5, output: 8.0 },\n 'o3-pro': { input: 20.0, output: 80.0 },\n 'o3-mini': { input: 1.1, cachedInput: 0.55, output: 4.4 },\n 'o3-deep-research': { input: 10.0, cachedInput: 2.5, output: 40.0 },\n 'o4-mini': { input: 1.1, cachedInput: 0.275, output: 4.4 },\n 'o4-mini-deep-research': { input: 2.0, cachedInput: 0.5, output: 8.0 },\n\n // Realtime & Audio\n 'gpt-realtime': { input: 4.0, cachedInput: 0.4, output: 16.0 },\n 'gpt-realtime-mini': { input: 0.6, cachedInput: 0.06, output: 2.4 },\n 'gpt-4o-realtime-preview': { input: 5.0, cachedInput: 2.5, output: 20.0 },\n 'gpt-4o-mini-realtime-preview': { input: 0.6, cachedInput: 0.3, output: 2.4 },\n 'gpt-audio': { input: 2.5, output: 10.0 },\n 'gpt-audio-mini': { input: 0.6, output: 2.4 },\n 'gpt-4o-audio-preview': { input: 2.5, output: 10.0 },\n 'gpt-4o-mini-audio-preview': { input: 0.15, output: 0.6 },\n\n // Legacy / GPT-4 & 3.5\n 'gpt-4-turbo': { input: 10.0, output: 30.0 },\n 'gpt-4-turbo-2024-04-09': { input: 10.0, output: 30.0 },\n 'gpt-4': { input: 30.0, output: 60.0 },\n 'gpt-3.5-turbo': { input: 0.5, output: 1.5 },\n 'gpt-3.5-turbo-instruct': { input: 1.5, output: 2.0 },\n\n // Specialized Preview\n 'computer-use-preview': { input: 3.0, output: 12.0 },\n};\n\nexport const calculatePrice = (\n model: string,\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n input_tokens?: number;\n output_tokens?: number;\n prompt_tokens_details?: { cached_tokens?: number };\n input_tokens_details?: { cached_tokens?: number };\n },\n): PriceInfo | undefined => {\n if (!usage) return undefined;\n\n const pricing = CHAT_GPT_PRICING[model];\n if (!pricing) return undefined;\n\n const inputTokens = usage.input_tokens ?? usage.prompt_tokens ?? 0;\n const outputTokens = usage.output_tokens ?? usage.completion_tokens ?? 0;\n const cachedTokens =\n usage.input_tokens_details?.cached_tokens ??\n usage.prompt_tokens_details?.cached_tokens ??\n 0;\n\n const regularInputTokens = inputTokens - cachedTokens;\n\n const inputCost =\n (regularInputTokens / 1_000_000) * pricing.input +\n (cachedTokens / 1_000_000) * (pricing.cachedInput ?? pricing.input);\n\n const outputCost = (outputTokens / 1_000_000) * pricing.output;\n\n return {\n total: Number((inputCost + outputCost).toFixed(6)),\n inputCost: Number(inputCost.toFixed(6)),\n outputCost: Number(outputCost.toFixed(6)),\n currency: 'USD',\n };\n};\n","import { zodTextFormat } from 'openai/helpers/zod';\nimport { ChatGptContext, CreateChatCompletionInput, CreateChatCompletionOutput } from '../types';\nimport { isStructuredOutputSupported } from '../models';\nimport { calculatePrice } from '../pricing';\n\nexport const createChatCompletion =\n (ctx: ChatGptContext) =>\n async (input: CreateChatCompletionInput): Promise<CreateChatCompletionOutput> => {\n const { client, logger, defaults } = ctx;\n\n const mergedInput = {\n ...defaults,\n ...input,\n };\n\n if (!mergedInput.model) {\n throw new Error('chat-gpt:createChatCompletion: model is required');\n }\n\n const { schema, schemaName, messages, ...rest } = mergedInput;\n\n logger?.debug('chat-gpt:createChatCompletion:start', { data: mergedInput });\n\n try {\n let response: any;\n if (schema) {\n if (!isStructuredOutputSupported(mergedInput.model)) {\n throw new Error(\n `chat-gpt:createChatCompletion: model ${mergedInput.model} does not support Structured Outputs. ` +\n 'See https://platform.openai.com/docs/guides/structured-outputs#supported-models',\n );\n }\n\n response = await (client.responses as any).parse({\n ...rest,\n input: messages,\n text: {\n format: zodTextFormat(schema, schemaName || 'output'),\n },\n });\n\n response = {\n ...response,\n parsed: response.output_parsed,\n };\n } else {\n // Fallback to regular chat completion for non-zod calls\n response = await client.chat.completions.create({\n ...mergedInput,\n } as any);\n }\n\n const price = calculatePrice(mergedInput.model, response.usage);\n\n const output = {\n ...response,\n price,\n } as CreateChatCompletionOutput;\n\n logger?.debug('chat-gpt:createChatCompletion:success', { data: output });\n\n return output;\n } catch (error) {\n logger?.debug('chat-gpt:createChatCompletion:error', { error });\n throw error;\n }\n };\n","import OpenAI from 'openai';\nimport { ChatGptConfig, ChatGptContext, Logger } from './types';\nimport { createChatGptClient } from './client';\nimport { createChatCompletion } from './operations/create-chat-completion';\n\nexport interface ChatGptAdapter {\n createChatCompletion: ReturnType<typeof createChatCompletion>;\n}\n\nexport const createAdapter = (config: ChatGptConfig, logger?: Logger): ChatGptAdapter => {\n const client = createChatGptClient(config);\n const context: ChatGptContext = { client, logger, defaults: config.defaults };\n\n return {\n createChatCompletion: createChatCompletion(context),\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/models.ts","../src/pricing.ts","../src/operations/create-chat-completion.ts","../src/operations/create-image.ts","../src/operations/create-speech.ts","../src/adapter.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import OpenAI from 'openai';\nimport { ChatGptConfig } from './types';\n\nexport const createChatGptClient = (config: ChatGptConfig): OpenAI => {\n return new OpenAI({\n apiKey: config.apiKey,\n organization: config.organization,\n project: config.project,\n });\n};\n","export const CHAT_GPT_MODELS = {\n // GPT-5\n GPT_5_2: 'gpt-5.2',\n GPT_5_1: 'gpt-5.1',\n GPT_5: 'gpt-5',\n GPT_5_MINI: 'gpt-5-mini',\n GPT_5_NANO: 'gpt-5-nano',\n GPT_5_2_PRO: 'gpt-5.2-pro',\n GPT_5_PRO: 'gpt-5-pro',\n GPT_5_2_CHAT_LATEST: 'gpt-5.2-chat-latest',\n GPT_5_1_CHAT_LATEST: 'gpt-5.1-chat-latest',\n GPT_5_CHAT_LATEST: 'gpt-5-chat-latest',\n GPT_5_1_CODEX_MAX: 'gpt-5.1-codex-max',\n GPT_5_1_CODEX: 'gpt-5.1-codex',\n GPT_5_CODEX: 'gpt-5-codex',\n GPT_5_1_CODEX_MINI: 'gpt-5.1-codex-mini',\n GPT_5_SEARCH_API: 'gpt-5-search-api',\n\n // GPT-4.1\n GPT_4_1: 'gpt-4.1',\n GPT_4_1_MINI: 'gpt-4.1-mini',\n GPT_4_1_NANO: 'gpt-4.1-nano',\n\n // GPT-4o\n GPT_4o: 'gpt-4o',\n GPT_4o_2024_08_06: 'gpt-4o-2024-08-06',\n GPT_4o_2024_05_13: 'gpt-4o-2024-05-13',\n GPT_4o_MINI: 'gpt-4o-mini',\n GPT_4o_MINI_2024_07_18: 'gpt-4o-mini-2024-07-18',\n GPT_4o_SEARCH_PREVIEW: 'gpt-4o-search-preview',\n GPT_4o_MINI_SEARCH_PREVIEW: 'gpt-4o-mini-search-preview',\n\n // Reasoning Models (o-series)\n O1: 'o1',\n O1_PRO: 'o1-pro',\n O1_MINI: 'o1-mini',\n O3: 'o3',\n O3_PRO: 'o3-pro',\n O3_MINI: 'o3-mini',\n O3_DEEP_RESEARCH: 'o3-deep-research',\n O4_MINI: 'o4-mini',\n O4_MINI_DEEP_RESEARCH: 'o4-mini-deep-research',\n\n // Realtime & Audio\n GPT_REALTIME: 'gpt-realtime',\n GPT_REALTIME_MINI: 'gpt-realtime-mini',\n GPT_4o_REALTIME_PREVIEW: 'gpt-4o-realtime-preview',\n GPT_4o_MINI_REALTIME_PREVIEW: 'gpt-4o-mini-realtime-preview',\n GPT_AUDIO: 'gpt-audio',\n GPT_AUDIO_MINI: 'gpt-audio-mini',\n GPT_4o_AUDIO_PREVIEW: 'gpt-4o-audio-preview',\n GPT_4o_MINI_AUDIO_PREVIEW: 'gpt-4o-mini-audio-preview',\n\n // Legacy / GPT-4 & 3.5\n GPT_4_TURBO: 'gpt-4-turbo',\n GPT_4: 'gpt-4',\n GPT_3_5_TURBO: 'gpt-3.5-turbo',\n GPT_3_5_TURBO_INSTRUCT: 'gpt-3.5-turbo-instruct',\n\n // Specialized Preview\n COMPUTER_USE_PREVIEW: 'computer-use-preview',\n\n // Image Generation Models\n DALL_E_3: 'dall-e-3',\n DALL_E_2: 'dall-e-2',\n} as const;\n\nexport type ChatGptModel = (typeof CHAT_GPT_MODELS)[keyof typeof CHAT_GPT_MODELS];\n\nexport const isStructuredOutputSupported = (model: string): boolean => {\n // Per OpenAI docs and pricing tiers:\n // GPT-4o, GPT-4o-mini, GPT-4o-2024-08-06 and later support it.\n // Also GPT-5 and GPT-4.1 series likely support it as next-gen models.\n\n if (model.startsWith('gpt-4o-mini')) return true;\n if (model.startsWith('gpt-4o-2024-08-06')) return true;\n if (model === 'gpt-4o') return true;\n\n if (model.startsWith('gpt-5')) return true;\n if (model.startsWith('gpt-4.1')) return true;\n\n // o1 and o3 series support structured outputs in recent versions\n if (model.startsWith('o1')) return true;\n if (model.startsWith('o3')) return true;\n if (model.startsWith('o4')) return true;\n\n return false;\n};\n","import { PriceInfo } from './types';\n\nexport interface ModelPricing {\n input: number; // cost per 1M tokens\n output: number; // cost per 1M tokens\n cachedInput?: number; // cost per 1M tokens\n}\n\nexport interface ImagePricing {\n standard: Record<string, number>;\n hd: Record<string, number>;\n}\n\nexport const CHAT_GPT_PRICING: Record<string, ModelPricing> = {\n // GPT-5 (Standard)\n 'gpt-5.2': { input: 1.75, cachedInput: 0.175, output: 14.0 },\n 'gpt-5.1': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5-mini': { input: 0.25, cachedInput: 0.025, output: 2.0 },\n 'gpt-5-nano': { input: 0.05, cachedInput: 0.005, output: 0.4 },\n 'gpt-5.2-pro': { input: 21.0, output: 168.0 },\n 'gpt-5-pro': { input: 15.0, output: 120.0 },\n 'gpt-5.2-chat-latest': { input: 1.75, cachedInput: 0.175, output: 14.0 },\n 'gpt-5.1-chat-latest': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5-chat-latest': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5.1-codex-max': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5.1-codex': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5-codex': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n 'gpt-5.1-codex-mini': { input: 0.25, cachedInput: 0.025, output: 2.0 },\n 'gpt-5-search-api': { input: 1.25, cachedInput: 0.125, output: 10.0 },\n\n // GPT-4.1\n 'gpt-4.1': { input: 2.0, cachedInput: 0.5, output: 8.0 },\n 'gpt-4.1-mini': { input: 0.4, cachedInput: 0.1, output: 1.6 },\n 'gpt-4.1-nano': { input: 0.1, cachedInput: 0.025, output: 0.4 },\n\n // GPT-4o\n 'gpt-4o': { input: 2.5, cachedInput: 1.25, output: 10.0 },\n 'gpt-4o-2024-05-13': { input: 5.0, output: 15.0 },\n 'gpt-4o-2024-08-06': { input: 2.5, cachedInput: 1.25, output: 10.0 },\n 'gpt-4o-mini': { input: 0.15, cachedInput: 0.075, output: 0.6 },\n 'gpt-4o-mini-2024-07-18': { input: 0.15, cachedInput: 0.075, output: 0.6 },\n 'gpt-4o-mini-search-preview': { input: 0.15, output: 0.6 },\n 'gpt-4o-search-preview': { input: 2.5, output: 10.0 },\n\n // Reasoning Models (o-series)\n o1: { input: 15.0, cachedInput: 7.5, output: 60.0 },\n 'o1-pro': { input: 150.0, output: 600.0 },\n 'o1-mini': { input: 1.1, cachedInput: 0.55, output: 4.4 },\n o3: { input: 2.0, cachedInput: 0.5, output: 8.0 },\n 'o3-pro': { input: 20.0, output: 80.0 },\n 'o3-mini': { input: 1.1, cachedInput: 0.55, output: 4.4 },\n 'o3-deep-research': { input: 10.0, cachedInput: 2.5, output: 40.0 },\n 'o4-mini': { input: 1.1, cachedInput: 0.275, output: 4.4 },\n 'o4-mini-deep-research': { input: 2.0, cachedInput: 0.5, output: 8.0 },\n\n // Realtime & Audio\n 'gpt-realtime': { input: 4.0, cachedInput: 0.4, output: 16.0 },\n 'gpt-realtime-mini': { input: 0.6, cachedInput: 0.06, output: 2.4 },\n 'gpt-4o-realtime-preview': { input: 5.0, cachedInput: 2.5, output: 20.0 },\n 'gpt-4o-mini-realtime-preview': { input: 0.6, cachedInput: 0.3, output: 2.4 },\n 'gpt-audio': { input: 2.5, output: 10.0 },\n 'gpt-audio-mini': { input: 0.6, output: 2.4 },\n 'gpt-4o-audio-preview': { input: 2.5, output: 10.0 },\n 'gpt-4o-mini-audio-preview': { input: 0.15, output: 0.6 },\n\n // Legacy / GPT-4 & 3.5\n 'gpt-4-turbo': { input: 10.0, output: 30.0 },\n 'gpt-4-turbo-2024-04-09': { input: 10.0, output: 30.0 },\n 'gpt-4': { input: 30.0, output: 60.0 },\n 'gpt-3.5-turbo': { input: 0.5, output: 1.5 },\n 'gpt-3.5-turbo-instruct': { input: 1.5, output: 2.0 },\n\n // Specialized Preview\n 'computer-use-preview': { input: 3.0, output: 12.0 },\n};\n\nexport const IMAGE_PRICING: Record<string, ImagePricing> = {\n 'dall-e-3': {\n standard: {\n '1024x1024': 0.04,\n '1024x1792': 0.08,\n '1792x1024': 0.08,\n },\n hd: {\n '1024x1024': 0.08,\n '1024x1792': 0.12,\n '1792x1024': 0.12,\n },\n },\n 'dall-e-2': {\n standard: {\n '1024x1024': 0.02,\n '512x512': 0.018,\n '256x256': 0.016,\n },\n hd: {}, // no hd for dall-e-2\n },\n};\n\nexport const SPEECH_PRICING: Record<string, number> = {\n tts: 15.0 / 1_000_000, // per character\n 'tts-hd': 30.0 / 1_000_000, // per character\n};\n\nexport const calculatePrice = (\n model: string,\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n input_tokens?: number;\n output_tokens?: number;\n prompt_tokens_details?: { cached_tokens?: number };\n input_tokens_details?: { cached_tokens?: number };\n },\n): PriceInfo | undefined => {\n if (!usage) return undefined;\n\n const pricing = CHAT_GPT_PRICING[model];\n if (!pricing) return undefined;\n\n const inputTokens = usage.input_tokens ?? usage.prompt_tokens ?? 0;\n const outputTokens = usage.output_tokens ?? usage.completion_tokens ?? 0;\n const cachedTokens =\n usage.input_tokens_details?.cached_tokens ??\n usage.prompt_tokens_details?.cached_tokens ??\n 0;\n\n const regularInputTokens = inputTokens - cachedTokens;\n\n const inputCost =\n (regularInputTokens / 1_000_000) * pricing.input +\n (cachedTokens / 1_000_000) * (pricing.cachedInput ?? pricing.input);\n\n const outputCost = (outputTokens / 1_000_000) * pricing.output;\n\n return {\n total: Number((inputCost + outputCost).toFixed(6)),\n inputCost: Number(inputCost.toFixed(6)),\n outputCost: Number(outputCost.toFixed(6)),\n currency: 'USD',\n };\n};\n\nexport const calculateImagePrice = (\n model: string,\n size: string = '1024x1024',\n quality: string = 'standard',\n n: number = 1,\n): PriceInfo | undefined => {\n const pricing = IMAGE_PRICING[model];\n if (!pricing) return undefined;\n\n const unitPrice =\n quality === 'hd'\n ? pricing.hd[size as keyof typeof pricing.hd]\n : pricing.standard[size as keyof typeof pricing.standard];\n\n if (unitPrice === undefined) return undefined;\n\n const total = unitPrice * n;\n\n return {\n total: Number(total.toFixed(6)),\n inputCost: 0,\n outputCost: total,\n currency: 'USD',\n };\n};\n\nexport const calculateSpeechPrice = (model: string, inputLength: number): PriceInfo | undefined => {\n // Model in API is 'tts-1' or 'tts-1-hd'\n const priceKey = model.includes('hd') ? 'tts-hd' : 'tts';\n const rate = SPEECH_PRICING[priceKey];\n\n if (!rate) return undefined;\n\n const total = inputLength * rate;\n\n return {\n total: Number(total.toFixed(6)),\n inputCost: 0,\n outputCost: total,\n currency: 'USD',\n };\n};\n","import { zodTextFormat } from 'openai/helpers/zod';\nimport { ChatGptContext, CreateChatCompletionInput, CreateChatCompletionOutput } from '../types';\nimport { isStructuredOutputSupported } from '../models';\nimport { calculatePrice } from '../pricing';\n\nexport const createChatCompletion =\n (ctx: ChatGptContext) =>\n async (input: CreateChatCompletionInput): Promise<CreateChatCompletionOutput> => {\n const { client, logger, defaults } = ctx;\n\n const mergedInput = {\n ...defaults,\n ...input,\n };\n\n if (!mergedInput.model) {\n throw new Error('chat-gpt:createChatCompletion: model is required');\n }\n\n const { schema, schemaName, messages, ...rest } = mergedInput;\n\n logger?.debug('chat-gpt:createChatCompletion:start', { data: mergedInput });\n\n try {\n let response: any;\n if (schema) {\n if (!isStructuredOutputSupported(mergedInput.model)) {\n throw new Error(\n `chat-gpt:createChatCompletion: model ${mergedInput.model} does not support Structured Outputs. ` +\n 'See https://platform.openai.com/docs/guides/structured-outputs#supported-models',\n );\n }\n\n response = await (client.responses as any).parse({\n ...rest,\n input: messages,\n text: {\n format: zodTextFormat(schema, schemaName || 'output'),\n },\n });\n\n response = {\n ...response,\n parsed: response.output_parsed,\n };\n } else {\n // Fallback to regular chat completion for non-zod calls\n response = await client.chat.completions.create({\n ...mergedInput,\n } as any);\n }\n\n const price = calculatePrice(mergedInput.model, response.usage);\n\n const output = {\n ...response,\n price,\n input,\n } as CreateChatCompletionOutput;\n\n logger?.debug('chat-gpt:createChatCompletion:success', { data: output });\n\n return output;\n } catch (error) {\n logger?.debug('chat-gpt:createChatCompletion:error', { error });\n throw error;\n }\n };\n","import { ChatGptContext, CreateImageInput, CreateImageOutput } from '../types';\nimport { calculateImagePrice } from '../pricing';\n\nexport const createImage =\n (ctx: ChatGptContext) =>\n async (input: CreateImageInput): Promise<CreateImageOutput> => {\n const { client, logger } = ctx;\n\n const model = input.model || 'dall-e-3';\n const mergedInput = {\n ...input,\n model,\n };\n\n logger?.debug('chat-gpt:createImage:start', { data: mergedInput });\n\n try {\n const response = await client.images.generate(mergedInput as any);\n\n const price = calculateImagePrice(model, input.size, input.quality, input.n);\n\n const output: CreateImageOutput = {\n created: response.created,\n data: response.data as any,\n price,\n input,\n };\n\n logger?.debug('chat-gpt:createImage:success', { data: output });\n\n return output;\n } catch (error) {\n logger?.debug('chat-gpt:createImage:error', { error });\n throw error;\n }\n };\n","import { ChatGptContext, CreateSpeechInput, CreateSpeechOutput } from '../types';\nimport { calculateSpeechPrice } from '../pricing';\n\nexport const createSpeech =\n (ctx: ChatGptContext) =>\n async (input: CreateSpeechInput): Promise<CreateSpeechOutput> => {\n const { client, logger } = ctx;\n\n const model = input.model || 'tts-1';\n const mergedInput = {\n ...input,\n model,\n };\n\n logger?.debug('chat-gpt:createSpeech:start', { data: mergedInput });\n\n try {\n const response = await client.audio.speech.create(mergedInput as any);\n const buffer = Buffer.from(await response.arrayBuffer());\n\n const price = calculateSpeechPrice(model, input.input.length);\n\n const output: CreateSpeechOutput = {\n data: buffer,\n price,\n input,\n };\n\n logger?.debug('chat-gpt:createSpeech:success', { data: { price } });\n\n return output;\n } catch (error) {\n logger?.debug('chat-gpt:createSpeech:error', { error });\n throw error;\n }\n };\n","import OpenAI from 'openai';\nimport { ChatGptConfig, ChatGptContext, Logger } from './types';\nimport { createChatGptClient } from './client';\nimport { createChatCompletion } from './operations/create-chat-completion';\nimport { createImage } from './operations/create-image';\nimport { createSpeech } from './operations/create-speech';\n\nexport interface ChatGptAdapter {\n createChatCompletion: ReturnType<typeof createChatCompletion>;\n createImage: ReturnType<typeof createImage>;\n createSpeech: ReturnType<typeof createSpeech>;\n}\n\nexport const createAdapter = (config: ChatGptConfig, logger?: Logger): ChatGptAdapter => {\n const client = createChatGptClient(config);\n const context: ChatGptContext = { client, logger, defaults: config.defaults };\n\n return {\n createChatCompletion: createChatCompletion(context),\n createImage: createImage(context),\n createSpeech: createSpeech(context),\n };\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vitkuz/vitkuz-chat-gpt-apapter",
3
- "version": "1.4.0",
3
+ "version": "1.6.0",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",