steroids-cli 0.10.62 → 0.12.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/README.md +1 -0
- package/dist/commands/ai.js +5 -5
- package/dist/commands/ai.js.map +1 -1
- package/dist/commands/config.js +8 -10
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/hf.d.ts +11 -0
- package/dist/commands/hf.d.ts.map +1 -0
- package/dist/commands/hf.js +51 -0
- package/dist/commands/hf.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +255 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/web-config.d.ts +9 -0
- package/dist/commands/web-config.d.ts.map +1 -0
- package/dist/commands/web-config.js +97 -0
- package/dist/commands/web-config.js.map +1 -0
- package/dist/config/ai-setup.d.ts +1 -2
- package/dist/config/ai-setup.d.ts.map +1 -1
- package/dist/config/ai-setup.js +1 -1
- package/dist/config/ai-setup.js.map +1 -1
- package/dist/config/loader.d.ts +2 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +6 -2
- package/dist/config/loader.js.map +1 -1
- package/dist/config/provider-names.d.ts +9 -0
- package/dist/config/provider-names.d.ts.map +1 -0
- package/dist/config/provider-names.js +11 -0
- package/dist/config/provider-names.js.map +1 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +4 -3
- package/dist/config/schema.js.map +1 -1
- package/dist/huggingface/auth.d.ts +25 -0
- package/dist/huggingface/auth.d.ts.map +1 -0
- package/dist/huggingface/auth.js +120 -0
- package/dist/huggingface/auth.js.map +1 -0
- package/dist/huggingface/hub-client.d.ts +101 -0
- package/dist/huggingface/hub-client.d.ts.map +1 -0
- package/dist/huggingface/hub-client.js +119 -0
- package/dist/huggingface/hub-client.js.map +1 -0
- package/dist/huggingface/metrics.d.ts +58 -0
- package/dist/huggingface/metrics.d.ts.map +1 -0
- package/dist/huggingface/metrics.js +272 -0
- package/dist/huggingface/metrics.js.map +1 -0
- package/dist/huggingface/model-registry.d.ts +74 -0
- package/dist/huggingface/model-registry.d.ts.map +1 -0
- package/dist/huggingface/model-registry.js +334 -0
- package/dist/huggingface/model-registry.js.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/ollama/api-client.d.ts +138 -0
- package/dist/ollama/api-client.d.ts.map +1 -0
- package/dist/ollama/api-client.js +229 -0
- package/dist/ollama/api-client.js.map +1 -0
- package/dist/ollama/connection.d.ts +35 -0
- package/dist/ollama/connection.d.ts.map +1 -0
- package/dist/ollama/connection.js +243 -0
- package/dist/ollama/connection.js.map +1 -0
- package/dist/ollama/metrics.d.ts +32 -0
- package/dist/ollama/metrics.d.ts.map +1 -0
- package/dist/ollama/metrics.js +70 -0
- package/dist/ollama/metrics.js.map +1 -0
- package/dist/ollama/model-registry.d.ts +33 -0
- package/dist/ollama/model-registry.d.ts.map +1 -0
- package/dist/ollama/model-registry.js +117 -0
- package/dist/ollama/model-registry.js.map +1 -0
- package/dist/providers/api-models.d.ts +7 -19
- package/dist/providers/api-models.d.ts.map +1 -1
- package/dist/providers/api-models.js +6 -162
- package/dist/providers/api-models.js.map +1 -1
- package/dist/providers/index.d.ts +2 -2
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +5 -6
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/interface.d.ts +2 -2
- package/dist/providers/interface.d.ts.map +1 -1
- package/dist/providers/interface.js +9 -0
- package/dist/providers/interface.js.map +1 -1
- package/dist/providers/opencode.d.ts +34 -0
- package/dist/providers/opencode.d.ts.map +1 -0
- package/dist/providers/opencode.js +365 -0
- package/dist/providers/opencode.js.map +1 -0
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +2 -6
- package/dist/providers/registry.js.map +1 -1
- package/dist/runners/global-db-connection.d.ts.map +1 -1
- package/dist/runners/global-db-connection.js +7 -0
- package/dist/runners/global-db-connection.js.map +1 -1
- package/dist/runners/global-db-schema-migrations-v17-v20.d.ts +10 -0
- package/dist/runners/global-db-schema-migrations-v17-v20.d.ts.map +1 -0
- package/dist/runners/global-db-schema-migrations-v17-v20.js +104 -0
- package/dist/runners/global-db-schema-migrations-v17-v20.js.map +1 -0
- package/dist/runners/global-db-schema.d.ts +2 -4
- package/dist/runners/global-db-schema.d.ts.map +1 -1
- package/dist/runners/global-db-schema.js +15 -50
- package/dist/runners/global-db-schema.js.map +1 -1
- package/dist/runners/global-db.d.ts +1 -1
- package/dist/runners/global-db.d.ts.map +1 -1
- package/dist/runners/global-db.js +3 -1
- package/dist/runners/global-db.js.map +1 -1
- package/package.json +1 -1
- package/dist/providers/minimax.d.ts +0 -50
- package/dist/providers/minimax.d.ts.map +0 -1
- package/dist/providers/minimax.js +0 -248
- package/dist/providers/minimax.js.map +0 -1
- package/dist/providers/ollama.d.ts +0 -50
- package/dist/providers/ollama.d.ts.map +0 -1
- package/dist/providers/ollama.js +0 -259
- package/dist/providers/ollama.js.map +0 -1
- package/dist/providers/openai.d.ts +0 -53
- package/dist/providers/openai.d.ts.map +0 -1
- package/dist/providers/openai.js +0 -236
- package/dist/providers/openai.js.map +0 -1
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OllamaApiClient = exports.OllamaApiError = void 0;
|
|
4
|
+
const node_util_1 = require("node:util");
|
|
5
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
6
|
+
class OllamaApiError extends Error {
|
|
7
|
+
status;
|
|
8
|
+
responseBody;
|
|
9
|
+
url;
|
|
10
|
+
constructor(message, status, responseBody, url) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'OllamaApiError';
|
|
13
|
+
this.status = status;
|
|
14
|
+
this.responseBody = responseBody;
|
|
15
|
+
this.url = url;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.OllamaApiError = OllamaApiError;
|
|
19
|
+
class OllamaApiClient {
|
|
20
|
+
endpoint;
|
|
21
|
+
apiKey;
|
|
22
|
+
timeoutMs;
|
|
23
|
+
constructor(config) {
|
|
24
|
+
this.endpoint = normalizeEndpoint(config.endpoint);
|
|
25
|
+
this.apiKey = config.apiKey;
|
|
26
|
+
this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
27
|
+
}
|
|
28
|
+
setConfig(config) {
|
|
29
|
+
if (config.endpoint) {
|
|
30
|
+
this.endpoint = normalizeEndpoint(config.endpoint);
|
|
31
|
+
}
|
|
32
|
+
if (config.apiKey !== undefined) {
|
|
33
|
+
this.apiKey = config.apiKey;
|
|
34
|
+
}
|
|
35
|
+
if (config.timeoutMs !== undefined) {
|
|
36
|
+
this.timeoutMs = config.timeoutMs;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
getEndpoint() {
|
|
40
|
+
return this.endpoint;
|
|
41
|
+
}
|
|
42
|
+
async healthCheck() {
|
|
43
|
+
const response = await this.requestRaw('/');
|
|
44
|
+
const body = await response.text();
|
|
45
|
+
return { status: response.status, body };
|
|
46
|
+
}
|
|
47
|
+
async getVersion() {
|
|
48
|
+
return this.requestJson('/api/version');
|
|
49
|
+
}
|
|
50
|
+
async listRunningModels() {
|
|
51
|
+
return this.requestJson('/api/ps');
|
|
52
|
+
}
|
|
53
|
+
async listInstalledModels() {
|
|
54
|
+
return this.requestJson('/api/tags');
|
|
55
|
+
}
|
|
56
|
+
async showModel(name) {
|
|
57
|
+
return this.requestJson('/api/show', {
|
|
58
|
+
method: 'POST',
|
|
59
|
+
body: JSON.stringify({ name }),
|
|
60
|
+
headers: {
|
|
61
|
+
'Content-Type': 'application/json',
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
async pullModel(name, onProgress, options) {
|
|
66
|
+
const response = await this.requestRaw('/api/pull', {
|
|
67
|
+
method: 'POST',
|
|
68
|
+
body: JSON.stringify({ name, stream: true }),
|
|
69
|
+
headers: {
|
|
70
|
+
'Content-Type': 'application/json',
|
|
71
|
+
},
|
|
72
|
+
}, {
|
|
73
|
+
timeoutMs: options?.timeoutMs,
|
|
74
|
+
operation: 'pull model',
|
|
75
|
+
});
|
|
76
|
+
if (!response.body) {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
const reader = response.body.getReader();
|
|
80
|
+
const decoder = new node_util_1.TextDecoder();
|
|
81
|
+
const updates = [];
|
|
82
|
+
let buffer = '';
|
|
83
|
+
while (true) {
|
|
84
|
+
const { done, value } = await reader.read();
|
|
85
|
+
if (done) {
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
buffer += decoder.decode(value, { stream: true });
|
|
89
|
+
buffer = this.consumePullBuffer(buffer, updates, onProgress);
|
|
90
|
+
}
|
|
91
|
+
buffer += decoder.decode();
|
|
92
|
+
buffer = this.consumePullBuffer(buffer, updates, onProgress);
|
|
93
|
+
const tail = buffer.trim();
|
|
94
|
+
if (tail) {
|
|
95
|
+
const progress = this.normalizePullProgress(JSON.parse(tail));
|
|
96
|
+
updates.push(progress);
|
|
97
|
+
onProgress?.(progress);
|
|
98
|
+
}
|
|
99
|
+
return updates;
|
|
100
|
+
}
|
|
101
|
+
async deleteModel(name) {
|
|
102
|
+
await this.requestRaw('/api/delete', {
|
|
103
|
+
method: 'DELETE',
|
|
104
|
+
body: JSON.stringify({ name }),
|
|
105
|
+
headers: {
|
|
106
|
+
'Content-Type': 'application/json',
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
async chat(payload) {
|
|
111
|
+
return this.requestJson('/api/chat', {
|
|
112
|
+
method: 'POST',
|
|
113
|
+
body: JSON.stringify(payload),
|
|
114
|
+
headers: {
|
|
115
|
+
'Content-Type': 'application/json',
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
async listOpenAIModels() {
|
|
120
|
+
return this.requestJson('/v1/models');
|
|
121
|
+
}
|
|
122
|
+
async getOpenAIModel(model) {
|
|
123
|
+
return this.requestJson(`/v1/models/${encodeURIComponent(model)}`);
|
|
124
|
+
}
|
|
125
|
+
consumePullBuffer(buffer, updates, onProgress) {
|
|
126
|
+
while (true) {
|
|
127
|
+
const newlineIndex = buffer.indexOf('\n');
|
|
128
|
+
if (newlineIndex === -1) {
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
const line = buffer.slice(0, newlineIndex).trim();
|
|
132
|
+
buffer = buffer.slice(newlineIndex + 1);
|
|
133
|
+
if (!line) {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const progress = this.normalizePullProgress(JSON.parse(line));
|
|
137
|
+
updates.push(progress);
|
|
138
|
+
onProgress?.(progress);
|
|
139
|
+
}
|
|
140
|
+
return buffer;
|
|
141
|
+
}
|
|
142
|
+
normalizePullProgress(progress) {
|
|
143
|
+
const total = typeof progress.total === 'number' && Number.isFinite(progress.total) && progress.total > 0
|
|
144
|
+
? progress.total
|
|
145
|
+
: null;
|
|
146
|
+
const completed = typeof progress.completed === 'number' && Number.isFinite(progress.completed)
|
|
147
|
+
? Math.max(0, progress.completed)
|
|
148
|
+
: null;
|
|
149
|
+
const percent = total !== null && completed !== null
|
|
150
|
+
? Math.max(0, Math.min(100, Math.round((completed / total) * 100)))
|
|
151
|
+
: null;
|
|
152
|
+
const status = (progress.status || '').toLowerCase();
|
|
153
|
+
const done = status.includes('success') || status.includes('complete') || status.includes('finished');
|
|
154
|
+
const phase = progress.error
|
|
155
|
+
? 'error'
|
|
156
|
+
: done
|
|
157
|
+
? 'complete'
|
|
158
|
+
: status.includes('download')
|
|
159
|
+
? 'downloading'
|
|
160
|
+
: status.includes('verify') || status.includes('digest')
|
|
161
|
+
? 'verifying'
|
|
162
|
+
: status.includes('pull') || status.includes('resolve')
|
|
163
|
+
? 'starting'
|
|
164
|
+
: 'unknown';
|
|
165
|
+
return {
|
|
166
|
+
...progress,
|
|
167
|
+
percent,
|
|
168
|
+
phase,
|
|
169
|
+
done,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
async requestJson(path, init, requestOptions) {
|
|
173
|
+
const response = await this.requestRaw(path, init, requestOptions);
|
|
174
|
+
return response.json();
|
|
175
|
+
}
|
|
176
|
+
async requestRaw(path, init = {}, requestOptions = {}) {
|
|
177
|
+
const url = buildUrl(this.endpoint, path);
|
|
178
|
+
const headers = new Headers(init.headers);
|
|
179
|
+
const timeoutMs = requestOptions.timeoutMs ?? this.timeoutMs;
|
|
180
|
+
const operation = requestOptions.operation ?? 'request';
|
|
181
|
+
if (this.apiKey) {
|
|
182
|
+
headers.set('Authorization', `Bearer ${this.apiKey}`);
|
|
183
|
+
}
|
|
184
|
+
if (!headers.has('Accept')) {
|
|
185
|
+
headers.set('Accept', 'application/json');
|
|
186
|
+
}
|
|
187
|
+
const controller = new AbortController();
|
|
188
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
189
|
+
try {
|
|
190
|
+
const response = await fetch(url, {
|
|
191
|
+
...init,
|
|
192
|
+
headers,
|
|
193
|
+
signal: controller.signal,
|
|
194
|
+
});
|
|
195
|
+
if (!response.ok) {
|
|
196
|
+
const body = await response.text();
|
|
197
|
+
throw new OllamaApiError(`Ollama API request failed: ${response.status}`, response.status, body, url);
|
|
198
|
+
}
|
|
199
|
+
return response;
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
if (error instanceof OllamaApiError) {
|
|
203
|
+
throw error;
|
|
204
|
+
}
|
|
205
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
206
|
+
throw new Error(`Ollama API ${operation} timed out after ${timeoutMs}ms`);
|
|
207
|
+
}
|
|
208
|
+
throw error;
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
clearTimeout(timeout);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
exports.OllamaApiClient = OllamaApiClient;
|
|
216
|
+
function normalizeEndpoint(endpoint) {
|
|
217
|
+
return endpoint.trim().replace(/\/+$/, '');
|
|
218
|
+
}
|
|
219
|
+
function buildUrl(endpoint, path) {
|
|
220
|
+
const base = normalizeEndpoint(endpoint);
|
|
221
|
+
if (!path) {
|
|
222
|
+
return base;
|
|
223
|
+
}
|
|
224
|
+
if (path.startsWith('/')) {
|
|
225
|
+
return `${base}${path}`;
|
|
226
|
+
}
|
|
227
|
+
return `${base}/${path}`;
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/ollama/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { OllamaApiClient } from './api-client.js';
|
|
2
|
+
export declare const DEFAULT_LOCAL_ENDPOINT = "http://localhost:11434";
|
|
3
|
+
export declare const DEFAULT_CLOUD_ENDPOINT = "https://ollama.com";
|
|
4
|
+
export declare const MINIMUM_OLLAMA_VERSION = "0.1.14";
|
|
5
|
+
export type OllamaConnectionMode = 'local' | 'cloud';
|
|
6
|
+
export interface OllamaConnectionConfig {
|
|
7
|
+
endpoint: string;
|
|
8
|
+
mode: OllamaConnectionMode;
|
|
9
|
+
cloudTier: string | null;
|
|
10
|
+
}
|
|
11
|
+
export interface OllamaConnectionStatus {
|
|
12
|
+
connected: boolean;
|
|
13
|
+
endpoint: string;
|
|
14
|
+
mode: OllamaConnectionMode;
|
|
15
|
+
version?: string;
|
|
16
|
+
minimumVersionMet?: boolean;
|
|
17
|
+
loadedModels?: number;
|
|
18
|
+
error?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function getOllamaConfigDir(): string;
|
|
21
|
+
export declare function getOllamaConfigPath(): string;
|
|
22
|
+
export declare function getOllamaTokenPath(): string;
|
|
23
|
+
export declare function getDefaultConnectionConfig(): OllamaConnectionConfig;
|
|
24
|
+
export declare function loadConnectionConfig(): OllamaConnectionConfig;
|
|
25
|
+
export declare function saveConnectionConfig(config: OllamaConnectionConfig): void;
|
|
26
|
+
export declare function setLocalConnection(endpoint?: string): OllamaConnectionConfig;
|
|
27
|
+
export declare function setCloudConnection(apiKey: string, endpoint?: string): OllamaConnectionConfig;
|
|
28
|
+
export declare function clearCloudApiKey(): void;
|
|
29
|
+
export declare function getCloudApiKey(): string | undefined;
|
|
30
|
+
export declare function resolveEndpoint(config: OllamaConnectionConfig): string;
|
|
31
|
+
export declare function getResolvedConnectionConfig(): OllamaConnectionConfig;
|
|
32
|
+
export declare function createOllamaApiClient(config?: OllamaConnectionConfig): OllamaApiClient;
|
|
33
|
+
export declare function testConnection(config?: OllamaConnectionConfig): Promise<OllamaConnectionStatus>;
|
|
34
|
+
export declare function isVersionSupported(version: string, minimumVersion?: string): boolean;
|
|
35
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/ollama/connection.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAkB,MAAM,iBAAiB,CAAC;AAElE,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAC/D,eAAO,MAAM,sBAAsB,uBAAuB,CAAC;AAC3D,eAAO,MAAM,sBAAsB,WAAW,CAAC;AAE/C,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,OAAO,CAAC;AAErD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,oBAAoB,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,oBAAoB,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,0BAA0B,IAAI,sBAAsB,CAMnE;AAED,wBAAgB,oBAAoB,IAAI,sBAAsB,CAkB7D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAezE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,GAAE,MAA+B,GAAG,sBAAsB,CAQpG;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,MAA+B,GACxC,sBAAsB,CAkBxB;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAKvC;AAED,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAanD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAOtE;AAED,wBAAgB,2BAA2B,IAAI,sBAAsB,CAMpE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,GAAE,sBAAsD,GAAG,eAAe,CAQrH;AAED,wBAAsB,cAAc,CAClC,MAAM,GAAE,sBAAsD,GAC7D,OAAO,CAAC,sBAAsB,CAAC,CAwDjC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,GAAE,MAA+B,GAAG,OAAO,CAkB5G"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MINIMUM_OLLAMA_VERSION = exports.DEFAULT_CLOUD_ENDPOINT = exports.DEFAULT_LOCAL_ENDPOINT = void 0;
|
|
4
|
+
exports.getOllamaConfigDir = getOllamaConfigDir;
|
|
5
|
+
exports.getOllamaConfigPath = getOllamaConfigPath;
|
|
6
|
+
exports.getOllamaTokenPath = getOllamaTokenPath;
|
|
7
|
+
exports.getDefaultConnectionConfig = getDefaultConnectionConfig;
|
|
8
|
+
exports.loadConnectionConfig = loadConnectionConfig;
|
|
9
|
+
exports.saveConnectionConfig = saveConnectionConfig;
|
|
10
|
+
exports.setLocalConnection = setLocalConnection;
|
|
11
|
+
exports.setCloudConnection = setCloudConnection;
|
|
12
|
+
exports.clearCloudApiKey = clearCloudApiKey;
|
|
13
|
+
exports.getCloudApiKey = getCloudApiKey;
|
|
14
|
+
exports.resolveEndpoint = resolveEndpoint;
|
|
15
|
+
exports.getResolvedConnectionConfig = getResolvedConnectionConfig;
|
|
16
|
+
exports.createOllamaApiClient = createOllamaApiClient;
|
|
17
|
+
exports.testConnection = testConnection;
|
|
18
|
+
exports.isVersionSupported = isVersionSupported;
|
|
19
|
+
const node_fs_1 = require("node:fs");
|
|
20
|
+
const node_path_1 = require("node:path");
|
|
21
|
+
const global_db_connection_js_1 = require("../runners/global-db-connection.js");
|
|
22
|
+
const api_client_js_1 = require("./api-client.js");
|
|
23
|
+
exports.DEFAULT_LOCAL_ENDPOINT = 'http://localhost:11434';
|
|
24
|
+
exports.DEFAULT_CLOUD_ENDPOINT = 'https://ollama.com';
|
|
25
|
+
exports.MINIMUM_OLLAMA_VERSION = '0.1.14';
|
|
26
|
+
const CONFIG_FILE = 'config.json';
|
|
27
|
+
const TOKEN_FILE = 'token';
|
|
28
|
+
function getOllamaConfigDir() {
|
|
29
|
+
return (0, node_path_1.join)((0, global_db_connection_js_1.getGlobalSteroidsDir)(), 'ollama');
|
|
30
|
+
}
|
|
31
|
+
function getOllamaConfigPath() {
|
|
32
|
+
return (0, node_path_1.join)(getOllamaConfigDir(), CONFIG_FILE);
|
|
33
|
+
}
|
|
34
|
+
function getOllamaTokenPath() {
|
|
35
|
+
return (0, node_path_1.join)(getOllamaConfigDir(), TOKEN_FILE);
|
|
36
|
+
}
|
|
37
|
+
function getDefaultConnectionConfig() {
|
|
38
|
+
return {
|
|
39
|
+
endpoint: exports.DEFAULT_LOCAL_ENDPOINT,
|
|
40
|
+
mode: 'local',
|
|
41
|
+
cloudTier: null,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function loadConnectionConfig() {
|
|
45
|
+
const configPath = getOllamaConfigPath();
|
|
46
|
+
if (!(0, node_fs_1.existsSync)(configPath)) {
|
|
47
|
+
return getDefaultConnectionConfig();
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const parsed = JSON.parse((0, node_fs_1.readFileSync)(configPath, 'utf8'));
|
|
51
|
+
const mode = parsed.mode === 'cloud' ? 'cloud' : 'local';
|
|
52
|
+
const endpoint = normalizeEndpoint(parsed.endpoint || getDefaultConnectionConfig().endpoint);
|
|
53
|
+
return {
|
|
54
|
+
endpoint,
|
|
55
|
+
mode,
|
|
56
|
+
cloudTier: parsed.cloudTier ?? null,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return getDefaultConnectionConfig();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function saveConnectionConfig(config) {
|
|
64
|
+
ensureOllamaConfigDir();
|
|
65
|
+
(0, node_fs_1.writeFileSync)(getOllamaConfigPath(), JSON.stringify({
|
|
66
|
+
endpoint: normalizeEndpoint(config.endpoint),
|
|
67
|
+
mode: config.mode,
|
|
68
|
+
cloudTier: config.cloudTier,
|
|
69
|
+
}, null, 2), 'utf8');
|
|
70
|
+
}
|
|
71
|
+
function setLocalConnection(endpoint = exports.DEFAULT_LOCAL_ENDPOINT) {
|
|
72
|
+
const config = {
|
|
73
|
+
endpoint: normalizeEndpoint(endpoint),
|
|
74
|
+
mode: 'local',
|
|
75
|
+
cloudTier: null,
|
|
76
|
+
};
|
|
77
|
+
saveConnectionConfig(config);
|
|
78
|
+
return config;
|
|
79
|
+
}
|
|
80
|
+
function setCloudConnection(apiKey, endpoint = exports.DEFAULT_CLOUD_ENDPOINT) {
|
|
81
|
+
const token = apiKey.trim();
|
|
82
|
+
if (!token) {
|
|
83
|
+
throw new Error('Cloud API key is required');
|
|
84
|
+
}
|
|
85
|
+
ensureOllamaConfigDir();
|
|
86
|
+
const tokenPath = getOllamaTokenPath();
|
|
87
|
+
(0, node_fs_1.writeFileSync)(tokenPath, token, 'utf8');
|
|
88
|
+
(0, node_fs_1.chmodSync)(tokenPath, 0o600);
|
|
89
|
+
const config = {
|
|
90
|
+
endpoint: normalizeEndpoint(endpoint),
|
|
91
|
+
mode: 'cloud',
|
|
92
|
+
cloudTier: null,
|
|
93
|
+
};
|
|
94
|
+
saveConnectionConfig(config);
|
|
95
|
+
return config;
|
|
96
|
+
}
|
|
97
|
+
function clearCloudApiKey() {
|
|
98
|
+
const tokenPath = getOllamaTokenPath();
|
|
99
|
+
if ((0, node_fs_1.existsSync)(tokenPath)) {
|
|
100
|
+
(0, node_fs_1.rmSync)(tokenPath, { force: true });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function getCloudApiKey() {
|
|
104
|
+
const fromEnv = process.env.OLLAMA_API_KEY?.trim();
|
|
105
|
+
if (fromEnv) {
|
|
106
|
+
return fromEnv;
|
|
107
|
+
}
|
|
108
|
+
const tokenPath = getOllamaTokenPath();
|
|
109
|
+
if (!(0, node_fs_1.existsSync)(tokenPath)) {
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
const token = (0, node_fs_1.readFileSync)(tokenPath, 'utf8').trim();
|
|
113
|
+
return token || undefined;
|
|
114
|
+
}
|
|
115
|
+
function resolveEndpoint(config) {
|
|
116
|
+
const override = getEndpointOverrideFromEnv();
|
|
117
|
+
if (override) {
|
|
118
|
+
return override;
|
|
119
|
+
}
|
|
120
|
+
return normalizeEndpoint(config.endpoint);
|
|
121
|
+
}
|
|
122
|
+
function getResolvedConnectionConfig() {
|
|
123
|
+
const config = loadConnectionConfig();
|
|
124
|
+
return {
|
|
125
|
+
...config,
|
|
126
|
+
endpoint: resolveEndpoint(config),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function createOllamaApiClient(config = getResolvedConnectionConfig()) {
|
|
130
|
+
const endpoint = resolveEndpoint(config);
|
|
131
|
+
const apiKey = config.mode === 'cloud' ? getCloudApiKey() : undefined;
|
|
132
|
+
return new api_client_js_1.OllamaApiClient({
|
|
133
|
+
endpoint,
|
|
134
|
+
apiKey,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
async function testConnection(config = getResolvedConnectionConfig()) {
|
|
138
|
+
const client = createOllamaApiClient(config);
|
|
139
|
+
const endpoint = client.getEndpoint();
|
|
140
|
+
try {
|
|
141
|
+
if (config.mode === 'local') {
|
|
142
|
+
const health = await client.healthCheck();
|
|
143
|
+
if (health.status < 200 || health.status >= 300) {
|
|
144
|
+
return {
|
|
145
|
+
connected: false,
|
|
146
|
+
endpoint,
|
|
147
|
+
mode: config.mode,
|
|
148
|
+
error: `Unexpected health status: ${health.status}`,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
if (!isOllamaHealthResponse(health.body)) {
|
|
152
|
+
return {
|
|
153
|
+
connected: false,
|
|
154
|
+
endpoint,
|
|
155
|
+
mode: config.mode,
|
|
156
|
+
error: 'Unexpected health response: endpoint is not an Ollama instance',
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
await client.listInstalledModels();
|
|
162
|
+
}
|
|
163
|
+
const [versionResult, psResult] = await Promise.allSettled([
|
|
164
|
+
client.getVersion(),
|
|
165
|
+
client.listRunningModels(),
|
|
166
|
+
]);
|
|
167
|
+
const version = versionResult.status === 'fulfilled' ? versionResult.value.version : undefined;
|
|
168
|
+
const loadedModels = psResult.status === 'fulfilled' ? psResult.value.models.length : undefined;
|
|
169
|
+
return {
|
|
170
|
+
connected: true,
|
|
171
|
+
endpoint,
|
|
172
|
+
mode: config.mode,
|
|
173
|
+
version,
|
|
174
|
+
minimumVersionMet: version ? isVersionSupported(version) : undefined,
|
|
175
|
+
loadedModels,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
if (config.mode === 'cloud' && error instanceof api_client_js_1.OllamaApiError && error.status === 401) {
|
|
180
|
+
clearCloudApiKey();
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
connected: false,
|
|
184
|
+
endpoint,
|
|
185
|
+
mode: config.mode,
|
|
186
|
+
error: error instanceof Error ? error.message : String(error),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function isVersionSupported(version, minimumVersion = exports.MINIMUM_OLLAMA_VERSION) {
|
|
191
|
+
const current = parseVersion(version);
|
|
192
|
+
const required = parseVersion(minimumVersion);
|
|
193
|
+
for (let i = 0; i < Math.max(current.length, required.length); i += 1) {
|
|
194
|
+
const currentPart = current[i] ?? 0;
|
|
195
|
+
const requiredPart = required[i] ?? 0;
|
|
196
|
+
if (currentPart > requiredPart) {
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
if (currentPart < requiredPart) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
function parseVersion(version) {
|
|
206
|
+
const cleaned = version.trim().replace(/^v/i, '');
|
|
207
|
+
return cleaned
|
|
208
|
+
.split('.')
|
|
209
|
+
.map((part) => parseInt(part.replace(/[^0-9].*$/, ''), 10))
|
|
210
|
+
.map((part) => (Number.isNaN(part) ? 0 : part));
|
|
211
|
+
}
|
|
212
|
+
function ensureOllamaConfigDir() {
|
|
213
|
+
const dir = getOllamaConfigDir();
|
|
214
|
+
if (!(0, node_fs_1.existsSync)(dir)) {
|
|
215
|
+
(0, node_fs_1.mkdirSync)(dir, { recursive: true });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
function normalizeEndpoint(endpoint) {
|
|
219
|
+
return endpoint.trim().replace(/\/+$/, '');
|
|
220
|
+
}
|
|
221
|
+
function isOllamaHealthResponse(body) {
|
|
222
|
+
return body.toLowerCase().includes('ollama is running');
|
|
223
|
+
}
|
|
224
|
+
function getEndpointOverrideFromEnv() {
|
|
225
|
+
const hostRaw = process.env.STEROIDS_OLLAMA_HOST?.trim();
|
|
226
|
+
const portRaw = process.env.STEROIDS_OLLAMA_PORT?.trim();
|
|
227
|
+
if (!hostRaw && !portRaw) {
|
|
228
|
+
return undefined;
|
|
229
|
+
}
|
|
230
|
+
if (!hostRaw) {
|
|
231
|
+
return normalizeEndpoint(`http://localhost:${portRaw}`);
|
|
232
|
+
}
|
|
233
|
+
if (hostRaw.startsWith('http://') || hostRaw.startsWith('https://')) {
|
|
234
|
+
const endpoint = new URL(hostRaw);
|
|
235
|
+
if (portRaw) {
|
|
236
|
+
endpoint.port = portRaw;
|
|
237
|
+
}
|
|
238
|
+
return normalizeEndpoint(endpoint.toString());
|
|
239
|
+
}
|
|
240
|
+
const port = portRaw || '11434';
|
|
241
|
+
return normalizeEndpoint(`http://${hostRaw}:${port}`);
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/ollama/connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
interface OllamaMetricsChunk {
|
|
2
|
+
total_duration?: number;
|
|
3
|
+
load_duration?: number;
|
|
4
|
+
prompt_eval_duration?: number;
|
|
5
|
+
eval_duration?: number;
|
|
6
|
+
eval_count?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface OllamaTokenMetrics {
|
|
9
|
+
endpoint: string;
|
|
10
|
+
totalDurationNs?: number;
|
|
11
|
+
loadDurationNs?: number;
|
|
12
|
+
promptEvalDurationNs?: number;
|
|
13
|
+
evalDurationNs?: number;
|
|
14
|
+
tokensPerSecond?: number;
|
|
15
|
+
}
|
|
16
|
+
interface RecordOllamaUsageInput {
|
|
17
|
+
model: string;
|
|
18
|
+
endpoint: string;
|
|
19
|
+
role: 'orchestrator' | 'coder' | 'reviewer';
|
|
20
|
+
promptTokens?: number;
|
|
21
|
+
completionTokens?: number;
|
|
22
|
+
totalDurationNs?: number;
|
|
23
|
+
loadDurationNs?: number;
|
|
24
|
+
promptEvalDurationNs?: number;
|
|
25
|
+
evalDurationNs?: number;
|
|
26
|
+
tokensPerSecond?: number;
|
|
27
|
+
}
|
|
28
|
+
export declare function computeTokensPerSecond(outputTokens?: number, evalDurationNs?: number): number | undefined;
|
|
29
|
+
export declare function buildOllamaTokenMetrics(chunk: OllamaMetricsChunk | undefined, endpoint: string): OllamaTokenMetrics | undefined;
|
|
30
|
+
export declare function recordOllamaUsage(input: RecordOllamaUsageInput): boolean;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/ollama/metrics.ts"],"names":[],"mappings":"AAEA,UAAU,kBAAkB;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,UAAU,sBAAsB;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,cAAc,GAAG,OAAO,GAAG,UAAU,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CACpC,YAAY,CAAC,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,GAAG,SAAS,CAKpB;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,kBAAkB,GAAG,SAAS,EACrC,QAAQ,EAAE,MAAM,GACf,kBAAkB,GAAG,SAAS,CAmBhC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAyCxE"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.computeTokensPerSecond = computeTokensPerSecond;
|
|
4
|
+
exports.buildOllamaTokenMetrics = buildOllamaTokenMetrics;
|
|
5
|
+
exports.recordOllamaUsage = recordOllamaUsage;
|
|
6
|
+
const global_db_connection_js_1 = require("../runners/global-db-connection.js");
|
|
7
|
+
function computeTokensPerSecond(outputTokens, evalDurationNs) {
|
|
8
|
+
if (!isFinitePositiveInt(outputTokens) || !isFinitePositiveInt(evalDurationNs)) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
return (outputTokens / evalDurationNs) * 1_000_000_000;
|
|
12
|
+
}
|
|
13
|
+
function buildOllamaTokenMetrics(chunk, endpoint) {
|
|
14
|
+
if (!endpoint) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
const totalDurationNs = sanitizeNullableInt(chunk?.total_duration);
|
|
18
|
+
const loadDurationNs = sanitizeNullableInt(chunk?.load_duration);
|
|
19
|
+
const promptEvalDurationNs = sanitizeNullableInt(chunk?.prompt_eval_duration);
|
|
20
|
+
const evalDurationNs = sanitizeNullableInt(chunk?.eval_duration);
|
|
21
|
+
const evalCount = sanitizeNullableInt(chunk?.eval_count);
|
|
22
|
+
return {
|
|
23
|
+
endpoint,
|
|
24
|
+
totalDurationNs: totalDurationNs ?? undefined,
|
|
25
|
+
loadDurationNs: loadDurationNs ?? undefined,
|
|
26
|
+
promptEvalDurationNs: promptEvalDurationNs ?? undefined,
|
|
27
|
+
evalDurationNs: evalDurationNs ?? undefined,
|
|
28
|
+
tokensPerSecond: computeTokensPerSecond(evalCount ?? undefined, evalDurationNs ?? undefined),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function recordOllamaUsage(input) {
|
|
32
|
+
if (!input.endpoint) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
const promptTokens = sanitizeNullableInt(input.promptTokens);
|
|
36
|
+
const completionTokens = sanitizeNullableInt(input.completionTokens);
|
|
37
|
+
const totalDurationNs = sanitizeNullableInt(input.totalDurationNs);
|
|
38
|
+
const loadDurationNs = sanitizeNullableInt(input.loadDurationNs);
|
|
39
|
+
const promptEvalDurationNs = sanitizeNullableInt(input.promptEvalDurationNs);
|
|
40
|
+
const evalDurationNs = sanitizeNullableInt(input.evalDurationNs);
|
|
41
|
+
const tokensPerSecond = sanitizeNullableFloat(input.tokensPerSecond ?? computeTokensPerSecond(completionTokens ?? undefined, evalDurationNs ?? undefined));
|
|
42
|
+
const createdAt = Date.now();
|
|
43
|
+
const { db, close } = (0, global_db_connection_js_1.openGlobalDatabase)();
|
|
44
|
+
try {
|
|
45
|
+
db.prepare(`INSERT INTO ollama_usage (
|
|
46
|
+
model, endpoint, role, prompt_tokens, completion_tokens, total_duration_ns,
|
|
47
|
+
load_duration_ns, prompt_eval_duration_ns, eval_duration_ns, tokens_per_second, created_at
|
|
48
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(input.model, input.endpoint, input.role, promptTokens, completionTokens, totalDurationNs, loadDurationNs, promptEvalDurationNs, evalDurationNs, tokensPerSecond, createdAt);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
close();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function isFinitePositiveInt(value) {
|
|
56
|
+
return typeof value === 'number' && Number.isFinite(value) && value > 0;
|
|
57
|
+
}
|
|
58
|
+
function sanitizeNullableInt(value) {
|
|
59
|
+
if (!isFinitePositiveInt(value) && value !== 0) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return Number(value);
|
|
63
|
+
}
|
|
64
|
+
function sanitizeNullableFloat(value) {
|
|
65
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
return value;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/ollama/metrics.ts"],"names":[],"mappings":"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"}
|