@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,492 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenRouter provider adapter
|
|
3
|
+
*
|
|
4
|
+
* Handles OpenAI-compatible API with tool_calls format
|
|
5
|
+
*/
|
|
6
|
+
import { MembraneError, rateLimitError, contextLengthError, authError, serverError, abortError, networkError, } from '../types/index.js';
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// OpenRouter Adapter
|
|
9
|
+
// ============================================================================
|
|
10
|
+
export class OpenRouterAdapter {
|
|
11
|
+
name = 'openrouter';
|
|
12
|
+
apiKey;
|
|
13
|
+
baseURL;
|
|
14
|
+
httpReferer;
|
|
15
|
+
xTitle;
|
|
16
|
+
defaultMaxTokens;
|
|
17
|
+
constructor(config = {}) {
|
|
18
|
+
this.apiKey = config.apiKey ?? process.env.OPENROUTER_API_KEY ?? '';
|
|
19
|
+
this.baseURL = config.baseURL ?? 'https://openrouter.ai/api/v1';
|
|
20
|
+
this.httpReferer = config.httpReferer ?? 'https://membrane.local';
|
|
21
|
+
this.xTitle = config.xTitle ?? 'Membrane';
|
|
22
|
+
this.defaultMaxTokens = config.defaultMaxTokens ?? 4096;
|
|
23
|
+
if (!this.apiKey) {
|
|
24
|
+
throw new Error('OpenRouter API key not provided');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
supportsModel(modelId) {
|
|
28
|
+
// OpenRouter supports many models
|
|
29
|
+
return modelId.includes('/');
|
|
30
|
+
}
|
|
31
|
+
async complete(request, options) {
|
|
32
|
+
const openRouterRequest = this.buildRequest(request);
|
|
33
|
+
try {
|
|
34
|
+
const response = await this.makeRequest(openRouterRequest, options);
|
|
35
|
+
return this.parseResponse(response, request.model);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
throw this.handleError(error);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async stream(request, callbacks, options) {
|
|
42
|
+
const openRouterRequest = this.buildRequest(request);
|
|
43
|
+
openRouterRequest.stream = true;
|
|
44
|
+
// Request usage data in stream for cache metrics
|
|
45
|
+
openRouterRequest.stream_options = { include_usage: true };
|
|
46
|
+
try {
|
|
47
|
+
const response = await fetch(`${this.baseURL}/chat/completions`, {
|
|
48
|
+
method: 'POST',
|
|
49
|
+
headers: this.getHeaders(),
|
|
50
|
+
body: JSON.stringify(openRouterRequest),
|
|
51
|
+
signal: options?.signal,
|
|
52
|
+
});
|
|
53
|
+
if (!response.ok) {
|
|
54
|
+
const errorText = await response.text();
|
|
55
|
+
throw new Error(`OpenRouter error: ${response.status} ${errorText}`);
|
|
56
|
+
}
|
|
57
|
+
const reader = response.body?.getReader();
|
|
58
|
+
if (!reader) {
|
|
59
|
+
throw new Error('No response body');
|
|
60
|
+
}
|
|
61
|
+
const decoder = new TextDecoder();
|
|
62
|
+
let accumulated = '';
|
|
63
|
+
let finishReason = 'stop';
|
|
64
|
+
let toolCalls = [];
|
|
65
|
+
let streamUsage;
|
|
66
|
+
while (true) {
|
|
67
|
+
const { done, value } = await reader.read();
|
|
68
|
+
if (done)
|
|
69
|
+
break;
|
|
70
|
+
const chunk = decoder.decode(value, { stream: true });
|
|
71
|
+
const lines = chunk.split('\n').filter(line => line.startsWith('data: '));
|
|
72
|
+
for (const line of lines) {
|
|
73
|
+
const data = line.slice(6);
|
|
74
|
+
if (data === '[DONE]')
|
|
75
|
+
continue;
|
|
76
|
+
try {
|
|
77
|
+
const parsed = JSON.parse(data);
|
|
78
|
+
const delta = parsed.choices?.[0]?.delta;
|
|
79
|
+
if (delta?.content) {
|
|
80
|
+
accumulated += delta.content;
|
|
81
|
+
callbacks.onChunk(delta.content);
|
|
82
|
+
}
|
|
83
|
+
// Handle streaming tool calls
|
|
84
|
+
if (delta?.tool_calls) {
|
|
85
|
+
for (const tc of delta.tool_calls) {
|
|
86
|
+
const index = tc.index ?? 0;
|
|
87
|
+
if (!toolCalls[index]) {
|
|
88
|
+
toolCalls[index] = {
|
|
89
|
+
id: tc.id ?? '',
|
|
90
|
+
type: 'function',
|
|
91
|
+
function: { name: '', arguments: '' },
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
if (tc.id)
|
|
95
|
+
toolCalls[index].id = tc.id;
|
|
96
|
+
if (tc.function?.name)
|
|
97
|
+
toolCalls[index].function.name = tc.function.name;
|
|
98
|
+
if (tc.function?.arguments) {
|
|
99
|
+
toolCalls[index].function.arguments += tc.function.arguments;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (parsed.choices?.[0]?.finish_reason) {
|
|
104
|
+
finishReason = parsed.choices[0].finish_reason;
|
|
105
|
+
}
|
|
106
|
+
// Capture usage data (comes in final chunk when stream_options.include_usage is set)
|
|
107
|
+
if (parsed.usage) {
|
|
108
|
+
streamUsage = parsed.usage;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
// Ignore parse errors
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Build response with accumulated data
|
|
117
|
+
const message = {
|
|
118
|
+
role: 'assistant',
|
|
119
|
+
content: accumulated || null,
|
|
120
|
+
};
|
|
121
|
+
if (toolCalls.length > 0) {
|
|
122
|
+
message.tool_calls = toolCalls;
|
|
123
|
+
}
|
|
124
|
+
return this.parseStreamedResponse(message, finishReason, request.model, streamUsage);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
throw this.handleError(error);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
getHeaders() {
|
|
131
|
+
return {
|
|
132
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
133
|
+
'Content-Type': 'application/json',
|
|
134
|
+
'HTTP-Referer': this.httpReferer,
|
|
135
|
+
'X-Title': this.xTitle,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
buildRequest(request) {
|
|
139
|
+
const messages = this.convertMessages(request.messages);
|
|
140
|
+
const params = {
|
|
141
|
+
model: request.model,
|
|
142
|
+
messages,
|
|
143
|
+
max_tokens: request.maxTokens || this.defaultMaxTokens,
|
|
144
|
+
};
|
|
145
|
+
// Handle system prompt (can be string or content blocks with cache_control)
|
|
146
|
+
if (request.system) {
|
|
147
|
+
if (typeof request.system === 'string') {
|
|
148
|
+
// Simple string system prompt - prepend as system message
|
|
149
|
+
messages.unshift({ role: 'system', content: request.system });
|
|
150
|
+
}
|
|
151
|
+
else if (Array.isArray(request.system)) {
|
|
152
|
+
// Content blocks with potential cache_control - preserve for Claude caching
|
|
153
|
+
const hasCache = request.system.some((block) => block.cache_control);
|
|
154
|
+
if (hasCache) {
|
|
155
|
+
// Preserve cache_control in content block format for Claude
|
|
156
|
+
messages.unshift({
|
|
157
|
+
role: 'system',
|
|
158
|
+
content: request.system,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
// No caching, just join text
|
|
163
|
+
const text = request.system
|
|
164
|
+
.filter((b) => b.type === 'text')
|
|
165
|
+
.map((b) => b.text)
|
|
166
|
+
.join('\n');
|
|
167
|
+
messages.unshift({ role: 'system', content: text });
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (request.temperature !== undefined) {
|
|
172
|
+
params.temperature = request.temperature;
|
|
173
|
+
}
|
|
174
|
+
if (request.stopSequences && request.stopSequences.length > 0) {
|
|
175
|
+
params.stop = request.stopSequences;
|
|
176
|
+
}
|
|
177
|
+
if (request.tools && request.tools.length > 0) {
|
|
178
|
+
// Check if tools are already in OpenRouter format (from buildNativeToolRequest)
|
|
179
|
+
const firstTool = request.tools[0];
|
|
180
|
+
if (firstTool.input_schema) {
|
|
181
|
+
// Already in provider format
|
|
182
|
+
params.tools = request.tools.map((t) => ({
|
|
183
|
+
type: 'function',
|
|
184
|
+
function: {
|
|
185
|
+
name: t.name,
|
|
186
|
+
description: t.description,
|
|
187
|
+
parameters: t.input_schema,
|
|
188
|
+
},
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
else if (firstTool.inputSchema) {
|
|
192
|
+
// In ToolDefinition format
|
|
193
|
+
params.tools = this.convertTools(request.tools);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
// Unknown format, pass through
|
|
197
|
+
params.tools = request.tools;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Apply extra params
|
|
201
|
+
if (request.extra) {
|
|
202
|
+
Object.assign(params, request.extra);
|
|
203
|
+
}
|
|
204
|
+
return params;
|
|
205
|
+
}
|
|
206
|
+
convertMessages(messages) {
|
|
207
|
+
// Use flatMap to handle one-to-many expansion (multiple tool_results → multiple messages)
|
|
208
|
+
return messages.flatMap(msg => {
|
|
209
|
+
// If it's already in OpenRouter format, pass through
|
|
210
|
+
if (msg.role && (typeof msg.content === 'string' || msg.content === null || msg.tool_calls)) {
|
|
211
|
+
return [msg];
|
|
212
|
+
}
|
|
213
|
+
// Convert from Anthropic-style format
|
|
214
|
+
if (Array.isArray(msg.content)) {
|
|
215
|
+
// Check if any block has cache_control - if so, preserve the array format
|
|
216
|
+
// This is needed for Claude models through OpenRouter to use prompt caching
|
|
217
|
+
const hasCache = msg.content.some((block) => block.cache_control);
|
|
218
|
+
const toolCalls = [];
|
|
219
|
+
const contentBlocks = [];
|
|
220
|
+
const textParts = [];
|
|
221
|
+
const toolResults = [];
|
|
222
|
+
for (const block of msg.content) {
|
|
223
|
+
if (block.type === 'text') {
|
|
224
|
+
if (hasCache) {
|
|
225
|
+
// Preserve cache_control in content block format
|
|
226
|
+
const contentBlock = {
|
|
227
|
+
type: 'text',
|
|
228
|
+
text: block.text,
|
|
229
|
+
};
|
|
230
|
+
if (block.cache_control) {
|
|
231
|
+
contentBlock.cache_control = block.cache_control;
|
|
232
|
+
}
|
|
233
|
+
contentBlocks.push(contentBlock);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
textParts.push(block.text);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
else if (block.type === 'tool_use') {
|
|
240
|
+
toolCalls.push({
|
|
241
|
+
id: block.id,
|
|
242
|
+
type: 'function',
|
|
243
|
+
function: {
|
|
244
|
+
name: block.name,
|
|
245
|
+
arguments: JSON.stringify(block.input),
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
else if (block.type === 'tool_result') {
|
|
250
|
+
// Collect ALL tool results - each becomes a separate message
|
|
251
|
+
toolResults.push({
|
|
252
|
+
role: 'tool',
|
|
253
|
+
tool_call_id: block.tool_use_id || block.toolUseId,
|
|
254
|
+
content: typeof block.content === 'string' ? block.content : JSON.stringify(block.content),
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// If we have tool results, return them (possibly multiple)
|
|
259
|
+
if (toolResults.length > 0) {
|
|
260
|
+
return toolResults;
|
|
261
|
+
}
|
|
262
|
+
// Otherwise build normal message
|
|
263
|
+
const result = {
|
|
264
|
+
role: msg.role,
|
|
265
|
+
// Use content blocks array if caching is in use, otherwise concatenate text
|
|
266
|
+
content: hasCache ? contentBlocks : (textParts.join('\n') || null),
|
|
267
|
+
};
|
|
268
|
+
if (toolCalls.length > 0) {
|
|
269
|
+
result.tool_calls = toolCalls;
|
|
270
|
+
}
|
|
271
|
+
return [result];
|
|
272
|
+
}
|
|
273
|
+
return [{
|
|
274
|
+
role: msg.role,
|
|
275
|
+
content: msg.content,
|
|
276
|
+
}];
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
convertTools(tools) {
|
|
280
|
+
return tools.map(tool => ({
|
|
281
|
+
type: 'function',
|
|
282
|
+
function: {
|
|
283
|
+
name: tool.name,
|
|
284
|
+
description: tool.description,
|
|
285
|
+
parameters: tool.inputSchema,
|
|
286
|
+
},
|
|
287
|
+
}));
|
|
288
|
+
}
|
|
289
|
+
async makeRequest(request, options) {
|
|
290
|
+
const response = await fetch(`${this.baseURL}/chat/completions`, {
|
|
291
|
+
method: 'POST',
|
|
292
|
+
headers: this.getHeaders(),
|
|
293
|
+
body: JSON.stringify(request),
|
|
294
|
+
signal: options?.signal,
|
|
295
|
+
});
|
|
296
|
+
if (!response.ok) {
|
|
297
|
+
const errorText = await response.text();
|
|
298
|
+
throw new Error(`OpenRouter error: ${response.status} ${errorText}`);
|
|
299
|
+
}
|
|
300
|
+
return response.json();
|
|
301
|
+
}
|
|
302
|
+
parseResponse(response, requestedModel) {
|
|
303
|
+
const choice = response.choices[0];
|
|
304
|
+
const message = choice?.message;
|
|
305
|
+
// Extract cache tokens - OpenRouter passes through both Anthropic and OpenAI caching
|
|
306
|
+
// Anthropic: cache_creation_input_tokens, cache_read_input_tokens
|
|
307
|
+
// OpenAI: prompt_tokens_details.cached_tokens
|
|
308
|
+
const cacheCreationTokens = response.usage?.cache_creation_input_tokens;
|
|
309
|
+
const cacheReadTokens = response.usage?.cache_read_input_tokens
|
|
310
|
+
?? response.usage?.prompt_tokens_details?.cached_tokens;
|
|
311
|
+
return {
|
|
312
|
+
content: this.messageToContent(message),
|
|
313
|
+
stopReason: this.mapFinishReason(choice?.finish_reason),
|
|
314
|
+
stopSequence: undefined,
|
|
315
|
+
usage: {
|
|
316
|
+
inputTokens: response.usage?.prompt_tokens ?? 0,
|
|
317
|
+
outputTokens: response.usage?.completion_tokens ?? 0,
|
|
318
|
+
cacheCreationTokens: cacheCreationTokens ?? undefined,
|
|
319
|
+
cacheReadTokens: cacheReadTokens ?? undefined,
|
|
320
|
+
},
|
|
321
|
+
model: response.model ?? requestedModel,
|
|
322
|
+
raw: response,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
parseStreamedResponse(message, finishReason, requestedModel, streamUsage) {
|
|
326
|
+
// Extract cache tokens if available from stream usage
|
|
327
|
+
const cacheCreationTokens = streamUsage?.cache_creation_input_tokens;
|
|
328
|
+
const cacheReadTokens = streamUsage?.cache_read_input_tokens
|
|
329
|
+
?? streamUsage?.prompt_tokens_details?.cached_tokens;
|
|
330
|
+
return {
|
|
331
|
+
content: this.messageToContent(message),
|
|
332
|
+
stopReason: this.mapFinishReason(finishReason),
|
|
333
|
+
stopSequence: undefined,
|
|
334
|
+
usage: {
|
|
335
|
+
inputTokens: streamUsage?.prompt_tokens ?? 0,
|
|
336
|
+
outputTokens: streamUsage?.completion_tokens ?? 0,
|
|
337
|
+
cacheCreationTokens: cacheCreationTokens ?? undefined,
|
|
338
|
+
cacheReadTokens: cacheReadTokens ?? undefined,
|
|
339
|
+
},
|
|
340
|
+
model: requestedModel,
|
|
341
|
+
raw: { message, finish_reason: finishReason, usage: streamUsage },
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
messageToContent(message) {
|
|
345
|
+
if (!message)
|
|
346
|
+
return [];
|
|
347
|
+
const content = [];
|
|
348
|
+
if (message.content) {
|
|
349
|
+
content.push({ type: 'text', text: message.content });
|
|
350
|
+
}
|
|
351
|
+
if (message.tool_calls) {
|
|
352
|
+
for (const tc of message.tool_calls) {
|
|
353
|
+
content.push({
|
|
354
|
+
type: 'tool_use',
|
|
355
|
+
id: tc.id,
|
|
356
|
+
name: tc.function.name,
|
|
357
|
+
input: JSON.parse(tc.function.arguments || '{}'),
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return content;
|
|
362
|
+
}
|
|
363
|
+
mapFinishReason(reason) {
|
|
364
|
+
switch (reason) {
|
|
365
|
+
case 'stop':
|
|
366
|
+
return 'end_turn';
|
|
367
|
+
case 'length':
|
|
368
|
+
return 'max_tokens';
|
|
369
|
+
case 'tool_calls':
|
|
370
|
+
return 'tool_use';
|
|
371
|
+
case 'content_filter':
|
|
372
|
+
return 'refusal';
|
|
373
|
+
default:
|
|
374
|
+
return 'end_turn';
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
handleError(error) {
|
|
378
|
+
if (error instanceof Error) {
|
|
379
|
+
const message = error.message;
|
|
380
|
+
if (message.includes('429') || message.includes('rate')) {
|
|
381
|
+
return rateLimitError(message, undefined, error);
|
|
382
|
+
}
|
|
383
|
+
if (message.includes('401') || message.includes('auth')) {
|
|
384
|
+
return authError(message, error);
|
|
385
|
+
}
|
|
386
|
+
if (message.includes('context') || message.includes('too long')) {
|
|
387
|
+
return contextLengthError(message, error);
|
|
388
|
+
}
|
|
389
|
+
if (message.includes('500') || message.includes('502') || message.includes('503')) {
|
|
390
|
+
return serverError(message, undefined, error);
|
|
391
|
+
}
|
|
392
|
+
if (error.name === 'AbortError') {
|
|
393
|
+
return abortError();
|
|
394
|
+
}
|
|
395
|
+
if (message.includes('network') || message.includes('fetch')) {
|
|
396
|
+
return networkError(message, error);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
return new MembraneError({
|
|
400
|
+
type: 'unknown',
|
|
401
|
+
message: error instanceof Error ? error.message : String(error),
|
|
402
|
+
retryable: false,
|
|
403
|
+
rawError: error,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
// ============================================================================
|
|
408
|
+
// Content Conversion Utilities
|
|
409
|
+
// ============================================================================
|
|
410
|
+
/**
|
|
411
|
+
* Convert normalized content blocks to OpenRouter format
|
|
412
|
+
*/
|
|
413
|
+
export function toOpenRouterMessages(messages) {
|
|
414
|
+
const result = [];
|
|
415
|
+
for (const msg of messages) {
|
|
416
|
+
const textParts = [];
|
|
417
|
+
const toolCalls = [];
|
|
418
|
+
const toolResults = [];
|
|
419
|
+
for (const block of msg.content) {
|
|
420
|
+
if (block.type === 'text') {
|
|
421
|
+
textParts.push(block.text);
|
|
422
|
+
}
|
|
423
|
+
else if (block.type === 'tool_use') {
|
|
424
|
+
toolCalls.push({
|
|
425
|
+
id: block.id,
|
|
426
|
+
type: 'function',
|
|
427
|
+
function: {
|
|
428
|
+
name: block.name,
|
|
429
|
+
arguments: JSON.stringify(block.input),
|
|
430
|
+
},
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
else if (block.type === 'tool_result') {
|
|
434
|
+
toolResults.push({
|
|
435
|
+
id: block.toolUseId,
|
|
436
|
+
content: typeof block.content === 'string' ? block.content : JSON.stringify(block.content),
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
// Add main message
|
|
441
|
+
if (textParts.length > 0 || toolCalls.length > 0) {
|
|
442
|
+
const message = {
|
|
443
|
+
role: msg.role,
|
|
444
|
+
content: textParts.join('\n') || null,
|
|
445
|
+
};
|
|
446
|
+
if (toolCalls.length > 0) {
|
|
447
|
+
message.tool_calls = toolCalls;
|
|
448
|
+
}
|
|
449
|
+
result.push(message);
|
|
450
|
+
}
|
|
451
|
+
// Add tool results as separate messages
|
|
452
|
+
for (const tr of toolResults) {
|
|
453
|
+
result.push({
|
|
454
|
+
role: 'tool',
|
|
455
|
+
tool_call_id: tr.id,
|
|
456
|
+
content: tr.content,
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
return result;
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Convert OpenRouter response to normalized content blocks
|
|
464
|
+
*/
|
|
465
|
+
export function fromOpenRouterMessage(message) {
|
|
466
|
+
const result = [];
|
|
467
|
+
if (message.content) {
|
|
468
|
+
if (typeof message.content === 'string') {
|
|
469
|
+
result.push({ type: 'text', text: message.content });
|
|
470
|
+
}
|
|
471
|
+
else if (Array.isArray(message.content)) {
|
|
472
|
+
// Content blocks array - extract text (cache_control is for requests only)
|
|
473
|
+
for (const block of message.content) {
|
|
474
|
+
if (block.type === 'text') {
|
|
475
|
+
result.push({ type: 'text', text: block.text });
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
if (message.tool_calls) {
|
|
481
|
+
for (const tc of message.tool_calls) {
|
|
482
|
+
result.push({
|
|
483
|
+
type: 'tool_use',
|
|
484
|
+
id: tc.id,
|
|
485
|
+
name: tc.function.name,
|
|
486
|
+
input: JSON.parse(tc.function.arguments || '{}'),
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
return result;
|
|
491
|
+
}
|
|
492
|
+
//# sourceMappingURL=openrouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat mode transforms
|
|
3
|
+
*
|
|
4
|
+
* Converts normalized messages to role-based alternating format
|
|
5
|
+
* for providers that don't support prefill mode.
|
|
6
|
+
*/
|
|
7
|
+
import type { NormalizedRequest } from '../types/index.js';
|
|
8
|
+
export interface ChatMessage {
|
|
9
|
+
role: 'user' | 'assistant';
|
|
10
|
+
content: ChatContent[];
|
|
11
|
+
}
|
|
12
|
+
export type ChatContent = {
|
|
13
|
+
type: 'text';
|
|
14
|
+
text: string;
|
|
15
|
+
} | {
|
|
16
|
+
type: 'image';
|
|
17
|
+
source: {
|
|
18
|
+
type: 'base64';
|
|
19
|
+
data: string;
|
|
20
|
+
mediaType: string;
|
|
21
|
+
};
|
|
22
|
+
} | {
|
|
23
|
+
type: 'tool_use';
|
|
24
|
+
id: string;
|
|
25
|
+
name: string;
|
|
26
|
+
input: Record<string, unknown>;
|
|
27
|
+
} | {
|
|
28
|
+
type: 'tool_result';
|
|
29
|
+
tool_use_id: string;
|
|
30
|
+
content: string;
|
|
31
|
+
};
|
|
32
|
+
export interface ChatTransformResult {
|
|
33
|
+
/** System prompt */
|
|
34
|
+
system: string;
|
|
35
|
+
/** Messages in role-based format */
|
|
36
|
+
messages: ChatMessage[];
|
|
37
|
+
/** Stop sequences to use */
|
|
38
|
+
stopSequences: string[];
|
|
39
|
+
}
|
|
40
|
+
export interface ChatTransformOptions {
|
|
41
|
+
/** Name of the assistant participant (default: 'Claude') */
|
|
42
|
+
assistantName?: string;
|
|
43
|
+
/** Names to treat as 'user' role */
|
|
44
|
+
userParticipants?: string[];
|
|
45
|
+
/** How to handle multiple consecutive same-role messages */
|
|
46
|
+
mergeStrategy?: 'concatenate' | 'separate';
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Transform normalized request to chat format
|
|
50
|
+
*/
|
|
51
|
+
export declare function transformToChat(request: NormalizedRequest, options?: ChatTransformOptions): ChatTransformResult;
|
|
52
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/transforms/chat.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,mBAAmB,CAAC;AAO3B,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC9E;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC9E;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAElE,MAAM,WAAW,mBAAmB;IAClC,oBAAoB;IACpB,MAAM,EAAE,MAAM,CAAC;IAEf,oCAAoC;IACpC,QAAQ,EAAE,WAAW,EAAE,CAAC;IAExB,4BAA4B;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAMD,MAAM,WAAW,oBAAoB;IACnC,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,oCAAoC;IACpC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE5B,4DAA4D;IAC5D,aAAa,CAAC,EAAE,aAAa,GAAG,UAAU,CAAC;CAC5C;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CAqCrB"}
|