@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/adapters/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/adapters/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAOrD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAM3D,CAAC"}
|
|
@@ -28,6 +28,9 @@ export const DEFAULT_MODELS = {
|
|
|
28
28
|
openai: "gpt-4o",
|
|
29
29
|
anthropic: "claude-sonnet-4-6",
|
|
30
30
|
google: "gemini-2.5-flash",
|
|
31
|
+
// v0.12.0+ — meta-providers
|
|
32
|
+
openrouter: "deepseek/deepseek-chat",
|
|
33
|
+
ollama: "llama3.3:70b",
|
|
31
34
|
};
|
|
32
35
|
/**
|
|
33
36
|
* Pretty name for each provider — used in CLI prompts, error
|
|
@@ -37,5 +40,7 @@ export const PROVIDER_PRETTY_NAME = {
|
|
|
37
40
|
openai: "OpenAI",
|
|
38
41
|
anthropic: "Anthropic",
|
|
39
42
|
google: "Google",
|
|
43
|
+
openrouter: "OpenRouter",
|
|
44
|
+
ollama: "Ollama (local)",
|
|
40
45
|
};
|
|
41
46
|
//# sourceMappingURL=defaults.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/adapters/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAA+B;IACxD,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,kBAAkB;
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/adapters/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAA+B;IACxD,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,kBAAkB;IAC1B,4BAA4B;IAC5B,UAAU,EAAE,wBAAwB;IACpC,MAAM,EAAE,cAAc;CACvB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA+B;IAC9D,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,YAAY;IACxB,MAAM,EAAE,gBAAgB;CACzB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/adapters/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/adapters/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAQ1C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAoBnE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAe3D"}
|
package/dist/adapters/factory.js
CHANGED
|
@@ -10,6 +10,8 @@ import { MockAdapter } from "./mock.js";
|
|
|
10
10
|
import { OpenAIAdapter } from "./openai.js";
|
|
11
11
|
import { ClaudeAdapter } from "./claude.js";
|
|
12
12
|
import { GeminiAdapter } from "./gemini.js";
|
|
13
|
+
import { OpenRouterAdapter } from "./openrouter.js";
|
|
14
|
+
import { OllamaAdapter } from "./ollama.js";
|
|
13
15
|
export function makeAdapter(name, provider) {
|
|
14
16
|
switch (provider) {
|
|
15
17
|
case "openai":
|
|
@@ -18,11 +20,15 @@ export function makeAdapter(name, provider) {
|
|
|
18
20
|
return new ClaudeAdapter(name);
|
|
19
21
|
case "google":
|
|
20
22
|
return new GeminiAdapter(name);
|
|
23
|
+
case "openrouter":
|
|
24
|
+
return new OpenRouterAdapter(name);
|
|
25
|
+
case "ollama":
|
|
26
|
+
return new OllamaAdapter(name);
|
|
21
27
|
case "mock":
|
|
22
28
|
return new MockAdapter();
|
|
23
29
|
default:
|
|
24
30
|
throw new Error(`Provider "${provider}" not supported. ` +
|
|
25
|
-
`Use "openai", "anthropic", "google", or "mock".`);
|
|
31
|
+
`Use "openai", "anthropic", "google", "openrouter", "ollama", or "mock".`);
|
|
26
32
|
}
|
|
27
33
|
}
|
|
28
34
|
export function envHintForProvider(provider) {
|
|
@@ -33,6 +39,10 @@ export function envHintForProvider(provider) {
|
|
|
33
39
|
return "Export ANTHROPIC_API_KEY in your environment.";
|
|
34
40
|
case "google":
|
|
35
41
|
return "Export GOOGLE_API_KEY (or GEMINI_API_KEY) in your environment.";
|
|
42
|
+
case "openrouter":
|
|
43
|
+
return "Export OPENROUTER_API_KEY in your environment.";
|
|
44
|
+
case "ollama":
|
|
45
|
+
return "Install Ollama (https://ollama.ai) and run `ollama serve` locally.";
|
|
36
46
|
default:
|
|
37
47
|
return "";
|
|
38
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/adapters/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,QAAgB;IACxD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;QACjC,KAAK,WAAW;YACd,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;QACjC,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;QACjC,KAAK,MAAM;YACT,OAAO,IAAI,WAAW,EAAE,CAAC;QAC3B;YACE,MAAM,IAAI,KAAK,CACb,aAAa,QAAQ,mBAAmB;gBACtC,
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/adapters/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,QAAgB;IACxD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;QACjC,KAAK,WAAW;YACd,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;QACjC,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;QACjC,KAAK,YAAY;YACf,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;QACjC,KAAK,MAAM;YACT,OAAO,IAAI,WAAW,EAAE,CAAC;QAC3B;YACE,MAAM,IAAI,KAAK,CACb,aAAa,QAAQ,mBAAmB;gBACtC,yEAAyE,CAC5E,CAAC;IACN,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,4CAA4C,CAAC;QACtD,KAAK,WAAW;YACd,OAAO,+CAA+C,CAAC;QACzD,KAAK,QAAQ;YACX,OAAO,gEAAgE,CAAC;QAC1E,KAAK,YAAY;YACf,OAAO,gDAAgD,CAAC;QAC1D,KAAK,QAAQ;YACX,OAAO,oEAAoE,CAAC;QAC9E;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/adapters/index.d.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
|
export type { Adapter, AdapterInput, AdapterOutput, AgentRole, } from "./types.js";
|
|
11
13
|
export { AdapterError } from "./types.js";
|
|
@@ -13,4 +15,6 @@ export { MockAdapter } from "./mock.js";
|
|
|
13
15
|
export { OpenAIAdapter, type OpenAIAdapterOptions } from "./openai.js";
|
|
14
16
|
export { ClaudeAdapter, type ClaudeAdapterOptions } from "./claude.js";
|
|
15
17
|
export { GeminiAdapter, type GeminiAdapterOptions } from "./gemini.js";
|
|
18
|
+
export { OpenRouterAdapter, type OpenRouterAdapterOptions } from "./openrouter.js";
|
|
19
|
+
export { OllamaAdapter, type OllamaAdapterOptions } from "./ollama.js";
|
|
16
20
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,YAAY,EACV,OAAO,EACP,YAAY,EACZ,aAAa,EACb,SAAS,GACV,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,KAAK,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/adapters/index.js
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
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
|
export { AdapterError } from "./types.js";
|
|
11
13
|
export { MockAdapter } from "./mock.js";
|
|
12
14
|
export { OpenAIAdapter } from "./openai.js";
|
|
13
15
|
export { ClaudeAdapter } from "./claude.js";
|
|
14
16
|
export { GeminiAdapter } from "./gemini.js";
|
|
17
|
+
export { OpenRouterAdapter } from "./openrouter.js";
|
|
18
|
+
export { OllamaAdapter } from "./ollama.js";
|
|
15
19
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAA6B,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,aAAa,EAA6B,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,aAAa,EAA6B,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAiC,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAE,aAAa,EAA6B,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
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
|
+
import { type Adapter, type AdapterInput, type AdapterOutput } from "./types.js";
|
|
27
|
+
export interface OllamaAdapterOptions {
|
|
28
|
+
/** Override the local Ollama base URL. Defaults to http://localhost:11434/v1. */
|
|
29
|
+
baseUrl?: string;
|
|
30
|
+
defaultModel?: string;
|
|
31
|
+
defaultMaxOutputTokens?: number;
|
|
32
|
+
defaultTimeoutMs?: number;
|
|
33
|
+
}
|
|
34
|
+
export declare class OllamaAdapter implements Adapter {
|
|
35
|
+
readonly name: string;
|
|
36
|
+
readonly provider = "ollama";
|
|
37
|
+
private readonly client;
|
|
38
|
+
readonly defaultModel: string;
|
|
39
|
+
private readonly defaultMaxOutputTokens;
|
|
40
|
+
private readonly defaultTimeoutMs;
|
|
41
|
+
private readonly baseUrl;
|
|
42
|
+
constructor(name?: string, options?: OllamaAdapterOptions);
|
|
43
|
+
/** Ollama is "available" if the local daemon responds. */
|
|
44
|
+
isAvailable(): Promise<boolean>;
|
|
45
|
+
execute(input: AdapterInput): Promise<AdapterOutput>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=ollama.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/adapters/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EAAgB,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAM/F,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,aAAc,YAAW,OAAO;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;IAChD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,IAAI,SAAW,EAAE,OAAO,GAAE,oBAAyB;IAmB/D,0DAA0D;IACpD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAkB/B,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;CAmE3D"}
|
|
@@ -0,0 +1,124 @@
|
|
|
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
|
+
import OpenAI from "openai";
|
|
27
|
+
import { AdapterError } from "./types.js";
|
|
28
|
+
import { DEFAULT_MODELS } from "./defaults.js";
|
|
29
|
+
const DEFAULT_BASE_URL = "http://localhost:11434/v1";
|
|
30
|
+
const DEFAULT_MODEL = DEFAULT_MODELS.ollama;
|
|
31
|
+
export class OllamaAdapter {
|
|
32
|
+
name;
|
|
33
|
+
provider = "ollama";
|
|
34
|
+
client;
|
|
35
|
+
defaultModel;
|
|
36
|
+
defaultMaxOutputTokens;
|
|
37
|
+
defaultTimeoutMs;
|
|
38
|
+
baseUrl;
|
|
39
|
+
constructor(name = "ollama", options = {}) {
|
|
40
|
+
this.name = name;
|
|
41
|
+
this.defaultModel = options.defaultModel ?? DEFAULT_MODEL;
|
|
42
|
+
// Larger default — local models often run slower than cloud, and
|
|
43
|
+
// shorter responses are rarely the bottleneck.
|
|
44
|
+
this.defaultMaxOutputTokens = options.defaultMaxOutputTokens ?? 8192;
|
|
45
|
+
// Longer default — large local models can take 30-90s on CPU/GPU.
|
|
46
|
+
this.defaultTimeoutMs = options.defaultTimeoutMs ?? 300_000;
|
|
47
|
+
this.baseUrl =
|
|
48
|
+
options.baseUrl ?? process.env["OLLAMA_BASE_URL"] ?? DEFAULT_BASE_URL;
|
|
49
|
+
// OpenAI SDK requires SOMETHING for apiKey even when the server
|
|
50
|
+
// doesn't validate it. "ollama" is the documented sentinel.
|
|
51
|
+
this.client = new OpenAI({
|
|
52
|
+
apiKey: "ollama",
|
|
53
|
+
baseURL: this.baseUrl,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/** Ollama is "available" if the local daemon responds. */
|
|
57
|
+
async isAvailable() {
|
|
58
|
+
try {
|
|
59
|
+
// Cheap probe — Ollama's /api/tags lists local models. If the
|
|
60
|
+
// daemon isn't running, this throws / times out fast.
|
|
61
|
+
const probeUrl = this.baseUrl.replace(/\/v1\/?$/, "") + "/api/tags";
|
|
62
|
+
const controller = new AbortController();
|
|
63
|
+
const timer = setTimeout(() => controller.abort(), 2000);
|
|
64
|
+
try {
|
|
65
|
+
const res = await fetch(probeUrl, { signal: controller.signal });
|
|
66
|
+
return res.ok;
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
clearTimeout(timer);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async execute(input) {
|
|
77
|
+
const model = input.model ?? this.defaultModel;
|
|
78
|
+
const maxOutputTokens = input.maxOutputTokens ?? this.defaultMaxOutputTokens;
|
|
79
|
+
const timeoutMs = input.timeoutMs ?? this.defaultTimeoutMs;
|
|
80
|
+
const start = Date.now();
|
|
81
|
+
let response;
|
|
82
|
+
try {
|
|
83
|
+
response = await this.client.chat.completions.create({
|
|
84
|
+
model,
|
|
85
|
+
max_tokens: maxOutputTokens,
|
|
86
|
+
messages: [
|
|
87
|
+
{ role: "system", content: input.systemPrompt },
|
|
88
|
+
{ role: "user", content: input.userMessage },
|
|
89
|
+
],
|
|
90
|
+
}, { timeout: timeoutMs });
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
94
|
+
// Common failure: Ollama daemon isn't running.
|
|
95
|
+
if (message.includes("ECONNREFUSED") || message.includes("fetch failed")) {
|
|
96
|
+
throw new AdapterError(`Ollama daemon unreachable at ${this.baseUrl}. ` +
|
|
97
|
+
"Is Ollama installed and running? Try `ollama serve` or " +
|
|
98
|
+
"open the Ollama app.", this.name, err);
|
|
99
|
+
}
|
|
100
|
+
// Common failure: model not pulled locally.
|
|
101
|
+
if (message.includes("model") && message.includes("not found")) {
|
|
102
|
+
throw new AdapterError(`Ollama model "${model}" not found locally. Pull it first: ` +
|
|
103
|
+
`\`ollama pull ${model}\``, this.name, err);
|
|
104
|
+
}
|
|
105
|
+
throw new AdapterError(`Ollama call failed: ${message}`, this.name, err);
|
|
106
|
+
}
|
|
107
|
+
const choice = response.choices[0];
|
|
108
|
+
if (!choice || !choice.message.content) {
|
|
109
|
+
throw new AdapterError("Ollama returned an empty response.", this.name);
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
content: choice.message.content,
|
|
113
|
+
tokensIn: response.usage?.prompt_tokens ?? 0,
|
|
114
|
+
cachedTokensIn: 0,
|
|
115
|
+
tokensOut: response.usage?.completion_tokens ?? 0,
|
|
116
|
+
// Local models are $0. Always.
|
|
117
|
+
costUsd: 0,
|
|
118
|
+
latencyMs: Date.now() - start,
|
|
119
|
+
modelUsed: response.model ?? model,
|
|
120
|
+
provider: this.provider,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/adapters/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAuD,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AACrD,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC;AAU5C,MAAM,OAAO,aAAa;IACf,IAAI,CAAS;IACb,QAAQ,GAAG,QAAQ,CAAC;IAEZ,MAAM,CAAS;IACvB,YAAY,CAAS;IACb,sBAAsB,CAAS;IAC/B,gBAAgB,CAAS;IACzB,OAAO,CAAS;IAEjC,YAAY,IAAI,GAAG,QAAQ,EAAE,UAAgC,EAAE;QAC7D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,aAAa,CAAC;QAC1D,iEAAiE;QACjE,+CAA+C;QAC/C,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,IAAI,IAAI,CAAC;QACrE,kEAAkE;QAClE,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC;QAC5D,IAAI,CAAC,OAAO;YACV,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,gBAAgB,CAAC;QAExE,gEAAgE;QAChE,4DAA4D;QAC5D,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;YACvB,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;IACL,CAAC;IAED,0DAA0D;IAC1D,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,8DAA8D;YAC9D,sDAAsD;YACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,WAAW,CAAC;YACpE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;gBACjE,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAmB;QAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC;QAC/C,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC,sBAAsB,CAAC;QAC7E,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC;QAE3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,IAAI,QAAgD,CAAC;QACrD,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAClD;gBACE,KAAK;gBACL,UAAU,EAAE,eAAe;gBAC3B,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,YAAY,EAAE;oBAC/C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE;iBAC7C;aACF,EACD,EAAE,OAAO,EAAE,SAAS,EAAE,CACvB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,+CAA+C;YAC/C,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBACzE,MAAM,IAAI,YAAY,CACpB,gCAAgC,IAAI,CAAC,OAAO,IAAI;oBAC9C,yDAAyD;oBACzD,sBAAsB,EACxB,IAAI,CAAC,IAAI,EACT,GAAG,CACJ,CAAC;YACJ,CAAC;YACD,4CAA4C;YAC5C,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/D,MAAM,IAAI,YAAY,CACpB,iBAAiB,KAAK,sCAAsC;oBAC1D,iBAAiB,KAAK,IAAI,EAC5B,IAAI,CAAC,IAAI,EACT,GAAG,CACJ,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,YAAY,CACpB,uBAAuB,OAAO,EAAE,EAChC,IAAI,CAAC,IAAI,EACT,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvC,MAAM,IAAI,YAAY,CACpB,oCAAoC,EACpC,IAAI,CAAC,IAAI,CACV,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;YAC/B,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC;YAC5C,cAAc,EAAE,CAAC;YACjB,SAAS,EAAE,QAAQ,CAAC,KAAK,EAAE,iBAAiB,IAAI,CAAC;YACjD,+BAA+B;YAC/B,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;YAC7B,SAAS,EAAE,QAAQ,CAAC,KAAK,IAAI,KAAK;YAClC,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenRouter adapter (v0.12.0+).
|
|
3
|
+
*
|
|
4
|
+
* OpenRouter is a meta-provider that fronts 100+ models behind a single
|
|
5
|
+
* OpenAI-compatible API. Adding it unlocks DeepSeek, Mistral, Codestral,
|
|
6
|
+
* Llama (hosted), Grok, Qwen, and many others without us shipping one
|
|
7
|
+
* adapter per provider.
|
|
8
|
+
*
|
|
9
|
+
* Reads OPENROUTER_API_KEY from the environment (resolver: explicit →
|
|
10
|
+
* env → keychain → missing).
|
|
11
|
+
*
|
|
12
|
+
* Default model: deepseek/deepseek-chat — cheap, capable, popular OR
|
|
13
|
+
* pick. Users override via the `model` field in their config's agents
|
|
14
|
+
* map, e.g. `model: "anthropic/claude-haiku-4-5"`.
|
|
15
|
+
*
|
|
16
|
+
* Model naming: `<provider>/<model>` as required by OpenRouter
|
|
17
|
+
* (e.g. `deepseek/deepseek-chat`, `meta-llama/llama-3.3-70b-instruct`).
|
|
18
|
+
*
|
|
19
|
+
* Pricing: passed through from OpenRouter's response. Their `usage`
|
|
20
|
+
* object includes a `cost` field (USD) when available; otherwise we
|
|
21
|
+
* estimate from a small pricing table for popular models.
|
|
22
|
+
*/
|
|
23
|
+
import { type Adapter, type AdapterInput, type AdapterOutput } from "./types.js";
|
|
24
|
+
export interface OpenRouterAdapterOptions {
|
|
25
|
+
apiKey?: string;
|
|
26
|
+
defaultModel?: string;
|
|
27
|
+
defaultMaxOutputTokens?: number;
|
|
28
|
+
defaultTimeoutMs?: number;
|
|
29
|
+
/** Optional HTTP-Referer for OR's stats / leaderboards. */
|
|
30
|
+
appUrl?: string;
|
|
31
|
+
/** Optional X-Title for OR's stats / leaderboards. */
|
|
32
|
+
appTitle?: string;
|
|
33
|
+
}
|
|
34
|
+
export declare class OpenRouterAdapter implements Adapter {
|
|
35
|
+
readonly name: string;
|
|
36
|
+
readonly provider = "openrouter";
|
|
37
|
+
private client;
|
|
38
|
+
private resolved;
|
|
39
|
+
private readonly explicitApiKey;
|
|
40
|
+
private readonly appUrl;
|
|
41
|
+
private readonly appTitle;
|
|
42
|
+
readonly defaultModel: string;
|
|
43
|
+
private readonly defaultMaxOutputTokens;
|
|
44
|
+
private readonly defaultTimeoutMs;
|
|
45
|
+
constructor(name?: string, options?: OpenRouterAdapterOptions);
|
|
46
|
+
private ensureClient;
|
|
47
|
+
isAvailable(): Promise<boolean>;
|
|
48
|
+
execute(input: AdapterInput): Promise<AdapterOutput>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=openrouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/adapters/openrouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAgB,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AA2B/F,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,iBAAkB,YAAW,OAAO;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,gBAAgB;IAEjC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;IAChD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBAE9B,IAAI,SAAe,EAAE,OAAO,GAAE,wBAA6B;YAUzD,YAAY;IAiBpB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;CAyE3D"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenRouter adapter (v0.12.0+).
|
|
3
|
+
*
|
|
4
|
+
* OpenRouter is a meta-provider that fronts 100+ models behind a single
|
|
5
|
+
* OpenAI-compatible API. Adding it unlocks DeepSeek, Mistral, Codestral,
|
|
6
|
+
* Llama (hosted), Grok, Qwen, and many others without us shipping one
|
|
7
|
+
* adapter per provider.
|
|
8
|
+
*
|
|
9
|
+
* Reads OPENROUTER_API_KEY from the environment (resolver: explicit →
|
|
10
|
+
* env → keychain → missing).
|
|
11
|
+
*
|
|
12
|
+
* Default model: deepseek/deepseek-chat — cheap, capable, popular OR
|
|
13
|
+
* pick. Users override via the `model` field in their config's agents
|
|
14
|
+
* map, e.g. `model: "anthropic/claude-haiku-4-5"`.
|
|
15
|
+
*
|
|
16
|
+
* Model naming: `<provider>/<model>` as required by OpenRouter
|
|
17
|
+
* (e.g. `deepseek/deepseek-chat`, `meta-llama/llama-3.3-70b-instruct`).
|
|
18
|
+
*
|
|
19
|
+
* Pricing: passed through from OpenRouter's response. Their `usage`
|
|
20
|
+
* object includes a `cost` field (USD) when available; otherwise we
|
|
21
|
+
* estimate from a small pricing table for popular models.
|
|
22
|
+
*/
|
|
23
|
+
import OpenAI from "openai";
|
|
24
|
+
import { AdapterError } from "./types.js";
|
|
25
|
+
import { resolveApiKey } from "../auth/resolver.js";
|
|
26
|
+
import { DEFAULT_MODELS } from "./defaults.js";
|
|
27
|
+
const OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1";
|
|
28
|
+
/**
|
|
29
|
+
* Fallback pricing for popular OpenRouter models in case the API doesn't
|
|
30
|
+
* return cost. USD per 1M tokens. Match by prefix (startsWith).
|
|
31
|
+
*
|
|
32
|
+
* Source: https://openrouter.ai/models (verify periodically).
|
|
33
|
+
*/
|
|
34
|
+
const PRICING_USD_PER_1M = {
|
|
35
|
+
"deepseek/deepseek-chat": { input: 0.27, output: 1.1 },
|
|
36
|
+
"deepseek/deepseek-coder": { input: 0.27, output: 1.1 },
|
|
37
|
+
"anthropic/claude-haiku-4-5": { input: 1.0, output: 5.0 },
|
|
38
|
+
"anthropic/claude-sonnet-4-6": { input: 3.0, output: 15.0 },
|
|
39
|
+
"openai/gpt-4o-mini": { input: 0.15, output: 0.6 },
|
|
40
|
+
"openai/gpt-4o": { input: 2.5, output: 10.0 },
|
|
41
|
+
"meta-llama/llama-3.3-70b-instruct": { input: 0.59, output: 0.79 },
|
|
42
|
+
"qwen/qwen-2.5-coder-32b-instruct": { input: 0.07, output: 0.16 },
|
|
43
|
+
"mistralai/codestral-2508": { input: 0.3, output: 0.9 },
|
|
44
|
+
"x-ai/grok-2": { input: 2.0, output: 10.0 },
|
|
45
|
+
};
|
|
46
|
+
const DEFAULT_MODEL = DEFAULT_MODELS.openrouter;
|
|
47
|
+
export class OpenRouterAdapter {
|
|
48
|
+
name;
|
|
49
|
+
provider = "openrouter";
|
|
50
|
+
client = null;
|
|
51
|
+
resolved = false;
|
|
52
|
+
explicitApiKey;
|
|
53
|
+
appUrl;
|
|
54
|
+
appTitle;
|
|
55
|
+
defaultModel;
|
|
56
|
+
defaultMaxOutputTokens;
|
|
57
|
+
defaultTimeoutMs;
|
|
58
|
+
constructor(name = "openrouter", options = {}) {
|
|
59
|
+
this.name = name;
|
|
60
|
+
this.defaultModel = options.defaultModel ?? DEFAULT_MODEL;
|
|
61
|
+
this.defaultMaxOutputTokens = options.defaultMaxOutputTokens ?? 4096;
|
|
62
|
+
this.defaultTimeoutMs = options.defaultTimeoutMs ?? 120_000;
|
|
63
|
+
this.explicitApiKey = options.apiKey;
|
|
64
|
+
this.appUrl = options.appUrl ?? "https://github.com/roxjayanath/almightygpt";
|
|
65
|
+
this.appTitle = options.appTitle ?? "AlmightyGPT";
|
|
66
|
+
}
|
|
67
|
+
async ensureClient() {
|
|
68
|
+
if (this.resolved)
|
|
69
|
+
return this.client;
|
|
70
|
+
this.resolved = true;
|
|
71
|
+
const opts = this.explicitApiKey ? { explicit: this.explicitApiKey } : {};
|
|
72
|
+
const result = await resolveApiKey("openrouter", opts);
|
|
73
|
+
if (result.source === "missing")
|
|
74
|
+
return null;
|
|
75
|
+
this.client = new OpenAI({
|
|
76
|
+
apiKey: result.key,
|
|
77
|
+
baseURL: OPENROUTER_BASE_URL,
|
|
78
|
+
defaultHeaders: {
|
|
79
|
+
...(this.appUrl ? { "HTTP-Referer": this.appUrl } : {}),
|
|
80
|
+
...(this.appTitle ? { "X-Title": this.appTitle } : {}),
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
return this.client;
|
|
84
|
+
}
|
|
85
|
+
async isAvailable() {
|
|
86
|
+
return (await this.ensureClient()) !== null;
|
|
87
|
+
}
|
|
88
|
+
async execute(input) {
|
|
89
|
+
const client = await this.ensureClient();
|
|
90
|
+
if (!client) {
|
|
91
|
+
throw new AdapterError('No OpenRouter API key found. Run "almightygpt auth openrouter" ' +
|
|
92
|
+
"or export OPENROUTER_API_KEY in your environment.", this.name);
|
|
93
|
+
}
|
|
94
|
+
const model = input.model ?? this.defaultModel;
|
|
95
|
+
const maxOutputTokens = input.maxOutputTokens ?? this.defaultMaxOutputTokens;
|
|
96
|
+
const timeoutMs = input.timeoutMs ?? this.defaultTimeoutMs;
|
|
97
|
+
const start = Date.now();
|
|
98
|
+
let response;
|
|
99
|
+
try {
|
|
100
|
+
response = await client.chat.completions.create({
|
|
101
|
+
model,
|
|
102
|
+
max_tokens: maxOutputTokens,
|
|
103
|
+
messages: [
|
|
104
|
+
{ role: "system", content: input.systemPrompt },
|
|
105
|
+
{ role: "user", content: input.userMessage },
|
|
106
|
+
],
|
|
107
|
+
...(input.responseFormat === "json_object"
|
|
108
|
+
? { response_format: { type: "json_object" } }
|
|
109
|
+
: {}),
|
|
110
|
+
}, { timeout: timeoutMs });
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
throw new AdapterError(`OpenRouter call failed: ${err instanceof Error ? err.message : String(err)}`, this.name, err);
|
|
114
|
+
}
|
|
115
|
+
const choice = response.choices[0];
|
|
116
|
+
if (!choice || !choice.message.content) {
|
|
117
|
+
throw new AdapterError("OpenRouter returned an empty response.", this.name);
|
|
118
|
+
}
|
|
119
|
+
const content = choice.message.content;
|
|
120
|
+
const usage = response.usage;
|
|
121
|
+
const tokensIn = usage?.prompt_tokens ?? 0;
|
|
122
|
+
const tokensOut = usage?.completion_tokens ?? 0;
|
|
123
|
+
// Prefer OR's reported cost (real, billed); fall back to estimate.
|
|
124
|
+
const costUsd = typeof usage?.cost === "number"
|
|
125
|
+
? usage.cost
|
|
126
|
+
: estimateCostUsd(model, tokensIn, tokensOut);
|
|
127
|
+
return {
|
|
128
|
+
content,
|
|
129
|
+
tokensIn,
|
|
130
|
+
cachedTokensIn: 0,
|
|
131
|
+
tokensOut,
|
|
132
|
+
costUsd,
|
|
133
|
+
latencyMs: Date.now() - start,
|
|
134
|
+
modelUsed: response.model ?? model,
|
|
135
|
+
provider: this.provider,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function estimateCostUsd(model, tokensIn, tokensOut) {
|
|
140
|
+
const key = Object.keys(PRICING_USD_PER_1M).find((k) => model.toLowerCase().startsWith(k));
|
|
141
|
+
if (!key)
|
|
142
|
+
return 0;
|
|
143
|
+
const rates = PRICING_USD_PER_1M[key];
|
|
144
|
+
if (!rates)
|
|
145
|
+
return 0;
|
|
146
|
+
return (tokensIn / 1_000_000) * rates.input + (tokensOut / 1_000_000) * rates.output;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=openrouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/adapters/openrouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,8 @@ const PROVIDER_ENV_VAR = {
|
|
|
22
22
|
openai: "OPENAI_API_KEY",
|
|
23
23
|
anthropic: "ANTHROPIC_API_KEY",
|
|
24
24
|
google: "GOOGLE_API_KEY",
|
|
25
|
+
openrouter: "OPENROUTER_API_KEY", // added v0.12.0
|
|
26
|
+
// ollama has no env var (local, no auth)
|
|
25
27
|
};
|
|
26
28
|
function makeKeychainStub(behavior) {
|
|
27
29
|
return {
|
|
@@ -130,6 +132,22 @@ describe("resolveApiKey — priority order", () => {
|
|
|
130
132
|
expect(r.envVar).toBe("GOOGLE_API_KEY");
|
|
131
133
|
expect(r.key).toBe("primary");
|
|
132
134
|
});
|
|
135
|
+
it("OpenRouter provider reads OPENROUTER_API_KEY (v0.12.0+)", async () => {
|
|
136
|
+
process.env.OPENROUTER_API_KEY = "from-or";
|
|
137
|
+
vi.mocked(getKeychain).mockResolvedValue(makeKeychainStub({ available: false }));
|
|
138
|
+
const r = await resolveApiKey("openrouter");
|
|
139
|
+
expect(r.source).toBe("env");
|
|
140
|
+
expect(r.key).toBe("from-or");
|
|
141
|
+
expect(r.envVar).toBe("OPENROUTER_API_KEY");
|
|
142
|
+
});
|
|
143
|
+
it("Ollama has no env vars and falls straight to keychain → missing", async () => {
|
|
144
|
+
vi.mocked(getKeychain).mockResolvedValue(makeKeychainStub({ available: true }));
|
|
145
|
+
// Ollama has no API key — PROVIDER_ENV_VARS["ollama"] is empty.
|
|
146
|
+
// The resolver should skip the env loop entirely and check
|
|
147
|
+
// keychain → return "missing" since the keychain stub is empty.
|
|
148
|
+
const r = await resolveApiKey("ollama");
|
|
149
|
+
expect(r.source).toBe("missing");
|
|
150
|
+
});
|
|
133
151
|
it("empty env var is treated as not set (falls through to keychain)", async () => {
|
|
134
152
|
process.env.OPENAI_API_KEY = "";
|
|
135
153
|
vi.mocked(getKeychain).mockResolvedValue(makeKeychainStub({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.test.js","sourceRoot":"","sources":["../../../src/auth/__tests__/resolver.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,gEAAgE;AAChE,iDAAiD;AACjD,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/B,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;CACrB,CAAC,CAAC,CAAC;AACJ,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,gBAAgB,GAAG;IACvB,MAAM,EAAE,gBAAgB;IACxB,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"resolver.test.js","sourceRoot":"","sources":["../../../src/auth/__tests__/resolver.test.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/types.d.ts
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* silently override the VS Code extension's freshly-stored key with
|
|
17
17
|
* a stale keychain copy. See docs/claude/v0.8-auth-plan.md.
|
|
18
18
|
*/
|
|
19
|
-
export type ProviderId = "openai" | "anthropic" | "google";
|
|
19
|
+
export type ProviderId = "openai" | "anthropic" | "google" | "openrouter" | "ollama";
|
|
20
20
|
/**
|
|
21
21
|
* Where a resolved API key came from.
|
|
22
22
|
*
|
package/dist/auth/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,MAAM,UAAU,GAClB,QAAQ,GACR,WAAW,GACX,QAAQ,GAER,YAAY,GACZ,QAAQ,CAAC;AAEb;;;;;;;;;GASG;AACH,MAAM,MAAM,SAAS,GACjB,UAAU,GACV,KAAK,GACL,UAAU,GACV,gBAAgB,GAChB,SAAS,CAAC;AAEd,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,UAAU,CAAC;IACrB,MAAM,EAAE,SAAS,CAAC;IAClB,mDAAmD;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACZ,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM;CAWzE;AAED,mEAAmE;AACnE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAUnE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAOxD,CAAC"}
|