@vitkuz/vitkuz-chat-gpt-apapter 1.3.2 → 1.5.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 +85 -4
- package/dist/index.d.ts +85 -4
- package/dist/index.js +197 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +192 -10
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -83,27 +83,100 @@ interface CreateChatCompletionOutput {
|
|
|
83
83
|
};
|
|
84
84
|
price?: PriceInfo;
|
|
85
85
|
}
|
|
86
|
+
interface CreateImageInput {
|
|
87
|
+
prompt: string;
|
|
88
|
+
model?: string;
|
|
89
|
+
n?: number;
|
|
90
|
+
quality?: 'standard' | 'hd';
|
|
91
|
+
response_format?: 'url' | 'b64_json';
|
|
92
|
+
size?: '256x256' | '512x512' | '1024x1024' | '1024x1792' | '1792x1024';
|
|
93
|
+
style?: 'vivid' | 'natural';
|
|
94
|
+
user?: string;
|
|
95
|
+
}
|
|
96
|
+
interface CreateImageOutput {
|
|
97
|
+
created: number;
|
|
98
|
+
data: {
|
|
99
|
+
url?: string;
|
|
100
|
+
b64_json?: string;
|
|
101
|
+
revised_prompt?: string;
|
|
102
|
+
}[];
|
|
103
|
+
price?: PriceInfo;
|
|
104
|
+
}
|
|
105
|
+
interface CreateSpeechInput {
|
|
106
|
+
model?: string;
|
|
107
|
+
input: string;
|
|
108
|
+
voice: 'alloy' | 'echo' | 'fable' | 'onyx' | 'nova' | 'shimmer';
|
|
109
|
+
response_format?: 'mp3' | 'opus' | 'aac' | 'flac' | 'wav' | 'pcm';
|
|
110
|
+
speed?: number;
|
|
111
|
+
}
|
|
112
|
+
interface CreateSpeechOutput {
|
|
113
|
+
data: Buffer | Uint8Array;
|
|
114
|
+
price?: PriceInfo;
|
|
115
|
+
}
|
|
86
116
|
|
|
87
117
|
declare const createChatGptClient: (config: ChatGptConfig) => OpenAI;
|
|
88
118
|
|
|
89
119
|
declare const createChatCompletion: (ctx: ChatGptContext) => (input: CreateChatCompletionInput) => Promise<CreateChatCompletionOutput>;
|
|
90
120
|
|
|
121
|
+
declare const createImage: (ctx: ChatGptContext) => (input: CreateImageInput) => Promise<CreateImageOutput>;
|
|
122
|
+
|
|
123
|
+
declare const createSpeech: (ctx: ChatGptContext) => (input: CreateSpeechInput) => Promise<CreateSpeechOutput>;
|
|
124
|
+
|
|
91
125
|
interface ChatGptAdapter {
|
|
92
126
|
createChatCompletion: ReturnType<typeof createChatCompletion>;
|
|
127
|
+
createImage: ReturnType<typeof createImage>;
|
|
128
|
+
createSpeech: ReturnType<typeof createSpeech>;
|
|
93
129
|
}
|
|
94
130
|
declare const createAdapter: (config: ChatGptConfig, logger?: Logger) => ChatGptAdapter;
|
|
95
131
|
|
|
96
132
|
declare const CHAT_GPT_MODELS: {
|
|
133
|
+
readonly GPT_5_2: "gpt-5.2";
|
|
134
|
+
readonly GPT_5_1: "gpt-5.1";
|
|
135
|
+
readonly GPT_5: "gpt-5";
|
|
136
|
+
readonly GPT_5_MINI: "gpt-5-mini";
|
|
137
|
+
readonly GPT_5_NANO: "gpt-5-nano";
|
|
138
|
+
readonly GPT_5_2_PRO: "gpt-5.2-pro";
|
|
139
|
+
readonly GPT_5_PRO: "gpt-5-pro";
|
|
140
|
+
readonly GPT_5_2_CHAT_LATEST: "gpt-5.2-chat-latest";
|
|
141
|
+
readonly GPT_5_1_CHAT_LATEST: "gpt-5.1-chat-latest";
|
|
142
|
+
readonly GPT_5_CHAT_LATEST: "gpt-5-chat-latest";
|
|
143
|
+
readonly GPT_5_1_CODEX_MAX: "gpt-5.1-codex-max";
|
|
144
|
+
readonly GPT_5_1_CODEX: "gpt-5.1-codex";
|
|
145
|
+
readonly GPT_5_CODEX: "gpt-5-codex";
|
|
146
|
+
readonly GPT_5_1_CODEX_MINI: "gpt-5.1-codex-mini";
|
|
147
|
+
readonly GPT_5_SEARCH_API: "gpt-5-search-api";
|
|
148
|
+
readonly GPT_4_1: "gpt-4.1";
|
|
149
|
+
readonly GPT_4_1_MINI: "gpt-4.1-mini";
|
|
150
|
+
readonly GPT_4_1_NANO: "gpt-4.1-nano";
|
|
97
151
|
readonly GPT_4o: "gpt-4o";
|
|
98
152
|
readonly GPT_4o_2024_08_06: "gpt-4o-2024-08-06";
|
|
153
|
+
readonly GPT_4o_2024_05_13: "gpt-4o-2024-05-13";
|
|
99
154
|
readonly GPT_4o_MINI: "gpt-4o-mini";
|
|
100
155
|
readonly GPT_4o_MINI_2024_07_18: "gpt-4o-mini-2024-07-18";
|
|
101
|
-
readonly
|
|
102
|
-
readonly
|
|
103
|
-
readonly GPT_3_5_TURBO: "gpt-3.5-turbo";
|
|
156
|
+
readonly GPT_4o_SEARCH_PREVIEW: "gpt-4o-search-preview";
|
|
157
|
+
readonly GPT_4o_MINI_SEARCH_PREVIEW: "gpt-4o-mini-search-preview";
|
|
104
158
|
readonly O1: "o1";
|
|
159
|
+
readonly O1_PRO: "o1-pro";
|
|
105
160
|
readonly O1_MINI: "o1-mini";
|
|
161
|
+
readonly O3: "o3";
|
|
162
|
+
readonly O3_PRO: "o3-pro";
|
|
106
163
|
readonly O3_MINI: "o3-mini";
|
|
164
|
+
readonly O3_DEEP_RESEARCH: "o3-deep-research";
|
|
165
|
+
readonly O4_MINI: "o4-mini";
|
|
166
|
+
readonly O4_MINI_DEEP_RESEARCH: "o4-mini-deep-research";
|
|
167
|
+
readonly GPT_REALTIME: "gpt-realtime";
|
|
168
|
+
readonly GPT_REALTIME_MINI: "gpt-realtime-mini";
|
|
169
|
+
readonly GPT_4o_REALTIME_PREVIEW: "gpt-4o-realtime-preview";
|
|
170
|
+
readonly GPT_4o_MINI_REALTIME_PREVIEW: "gpt-4o-mini-realtime-preview";
|
|
171
|
+
readonly GPT_AUDIO: "gpt-audio";
|
|
172
|
+
readonly GPT_AUDIO_MINI: "gpt-audio-mini";
|
|
173
|
+
readonly GPT_4o_AUDIO_PREVIEW: "gpt-4o-audio-preview";
|
|
174
|
+
readonly GPT_4o_MINI_AUDIO_PREVIEW: "gpt-4o-mini-audio-preview";
|
|
175
|
+
readonly GPT_4_TURBO: "gpt-4-turbo";
|
|
176
|
+
readonly GPT_4: "gpt-4";
|
|
177
|
+
readonly GPT_3_5_TURBO: "gpt-3.5-turbo";
|
|
178
|
+
readonly GPT_3_5_TURBO_INSTRUCT: "gpt-3.5-turbo-instruct";
|
|
179
|
+
readonly COMPUTER_USE_PREVIEW: "computer-use-preview";
|
|
107
180
|
};
|
|
108
181
|
type ChatGptModel = (typeof CHAT_GPT_MODELS)[keyof typeof CHAT_GPT_MODELS];
|
|
109
182
|
declare const isStructuredOutputSupported: (model: string) => boolean;
|
|
@@ -113,7 +186,13 @@ interface ModelPricing {
|
|
|
113
186
|
output: number;
|
|
114
187
|
cachedInput?: number;
|
|
115
188
|
}
|
|
189
|
+
interface ImagePricing {
|
|
190
|
+
standard: Record<string, number>;
|
|
191
|
+
hd: Record<string, number>;
|
|
192
|
+
}
|
|
116
193
|
declare const CHAT_GPT_PRICING: Record<string, ModelPricing>;
|
|
194
|
+
declare const IMAGE_PRICING: Record<string, ImagePricing>;
|
|
195
|
+
declare const SPEECH_PRICING: Record<string, number>;
|
|
117
196
|
declare const calculatePrice: (model: string, usage?: {
|
|
118
197
|
prompt_tokens?: number;
|
|
119
198
|
completion_tokens?: number;
|
|
@@ -126,5 +205,7 @@ declare const calculatePrice: (model: string, usage?: {
|
|
|
126
205
|
cached_tokens?: number;
|
|
127
206
|
};
|
|
128
207
|
}) => PriceInfo | undefined;
|
|
208
|
+
declare const calculateImagePrice: (model: string, size?: string, quality?: string, n?: number) => PriceInfo | undefined;
|
|
209
|
+
declare const calculateSpeechPrice: (model: string, inputLength: number) => PriceInfo | undefined;
|
|
129
210
|
|
|
130
|
-
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 };
|
|
211
|
+
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
|
@@ -83,27 +83,100 @@ interface CreateChatCompletionOutput {
|
|
|
83
83
|
};
|
|
84
84
|
price?: PriceInfo;
|
|
85
85
|
}
|
|
86
|
+
interface CreateImageInput {
|
|
87
|
+
prompt: string;
|
|
88
|
+
model?: string;
|
|
89
|
+
n?: number;
|
|
90
|
+
quality?: 'standard' | 'hd';
|
|
91
|
+
response_format?: 'url' | 'b64_json';
|
|
92
|
+
size?: '256x256' | '512x512' | '1024x1024' | '1024x1792' | '1792x1024';
|
|
93
|
+
style?: 'vivid' | 'natural';
|
|
94
|
+
user?: string;
|
|
95
|
+
}
|
|
96
|
+
interface CreateImageOutput {
|
|
97
|
+
created: number;
|
|
98
|
+
data: {
|
|
99
|
+
url?: string;
|
|
100
|
+
b64_json?: string;
|
|
101
|
+
revised_prompt?: string;
|
|
102
|
+
}[];
|
|
103
|
+
price?: PriceInfo;
|
|
104
|
+
}
|
|
105
|
+
interface CreateSpeechInput {
|
|
106
|
+
model?: string;
|
|
107
|
+
input: string;
|
|
108
|
+
voice: 'alloy' | 'echo' | 'fable' | 'onyx' | 'nova' | 'shimmer';
|
|
109
|
+
response_format?: 'mp3' | 'opus' | 'aac' | 'flac' | 'wav' | 'pcm';
|
|
110
|
+
speed?: number;
|
|
111
|
+
}
|
|
112
|
+
interface CreateSpeechOutput {
|
|
113
|
+
data: Buffer | Uint8Array;
|
|
114
|
+
price?: PriceInfo;
|
|
115
|
+
}
|
|
86
116
|
|
|
87
117
|
declare const createChatGptClient: (config: ChatGptConfig) => OpenAI;
|
|
88
118
|
|
|
89
119
|
declare const createChatCompletion: (ctx: ChatGptContext) => (input: CreateChatCompletionInput) => Promise<CreateChatCompletionOutput>;
|
|
90
120
|
|
|
121
|
+
declare const createImage: (ctx: ChatGptContext) => (input: CreateImageInput) => Promise<CreateImageOutput>;
|
|
122
|
+
|
|
123
|
+
declare const createSpeech: (ctx: ChatGptContext) => (input: CreateSpeechInput) => Promise<CreateSpeechOutput>;
|
|
124
|
+
|
|
91
125
|
interface ChatGptAdapter {
|
|
92
126
|
createChatCompletion: ReturnType<typeof createChatCompletion>;
|
|
127
|
+
createImage: ReturnType<typeof createImage>;
|
|
128
|
+
createSpeech: ReturnType<typeof createSpeech>;
|
|
93
129
|
}
|
|
94
130
|
declare const createAdapter: (config: ChatGptConfig, logger?: Logger) => ChatGptAdapter;
|
|
95
131
|
|
|
96
132
|
declare const CHAT_GPT_MODELS: {
|
|
133
|
+
readonly GPT_5_2: "gpt-5.2";
|
|
134
|
+
readonly GPT_5_1: "gpt-5.1";
|
|
135
|
+
readonly GPT_5: "gpt-5";
|
|
136
|
+
readonly GPT_5_MINI: "gpt-5-mini";
|
|
137
|
+
readonly GPT_5_NANO: "gpt-5-nano";
|
|
138
|
+
readonly GPT_5_2_PRO: "gpt-5.2-pro";
|
|
139
|
+
readonly GPT_5_PRO: "gpt-5-pro";
|
|
140
|
+
readonly GPT_5_2_CHAT_LATEST: "gpt-5.2-chat-latest";
|
|
141
|
+
readonly GPT_5_1_CHAT_LATEST: "gpt-5.1-chat-latest";
|
|
142
|
+
readonly GPT_5_CHAT_LATEST: "gpt-5-chat-latest";
|
|
143
|
+
readonly GPT_5_1_CODEX_MAX: "gpt-5.1-codex-max";
|
|
144
|
+
readonly GPT_5_1_CODEX: "gpt-5.1-codex";
|
|
145
|
+
readonly GPT_5_CODEX: "gpt-5-codex";
|
|
146
|
+
readonly GPT_5_1_CODEX_MINI: "gpt-5.1-codex-mini";
|
|
147
|
+
readonly GPT_5_SEARCH_API: "gpt-5-search-api";
|
|
148
|
+
readonly GPT_4_1: "gpt-4.1";
|
|
149
|
+
readonly GPT_4_1_MINI: "gpt-4.1-mini";
|
|
150
|
+
readonly GPT_4_1_NANO: "gpt-4.1-nano";
|
|
97
151
|
readonly GPT_4o: "gpt-4o";
|
|
98
152
|
readonly GPT_4o_2024_08_06: "gpt-4o-2024-08-06";
|
|
153
|
+
readonly GPT_4o_2024_05_13: "gpt-4o-2024-05-13";
|
|
99
154
|
readonly GPT_4o_MINI: "gpt-4o-mini";
|
|
100
155
|
readonly GPT_4o_MINI_2024_07_18: "gpt-4o-mini-2024-07-18";
|
|
101
|
-
readonly
|
|
102
|
-
readonly
|
|
103
|
-
readonly GPT_3_5_TURBO: "gpt-3.5-turbo";
|
|
156
|
+
readonly GPT_4o_SEARCH_PREVIEW: "gpt-4o-search-preview";
|
|
157
|
+
readonly GPT_4o_MINI_SEARCH_PREVIEW: "gpt-4o-mini-search-preview";
|
|
104
158
|
readonly O1: "o1";
|
|
159
|
+
readonly O1_PRO: "o1-pro";
|
|
105
160
|
readonly O1_MINI: "o1-mini";
|
|
161
|
+
readonly O3: "o3";
|
|
162
|
+
readonly O3_PRO: "o3-pro";
|
|
106
163
|
readonly O3_MINI: "o3-mini";
|
|
164
|
+
readonly O3_DEEP_RESEARCH: "o3-deep-research";
|
|
165
|
+
readonly O4_MINI: "o4-mini";
|
|
166
|
+
readonly O4_MINI_DEEP_RESEARCH: "o4-mini-deep-research";
|
|
167
|
+
readonly GPT_REALTIME: "gpt-realtime";
|
|
168
|
+
readonly GPT_REALTIME_MINI: "gpt-realtime-mini";
|
|
169
|
+
readonly GPT_4o_REALTIME_PREVIEW: "gpt-4o-realtime-preview";
|
|
170
|
+
readonly GPT_4o_MINI_REALTIME_PREVIEW: "gpt-4o-mini-realtime-preview";
|
|
171
|
+
readonly GPT_AUDIO: "gpt-audio";
|
|
172
|
+
readonly GPT_AUDIO_MINI: "gpt-audio-mini";
|
|
173
|
+
readonly GPT_4o_AUDIO_PREVIEW: "gpt-4o-audio-preview";
|
|
174
|
+
readonly GPT_4o_MINI_AUDIO_PREVIEW: "gpt-4o-mini-audio-preview";
|
|
175
|
+
readonly GPT_4_TURBO: "gpt-4-turbo";
|
|
176
|
+
readonly GPT_4: "gpt-4";
|
|
177
|
+
readonly GPT_3_5_TURBO: "gpt-3.5-turbo";
|
|
178
|
+
readonly GPT_3_5_TURBO_INSTRUCT: "gpt-3.5-turbo-instruct";
|
|
179
|
+
readonly COMPUTER_USE_PREVIEW: "computer-use-preview";
|
|
107
180
|
};
|
|
108
181
|
type ChatGptModel = (typeof CHAT_GPT_MODELS)[keyof typeof CHAT_GPT_MODELS];
|
|
109
182
|
declare const isStructuredOutputSupported: (model: string) => boolean;
|
|
@@ -113,7 +186,13 @@ interface ModelPricing {
|
|
|
113
186
|
output: number;
|
|
114
187
|
cachedInput?: number;
|
|
115
188
|
}
|
|
189
|
+
interface ImagePricing {
|
|
190
|
+
standard: Record<string, number>;
|
|
191
|
+
hd: Record<string, number>;
|
|
192
|
+
}
|
|
116
193
|
declare const CHAT_GPT_PRICING: Record<string, ModelPricing>;
|
|
194
|
+
declare const IMAGE_PRICING: Record<string, ImagePricing>;
|
|
195
|
+
declare const SPEECH_PRICING: Record<string, number>;
|
|
117
196
|
declare const calculatePrice: (model: string, usage?: {
|
|
118
197
|
prompt_tokens?: number;
|
|
119
198
|
completion_tokens?: number;
|
|
@@ -126,5 +205,7 @@ declare const calculatePrice: (model: string, usage?: {
|
|
|
126
205
|
cached_tokens?: number;
|
|
127
206
|
};
|
|
128
207
|
}) => PriceInfo | undefined;
|
|
208
|
+
declare const calculateImagePrice: (model: string, size?: string, quality?: string, n?: number) => PriceInfo | undefined;
|
|
209
|
+
declare const calculateSpeechPrice: (model: string, inputLength: number) => PriceInfo | undefined;
|
|
129
210
|
|
|
130
|
-
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 };
|
|
211
|
+
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
|
@@ -18,22 +18,70 @@ var createChatGptClient = (config) => {
|
|
|
18
18
|
|
|
19
19
|
// src/models.ts
|
|
20
20
|
var CHAT_GPT_MODELS = {
|
|
21
|
+
// GPT-5
|
|
22
|
+
GPT_5_2: "gpt-5.2",
|
|
23
|
+
GPT_5_1: "gpt-5.1",
|
|
24
|
+
GPT_5: "gpt-5",
|
|
25
|
+
GPT_5_MINI: "gpt-5-mini",
|
|
26
|
+
GPT_5_NANO: "gpt-5-nano",
|
|
27
|
+
GPT_5_2_PRO: "gpt-5.2-pro",
|
|
28
|
+
GPT_5_PRO: "gpt-5-pro",
|
|
29
|
+
GPT_5_2_CHAT_LATEST: "gpt-5.2-chat-latest",
|
|
30
|
+
GPT_5_1_CHAT_LATEST: "gpt-5.1-chat-latest",
|
|
31
|
+
GPT_5_CHAT_LATEST: "gpt-5-chat-latest",
|
|
32
|
+
GPT_5_1_CODEX_MAX: "gpt-5.1-codex-max",
|
|
33
|
+
GPT_5_1_CODEX: "gpt-5.1-codex",
|
|
34
|
+
GPT_5_CODEX: "gpt-5-codex",
|
|
35
|
+
GPT_5_1_CODEX_MINI: "gpt-5.1-codex-mini",
|
|
36
|
+
GPT_5_SEARCH_API: "gpt-5-search-api",
|
|
37
|
+
// GPT-4.1
|
|
38
|
+
GPT_4_1: "gpt-4.1",
|
|
39
|
+
GPT_4_1_MINI: "gpt-4.1-mini",
|
|
40
|
+
GPT_4_1_NANO: "gpt-4.1-nano",
|
|
41
|
+
// GPT-4o
|
|
21
42
|
GPT_4o: "gpt-4o",
|
|
22
43
|
GPT_4o_2024_08_06: "gpt-4o-2024-08-06",
|
|
44
|
+
GPT_4o_2024_05_13: "gpt-4o-2024-05-13",
|
|
23
45
|
GPT_4o_MINI: "gpt-4o-mini",
|
|
24
46
|
GPT_4o_MINI_2024_07_18: "gpt-4o-mini-2024-07-18",
|
|
47
|
+
GPT_4o_SEARCH_PREVIEW: "gpt-4o-search-preview",
|
|
48
|
+
GPT_4o_MINI_SEARCH_PREVIEW: "gpt-4o-mini-search-preview",
|
|
49
|
+
// Reasoning Models (o-series)
|
|
50
|
+
O1: "o1",
|
|
51
|
+
O1_PRO: "o1-pro",
|
|
52
|
+
O1_MINI: "o1-mini",
|
|
53
|
+
O3: "o3",
|
|
54
|
+
O3_PRO: "o3-pro",
|
|
55
|
+
O3_MINI: "o3-mini",
|
|
56
|
+
O3_DEEP_RESEARCH: "o3-deep-research",
|
|
57
|
+
O4_MINI: "o4-mini",
|
|
58
|
+
O4_MINI_DEEP_RESEARCH: "o4-mini-deep-research",
|
|
59
|
+
// Realtime & Audio
|
|
60
|
+
GPT_REALTIME: "gpt-realtime",
|
|
61
|
+
GPT_REALTIME_MINI: "gpt-realtime-mini",
|
|
62
|
+
GPT_4o_REALTIME_PREVIEW: "gpt-4o-realtime-preview",
|
|
63
|
+
GPT_4o_MINI_REALTIME_PREVIEW: "gpt-4o-mini-realtime-preview",
|
|
64
|
+
GPT_AUDIO: "gpt-audio",
|
|
65
|
+
GPT_AUDIO_MINI: "gpt-audio-mini",
|
|
66
|
+
GPT_4o_AUDIO_PREVIEW: "gpt-4o-audio-preview",
|
|
67
|
+
GPT_4o_MINI_AUDIO_PREVIEW: "gpt-4o-mini-audio-preview",
|
|
68
|
+
// Legacy / GPT-4 & 3.5
|
|
25
69
|
GPT_4_TURBO: "gpt-4-turbo",
|
|
26
70
|
GPT_4: "gpt-4",
|
|
27
71
|
GPT_3_5_TURBO: "gpt-3.5-turbo",
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
72
|
+
GPT_3_5_TURBO_INSTRUCT: "gpt-3.5-turbo-instruct",
|
|
73
|
+
// Specialized Preview
|
|
74
|
+
COMPUTER_USE_PREVIEW: "computer-use-preview"
|
|
31
75
|
};
|
|
32
76
|
var isStructuredOutputSupported = (model) => {
|
|
33
77
|
if (model.startsWith("gpt-4o-mini")) return true;
|
|
34
|
-
if (model === "gpt-4o") return true;
|
|
35
78
|
if (model.startsWith("gpt-4o-2024-08-06")) return true;
|
|
36
|
-
if (model
|
|
79
|
+
if (model === "gpt-4o") return true;
|
|
80
|
+
if (model.startsWith("gpt-5")) return true;
|
|
81
|
+
if (model.startsWith("gpt-4.1")) return true;
|
|
82
|
+
if (model.startsWith("o1")) return true;
|
|
83
|
+
if (model.startsWith("o3")) return true;
|
|
84
|
+
if (model.startsWith("o4")) return true;
|
|
37
85
|
return false;
|
|
38
86
|
};
|
|
39
87
|
|
|
@@ -45,6 +93,16 @@ var CHAT_GPT_PRICING = {
|
|
|
45
93
|
"gpt-5": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
46
94
|
"gpt-5-mini": { input: 0.25, cachedInput: 0.025, output: 2 },
|
|
47
95
|
"gpt-5-nano": { input: 0.05, cachedInput: 5e-3, output: 0.4 },
|
|
96
|
+
"gpt-5.2-pro": { input: 21, output: 168 },
|
|
97
|
+
"gpt-5-pro": { input: 15, output: 120 },
|
|
98
|
+
"gpt-5.2-chat-latest": { input: 1.75, cachedInput: 0.175, output: 14 },
|
|
99
|
+
"gpt-5.1-chat-latest": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
100
|
+
"gpt-5-chat-latest": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
101
|
+
"gpt-5.1-codex-max": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
102
|
+
"gpt-5.1-codex": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
103
|
+
"gpt-5-codex": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
104
|
+
"gpt-5.1-codex-mini": { input: 0.25, cachedInput: 0.025, output: 2 },
|
|
105
|
+
"gpt-5-search-api": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
48
106
|
// GPT-4.1
|
|
49
107
|
"gpt-4.1": { input: 2, cachedInput: 0.5, output: 8 },
|
|
50
108
|
"gpt-4.1-mini": { input: 0.4, cachedInput: 0.1, output: 1.6 },
|
|
@@ -55,17 +113,64 @@ var CHAT_GPT_PRICING = {
|
|
|
55
113
|
"gpt-4o-2024-08-06": { input: 2.5, cachedInput: 1.25, output: 10 },
|
|
56
114
|
"gpt-4o-mini": { input: 0.15, cachedInput: 0.075, output: 0.6 },
|
|
57
115
|
"gpt-4o-mini-2024-07-18": { input: 0.15, cachedInput: 0.075, output: 0.6 },
|
|
58
|
-
|
|
116
|
+
"gpt-4o-mini-search-preview": { input: 0.15, output: 0.6 },
|
|
117
|
+
"gpt-4o-search-preview": { input: 2.5, output: 10 },
|
|
118
|
+
// Reasoning Models (o-series)
|
|
59
119
|
o1: { input: 15, cachedInput: 7.5, output: 60 },
|
|
120
|
+
"o1-pro": { input: 150, output: 600 },
|
|
60
121
|
"o1-mini": { input: 1.1, cachedInput: 0.55, output: 4.4 },
|
|
61
122
|
o3: { input: 2, cachedInput: 0.5, output: 8 },
|
|
123
|
+
"o3-pro": { input: 20, output: 80 },
|
|
62
124
|
"o3-mini": { input: 1.1, cachedInput: 0.55, output: 4.4 },
|
|
125
|
+
"o3-deep-research": { input: 10, cachedInput: 2.5, output: 40 },
|
|
63
126
|
"o4-mini": { input: 1.1, cachedInput: 0.275, output: 4.4 },
|
|
64
|
-
|
|
127
|
+
"o4-mini-deep-research": { input: 2, cachedInput: 0.5, output: 8 },
|
|
128
|
+
// Realtime & Audio
|
|
129
|
+
"gpt-realtime": { input: 4, cachedInput: 0.4, output: 16 },
|
|
130
|
+
"gpt-realtime-mini": { input: 0.6, cachedInput: 0.06, output: 2.4 },
|
|
131
|
+
"gpt-4o-realtime-preview": { input: 5, cachedInput: 2.5, output: 20 },
|
|
132
|
+
"gpt-4o-mini-realtime-preview": { input: 0.6, cachedInput: 0.3, output: 2.4 },
|
|
133
|
+
"gpt-audio": { input: 2.5, output: 10 },
|
|
134
|
+
"gpt-audio-mini": { input: 0.6, output: 2.4 },
|
|
135
|
+
"gpt-4o-audio-preview": { input: 2.5, output: 10 },
|
|
136
|
+
"gpt-4o-mini-audio-preview": { input: 0.15, output: 0.6 },
|
|
137
|
+
// Legacy / GPT-4 & 3.5
|
|
65
138
|
"gpt-4-turbo": { input: 10, output: 30 },
|
|
66
139
|
"gpt-4-turbo-2024-04-09": { input: 10, output: 30 },
|
|
67
140
|
"gpt-4": { input: 30, output: 60 },
|
|
68
|
-
"gpt-3.5-turbo": { input: 0.5, output: 1.5 }
|
|
141
|
+
"gpt-3.5-turbo": { input: 0.5, output: 1.5 },
|
|
142
|
+
"gpt-3.5-turbo-instruct": { input: 1.5, output: 2 },
|
|
143
|
+
// Specialized Preview
|
|
144
|
+
"computer-use-preview": { input: 3, output: 12 }
|
|
145
|
+
};
|
|
146
|
+
var IMAGE_PRICING = {
|
|
147
|
+
"dall-e-3": {
|
|
148
|
+
standard: {
|
|
149
|
+
"1024x1024": 0.04,
|
|
150
|
+
"1024x1792": 0.08,
|
|
151
|
+
"1792x1024": 0.08
|
|
152
|
+
},
|
|
153
|
+
hd: {
|
|
154
|
+
"1024x1024": 0.08,
|
|
155
|
+
"1024x1792": 0.12,
|
|
156
|
+
"1792x1024": 0.12
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
"dall-e-2": {
|
|
160
|
+
standard: {
|
|
161
|
+
"1024x1024": 0.02,
|
|
162
|
+
"512x512": 0.018,
|
|
163
|
+
"256x256": 0.016
|
|
164
|
+
},
|
|
165
|
+
hd: {}
|
|
166
|
+
// no hd for dall-e-2
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
var SPEECH_PRICING = {
|
|
170
|
+
tts: 15 / 1e6,
|
|
171
|
+
// per character
|
|
172
|
+
"tts-hd": 30 / 1e6
|
|
173
|
+
// per character
|
|
69
174
|
};
|
|
70
175
|
var calculatePrice = (model, usage) => {
|
|
71
176
|
if (!usage) return void 0;
|
|
@@ -84,6 +189,31 @@ var calculatePrice = (model, usage) => {
|
|
|
84
189
|
currency: "USD"
|
|
85
190
|
};
|
|
86
191
|
};
|
|
192
|
+
var calculateImagePrice = (model, size = "1024x1024", quality = "standard", n = 1) => {
|
|
193
|
+
const pricing = IMAGE_PRICING[model];
|
|
194
|
+
if (!pricing) return void 0;
|
|
195
|
+
const unitPrice = quality === "hd" ? pricing.hd[size] : pricing.standard[size];
|
|
196
|
+
if (unitPrice === void 0) return void 0;
|
|
197
|
+
const total = unitPrice * n;
|
|
198
|
+
return {
|
|
199
|
+
total: Number(total.toFixed(6)),
|
|
200
|
+
inputCost: 0,
|
|
201
|
+
outputCost: total,
|
|
202
|
+
currency: "USD"
|
|
203
|
+
};
|
|
204
|
+
};
|
|
205
|
+
var calculateSpeechPrice = (model, inputLength) => {
|
|
206
|
+
const priceKey = model.includes("hd") ? "tts-hd" : "tts";
|
|
207
|
+
const rate = SPEECH_PRICING[priceKey];
|
|
208
|
+
if (!rate) return void 0;
|
|
209
|
+
const total = inputLength * rate;
|
|
210
|
+
return {
|
|
211
|
+
total: Number(total.toFixed(6)),
|
|
212
|
+
inputCost: 0,
|
|
213
|
+
outputCost: total,
|
|
214
|
+
currency: "USD"
|
|
215
|
+
};
|
|
216
|
+
};
|
|
87
217
|
|
|
88
218
|
// src/operations/create-chat-completion.ts
|
|
89
219
|
var createChatCompletion = (ctx) => async (input) => {
|
|
@@ -134,21 +264,79 @@ var createChatCompletion = (ctx) => async (input) => {
|
|
|
134
264
|
}
|
|
135
265
|
};
|
|
136
266
|
|
|
267
|
+
// src/operations/create-image.ts
|
|
268
|
+
var createImage = (ctx) => async (input) => {
|
|
269
|
+
const { client, logger } = ctx;
|
|
270
|
+
const model = input.model || "dall-e-3";
|
|
271
|
+
const mergedInput = {
|
|
272
|
+
...input,
|
|
273
|
+
model
|
|
274
|
+
};
|
|
275
|
+
logger?.debug("chat-gpt:createImage:start", { data: mergedInput });
|
|
276
|
+
try {
|
|
277
|
+
const response = await client.images.generate(mergedInput);
|
|
278
|
+
const price = calculateImagePrice(model, input.size, input.quality, input.n);
|
|
279
|
+
const output = {
|
|
280
|
+
created: response.created,
|
|
281
|
+
data: response.data,
|
|
282
|
+
price
|
|
283
|
+
};
|
|
284
|
+
logger?.debug("chat-gpt:createImage:success", { data: output });
|
|
285
|
+
return output;
|
|
286
|
+
} catch (error) {
|
|
287
|
+
logger?.debug("chat-gpt:createImage:error", { error });
|
|
288
|
+
throw error;
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
// src/operations/create-speech.ts
|
|
293
|
+
var createSpeech = (ctx) => async (input) => {
|
|
294
|
+
const { client, logger } = ctx;
|
|
295
|
+
const model = input.model || "tts-1";
|
|
296
|
+
const mergedInput = {
|
|
297
|
+
...input,
|
|
298
|
+
model
|
|
299
|
+
};
|
|
300
|
+
logger?.debug("chat-gpt:createSpeech:start", { data: mergedInput });
|
|
301
|
+
try {
|
|
302
|
+
const response = await client.audio.speech.create(mergedInput);
|
|
303
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
304
|
+
const price = calculateSpeechPrice(model, input.input.length);
|
|
305
|
+
const output = {
|
|
306
|
+
data: buffer,
|
|
307
|
+
price
|
|
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
|
+
|
|
137
317
|
// src/adapter.ts
|
|
138
318
|
var createAdapter = (config, logger) => {
|
|
139
319
|
const client = createChatGptClient(config);
|
|
140
320
|
const context = { client, logger, defaults: config.defaults };
|
|
141
321
|
return {
|
|
142
|
-
createChatCompletion: createChatCompletion(context)
|
|
322
|
+
createChatCompletion: createChatCompletion(context),
|
|
323
|
+
createImage: createImage(context),
|
|
324
|
+
createSpeech: createSpeech(context)
|
|
143
325
|
};
|
|
144
326
|
};
|
|
145
327
|
|
|
146
328
|
exports.CHAT_GPT_MODELS = CHAT_GPT_MODELS;
|
|
147
329
|
exports.CHAT_GPT_PRICING = CHAT_GPT_PRICING;
|
|
330
|
+
exports.IMAGE_PRICING = IMAGE_PRICING;
|
|
331
|
+
exports.SPEECH_PRICING = SPEECH_PRICING;
|
|
332
|
+
exports.calculateImagePrice = calculateImagePrice;
|
|
148
333
|
exports.calculatePrice = calculatePrice;
|
|
334
|
+
exports.calculateSpeechPrice = calculateSpeechPrice;
|
|
149
335
|
exports.createAdapter = createAdapter;
|
|
150
336
|
exports.createChatCompletion = createChatCompletion;
|
|
151
337
|
exports.createChatGptClient = createChatGptClient;
|
|
338
|
+
exports.createImage = createImage;
|
|
339
|
+
exports.createSpeech = createSpeech;
|
|
152
340
|
exports.isStructuredOutputSupported = isStructuredOutputSupported;
|
|
153
341
|
//# sourceMappingURL=index.js.map
|
|
154
342
|
//# 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_4o: 'gpt-4o',\n GPT_4o_2024_08_06: 'gpt-4o-2024-08-06',\n GPT_4o_MINI: 'gpt-4o-mini',\n GPT_4o_MINI_2024_07_18: 'gpt-4o-mini-2024-07-18',\n GPT_4_TURBO: 'gpt-4-turbo',\n GPT_4: 'gpt-4',\n GPT_3_5_TURBO: 'gpt-3.5-turbo',\n O1: 'o1',\n O1_MINI: 'o1-mini',\n O3_MINI: 'o3-mini',\n} as const;\n\nexport type ChatGptModel = (typeof CHAT_GPT_MODELS)[keyof typeof CHAT_GPT_MODELS];\n\nexport const isStructuredOutputSupported = (model: string): boolean => {\n const supportedPrefixes = ['gpt-4o', 'gpt-4o-mini', 'o1']; // o1 supposedly supports it in some versions soon, but for now gpt-4o is the main one.\n // Actually per docs: gpt-4o-mini, gpt-4o-2024-08-06 and later.\n\n if (model.startsWith('gpt-4o-mini')) return true;\n if (model === 'gpt-4o') return true;\n if (model.startsWith('gpt-4o-2024-08-06')) return true;\n if (model.includes('2024-08-06')) return true; // safety for other snapshots\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\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\n // Reasoning Models\n o1: { input: 15.0, cachedInput: 7.5, output: 60.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-mini': { input: 1.1, cachedInput: 0.55, output: 4.4 },\n 'o4-mini': { input: 1.1, cachedInput: 0.275, output: 4.4 },\n\n // Legacy/Other\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};\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} 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 } 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 };\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 };\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
|
@@ -12,22 +12,70 @@ var createChatGptClient = (config) => {
|
|
|
12
12
|
|
|
13
13
|
// src/models.ts
|
|
14
14
|
var CHAT_GPT_MODELS = {
|
|
15
|
+
// GPT-5
|
|
16
|
+
GPT_5_2: "gpt-5.2",
|
|
17
|
+
GPT_5_1: "gpt-5.1",
|
|
18
|
+
GPT_5: "gpt-5",
|
|
19
|
+
GPT_5_MINI: "gpt-5-mini",
|
|
20
|
+
GPT_5_NANO: "gpt-5-nano",
|
|
21
|
+
GPT_5_2_PRO: "gpt-5.2-pro",
|
|
22
|
+
GPT_5_PRO: "gpt-5-pro",
|
|
23
|
+
GPT_5_2_CHAT_LATEST: "gpt-5.2-chat-latest",
|
|
24
|
+
GPT_5_1_CHAT_LATEST: "gpt-5.1-chat-latest",
|
|
25
|
+
GPT_5_CHAT_LATEST: "gpt-5-chat-latest",
|
|
26
|
+
GPT_5_1_CODEX_MAX: "gpt-5.1-codex-max",
|
|
27
|
+
GPT_5_1_CODEX: "gpt-5.1-codex",
|
|
28
|
+
GPT_5_CODEX: "gpt-5-codex",
|
|
29
|
+
GPT_5_1_CODEX_MINI: "gpt-5.1-codex-mini",
|
|
30
|
+
GPT_5_SEARCH_API: "gpt-5-search-api",
|
|
31
|
+
// GPT-4.1
|
|
32
|
+
GPT_4_1: "gpt-4.1",
|
|
33
|
+
GPT_4_1_MINI: "gpt-4.1-mini",
|
|
34
|
+
GPT_4_1_NANO: "gpt-4.1-nano",
|
|
35
|
+
// GPT-4o
|
|
15
36
|
GPT_4o: "gpt-4o",
|
|
16
37
|
GPT_4o_2024_08_06: "gpt-4o-2024-08-06",
|
|
38
|
+
GPT_4o_2024_05_13: "gpt-4o-2024-05-13",
|
|
17
39
|
GPT_4o_MINI: "gpt-4o-mini",
|
|
18
40
|
GPT_4o_MINI_2024_07_18: "gpt-4o-mini-2024-07-18",
|
|
41
|
+
GPT_4o_SEARCH_PREVIEW: "gpt-4o-search-preview",
|
|
42
|
+
GPT_4o_MINI_SEARCH_PREVIEW: "gpt-4o-mini-search-preview",
|
|
43
|
+
// Reasoning Models (o-series)
|
|
44
|
+
O1: "o1",
|
|
45
|
+
O1_PRO: "o1-pro",
|
|
46
|
+
O1_MINI: "o1-mini",
|
|
47
|
+
O3: "o3",
|
|
48
|
+
O3_PRO: "o3-pro",
|
|
49
|
+
O3_MINI: "o3-mini",
|
|
50
|
+
O3_DEEP_RESEARCH: "o3-deep-research",
|
|
51
|
+
O4_MINI: "o4-mini",
|
|
52
|
+
O4_MINI_DEEP_RESEARCH: "o4-mini-deep-research",
|
|
53
|
+
// Realtime & Audio
|
|
54
|
+
GPT_REALTIME: "gpt-realtime",
|
|
55
|
+
GPT_REALTIME_MINI: "gpt-realtime-mini",
|
|
56
|
+
GPT_4o_REALTIME_PREVIEW: "gpt-4o-realtime-preview",
|
|
57
|
+
GPT_4o_MINI_REALTIME_PREVIEW: "gpt-4o-mini-realtime-preview",
|
|
58
|
+
GPT_AUDIO: "gpt-audio",
|
|
59
|
+
GPT_AUDIO_MINI: "gpt-audio-mini",
|
|
60
|
+
GPT_4o_AUDIO_PREVIEW: "gpt-4o-audio-preview",
|
|
61
|
+
GPT_4o_MINI_AUDIO_PREVIEW: "gpt-4o-mini-audio-preview",
|
|
62
|
+
// Legacy / GPT-4 & 3.5
|
|
19
63
|
GPT_4_TURBO: "gpt-4-turbo",
|
|
20
64
|
GPT_4: "gpt-4",
|
|
21
65
|
GPT_3_5_TURBO: "gpt-3.5-turbo",
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
66
|
+
GPT_3_5_TURBO_INSTRUCT: "gpt-3.5-turbo-instruct",
|
|
67
|
+
// Specialized Preview
|
|
68
|
+
COMPUTER_USE_PREVIEW: "computer-use-preview"
|
|
25
69
|
};
|
|
26
70
|
var isStructuredOutputSupported = (model) => {
|
|
27
71
|
if (model.startsWith("gpt-4o-mini")) return true;
|
|
28
|
-
if (model === "gpt-4o") return true;
|
|
29
72
|
if (model.startsWith("gpt-4o-2024-08-06")) return true;
|
|
30
|
-
if (model
|
|
73
|
+
if (model === "gpt-4o") return true;
|
|
74
|
+
if (model.startsWith("gpt-5")) return true;
|
|
75
|
+
if (model.startsWith("gpt-4.1")) return true;
|
|
76
|
+
if (model.startsWith("o1")) return true;
|
|
77
|
+
if (model.startsWith("o3")) return true;
|
|
78
|
+
if (model.startsWith("o4")) return true;
|
|
31
79
|
return false;
|
|
32
80
|
};
|
|
33
81
|
|
|
@@ -39,6 +87,16 @@ var CHAT_GPT_PRICING = {
|
|
|
39
87
|
"gpt-5": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
40
88
|
"gpt-5-mini": { input: 0.25, cachedInput: 0.025, output: 2 },
|
|
41
89
|
"gpt-5-nano": { input: 0.05, cachedInput: 5e-3, output: 0.4 },
|
|
90
|
+
"gpt-5.2-pro": { input: 21, output: 168 },
|
|
91
|
+
"gpt-5-pro": { input: 15, output: 120 },
|
|
92
|
+
"gpt-5.2-chat-latest": { input: 1.75, cachedInput: 0.175, output: 14 },
|
|
93
|
+
"gpt-5.1-chat-latest": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
94
|
+
"gpt-5-chat-latest": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
95
|
+
"gpt-5.1-codex-max": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
96
|
+
"gpt-5.1-codex": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
97
|
+
"gpt-5-codex": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
98
|
+
"gpt-5.1-codex-mini": { input: 0.25, cachedInput: 0.025, output: 2 },
|
|
99
|
+
"gpt-5-search-api": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
42
100
|
// GPT-4.1
|
|
43
101
|
"gpt-4.1": { input: 2, cachedInput: 0.5, output: 8 },
|
|
44
102
|
"gpt-4.1-mini": { input: 0.4, cachedInput: 0.1, output: 1.6 },
|
|
@@ -49,17 +107,64 @@ var CHAT_GPT_PRICING = {
|
|
|
49
107
|
"gpt-4o-2024-08-06": { input: 2.5, cachedInput: 1.25, output: 10 },
|
|
50
108
|
"gpt-4o-mini": { input: 0.15, cachedInput: 0.075, output: 0.6 },
|
|
51
109
|
"gpt-4o-mini-2024-07-18": { input: 0.15, cachedInput: 0.075, output: 0.6 },
|
|
52
|
-
|
|
110
|
+
"gpt-4o-mini-search-preview": { input: 0.15, output: 0.6 },
|
|
111
|
+
"gpt-4o-search-preview": { input: 2.5, output: 10 },
|
|
112
|
+
// Reasoning Models (o-series)
|
|
53
113
|
o1: { input: 15, cachedInput: 7.5, output: 60 },
|
|
114
|
+
"o1-pro": { input: 150, output: 600 },
|
|
54
115
|
"o1-mini": { input: 1.1, cachedInput: 0.55, output: 4.4 },
|
|
55
116
|
o3: { input: 2, cachedInput: 0.5, output: 8 },
|
|
117
|
+
"o3-pro": { input: 20, output: 80 },
|
|
56
118
|
"o3-mini": { input: 1.1, cachedInput: 0.55, output: 4.4 },
|
|
119
|
+
"o3-deep-research": { input: 10, cachedInput: 2.5, output: 40 },
|
|
57
120
|
"o4-mini": { input: 1.1, cachedInput: 0.275, output: 4.4 },
|
|
58
|
-
|
|
121
|
+
"o4-mini-deep-research": { input: 2, cachedInput: 0.5, output: 8 },
|
|
122
|
+
// Realtime & Audio
|
|
123
|
+
"gpt-realtime": { input: 4, cachedInput: 0.4, output: 16 },
|
|
124
|
+
"gpt-realtime-mini": { input: 0.6, cachedInput: 0.06, output: 2.4 },
|
|
125
|
+
"gpt-4o-realtime-preview": { input: 5, cachedInput: 2.5, output: 20 },
|
|
126
|
+
"gpt-4o-mini-realtime-preview": { input: 0.6, cachedInput: 0.3, output: 2.4 },
|
|
127
|
+
"gpt-audio": { input: 2.5, output: 10 },
|
|
128
|
+
"gpt-audio-mini": { input: 0.6, output: 2.4 },
|
|
129
|
+
"gpt-4o-audio-preview": { input: 2.5, output: 10 },
|
|
130
|
+
"gpt-4o-mini-audio-preview": { input: 0.15, output: 0.6 },
|
|
131
|
+
// Legacy / GPT-4 & 3.5
|
|
59
132
|
"gpt-4-turbo": { input: 10, output: 30 },
|
|
60
133
|
"gpt-4-turbo-2024-04-09": { input: 10, output: 30 },
|
|
61
134
|
"gpt-4": { input: 30, output: 60 },
|
|
62
|
-
"gpt-3.5-turbo": { input: 0.5, output: 1.5 }
|
|
135
|
+
"gpt-3.5-turbo": { input: 0.5, output: 1.5 },
|
|
136
|
+
"gpt-3.5-turbo-instruct": { input: 1.5, output: 2 },
|
|
137
|
+
// Specialized Preview
|
|
138
|
+
"computer-use-preview": { input: 3, output: 12 }
|
|
139
|
+
};
|
|
140
|
+
var IMAGE_PRICING = {
|
|
141
|
+
"dall-e-3": {
|
|
142
|
+
standard: {
|
|
143
|
+
"1024x1024": 0.04,
|
|
144
|
+
"1024x1792": 0.08,
|
|
145
|
+
"1792x1024": 0.08
|
|
146
|
+
},
|
|
147
|
+
hd: {
|
|
148
|
+
"1024x1024": 0.08,
|
|
149
|
+
"1024x1792": 0.12,
|
|
150
|
+
"1792x1024": 0.12
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
"dall-e-2": {
|
|
154
|
+
standard: {
|
|
155
|
+
"1024x1024": 0.02,
|
|
156
|
+
"512x512": 0.018,
|
|
157
|
+
"256x256": 0.016
|
|
158
|
+
},
|
|
159
|
+
hd: {}
|
|
160
|
+
// no hd for dall-e-2
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
var SPEECH_PRICING = {
|
|
164
|
+
tts: 15 / 1e6,
|
|
165
|
+
// per character
|
|
166
|
+
"tts-hd": 30 / 1e6
|
|
167
|
+
// per character
|
|
63
168
|
};
|
|
64
169
|
var calculatePrice = (model, usage) => {
|
|
65
170
|
if (!usage) return void 0;
|
|
@@ -78,6 +183,31 @@ var calculatePrice = (model, usage) => {
|
|
|
78
183
|
currency: "USD"
|
|
79
184
|
};
|
|
80
185
|
};
|
|
186
|
+
var calculateImagePrice = (model, size = "1024x1024", quality = "standard", n = 1) => {
|
|
187
|
+
const pricing = IMAGE_PRICING[model];
|
|
188
|
+
if (!pricing) return void 0;
|
|
189
|
+
const unitPrice = quality === "hd" ? pricing.hd[size] : pricing.standard[size];
|
|
190
|
+
if (unitPrice === void 0) return void 0;
|
|
191
|
+
const total = unitPrice * n;
|
|
192
|
+
return {
|
|
193
|
+
total: Number(total.toFixed(6)),
|
|
194
|
+
inputCost: 0,
|
|
195
|
+
outputCost: total,
|
|
196
|
+
currency: "USD"
|
|
197
|
+
};
|
|
198
|
+
};
|
|
199
|
+
var calculateSpeechPrice = (model, inputLength) => {
|
|
200
|
+
const priceKey = model.includes("hd") ? "tts-hd" : "tts";
|
|
201
|
+
const rate = SPEECH_PRICING[priceKey];
|
|
202
|
+
if (!rate) return void 0;
|
|
203
|
+
const total = inputLength * rate;
|
|
204
|
+
return {
|
|
205
|
+
total: Number(total.toFixed(6)),
|
|
206
|
+
inputCost: 0,
|
|
207
|
+
outputCost: total,
|
|
208
|
+
currency: "USD"
|
|
209
|
+
};
|
|
210
|
+
};
|
|
81
211
|
|
|
82
212
|
// src/operations/create-chat-completion.ts
|
|
83
213
|
var createChatCompletion = (ctx) => async (input) => {
|
|
@@ -128,15 +258,67 @@ var createChatCompletion = (ctx) => async (input) => {
|
|
|
128
258
|
}
|
|
129
259
|
};
|
|
130
260
|
|
|
261
|
+
// src/operations/create-image.ts
|
|
262
|
+
var createImage = (ctx) => async (input) => {
|
|
263
|
+
const { client, logger } = ctx;
|
|
264
|
+
const model = input.model || "dall-e-3";
|
|
265
|
+
const mergedInput = {
|
|
266
|
+
...input,
|
|
267
|
+
model
|
|
268
|
+
};
|
|
269
|
+
logger?.debug("chat-gpt:createImage:start", { data: mergedInput });
|
|
270
|
+
try {
|
|
271
|
+
const response = await client.images.generate(mergedInput);
|
|
272
|
+
const price = calculateImagePrice(model, input.size, input.quality, input.n);
|
|
273
|
+
const output = {
|
|
274
|
+
created: response.created,
|
|
275
|
+
data: response.data,
|
|
276
|
+
price
|
|
277
|
+
};
|
|
278
|
+
logger?.debug("chat-gpt:createImage:success", { data: output });
|
|
279
|
+
return output;
|
|
280
|
+
} catch (error) {
|
|
281
|
+
logger?.debug("chat-gpt:createImage:error", { error });
|
|
282
|
+
throw error;
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
// src/operations/create-speech.ts
|
|
287
|
+
var createSpeech = (ctx) => async (input) => {
|
|
288
|
+
const { client, logger } = ctx;
|
|
289
|
+
const model = input.model || "tts-1";
|
|
290
|
+
const mergedInput = {
|
|
291
|
+
...input,
|
|
292
|
+
model
|
|
293
|
+
};
|
|
294
|
+
logger?.debug("chat-gpt:createSpeech:start", { data: mergedInput });
|
|
295
|
+
try {
|
|
296
|
+
const response = await client.audio.speech.create(mergedInput);
|
|
297
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
298
|
+
const price = calculateSpeechPrice(model, input.input.length);
|
|
299
|
+
const output = {
|
|
300
|
+
data: buffer,
|
|
301
|
+
price
|
|
302
|
+
};
|
|
303
|
+
logger?.debug("chat-gpt:createSpeech:success", { data: { price } });
|
|
304
|
+
return output;
|
|
305
|
+
} catch (error) {
|
|
306
|
+
logger?.debug("chat-gpt:createSpeech:error", { error });
|
|
307
|
+
throw error;
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
|
|
131
311
|
// src/adapter.ts
|
|
132
312
|
var createAdapter = (config, logger) => {
|
|
133
313
|
const client = createChatGptClient(config);
|
|
134
314
|
const context = { client, logger, defaults: config.defaults };
|
|
135
315
|
return {
|
|
136
|
-
createChatCompletion: createChatCompletion(context)
|
|
316
|
+
createChatCompletion: createChatCompletion(context),
|
|
317
|
+
createImage: createImage(context),
|
|
318
|
+
createSpeech: createSpeech(context)
|
|
137
319
|
};
|
|
138
320
|
};
|
|
139
321
|
|
|
140
|
-
export { CHAT_GPT_MODELS, CHAT_GPT_PRICING, calculatePrice, createAdapter, createChatCompletion, createChatGptClient, isStructuredOutputSupported };
|
|
322
|
+
export { CHAT_GPT_MODELS, CHAT_GPT_PRICING, IMAGE_PRICING, SPEECH_PRICING, calculateImagePrice, calculatePrice, calculateSpeechPrice, createAdapter, createChatCompletion, createChatGptClient, createImage, createSpeech, isStructuredOutputSupported };
|
|
141
323
|
//# sourceMappingURL=index.mjs.map
|
|
142
324
|
//# 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":"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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_4o: 'gpt-4o',\n GPT_4o_2024_08_06: 'gpt-4o-2024-08-06',\n GPT_4o_MINI: 'gpt-4o-mini',\n GPT_4o_MINI_2024_07_18: 'gpt-4o-mini-2024-07-18',\n GPT_4_TURBO: 'gpt-4-turbo',\n GPT_4: 'gpt-4',\n GPT_3_5_TURBO: 'gpt-3.5-turbo',\n O1: 'o1',\n O1_MINI: 'o1-mini',\n O3_MINI: 'o3-mini',\n} as const;\n\nexport type ChatGptModel = (typeof CHAT_GPT_MODELS)[keyof typeof CHAT_GPT_MODELS];\n\nexport const isStructuredOutputSupported = (model: string): boolean => {\n const supportedPrefixes = ['gpt-4o', 'gpt-4o-mini', 'o1']; // o1 supposedly supports it in some versions soon, but for now gpt-4o is the main one.\n // Actually per docs: gpt-4o-mini, gpt-4o-2024-08-06 and later.\n\n if (model.startsWith('gpt-4o-mini')) return true;\n if (model === 'gpt-4o') return true;\n if (model.startsWith('gpt-4o-2024-08-06')) return true;\n if (model.includes('2024-08-06')) return true; // safety for other snapshots\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\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\n // Reasoning Models\n o1: { input: 15.0, cachedInput: 7.5, output: 60.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-mini': { input: 1.1, cachedInput: 0.55, output: 4.4 },\n 'o4-mini': { input: 1.1, cachedInput: 0.275, output: 4.4 },\n\n // Legacy/Other\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};\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} 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 } 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 };\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 };\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"]}
|