steroids-cli 0.10.62 → 0.11.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.
Files changed (90) hide show
  1. package/README.md +1 -0
  2. package/dist/commands/hf.d.ts +11 -0
  3. package/dist/commands/hf.d.ts.map +1 -0
  4. package/dist/commands/hf.js +51 -0
  5. package/dist/commands/hf.js.map +1 -0
  6. package/dist/config/ai-setup.d.ts +1 -1
  7. package/dist/config/ai-setup.d.ts.map +1 -1
  8. package/dist/config/loader.d.ts +1 -1
  9. package/dist/config/loader.d.ts.map +1 -1
  10. package/dist/config/loader.js +3 -1
  11. package/dist/config/loader.js.map +1 -1
  12. package/dist/config/schema.js +3 -3
  13. package/dist/config/schema.js.map +1 -1
  14. package/dist/huggingface/auth.d.ts +25 -0
  15. package/dist/huggingface/auth.d.ts.map +1 -0
  16. package/dist/huggingface/auth.js +120 -0
  17. package/dist/huggingface/auth.js.map +1 -0
  18. package/dist/huggingface/hub-client.d.ts +101 -0
  19. package/dist/huggingface/hub-client.d.ts.map +1 -0
  20. package/dist/huggingface/hub-client.js +119 -0
  21. package/dist/huggingface/hub-client.js.map +1 -0
  22. package/dist/huggingface/metrics.d.ts +58 -0
  23. package/dist/huggingface/metrics.d.ts.map +1 -0
  24. package/dist/huggingface/metrics.js +272 -0
  25. package/dist/huggingface/metrics.js.map +1 -0
  26. package/dist/huggingface/model-registry.d.ts +74 -0
  27. package/dist/huggingface/model-registry.d.ts.map +1 -0
  28. package/dist/huggingface/model-registry.js +334 -0
  29. package/dist/huggingface/model-registry.js.map +1 -0
  30. package/dist/index.js +5 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/ollama/api-client.d.ts +138 -0
  33. package/dist/ollama/api-client.d.ts.map +1 -0
  34. package/dist/ollama/api-client.js +229 -0
  35. package/dist/ollama/api-client.js.map +1 -0
  36. package/dist/ollama/connection.d.ts +35 -0
  37. package/dist/ollama/connection.d.ts.map +1 -0
  38. package/dist/ollama/connection.js +243 -0
  39. package/dist/ollama/connection.js.map +1 -0
  40. package/dist/ollama/metrics.d.ts +32 -0
  41. package/dist/ollama/metrics.d.ts.map +1 -0
  42. package/dist/ollama/metrics.js +70 -0
  43. package/dist/ollama/metrics.js.map +1 -0
  44. package/dist/ollama/model-registry.d.ts +33 -0
  45. package/dist/ollama/model-registry.d.ts.map +1 -0
  46. package/dist/ollama/model-registry.js +117 -0
  47. package/dist/ollama/model-registry.js.map +1 -0
  48. package/dist/providers/huggingface.d.ts +40 -0
  49. package/dist/providers/huggingface.d.ts.map +1 -0
  50. package/dist/providers/huggingface.js +391 -0
  51. package/dist/providers/huggingface.js.map +1 -0
  52. package/dist/providers/index.d.ts +1 -0
  53. package/dist/providers/index.d.ts.map +1 -1
  54. package/dist/providers/index.js +5 -1
  55. package/dist/providers/index.js.map +1 -1
  56. package/dist/providers/interface.d.ts +1 -1
  57. package/dist/providers/interface.d.ts.map +1 -1
  58. package/dist/providers/interface.js +9 -0
  59. package/dist/providers/interface.js.map +1 -1
  60. package/dist/providers/ollama-error-utils.d.ts +12 -0
  61. package/dist/providers/ollama-error-utils.d.ts.map +1 -0
  62. package/dist/providers/ollama-error-utils.js +60 -0
  63. package/dist/providers/ollama-error-utils.js.map +1 -0
  64. package/dist/providers/ollama-utils.d.ts +17 -0
  65. package/dist/providers/ollama-utils.d.ts.map +1 -0
  66. package/dist/providers/ollama-utils.js +115 -0
  67. package/dist/providers/ollama-utils.js.map +1 -0
  68. package/dist/providers/ollama.d.ts +15 -34
  69. package/dist/providers/ollama.d.ts.map +1 -1
  70. package/dist/providers/ollama.js +365 -206
  71. package/dist/providers/ollama.js.map +1 -1
  72. package/dist/providers/registry.d.ts.map +1 -1
  73. package/dist/providers/registry.js +2 -0
  74. package/dist/providers/registry.js.map +1 -1
  75. package/dist/runners/global-db-connection.d.ts.map +1 -1
  76. package/dist/runners/global-db-connection.js +7 -0
  77. package/dist/runners/global-db-connection.js.map +1 -1
  78. package/dist/runners/global-db-schema-migrations-v17-v20.d.ts +10 -0
  79. package/dist/runners/global-db-schema-migrations-v17-v20.d.ts.map +1 -0
  80. package/dist/runners/global-db-schema-migrations-v17-v20.js +104 -0
  81. package/dist/runners/global-db-schema-migrations-v17-v20.js.map +1 -0
  82. package/dist/runners/global-db-schema.d.ts +2 -4
  83. package/dist/runners/global-db-schema.d.ts.map +1 -1
  84. package/dist/runners/global-db-schema.js +15 -50
  85. package/dist/runners/global-db-schema.js.map +1 -1
  86. package/dist/runners/global-db.d.ts +1 -1
  87. package/dist/runners/global-db.d.ts.map +1 -1
  88. package/dist/runners/global-db.js +3 -1
  89. package/dist/runners/global-db.js.map +1 -1
  90. package/package.json +1 -1
