@animalabs/membrane 0.5.50 → 0.5.52
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/context/index.d.ts +12 -0
- package/dist/context/index.js +11 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/process.d.ts +43 -0
- package/dist/context/process.js +381 -0
- package/dist/context/process.js.map +1 -0
- package/dist/context/types.d.ts +164 -0
- package/dist/context/types.js +61 -0
- package/dist/context/types.js.map +1 -0
- package/dist/formatters/anthropic-xml.d.ts +63 -0
- package/dist/formatters/anthropic-xml.js +417 -0
- package/dist/formatters/anthropic-xml.js.map +1 -0
- package/dist/formatters/completions.d.ts +68 -0
- package/dist/formatters/completions.js +261 -0
- package/dist/formatters/completions.js.map +1 -0
- package/dist/formatters/index.d.ts +8 -0
- package/dist/formatters/index.js +7 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/native.d.ts +35 -0
- package/dist/formatters/native.js +336 -0
- package/dist/formatters/native.js.map +1 -0
- package/dist/formatters/types.d.ts +167 -0
- package/dist/formatters/types.js +7 -0
- package/dist/formatters/types.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/membrane.d.ts +155 -0
- package/dist/providers/anthropic.d.ts +36 -0
- package/dist/providers/bedrock.d.ts +43 -0
- package/dist/providers/gemini.d.ts +68 -0
- package/dist/providers/gemini.js +538 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +13 -0
- package/dist/providers/index.js +13 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/mock.d.ts +90 -0
- package/dist/providers/mock.d.ts.map +1 -0
- package/dist/providers/mock.js +210 -0
- package/dist/providers/mock.js.map +1 -0
- package/dist/providers/openai-compatible.d.ts +82 -0
- package/dist/providers/openai-compatible.js +480 -0
- package/dist/providers/openai-compatible.js.map +1 -0
- package/dist/providers/openai-completions.d.ts +89 -0
- package/dist/providers/openai-completions.js +347 -0
- package/dist/providers/openai-completions.js.map +1 -0
- package/dist/providers/openai-responses.d.ts +77 -0
- package/dist/providers/openai-responses.js +333 -0
- package/dist/providers/openai-responses.js.map +1 -0
- package/dist/providers/openai.d.ts +77 -0
- package/dist/providers/openai.js +533 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/openrouter.d.ts +82 -0
- package/dist/providers/openrouter.js +556 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/providers/utils.d.ts +44 -0
- package/dist/providers/utils.d.ts.map +1 -0
- package/dist/providers/utils.js +100 -0
- package/dist/providers/utils.js.map +1 -0
- package/dist/registry/default-pricing.d.ts +3 -0
- package/dist/registry/default-pricing.d.ts.map +1 -0
- package/dist/registry/default-pricing.js +75 -0
- package/dist/registry/default-pricing.js.map +1 -0
- package/dist/transforms/chat.d.ts +52 -0
- package/dist/transforms/chat.js +136 -0
- package/dist/transforms/chat.js.map +1 -0
- package/dist/transforms/index.d.ts +5 -0
- package/dist/transforms/index.js +7 -0
- package/dist/transforms/index.js.map +1 -0
- package/dist/types/config.d.ts +110 -0
- package/dist/types/config.js +21 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/content.d.ts +87 -0
- package/dist/types/content.d.ts.map +1 -0
- package/dist/types/content.js +40 -0
- package/dist/types/content.js.map +1 -0
- package/dist/types/errors.d.ts +50 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +253 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +20 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/message.d.ts +52 -0
- package/dist/types/message.d.ts.map +1 -0
- package/dist/types/message.js +38 -0
- package/dist/types/message.js.map +1 -0
- package/dist/types/provider.d.ts +169 -0
- package/dist/types/provider.d.ts.map +1 -0
- package/dist/types/provider.js +5 -0
- package/dist/types/provider.js.map +1 -0
- package/dist/types/request.d.ts +116 -0
- package/dist/types/request.d.ts.map +1 -0
- package/dist/types/request.js +5 -0
- package/dist/types/request.js.map +1 -0
- package/dist/types/response.d.ts +131 -0
- package/dist/types/response.d.ts.map +1 -0
- package/dist/types/response.js +7 -0
- package/dist/types/response.js.map +1 -0
- package/dist/types/streaming.d.ts +194 -0
- package/dist/types/streaming.js +5 -0
- package/dist/types/streaming.js.map +1 -0
- package/dist/types/tools.d.ts +71 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +5 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/cost.d.ts +10 -0
- package/dist/utils/cost.d.ts.map +1 -0
- package/dist/utils/cost.js +19 -0
- package/dist/utils/cost.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/stream-parser.d.ts +84 -0
- package/dist/utils/stream-parser.js +418 -0
- package/dist/utils/stream-parser.js.map +1 -0
- package/dist/utils/tool-parser.d.ts +134 -0
- package/dist/utils/tool-parser.js +600 -0
- package/dist/utils/tool-parser.js.map +1 -0
- package/dist/yielding-stream.d.ts +60 -0
- package/dist/yielding-stream.js +206 -0
- package/dist/yielding-stream.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Images API provider adapter
|
|
3
|
+
*
|
|
4
|
+
* Adapter for OpenAI's Images API endpoints, used for image generation
|
|
5
|
+
* models like `gpt-image-1`:
|
|
6
|
+
*
|
|
7
|
+
* - `/v1/images/generations` — text-to-image (no image input)
|
|
8
|
+
* - `/v1/images/edits` — image editing (accepts input images + prompt)
|
|
9
|
+
*
|
|
10
|
+
* The adapter automatically selects the right endpoint:
|
|
11
|
+
* - If conversation contains images → uses /edits with images as data URLs
|
|
12
|
+
* - If text-only → uses /generations
|
|
13
|
+
*
|
|
14
|
+
* Both endpoints:
|
|
15
|
+
* - Take a single `prompt` string (not conversation messages)
|
|
16
|
+
* - Return base64-encoded images in `data[].b64_json`
|
|
17
|
+
* - No streaming support (returns complete image)
|
|
18
|
+
* - Support `size`, `quality`, `n`, `background`, `output_format`
|
|
19
|
+
*
|
|
20
|
+
* Note: File retains the name openai-responses.ts and class name
|
|
21
|
+
* OpenAIResponsesAdapter for compatibility with existing factory
|
|
22
|
+
* routing and vendor configs (`openairesponses-*` prefix).
|
|
23
|
+
*/
|
|
24
|
+
import { MembraneError, rateLimitError, contextLengthError, authError, serverError, abortError, networkError, } from '../types/index.js';
|
|
25
|
+
import { createCombinedSignal } from './utils.js';
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// OpenAI Images Adapter
|
|
28
|
+
// ============================================================================
|
|
29
|
+
export class OpenAIResponsesAdapter {
|
|
30
|
+
name = 'openai-responses';
|
|
31
|
+
apiKey;
|
|
32
|
+
baseURL;
|
|
33
|
+
organization;
|
|
34
|
+
allowImageEditing;
|
|
35
|
+
constructor(config = {}) {
|
|
36
|
+
this.apiKey = config.apiKey ?? process.env.OPENAI_API_KEY ?? '';
|
|
37
|
+
this.baseURL = (config.baseURL ?? 'https://api.openai.com/v1').replace(/\/$/, '');
|
|
38
|
+
this.organization = config.organization;
|
|
39
|
+
this.allowImageEditing = config.allowImageEditing ?? true;
|
|
40
|
+
if (!this.apiKey) {
|
|
41
|
+
throw new Error('OpenAI API key not provided');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
supportsModel(modelId) {
|
|
45
|
+
return modelId.startsWith('gpt-image');
|
|
46
|
+
}
|
|
47
|
+
async complete(request, options) {
|
|
48
|
+
const inputImages = this.allowImageEditing ? this.extractImages(request) : [];
|
|
49
|
+
const isEdit = inputImages.length > 0;
|
|
50
|
+
const endpoint = isEdit ? 'images/edits' : 'images/generations';
|
|
51
|
+
const imagesRequest = this.buildRequest(request, inputImages);
|
|
52
|
+
options?.onRequest?.(imagesRequest);
|
|
53
|
+
const { signal: combinedSignal, cleanup } = createCombinedSignal(options?.signal, options?.timeoutMs);
|
|
54
|
+
try {
|
|
55
|
+
const fetchOptions = {
|
|
56
|
+
method: 'POST',
|
|
57
|
+
signal: combinedSignal,
|
|
58
|
+
};
|
|
59
|
+
if (isEdit) {
|
|
60
|
+
// /v1/images/edits requires multipart/form-data with file uploads
|
|
61
|
+
const formData = new FormData();
|
|
62
|
+
formData.append('model', imagesRequest.model);
|
|
63
|
+
formData.append('prompt', imagesRequest.prompt);
|
|
64
|
+
if (imagesRequest.n != null)
|
|
65
|
+
formData.append('n', String(imagesRequest.n));
|
|
66
|
+
if (imagesRequest.quality)
|
|
67
|
+
formData.append('quality', String(imagesRequest.quality));
|
|
68
|
+
if (imagesRequest.size)
|
|
69
|
+
formData.append('size', String(imagesRequest.size));
|
|
70
|
+
// Convert base64 data URLs to Blobs and append as file uploads
|
|
71
|
+
for (const dataUrl of inputImages) {
|
|
72
|
+
const { buffer, mimeType } = this.dataUrlToBuffer(dataUrl);
|
|
73
|
+
const ext = mimeType.split('/')[1] || 'png';
|
|
74
|
+
const blob = new Blob([buffer], { type: mimeType });
|
|
75
|
+
formData.append('image[]', blob, `image.${ext}`);
|
|
76
|
+
}
|
|
77
|
+
// Auth header only — don't set Content-Type, let fetch set multipart boundary
|
|
78
|
+
fetchOptions.headers = {
|
|
79
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
80
|
+
...(this.organization ? { 'OpenAI-Organization': this.organization } : {}),
|
|
81
|
+
};
|
|
82
|
+
fetchOptions.body = formData;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// /v1/images/generations accepts JSON
|
|
86
|
+
fetchOptions.headers = this.getHeaders();
|
|
87
|
+
fetchOptions.body = JSON.stringify(imagesRequest);
|
|
88
|
+
}
|
|
89
|
+
const response = await fetch(`${this.baseURL}/${endpoint}`, fetchOptions);
|
|
90
|
+
if (!response.ok) {
|
|
91
|
+
const errorText = await response.text();
|
|
92
|
+
throw new Error(`OpenAI Images API error: ${response.status} ${errorText}`);
|
|
93
|
+
}
|
|
94
|
+
const data = (await response.json());
|
|
95
|
+
return this.parseResponse(data, request.model, imagesRequest);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
throw this.handleError(error, imagesRequest);
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
cleanup?.();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async stream(request, callbacks, options) {
|
|
105
|
+
// Images API doesn't support streaming — do a full request
|
|
106
|
+
// and emit any text content as a single chunk
|
|
107
|
+
const response = await this.complete(request, options);
|
|
108
|
+
const blocks = response.content;
|
|
109
|
+
for (const block of blocks) {
|
|
110
|
+
if (block.type === 'text' && block.text) {
|
|
111
|
+
callbacks.onChunk(block.text);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return response;
|
|
115
|
+
}
|
|
116
|
+
// --------------------------------------------------------------------------
|
|
117
|
+
// Request Building
|
|
118
|
+
// --------------------------------------------------------------------------
|
|
119
|
+
getHeaders() {
|
|
120
|
+
const headers = {
|
|
121
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
122
|
+
'Content-Type': 'application/json',
|
|
123
|
+
};
|
|
124
|
+
if (this.organization) {
|
|
125
|
+
headers['OpenAI-Organization'] = this.organization;
|
|
126
|
+
}
|
|
127
|
+
return headers;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Extract base64 images from conversation messages as data URLs.
|
|
131
|
+
* Used to determine whether to use /edits (with images) or /generations.
|
|
132
|
+
* Returns up to 16 images (OpenAI limit for /v1/images/edits).
|
|
133
|
+
*/
|
|
134
|
+
extractImages(request) {
|
|
135
|
+
const dataUrls = [];
|
|
136
|
+
const MAX_IMAGES = 16;
|
|
137
|
+
if (!request.messages)
|
|
138
|
+
return dataUrls;
|
|
139
|
+
for (const msg of request.messages) {
|
|
140
|
+
if (!Array.isArray(msg.content))
|
|
141
|
+
continue;
|
|
142
|
+
for (const block of msg.content) {
|
|
143
|
+
if (dataUrls.length >= MAX_IMAGES)
|
|
144
|
+
break;
|
|
145
|
+
if (block.type === 'image') {
|
|
146
|
+
const source = block.source;
|
|
147
|
+
if (source?.type === 'base64' && source.data) {
|
|
148
|
+
const mimeType = source.media_type ?? source.mediaType ?? 'image/png';
|
|
149
|
+
dataUrls.push(`data:${mimeType};base64,${source.data}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return dataUrls;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Convert a base64 data URL to a Buffer + mimeType for file upload.
|
|
158
|
+
*/
|
|
159
|
+
dataUrlToBuffer(dataUrl) {
|
|
160
|
+
const match = dataUrl.match(/^data:([^;]+);base64,(.+)$/s);
|
|
161
|
+
if (!match || !match[1] || !match[2]) {
|
|
162
|
+
throw new Error('Invalid data URL format');
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
mimeType: match[1],
|
|
166
|
+
buffer: Buffer.from(match[2], 'base64'),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
buildRequest(request, inputImages) {
|
|
170
|
+
const prompt = this.flattenToPrompt(request);
|
|
171
|
+
const imagesRequest = {
|
|
172
|
+
model: request.model,
|
|
173
|
+
prompt,
|
|
174
|
+
n: 1,
|
|
175
|
+
quality: 'auto',
|
|
176
|
+
};
|
|
177
|
+
// Include input images for the /edits endpoint
|
|
178
|
+
if (inputImages.length > 0) {
|
|
179
|
+
imagesRequest.image = inputImages;
|
|
180
|
+
}
|
|
181
|
+
// Apply extra params (allow overriding size, quality, n, etc.)
|
|
182
|
+
if (request.extra) {
|
|
183
|
+
const { normalizedMessages, prompt: _p, ...rest } = request.extra;
|
|
184
|
+
Object.assign(imagesRequest, rest);
|
|
185
|
+
}
|
|
186
|
+
return imagesRequest;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Flatten conversation messages into a single prompt string.
|
|
190
|
+
*
|
|
191
|
+
* The Images API takes a single text prompt, not a conversation.
|
|
192
|
+
* We include the system prompt as context and concatenate all
|
|
193
|
+
* message text with role labels so the model understands the
|
|
194
|
+
* full conversation when deciding what image to generate.
|
|
195
|
+
*/
|
|
196
|
+
flattenToPrompt(request) {
|
|
197
|
+
const parts = [];
|
|
198
|
+
// Include system prompt as context
|
|
199
|
+
if (request.system) {
|
|
200
|
+
const systemText = typeof request.system === 'string'
|
|
201
|
+
? request.system
|
|
202
|
+
: request.system
|
|
203
|
+
.filter((b) => b.type === 'text')
|
|
204
|
+
.map((b) => b.text)
|
|
205
|
+
.join('\n');
|
|
206
|
+
if (systemText) {
|
|
207
|
+
parts.push(systemText);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Extract text from messages with role labels
|
|
211
|
+
if (request.messages) {
|
|
212
|
+
for (const msg of request.messages) {
|
|
213
|
+
const role = msg.role === 'assistant' ? 'Assistant' : 'User';
|
|
214
|
+
let text = '';
|
|
215
|
+
if (typeof msg.content === 'string') {
|
|
216
|
+
text = msg.content;
|
|
217
|
+
}
|
|
218
|
+
else if (Array.isArray(msg.content)) {
|
|
219
|
+
text = msg.content
|
|
220
|
+
.filter((b) => b.type === 'text' && b.text)
|
|
221
|
+
.map((b) => b.text)
|
|
222
|
+
.join('\n');
|
|
223
|
+
}
|
|
224
|
+
if (text) {
|
|
225
|
+
parts.push(`${role}: ${text}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return parts.join('\n\n');
|
|
230
|
+
}
|
|
231
|
+
// --------------------------------------------------------------------------
|
|
232
|
+
// Response Parsing
|
|
233
|
+
// --------------------------------------------------------------------------
|
|
234
|
+
parseResponse(response, requestedModel, rawRequest) {
|
|
235
|
+
const images = [];
|
|
236
|
+
let revisedPrompt;
|
|
237
|
+
for (const item of response.data) {
|
|
238
|
+
if (item.b64_json) {
|
|
239
|
+
images.push({
|
|
240
|
+
data: item.b64_json,
|
|
241
|
+
mimeType: 'image/png',
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
if (item.revised_prompt) {
|
|
245
|
+
revisedPrompt = item.revised_prompt;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
content: this.buildContentBlocks(revisedPrompt, images),
|
|
250
|
+
stopReason: 'end_turn',
|
|
251
|
+
stopSequence: undefined,
|
|
252
|
+
usage: {
|
|
253
|
+
inputTokens: response.usage?.input_tokens ?? 0,
|
|
254
|
+
outputTokens: response.usage?.output_tokens ?? 0,
|
|
255
|
+
},
|
|
256
|
+
model: requestedModel,
|
|
257
|
+
rawRequest,
|
|
258
|
+
raw: response,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
buildContentBlocks(text, images = []) {
|
|
262
|
+
const content = [];
|
|
263
|
+
if (text) {
|
|
264
|
+
content.push({ type: 'text', text });
|
|
265
|
+
}
|
|
266
|
+
for (const img of images) {
|
|
267
|
+
content.push({
|
|
268
|
+
type: 'generated_image',
|
|
269
|
+
data: img.data,
|
|
270
|
+
mimeType: img.mimeType,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
return content;
|
|
274
|
+
}
|
|
275
|
+
// --------------------------------------------------------------------------
|
|
276
|
+
// Error Handling
|
|
277
|
+
// --------------------------------------------------------------------------
|
|
278
|
+
handleError(error, rawRequest) {
|
|
279
|
+
if (error instanceof MembraneError)
|
|
280
|
+
return error;
|
|
281
|
+
if (error instanceof Error) {
|
|
282
|
+
const message = error.message;
|
|
283
|
+
if (message.includes('429') || message.includes('rate_limit')) {
|
|
284
|
+
const retryMatch = message.match(/retry after (\d+)/i);
|
|
285
|
+
const retryAfter = retryMatch?.[1] ? parseInt(retryMatch[1], 10) * 1000 : undefined;
|
|
286
|
+
return rateLimitError(message, retryAfter, error, rawRequest);
|
|
287
|
+
}
|
|
288
|
+
if (message.includes('401') ||
|
|
289
|
+
message.includes('invalid_api_key') ||
|
|
290
|
+
message.includes('Incorrect API key')) {
|
|
291
|
+
return authError(message, error, rawRequest);
|
|
292
|
+
}
|
|
293
|
+
if (message.includes('context_length') ||
|
|
294
|
+
message.includes('maximum context') ||
|
|
295
|
+
message.includes('too long')) {
|
|
296
|
+
return contextLengthError(message, error, rawRequest);
|
|
297
|
+
}
|
|
298
|
+
if (message.includes('content_policy') ||
|
|
299
|
+
message.includes('safety_system') ||
|
|
300
|
+
message.includes('moderation')) {
|
|
301
|
+
return new MembraneError({
|
|
302
|
+
type: 'unknown',
|
|
303
|
+
message: `Content policy violation: ${message}`,
|
|
304
|
+
retryable: false,
|
|
305
|
+
rawError: error,
|
|
306
|
+
rawRequest,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
if (message.includes('500') ||
|
|
310
|
+
message.includes('502') ||
|
|
311
|
+
message.includes('503') ||
|
|
312
|
+
message.includes('server_error')) {
|
|
313
|
+
return serverError(message, undefined, error, rawRequest);
|
|
314
|
+
}
|
|
315
|
+
if (error.name === 'AbortError') {
|
|
316
|
+
return abortError(undefined, rawRequest);
|
|
317
|
+
}
|
|
318
|
+
if (message.includes('network') ||
|
|
319
|
+
message.includes('fetch') ||
|
|
320
|
+
message.includes('ECONNREFUSED')) {
|
|
321
|
+
return networkError(message, error, rawRequest);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return new MembraneError({
|
|
325
|
+
type: 'unknown',
|
|
326
|
+
message: error instanceof Error ? error.message : String(error),
|
|
327
|
+
retryable: false,
|
|
328
|
+
rawError: error,
|
|
329
|
+
rawRequest,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=openai-responses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-responses.js","sourceRoot":"","sources":["../../src/providers/openai-responses.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Direct provider adapter
|
|
3
|
+
*
|
|
4
|
+
* Direct adapter for OpenAI's API with support for modern models:
|
|
5
|
+
* - GPT-4o, GPT-4 Turbo
|
|
6
|
+
* - GPT-5, GPT-5-mini (uses max_completion_tokens)
|
|
7
|
+
* - o1, o3, o4-mini reasoning models
|
|
8
|
+
*
|
|
9
|
+
* Key differences from generic OpenAI-compatible:
|
|
10
|
+
* - Uses max_completion_tokens for newer models (not max_tokens)
|
|
11
|
+
* - Handles reasoning models' special requirements
|
|
12
|
+
* - Direct API integration with proper error handling
|
|
13
|
+
*/
|
|
14
|
+
import type { ProviderAdapter, ProviderRequest, ProviderRequestOptions, ProviderResponse, StreamCallbacks, ContentBlock } from '../types/index.js';
|
|
15
|
+
interface OpenAIContentPart {
|
|
16
|
+
type: 'text' | 'image_url';
|
|
17
|
+
text?: string;
|
|
18
|
+
image_url?: {
|
|
19
|
+
url: string;
|
|
20
|
+
detail?: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
interface OpenAIMessage {
|
|
24
|
+
role: 'user' | 'assistant' | 'system' | 'tool';
|
|
25
|
+
content?: string | OpenAIContentPart[] | null;
|
|
26
|
+
tool_calls?: OpenAIToolCall[];
|
|
27
|
+
tool_call_id?: string;
|
|
28
|
+
}
|
|
29
|
+
interface OpenAIToolCall {
|
|
30
|
+
id: string;
|
|
31
|
+
type: 'function';
|
|
32
|
+
function: {
|
|
33
|
+
name: string;
|
|
34
|
+
arguments: string;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export interface OpenAIAdapterConfig {
|
|
38
|
+
/** API key (defaults to OPENAI_API_KEY env var) */
|
|
39
|
+
apiKey?: string;
|
|
40
|
+
/** Base URL (default: https://api.openai.com/v1) - useful for Azure OpenAI */
|
|
41
|
+
baseURL?: string;
|
|
42
|
+
/** Organization ID (optional) */
|
|
43
|
+
organization?: string;
|
|
44
|
+
/** Default max tokens */
|
|
45
|
+
defaultMaxTokens?: number;
|
|
46
|
+
}
|
|
47
|
+
export declare class OpenAIAdapter implements ProviderAdapter {
|
|
48
|
+
readonly name = "openai";
|
|
49
|
+
private apiKey;
|
|
50
|
+
private baseURL;
|
|
51
|
+
private organization?;
|
|
52
|
+
private defaultMaxTokens;
|
|
53
|
+
constructor(config?: OpenAIAdapterConfig);
|
|
54
|
+
supportsModel(modelId: string): boolean;
|
|
55
|
+
complete(request: ProviderRequest, options?: ProviderRequestOptions): Promise<ProviderResponse>;
|
|
56
|
+
stream(request: ProviderRequest, callbacks: StreamCallbacks, options?: ProviderRequestOptions): Promise<ProviderResponse>;
|
|
57
|
+
private getHeaders;
|
|
58
|
+
private buildRequest;
|
|
59
|
+
private convertMessages;
|
|
60
|
+
private convertTools;
|
|
61
|
+
private makeRequest;
|
|
62
|
+
private parseResponse;
|
|
63
|
+
private parseStreamedResponse;
|
|
64
|
+
private messageToContent;
|
|
65
|
+
private mapFinishReason;
|
|
66
|
+
private handleError;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Convert normalized content blocks to OpenAI message format
|
|
70
|
+
*/
|
|
71
|
+
export declare function toOpenAIContent(blocks: ContentBlock[]): string | null;
|
|
72
|
+
/**
|
|
73
|
+
* Convert OpenAI response message to normalized content blocks
|
|
74
|
+
*/
|
|
75
|
+
export declare function fromOpenAIContent(message: OpenAIMessage): ContentBlock[];
|
|
76
|
+
export {};
|
|
77
|
+
//# sourceMappingURL=openai.d.ts.map
|