@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 +50 -1
- package/dist/index.d.ts +50 -1
- package/dist/index.js +121 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +116 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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":";;;;;;;;;;AAGO,IAAM,mBAAA,GAAsB,CAAC,MAAA,KAAkC;AAClE,EAAA,OAAO,IAAIA,uBAAA,CAAO;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,SAAS,MAAA,CAAO;AAAA,GACnB,CAAA;AACL;;;ACTO,IAAM,eAAA,GAAkB;AAAA;AAAA,EAE3B,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY,YAAA;AAAA,EACZ,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,aAAA;AAAA,EACb,SAAA,EAAW,WAAA;AAAA,EACX,mBAAA,EAAqB,qBAAA;AAAA,EACrB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,aAAA,EAAe,eAAA;AAAA,EACf,WAAA,EAAa,aAAA;AAAA,EACb,kBAAA,EAAoB,oBAAA;AAAA,EACpB,gBAAA,EAAkB,kBAAA;AAAA;AAAA,EAGlB,OAAA,EAAS,SAAA;AAAA,EACT,YAAA,EAAc,cAAA;AAAA,EACd,YAAA,EAAc,cAAA;AAAA;AAAA,EAGd,MAAA,EAAQ,QAAA;AAAA,EACR,iBAAA,EAAmB,mBAAA;AAAA,EACnB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,WAAA,EAAa,aAAA;AAAA,EACb,sBAAA,EAAwB,wBAAA;AAAA,EACxB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,0BAAA,EAA4B,4BAAA;AAAA;AAAA,EAG5B,EAAA,EAAI,IAAA;AAAA,EACJ,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,EAAA,EAAI,IAAA;AAAA,EACJ,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,gBAAA,EAAkB,kBAAA;AAAA,EAClB,OAAA,EAAS,SAAA;AAAA,EACT,qBAAA,EAAuB,uBAAA;AAAA;AAAA,EAGvB,YAAA,EAAc,cAAA;AAAA,EACd,iBAAA,EAAmB,mBAAA;AAAA,EACnB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,4BAAA,EAA8B,8BAAA;AAAA,EAC9B,SAAA,EAAW,WAAA;AAAA,EACX,cAAA,EAAgB,gBAAA;AAAA,EAChB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,yBAAA,EAA2B,2BAAA;AAAA;AAAA,EAG3B,WAAA,EAAa,aAAA;AAAA,EACb,KAAA,EAAO,OAAA;AAAA,EACP,aAAA,EAAe,eAAA;AAAA,EACf,sBAAA,EAAwB,wBAAA;AAAA;AAAA,EAGxB,oBAAA,EAAsB;AAC1B;AAIO,IAAM,2BAAA,GAA8B,CAAC,KAAA,KAA2B;AAKnE,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,aAAa,CAAA,EAAG,OAAO,IAAA;AAC5C,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,mBAAmB,CAAA,EAAG,OAAO,IAAA;AAClD,EAAA,IAAI,KAAA,KAAU,UAAU,OAAO,IAAA;AAE/B,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,IAAA;AACtC,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA,EAAG,OAAO,IAAA;AAGxC,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AACnC,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AACnC,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AAEnC,EAAA,OAAO,KAAA;AACX;;;AC3EO,IAAM,gBAAA,GAAiD;AAAA;AAAA,EAE1D,WAAW,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA,EAC3D,WAAW,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA,EAC3D,SAAS,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA,EACzD,cAAc,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,CAAA,EAAI;AAAA,EAC7D,cAAc,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,IAAA,EAAO,QAAQ,GAAA,EAAI;AAAA,EAC7D,aAAA,EAAe,EAAE,KAAA,EAAO,EAAA,EAAM,QAAQ,GAAA,EAAM;AAAA,EAC5C,WAAA,EAAa,EAAE,KAAA,EAAO,EAAA,EAAM,QAAQ,GAAA,EAAM;AAAA,EAC1C,uBAAuB,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA,EACvE,uBAAuB,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA,EACvE,qBAAqB,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA,EACrE,qBAAqB,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA,EACrE,iBAAiB,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA,EACjE,eAAe,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA,EAC/D,sBAAsB,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,CAAA,EAAI;AAAA,EACrE,oBAAoB,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA;AAAA,EAGpE,WAAW,EAAE,KAAA,EAAO,GAAK,WAAA,EAAa,GAAA,EAAK,QAAQ,CAAA,EAAI;AAAA,EACvD,gBAAgB,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,EAC5D,gBAAgB,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,KAAA,EAAO,QAAQ,GAAA,EAAI;AAAA;AAAA,EAG9D,UAAU,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,IAAA,EAAM,QAAQ,EAAA,EAAK;AAAA,EACxD,mBAAA,EAAqB,EAAE,KAAA,EAAO,CAAA,EAAK,QAAQ,EAAA,EAAK;AAAA,EAChD,qBAAqB,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,IAAA,EAAM,QAAQ,EAAA,EAAK;AAAA,EACnE,eAAe,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,GAAA,EAAI;AAAA,EAC9D,0BAA0B,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,GAAA,EAAI;AAAA,EACzE,4BAAA,EAA8B,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,GAAA,EAAI;AAAA,EACzD,uBAAA,EAAyB,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,EAAA,EAAK;AAAA;AAAA,EAGpD,IAAI,EAAE,KAAA,EAAO,IAAM,WAAA,EAAa,GAAA,EAAK,QAAQ,EAAA,EAAK;AAAA,EAClD,QAAA,EAAU,EAAE,KAAA,EAAO,GAAA,EAAO,QAAQ,GAAA,EAAM;AAAA,EACxC,WAAW,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,IAAA,EAAM,QAAQ,GAAA,EAAI;AAAA,EACxD,IAAI,EAAE,KAAA,EAAO,GAAK,WAAA,EAAa,GAAA,EAAK,QAAQ,CAAA,EAAI;AAAA,EAChD,QAAA,EAAU,EAAE,KAAA,EAAO,EAAA,EAAM,QAAQ,EAAA,EAAK;AAAA,EACtC,WAAW,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,IAAA,EAAM,QAAQ,GAAA,EAAI;AAAA,EACxD,oBAAoB,EAAE,KAAA,EAAO,IAAM,WAAA,EAAa,GAAA,EAAK,QAAQ,EAAA,EAAK;AAAA,EAClE,WAAW,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,KAAA,EAAO,QAAQ,GAAA,EAAI;AAAA,EACzD,yBAAyB,EAAE,KAAA,EAAO,GAAK,WAAA,EAAa,GAAA,EAAK,QAAQ,CAAA,EAAI;AAAA;AAAA,EAGrE,gBAAgB,EAAE,KAAA,EAAO,GAAK,WAAA,EAAa,GAAA,EAAK,QAAQ,EAAA,EAAK;AAAA,EAC7D,qBAAqB,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,IAAA,EAAM,QAAQ,GAAA,EAAI;AAAA,EAClE,2BAA2B,EAAE,KAAA,EAAO,GAAK,WAAA,EAAa,GAAA,EAAK,QAAQ,EAAA,EAAK;AAAA,EACxE,gCAAgC,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,EAC5E,WAAA,EAAa,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,EAAA,EAAK;AAAA,EACxC,gBAAA,EAAkB,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,EAC5C,sBAAA,EAAwB,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,EAAA,EAAK;AAAA,EACnD,2BAAA,EAA6B,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,GAAA,EAAI;AAAA;AAAA,EAGxD,aAAA,EAAe,EAAE,KAAA,EAAO,EAAA,EAAM,QAAQ,EAAA,EAAK;AAAA,EAC3C,wBAAA,EAA0B,EAAE,KAAA,EAAO,EAAA,EAAM,QAAQ,EAAA,EAAK;AAAA,EACtD,OAAA,EAAS,EAAE,KAAA,EAAO,EAAA,EAAM,QAAQ,EAAA,EAAK;AAAA,EACrC,eAAA,EAAiB,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,EAC3C,wBAAA,EAA0B,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,CAAA,EAAI;AAAA;AAAA,EAGpD,sBAAA,EAAwB,EAAE,KAAA,EAAO,CAAA,EAAK,QAAQ,EAAA;AAClD;AAEO,IAAM,cAAA,GAAiB,CAC1B,KAAA,EACA,KAAA,KAQwB;AACxB,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,EAAA,MAAM,OAAA,GAAU,iBAAiB,KAAK,CAAA;AACtC,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AAErB,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,aAAA,IAAiB,CAAA;AACjE,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,aAAA,IAAiB,KAAA,CAAM,iBAAA,IAAqB,CAAA;AACvE,EAAA,MAAM,eACF,KAAA,CAAM,oBAAA,EAAsB,aAAA,IAC5B,KAAA,CAAM,uBAAuB,aAAA,IAC7B,CAAA;AAEJ,EAAA,MAAM,qBAAqB,WAAA,GAAc,YAAA;AAEzC,EAAA,MAAM,SAAA,GACD,qBAAqB,GAAA,GAAa,OAAA,CAAQ,QAC1C,YAAA,GAAe,GAAA,IAAc,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,KAAA,CAAA;AAEjE,EAAA,MAAM,UAAA,GAAc,YAAA,GAAe,GAAA,GAAa,OAAA,CAAQ,MAAA;AAExD,EAAA,OAAO;AAAA,IACH,OAAO,MAAA,CAAA,CAAQ,SAAA,GAAY,UAAA,EAAY,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IACjD,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IACtC,UAAA,EAAY,MAAA,CAAO,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IACxC,QAAA,EAAU;AAAA,GACd;AACJ;;;ACxGO,IAAM,oBAAA,GACT,CAAC,GAAA,KACD,OAAO,KAAA,KAA0E;AAC7E,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAS,GAAI,GAAA;AAErC,EAAA,MAAM,WAAA,GAAc;AAAA,IAChB,GAAG,QAAA;AAAA,IACH,GAAG;AAAA,GACP;AAEA,EAAA,IAAI,CAAC,YAAY,KAAA,EAAO;AACpB,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACtE;AAEA,EAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAG,MAAK,GAAI,WAAA;AAElD,EAAA,MAAA,EAAQ,KAAA,CAAM,qCAAA,EAAuC,EAAE,IAAA,EAAM,aAAa,CAAA;AAE1E,EAAA,IAAI;AACA,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,IAAI,CAAC,2BAAA,CAA4B,WAAA,CAAY,KAAK,CAAA,EAAG;AACjD,QAAA,MAAM,IAAI,KAAA;AAAA,UACN,CAAA,qCAAA,EAAwC,YAAY,KAAK,CAAA,qHAAA;AAAA,SAE7D;AAAA,MACJ;AAEA,MAAA,QAAA,GAAW,MAAO,MAAA,CAAO,SAAA,CAAkB,KAAA,CAAM;AAAA,QAC7C,GAAG,IAAA;AAAA,QACH,KAAA,EAAO,QAAA;AAAA,QACP,IAAA,EAAM;AAAA,UACF,MAAA,EAAQC,iBAAA,CAAc,MAAA,EAAQ,UAAA,IAAc,QAAQ;AAAA;AACxD,OACH,CAAA;AAED,MAAA,QAAA,GAAW;AAAA,QACP,GAAG,QAAA;AAAA,QACH,QAAQ,QAAA,CAAS;AAAA,OACrB;AAAA,IACJ,CAAA,MAAO;AAEH,MAAA,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO;AAAA,QAC5C,GAAG;AAAA,OACC,CAAA;AAAA,IACZ;AAEA,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,WAAA,CAAY,KAAA,EAAO,SAAS,KAAK,CAAA;AAE9D,IAAA,MAAM,MAAA,GAAS;AAAA,MACX,GAAG,QAAA;AAAA,MACH;AAAA,KACJ;AAEA,IAAA,MAAA,EAAQ,KAAA,CAAM,uCAAA,EAAyC,EAAE,IAAA,EAAM,QAAQ,CAAA;AAEvE,IAAA,OAAO,MAAA;AAAA,EACX,SAAS,KAAA,EAAO;AACZ,IAAA,MAAA,EAAQ,KAAA,CAAM,qCAAA,EAAuC,EAAE,KAAA,EAAO,CAAA;AAC9D,IAAA,MAAM,KAAA;AAAA,EACV;AACJ;;;ACzDG,IAAM,aAAA,GAAgB,CAAC,MAAA,EAAuB,MAAA,KAAoC;AACrF,EAAA,MAAM,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACzC,EAAA,MAAM,UAA0B,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,OAAO,QAAA,EAAS;AAE5E,EAAA,OAAO;AAAA,IACH,oBAAA,EAAsB,qBAAqB,OAAO;AAAA,GACtD;AACJ","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
|
package/dist/index.mjs.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":[],"mappings":";;;;AAGO,IAAM,mBAAA,GAAsB,CAAC,MAAA,KAAkC;AAClE,EAAA,OAAO,IAAI,MAAA,CAAO;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,SAAS,MAAA,CAAO;AAAA,GACnB,CAAA;AACL;;;ACTO,IAAM,eAAA,GAAkB;AAAA;AAAA,EAE3B,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY,YAAA;AAAA,EACZ,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,aAAA;AAAA,EACb,SAAA,EAAW,WAAA;AAAA,EACX,mBAAA,EAAqB,qBAAA;AAAA,EACrB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,aAAA,EAAe,eAAA;AAAA,EACf,WAAA,EAAa,aAAA;AAAA,EACb,kBAAA,EAAoB,oBAAA;AAAA,EACpB,gBAAA,EAAkB,kBAAA;AAAA;AAAA,EAGlB,OAAA,EAAS,SAAA;AAAA,EACT,YAAA,EAAc,cAAA;AAAA,EACd,YAAA,EAAc,cAAA;AAAA;AAAA,EAGd,MAAA,EAAQ,QAAA;AAAA,EACR,iBAAA,EAAmB,mBAAA;AAAA,EACnB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,WAAA,EAAa,aAAA;AAAA,EACb,sBAAA,EAAwB,wBAAA;AAAA,EACxB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,0BAAA,EAA4B,4BAAA;AAAA;AAAA,EAG5B,EAAA,EAAI,IAAA;AAAA,EACJ,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,EAAA,EAAI,IAAA;AAAA,EACJ,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,gBAAA,EAAkB,kBAAA;AAAA,EAClB,OAAA,EAAS,SAAA;AAAA,EACT,qBAAA,EAAuB,uBAAA;AAAA;AAAA,EAGvB,YAAA,EAAc,cAAA;AAAA,EACd,iBAAA,EAAmB,mBAAA;AAAA,EACnB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,4BAAA,EAA8B,8BAAA;AAAA,EAC9B,SAAA,EAAW,WAAA;AAAA,EACX,cAAA,EAAgB,gBAAA;AAAA,EAChB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,yBAAA,EAA2B,2BAAA;AAAA;AAAA,EAG3B,WAAA,EAAa,aAAA;AAAA,EACb,KAAA,EAAO,OAAA;AAAA,EACP,aAAA,EAAe,eAAA;AAAA,EACf,sBAAA,EAAwB,wBAAA;AAAA;AAAA,EAGxB,oBAAA,EAAsB;AAC1B;AAIO,IAAM,2BAAA,GAA8B,CAAC,KAAA,KAA2B;AAKnE,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,aAAa,CAAA,EAAG,OAAO,IAAA;AAC5C,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,mBAAmB,CAAA,EAAG,OAAO,IAAA;AAClD,EAAA,IAAI,KAAA,KAAU,UAAU,OAAO,IAAA;AAE/B,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,IAAA;AACtC,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA,EAAG,OAAO,IAAA;AAGxC,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AACnC,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AACnC,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AAEnC,EAAA,OAAO,KAAA;AACX;;;AC3EO,IAAM,gBAAA,GAAiD;AAAA;AAAA,EAE1D,WAAW,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA,EAC3D,WAAW,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA,EAC3D,SAAS,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA,EACzD,cAAc,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,CAAA,EAAI;AAAA,EAC7D,cAAc,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,IAAA,EAAO,QAAQ,GAAA,EAAI;AAAA,EAC7D,aAAA,EAAe,EAAE,KAAA,EAAO,EAAA,EAAM,QAAQ,GAAA,EAAM;AAAA,EAC5C,WAAA,EAAa,EAAE,KAAA,EAAO,EAAA,EAAM,QAAQ,GAAA,EAAM;AAAA,EAC1C,uBAAuB,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA,EACvE,uBAAuB,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA,EACvE,qBAAqB,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA,EACrE,qBAAqB,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA,EACrE,iBAAiB,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA,EACjE,eAAe,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA,EAC/D,sBAAsB,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,CAAA,EAAI;AAAA,EACrE,oBAAoB,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,EAAA,EAAK;AAAA;AAAA,EAGpE,WAAW,EAAE,KAAA,EAAO,GAAK,WAAA,EAAa,GAAA,EAAK,QAAQ,CAAA,EAAI;AAAA,EACvD,gBAAgB,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,EAC5D,gBAAgB,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,KAAA,EAAO,QAAQ,GAAA,EAAI;AAAA;AAAA,EAG9D,UAAU,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,IAAA,EAAM,QAAQ,EAAA,EAAK;AAAA,EACxD,mBAAA,EAAqB,EAAE,KAAA,EAAO,CAAA,EAAK,QAAQ,EAAA,EAAK;AAAA,EAChD,qBAAqB,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,IAAA,EAAM,QAAQ,EAAA,EAAK;AAAA,EACnE,eAAe,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,GAAA,EAAI;AAAA,EAC9D,0BAA0B,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,GAAA,EAAI;AAAA,EACzE,4BAAA,EAA8B,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,GAAA,EAAI;AAAA,EACzD,uBAAA,EAAyB,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,EAAA,EAAK;AAAA;AAAA,EAGpD,IAAI,EAAE,KAAA,EAAO,IAAM,WAAA,EAAa,GAAA,EAAK,QAAQ,EAAA,EAAK;AAAA,EAClD,QAAA,EAAU,EAAE,KAAA,EAAO,GAAA,EAAO,QAAQ,GAAA,EAAM;AAAA,EACxC,WAAW,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,IAAA,EAAM,QAAQ,GAAA,EAAI;AAAA,EACxD,IAAI,EAAE,KAAA,EAAO,GAAK,WAAA,EAAa,GAAA,EAAK,QAAQ,CAAA,EAAI;AAAA,EAChD,QAAA,EAAU,EAAE,KAAA,EAAO,EAAA,EAAM,QAAQ,EAAA,EAAK;AAAA,EACtC,WAAW,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,IAAA,EAAM,QAAQ,GAAA,EAAI;AAAA,EACxD,oBAAoB,EAAE,KAAA,EAAO,IAAM,WAAA,EAAa,GAAA,EAAK,QAAQ,EAAA,EAAK;AAAA,EAClE,WAAW,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,KAAA,EAAO,QAAQ,GAAA,EAAI;AAAA,EACzD,yBAAyB,EAAE,KAAA,EAAO,GAAK,WAAA,EAAa,GAAA,EAAK,QAAQ,CAAA,EAAI;AAAA;AAAA,EAGrE,gBAAgB,EAAE,KAAA,EAAO,GAAK,WAAA,EAAa,GAAA,EAAK,QAAQ,EAAA,EAAK;AAAA,EAC7D,qBAAqB,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,IAAA,EAAM,QAAQ,GAAA,EAAI;AAAA,EAClE,2BAA2B,EAAE,KAAA,EAAO,GAAK,WAAA,EAAa,GAAA,EAAK,QAAQ,EAAA,EAAK;AAAA,EACxE,gCAAgC,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,EAC5E,WAAA,EAAa,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,EAAA,EAAK;AAAA,EACxC,gBAAA,EAAkB,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,EAC5C,sBAAA,EAAwB,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,EAAA,EAAK;AAAA,EACnD,2BAAA,EAA6B,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,GAAA,EAAI;AAAA;AAAA,EAGxD,aAAA,EAAe,EAAE,KAAA,EAAO,EAAA,EAAM,QAAQ,EAAA,EAAK;AAAA,EAC3C,wBAAA,EAA0B,EAAE,KAAA,EAAO,EAAA,EAAM,QAAQ,EAAA,EAAK;AAAA,EACtD,OAAA,EAAS,EAAE,KAAA,EAAO,EAAA,EAAM,QAAQ,EAAA,EAAK;AAAA,EACrC,eAAA,EAAiB,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,EAC3C,wBAAA,EAA0B,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,CAAA,EAAI;AAAA;AAAA,EAGpD,sBAAA,EAAwB,EAAE,KAAA,EAAO,CAAA,EAAK,QAAQ,EAAA;AAClD;AAEO,IAAM,cAAA,GAAiB,CAC1B,KAAA,EACA,KAAA,KAQwB;AACxB,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,EAAA,MAAM,OAAA,GAAU,iBAAiB,KAAK,CAAA;AACtC,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AAErB,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,aAAA,IAAiB,CAAA;AACjE,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,aAAA,IAAiB,KAAA,CAAM,iBAAA,IAAqB,CAAA;AACvE,EAAA,MAAM,eACF,KAAA,CAAM,oBAAA,EAAsB,aAAA,IAC5B,KAAA,CAAM,uBAAuB,aAAA,IAC7B,CAAA;AAEJ,EAAA,MAAM,qBAAqB,WAAA,GAAc,YAAA;AAEzC,EAAA,MAAM,SAAA,GACD,qBAAqB,GAAA,GAAa,OAAA,CAAQ,QAC1C,YAAA,GAAe,GAAA,IAAc,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,KAAA,CAAA;AAEjE,EAAA,MAAM,UAAA,GAAc,YAAA,GAAe,GAAA,GAAa,OAAA,CAAQ,MAAA;AAExD,EAAA,OAAO;AAAA,IACH,OAAO,MAAA,CAAA,CAAQ,SAAA,GAAY,UAAA,EAAY,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IACjD,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IACtC,UAAA,EAAY,MAAA,CAAO,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IACxC,QAAA,EAAU;AAAA,GACd;AACJ;;;ACxGO,IAAM,oBAAA,GACT,CAAC,GAAA,KACD,OAAO,KAAA,KAA0E;AAC7E,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAS,GAAI,GAAA;AAErC,EAAA,MAAM,WAAA,GAAc;AAAA,IAChB,GAAG,QAAA;AAAA,IACH,GAAG;AAAA,GACP;AAEA,EAAA,IAAI,CAAC,YAAY,KAAA,EAAO;AACpB,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACtE;AAEA,EAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAG,MAAK,GAAI,WAAA;AAElD,EAAA,MAAA,EAAQ,KAAA,CAAM,qCAAA,EAAuC,EAAE,IAAA,EAAM,aAAa,CAAA;AAE1E,EAAA,IAAI;AACA,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,IAAI,CAAC,2BAAA,CAA4B,WAAA,CAAY,KAAK,CAAA,EAAG;AACjD,QAAA,MAAM,IAAI,KAAA;AAAA,UACN,CAAA,qCAAA,EAAwC,YAAY,KAAK,CAAA,qHAAA;AAAA,SAE7D;AAAA,MACJ;AAEA,MAAA,QAAA,GAAW,MAAO,MAAA,CAAO,SAAA,CAAkB,KAAA,CAAM;AAAA,QAC7C,GAAG,IAAA;AAAA,QACH,KAAA,EAAO,QAAA;AAAA,QACP,IAAA,EAAM;AAAA,UACF,MAAA,EAAQ,aAAA,CAAc,MAAA,EAAQ,UAAA,IAAc,QAAQ;AAAA;AACxD,OACH,CAAA;AAED,MAAA,QAAA,GAAW;AAAA,QACP,GAAG,QAAA;AAAA,QACH,QAAQ,QAAA,CAAS;AAAA,OACrB;AAAA,IACJ,CAAA,MAAO;AAEH,MAAA,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO;AAAA,QAC5C,GAAG;AAAA,OACC,CAAA;AAAA,IACZ;AAEA,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,WAAA,CAAY,KAAA,EAAO,SAAS,KAAK,CAAA;AAE9D,IAAA,MAAM,MAAA,GAAS;AAAA,MACX,GAAG,QAAA;AAAA,MACH;AAAA,KACJ;AAEA,IAAA,MAAA,EAAQ,KAAA,CAAM,uCAAA,EAAyC,EAAE,IAAA,EAAM,QAAQ,CAAA;AAEvE,IAAA,OAAO,MAAA;AAAA,EACX,SAAS,KAAA,EAAO;AACZ,IAAA,MAAA,EAAQ,KAAA,CAAM,qCAAA,EAAuC,EAAE,KAAA,EAAO,CAAA;AAC9D,IAAA,MAAM,KAAA;AAAA,EACV;AACJ;;;ACzDG,IAAM,aAAA,GAAgB,CAAC,MAAA,EAAuB,MAAA,KAAoC;AACrF,EAAA,MAAM,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACzC,EAAA,MAAM,UAA0B,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,OAAO,QAAA,EAAS;AAE5E,EAAA,OAAO;AAAA,IACH,oBAAA,EAAsB,qBAAqB,OAAO;AAAA,GACtD;AACJ","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"]}
|