@@ -1,258 +1,417 @@
1
1
  "use strict";
2
- /**
3
- * Ollama Provider
4
- * Implementation for Ollama local API
5
- * http://localhost:11434
6
- */
7
2
  Object.defineProperty(exports, "__esModule", { value: true });
8
3
  exports.OllamaProvider = void 0;
9
4
  exports.createOllamaProvider = createOllamaProvider;
10
- const node_http_1 = require("node:http");
11
- const interface_js_1 = require("./interface.js");
12
- /**
13
- * Static list of common Ollama models (fallback if local Ollama not reachable)
14
- */
15
- const OLLAMA_FALLBACK_MODELS = [
16
- {
17
- id: 'llama3',
18
- name: 'Llama 3',
19
- recommendedFor: ['coder', 'reviewer'],
20
- supportsStreaming: true,
21
- },
22
- {
23
- id: 'codellama',
24
- name: 'CodeLlama',
25
- recommendedFor: ['coder'],
26
- supportsStreaming: true,
27
- },
28
- {
29
- id: 'deepseek-coder-v2',
30
- name: 'DeepSeek Coder V2',
31
- recommendedFor: ['coder'],
32
- supportsStreaming: true,
33
- },
34
- ];
35
5
  /**
36
- * Default models per role
6
+ * Ollama Provider
7
+ * Native /api/chat inference with NDJSON streaming, plus /v1/models discovery.
37
8
  */
9
+ const node_util_1 = require("node:util");
10
+ const loader_js_1 = require("../config/loader.js");
11
+ const connection_js_1 = require("../ollama/connection.js");
12
+ const interface_js_1 = require("./interface.js");
13
+ const ollama_utils_js_1 = require("./ollama-utils.js");
14
+ const metrics_js_1 = require("../ollama/metrics.js");
15
+ const ollama_error_utils_js_1 = require("./ollama-error-utils.js");
16
+ const DEFAULT_TIMEOUT_MS = 900_000;
17
+ const DEFAULT_COLD_START_TIMEOUT_MS = 90_000;
18
+ const DEFAULT_LOCAL_MAX_CONCURRENT = 1;
19
+ const DEFAULT_CLOUD_MAX_CONCURRENT = 3;
20
+ const DEFAULT_QUEUE_TIMEOUT_MS = 120_000;
21
+ const DEFAULT_NUM_CTX = 32_768;
22
+ const MIN_NUM_CTX = 8_192;
23
+ const MAX_ERROR_BODY = 4_000;
38
24
  const DEFAULT_MODELS = {
39
- orchestrator: 'llama3',
40
- coder: 'deepseek-coder-v2',
41
- reviewer: 'llama3',
25
+ orchestrator: 'llama3.3:70b',
26
+ coder: 'qwen2.5-coder:32b',
27
+ reviewer: 'llama3.3:70b',
42
28
  };
