@aligndottech/cli 0.18.0 → 0.19.1
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 +10 -8
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +18 -1
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/setup.js +1 -1
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/why.d.ts.map +1 -1
- package/dist/commands/why.js +26 -8
- package/dist/commands/why.js.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/hook-payload.js +34 -4
- package/dist/lib/hook-payload.js.map +1 -1
- package/dist/lib/local-db.d.ts +54 -0
- package/dist/lib/local-db.d.ts.map +1 -1
- package/dist/lib/local-db.js +180 -6
- package/dist/lib/local-db.js.map +1 -1
- package/dist/lib/local-embeddings.d.ts.map +1 -1
- package/dist/lib/local-embeddings.js +13 -2
- package/dist/lib/local-embeddings.js.map +1 -1
- package/dist/lib/local-gateway-client.d.ts +36 -1
- package/dist/lib/local-gateway-client.d.ts.map +1 -1
- package/dist/lib/local-gateway-client.js +96 -8
- package/dist/lib/local-gateway-client.js.map +1 -1
- package/dist/lib/local-llm.d.ts +78 -15
- package/dist/lib/local-llm.d.ts.map +1 -1
- package/dist/lib/local-llm.js +327 -88
- package/dist/lib/local-llm.js.map +1 -1
- package/dist/lib/local-relationship-classifier.d.ts +22 -4
- package/dist/lib/local-relationship-classifier.d.ts.map +1 -1
- package/dist/lib/local-relationship-classifier.js +19 -9
- package/dist/lib/local-relationship-classifier.js.map +1 -1
- package/dist/lib/usage-telemetry.d.ts +36 -1
- package/dist/lib/usage-telemetry.d.ts.map +1 -1
- package/dist/lib/usage-telemetry.js +73 -3
- package/dist/lib/usage-telemetry.js.map +1 -1
- package/package.json +1 -1
package/dist/lib/local-llm.js
CHANGED
|
@@ -22,12 +22,68 @@ function buildUserPrompt(question, decisions) {
|
|
|
22
22
|
const ctx = decisions.map(d => `- ${d.title}: ${d.summary}`).join('\n');
|
|
23
23
|
return `Question: ${question}\n\nDecision context:\n${ctx}`;
|
|
24
24
|
}
|
|
25
|
-
|
|
25
|
+
/** Classify a non-2xx response: availability-class advances, anything else stops. */
|
|
26
|
+
async function classifyHttpFailure(res, model) {
|
|
27
|
+
const detail = `HTTP ${res.status}`;
|
|
28
|
+
// 401/403/404 decide on the status alone, so do not download a body to ignore it -
|
|
29
|
+
// behind a proxy the 401 body is an HTML page, and a dead key is the common case.
|
|
30
|
+
if (res.status === 401 || res.status === 403 || res.status === 404) {
|
|
31
|
+
return { kind: 'unavailable', detail };
|
|
32
|
+
}
|
|
33
|
+
let body = '';
|
|
34
|
+
try {
|
|
35
|
+
body = await res.text();
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// No readable body; the status alone decides.
|
|
39
|
+
}
|
|
40
|
+
return isAvailabilityFailure(res.status, body)
|
|
41
|
+
? { kind: 'unavailable', detail }
|
|
42
|
+
: { kind: 'failed', model, detail };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Classify a thrown fetch. An ABORT is not an absence: we chose this provider and gave
|
|
46
|
+
* up waiting on it, which is the same event as a 429 from the caller's point of view
|
|
47
|
+
* and must stop the chain. Slow is not absent - otherwise the same overloaded provider
|
|
48
|
+
* stops the chain when it answers 429 and demotes to a weaker model when it answers
|
|
49
|
+
* nothing, which is the harder failure to notice. A connection or DNS error genuinely
|
|
50
|
+
* means nothing answered, so that advances.
|
|
51
|
+
*/
|
|
52
|
+
function classifyThrownFetch(err, model) {
|
|
53
|
+
const name = err?.name;
|
|
54
|
+
if (name === 'TimeoutError' || name === 'AbortError') {
|
|
55
|
+
return { kind: 'failed', model, detail: 'timed out' };
|
|
56
|
+
}
|
|
57
|
+
return { kind: 'unavailable', detail: String(err) };
|
|
58
|
+
}
|
|
59
|
+
// A reasoning model (the deepseek-r family) prefixes its answer with a <think> block.
|
|
60
|
+
// It is a monologue, not prose for a human, and `align ask` prints the response
|
|
61
|
+
// verbatim while parseRelationship's brace match would span a brace inside it.
|
|
62
|
+
function stripReasoningBlock(text) {
|
|
63
|
+
return text.replace(/<think>[\s\S]*?<\/think>/gi, '').trim();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The shared tail every adapter needs: read the body, extract the model's text, and
|
|
67
|
+
* decide answer-or-stop. One owner, because this IS the response policy - four copies
|
|
68
|
+
* drift, and the Gemini copy had already grown its own shape.
|
|
69
|
+
*/
|
|
70
|
+
async function parseAdapterResponse(res, model, extract) {
|
|
71
|
+
let data;
|
|
72
|
+
try {
|
|
73
|
+
data = await res.json();
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return { kind: 'failed', model, detail: 'malformed response body' };
|
|
77
|
+
}
|
|
78
|
+
const text = stripReasoningBlock(extract(data)?.trim() ?? '');
|
|
79
|
+
return text ? { kind: 'answer', text } : { kind: 'failed', model, detail: 'empty response' };
|
|
80
|
+
}
|
|
26
81
|
// OpenAI-compatible Chat Completions API (OpenAI, Groq, Mistral, xAI/Grok, and any
|
|
27
82
|
// ALIGN_LLM_BASE_URL endpoint - OpenRouter, Together, DeepSeek, LM Studio, vLLM, ...).
|
|
28
83
|
async function tryOpenAiCompatible(system, user, endpoint, model, key, maxTokens = 256, timeoutMs = 15000, temperature) {
|
|
84
|
+
let res;
|
|
29
85
|
try {
|
|
30
|
-
|
|
86
|
+
res = await fetch(endpoint, {
|
|
31
87
|
method: 'POST',
|
|
32
88
|
headers: {
|
|
33
89
|
'Content-Type': 'application/json',
|
|
@@ -44,18 +100,19 @@ async function tryOpenAiCompatible(system, user, endpoint, model, key, maxTokens
|
|
|
44
100
|
}),
|
|
45
101
|
signal: AbortSignal.timeout(timeoutMs),
|
|
46
102
|
});
|
|
47
|
-
if (!res.ok)
|
|
48
|
-
return null;
|
|
49
|
-
const data = await res.json();
|
|
50
|
-
return data.choices?.[0]?.message?.content?.trim() ?? null;
|
|
51
103
|
}
|
|
52
|
-
catch {
|
|
53
|
-
return
|
|
104
|
+
catch (err) {
|
|
105
|
+
return classifyThrownFetch(err, model);
|
|
54
106
|
}
|
|
107
|
+
if (!res.ok)
|
|
108
|
+
return classifyHttpFailure(res, model);
|
|
109
|
+
return parseAdapterResponse(res, model, d => d.choices?.[0]?.message?.content);
|
|
55
110
|
}
|
|
56
111
|
async function tryAnthropic(system, user, key, maxTokens = 256, temperature) {
|
|
112
|
+
const model = process.env['ALIGN_ANTHROPIC_MODEL'] || 'claude-haiku-4-5-20251001';
|
|
113
|
+
let res;
|
|
57
114
|
try {
|
|
58
|
-
|
|
115
|
+
res = await fetch('https://api.anthropic.com/v1/messages', {
|
|
59
116
|
method: 'POST',
|
|
60
117
|
headers: {
|
|
61
118
|
'Content-Type': 'application/json',
|
|
@@ -63,7 +120,7 @@ async function tryAnthropic(system, user, key, maxTokens = 256, temperature) {
|
|
|
63
120
|
'anthropic-version': '2023-06-01',
|
|
64
121
|
},
|
|
65
122
|
body: JSON.stringify({
|
|
66
|
-
model
|
|
123
|
+
model,
|
|
67
124
|
max_tokens: maxTokens,
|
|
68
125
|
...(temperature !== undefined ? { temperature } : {}),
|
|
69
126
|
system,
|
|
@@ -71,19 +128,22 @@ async function tryAnthropic(system, user, key, maxTokens = 256, temperature) {
|
|
|
71
128
|
}),
|
|
72
129
|
signal: AbortSignal.timeout(15000),
|
|
73
130
|
});
|
|
74
|
-
if (!res.ok)
|
|
75
|
-
return null;
|
|
76
|
-
const data = await res.json();
|
|
77
|
-
return data.content?.[0]?.text?.trim() ?? null;
|
|
78
131
|
}
|
|
79
|
-
catch {
|
|
80
|
-
return
|
|
132
|
+
catch (err) {
|
|
133
|
+
return classifyThrownFetch(err, model);
|
|
81
134
|
}
|
|
135
|
+
if (!res.ok)
|
|
136
|
+
return classifyHttpFailure(res, model);
|
|
137
|
+
// First block with text, not content[0]: a thinking or tool-use block can lead, and
|
|
138
|
+
// reading index 0 blindly calls a correct answer an empty response - which now STOPS
|
|
139
|
+
// the chain rather than merely falling through it.
|
|
140
|
+
return parseAdapterResponse(res, model, d => d.content?.find(b => b.text?.trim())?.text);
|
|
82
141
|
}
|
|
83
142
|
async function tryGemini(system, user, key, maxTokens = 256, temperature) {
|
|
143
|
+
const geminiModel = process.env['ALIGN_GEMINI_MODEL'] || 'gemini-1.5-flash';
|
|
144
|
+
let res;
|
|
84
145
|
try {
|
|
85
|
-
|
|
86
|
-
const res = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${geminiModel}:generateContent?key=${key}`, {
|
|
146
|
+
res = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${geminiModel}:generateContent?key=${key}`, {
|
|
87
147
|
method: 'POST',
|
|
88
148
|
headers: { 'Content-Type': 'application/json' },
|
|
89
149
|
body: JSON.stringify({
|
|
@@ -96,18 +156,86 @@ async function tryGemini(system, user, key, maxTokens = 256, temperature) {
|
|
|
96
156
|
}),
|
|
97
157
|
signal: AbortSignal.timeout(15000),
|
|
98
158
|
});
|
|
99
|
-
if (!res.ok)
|
|
100
|
-
return null;
|
|
101
|
-
const data = await res.json();
|
|
102
|
-
return data.candidates?.[0]?.content?.parts?.[0]?.text?.trim() ?? null;
|
|
103
159
|
}
|
|
104
|
-
catch {
|
|
105
|
-
return
|
|
160
|
+
catch (err) {
|
|
161
|
+
return classifyThrownFetch(err, geminiModel);
|
|
106
162
|
}
|
|
163
|
+
if (!res.ok)
|
|
164
|
+
return classifyHttpFailure(res, geminiModel);
|
|
165
|
+
// First part with text, for the same reason as Anthropic's blocks above.
|
|
166
|
+
return parseAdapterResponse(res, geminiModel, d => d.candidates?.[0]?.content?.parts?.find(p => p.text?.trim())?.text);
|
|
107
167
|
}
|
|
108
|
-
|
|
109
|
-
|
|
168
|
+
/**
|
|
169
|
+
* Ollama model families recognised for decision synthesis, in OUR preference order
|
|
170
|
+
* (never /api/tags order - ALI-420). Family-level and version-free on purpose: the
|
|
171
|
+
* old exact-version list (llama3.2, llama3.1, llama3, mistral, gemma2, phi3) went
|
|
172
|
+
* stale the moment a new version shipped, and the 2026-08-25 vetting eval showed the
|
|
173
|
+
* quality lever is SYNTHESIS_SYSTEM_PROMPT, not which mainstream family answers. The
|
|
174
|
+
* list's remaining job is "is something recognisable installed" - matched against the
|
|
175
|
+
* LIVE /api/tags registry, and the newest installed version wins within a family.
|
|
176
|
+
* (ALI-692)
|
|
177
|
+
*/
|
|
178
|
+
export const OLLAMA_MODEL_FAMILIES = [
|
|
179
|
+
/^llama[\d.:-]/i,
|
|
180
|
+
/^mistral[\d.:-]/i,
|
|
181
|
+
/^gemma[\d.:-]/i,
|
|
182
|
+
/^phi[\d.:-]/i,
|
|
183
|
+
/^qwen[\d.:-]/i,
|
|
184
|
+
/^deepseek-r[\d.:-]/i,
|
|
110
185
|
];
|
|
186
|
+
/**
|
|
187
|
+
* A family match says who trained it, never what it was trained FOR, and the ALI-420
|
|
188
|
+
* floor is about the second: llama2-uncensored is in the llama family and is the same
|
|
189
|
+
* category as the pentest model from that ticket, while a coder or embedding model is
|
|
190
|
+
* not a synthesis model at all. So a tuning marker disqualifies a tag even when its
|
|
191
|
+
* family is recognised - a user can still name one explicitly via ALIGN_OLLAMA_MODEL.
|
|
192
|
+
*/
|
|
193
|
+
const OLLAMA_TUNING_DISQUALIFIERS = /(coder|code|math|uncensored|embed|guard|vision|dolphin)/i;
|
|
194
|
+
/**
|
|
195
|
+
* A tag is recognised by its LAST path segment, because `ollama pull hf.co/<user>/<repo>`
|
|
196
|
+
* prefixes the name - anchoring at the start of the whole string refuses every model
|
|
197
|
+
* installed that mainstream way.
|
|
198
|
+
*/
|
|
199
|
+
function ollamaTagBase(name) {
|
|
200
|
+
return name.split('/').pop() ?? name;
|
|
201
|
+
}
|
|
202
|
+
function isRecognisedOllamaModel(name, family) {
|
|
203
|
+
const base = ollamaTagBase(name);
|
|
204
|
+
return family.test(base) && !OLLAMA_TUNING_DISQUALIFIERS.test(base);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Static fallback for the "pull one" hint only - version-pinned so it is
|
|
208
|
+
* copy-pasteable, therefore stale by design. Resolution never consults it:
|
|
209
|
+
* resolveOllamaModel picks from what the live registry actually has.
|
|
210
|
+
*/
|
|
211
|
+
export const RECOMMENDED_OLLAMA_PULL = 'llama3.2';
|
|
212
|
+
/**
|
|
213
|
+
* Numeric version segments from a tag name ('llama3.10:latest' -> [3, 10]).
|
|
214
|
+
*
|
|
215
|
+
* A PARAMETER SIZE is not a version, and community tags put one in the name: taking
|
|
216
|
+
* the first digit run makes `mistral-7b-instruct` look newer than `mistral-small3.1`,
|
|
217
|
+
* so any `-7b` / `_7x8b` token comes out before the version is read.
|
|
218
|
+
*/
|
|
219
|
+
function modelVersionSegments(name) {
|
|
220
|
+
const base = (name.split(':')[0] ?? '').replace(/[-_]\d+(\.\d+)?x?\d*b\b/gi, '');
|
|
221
|
+
const m = base.match(/(\d+(?:\.\d+)*)/);
|
|
222
|
+
return m ? m[1].split('.').map(Number) : [0];
|
|
223
|
+
}
|
|
224
|
+
/** Parameter count in billions from a tag ('llama3.2:3b' -> 3), 0 when absent. */
|
|
225
|
+
function modelParameterBillions(name) {
|
|
226
|
+
const m = name.match(/(\d+(?:\.\d+)?)b\b/i);
|
|
227
|
+
return m ? Number(m[1]) : 0;
|
|
228
|
+
}
|
|
229
|
+
// Segment-wise, so 3.10 > 3.9 (a float parse or string sort gets it backwards).
|
|
230
|
+
function compareVersionSegments(a, b) {
|
|
231
|
+
const len = Math.max(a.length, b.length);
|
|
232
|
+
for (let i = 0; i < len; i++) {
|
|
233
|
+
const d = (a[i] ?? 0) - (b[i] ?? 0);
|
|
234
|
+
if (d !== 0)
|
|
235
|
+
return d;
|
|
236
|
+
}
|
|
237
|
+
return 0;
|
|
238
|
+
}
|
|
111
239
|
export function resolveOllamaModel(installed, override) {
|
|
112
240
|
// Named by the user, so it is their call - the contract every other provider here
|
|
113
241
|
// already has via ALIGN_<PROVIDER>_MODEL.
|
|
@@ -115,60 +243,119 @@ export function resolveOllamaModel(installed, override) {
|
|
|
115
243
|
return { ok: true, model: override };
|
|
116
244
|
if (!installed.length)
|
|
117
245
|
return { ok: false, reason: 'no_models' };
|
|
118
|
-
// Iterate
|
|
119
|
-
// letting it pick among
|
|
120
|
-
for (const family of
|
|
121
|
-
const
|
|
122
|
-
if (
|
|
123
|
-
|
|
246
|
+
// Iterate OUR family order, not the installed list: `/api/tags` order is Ollama's,
|
|
247
|
+
// and letting it pick among recognised families is the same defect one line over.
|
|
248
|
+
for (const family of OLLAMA_MODEL_FAMILIES) {
|
|
249
|
+
const matches = installed.filter(m => isRecognisedOllamaModel(m, family));
|
|
250
|
+
if (!matches.length)
|
|
251
|
+
continue;
|
|
252
|
+
// Newest version, then the larger model, then the name. The last two exist so the
|
|
253
|
+
// result cannot depend on `/api/tags` order: llama3.2:1b and llama3.2:3b tie on
|
|
254
|
+
// version, and a stable sort would hand that choice straight back to Ollama.
|
|
255
|
+
matches.sort((a, b) => compareVersionSegments(modelVersionSegments(b), modelVersionSegments(a))
|
|
256
|
+
|| modelParameterBillions(b) - modelParameterBillions(a)
|
|
257
|
+
|| a.localeCompare(b));
|
|
258
|
+
return { ok: true, model: matches[0] };
|
|
124
259
|
}
|
|
125
|
-
return { ok: false, reason: '
|
|
260
|
+
return { ok: false, reason: 'no_recognised_model' };
|
|
126
261
|
}
|
|
127
|
-
let unvettedOllamaModels = null;
|
|
128
262
|
/**
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
*
|
|
263
|
+
* Error-body wordings that mean PERMANENT: this key or this model cannot answer here
|
|
264
|
+
* however many times we ask. Providers report several of these on statuses outside
|
|
265
|
+
* 401/403/404 - Gemini says 400 for a bad key, OpenAI says 429 for a dead account -
|
|
266
|
+
* and each one, misread as transient, permanently disables every provider behind it
|
|
267
|
+
* in the chain. Every entry is a real provider phrasing.
|
|
132
268
|
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
269
|
+
* A TRANSIENT failure must never appear here: a real rate limit, a 529 overload or a
|
|
270
|
+
* 5xx is the chosen provider having a bad minute, and advancing past it is the silent
|
|
271
|
+
* demotion this whole mechanism exists to prevent.
|
|
136
272
|
*/
|
|
137
|
-
|
|
138
|
-
|
|
273
|
+
const AVAILABILITY_BODY_PATTERNS = [
|
|
274
|
+
/unauthori[sz]ed/i,
|
|
275
|
+
/authentication[\s_-]+(failed|error)/i,
|
|
276
|
+
/permission[\s_-]+denied/i,
|
|
277
|
+
/\binvalid[\s_-]+api[\s_-]?key\b/i,
|
|
278
|
+
/\bapi[\s_-]?key[\s_-]+not[\s_-]+valid\b/i,
|
|
279
|
+
/\bunknown\s+(model|provider)\b/i,
|
|
280
|
+
/\binvalid\s+(model|provider)\b/i,
|
|
281
|
+
/\bmodel\s+not\s+(found|available|registered|supported)\b/i,
|
|
282
|
+
/\bno\s+such\s+(model|provider)\b/i,
|
|
283
|
+
/not a valid model/i,
|
|
284
|
+
/\bmodel_not_found\b/i,
|
|
285
|
+
/\binsufficient_quota\b/i,
|
|
286
|
+
/credit balance is too low/i,
|
|
287
|
+
/\bunsupported (parameter|value)\b/i,
|
|
288
|
+
];
|
|
289
|
+
/**
|
|
290
|
+
* The body text a provider's error carries, WITHOUT any part of the request it may
|
|
291
|
+
* have echoed back. `classifyRelationship` sends a 2,000-character diff as the user
|
|
292
|
+
* prompt, and endpoints routinely quote the offending request in a 4xx body - so
|
|
293
|
+
* matching prose against the whole body lets the decision text under review decide
|
|
294
|
+
* whether to demote to a weaker model. Reading only the error member closes that.
|
|
295
|
+
*
|
|
296
|
+
* A non-JSON body has no error member to read, so it falls back to the raw text: the
|
|
297
|
+
* boundary of this defence is "the provider replied in JSON", which is all of them.
|
|
298
|
+
*/
|
|
299
|
+
function providerErrorText(body) {
|
|
300
|
+
try {
|
|
301
|
+
const parsed = JSON.parse(body);
|
|
302
|
+
if (typeof parsed !== 'object' || parsed === null)
|
|
303
|
+
return body;
|
|
304
|
+
const err = parsed.error;
|
|
305
|
+
if (err === undefined)
|
|
306
|
+
return body;
|
|
307
|
+
return typeof err === 'string' ? err : JSON.stringify(err);
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
return body;
|
|
311
|
+
}
|
|
139
312
|
}
|
|
140
|
-
/**
|
|
141
|
-
|
|
142
|
-
|
|
313
|
+
/**
|
|
314
|
+
* Only failures on this allowlist may advance the fallback chain: they mean the chosen
|
|
315
|
+
* model can NEVER answer in this environment (bad key, no such model, no credit), so
|
|
316
|
+
* trying the next provider loses nothing. Anything else - a malformed body, an empty
|
|
317
|
+
* answer, a real rate limit, a 5xx - came from the provider the user chose, and
|
|
318
|
+
* silently demoting to a weaker model would launder that failure into an answer the
|
|
319
|
+
* caller trusts as if the chosen model wrote it. Deliberately conservative (ALI-692).
|
|
320
|
+
*/
|
|
321
|
+
export function isAvailabilityFailure(status, body) {
|
|
322
|
+
if (status === 401 || status === 403 || status === 404)
|
|
323
|
+
return true;
|
|
324
|
+
const text = providerErrorText(body);
|
|
325
|
+
return AVAILABILITY_BODY_PATTERNS.some(p => p.test(text));
|
|
143
326
|
}
|
|
144
327
|
async function tryOllama(system, user, temperature) {
|
|
145
|
-
|
|
146
|
-
//
|
|
147
|
-
//
|
|
148
|
-
|
|
149
|
-
|
|
328
|
+
// `||`, not `??`: OLLAMA_HOST='' (a stock .env template, an unset compose variable)
|
|
329
|
+
// would otherwise make every probe a relative URL that fetch cannot parse, so a
|
|
330
|
+
// healthy local Ollama is never asked and the user is told to configure a key.
|
|
331
|
+
const host = process.env['OLLAMA_HOST'] || 'http://localhost:11434';
|
|
332
|
+
// The /api/tags probe is discovery, not a model answering: every way it can fail
|
|
333
|
+
// (not running, no models, nothing recognised) means "no usable model here".
|
|
150
334
|
let model;
|
|
151
335
|
try {
|
|
152
336
|
const tagsRes = await fetch(`${host}/api/tags`, { signal: AbortSignal.timeout(2000) });
|
|
153
337
|
if (!tagsRes.ok)
|
|
154
|
-
return
|
|
338
|
+
return { kind: 'unavailable', detail: 'tags probe failed' };
|
|
155
339
|
const tags = await tagsRes.json();
|
|
156
340
|
const models = (tags.models ?? []).map(m => m.name);
|
|
157
341
|
if (!models.length)
|
|
158
|
-
return
|
|
342
|
+
return { kind: 'unavailable', detail: 'no models installed' };
|
|
159
343
|
const choice = resolveOllamaModel(models, process.env['ALIGN_OLLAMA_MODEL']);
|
|
160
344
|
if (!choice.ok) {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
return
|
|
345
|
+
// The models travel WITH the outcome, so the caller that asked gets them - see
|
|
346
|
+
// LlmFailure. A module variable here could be cleared by a concurrent call.
|
|
347
|
+
return choice.reason === 'no_recognised_model'
|
|
348
|
+
? { kind: 'unavailable', detail: choice.reason, unrecognisedModels: models }
|
|
349
|
+
: { kind: 'unavailable', detail: choice.reason };
|
|
164
350
|
}
|
|
165
351
|
model = choice.model;
|
|
166
352
|
}
|
|
167
|
-
catch {
|
|
168
|
-
return
|
|
353
|
+
catch (err) {
|
|
354
|
+
return { kind: 'unavailable', detail: String(err) };
|
|
169
355
|
}
|
|
356
|
+
let res;
|
|
170
357
|
try {
|
|
171
|
-
|
|
358
|
+
res = await fetch(`${host}/api/chat`, {
|
|
172
359
|
method: 'POST',
|
|
173
360
|
headers: { 'Content-Type': 'application/json' },
|
|
174
361
|
body: JSON.stringify({
|
|
@@ -182,14 +369,19 @@ async function tryOllama(system, user, temperature) {
|
|
|
182
369
|
}),
|
|
183
370
|
signal: AbortSignal.timeout(30000),
|
|
184
371
|
});
|
|
185
|
-
if (!res.ok)
|
|
186
|
-
return null;
|
|
187
|
-
const data = await res.json();
|
|
188
|
-
return data.message?.content?.trim() ?? null;
|
|
189
372
|
}
|
|
190
|
-
catch {
|
|
191
|
-
|
|
373
|
+
catch (err) {
|
|
374
|
+
// Past selection, Ollama is a CHOSEN provider like any other, so every failure here
|
|
375
|
+
// must be attributable: an unrecorded stop sends the caller to the generic "set a
|
|
376
|
+
// key" hint, which is nonsense for a user whose local model just replied. A cold
|
|
377
|
+
// 7B commonly exceeds the 30s budget on its first load, and that is the model's
|
|
378
|
+
// failure to name, not an absent provider.
|
|
379
|
+
const name = err?.name;
|
|
380
|
+
return { kind: 'failed', model, detail: name === 'TimeoutError' || name === 'AbortError' ? 'timed out' : 'unreachable' };
|
|
192
381
|
}
|
|
382
|
+
if (!res.ok)
|
|
383
|
+
return { kind: 'failed', model, detail: `HTTP ${res.status}` };
|
|
384
|
+
return parseAdapterResponse(res, model, d => d.message?.content);
|
|
193
385
|
}
|
|
194
386
|
/** Normalize a base URL into a full Chat Completions endpoint. */
|
|
195
387
|
function chatCompletionsUrl(base) {
|
|
@@ -200,10 +392,12 @@ function keyForProvider(provider) {
|
|
|
200
392
|
switch (provider) {
|
|
201
393
|
case 'anthropic': return process.env['ANTHROPIC_API_KEY'];
|
|
202
394
|
case 'openai': return process.env['OPENAI_API_KEY'];
|
|
203
|
-
|
|
395
|
+
// `||` on the aliases: an empty GEMINI_API_KEY must not shadow a real GOOGLE_API_KEY
|
|
396
|
+
// (a stock .env template ships both names), which `??` would do silently.
|
|
397
|
+
case 'gemini': return process.env['GEMINI_API_KEY'] || process.env['GOOGLE_API_KEY'];
|
|
204
398
|
case 'groq': return process.env['GROQ_API_KEY'];
|
|
205
399
|
case 'mistral': return process.env['MISTRAL_API_KEY'];
|
|
206
|
-
case 'grok': return process.env['GROK_API_KEY']
|
|
400
|
+
case 'grok': return process.env['GROK_API_KEY'] || process.env['XAI_API_KEY'];
|
|
207
401
|
}
|
|
208
402
|
}
|
|
209
403
|
async function callProvider(provider, key, system, user, maxTokens, temperature) {
|
|
@@ -211,24 +405,26 @@ async function callProvider(provider, key, system, user, maxTokens, temperature)
|
|
|
211
405
|
case 'anthropic':
|
|
212
406
|
return tryAnthropic(system, user, key, maxTokens, temperature);
|
|
213
407
|
case 'openai':
|
|
214
|
-
return tryOpenAiCompatible(system, user, 'https://api.openai.com/v1/chat/completions', process.env['ALIGN_OPENAI_MODEL']
|
|
408
|
+
return tryOpenAiCompatible(system, user, 'https://api.openai.com/v1/chat/completions', process.env['ALIGN_OPENAI_MODEL'] || 'gpt-4o-mini', key, maxTokens, undefined, temperature);
|
|
215
409
|
case 'gemini':
|
|
216
410
|
return tryGemini(system, user, key, maxTokens, temperature);
|
|
217
411
|
case 'groq':
|
|
218
|
-
return tryOpenAiCompatible(system, user, 'https://api.groq.com/openai/v1/chat/completions', process.env['ALIGN_GROQ_MODEL']
|
|
412
|
+
return tryOpenAiCompatible(system, user, 'https://api.groq.com/openai/v1/chat/completions', process.env['ALIGN_GROQ_MODEL'] || 'llama-3.1-8b-instant', key, maxTokens, undefined, temperature);
|
|
219
413
|
case 'mistral':
|
|
220
|
-
return tryOpenAiCompatible(system, user, 'https://api.mistral.ai/v1/chat/completions', process.env['ALIGN_MISTRAL_MODEL']
|
|
414
|
+
return tryOpenAiCompatible(system, user, 'https://api.mistral.ai/v1/chat/completions', process.env['ALIGN_MISTRAL_MODEL'] || 'mistral-small-latest', key, maxTokens, undefined, temperature);
|
|
221
415
|
case 'grok':
|
|
222
|
-
return tryOpenAiCompatible(system, user, 'https://api.x.ai/v1/chat/completions', process.env['ALIGN_GROK_MODEL']
|
|
416
|
+
return tryOpenAiCompatible(system, user, 'https://api.x.ai/v1/chat/completions', process.env['ALIGN_GROK_MODEL'] || 'grok-2-latest', key, maxTokens, undefined, temperature);
|
|
223
417
|
}
|
|
224
418
|
}
|
|
225
419
|
const ALL_PROVIDERS = ['anthropic', 'openai', 'gemini', 'groq', 'mistral', 'grok'];
|
|
226
420
|
/**
|
|
227
421
|
* Is any LLM provider configured by environment? (ALI-414)
|
|
228
422
|
*
|
|
229
|
-
* `callChat` returns null for a missing key
|
|
230
|
-
* caller that needs to tell "never configured" from "configured but
|
|
231
|
-
*
|
|
423
|
+
* `callChat` returns null for a missing key and for a provider that answered unusably
|
|
424
|
+
* alike, so a caller that needs to tell "never configured" from "configured but
|
|
425
|
+
* failed" has to ask - this, then the failure `callChatDetailed` returned for the
|
|
426
|
+
* second case, which is the one this function cannot see. Deliberately synchronous and
|
|
427
|
+
* env-only: it does NOT probe Ollama, so a
|
|
232
428
|
* machine whose only provider is a broken local Ollama reads as unconfigured. The
|
|
233
429
|
* remedy that points at - configure a provider - is still the right one.
|
|
234
430
|
*/
|
|
@@ -244,25 +440,51 @@ export function hasConfiguredProvider() {
|
|
|
244
440
|
* Together, DeepSeek, LM Studio, vLLM, ...) via ALIGN_LLM_MODEL/ALIGN_LLM_API_KEY
|
|
245
441
|
* 3. named providers by env key (Anthropic, OpenAI, Gemini, Groq, Mistral, Grok)
|
|
246
442
|
* 4. local Ollama (no key)
|
|
247
|
-
* Returns the model's text, or
|
|
443
|
+
* Returns the model's text, or the reason there is none - see LlmFailure. The reason
|
|
444
|
+
* is RETURNED rather than recorded in module state, so concurrent calls cannot read
|
|
445
|
+
* each other's diagnosis.
|
|
446
|
+
*
|
|
447
|
+
* ALI-692: only an availability-class failure advances that chain (see
|
|
448
|
+
* isAvailabilityFailure). Anything else - the chosen model answering unusably, a rate
|
|
449
|
+
* limit, a 5xx - stops it, so the caller can name the model that failed instead of a
|
|
450
|
+
* weaker one answering in its place.
|
|
248
451
|
*/
|
|
249
|
-
export async function
|
|
452
|
+
export async function callChatDetailed(system, user, opts) {
|
|
250
453
|
const maxTokens = opts?.maxTokens;
|
|
251
454
|
const temperature = opts?.temperature;
|
|
455
|
+
// The most specific unavailability seen while walking the chain. Only Ollama can
|
|
456
|
+
// produce one today, and it is a local (not module) variable, so a sibling call
|
|
457
|
+
// cannot clear it mid-flight - which is the whole point of this shape.
|
|
458
|
+
let unrecognised;
|
|
459
|
+
// An answer or a stop settles the chain; availability advances it (undefined).
|
|
460
|
+
const settle = (outcome, provider) => {
|
|
461
|
+
if (outcome.kind === 'answer')
|
|
462
|
+
return { ok: true, text: outcome.text };
|
|
463
|
+
if (outcome.kind === 'failed') {
|
|
464
|
+
return { ok: false, failure: { kind: 'provider_stopped', provider, model: outcome.model, detail: outcome.detail } };
|
|
465
|
+
}
|
|
466
|
+
// Narrowed to `unavailable` by the two returns above, so reading its own field
|
|
467
|
+
// needs no guard. Deliberately left to exhaustion rather than an explicit
|
|
468
|
+
// `kind === 'unavailable'` check: a fourth AdapterOutcome variant would make this
|
|
469
|
+
// line a type error, where an explicit check would silently route it to advance.
|
|
470
|
+
if (outcome.unrecognisedModels)
|
|
471
|
+
unrecognised = outcome.unrecognisedModels;
|
|
472
|
+
return undefined;
|
|
473
|
+
};
|
|
252
474
|
// 1. configured provider (from align setup) takes priority
|
|
253
475
|
if (opts?.provider && opts.apiKey) {
|
|
254
|
-
const
|
|
255
|
-
if (
|
|
256
|
-
return
|
|
476
|
+
const settled = settle(await callProvider(opts.provider, opts.apiKey, system, user, maxTokens, temperature), opts.provider);
|
|
477
|
+
if (settled)
|
|
478
|
+
return settled;
|
|
257
479
|
}
|
|
258
480
|
// 2. generic OpenAI-compatible escape hatch - covers any provider
|
|
259
481
|
const baseUrl = process.env['ALIGN_LLM_BASE_URL'];
|
|
260
482
|
if (baseUrl) {
|
|
261
483
|
const key = process.env['ALIGN_LLM_API_KEY'] ?? '';
|
|
262
|
-
const model = process.env['ALIGN_LLM_MODEL']
|
|
263
|
-
const
|
|
264
|
-
if (
|
|
265
|
-
return
|
|
484
|
+
const model = process.env['ALIGN_LLM_MODEL'] || 'gpt-4o-mini';
|
|
485
|
+
const settled = settle(await tryOpenAiCompatible(system, user, chatCompletionsUrl(baseUrl), model, key, maxTokens, undefined, temperature), 'custom');
|
|
486
|
+
if (settled)
|
|
487
|
+
return settled;
|
|
266
488
|
}
|
|
267
489
|
// 3. named providers via env keys, in priority order
|
|
268
490
|
for (const provider of ALL_PROVIDERS) {
|
|
@@ -270,17 +492,34 @@ export async function callChat(system, user, opts) {
|
|
|
270
492
|
continue; // already tried above
|
|
271
493
|
const key = keyForProvider(provider);
|
|
272
494
|
if (key) {
|
|
273
|
-
const
|
|
274
|
-
if (
|
|
275
|
-
return
|
|
495
|
+
const settled = settle(await callProvider(provider, key, system, user, maxTokens, temperature), provider);
|
|
496
|
+
if (settled)
|
|
497
|
+
return settled;
|
|
276
498
|
}
|
|
277
499
|
}
|
|
278
500
|
// 4. local Ollama as last resort
|
|
279
|
-
|
|
501
|
+
const settled = settle(await tryOllama(system, user, temperature), 'ollama');
|
|
502
|
+
if (settled)
|
|
503
|
+
return settled;
|
|
504
|
+
// Nothing answered. An unrecognised local model is the more specific diagnosis and
|
|
505
|
+
// its remedy is the opposite of "configure a provider", so it wins (ALI-420).
|
|
506
|
+
return unrecognised
|
|
507
|
+
? { ok: false, failure: { kind: 'unrecognised_local_models', models: unrecognised } }
|
|
508
|
+
: { ok: false, failure: { kind: 'no_provider' } };
|
|
509
|
+
}
|
|
510
|
+
/** Text-only convenience wrapper. Use callChatDetailed when you need to say WHY. */
|
|
511
|
+
export async function callChat(system, user, opts) {
|
|
512
|
+
const result = await callChatDetailed(system, user, opts);
|
|
513
|
+
return result.ok ? result.text : null;
|
|
280
514
|
}
|
|
281
515
|
/** Synthesise a natural-language answer from retrieved decisions, using any configured provider. */
|
|
282
|
-
export async function
|
|
516
|
+
export async function synthesiseDetailed(question, decisions, options) {
|
|
283
517
|
const user = buildUserPrompt(question, decisions);
|
|
284
|
-
return
|
|
518
|
+
return callChatDetailed(SYNTHESIS_SYSTEM_PROMPT, user, { provider: options?.provider, apiKey: options?.apiKey });
|
|
519
|
+
}
|
|
520
|
+
/** Text-only wrapper on synthesiseDetailed, for callers that cannot use the reason. */
|
|
521
|
+
export async function synthesiseLocally(question, decisions, options) {
|
|
522
|
+
const result = await synthesiseDetailed(question, decisions, options);
|
|
523
|
+
return result.ok ? result.text : null;
|
|
285
524
|
}
|
|
286
525
|
//# sourceMappingURL=local-llm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-llm.js","sourceRoot":"","sources":["../../src/lib/local-llm.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"local-llm.js","sourceRoot":"","sources":["../../src/lib/local-llm.ts"],"names":[],"mappings":"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"}
|