@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,480 @@
|
|
|
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
|
+
import { safeParseJson, createCombinedSignal, SSELineParser } from './utils.js';
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// OpenAI-Compatible Adapter
|
|
18
|
+
// ============================================================================
|
|
19
|
+
export class OpenAICompatibleAdapter {
|
|
20
|
+
name;
|
|
21
|
+
baseURL;
|
|
22
|
+
apiKey;
|
|
23
|
+
defaultMaxTokens;
|
|
24
|
+
extraHeaders;
|
|
25
|
+
constructor(config) {
|
|
26
|
+
if (!config.baseURL) {
|
|
27
|
+
throw new Error('OpenAI-compatible adapter requires baseURL');
|
|
28
|
+
}
|
|
29
|
+
this.name = config.providerName ?? 'openai-compatible';
|
|
30
|
+
this.baseURL = config.baseURL.replace(/\/$/, ''); // Remove trailing slash
|
|
31
|
+
this.apiKey = config.apiKey ?? '';
|
|
32
|
+
this.defaultMaxTokens = config.defaultMaxTokens ?? 4096;
|
|
33
|
+
this.extraHeaders = config.extraHeaders ?? {};
|
|
34
|
+
}
|
|
35
|
+
supportsModel(_modelId) {
|
|
36
|
+
// This is a generic adapter - it supports whatever the endpoint supports
|
|
37
|
+
// Model routing should be handled at a higher level
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
async complete(request, options) {
|
|
41
|
+
const openAIRequest = this.buildRequest(request);
|
|
42
|
+
options?.onRequest?.(openAIRequest);
|
|
43
|
+
try {
|
|
44
|
+
const response = await this.makeRequest(openAIRequest, options);
|
|
45
|
+
return this.parseResponse(response, request.model, openAIRequest);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
throw this.handleError(error, openAIRequest);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async stream(request, callbacks, options) {
|
|
52
|
+
const openAIRequest = this.buildRequest(request);
|
|
53
|
+
openAIRequest.stream = true;
|
|
54
|
+
options?.onRequest?.(openAIRequest);
|
|
55
|
+
const { signal: combinedSignal, cleanup } = createCombinedSignal(options?.signal, options?.timeoutMs);
|
|
56
|
+
try {
|
|
57
|
+
const response = await fetch(`${this.baseURL}/chat/completions`, {
|
|
58
|
+
method: 'POST',
|
|
59
|
+
headers: this.getHeaders(),
|
|
60
|
+
body: JSON.stringify(openAIRequest),
|
|
61
|
+
signal: combinedSignal,
|
|
62
|
+
});
|
|
63
|
+
if (!response.ok) {
|
|
64
|
+
const errorText = await response.text();
|
|
65
|
+
throw new Error(`API error: ${response.status} ${errorText}`);
|
|
66
|
+
}
|
|
67
|
+
const reader = response.body?.getReader();
|
|
68
|
+
if (!reader) {
|
|
69
|
+
throw new Error('No response body');
|
|
70
|
+
}
|
|
71
|
+
const decoder = new TextDecoder();
|
|
72
|
+
const sseParser = new SSELineParser();
|
|
73
|
+
let accumulated = '';
|
|
74
|
+
let finishReason = 'stop';
|
|
75
|
+
let toolCalls = [];
|
|
76
|
+
while (true) {
|
|
77
|
+
const { done, value } = await reader.read();
|
|
78
|
+
if (done)
|
|
79
|
+
break;
|
|
80
|
+
const chunk = decoder.decode(value, { stream: true });
|
|
81
|
+
const dataLines = sseParser.feed(chunk);
|
|
82
|
+
for (const data of dataLines) {
|
|
83
|
+
if (data === '[DONE]')
|
|
84
|
+
continue;
|
|
85
|
+
try {
|
|
86
|
+
const parsed = JSON.parse(data);
|
|
87
|
+
const delta = parsed.choices?.[0]?.delta;
|
|
88
|
+
if (delta?.content) {
|
|
89
|
+
accumulated += delta.content;
|
|
90
|
+
callbacks.onChunk(delta.content);
|
|
91
|
+
}
|
|
92
|
+
// Handle streaming tool calls
|
|
93
|
+
if (delta?.tool_calls) {
|
|
94
|
+
for (const tc of delta.tool_calls) {
|
|
95
|
+
const index = tc.index ?? 0;
|
|
96
|
+
if (!toolCalls[index]) {
|
|
97
|
+
toolCalls[index] = {
|
|
98
|
+
id: tc.id ?? '',
|
|
99
|
+
type: 'function',
|
|
100
|
+
function: { name: '', arguments: '' },
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (tc.id)
|
|
104
|
+
toolCalls[index].id = tc.id;
|
|
105
|
+
if (tc.function?.name)
|
|
106
|
+
toolCalls[index].function.name = tc.function.name;
|
|
107
|
+
if (tc.function?.arguments) {
|
|
108
|
+
toolCalls[index].function.arguments += tc.function.arguments;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (parsed.choices?.[0]?.finish_reason) {
|
|
113
|
+
finishReason = parsed.choices[0].finish_reason;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Ignore parse errors in stream
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Build response with accumulated data
|
|
122
|
+
const message = {
|
|
123
|
+
role: 'assistant',
|
|
124
|
+
content: accumulated || null,
|
|
125
|
+
};
|
|
126
|
+
if (toolCalls.length > 0) {
|
|
127
|
+
message.tool_calls = toolCalls;
|
|
128
|
+
}
|
|
129
|
+
return this.parseStreamedResponse(message, finishReason, request.model, openAIRequest);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
throw this.handleError(error, openAIRequest);
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
cleanup?.();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
getHeaders() {
|
|
139
|
+
const headers = {
|
|
140
|
+
'Content-Type': 'application/json',
|
|
141
|
+
...this.extraHeaders,
|
|
142
|
+
};
|
|
143
|
+
// Only add Authorization header if we have an API key
|
|
144
|
+
if (this.apiKey) {
|
|
145
|
+
headers['Authorization'] = `Bearer ${this.apiKey}`;
|
|
146
|
+
}
|
|
147
|
+
return headers;
|
|
148
|
+
}
|
|
149
|
+
buildRequest(request) {
|
|
150
|
+
const messages = this.convertMessages(request.messages);
|
|
151
|
+
// Handle system prompt (same as openrouter.ts)
|
|
152
|
+
if (request.system) {
|
|
153
|
+
if (typeof request.system === 'string') {
|
|
154
|
+
messages.unshift({ role: 'system', content: request.system });
|
|
155
|
+
}
|
|
156
|
+
else if (Array.isArray(request.system)) {
|
|
157
|
+
const text = request.system
|
|
158
|
+
.filter((b) => b.type === 'text')
|
|
159
|
+
.map((b) => b.text)
|
|
160
|
+
.join('\n');
|
|
161
|
+
if (text) {
|
|
162
|
+
messages.unshift({ role: 'system', content: text });
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const params = {
|
|
167
|
+
model: request.model,
|
|
168
|
+
messages,
|
|
169
|
+
max_tokens: request.maxTokens || this.defaultMaxTokens,
|
|
170
|
+
};
|
|
171
|
+
if (request.temperature !== undefined) {
|
|
172
|
+
params.temperature = request.temperature;
|
|
173
|
+
}
|
|
174
|
+
if (request.topP !== undefined) {
|
|
175
|
+
params.top_p = request.topP;
|
|
176
|
+
}
|
|
177
|
+
if (request.presencePenalty !== undefined) {
|
|
178
|
+
params.presence_penalty = request.presencePenalty;
|
|
179
|
+
}
|
|
180
|
+
if (request.frequencyPenalty !== undefined) {
|
|
181
|
+
params.frequency_penalty = request.frequencyPenalty;
|
|
182
|
+
}
|
|
183
|
+
// OpenAI-compatible APIs may limit stop sequences (OpenAI: 4) — truncate to be safe
|
|
184
|
+
if (request.stopSequences && request.stopSequences.length > 0) {
|
|
185
|
+
params.stop = request.stopSequences.slice(0, 4);
|
|
186
|
+
}
|
|
187
|
+
if (request.tools && request.tools.length > 0) {
|
|
188
|
+
params.tools = this.convertTools(request.tools);
|
|
189
|
+
}
|
|
190
|
+
// Apply extra params (filter out internal membrane fields)
|
|
191
|
+
if (request.extra) {
|
|
192
|
+
const { normalizedMessages, prompt, ...rest } = request.extra;
|
|
193
|
+
Object.assign(params, rest);
|
|
194
|
+
}
|
|
195
|
+
return params;
|
|
196
|
+
}
|
|
197
|
+
convertMessages(messages) {
|
|
198
|
+
// Use flatMap to handle one-to-many expansion (multiple tool_results → multiple messages)
|
|
199
|
+
return messages.flatMap(msg => {
|
|
200
|
+
// If it's already in OpenAI format, pass through
|
|
201
|
+
if (msg.role && (typeof msg.content === 'string' || msg.content === null || msg.tool_calls)) {
|
|
202
|
+
return [msg];
|
|
203
|
+
}
|
|
204
|
+
// Convert from Anthropic-style format
|
|
205
|
+
if (Array.isArray(msg.content)) {
|
|
206
|
+
const contentParts = [];
|
|
207
|
+
const toolCalls = [];
|
|
208
|
+
const toolResults = [];
|
|
209
|
+
for (const block of msg.content) {
|
|
210
|
+
if (block.type === 'text') {
|
|
211
|
+
contentParts.push({ type: 'text', text: block.text });
|
|
212
|
+
}
|
|
213
|
+
else if (block.type === 'image') {
|
|
214
|
+
// Convert Anthropic-style image to OpenAI image_url with data URI
|
|
215
|
+
if (block.source?.type === 'base64') {
|
|
216
|
+
const mediaType = block.source.media_type ?? block.source.mediaType ?? 'image/png';
|
|
217
|
+
contentParts.push({
|
|
218
|
+
type: 'image_url',
|
|
219
|
+
image_url: { url: `data:${mediaType};base64,${block.source.data}` },
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
else if (block.source?.type === 'url') {
|
|
223
|
+
contentParts.push({
|
|
224
|
+
type: 'image_url',
|
|
225
|
+
image_url: { url: block.source.url },
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
else if (block.type === 'tool_use') {
|
|
230
|
+
toolCalls.push({
|
|
231
|
+
id: block.id,
|
|
232
|
+
type: 'function',
|
|
233
|
+
function: {
|
|
234
|
+
name: block.name,
|
|
235
|
+
arguments: JSON.stringify(block.input),
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
else if (block.type === 'tool_result') {
|
|
240
|
+
// Collect ALL tool results - each becomes a separate message
|
|
241
|
+
toolResults.push({
|
|
242
|
+
role: 'tool',
|
|
243
|
+
tool_call_id: block.tool_use_id || block.toolUseId,
|
|
244
|
+
content: typeof block.content === 'string' ? block.content : JSON.stringify(block.content),
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// If we have tool results, return them (possibly multiple)
|
|
249
|
+
if (toolResults.length > 0) {
|
|
250
|
+
return toolResults;
|
|
251
|
+
}
|
|
252
|
+
// Skip messages with no usable content
|
|
253
|
+
if (contentParts.length === 0 && toolCalls.length === 0) {
|
|
254
|
+
return [];
|
|
255
|
+
}
|
|
256
|
+
// Build message — use string content when there are no images (simpler, more compatible)
|
|
257
|
+
const hasImages = contentParts.some(p => p.type === 'image_url');
|
|
258
|
+
const textOnly = contentParts.filter(p => p.type === 'text').map(p => p.text).join('\n');
|
|
259
|
+
const result = {
|
|
260
|
+
role: msg.role,
|
|
261
|
+
content: hasImages ? contentParts : (textOnly || null),
|
|
262
|
+
};
|
|
263
|
+
if (toolCalls.length > 0) {
|
|
264
|
+
result.tool_calls = toolCalls;
|
|
265
|
+
}
|
|
266
|
+
return [result];
|
|
267
|
+
}
|
|
268
|
+
return [{
|
|
269
|
+
role: msg.role,
|
|
270
|
+
content: msg.content,
|
|
271
|
+
}];
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
convertTools(tools) {
|
|
275
|
+
return tools.map(tool => {
|
|
276
|
+
// Handle different input formats
|
|
277
|
+
const inputSchema = tool.inputSchema || tool.input_schema || { type: 'object', properties: {} };
|
|
278
|
+
return {
|
|
279
|
+
type: 'function',
|
|
280
|
+
function: {
|
|
281
|
+
name: tool.name,
|
|
282
|
+
description: tool.description,
|
|
283
|
+
parameters: inputSchema,
|
|
284
|
+
},
|
|
285
|
+
};
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
async makeRequest(request, options) {
|
|
289
|
+
const { signal: combinedSignal, cleanup } = createCombinedSignal(options?.signal, options?.timeoutMs);
|
|
290
|
+
try {
|
|
291
|
+
const response = await fetch(`${this.baseURL}/chat/completions`, {
|
|
292
|
+
method: 'POST',
|
|
293
|
+
headers: this.getHeaders(),
|
|
294
|
+
body: JSON.stringify(request),
|
|
295
|
+
signal: combinedSignal,
|
|
296
|
+
});
|
|
297
|
+
if (!response.ok) {
|
|
298
|
+
const errorText = await response.text();
|
|
299
|
+
throw new Error(`API error: ${response.status} ${errorText}`);
|
|
300
|
+
}
|
|
301
|
+
return await response.json();
|
|
302
|
+
}
|
|
303
|
+
finally {
|
|
304
|
+
cleanup?.();
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
parseResponse(response, requestedModel, rawRequest) {
|
|
308
|
+
const choice = response.choices[0];
|
|
309
|
+
const message = choice?.message;
|
|
310
|
+
return {
|
|
311
|
+
content: this.messageToContent(message),
|
|
312
|
+
stopReason: this.mapFinishReason(choice?.finish_reason),
|
|
313
|
+
stopSequence: undefined,
|
|
314
|
+
usage: {
|
|
315
|
+
inputTokens: response.usage?.prompt_tokens ?? 0,
|
|
316
|
+
outputTokens: response.usage?.completion_tokens ?? 0,
|
|
317
|
+
},
|
|
318
|
+
model: response.model ?? requestedModel,
|
|
319
|
+
rawRequest,
|
|
320
|
+
raw: response,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
parseStreamedResponse(message, finishReason, requestedModel, rawRequest) {
|
|
324
|
+
return {
|
|
325
|
+
content: this.messageToContent(message),
|
|
326
|
+
stopReason: this.mapFinishReason(finishReason),
|
|
327
|
+
stopSequence: undefined,
|
|
328
|
+
usage: {
|
|
329
|
+
inputTokens: 0, // Not available in streaming
|
|
330
|
+
outputTokens: 0,
|
|
331
|
+
},
|
|
332
|
+
model: requestedModel,
|
|
333
|
+
rawRequest,
|
|
334
|
+
raw: { message, finish_reason: finishReason },
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
messageToContent(message) {
|
|
338
|
+
if (!message)
|
|
339
|
+
return [];
|
|
340
|
+
const content = [];
|
|
341
|
+
if (message.content) {
|
|
342
|
+
const text = typeof message.content === 'string' ? message.content : message.content.filter(p => p.type === 'text').map(p => p.text).join('\n');
|
|
343
|
+
if (text)
|
|
344
|
+
content.push({ type: 'text', text });
|
|
345
|
+
}
|
|
346
|
+
if (message.tool_calls) {
|
|
347
|
+
for (const tc of message.tool_calls) {
|
|
348
|
+
content.push({
|
|
349
|
+
type: 'tool_use',
|
|
350
|
+
id: tc.id,
|
|
351
|
+
name: tc.function.name,
|
|
352
|
+
input: safeParseJson(tc.function.arguments),
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return content;
|
|
357
|
+
}
|
|
358
|
+
mapFinishReason(reason) {
|
|
359
|
+
switch (reason) {
|
|
360
|
+
case 'stop':
|
|
361
|
+
return 'end_turn';
|
|
362
|
+
case 'length':
|
|
363
|
+
return 'max_tokens';
|
|
364
|
+
case 'tool_calls':
|
|
365
|
+
return 'tool_use';
|
|
366
|
+
case 'content_filter':
|
|
367
|
+
return 'refusal';
|
|
368
|
+
default:
|
|
369
|
+
return 'end_turn';
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
handleError(error, rawRequest) {
|
|
373
|
+
if (error instanceof Error) {
|
|
374
|
+
const message = error.message;
|
|
375
|
+
if (message.includes('429') || message.includes('rate')) {
|
|
376
|
+
return rateLimitError(message, undefined, error, rawRequest);
|
|
377
|
+
}
|
|
378
|
+
if (message.includes('401') || message.includes('auth') || message.includes('Unauthorized')) {
|
|
379
|
+
return authError(message, error, rawRequest);
|
|
380
|
+
}
|
|
381
|
+
if (message.includes('context') || message.includes('too long') || message.includes('maximum context')) {
|
|
382
|
+
return contextLengthError(message, error, rawRequest);
|
|
383
|
+
}
|
|
384
|
+
if (message.includes('500') || message.includes('502') || message.includes('503')) {
|
|
385
|
+
return serverError(message, undefined, error, rawRequest);
|
|
386
|
+
}
|
|
387
|
+
if (error.name === 'AbortError') {
|
|
388
|
+
return abortError(undefined, rawRequest);
|
|
389
|
+
}
|
|
390
|
+
if (message.includes('network') || message.includes('fetch') || message.includes('ECONNREFUSED')) {
|
|
391
|
+
return networkError(message, error, rawRequest);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
return new MembraneError({
|
|
395
|
+
type: 'unknown',
|
|
396
|
+
message: error instanceof Error ? error.message : String(error),
|
|
397
|
+
retryable: false,
|
|
398
|
+
rawError: error,
|
|
399
|
+
rawRequest,
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
// ============================================================================
|
|
404
|
+
// Content Conversion Utilities
|
|
405
|
+
// ============================================================================
|
|
406
|
+
/**
|
|
407
|
+
* Convert normalized content blocks to OpenAI message format
|
|
408
|
+
*/
|
|
409
|
+
export function toOpenAIMessages(messages) {
|
|
410
|
+
const result = [];
|
|
411
|
+
for (const msg of messages) {
|
|
412
|
+
const textParts = [];
|
|
413
|
+
const toolCalls = [];
|
|
414
|
+
const toolResults = [];
|
|
415
|
+
for (const block of msg.content) {
|
|
416
|
+
if (block.type === 'text') {
|
|
417
|
+
textParts.push(block.text);
|
|
418
|
+
}
|
|
419
|
+
else if (block.type === 'tool_use') {
|
|
420
|
+
toolCalls.push({
|
|
421
|
+
id: block.id,
|
|
422
|
+
type: 'function',
|
|
423
|
+
function: {
|
|
424
|
+
name: block.name,
|
|
425
|
+
arguments: JSON.stringify(block.input),
|
|
426
|
+
},
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
else if (block.type === 'tool_result') {
|
|
430
|
+
toolResults.push({
|
|
431
|
+
id: block.toolUseId,
|
|
432
|
+
content: typeof block.content === 'string' ? block.content : JSON.stringify(block.content),
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
// Add main message
|
|
437
|
+
if (textParts.length > 0 || toolCalls.length > 0) {
|
|
438
|
+
const message = {
|
|
439
|
+
role: msg.role,
|
|
440
|
+
content: textParts.join('\n') || null,
|
|
441
|
+
};
|
|
442
|
+
if (toolCalls.length > 0) {
|
|
443
|
+
message.tool_calls = toolCalls;
|
|
444
|
+
}
|
|
445
|
+
result.push(message);
|
|
446
|
+
}
|
|
447
|
+
// Add tool results as separate messages
|
|
448
|
+
for (const tr of toolResults) {
|
|
449
|
+
result.push({
|
|
450
|
+
role: 'tool',
|
|
451
|
+
tool_call_id: tr.id,
|
|
452
|
+
content: tr.content,
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return result;
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Convert OpenAI response message to normalized content blocks
|
|
460
|
+
*/
|
|
461
|
+
export function fromOpenAIMessage(message) {
|
|
462
|
+
const result = [];
|
|
463
|
+
if (message.content) {
|
|
464
|
+
const text = typeof message.content === 'string' ? message.content : message.content.filter(p => p.type === 'text').map(p => p.text).join('\n');
|
|
465
|
+
if (text)
|
|
466
|
+
result.push({ type: 'text', text });
|
|
467
|
+
}
|
|
468
|
+
if (message.tool_calls) {
|
|
469
|
+
for (const tc of message.tool_calls) {
|
|
470
|
+
result.push({
|
|
471
|
+
type: 'tool_use',
|
|
472
|
+
id: tc.id,
|
|
473
|
+
name: tc.function.name,
|
|
474
|
+
input: safeParseJson(tc.function.arguments),
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
return result;
|
|
479
|
+
}
|
|
480
|
+
//# 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,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI-Compatible Completions adapter for base models
|
|
3
|
+
*
|
|
4
|
+
* For true base/completion models that use the `/v1/completions` endpoint:
|
|
5
|
+
* - No chat formatting built-in
|
|
6
|
+
* - Single text prompt input
|
|
7
|
+
* - Raw completion output
|
|
8
|
+
* - No image support
|
|
9
|
+
*
|
|
10
|
+
* Serializes conversations to Human:/Assistant: format.
|
|
11
|
+
*/
|
|
12
|
+
import type { ProviderAdapter, ProviderRequest, ProviderRequestOptions, ProviderResponse, StreamCallbacks } from '../types/index.js';
|
|
13
|
+
export interface OpenAICompletionsAdapterConfig {
|
|
14
|
+
/** Base URL for the API (required, e.g., 'http://localhost:8000/v1') */
|
|
15
|
+
baseURL: string;
|
|
16
|
+
/** API key (optional for local servers) */
|
|
17
|
+
apiKey?: string;
|
|
18
|
+
/** Provider name for logging/identification (default: 'openai-completions') */
|
|
19
|
+
providerName?: string;
|
|
20
|
+
/** Default max tokens */
|
|
21
|
+
defaultMaxTokens?: number;
|
|
22
|
+
/** Additional headers to include with requests */
|
|
23
|
+
extraHeaders?: Record<string, string>;
|
|
24
|
+
/**
|
|
25
|
+
* Name of the assistant participant (default: 'Assistant')
|
|
26
|
+
* Used to identify which messages are from the assistant and to
|
|
27
|
+
* add the final prompt prefix for completion.
|
|
28
|
+
*/
|
|
29
|
+
assistantName?: string;
|
|
30
|
+
/**
|
|
31
|
+
* End-of-turn token to append after each message (default: '<|eot|>')
|
|
32
|
+
* Set to empty string or null to disable.
|
|
33
|
+
*
|
|
34
|
+
* Example output with default:
|
|
35
|
+
* Alice: Hello<|eot|>
|
|
36
|
+
*
|
|
37
|
+
* Claude: Hi there!<|eot|>
|
|
38
|
+
*/
|
|
39
|
+
eotToken?: string | null;
|
|
40
|
+
/**
|
|
41
|
+
* Additional stop sequences beyond auto-generated participant-based ones.
|
|
42
|
+
* By default, stop sequences are generated from participant names in the
|
|
43
|
+
* conversation (e.g., "\n\nAlice:", "\nBob:").
|
|
44
|
+
*/
|
|
45
|
+
extraStopSequences?: string[];
|
|
46
|
+
/**
|
|
47
|
+
* Whether to warn when images are stripped from context (default: true)
|
|
48
|
+
*/
|
|
49
|
+
warnOnImageStrip?: boolean;
|
|
50
|
+
}
|
|
51
|
+
export declare class OpenAICompletionsAdapter implements ProviderAdapter {
|
|
52
|
+
readonly name: string;
|
|
53
|
+
private baseURL;
|
|
54
|
+
private apiKey;
|
|
55
|
+
private defaultMaxTokens;
|
|
56
|
+
private extraHeaders;
|
|
57
|
+
private assistantName;
|
|
58
|
+
private eotToken;
|
|
59
|
+
private extraStopSequences;
|
|
60
|
+
private warnOnImageStrip;
|
|
61
|
+
constructor(config: OpenAICompletionsAdapterConfig);
|
|
62
|
+
supportsModel(_modelId: string): boolean;
|
|
63
|
+
complete(request: ProviderRequest, options?: ProviderRequestOptions): Promise<ProviderResponse>;
|
|
64
|
+
stream(request: ProviderRequest, callbacks: StreamCallbacks, options?: ProviderRequestOptions): Promise<ProviderResponse>;
|
|
65
|
+
/**
|
|
66
|
+
* Serialize messages to "Participant: content<eot>" format for base models.
|
|
67
|
+
* Uses actual participant names from messages.
|
|
68
|
+
* Images are stripped from content.
|
|
69
|
+
*/
|
|
70
|
+
serializeToPrompt(messages: any[]): {
|
|
71
|
+
prompt: string;
|
|
72
|
+
participants: Set<string>;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Generate stop sequences from participant names.
|
|
76
|
+
* Prevents the model from generating turns for other participants.
|
|
77
|
+
*/
|
|
78
|
+
private generateStopSequences;
|
|
79
|
+
private extractTextContent;
|
|
80
|
+
private getHeaders;
|
|
81
|
+
private buildRequest;
|
|
82
|
+
private makeRequest;
|
|
83
|
+
private parseResponse;
|
|
84
|
+
private buildStreamedResponse;
|
|
85
|
+
private textToContent;
|
|
86
|
+
private mapFinishReason;
|
|
87
|
+
private handleError;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=openai-completions.d.ts.map
|