43
29
  /**
44
30
  * Ollama AI Provider implementation
45
31
  */
46
32
  class OllamaProvider extends interface_js_1.BaseAIProvider {
47
33
  name = 'ollama';
48
- displayName = 'Ollama (local)';
49
- host;
50
- port;
34
+ displayName = 'Ollama';
51
35
  dynamicModels = [];
52
- constructor() {
53
- super();
54
- this.host = process.env.STEROIDS_OLLAMA_HOST || 'localhost';
55
- this.port = parseInt(process.env.STEROIDS_OLLAMA_PORT || '11434', 10);
56
- }
57
- /**
58
- * Check if Ollama is running by calling its API
59
- */
36
+ modelContextCache = new Map();
37
+ static semaphores = new Map();
60
38
  async isAvailable() {
61
- return new Promise((resolve) => {
62
- const options = {
63
- hostname: this.host,
64
- port: this.port,
65
- path: '/api/tags',
66
- method: 'GET',
67
- };
68
- const req = (0, node_http_1.request)(options, (res) => {
69
- if (res.statusCode === 200) {
70
- resolve(true);
71
- }
72
- else {
73
- resolve(false);
74
- }
75
- });
76
- req.on('error', () => resolve(false));
77
- req.end();
78
- // Short timeout for availability check
79
- setTimeout(() => {
80
- req.destroy();
81
- resolve(false);
82
- }, 2000);
83
- });
39
+ try {
40
+ const client = (0, connection_js_1.createOllamaApiClient)((0, connection_js_1.getResolvedConnectionConfig)());
41
+ await client.listInstalledModels();
42
+ return true;
43
+ }
44
+ catch {
45
+ return false;
46
+ }
84
47
  }
85
- /**
86
- * Fetch available models from local Ollama service
87
- */
88
48
  async initialize() {
89
- return new Promise((resolve) => {
90
- const options = {
91
- hostname: this.host,
92
- port: this.port,
93
- path: '/api/tags',
94
- method: 'GET',
95
- };
96
- const req = (0, node_http_1.request)(options, (res) => {
97
- let body = '';
98
- res.on('data', (chunk) => body += chunk);
99
- res.on('end', () => {
100
- try {
101
- const data = JSON.parse(body);
102
- if (data.models && Array.isArray(data.models)) {
103
- this.dynamicModels = data.models.map((m) => ({
104
- id: m.name,
105
- name: m.name,
106
- recommendedFor: m.name.toLowerCase().includes('coder') ? ['coder'] : [],
107
- supportsStreaming: true,
108
- }));
109
- }
110
- resolve();
111
- }
112
- catch {
113
- resolve();
114
- }
115
- });
49
+ await this.fetchModels();
50
+ }
51
+ async fetchModels() {
52
+ const client = (0, connection_js_1.createOllamaApiClient)((0, connection_js_1.getResolvedConnectionConfig)());
53
+ try {
54
+ const result = await client.listOpenAIModels();
55
+ const models = result.data ?? [];
56
+ this.dynamicModels = models.map((model) => {
57
+ const id = model.id;
58
+ return {
59
+ id,
60
+ name: id,
61
+ recommendedFor: (0, ollama_utils_js_1.recommendRoles)(id),
62
+ supportsStreaming: true,
63
+ contextWindow: this.modelContextCache.get(id) ?? DEFAULT_NUM_CTX,
64
+ };
116
65
  });
117
- req.on('error', () => resolve());
118
- req.end();
119
- // Timeout for initialization
120
- setTimeout(() => {
121
- req.destroy();
122
- resolve();
123
- }, 5000);
124
- });
66
+ }
67
+ catch {
68
+ try {
69
+ const tags = await client.listInstalledModels();
70
+ this.dynamicModels = (tags.models ?? []).map((model) => ({
71
+ id: model.name,
72
+ name: model.name,
73
+ recommendedFor: (0, ollama_utils_js_1.recommendRoles)(model.name),
74
+ supportsStreaming: true,
75
+ contextWindow: this.modelContextCache.get(model.name) ?? DEFAULT_NUM_CTX,
76
+ }));
77
+ }
78
+ catch {
79
+ this.dynamicModels = [];
80
+ }
81
+ }
125
82
  }
126
- /**
127
- * Invoke Ollama chat API
128
- */
129
83
  async invoke(prompt, options) {
130
84
  const startTime = Date.now();
131
- const model = options.model;
85
+ const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;
132
86
  const onActivity = options.onActivity;
133
- return new Promise((resolve) => {
134
- const postData = JSON.stringify({
135
- model: model,
87
+ const model = options.model;
88
+ const endpointConfig = this.resolveEndpointConfig();
89
+ const hostPort = (0, ollama_error_utils_js_1.resolveOllamaHostPort)(endpointConfig.endpoint);
90
+ let release;
91
+ try {
92
+ release = await this.acquireEndpointSlot(endpointConfig);
93
+ }
94
+ catch (error) {
95
+ return {
96
+ success: false,
97
+ exitCode: 1,
98
+ stdout: '',
99
+ stderr: error instanceof Error ? error.message : 'All Ollama slots busy',
100
+ duration: Date.now() - startTime,
101
+ timedOut: true,
102
+ };
103
+ }
104
+ const controller = new AbortController();
105
+ let coldStartTimedOut = false;
106
+ let generationTimeoutHandle;
107
+ const coldStartTimeout = setTimeout(() => {
108
+ coldStartTimedOut = true;
109
+ controller.abort();
110
+ }, this.resolveColdStartTimeoutMs());
111
+ const scheduleGenerationTimeout = () => {
112
+ if (generationTimeoutHandle) {
113
+ clearTimeout(generationTimeoutHandle);
114
+ }
115
+ generationTimeoutHandle = setTimeout(() => controller.abort(), timeout);
116
+ };
117
+ try {
118
+ const numCtx = await this.resolveContextWindow(model, endpointConfig);
119
+ const payload = {
120
+ model,
136
121
  messages: [{ role: 'user', content: prompt }],
137
- stream: false, // For simplicity initially, can implement streaming later
138
- });
139
- const requestOptions = {
140
- hostname: this.host,
141
- port: this.port,
142
- path: '/api/chat',
143
- method: 'POST',
144
- headers: {
145
- 'Content-Type': 'application/json',
122
+ stream: true,
123
+ options: {
124
+ temperature: 0.8,
125
+ top_p: 0.9,
126
+ num_predict: -1,
127
+ num_ctx: numCtx,
128
+ seed: 0,
146
129
  },
147
130
  };
148
- const req = (0, node_http_1.request)(requestOptions, (res) => {
149
- let responseBody = '';
150
- res.on('data', (chunk) => {
151
- responseBody += chunk;
152
- });
153
- res.on('end', () => {
154
- const duration = Date.now() - startTime;
155
- try {
156
- const result = JSON.parse(responseBody);
157
- if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
158
- const content = result.message?.content || '';
159
- // Ollama usually returns token counts in response
160
- const usage = result.prompt_eval_count ? {
161
- inputTokens: result.prompt_eval_count,
162
- outputTokens: result.eval_count,
163
- } : undefined;
164
- resolve({
165
- success: true,
166
- exitCode: 0,
167
- stdout: content,
168
- stderr: '',
169
- duration,
170
- timedOut: false,
171
- tokenUsage: usage,
172
- });
173
- }
174
- else {
175
- resolve({
176
- success: false,
177
- exitCode: res.statusCode || 1,
178
- stdout: '',
179
- stderr: responseBody,
180
- duration,
181
- timedOut: false,
182
- });
183
- }
131
+ const response = await fetch(`${endpointConfig.endpoint}/api/chat`, {
132
+ method: 'POST',
133
+ headers: this.buildHeaders(endpointConfig.apiKey),
134
+ body: JSON.stringify(payload),
135
+ signal: controller.signal,
136
+ });
137
+ if (!response.ok) {
138
+ const errorBody = (await response.text()).slice(0, MAX_ERROR_BODY).trim();
139
+ return {
140
+ success: false,
141
+ exitCode: response.status || 1,
142
+ stdout: '',
143
+ stderr: (0, ollama_error_utils_js_1.formatOllamaHttpError)(response.status, errorBody, model),
144
+ duration: Date.now() - startTime,
145
+ timedOut: false,
146
+ };
147
+ }
148
+ if (!response.body) {
149
+ return {
150
+ success: false,
151
+ exitCode: 1,
152
+ stdout: '',
153
+ stderr: 'Ollama response did not include a body stream',
154
+ duration: Date.now() - startTime,
155
+ timedOut: false,
156
+ };
157
+ }
158
+ const reader = response.body.getReader();
159
+ const decoder = new node_util_1.TextDecoder();
160
+ let buffer = '';
161
+ let stdout = '';
162
+ let finalChunk;
163
+ let sawFirstToken = false;
164
+ while (true) {
165
+ const { done, value } = await reader.read();
166
+ if (done) {
167
+ break;
168
+ }
169
+ buffer += decoder.decode(value, { stream: true });
170
+ const consumed = this.consumeBuffer(buffer, (chunk) => {
171
+ if (chunk.error) {
172
+ throw new Error(chunk.error);
184
173
  }
185
- catch (e) {
186
- resolve({
187
- success: false,
188
- exitCode: 1,
189
- stdout: '',
190
- stderr: `Failed to parse Ollama response: ${e}
191
-
192
- Raw response: ${responseBody}`,
193
- duration,
194
- timedOut: false,
174
+ const delta = chunk.message?.content ?? '';
175
+ if (delta) {
176
+ if (!sawFirstToken) {
177
+ sawFirstToken = true;
178
+ clearTimeout(coldStartTimeout);
179
+ }
180
+ scheduleGenerationTimeout();
181
+ stdout += delta;
182
+ onActivity?.({
183
+ type: 'output',
184
+ text: delta,
195
185
  });
196
186
  }
187
+ if (chunk.done) {
188
+ finalChunk = chunk;
189
+ }
197
190
  });
198
- });
199
- req.on('error', (e) => {
200
- resolve({
191
+ buffer = consumed;
192
+ }
193
+ buffer += decoder.decode();
194
+ const tail = buffer.trim();
195
+ if (tail) {
196
+ const chunk = JSON.parse(tail);
197
+ if (chunk.error) {
198
+ throw new Error(chunk.error);
199
+ }
200
+ const delta = chunk.message?.content ?? '';
201
+ if (delta) {
202
+ if (!sawFirstToken) {
203
+ sawFirstToken = true;
204
+ clearTimeout(coldStartTimeout);
205
+ }
206
+ scheduleGenerationTimeout();
207
+ stdout += delta;
208
+ onActivity?.({
209
+ type: 'output',
210
+ text: delta,
211
+ });
212
+ }
213
+ if (chunk.done) {
214
+ finalChunk = chunk;
215
+ }
216
+ }
217
+ if (!finalChunk?.done) {
218
+ return {
201
219
  success: false,
202
220
  exitCode: 1,
203
221
  stdout: '',
204
- stderr: `Ollama request error: ${e.message}`,
222
+ stderr: 'Ollama stream ended before final done:true chunk',
205
223
  duration: Date.now() - startTime,
206
224
  timedOut: false,
207
- });
208
- });
209
- req.write(postData);
210
- req.end();
211
- if (options.timeout) {
212
- setTimeout(() => {
213
- req.destroy();
214
- resolve({
215
- success: false,
216
- exitCode: 1,
217
- stdout: '',
218
- stderr: 'Ollama request timed out',
219
- duration: Date.now() - startTime,
220
- timedOut: true,
225
+ };
226
+ }
227
+ const tokenUsage = this.extractTokenUsage(finalChunk);
228
+ const ollamaMetrics = (0, metrics_js_1.buildOllamaTokenMetrics)(finalChunk, endpointConfig.endpoint);
229
+ if (tokenUsage && ollamaMetrics) {
230
+ try {
231
+ (0, metrics_js_1.recordOllamaUsage)({
232
+ model,
233
+ endpoint: endpointConfig.endpoint,
234
+ role: options.role ?? 'coder',
235
+ promptTokens: tokenUsage.inputTokens,
236
+ completionTokens: tokenUsage.outputTokens,
237
+ totalDurationNs: ollamaMetrics.totalDurationNs,
238
+ loadDurationNs: ollamaMetrics.loadDurationNs,
239
+ promptEvalDurationNs: ollamaMetrics.promptEvalDurationNs,
240
+ evalDurationNs: ollamaMetrics.evalDurationNs,
241
+ tokensPerSecond: ollamaMetrics.tokensPerSecond,
221
242
  });
222
- }, options.timeout);
243
+ }
244
+ catch {
245
+ // Best-effort metrics write should never fail request handling.
246
+ }
223
247
  }
224
- });
248
+ return {
249
+ success: true,
250
+ exitCode: 0,
251
+ stdout,
252
+ stderr: '',
253
+ duration: Date.now() - startTime,
254
+ timedOut: false,
255
+ tokenUsage,
256
+ };
257
+ }
258
+ catch (error) {
259
+ const timedOut = (0, ollama_error_utils_js_1.isAbortError)(error);
260
+ return {
261
+ success: false,
262
+ exitCode: 1,
263
+ stdout: '',
264
+ stderr: (0, ollama_error_utils_js_1.formatOllamaInvocationError)(error, {
265
+ hostPort,
266
+ model,
267
+ coldStartTimedOut,
268
+ timeoutMs: timeout,
269
+ mode: endpointConfig.mode,
270
+ }),
271
+ duration: Date.now() - startTime,
272
+ timedOut,
273
+ };
274
+ }
275
+ finally {
276
+ clearTimeout(coldStartTimeout);
277
+ if (generationTimeoutHandle) {
278
+ clearTimeout(generationTimeoutHandle);
279
+ }
280
+ release();
281
+ }
225
282
  }
226
- /**
227
- * List models (prefers dynamic, fallbacks to static)
228
- */
229
283
  listModels() {
230
- const models = this.dynamicModels.length > 0 ? this.dynamicModels : OLLAMA_FALLBACK_MODELS;
231
- return models.map((m) => m.id);
284
+ const models = this.dynamicModels.length > 0 ? this.dynamicModels : ollama_utils_js_1.OLLAMA_FALLBACK_MODELS;
285
+ return models.map((model) => model.id);
232
286
  }
233
- /**
234
- * Get model info
235
- */
236
287
  getModelInfo() {
237
- return this.dynamicModels.length > 0 ? [...this.dynamicModels] : [...OLLAMA_FALLBACK_MODELS];
288
+ if (this.dynamicModels.length > 0) {
289
+ return [...this.dynamicModels];
290
+ }
291
+ return [...ollama_utils_js_1.OLLAMA_FALLBACK_MODELS];
238
292
  }
239
- /**
240
- * Get default model
241
- */
242
293
  getDefaultModel(role) {
243
294
  return DEFAULT_MODELS[role];
244
295
  }
245
- /**
246
- * API-only provider
247
- */
248
296
  getDefaultInvocationTemplate() {
249
297
  return '';
250
298
  }
299
+ classifyError(exitCode, stderr) {
300
+ const lowered = stderr.toLowerCase();
301
+ if (exitCode !== 0 && (lowered.includes('out of memory') || lowered.includes('insufficient memory'))) {
302
+ return {
303
+ type: 'unknown',
304
+ message: 'Ollama out of memory',
305
+ retryable: false,
306
+ };
307
+ }
308
+ return super.classifyError(exitCode, stderr);
309
+ }
310
+ static resetSemaphoresForTests() {
311
+ this.semaphores.clear();
312
+ }
313
+ consumeBuffer(buffer, onChunk) {
314
+ let working = buffer;
315
+ while (true) {
316
+ const newlineIndex = working.indexOf('\n');
317
+ if (newlineIndex === -1) {
318
+ break;
319
+ }
320
+ const line = working.slice(0, newlineIndex).trim();
321
+ working = working.slice(newlineIndex + 1);
322
+ if (!line) {
323
+ continue;
324
+ }
325
+ const chunk = JSON.parse(line);
326
+ onChunk(chunk);
327
+ }
328
+ return working;
329
+ }
330
+ extractTokenUsage(chunk) {
331
+ const inputTokens = chunk?.prompt_eval_count;
332
+ const outputTokens = chunk?.eval_count;
333
+ if (typeof inputTokens !== 'number' || typeof outputTokens !== 'number') {
334
+ return undefined;
335
+ }
336
+ return {
337
+ inputTokens,
338
+ outputTokens,
339
+ };
340
+ }
341
+ resolveEndpointConfig() {
342
+ const resolved = (0, connection_js_1.getResolvedConnectionConfig)();
343
+ const configured = this.readProviderConfig();
344
+ const maxConcurrent = (0, ollama_utils_js_1.normalizePositiveInt)(configured.maxConcurrent) ??
345
+ (resolved.mode === 'cloud' ? DEFAULT_CLOUD_MAX_CONCURRENT : DEFAULT_LOCAL_MAX_CONCURRENT);
346
+ const queueTimeoutMs = (0, ollama_utils_js_1.normalizePositiveInt)(configured.queueTimeoutMs) ??
347
+ DEFAULT_QUEUE_TIMEOUT_MS;
348
+ return {
349
+ endpoint: resolved.endpoint,
350
+ mode: resolved.mode,
351
+ apiKey: resolved.mode === 'cloud' ? (0, connection_js_1.getCloudApiKey)() : undefined,
352
+ maxConcurrent,
353
+ queueTimeoutMs,
354
+ };
355
+ }
356
+ readProviderConfig() {
357
+ const config = (0, loader_js_1.loadConfig)();
358
+ const envMaxConcurrent = (0, ollama_utils_js_1.normalizePositiveInt)(process.env.STEROIDS_OLLAMA_MAX_CONCURRENT);
359
+ const envQueueTimeoutMs = (0, ollama_utils_js_1.normalizePositiveInt)(process.env.STEROIDS_OLLAMA_QUEUE_TIMEOUT_MS);
360
+ return {
361
+ maxConcurrent: envMaxConcurrent ?? config.ollama?.maxConcurrent,
362
+ queueTimeoutMs: envQueueTimeoutMs ?? config.ollama?.queueTimeoutMs,
363
+ };
364
+ }
365
+ acquireEndpointSlot(config) {
366
+ const key = config.endpoint;
367
+ const existing = OllamaProvider.semaphores.get(key);
368
+ if (existing) {
369
+ existing.setMaxConcurrent(config.maxConcurrent);
370
+ return existing.acquire(config.queueTimeoutMs);
371
+ }
372
+ const semaphore = new ollama_utils_js_1.EndpointSemaphore(config.maxConcurrent);
373
+ OllamaProvider.semaphores.set(key, semaphore);
374
+ return semaphore.acquire(config.queueTimeoutMs);
375
+ }
376
+ buildHeaders(apiKey) {
377
+ const headers = new Headers({
378
+ 'Content-Type': 'application/json',
379
+ Accept: 'application/x-ndjson, application/json',
380
+ });
381
+ if (apiKey) {
382
+ headers.set('Authorization', `Bearer ${apiKey}`);
383
+ }
384
+ return headers;
385
+ }
386
+ async resolveContextWindow(model, config) {
387
+ const cached = this.modelContextCache.get(model);
388
+ if (cached) {
389
+ return cached;
390
+ }
391
+ let contextWindow = DEFAULT_NUM_CTX;
392
+ try {
393
+ const client = (0, connection_js_1.createOllamaApiClient)({
394
+ endpoint: config.endpoint,
395
+ mode: config.mode,
396
+ cloudTier: null,
397
+ });
398
+ const details = await client.showModel(model);
399
+ const fromModelInfo = (0, ollama_utils_js_1.extractContextLength)(details.model_info);
400
+ if (fromModelInfo) {
401
+ contextWindow = Math.max(MIN_NUM_CTX, fromModelInfo);
402
+ }
403
+ }
404
+ catch {
405
+ // Fall back to sane default when metadata lookup fails.
406
+ }
407
+ this.modelContextCache.set(model, contextWindow);
408
+ return contextWindow;
409
+ }
410
+ resolveColdStartTimeoutMs() {
411
+ return (0, ollama_utils_js_1.normalizePositiveInt)(process.env.STEROIDS_OLLAMA_COLD_START_TIMEOUT_MS) ?? DEFAULT_COLD_START_TIMEOUT_MS;
412
+ }
251
413
  }
252
414
  exports.OllamaProvider = OllamaProvider;
253
- /**
254
- * Create an Ollama provider instance
255
- */
256
415
  function createOllamaProvider() {
257
416
  return new OllamaProvider();
258
417
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"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"}