@relayplane/proxy 1.8.6 → 1.8.7
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/config.d.ts +42 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -0
- package/dist/config.js.map +1 -1
- package/dist/cross-provider-cascade.d.ts +137 -0
- package/dist/cross-provider-cascade.d.ts.map +1 -0
- package/dist/cross-provider-cascade.js +258 -0
- package/dist/cross-provider-cascade.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/ollama.d.ts +264 -0
- package/dist/ollama.d.ts.map +1 -0
- package/dist/ollama.js +510 -0
- package/dist/ollama.js.map +1 -0
- package/dist/standalone-proxy.d.ts +1 -1
- package/dist/standalone-proxy.d.ts.map +1 -1
- package/dist/standalone-proxy.js +308 -12
- package/dist/standalone-proxy.js.map +1 -1
- package/package.json +1 -1
package/dist/ollama.js
ADDED
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Ollama Local Model Provider
|
|
4
|
+
*
|
|
5
|
+
* Routes requests to a local Ollama instance for cost-free inference.
|
|
6
|
+
* Handles API format translation between OpenAI-compatible and Ollama's
|
|
7
|
+
* native /api/chat endpoint.
|
|
8
|
+
*
|
|
9
|
+
* Features:
|
|
10
|
+
* - Configurable base URL (default: http://localhost:11434)
|
|
11
|
+
* - Model availability detection with graceful fallback
|
|
12
|
+
* - Complexity-based routing (route "simple" tasks to local models)
|
|
13
|
+
* - OpenAI-compatible response format translation
|
|
14
|
+
* - Streaming support (SSE)
|
|
15
|
+
* - Health checking for availability
|
|
16
|
+
*
|
|
17
|
+
* Ollama API reference: https://github.com/ollama/ollama/blob/main/docs/api.md
|
|
18
|
+
*
|
|
19
|
+
* @packageDocumentation
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.CLOUD_TO_OLLAMA_MODEL_MAP = exports.OLLAMA_DEFAULTS = void 0;
|
|
23
|
+
exports.checkOllamaHealth = checkOllamaHealth;
|
|
24
|
+
exports.shouldRouteToOllama = shouldRouteToOllama;
|
|
25
|
+
exports.resolveOllamaModel = resolveOllamaModel;
|
|
26
|
+
exports.convertMessagesToOllama = convertMessagesToOllama;
|
|
27
|
+
exports.buildOllamaRequest = buildOllamaRequest;
|
|
28
|
+
exports.convertOllamaResponse = convertOllamaResponse;
|
|
29
|
+
exports.convertOllamaStreamChunk = convertOllamaStreamChunk;
|
|
30
|
+
exports.forwardToOllama = forwardToOllama;
|
|
31
|
+
exports.forwardToOllamaStream = forwardToOllamaStream;
|
|
32
|
+
exports.checkOllamaHealthCached = checkOllamaHealthCached;
|
|
33
|
+
exports.clearOllamaHealthCache = clearOllamaHealthCache;
|
|
34
|
+
exports.mapCloudModelToOllama = mapCloudModelToOllama;
|
|
35
|
+
/** Default Ollama configuration values */
|
|
36
|
+
exports.OLLAMA_DEFAULTS = {
|
|
37
|
+
baseUrl: 'http://localhost:11434',
|
|
38
|
+
timeoutMs: 120_000,
|
|
39
|
+
models: [],
|
|
40
|
+
enabled: true,
|
|
41
|
+
};
|
|
42
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
43
|
+
// Health & Availability
|
|
44
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
45
|
+
/**
|
|
46
|
+
* Check if the Ollama server is running and list available models.
|
|
47
|
+
* Non-blocking, with a short timeout.
|
|
48
|
+
*/
|
|
49
|
+
async function checkOllamaHealth(baseUrl = exports.OLLAMA_DEFAULTS.baseUrl, timeoutMs = 5000) {
|
|
50
|
+
const start = Date.now();
|
|
51
|
+
try {
|
|
52
|
+
const controller = new AbortController();
|
|
53
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
54
|
+
const res = await fetch(`${baseUrl}/api/tags`, {
|
|
55
|
+
signal: controller.signal,
|
|
56
|
+
});
|
|
57
|
+
clearTimeout(timeout);
|
|
58
|
+
if (!res.ok) {
|
|
59
|
+
return {
|
|
60
|
+
available: false,
|
|
61
|
+
models: [],
|
|
62
|
+
error: `Ollama returned HTTP ${res.status}`,
|
|
63
|
+
responseTimeMs: Date.now() - start,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const data = (await res.json());
|
|
67
|
+
const models = (data.models ?? []).map((m) => m.name.replace(/:latest$/, ''));
|
|
68
|
+
return {
|
|
69
|
+
available: true,
|
|
70
|
+
models,
|
|
71
|
+
responseTimeMs: Date.now() - start,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
76
|
+
// AbortError means timeout
|
|
77
|
+
const isTimeout = errMsg.includes('abort') || errMsg.includes('AbortError');
|
|
78
|
+
return {
|
|
79
|
+
available: false,
|
|
80
|
+
models: [],
|
|
81
|
+
error: isTimeout ? `Ollama health check timed out (${timeoutMs}ms)` : `Ollama not reachable: ${errMsg}`,
|
|
82
|
+
responseTimeMs: Date.now() - start,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
87
|
+
// Routing Decision
|
|
88
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
89
|
+
/**
|
|
90
|
+
* Determine whether a request should be routed to Ollama based on config.
|
|
91
|
+
*
|
|
92
|
+
* @param config - Ollama provider configuration
|
|
93
|
+
* @param complexity - Classified complexity of the request (simple/moderate/complex)
|
|
94
|
+
* @param taskType - Inferred task type
|
|
95
|
+
* @param model - Requested model name (may match an Ollama model)
|
|
96
|
+
*
|
|
97
|
+
* @returns true if the request should be routed to Ollama
|
|
98
|
+
*/
|
|
99
|
+
function shouldRouteToOllama(config, complexity, taskType, model) {
|
|
100
|
+
if (config.enabled === false)
|
|
101
|
+
return false;
|
|
102
|
+
// If the model name directly matches an Ollama model, route there
|
|
103
|
+
if (model && config.models?.includes(model)) {
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
// If model is prefixed with "ollama/" route there
|
|
107
|
+
if (model?.startsWith('ollama/')) {
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
const routeWhen = config.routeWhen;
|
|
111
|
+
if (!routeWhen)
|
|
112
|
+
return false;
|
|
113
|
+
// Check complexity-based routing
|
|
114
|
+
if (routeWhen.complexity && complexity) {
|
|
115
|
+
if (routeWhen.complexity.includes(complexity)) {
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Check task-type-based routing
|
|
120
|
+
if (routeWhen.taskTypes && taskType) {
|
|
121
|
+
if (routeWhen.taskTypes.includes(taskType)) {
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Resolve the Ollama model name from a requested model string.
|
|
129
|
+
*
|
|
130
|
+
* - "ollama/llama3.2" → "llama3.2"
|
|
131
|
+
* - "llama3.2" (if in models list) → "llama3.2"
|
|
132
|
+
* - Unknown model → defaultModel or first in models list
|
|
133
|
+
*/
|
|
134
|
+
function resolveOllamaModel(requestedModel, config) {
|
|
135
|
+
// Strip "ollama/" prefix
|
|
136
|
+
if (requestedModel.startsWith('ollama/')) {
|
|
137
|
+
return requestedModel.slice('ollama/'.length);
|
|
138
|
+
}
|
|
139
|
+
// Direct match in configured models
|
|
140
|
+
if (config.models?.includes(requestedModel)) {
|
|
141
|
+
return requestedModel;
|
|
142
|
+
}
|
|
143
|
+
// Default model
|
|
144
|
+
return config.defaultModel ?? config.models?.[0] ?? requestedModel;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Convert OpenAI-format messages to Ollama format.
|
|
148
|
+
*
|
|
149
|
+
* Ollama messages are simpler:
|
|
150
|
+
* - role: "system" | "user" | "assistant"
|
|
151
|
+
* - content: string (no array / multimodal blocks in base API)
|
|
152
|
+
* - Tool calls are passed through for models that support them
|
|
153
|
+
*/
|
|
154
|
+
function convertMessagesToOllama(messages) {
|
|
155
|
+
return messages.map((msg) => {
|
|
156
|
+
let content = '';
|
|
157
|
+
if (typeof msg.content === 'string') {
|
|
158
|
+
content = msg.content;
|
|
159
|
+
}
|
|
160
|
+
else if (Array.isArray(msg.content)) {
|
|
161
|
+
// Flatten multimodal content blocks to text
|
|
162
|
+
content = msg.content
|
|
163
|
+
.filter((p) => p.type === 'text')
|
|
164
|
+
.map((p) => p.text ?? '')
|
|
165
|
+
.join('\n');
|
|
166
|
+
}
|
|
167
|
+
// Map "tool" role to "user" for Ollama (tool results)
|
|
168
|
+
const role = msg.role === 'tool' ? 'user' : msg.role;
|
|
169
|
+
return { role, content };
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Build an Ollama /api/chat request body from an OpenAI-compatible request.
|
|
174
|
+
*/
|
|
175
|
+
function buildOllamaRequest(model, messages, stream, options) {
|
|
176
|
+
const ollamaMessages = convertMessagesToOllama(messages);
|
|
177
|
+
const req = {
|
|
178
|
+
model,
|
|
179
|
+
messages: ollamaMessages,
|
|
180
|
+
stream,
|
|
181
|
+
};
|
|
182
|
+
// Map OpenAI options to Ollama options
|
|
183
|
+
if (options?.temperature !== undefined || options?.max_tokens !== undefined) {
|
|
184
|
+
req.options = {};
|
|
185
|
+
if (options.temperature !== undefined) {
|
|
186
|
+
req.options.temperature = options.temperature;
|
|
187
|
+
}
|
|
188
|
+
if (options.max_tokens !== undefined) {
|
|
189
|
+
req.options.num_predict = options.max_tokens;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Pass through tools if the model supports them
|
|
193
|
+
if (options?.tools && options.tools.length > 0) {
|
|
194
|
+
req.tools = options.tools;
|
|
195
|
+
}
|
|
196
|
+
return req;
|
|
197
|
+
}
|
|
198
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
199
|
+
// Response Translation: Ollama → OpenAI
|
|
200
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
201
|
+
/**
|
|
202
|
+
* Convert an Ollama /api/chat response to OpenAI chat completion format.
|
|
203
|
+
*/
|
|
204
|
+
function convertOllamaResponse(ollamaData, requestedModel) {
|
|
205
|
+
const message = {
|
|
206
|
+
role: 'assistant',
|
|
207
|
+
content: ollamaData.message.content || null,
|
|
208
|
+
};
|
|
209
|
+
let finishReason = 'stop';
|
|
210
|
+
// Handle tool calls if present
|
|
211
|
+
if (ollamaData.message.tool_calls && ollamaData.message.tool_calls.length > 0) {
|
|
212
|
+
message['tool_calls'] = ollamaData.message.tool_calls.map((tc, i) => ({
|
|
213
|
+
id: `call_ollama_${Date.now()}_${i}`,
|
|
214
|
+
type: 'function',
|
|
215
|
+
function: {
|
|
216
|
+
name: tc.function.name,
|
|
217
|
+
arguments: JSON.stringify(tc.function.arguments),
|
|
218
|
+
},
|
|
219
|
+
}));
|
|
220
|
+
finishReason = 'tool_calls';
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
id: `chatcmpl-ollama-${Date.now()}`,
|
|
224
|
+
object: 'chat.completion',
|
|
225
|
+
created: Math.floor(Date.now() / 1000),
|
|
226
|
+
model: requestedModel,
|
|
227
|
+
choices: [
|
|
228
|
+
{
|
|
229
|
+
index: 0,
|
|
230
|
+
message,
|
|
231
|
+
finish_reason: finishReason,
|
|
232
|
+
},
|
|
233
|
+
],
|
|
234
|
+
usage: {
|
|
235
|
+
prompt_tokens: ollamaData.prompt_eval_count ?? 0,
|
|
236
|
+
completion_tokens: ollamaData.eval_count ?? 0,
|
|
237
|
+
total_tokens: (ollamaData.prompt_eval_count ?? 0) +
|
|
238
|
+
(ollamaData.eval_count ?? 0),
|
|
239
|
+
},
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Convert Ollama NDJSON streaming chunk to OpenAI SSE format.
|
|
244
|
+
*/
|
|
245
|
+
function convertOllamaStreamChunk(chunk, messageId, isFirst) {
|
|
246
|
+
const delta = {};
|
|
247
|
+
if (isFirst) {
|
|
248
|
+
delta['role'] = 'assistant';
|
|
249
|
+
}
|
|
250
|
+
if (chunk.message?.content) {
|
|
251
|
+
delta['content'] = chunk.message.content;
|
|
252
|
+
}
|
|
253
|
+
const choice = {
|
|
254
|
+
index: 0,
|
|
255
|
+
delta,
|
|
256
|
+
finish_reason: null,
|
|
257
|
+
};
|
|
258
|
+
if (chunk.done) {
|
|
259
|
+
choice['finish_reason'] = 'stop';
|
|
260
|
+
choice['delta'] = {};
|
|
261
|
+
}
|
|
262
|
+
const sseChunk = {
|
|
263
|
+
id: messageId,
|
|
264
|
+
object: 'chat.completion.chunk',
|
|
265
|
+
created: Math.floor(Date.now() / 1000),
|
|
266
|
+
model: chunk.model,
|
|
267
|
+
choices: [choice],
|
|
268
|
+
};
|
|
269
|
+
// Include usage in the final chunk
|
|
270
|
+
if (chunk.done && (chunk.prompt_eval_count || chunk.eval_count)) {
|
|
271
|
+
sseChunk['usage'] = {
|
|
272
|
+
prompt_tokens: chunk.prompt_eval_count ?? 0,
|
|
273
|
+
completion_tokens: chunk.eval_count ?? 0,
|
|
274
|
+
total_tokens: (chunk.prompt_eval_count ?? 0) + (chunk.eval_count ?? 0),
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
return `data: ${JSON.stringify(sseChunk)}\n\n`;
|
|
278
|
+
}
|
|
279
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
280
|
+
// Request Forwarding
|
|
281
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
282
|
+
/**
|
|
283
|
+
* Forward a non-streaming request to Ollama and return the response
|
|
284
|
+
* translated to OpenAI format.
|
|
285
|
+
*/
|
|
286
|
+
async function forwardToOllama(model, messages, options) {
|
|
287
|
+
const baseUrl = options?.baseUrl ?? exports.OLLAMA_DEFAULTS.baseUrl;
|
|
288
|
+
const timeoutMs = options?.timeoutMs ?? exports.OLLAMA_DEFAULTS.timeoutMs;
|
|
289
|
+
const start = Date.now();
|
|
290
|
+
try {
|
|
291
|
+
const reqBody = buildOllamaRequest(model, messages, false, options);
|
|
292
|
+
const controller = new AbortController();
|
|
293
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
294
|
+
const response = await fetch(`${baseUrl}/api/chat`, {
|
|
295
|
+
method: 'POST',
|
|
296
|
+
headers: { 'Content-Type': 'application/json' },
|
|
297
|
+
body: JSON.stringify(reqBody),
|
|
298
|
+
signal: controller.signal,
|
|
299
|
+
});
|
|
300
|
+
clearTimeout(timeout);
|
|
301
|
+
if (!response.ok) {
|
|
302
|
+
const errText = await response.text().catch(() => '');
|
|
303
|
+
return {
|
|
304
|
+
success: false,
|
|
305
|
+
error: {
|
|
306
|
+
code: `ollama_${response.status}`,
|
|
307
|
+
message: `Ollama returned ${response.status}: ${errText}`.trim(),
|
|
308
|
+
status: response.status,
|
|
309
|
+
retryable: response.status >= 500,
|
|
310
|
+
},
|
|
311
|
+
latencyMs: Date.now() - start,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
const ollamaData = (await response.json());
|
|
315
|
+
const openAIResponse = convertOllamaResponse(ollamaData, model);
|
|
316
|
+
const usage = openAIResponse['usage'];
|
|
317
|
+
return {
|
|
318
|
+
success: true,
|
|
319
|
+
data: openAIResponse,
|
|
320
|
+
usage,
|
|
321
|
+
latencyMs: Date.now() - start,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
catch (err) {
|
|
325
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
326
|
+
const isTimeout = errMsg.includes('abort') || errMsg.includes('AbortError');
|
|
327
|
+
return {
|
|
328
|
+
success: false,
|
|
329
|
+
error: {
|
|
330
|
+
code: isTimeout ? 'ollama_timeout' : 'ollama_connection_error',
|
|
331
|
+
message: isTimeout
|
|
332
|
+
? `Ollama request timed out after ${timeoutMs}ms`
|
|
333
|
+
: `Failed to connect to Ollama: ${errMsg}`,
|
|
334
|
+
status: isTimeout ? 408 : 502,
|
|
335
|
+
retryable: true,
|
|
336
|
+
},
|
|
337
|
+
latencyMs: Date.now() - start,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Forward a streaming request to Ollama.
|
|
343
|
+
* Returns a readable stream of OpenAI-format SSE events.
|
|
344
|
+
*
|
|
345
|
+
* Ollama streams NDJSON (newline-delimited JSON), which we convert
|
|
346
|
+
* to OpenAI SSE (data: {...}\n\n) on the fly.
|
|
347
|
+
*/
|
|
348
|
+
async function forwardToOllamaStream(model, messages, options) {
|
|
349
|
+
const baseUrl = options?.baseUrl ?? exports.OLLAMA_DEFAULTS.baseUrl;
|
|
350
|
+
const timeoutMs = options?.timeoutMs ?? exports.OLLAMA_DEFAULTS.timeoutMs;
|
|
351
|
+
try {
|
|
352
|
+
const reqBody = buildOllamaRequest(model, messages, true, options);
|
|
353
|
+
const controller = new AbortController();
|
|
354
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
355
|
+
const response = await fetch(`${baseUrl}/api/chat`, {
|
|
356
|
+
method: 'POST',
|
|
357
|
+
headers: { 'Content-Type': 'application/json' },
|
|
358
|
+
body: JSON.stringify(reqBody),
|
|
359
|
+
signal: controller.signal,
|
|
360
|
+
});
|
|
361
|
+
clearTimeout(timeout);
|
|
362
|
+
if (!response.ok) {
|
|
363
|
+
const errText = await response.text().catch(() => '');
|
|
364
|
+
return {
|
|
365
|
+
success: false,
|
|
366
|
+
error: {
|
|
367
|
+
code: `ollama_${response.status}`,
|
|
368
|
+
message: `Ollama returned ${response.status}: ${errText}`.trim(),
|
|
369
|
+
status: response.status,
|
|
370
|
+
retryable: response.status >= 500,
|
|
371
|
+
},
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
const messageId = `chatcmpl-ollama-${Date.now()}`;
|
|
375
|
+
async function* convertStream() {
|
|
376
|
+
const reader = response.body?.getReader();
|
|
377
|
+
if (!reader)
|
|
378
|
+
throw new Error('No response body from Ollama');
|
|
379
|
+
const decoder = new TextDecoder();
|
|
380
|
+
let buffer = '';
|
|
381
|
+
let isFirst = true;
|
|
382
|
+
try {
|
|
383
|
+
while (true) {
|
|
384
|
+
const { done, value } = await reader.read();
|
|
385
|
+
if (done)
|
|
386
|
+
break;
|
|
387
|
+
buffer += decoder.decode(value, { stream: true });
|
|
388
|
+
// Ollama streams NDJSON: one JSON object per line
|
|
389
|
+
const lines = buffer.split('\n');
|
|
390
|
+
buffer = lines.pop() || '';
|
|
391
|
+
for (const line of lines) {
|
|
392
|
+
const trimmed = line.trim();
|
|
393
|
+
if (!trimmed)
|
|
394
|
+
continue;
|
|
395
|
+
try {
|
|
396
|
+
const chunk = JSON.parse(trimmed);
|
|
397
|
+
const sseEvent = convertOllamaStreamChunk(chunk, messageId, isFirst);
|
|
398
|
+
if (sseEvent) {
|
|
399
|
+
yield sseEvent;
|
|
400
|
+
isFirst = false;
|
|
401
|
+
}
|
|
402
|
+
if (chunk.done) {
|
|
403
|
+
yield 'data: [DONE]\n\n';
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
catch {
|
|
408
|
+
// Skip malformed JSON lines
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// Process remaining buffer
|
|
413
|
+
if (buffer.trim()) {
|
|
414
|
+
try {
|
|
415
|
+
const chunk = JSON.parse(buffer.trim());
|
|
416
|
+
const sseEvent = convertOllamaStreamChunk(chunk, messageId, isFirst);
|
|
417
|
+
if (sseEvent)
|
|
418
|
+
yield sseEvent;
|
|
419
|
+
}
|
|
420
|
+
catch {
|
|
421
|
+
// ignore
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
yield 'data: [DONE]\n\n';
|
|
425
|
+
}
|
|
426
|
+
finally {
|
|
427
|
+
reader.releaseLock();
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
return {
|
|
431
|
+
success: true,
|
|
432
|
+
stream: convertStream(),
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
catch (err) {
|
|
436
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
437
|
+
const isTimeout = errMsg.includes('abort') || errMsg.includes('AbortError');
|
|
438
|
+
return {
|
|
439
|
+
success: false,
|
|
440
|
+
error: {
|
|
441
|
+
code: isTimeout ? 'ollama_timeout' : 'ollama_connection_error',
|
|
442
|
+
message: isTimeout
|
|
443
|
+
? `Ollama request timed out after ${timeoutMs}ms`
|
|
444
|
+
: `Failed to connect to Ollama: ${errMsg}`,
|
|
445
|
+
status: isTimeout ? 408 : 502,
|
|
446
|
+
retryable: true,
|
|
447
|
+
},
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
452
|
+
// Caching for health status (avoid hammering Ollama on every request)
|
|
453
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
454
|
+
let _healthCache = null;
|
|
455
|
+
const HEALTH_CACHE_TTL_MS = 30_000; // 30 seconds
|
|
456
|
+
/**
|
|
457
|
+
* Check Ollama health with caching to avoid excessive probing.
|
|
458
|
+
*/
|
|
459
|
+
async function checkOllamaHealthCached(baseUrl = exports.OLLAMA_DEFAULTS.baseUrl) {
|
|
460
|
+
const now = Date.now();
|
|
461
|
+
if (_healthCache && now - _healthCache.checkedAt < HEALTH_CACHE_TTL_MS) {
|
|
462
|
+
return _healthCache.result;
|
|
463
|
+
}
|
|
464
|
+
const result = await checkOllamaHealth(baseUrl);
|
|
465
|
+
_healthCache = { result, checkedAt: now };
|
|
466
|
+
return result;
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Clear the health cache (useful for testing or after config changes).
|
|
470
|
+
*/
|
|
471
|
+
function clearOllamaHealthCache() {
|
|
472
|
+
_healthCache = null;
|
|
473
|
+
}
|
|
474
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
475
|
+
// Model mapping for cross-provider cascade
|
|
476
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
477
|
+
/**
|
|
478
|
+
* Map cloud model names to reasonable Ollama equivalents.
|
|
479
|
+
* Used when falling back to Ollama from a cloud provider.
|
|
480
|
+
*/
|
|
481
|
+
exports.CLOUD_TO_OLLAMA_MODEL_MAP = {
|
|
482
|
+
// Anthropic → Ollama
|
|
483
|
+
'claude-opus-4-6': 'llama3.2',
|
|
484
|
+
'claude-sonnet-4-6': 'llama3.2',
|
|
485
|
+
'claude-haiku-4-5': 'llama3.2',
|
|
486
|
+
'claude-3-5-sonnet-latest': 'llama3.2',
|
|
487
|
+
'claude-3-5-haiku-latest': 'llama3.2',
|
|
488
|
+
// OpenAI → Ollama
|
|
489
|
+
'gpt-4o': 'llama3.2',
|
|
490
|
+
'gpt-4o-mini': 'llama3.2',
|
|
491
|
+
'gpt-4.1': 'llama3.2',
|
|
492
|
+
// Google → Ollama
|
|
493
|
+
'gemini-2.0-flash': 'llama3.2',
|
|
494
|
+
'gemini-2.0-flash-lite': 'llama3.2',
|
|
495
|
+
};
|
|
496
|
+
/**
|
|
497
|
+
* Map a cloud model name to an Ollama model.
|
|
498
|
+
* Returns the configured default or a reasonable fallback.
|
|
499
|
+
*/
|
|
500
|
+
function mapCloudModelToOllama(cloudModel, config) {
|
|
501
|
+
// Check custom mapping first
|
|
502
|
+
const defaultModel = config.defaultModel ?? config.models?.[0];
|
|
503
|
+
// Check built-in map
|
|
504
|
+
const mapped = exports.CLOUD_TO_OLLAMA_MODEL_MAP[cloudModel];
|
|
505
|
+
if (mapped && config.models?.includes(mapped))
|
|
506
|
+
return mapped;
|
|
507
|
+
// Fall back to default model
|
|
508
|
+
return defaultModel ?? 'llama3.2';
|
|
509
|
+
}
|
|
510
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../src/ollama.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
*/
|
|
21
21
|
import * as http from 'node:http';
|
|
22
22
|
import type { Provider as CoreProvider } from '@relayplane/core';
|
|
23
|
-
type Provider = CoreProvider | 'openrouter' | 'deepseek' | 'groq' | 'mistral' | 'together' | 'fireworks' | 'perplexity';
|
|
23
|
+
type Provider = CoreProvider | 'openrouter' | 'deepseek' | 'groq' | 'mistral' | 'together' | 'fireworks' | 'perplexity' | 'ollama';
|
|
24
24
|
import { StatsCollector } from './stats.js';
|
|
25
25
|
/** Shared stats collector instance for the proxy server */
|
|
26
26
|
export declare const proxyStatsCollector: StatsCollector;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standalone-proxy.d.ts","sourceRoot":"","sources":["../src/standalone-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAOlC,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAY,MAAM,kBAAkB,CAAC;AAE3E,KAAK,QAAQ,GAAG,YAAY,GACxB,YAAY,GACZ,UAAU,GACV,MAAM,GACN,SAAS,GACT,UAAU,GACV,WAAW,GACX,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"standalone-proxy.d.ts","sourceRoot":"","sources":["../src/standalone-proxy.ts"],"names":[],"mappings":"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"}
|