@relayplane/proxy 1.8.6 → 1.8.8

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/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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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Osmosis Phase 1 — KnowledgeAtom capture
3
+ *
4
+ * Stores per-request atoms in ~/.relayplane/osmosis.db (SQLite via better-sqlite3).
5
+ * Falls back to ~/.relayplane/osmosis.jsonl if SQLite is unavailable.
6
+ *
7
+ * All writes are fire-and-forget; errors are silently swallowed.
8
+ */
9
+ export interface SuccessAtom {
10
+ type: 'success';
11
+ model: string;
12
+ taskType: string;
13
+ latencyMs: number;
14
+ inputTokens: number;
15
+ outputTokens: number;
16
+ timestamp: number;
17
+ }
18
+ export interface FailureAtom {
19
+ type: 'failure';
20
+ errorType: string;
21
+ model: string;
22
+ fallbackTaken: boolean;
23
+ timestamp: number;
24
+ }
25
+ export type KnowledgeAtom = SuccessAtom | FailureAtom;
26
+ /**
27
+ * Capture a KnowledgeAtom (fire-and-forget).
28
+ * Never throws. Writes to SQLite; falls back to JSONL.
29
+ */
30
+ export declare function captureAtom(atom: KnowledgeAtom): void;
31
+ /** Exposed for testing — reset singleton state. */
32
+ export declare function _resetStore(): void;
33
+ //# sourceMappingURL=osmosis-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"osmosis-store.d.ts","sourceRoot":"","sources":["../src/osmosis-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;AA+EtD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAqCrD;AAED,mDAAmD;AACnD,wBAAgB,WAAW,IAAI,IAAI,CAOlC"}