@almightygpt/core 0.10.1 → 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.
- package/dist/adapters/defaults.d.ts.map +1 -1
- package/dist/adapters/defaults.js +5 -0
- package/dist/adapters/defaults.js.map +1 -1
- package/dist/adapters/factory.d.ts.map +1 -1
- package/dist/adapters/factory.js +11 -1
- package/dist/adapters/factory.js.map +1 -1
- package/dist/adapters/index.d.ts +9 -5
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +9 -5
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/ollama.d.ts +47 -0
- package/dist/adapters/ollama.d.ts.map +1 -0
- package/dist/adapters/ollama.js +124 -0
- package/dist/adapters/ollama.js.map +1 -0
- package/dist/adapters/openrouter.d.ts +50 -0
- package/dist/adapters/openrouter.d.ts.map +1 -0
- package/dist/adapters/openrouter.js +148 -0
- package/dist/adapters/openrouter.js.map +1 -0
- package/dist/auth/__tests__/resolver.test.js +18 -0
- package/dist/auth/__tests__/resolver.test.js.map +1 -1
- package/dist/auth/types.d.ts +1 -1
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js +8 -0
- package/dist/auth/types.js.map +1 -1
- package/dist/auth/validator.d.ts.map +1 -1
- package/dist/auth/validator.js +101 -0
- package/dist/auth/validator.js.map +1 -1
- package/dist/config/schema.d.ts +12 -12
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +8 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/src/adapters/defaults.ts +5 -0
- package/src/adapters/factory.ts +11 -1
- package/src/adapters/index.ts +9 -5
- package/src/adapters/ollama.ts +157 -0
- package/src/adapters/openrouter.ts +194 -0
- package/src/auth/__tests__/resolver.test.ts +24 -0
- package/src/auth/types.ts +15 -1
- package/src/auth/validator.ts +106 -0
- package/src/config/schema.ts +8 -1
- package/src/index.ts +1 -1
package/dist/auth/types.js
CHANGED
|
@@ -40,6 +40,11 @@ export const PROVIDER_ENV_VARS = {
|
|
|
40
40
|
anthropic: ["ANTHROPIC_API_KEY"],
|
|
41
41
|
// Google's SDK historically accepted both names; honor both.
|
|
42
42
|
google: ["GOOGLE_API_KEY", "GEMINI_API_KEY"],
|
|
43
|
+
openrouter: ["OPENROUTER_API_KEY"],
|
|
44
|
+
// Ollama is local — no key. The empty list signals "no auth"
|
|
45
|
+
// to the resolver (it just falls through to keychain → missing,
|
|
46
|
+
// and the Ollama adapter bypasses the resolver entirely).
|
|
47
|
+
ollama: [],
|
|
43
48
|
};
|
|
44
49
|
/**
|
|
45
50
|
* Browser-launchable URL where a user creates / manages keys for each
|
|
@@ -49,5 +54,8 @@ export const PROVIDER_KEY_URLS = {
|
|
|
49
54
|
openai: "https://platform.openai.com/api-keys",
|
|
50
55
|
anthropic: "https://console.anthropic.com/settings/keys",
|
|
51
56
|
google: "https://aistudio.google.com/apikey",
|
|
57
|
+
openrouter: "https://openrouter.ai/keys",
|
|
58
|
+
// Ollama is local — no keys page. Linked instead to install docs.
|
|
59
|
+
ollama: "https://ollama.ai/download",
|
|
52
60
|
};
|
|
53
61
|
//# sourceMappingURL=types.js.map
|
package/dist/auth/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAsCH;;;;GAIG;AACH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,QAAQ,CAAa;IACrB,MAAM,CAAS;IACxB,YAAY,QAAoB,EAAE,MAAc,EAAE,aAAsB;QACtE,KAAK,CACH,aAAa;YACX,wBAAwB,QAAQ,IAAI;gBAClC,yBAAyB,QAAQ,iCAAiC;gBAClE,aAAa,MAAM,iBAAiB,CACzC,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,mEAAmE;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAA0C;IACtE,MAAM,EAAE,CAAC,gBAAgB,CAAC;IAC1B,SAAS,EAAE,CAAC,mBAAmB,CAAC;IAChC,6DAA6D;IAC7D,MAAM,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,UAAU,EAAE,CAAC,oBAAoB,CAAC;IAClC,6DAA6D;IAC7D,gEAAgE;IAChE,0DAA0D;IAC1D,MAAM,EAAE,EAAE;CACX,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA+B;IAC3D,MAAM,EAAE,sCAAsC;IAC9C,SAAS,EAAE,6CAA6C;IACxD,MAAM,EAAE,oCAAoC;IAC5C,UAAU,EAAE,4BAA4B;IACxC,kEAAkE;IAClE,MAAM,EAAE,4BAA4B;CACrC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/auth/validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,UAAU,EACpB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/auth/validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,UAAU,EACpB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,gBAAgB,CAAC,CAsC3B"}
|
package/dist/auth/validator.js
CHANGED
|
@@ -47,6 +47,20 @@ export async function validateKey(provider, key) {
|
|
|
47
47
|
case "google":
|
|
48
48
|
result = await validateGoogle(key);
|
|
49
49
|
break;
|
|
50
|
+
case "openrouter":
|
|
51
|
+
result = await validateOpenRouter(key);
|
|
52
|
+
break;
|
|
53
|
+
case "ollama":
|
|
54
|
+
// Ollama has no key — "validation" means probing the local
|
|
55
|
+
// daemon. The key arg is ignored.
|
|
56
|
+
result = await validateOllama();
|
|
57
|
+
break;
|
|
58
|
+
default: {
|
|
59
|
+
// Exhaustiveness check — TypeScript will error here if a new
|
|
60
|
+
// ProviderId is added without a switch case.
|
|
61
|
+
const _exhaustive = provider;
|
|
62
|
+
throw new Error(`Unknown provider: ${String(_exhaustive)}`);
|
|
63
|
+
}
|
|
50
64
|
}
|
|
51
65
|
result.latencyMs = Date.now() - start;
|
|
52
66
|
return result;
|
|
@@ -162,6 +176,76 @@ async function validateGoogle(key) {
|
|
|
162
176
|
clearTimeout(timer);
|
|
163
177
|
}
|
|
164
178
|
}
|
|
179
|
+
async function validateOpenRouter(key) {
|
|
180
|
+
// OpenRouter is OpenAI-compatible at https://openrouter.ai/api/v1.
|
|
181
|
+
// Same chat-completions shape — point fetch at OR's base URL.
|
|
182
|
+
const model = DEFAULT_MODELS.openrouter;
|
|
183
|
+
const controller = new AbortController();
|
|
184
|
+
const timer = setTimeout(() => controller.abort(), VALIDATION_TIMEOUT_MS);
|
|
185
|
+
try {
|
|
186
|
+
const res = await fetch("https://openrouter.ai/api/v1/chat/completions", {
|
|
187
|
+
method: "POST",
|
|
188
|
+
headers: {
|
|
189
|
+
"content-type": "application/json",
|
|
190
|
+
authorization: `Bearer ${key}`,
|
|
191
|
+
"HTTP-Referer": "https://github.com/roxjayanath/almightygpt",
|
|
192
|
+
"X-Title": "AlmightyGPT validation",
|
|
193
|
+
},
|
|
194
|
+
body: JSON.stringify({
|
|
195
|
+
model,
|
|
196
|
+
messages: [{ role: "user", content: "hi" }],
|
|
197
|
+
max_tokens: 1,
|
|
198
|
+
}),
|
|
199
|
+
signal: controller.signal,
|
|
200
|
+
});
|
|
201
|
+
if (!res.ok) {
|
|
202
|
+
const rawBody = await res.text().catch(() => "");
|
|
203
|
+
return {
|
|
204
|
+
ok: false,
|
|
205
|
+
statusCode: res.status,
|
|
206
|
+
error: normalizeOpenRouterError(res.status, rawBody, key),
|
|
207
|
+
rawBody,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
const data = (await res.json());
|
|
211
|
+
return { ok: true, model: data.model ?? model };
|
|
212
|
+
}
|
|
213
|
+
finally {
|
|
214
|
+
clearTimeout(timer);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
async function validateOllama() {
|
|
218
|
+
// No key. Probe the local daemon at /api/tags — cheap, no model
|
|
219
|
+
// invocation. If the user has Ollama running, this confirms the
|
|
220
|
+
// adapter can reach it. Doesn't confirm the default model is
|
|
221
|
+
// pulled — that surfaces on the first real call.
|
|
222
|
+
const baseUrl = process.env["OLLAMA_BASE_URL"] ?? "http://localhost:11434";
|
|
223
|
+
const probeUrl = baseUrl.replace(/\/v1\/?$/, "") + "/api/tags";
|
|
224
|
+
const controller = new AbortController();
|
|
225
|
+
const timer = setTimeout(() => controller.abort(), 3000);
|
|
226
|
+
try {
|
|
227
|
+
const res = await fetch(probeUrl, { signal: controller.signal });
|
|
228
|
+
if (!res.ok) {
|
|
229
|
+
return {
|
|
230
|
+
ok: false,
|
|
231
|
+
statusCode: res.status,
|
|
232
|
+
error: `[${res.status}] Ollama daemon at ${baseUrl} responded with an error.`,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
return { ok: true, model: DEFAULT_MODELS.ollama };
|
|
236
|
+
}
|
|
237
|
+
catch (err) {
|
|
238
|
+
return {
|
|
239
|
+
ok: false,
|
|
240
|
+
error: `Ollama daemon unreachable at ${baseUrl}. Is Ollama installed ` +
|
|
241
|
+
`and running? Try \`ollama serve\` or open the Ollama app.`,
|
|
242
|
+
rawBody: err instanceof Error ? err.message : String(err),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
finally {
|
|
246
|
+
clearTimeout(timer);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
165
249
|
// ─── Error normalization (Codex v0.8 P2 #6) ──────────────────────────
|
|
166
250
|
//
|
|
167
251
|
// Parse known provider JSON error shapes into short, user-safe messages.
|
|
@@ -217,6 +301,23 @@ function redactKey(msg, key) {
|
|
|
217
301
|
return msg;
|
|
218
302
|
return msg.split(key).join("<redacted-key>");
|
|
219
303
|
}
|
|
304
|
+
function normalizeOpenRouterError(status, rawBody, submittedKey) {
|
|
305
|
+
// OpenRouter forwards provider errors but wraps them; shape is
|
|
306
|
+
// typically { "error": { "message": "...", "code": N } }.
|
|
307
|
+
try {
|
|
308
|
+
const parsed = JSON.parse(rawBody);
|
|
309
|
+
let msg = parsed.error?.message ?? "";
|
|
310
|
+
if (submittedKey && msg.includes(submittedKey)) {
|
|
311
|
+
msg = msg.replace(submittedKey, "<redacted-key>");
|
|
312
|
+
}
|
|
313
|
+
if (msg)
|
|
314
|
+
return `[${status}] OpenRouter: ${truncate(msg, 200)}`;
|
|
315
|
+
}
|
|
316
|
+
catch {
|
|
317
|
+
/* fall through */
|
|
318
|
+
}
|
|
319
|
+
return statusOnlyMessage("OpenRouter", status);
|
|
320
|
+
}
|
|
220
321
|
function statusOnlyMessage(provider, status) {
|
|
221
322
|
if (status === 401 || status === 403) {
|
|
222
323
|
return `[${status}] ${provider} rejected the key (unauthorized).`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/auth/validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAoBzD,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAErC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAoB,EACpB,GAAW;IAEX,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,IAAI,MAAwB,CAAC;QAC7B,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,QAAQ;gBACX,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,WAAW;gBACd,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;gBACtC,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;gBACnC,MAAM;
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/auth/validator.ts"],"names":[],"mappings":"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"}
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -9,19 +9,19 @@ import { z } from "zod";
|
|
|
9
9
|
export declare const AgentRoleSchema: z.ZodEnum<["worker", "reviewer", "both", "optional"]>;
|
|
10
10
|
export declare const AgentConfigSchema: z.ZodObject<{
|
|
11
11
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
12
|
-
provider: z.ZodEnum<["openai", "anthropic", "google", "mock"]>;
|
|
12
|
+
provider: z.ZodEnum<["openai", "anthropic", "google", "openrouter", "ollama", "mock"]>;
|
|
13
13
|
mode: z.ZodDefault<z.ZodEnum<["api", "cli"]>>;
|
|
14
14
|
role: z.ZodDefault<z.ZodEnum<["worker", "reviewer", "both", "optional"]>>;
|
|
15
15
|
memoryFile: z.ZodString;
|
|
16
16
|
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
17
17
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
18
|
-
provider: z.ZodEnum<["openai", "anthropic", "google", "mock"]>;
|
|
18
|
+
provider: z.ZodEnum<["openai", "anthropic", "google", "openrouter", "ollama", "mock"]>;
|
|
19
19
|
mode: z.ZodDefault<z.ZodEnum<["api", "cli"]>>;
|
|
20
20
|
role: z.ZodDefault<z.ZodEnum<["worker", "reviewer", "both", "optional"]>>;
|
|
21
21
|
memoryFile: z.ZodString;
|
|
22
22
|
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
23
23
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
24
|
-
provider: z.ZodEnum<["openai", "anthropic", "google", "mock"]>;
|
|
24
|
+
provider: z.ZodEnum<["openai", "anthropic", "google", "openrouter", "ollama", "mock"]>;
|
|
25
25
|
mode: z.ZodDefault<z.ZodEnum<["api", "cli"]>>;
|
|
26
26
|
role: z.ZodDefault<z.ZodEnum<["worker", "reviewer", "both", "optional"]>>;
|
|
27
27
|
memoryFile: z.ZodString;
|
|
@@ -40,19 +40,19 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
40
40
|
runsDir: z.ZodDefault<z.ZodString>;
|
|
41
41
|
agents: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
42
42
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
43
|
-
provider: z.ZodEnum<["openai", "anthropic", "google", "mock"]>;
|
|
43
|
+
provider: z.ZodEnum<["openai", "anthropic", "google", "openrouter", "ollama", "mock"]>;
|
|
44
44
|
mode: z.ZodDefault<z.ZodEnum<["api", "cli"]>>;
|
|
45
45
|
role: z.ZodDefault<z.ZodEnum<["worker", "reviewer", "both", "optional"]>>;
|
|
46
46
|
memoryFile: z.ZodString;
|
|
47
47
|
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
48
48
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
49
|
-
provider: z.ZodEnum<["openai", "anthropic", "google", "mock"]>;
|
|
49
|
+
provider: z.ZodEnum<["openai", "anthropic", "google", "openrouter", "ollama", "mock"]>;
|
|
50
50
|
mode: z.ZodDefault<z.ZodEnum<["api", "cli"]>>;
|
|
51
51
|
role: z.ZodDefault<z.ZodEnum<["worker", "reviewer", "both", "optional"]>>;
|
|
52
52
|
memoryFile: z.ZodString;
|
|
53
53
|
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
54
54
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
55
|
-
provider: z.ZodEnum<["openai", "anthropic", "google", "mock"]>;
|
|
55
|
+
provider: z.ZodEnum<["openai", "anthropic", "google", "openrouter", "ollama", "mock"]>;
|
|
56
56
|
mode: z.ZodDefault<z.ZodEnum<["api", "cli"]>>;
|
|
57
57
|
role: z.ZodDefault<z.ZodEnum<["worker", "reviewer", "both", "optional"]>>;
|
|
58
58
|
memoryFile: z.ZodString;
|
|
@@ -132,19 +132,19 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
132
132
|
runsDir: z.ZodDefault<z.ZodString>;
|
|
133
133
|
agents: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
134
134
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
135
|
-
provider: z.ZodEnum<["openai", "anthropic", "google", "mock"]>;
|
|
135
|
+
provider: z.ZodEnum<["openai", "anthropic", "google", "openrouter", "ollama", "mock"]>;
|
|
136
136
|
mode: z.ZodDefault<z.ZodEnum<["api", "cli"]>>;
|
|
137
137
|
role: z.ZodDefault<z.ZodEnum<["worker", "reviewer", "both", "optional"]>>;
|
|
138
138
|
memoryFile: z.ZodString;
|
|
139
139
|
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
140
140
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
141
|
-
provider: z.ZodEnum<["openai", "anthropic", "google", "mock"]>;
|
|
141
|
+
provider: z.ZodEnum<["openai", "anthropic", "google", "openrouter", "ollama", "mock"]>;
|
|
142
142
|
mode: z.ZodDefault<z.ZodEnum<["api", "cli"]>>;
|
|
143
143
|
role: z.ZodDefault<z.ZodEnum<["worker", "reviewer", "both", "optional"]>>;
|
|
144
144
|
memoryFile: z.ZodString;
|
|
145
145
|
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
146
146
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
147
|
-
provider: z.ZodEnum<["openai", "anthropic", "google", "mock"]>;
|
|
147
|
+
provider: z.ZodEnum<["openai", "anthropic", "google", "openrouter", "ollama", "mock"]>;
|
|
148
148
|
mode: z.ZodDefault<z.ZodEnum<["api", "cli"]>>;
|
|
149
149
|
role: z.ZodDefault<z.ZodEnum<["worker", "reviewer", "both", "optional"]>>;
|
|
150
150
|
memoryFile: z.ZodString;
|
|
@@ -224,19 +224,19 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
224
224
|
runsDir: z.ZodDefault<z.ZodString>;
|
|
225
225
|
agents: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
226
226
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
227
|
-
provider: z.ZodEnum<["openai", "anthropic", "google", "mock"]>;
|
|
227
|
+
provider: z.ZodEnum<["openai", "anthropic", "google", "openrouter", "ollama", "mock"]>;
|
|
228
228
|
mode: z.ZodDefault<z.ZodEnum<["api", "cli"]>>;
|
|
229
229
|
role: z.ZodDefault<z.ZodEnum<["worker", "reviewer", "both", "optional"]>>;
|
|
230
230
|
memoryFile: z.ZodString;
|
|
231
231
|
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
232
232
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
233
|
-
provider: z.ZodEnum<["openai", "anthropic", "google", "mock"]>;
|
|
233
|
+
provider: z.ZodEnum<["openai", "anthropic", "google", "openrouter", "ollama", "mock"]>;
|
|
234
234
|
mode: z.ZodDefault<z.ZodEnum<["api", "cli"]>>;
|
|
235
235
|
role: z.ZodDefault<z.ZodEnum<["worker", "reviewer", "both", "optional"]>>;
|
|
236
236
|
memoryFile: z.ZodString;
|
|
237
237
|
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
238
238
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
239
|
-
provider: z.ZodEnum<["openai", "anthropic", "google", "mock"]>;
|
|
239
|
+
provider: z.ZodEnum<["openai", "anthropic", "google", "openrouter", "ollama", "mock"]>;
|
|
240
240
|
mode: z.ZodDefault<z.ZodEnum<["api", "cli"]>>;
|
|
241
241
|
role: z.ZodDefault<z.ZodEnum<["worker", "reviewer", "both", "optional"]>>;
|
|
242
242
|
memoryFile: z.ZodString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe,uDAAqD,CAAC;AAElF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe,uDAAqD,CAAC;AAElF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;gCAed,CAAC;AAEjB,eAAO,MAAM,YAAY;;;IAIrB;;;;;;OAMG;;;;;;;;;;;;;;;;;;;;;;;;;QAQC;;;;WAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAlBP;;;;;;OAMG;;;;;;;;;;;;;;;;;;;;;;;;;QAQC;;;;WAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAlBP;;;;;;OAMG;;;;;;;;;;;;;;;;;;;;;;;;;QAQC;;;;WAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCA8BK,CAAC;AAEjB,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
|
package/dist/config/schema.js
CHANGED
|
@@ -10,7 +10,14 @@ export const AgentRoleSchema = z.enum(["worker", "reviewer", "both", "optional"]
|
|
|
10
10
|
export const AgentConfigSchema = z
|
|
11
11
|
.object({
|
|
12
12
|
enabled: z.boolean().default(true),
|
|
13
|
-
provider: z.enum([
|
|
13
|
+
provider: z.enum([
|
|
14
|
+
"openai",
|
|
15
|
+
"anthropic",
|
|
16
|
+
"google",
|
|
17
|
+
"openrouter",
|
|
18
|
+
"ollama",
|
|
19
|
+
"mock",
|
|
20
|
+
]),
|
|
14
21
|
mode: z.enum(["api", "cli"]).default("api"),
|
|
15
22
|
role: AgentRoleSchema.default("optional"),
|
|
16
23
|
memoryFile: z.string().min(1),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AAElF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAC/B,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* - review/ ✅ task #11 diff review pipeline (with #12/#13/#14 wiring)
|
|
13
13
|
* - budget/ ✅ task #14 BudgetTracker + BudgetExceededError
|
|
14
14
|
*/
|
|
15
|
-
export declare const VERSION = "0.
|
|
15
|
+
export declare const VERSION = "0.11.0";
|
|
16
16
|
export { startMcpServer } from "./mcp/server.js";
|
|
17
17
|
export { checkGitStatus, assertSafeToWrite, GitStatusDirtyError, type GitStatusCheck, } from "./git/status.js";
|
|
18
18
|
export { installTemplate, hasExistingConfig, type InstallOptions, type InstallResult, } from "./templates/install.js";
|
package/dist/index.js
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* - review/ ✅ task #11 diff review pipeline (with #12/#13/#14 wiring)
|
|
13
13
|
* - budget/ ✅ task #14 BudgetTracker + BudgetExceededError
|
|
14
14
|
*/
|
|
15
|
-
export const VERSION = "0.
|
|
15
|
+
export const VERSION = "0.11.0";
|
|
16
16
|
// MCP server (v0.9.0+) — exposes AlmightyGPT's review surface as MCP tools.
|
|
17
17
|
export { startMcpServer } from "./mcp/server.js";
|
|
18
18
|
// Git safety primitives
|
package/package.json
CHANGED
package/src/adapters/defaults.ts
CHANGED
|
@@ -31,6 +31,9 @@ export const DEFAULT_MODELS: Record<ProviderId, string> = {
|
|
|
31
31
|
openai: "gpt-4o",
|
|
32
32
|
anthropic: "claude-sonnet-4-6",
|
|
33
33
|
google: "gemini-2.5-flash",
|
|
34
|
+
// v0.12.0+ — meta-providers
|
|
35
|
+
openrouter: "deepseek/deepseek-chat",
|
|
36
|
+
ollama: "llama3.3:70b",
|
|
34
37
|
};
|
|
35
38
|
|
|
36
39
|
/**
|
|
@@ -41,4 +44,6 @@ export const PROVIDER_PRETTY_NAME: Record<ProviderId, string> = {
|
|
|
41
44
|
openai: "OpenAI",
|
|
42
45
|
anthropic: "Anthropic",
|
|
43
46
|
google: "Google",
|
|
47
|
+
openrouter: "OpenRouter",
|
|
48
|
+
ollama: "Ollama (local)",
|
|
44
49
|
};
|
package/src/adapters/factory.ts
CHANGED
|
@@ -12,6 +12,8 @@ import { MockAdapter } from "./mock.js";
|
|
|
12
12
|
import { OpenAIAdapter } from "./openai.js";
|
|
13
13
|
import { ClaudeAdapter } from "./claude.js";
|
|
14
14
|
import { GeminiAdapter } from "./gemini.js";
|
|
15
|
+
import { OpenRouterAdapter } from "./openrouter.js";
|
|
16
|
+
import { OllamaAdapter } from "./ollama.js";
|
|
15
17
|
|
|
16
18
|
export function makeAdapter(name: string, provider: string): Adapter {
|
|
17
19
|
switch (provider) {
|
|
@@ -21,12 +23,16 @@ export function makeAdapter(name: string, provider: string): Adapter {
|
|
|
21
23
|
return new ClaudeAdapter(name);
|
|
22
24
|
case "google":
|
|
23
25
|
return new GeminiAdapter(name);
|
|
26
|
+
case "openrouter":
|
|
27
|
+
return new OpenRouterAdapter(name);
|
|
28
|
+
case "ollama":
|
|
29
|
+
return new OllamaAdapter(name);
|
|
24
30
|
case "mock":
|
|
25
31
|
return new MockAdapter();
|
|
26
32
|
default:
|
|
27
33
|
throw new Error(
|
|
28
34
|
`Provider "${provider}" not supported. ` +
|
|
29
|
-
`Use "openai", "anthropic", "google", or "mock".`,
|
|
35
|
+
`Use "openai", "anthropic", "google", "openrouter", "ollama", or "mock".`,
|
|
30
36
|
);
|
|
31
37
|
}
|
|
32
38
|
}
|
|
@@ -39,6 +45,10 @@ export function envHintForProvider(provider: string): string {
|
|
|
39
45
|
return "Export ANTHROPIC_API_KEY in your environment.";
|
|
40
46
|
case "google":
|
|
41
47
|
return "Export GOOGLE_API_KEY (or GEMINI_API_KEY) in your environment.";
|
|
48
|
+
case "openrouter":
|
|
49
|
+
return "Export OPENROUTER_API_KEY in your environment.";
|
|
50
|
+
case "ollama":
|
|
51
|
+
return "Install Ollama (https://ollama.ai) and run `ollama serve` locally.";
|
|
42
52
|
default:
|
|
43
53
|
return "";
|
|
44
54
|
}
|
package/src/adapters/index.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Adapter exports.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
8
|
-
*
|
|
4
|
+
* Currently shipped adapters:
|
|
5
|
+
* - OpenAI (gpt-4o family)
|
|
6
|
+
* - Anthropic (Claude Sonnet 4.x family)
|
|
7
|
+
* - Google (Gemini 2.5 family)
|
|
8
|
+
* - OpenRouter — v0.12.0+, meta-provider unlocking 100+ models
|
|
9
|
+
* - Ollama — v0.12.0+, local models, no cloud calls
|
|
10
|
+
* - Mock — for testing without API keys
|
|
9
11
|
*/
|
|
10
12
|
|
|
11
13
|
export type {
|
|
@@ -19,3 +21,5 @@ export { MockAdapter } from "./mock.js";
|
|
|
19
21
|
export { OpenAIAdapter, type OpenAIAdapterOptions } from "./openai.js";
|
|
20
22
|
export { ClaudeAdapter, type ClaudeAdapterOptions } from "./claude.js";
|
|
21
23
|
export { GeminiAdapter, type GeminiAdapterOptions } from "./gemini.js";
|
|
24
|
+
export { OpenRouterAdapter, type OpenRouterAdapterOptions } from "./openrouter.js";
|
|
25
|
+
export { OllamaAdapter, type OllamaAdapterOptions } from "./ollama.js";
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ollama adapter (v0.12.0+).
|
|
3
|
+
*
|
|
4
|
+
* Ollama runs LLMs locally — no cloud calls, no API key, code never
|
|
5
|
+
* leaves the machine. Opens AlmightyGPT to regulated / government /
|
|
6
|
+
* air-gapped enterprise users who can't use cloud AI but want the
|
|
7
|
+
* Worker/Reviewer convention.
|
|
8
|
+
*
|
|
9
|
+
* Ollama exposes an OpenAI-compatible API at http://localhost:11434/v1,
|
|
10
|
+
* so this adapter is a thin wrapper around the OpenAI SDK with a
|
|
11
|
+
* custom baseURL.
|
|
12
|
+
*
|
|
13
|
+
* Requires the user to have Ollama installed + running locally. See
|
|
14
|
+
* https://ollama.ai. The adapter does NOT install Ollama or pull
|
|
15
|
+
* models — that's the user's setup step.
|
|
16
|
+
*
|
|
17
|
+
* Default model: llama3.3:70b (large, very capable for code review).
|
|
18
|
+
* Users with smaller machines should override via config:
|
|
19
|
+
* - llama3.2:3b (3B parameter, runs on most laptops)
|
|
20
|
+
* - qwen2.5-coder:7b (7B, code-tuned, decent for review)
|
|
21
|
+
* - qwen2.5-coder:32b (32B, much stronger for code, needs ~24GB RAM)
|
|
22
|
+
* - deepseek-r1:14b (14B, reasoning-tuned)
|
|
23
|
+
*
|
|
24
|
+
* No auth, no API key, no pricing — local model.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import OpenAI from "openai";
|
|
28
|
+
import { AdapterError, type Adapter, type AdapterInput, type AdapterOutput } from "./types.js";
|
|
29
|
+
import { DEFAULT_MODELS } from "./defaults.js";
|
|
30
|
+
|
|
31
|
+
const DEFAULT_BASE_URL = "http://localhost:11434/v1";
|
|
32
|
+
const DEFAULT_MODEL = DEFAULT_MODELS.ollama;
|
|
33
|
+
|
|
34
|
+
export interface OllamaAdapterOptions {
|
|
35
|
+
/** Override the local Ollama base URL. Defaults to http://localhost:11434/v1. */
|
|
36
|
+
baseUrl?: string;
|
|
37
|
+
defaultModel?: string;
|
|
38
|
+
defaultMaxOutputTokens?: number;
|
|
39
|
+
defaultTimeoutMs?: number;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export class OllamaAdapter implements Adapter {
|
|
43
|
+
readonly name: string;
|
|
44
|
+
readonly provider = "ollama";
|
|
45
|
+
|
|
46
|
+
private readonly client: OpenAI;
|
|
47
|
+
readonly defaultModel: string;
|
|
48
|
+
private readonly defaultMaxOutputTokens: number;
|
|
49
|
+
private readonly defaultTimeoutMs: number;
|
|
50
|
+
private readonly baseUrl: string;
|
|
51
|
+
|
|
52
|
+
constructor(name = "ollama", options: OllamaAdapterOptions = {}) {
|
|
53
|
+
this.name = name;
|
|
54
|
+
this.defaultModel = options.defaultModel ?? DEFAULT_MODEL;
|
|
55
|
+
// Larger default — local models often run slower than cloud, and
|
|
56
|
+
// shorter responses are rarely the bottleneck.
|
|
57
|
+
this.defaultMaxOutputTokens = options.defaultMaxOutputTokens ?? 8192;
|
|
58
|
+
// Longer default — large local models can take 30-90s on CPU/GPU.
|
|
59
|
+
this.defaultTimeoutMs = options.defaultTimeoutMs ?? 300_000;
|
|
60
|
+
this.baseUrl =
|
|
61
|
+
options.baseUrl ?? process.env["OLLAMA_BASE_URL"] ?? DEFAULT_BASE_URL;
|
|
62
|
+
|
|
63
|
+
// OpenAI SDK requires SOMETHING for apiKey even when the server
|
|
64
|
+
// doesn't validate it. "ollama" is the documented sentinel.
|
|
65
|
+
this.client = new OpenAI({
|
|
66
|
+
apiKey: "ollama",
|
|
67
|
+
baseURL: this.baseUrl,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Ollama is "available" if the local daemon responds. */
|
|
72
|
+
async isAvailable(): Promise<boolean> {
|
|
73
|
+
try {
|
|
74
|
+
// Cheap probe — Ollama's /api/tags lists local models. If the
|
|
75
|
+
// daemon isn't running, this throws / times out fast.
|
|
76
|
+
const probeUrl = this.baseUrl.replace(/\/v1\/?$/, "") + "/api/tags";
|
|
77
|
+
const controller = new AbortController();
|
|
78
|
+
const timer = setTimeout(() => controller.abort(), 2000);
|
|
79
|
+
try {
|
|
80
|
+
const res = await fetch(probeUrl, { signal: controller.signal });
|
|
81
|
+
return res.ok;
|
|
82
|
+
} finally {
|
|
83
|
+
clearTimeout(timer);
|
|
84
|
+
}
|
|
85
|
+
} catch {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async execute(input: AdapterInput): Promise<AdapterOutput> {
|
|
91
|
+
const model = input.model ?? this.defaultModel;
|
|
92
|
+
const maxOutputTokens = input.maxOutputTokens ?? this.defaultMaxOutputTokens;
|
|
93
|
+
const timeoutMs = input.timeoutMs ?? this.defaultTimeoutMs;
|
|
94
|
+
|
|
95
|
+
const start = Date.now();
|
|
96
|
+
let response: OpenAI.Chat.Completions.ChatCompletion;
|
|
97
|
+
try {
|
|
98
|
+
response = await this.client.chat.completions.create(
|
|
99
|
+
{
|
|
100
|
+
model,
|
|
101
|
+
max_tokens: maxOutputTokens,
|
|
102
|
+
messages: [
|
|
103
|
+
{ role: "system", content: input.systemPrompt },
|
|
104
|
+
{ role: "user", content: input.userMessage },
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
{ timeout: timeoutMs },
|
|
108
|
+
);
|
|
109
|
+
} catch (err) {
|
|
110
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
111
|
+
// Common failure: Ollama daemon isn't running.
|
|
112
|
+
if (message.includes("ECONNREFUSED") || message.includes("fetch failed")) {
|
|
113
|
+
throw new AdapterError(
|
|
114
|
+
`Ollama daemon unreachable at ${this.baseUrl}. ` +
|
|
115
|
+
"Is Ollama installed and running? Try `ollama serve` or " +
|
|
116
|
+
"open the Ollama app.",
|
|
117
|
+
this.name,
|
|
118
|
+
err,
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
// Common failure: model not pulled locally.
|
|
122
|
+
if (message.includes("model") && message.includes("not found")) {
|
|
123
|
+
throw new AdapterError(
|
|
124
|
+
`Ollama model "${model}" not found locally. Pull it first: ` +
|
|
125
|
+
`\`ollama pull ${model}\``,
|
|
126
|
+
this.name,
|
|
127
|
+
err,
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
throw new AdapterError(
|
|
131
|
+
`Ollama call failed: ${message}`,
|
|
132
|
+
this.name,
|
|
133
|
+
err,
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const choice = response.choices[0];
|
|
138
|
+
if (!choice || !choice.message.content) {
|
|
139
|
+
throw new AdapterError(
|
|
140
|
+
"Ollama returned an empty response.",
|
|
141
|
+
this.name,
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return {
|
|
146
|
+
content: choice.message.content,
|
|
147
|
+
tokensIn: response.usage?.prompt_tokens ?? 0,
|
|
148
|
+
cachedTokensIn: 0,
|
|
149
|
+
tokensOut: response.usage?.completion_tokens ?? 0,
|
|
150
|
+
// Local models are $0. Always.
|
|
151
|
+
costUsd: 0,
|
|
152
|
+
latencyMs: Date.now() - start,
|
|
153
|
+
modelUsed: response.model ?? model,
|
|
154
|
+
provider: this.provider,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|