@animalabs/membrane 0.1.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/context/index.d.ts +10 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +9 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/process.d.ts +22 -0
- package/dist/context/process.d.ts.map +1 -0
- package/dist/context/process.js +369 -0
- package/dist/context/process.js.map +1 -0
- package/dist/context/types.d.ts +118 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +60 -0
- package/dist/context/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/membrane.d.ts +96 -0
- package/dist/membrane.d.ts.map +1 -0
- package/dist/membrane.js +893 -0
- package/dist/membrane.js.map +1 -0
- package/dist/providers/anthropic.d.ts +36 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +265 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/index.d.ts +8 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +8 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai-compatible.d.ts +74 -0
- package/dist/providers/openai-compatible.d.ts.map +1 -0
- package/dist/providers/openai-compatible.js +412 -0
- package/dist/providers/openai-compatible.js.map +1 -0
- package/dist/providers/openai.d.ts +69 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +455 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/openrouter.d.ts +76 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- package/dist/providers/openrouter.js +492 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/transforms/chat.d.ts +52 -0
- package/dist/transforms/chat.d.ts.map +1 -0
- package/dist/transforms/chat.js +136 -0
- package/dist/transforms/chat.js.map +1 -0
- package/dist/transforms/index.d.ts +6 -0
- package/dist/transforms/index.d.ts.map +1 -0
- package/dist/transforms/index.js +6 -0
- package/dist/transforms/index.js.map +1 -0
- package/dist/transforms/prefill.d.ts +89 -0
- package/dist/transforms/prefill.d.ts.map +1 -0
- package/dist/transforms/prefill.js +401 -0
- package/dist/transforms/prefill.js.map +1 -0
- package/dist/types/config.d.ts +103 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +21 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/content.d.ts +81 -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 +42 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +208 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +18 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/message.d.ts +46 -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 +155 -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 +78 -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 +164 -0
- package/dist/types/streaming.d.ts.map +1 -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/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/stream-parser.d.ts +53 -0
- package/dist/utils/stream-parser.d.ts.map +1 -0
- package/dist/utils/stream-parser.js +359 -0
- package/dist/utils/stream-parser.js.map +1 -0
- package/dist/utils/tool-parser.d.ts +130 -0
- package/dist/utils/tool-parser.d.ts.map +1 -0
- package/dist/utils/tool-parser.js +571 -0
- package/dist/utils/tool-parser.js.map +1 -0
- package/package.json +37 -0
- package/src/context/index.ts +24 -0
- package/src/context/process.ts +520 -0
- package/src/context/types.ts +231 -0
- package/src/index.ts +23 -0
- package/src/membrane.ts +1174 -0
- package/src/providers/anthropic.ts +340 -0
- package/src/providers/index.ts +31 -0
- package/src/providers/openai-compatible.ts +570 -0
- package/src/providers/openai.ts +625 -0
- package/src/providers/openrouter.ts +662 -0
- package/src/transforms/chat.ts +212 -0
- package/src/transforms/index.ts +22 -0
- package/src/transforms/prefill.ts +585 -0
- package/src/types/config.ts +172 -0
- package/src/types/content.ts +181 -0
- package/src/types/errors.ts +277 -0
- package/src/types/index.ts +154 -0
- package/src/types/message.ts +89 -0
- package/src/types/provider.ts +249 -0
- package/src/types/request.ts +131 -0
- package/src/types/response.ts +223 -0
- package/src/types/streaming.ts +231 -0
- package/src/types/tools.ts +92 -0
- package/src/utils/index.ts +15 -0
- package/src/utils/stream-parser.ts +440 -0
- package/src/utils/tool-parser.ts +715 -0
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI-Compatible provider adapter
|
|
3
|
+
*
|
|
4
|
+
* Generic adapter for any OpenAI-compatible API endpoint:
|
|
5
|
+
* - Ollama (http://localhost:11434/v1)
|
|
6
|
+
* - vLLM
|
|
7
|
+
* - Together AI
|
|
8
|
+
* - Groq
|
|
9
|
+
* - Local inference servers
|
|
10
|
+
* - Any other OpenAI-compatible endpoint
|
|
11
|
+
*
|
|
12
|
+
* Uses the standard OpenAI chat completions format with tool_calls support.
|
|
13
|
+
*/
|
|
14
|
+
import { MembraneError, rateLimitError, contextLengthError, authError, serverError, abortError, networkError, } from '../types/index.js';
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// OpenAI-Compatible Adapter
|
|
17
|
+
// ============================================================================
|
|
18
|
+
export class OpenAICompatibleAdapter {
|
|
19
|
+
name;
|
|
20
|
+
baseURL;
|
|
21
|
+
apiKey;
|
|
22
|
+
defaultMaxTokens;
|
|
23
|
+
extraHeaders;
|
|
24
|
+
constructor(config) {
|
|
25
|
+
if (!config.baseURL) {
|
|
26
|
+
throw new Error('OpenAI-compatible adapter requires baseURL');
|
|
27
|
+
}
|
|
28
|
+
this.name = config.providerName ?? 'openai-compatible';
|
|
29
|
+
this.baseURL = config.baseURL.replace(/\/$/, ''); // Remove trailing slash
|
|
30
|
+
this.apiKey = config.apiKey ?? '';
|
|
31
|
+
this.defaultMaxTokens = config.defaultMaxTokens ?? 4096;
|
|
32
|
+
this.extraHeaders = config.extraHeaders ?? {};
|
|
33
|
+
}
|
|
34
|
+
supportsModel(_modelId) {
|
|
35
|
+
// This is a generic adapter - it supports whatever the endpoint supports
|
|
36
|
+
// Model routing should be handled at a higher level
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
async complete(request, options) {
|
|
40
|
+
const openAIRequest = this.buildRequest(request);
|
|
41
|
+
try {
|
|
42
|
+
const response = await this.makeRequest(openAIRequest, options);
|
|
43
|
+
return this.parseResponse(response, request.model);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
throw this.handleError(error);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async stream(request, callbacks, options) {
|
|
50
|
+
const openAIRequest = this.buildRequest(request);
|
|
51
|
+
openAIRequest.stream = true;
|
|
52
|
+
try {
|
|
53
|
+
const response = await fetch(`${this.baseURL}/chat/completions`, {
|
|
54
|
+
method: 'POST',
|
|
55
|
+
headers: this.getHeaders(),
|
|
56
|
+
body: JSON.stringify(openAIRequest),
|
|
57
|
+
signal: options?.signal,
|
|
58
|
+
});
|
|
59
|
+
if (!response.ok) {
|
|
60
|
+
const errorText = await response.text();
|
|
61
|
+
throw new Error(`API error: ${response.status} ${errorText}`);
|
|
62
|
+
}
|
|
63
|
+
const reader = response.body?.getReader();
|
|
64
|
+
if (!reader) {
|
|
65
|
+
throw new Error('No response body');
|
|
66
|
+
}
|
|
67
|
+
const decoder = new TextDecoder();
|
|
68
|
+
let accumulated = '';
|
|
69
|
+
let finishReason = 'stop';
|
|
70
|
+
let toolCalls = [];
|
|
71
|
+
while (true) {
|
|
72
|
+
const { done, value } = await reader.read();
|
|
73
|
+
if (done)
|
|
74
|
+
break;
|
|
75
|
+
const chunk = decoder.decode(value, { stream: true });
|
|
76
|
+
const lines = chunk.split('\n').filter(line => line.startsWith('data: '));
|
|
77
|
+
for (const line of lines) {
|
|
78
|
+
const data = line.slice(6);
|
|
79
|
+
if (data === '[DONE]')
|
|
80
|
+
continue;
|
|
81
|
+
try {
|
|
82
|
+
const parsed = JSON.parse(data);
|
|
83
|
+
const delta = parsed.choices?.[0]?.delta;
|
|
84
|
+
if (delta?.content) {
|
|
85
|
+
accumulated += delta.content;
|
|
86
|
+
callbacks.onChunk(delta.content);
|
|
87
|
+
}
|
|
88
|
+
// Handle streaming tool calls
|
|
89
|
+
if (delta?.tool_calls) {
|
|
90
|
+
for (const tc of delta.tool_calls) {
|
|
91
|
+
const index = tc.index ?? 0;
|
|
92
|
+
if (!toolCalls[index]) {
|
|
93
|
+
toolCalls[index] = {
|
|
94
|
+
id: tc.id ?? '',
|
|
95
|
+
type: 'function',
|
|
96
|
+
function: { name: '', arguments: '' },
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (tc.id)
|
|
100
|
+
toolCalls[index].id = tc.id;
|
|
101
|
+
if (tc.function?.name)
|
|
102
|
+
toolCalls[index].function.name = tc.function.name;
|
|
103
|
+
if (tc.function?.arguments) {
|
|
104
|
+
toolCalls[index].function.arguments += tc.function.arguments;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (parsed.choices?.[0]?.finish_reason) {
|
|
109
|
+
finishReason = parsed.choices[0].finish_reason;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Ignore parse errors in stream
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Build response with accumulated data
|
|
118
|
+
const message = {
|
|
119
|
+
role: 'assistant',
|
|
120
|
+
content: accumulated || null,
|
|
121
|
+
};
|
|
122
|
+
if (toolCalls.length > 0) {
|
|
123
|
+
message.tool_calls = toolCalls;
|
|
124
|
+
}
|
|
125
|
+
return this.parseStreamedResponse(message, finishReason, request.model);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
throw this.handleError(error);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
getHeaders() {
|
|
132
|
+
const headers = {
|
|
133
|
+
'Content-Type': 'application/json',
|
|
134
|
+
...this.extraHeaders,
|
|
135
|
+
};
|
|
136
|
+
// Only add Authorization header if we have an API key
|
|
137
|
+
if (this.apiKey) {
|
|
138
|
+
headers['Authorization'] = `Bearer ${this.apiKey}`;
|
|
139
|
+
}
|
|
140
|
+
return headers;
|
|
141
|
+
}
|
|
142
|
+
buildRequest(request) {
|
|
143
|
+
const messages = this.convertMessages(request.messages);
|
|
144
|
+
const params = {
|
|
145
|
+
model: request.model,
|
|
146
|
+
messages,
|
|
147
|
+
max_tokens: request.maxTokens || this.defaultMaxTokens,
|
|
148
|
+
};
|
|
149
|
+
if (request.temperature !== undefined) {
|
|
150
|
+
params.temperature = request.temperature;
|
|
151
|
+
}
|
|
152
|
+
if (request.stopSequences && request.stopSequences.length > 0) {
|
|
153
|
+
params.stop = request.stopSequences;
|
|
154
|
+
}
|
|
155
|
+
if (request.tools && request.tools.length > 0) {
|
|
156
|
+
params.tools = this.convertTools(request.tools);
|
|
157
|
+
}
|
|
158
|
+
// Apply extra params
|
|
159
|
+
if (request.extra) {
|
|
160
|
+
Object.assign(params, request.extra);
|
|
161
|
+
}
|
|
162
|
+
return params;
|
|
163
|
+
}
|
|
164
|
+
convertMessages(messages) {
|
|
165
|
+
// Use flatMap to handle one-to-many expansion (multiple tool_results → multiple messages)
|
|
166
|
+
return messages.flatMap(msg => {
|
|
167
|
+
// If it's already in OpenAI format, pass through
|
|
168
|
+
if (msg.role && (typeof msg.content === 'string' || msg.content === null || msg.tool_calls)) {
|
|
169
|
+
return [msg];
|
|
170
|
+
}
|
|
171
|
+
// Convert from Anthropic-style format
|
|
172
|
+
if (Array.isArray(msg.content)) {
|
|
173
|
+
const textParts = [];
|
|
174
|
+
const toolCalls = [];
|
|
175
|
+
const toolResults = [];
|
|
176
|
+
for (const block of msg.content) {
|
|
177
|
+
if (block.type === 'text') {
|
|
178
|
+
textParts.push(block.text);
|
|
179
|
+
}
|
|
180
|
+
else if (block.type === 'tool_use') {
|
|
181
|
+
toolCalls.push({
|
|
182
|
+
id: block.id,
|
|
183
|
+
type: 'function',
|
|
184
|
+
function: {
|
|
185
|
+
name: block.name,
|
|
186
|
+
arguments: JSON.stringify(block.input),
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
else if (block.type === 'tool_result') {
|
|
191
|
+
// Collect ALL tool results - each becomes a separate message
|
|
192
|
+
toolResults.push({
|
|
193
|
+
role: 'tool',
|
|
194
|
+
tool_call_id: block.tool_use_id || block.toolUseId,
|
|
195
|
+
content: typeof block.content === 'string' ? block.content : JSON.stringify(block.content),
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// If we have tool results, return them (possibly multiple)
|
|
200
|
+
if (toolResults.length > 0) {
|
|
201
|
+
return toolResults;
|
|
202
|
+
}
|
|
203
|
+
// Otherwise build normal message
|
|
204
|
+
const result = {
|
|
205
|
+
role: msg.role,
|
|
206
|
+
content: textParts.join('\n') || null,
|
|
207
|
+
};
|
|
208
|
+
if (toolCalls.length > 0) {
|
|
209
|
+
result.tool_calls = toolCalls;
|
|
210
|
+
}
|
|
211
|
+
return [result];
|
|
212
|
+
}
|
|
213
|
+
return [{
|
|
214
|
+
role: msg.role,
|
|
215
|
+
content: msg.content,
|
|
216
|
+
}];
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
convertTools(tools) {
|
|
220
|
+
return tools.map(tool => {
|
|
221
|
+
// Handle different input formats
|
|
222
|
+
const inputSchema = tool.inputSchema || tool.input_schema || { type: 'object', properties: {} };
|
|
223
|
+
return {
|
|
224
|
+
type: 'function',
|
|
225
|
+
function: {
|
|
226
|
+
name: tool.name,
|
|
227
|
+
description: tool.description,
|
|
228
|
+
parameters: inputSchema,
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
async makeRequest(request, options) {
|
|
234
|
+
const response = await fetch(`${this.baseURL}/chat/completions`, {
|
|
235
|
+
method: 'POST',
|
|
236
|
+
headers: this.getHeaders(),
|
|
237
|
+
body: JSON.stringify(request),
|
|
238
|
+
signal: options?.signal,
|
|
239
|
+
});
|
|
240
|
+
if (!response.ok) {
|
|
241
|
+
const errorText = await response.text();
|
|
242
|
+
throw new Error(`API error: ${response.status} ${errorText}`);
|
|
243
|
+
}
|
|
244
|
+
return response.json();
|
|
245
|
+
}
|
|
246
|
+
parseResponse(response, requestedModel) {
|
|
247
|
+
const choice = response.choices[0];
|
|
248
|
+
const message = choice?.message;
|
|
249
|
+
return {
|
|
250
|
+
content: this.messageToContent(message),
|
|
251
|
+
stopReason: this.mapFinishReason(choice?.finish_reason),
|
|
252
|
+
stopSequence: undefined,
|
|
253
|
+
usage: {
|
|
254
|
+
inputTokens: response.usage?.prompt_tokens ?? 0,
|
|
255
|
+
outputTokens: response.usage?.completion_tokens ?? 0,
|
|
256
|
+
},
|
|
257
|
+
model: response.model ?? requestedModel,
|
|
258
|
+
raw: response,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
parseStreamedResponse(message, finishReason, requestedModel) {
|
|
262
|
+
return {
|
|
263
|
+
content: this.messageToContent(message),
|
|
264
|
+
stopReason: this.mapFinishReason(finishReason),
|
|
265
|
+
stopSequence: undefined,
|
|
266
|
+
usage: {
|
|
267
|
+
inputTokens: 0, // Not available in streaming
|
|
268
|
+
outputTokens: 0,
|
|
269
|
+
},
|
|
270
|
+
model: requestedModel,
|
|
271
|
+
raw: { message, finish_reason: finishReason },
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
messageToContent(message) {
|
|
275
|
+
if (!message)
|
|
276
|
+
return [];
|
|
277
|
+
const content = [];
|
|
278
|
+
if (message.content) {
|
|
279
|
+
content.push({ type: 'text', text: message.content });
|
|
280
|
+
}
|
|
281
|
+
if (message.tool_calls) {
|
|
282
|
+
for (const tc of message.tool_calls) {
|
|
283
|
+
content.push({
|
|
284
|
+
type: 'tool_use',
|
|
285
|
+
id: tc.id,
|
|
286
|
+
name: tc.function.name,
|
|
287
|
+
input: JSON.parse(tc.function.arguments || '{}'),
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return content;
|
|
292
|
+
}
|
|
293
|
+
mapFinishReason(reason) {
|
|
294
|
+
switch (reason) {
|
|
295
|
+
case 'stop':
|
|
296
|
+
return 'end_turn';
|
|
297
|
+
case 'length':
|
|
298
|
+
return 'max_tokens';
|
|
299
|
+
case 'tool_calls':
|
|
300
|
+
return 'tool_use';
|
|
301
|
+
case 'content_filter':
|
|
302
|
+
return 'refusal';
|
|
303
|
+
default:
|
|
304
|
+
return 'end_turn';
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
handleError(error) {
|
|
308
|
+
if (error instanceof Error) {
|
|
309
|
+
const message = error.message;
|
|
310
|
+
if (message.includes('429') || message.includes('rate')) {
|
|
311
|
+
return rateLimitError(message, undefined, error);
|
|
312
|
+
}
|
|
313
|
+
if (message.includes('401') || message.includes('auth') || message.includes('Unauthorized')) {
|
|
314
|
+
return authError(message, error);
|
|
315
|
+
}
|
|
316
|
+
if (message.includes('context') || message.includes('too long') || message.includes('maximum context')) {
|
|
317
|
+
return contextLengthError(message, error);
|
|
318
|
+
}
|
|
319
|
+
if (message.includes('500') || message.includes('502') || message.includes('503')) {
|
|
320
|
+
return serverError(message, undefined, error);
|
|
321
|
+
}
|
|
322
|
+
if (error.name === 'AbortError') {
|
|
323
|
+
return abortError();
|
|
324
|
+
}
|
|
325
|
+
if (message.includes('network') || message.includes('fetch') || message.includes('ECONNREFUSED')) {
|
|
326
|
+
return networkError(message, error);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return new MembraneError({
|
|
330
|
+
type: 'unknown',
|
|
331
|
+
message: error instanceof Error ? error.message : String(error),
|
|
332
|
+
retryable: false,
|
|
333
|
+
rawError: error,
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
// ============================================================================
|
|
338
|
+
// Content Conversion Utilities
|
|
339
|
+
// ============================================================================
|
|
340
|
+
/**
|
|
341
|
+
* Convert normalized content blocks to OpenAI message format
|
|
342
|
+
*/
|
|
343
|
+
export function toOpenAIMessages(messages) {
|
|
344
|
+
const result = [];
|
|
345
|
+
for (const msg of messages) {
|
|
346
|
+
const textParts = [];
|
|
347
|
+
const toolCalls = [];
|
|
348
|
+
const toolResults = [];
|
|
349
|
+
for (const block of msg.content) {
|
|
350
|
+
if (block.type === 'text') {
|
|
351
|
+
textParts.push(block.text);
|
|
352
|
+
}
|
|
353
|
+
else if (block.type === 'tool_use') {
|
|
354
|
+
toolCalls.push({
|
|
355
|
+
id: block.id,
|
|
356
|
+
type: 'function',
|
|
357
|
+
function: {
|
|
358
|
+
name: block.name,
|
|
359
|
+
arguments: JSON.stringify(block.input),
|
|
360
|
+
},
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
else if (block.type === 'tool_result') {
|
|
364
|
+
toolResults.push({
|
|
365
|
+
id: block.toolUseId,
|
|
366
|
+
content: typeof block.content === 'string' ? block.content : JSON.stringify(block.content),
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
// Add main message
|
|
371
|
+
if (textParts.length > 0 || toolCalls.length > 0) {
|
|
372
|
+
const message = {
|
|
373
|
+
role: msg.role,
|
|
374
|
+
content: textParts.join('\n') || null,
|
|
375
|
+
};
|
|
376
|
+
if (toolCalls.length > 0) {
|
|
377
|
+
message.tool_calls = toolCalls;
|
|
378
|
+
}
|
|
379
|
+
result.push(message);
|
|
380
|
+
}
|
|
381
|
+
// Add tool results as separate messages
|
|
382
|
+
for (const tr of toolResults) {
|
|
383
|
+
result.push({
|
|
384
|
+
role: 'tool',
|
|
385
|
+
tool_call_id: tr.id,
|
|
386
|
+
content: tr.content,
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return result;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Convert OpenAI response message to normalized content blocks
|
|
394
|
+
*/
|
|
395
|
+
export function fromOpenAIMessage(message) {
|
|
396
|
+
const result = [];
|
|
397
|
+
if (message.content) {
|
|
398
|
+
result.push({ type: 'text', text: message.content });
|
|
399
|
+
}
|
|
400
|
+
if (message.tool_calls) {
|
|
401
|
+
for (const tc of message.tool_calls) {
|
|
402
|
+
result.push({
|
|
403
|
+
type: 'tool_use',
|
|
404
|
+
id: tc.id,
|
|
405
|
+
name: tc.function.name,
|
|
406
|
+
input: JSON.parse(tc.function.arguments || '{}'),
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
return result;
|
|
411
|
+
}
|
|
412
|
+
//# sourceMappingURL=openai-compatible.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-compatible.js","sourceRoot":"","sources":["../../src/providers/openai-compatible.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
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 OpenAIMessage {
|
|
16
|
+
role: 'user' | 'assistant' | 'system' | 'tool';
|
|
17
|
+
content?: string | null;
|
|
18
|
+
tool_calls?: OpenAIToolCall[];
|
|
19
|
+
tool_call_id?: string;
|
|
20
|
+
}
|
|
21
|
+
interface OpenAIToolCall {
|
|
22
|
+
id: string;
|
|
23
|
+
type: 'function';
|
|
24
|
+
function: {
|
|
25
|
+
name: string;
|
|
26
|
+
arguments: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface OpenAIAdapterConfig {
|
|
30
|
+
/** API key (defaults to OPENAI_API_KEY env var) */
|
|
31
|
+
apiKey?: string;
|
|
32
|
+
/** Base URL (default: https://api.openai.com/v1) - useful for Azure OpenAI */
|
|
33
|
+
baseURL?: string;
|
|
34
|
+
/** Organization ID (optional) */
|
|
35
|
+
organization?: string;
|
|
36
|
+
/** Default max tokens */
|
|
37
|
+
defaultMaxTokens?: number;
|
|
38
|
+
}
|
|
39
|
+
export declare class OpenAIAdapter implements ProviderAdapter {
|
|
40
|
+
readonly name = "openai";
|
|
41
|
+
private apiKey;
|
|
42
|
+
private baseURL;
|
|
43
|
+
private organization?;
|
|
44
|
+
private defaultMaxTokens;
|
|
45
|
+
constructor(config?: OpenAIAdapterConfig);
|
|
46
|
+
supportsModel(modelId: string): boolean;
|
|
47
|
+
complete(request: ProviderRequest, options?: ProviderRequestOptions): Promise<ProviderResponse>;
|
|
48
|
+
stream(request: ProviderRequest, callbacks: StreamCallbacks, options?: ProviderRequestOptions): Promise<ProviderResponse>;
|
|
49
|
+
private getHeaders;
|
|
50
|
+
private buildRequest;
|
|
51
|
+
private convertMessages;
|
|
52
|
+
private convertTools;
|
|
53
|
+
private makeRequest;
|
|
54
|
+
private parseResponse;
|
|
55
|
+
private parseStreamedResponse;
|
|
56
|
+
private messageToContent;
|
|
57
|
+
private mapFinishReason;
|
|
58
|
+
private handleError;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Convert normalized content blocks to OpenAI message format
|
|
62
|
+
*/
|
|
63
|
+
export declare function toOpenAIContent(blocks: ContentBlock[]): string | null;
|
|
64
|
+
/**
|
|
65
|
+
* Convert OpenAI response message to normalized content blocks
|
|
66
|
+
*/
|
|
67
|
+
export declare function fromOpenAIContent(message: OpenAIMessage): ContentBlock[];
|
|
68
|
+
export {};
|
|
69
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACb,MAAM,mBAAmB,CAAC;AAe3B,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAuCD,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,iCAAiC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,yBAAyB;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAuED,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,gBAAgB,CAAS;gBAErB,MAAM,GAAE,mBAAwB;IAW5C,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAUjC,QAAQ,CACZ,OAAO,EAAE,eAAe,EACxB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,gBAAgB,CAAC;IAWtB,MAAM,CACV,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,eAAe,EAC1B,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,gBAAgB,CAAC;IAoG5B,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,YAAY;IAuCpB,OAAO,CAAC,eAAe;IA6DvB,OAAO,CAAC,YAAY;YAeN,WAAW;IAgBzB,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,qBAAqB;IAuB7B,OAAO,CAAC,gBAAgB;IAuBxB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,WAAW;CAwCpB;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,GAAG,IAAI,CAIrE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,EAAE,CAmBxE"}
|