ghagga-core 2.9.0 → 3.0.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/LICENSE +21 -0
- package/dist/acp/adapter.d.ts.map +1 -1
- package/dist/acp/adapter.js +1 -1
- package/dist/acp/adapter.js.map +1 -1
- package/dist/acp/index.d.ts +1 -1
- package/dist/acp/index.d.ts.map +1 -1
- package/dist/acp/index.js.map +1 -1
- package/dist/acp/types.d.ts.map +1 -1
- package/dist/agents/consensus.d.ts.map +1 -1
- package/dist/agents/consensus.js +7 -2
- package/dist/agents/consensus.js.map +1 -1
- package/dist/agents/diagnostic.d.ts.map +1 -1
- package/dist/agents/diagnostic.js +7 -2
- package/dist/agents/diagnostic.js.map +1 -1
- package/dist/agents/fan-out-lenses.d.ts.map +1 -1
- package/dist/agents/fan-out-lenses.js +7 -2
- package/dist/agents/fan-out-lenses.js.map +1 -1
- package/dist/agents/prompts.d.ts +49 -1
- package/dist/agents/prompts.d.ts.map +1 -1
- package/dist/agents/prompts.js +133 -5
- package/dist/agents/prompts.js.map +1 -1
- package/dist/agents/simple.d.ts +1 -1
- package/dist/agents/simple.d.ts.map +1 -1
- package/dist/agents/simple.js +6 -4
- package/dist/agents/simple.js.map +1 -1
- package/dist/agents/workflow.d.ts.map +1 -1
- package/dist/agents/workflow.js +13 -4
- package/dist/agents/workflow.js.map +1 -1
- package/dist/critique/critique.d.ts.map +1 -1
- package/dist/critique/critique.js +14 -6
- package/dist/critique/critique.js.map +1 -1
- package/dist/critique/cross-model.d.ts.map +1 -1
- package/dist/critique/cross-model.js +1 -3
- package/dist/critique/cross-model.js.map +1 -1
- package/dist/critique/index.d.ts +1 -2
- package/dist/critique/index.d.ts.map +1 -1
- package/dist/critique/index.js +1 -2
- package/dist/critique/index.js.map +1 -1
- package/dist/diff/index.d.ts +12 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +11 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/diff/parse.d.ts +41 -0
- package/dist/diff/parse.d.ts.map +1 -0
- package/dist/diff/parse.js +303 -0
- package/dist/diff/parse.js.map +1 -0
- package/dist/diff/types.d.ts +106 -0
- package/dist/diff/types.d.ts.map +1 -0
- package/dist/diff/types.js +23 -0
- package/dist/diff/types.js.map +1 -0
- package/dist/embed.d.ts +5 -2
- package/dist/embed.d.ts.map +1 -1
- package/dist/embed.js +7 -3
- package/dist/embed.js.map +1 -1
- package/dist/enhance/prompt.d.ts +5 -1
- package/dist/enhance/prompt.d.ts.map +1 -1
- package/dist/enhance/prompt.js +9 -2
- package/dist/enhance/prompt.js.map +1 -1
- package/dist/format.d.ts +31 -0
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +256 -15
- package/dist/format.js.map +1 -1
- package/dist/index.d.ts +6 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -8
- package/dist/index.js.map +1 -1
- package/dist/memory/pageindex/chunker.d.ts +1 -1
- package/dist/memory/pageindex/chunker.d.ts.map +1 -1
- package/dist/memory/pageindex/chunker.js +5 -5
- package/dist/memory/pageindex/chunker.js.map +1 -1
- package/dist/memory/pageindex/example.d.ts +1 -1
- package/dist/memory/pageindex/example.d.ts.map +1 -1
- package/dist/memory/pageindex/example.js +1 -2
- package/dist/memory/pageindex/example.js.map +1 -1
- package/dist/memory/pageindex/index.d.ts +3 -3
- package/dist/memory/pageindex/index.d.ts.map +1 -1
- package/dist/memory/pageindex/index.js +1 -1
- package/dist/memory/pageindex/index.js.map +1 -1
- package/dist/memory/pageindex/service.d.ts +11 -2
- package/dist/memory/pageindex/service.d.ts.map +1 -1
- package/dist/memory/pageindex/service.js +12 -11
- package/dist/memory/pageindex/service.js.map +1 -1
- package/dist/memory/persist.d.ts.map +1 -1
- package/dist/memory/persist.js +10 -3
- package/dist/memory/persist.js.map +1 -1
- package/dist/memory/privacy.d.ts.map +1 -1
- package/dist/memory/privacy.js +45 -6
- package/dist/memory/privacy.js.map +1 -1
- package/dist/memory/sqlite.d.ts +1 -13
- package/dist/memory/sqlite.d.ts.map +1 -1
- package/dist/memory/sqlite.js +45 -27
- package/dist/memory/sqlite.js.map +1 -1
- package/dist/memory/taxonomy.d.ts.map +1 -1
- package/dist/memory/taxonomy.js +6 -1
- package/dist/memory/taxonomy.js.map +1 -1
- package/dist/pipeline/degrade.d.ts +61 -0
- package/dist/pipeline/degrade.d.ts.map +1 -0
- package/dist/pipeline/degrade.js +58 -0
- package/dist/pipeline/degrade.js.map +1 -0
- package/dist/pipeline/enrich.d.ts +29 -0
- package/dist/pipeline/enrich.d.ts.map +1 -0
- package/dist/pipeline/enrich.js +271 -0
- package/dist/pipeline/enrich.js.map +1 -0
- package/dist/pipeline/execute.d.ts +22 -0
- package/dist/pipeline/execute.d.ts.map +1 -0
- package/dist/pipeline/execute.js +250 -0
- package/dist/pipeline/execute.js.map +1 -0
- package/dist/pipeline/finalize.d.ts +26 -0
- package/dist/pipeline/finalize.d.ts.map +1 -0
- package/dist/pipeline/finalize.js +52 -0
- package/dist/pipeline/finalize.js.map +1 -0
- package/dist/pipeline/gather-context.d.ts +25 -0
- package/dist/pipeline/gather-context.d.ts.map +1 -0
- package/dist/pipeline/gather-context.js +169 -0
- package/dist/pipeline/gather-context.js.map +1 -0
- package/dist/pipeline/gather-safe.d.ts +39 -0
- package/dist/pipeline/gather-safe.d.ts.map +1 -0
- package/dist/pipeline/gather-safe.js +127 -0
- package/dist/pipeline/gather-safe.js.map +1 -0
- package/dist/pipeline/prepare-graph.d.ts +54 -0
- package/dist/pipeline/prepare-graph.d.ts.map +1 -0
- package/dist/pipeline/prepare-graph.js +174 -0
- package/dist/pipeline/prepare-graph.js.map +1 -0
- package/dist/pipeline/prepare.d.ts +40 -0
- package/dist/pipeline/prepare.d.ts.map +1 -0
- package/dist/pipeline/prepare.js +233 -0
- package/dist/pipeline/prepare.js.map +1 -0
- package/dist/pipeline/providers.d.ts +54 -0
- package/dist/pipeline/providers.d.ts.map +1 -0
- package/dist/pipeline/providers.js +163 -0
- package/dist/pipeline/providers.js.map +1 -0
- package/dist/pipeline/results.d.ts +35 -0
- package/dist/pipeline/results.d.ts.map +1 -0
- package/dist/pipeline/results.js +122 -0
- package/dist/pipeline/results.js.map +1 -0
- package/dist/pipeline/state.d.ts +92 -0
- package/dist/pipeline/state.d.ts.map +1 -0
- package/dist/pipeline/state.js +13 -0
- package/dist/pipeline/state.js.map +1 -0
- package/dist/pipeline.d.ts +10 -9
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +36 -1213
- package/dist/pipeline.js.map +1 -1
- package/dist/providers/gateway.d.ts.map +1 -1
- package/dist/providers/gateway.js +8 -0
- package/dist/providers/gateway.js.map +1 -1
- package/dist/recursive/index.d.ts +1 -0
- package/dist/recursive/index.d.ts.map +1 -1
- package/dist/recursive/index.js +7 -3
- package/dist/recursive/index.js.map +1 -1
- package/dist/recursive/patch-extractor.d.ts +58 -6
- package/dist/recursive/patch-extractor.d.ts.map +1 -1
- package/dist/recursive/patch-extractor.js +207 -26
- package/dist/recursive/patch-extractor.js.map +1 -1
- package/dist/sanitize.d.ts +51 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +90 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/scope/diff-mapper.d.ts +12 -0
- package/dist/scope/diff-mapper.d.ts.map +1 -1
- package/dist/scope/diff-mapper.js +25 -18
- package/dist/scope/diff-mapper.js.map +1 -1
- package/dist/scope/entity-diff.d.ts +21 -4
- package/dist/scope/entity-diff.d.ts.map +1 -1
- package/dist/scope/entity-diff.js +132 -34
- package/dist/scope/entity-diff.js.map +1 -1
- package/dist/scope/types.d.ts +10 -0
- package/dist/scope/types.d.ts.map +1 -1
- package/dist/search/index.d.ts +1 -1
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js.map +1 -1
- package/dist/search/indexer.d.ts.map +1 -1
- package/dist/search/indexer.js +33 -4
- package/dist/search/indexer.js.map +1 -1
- package/dist/search/searcher.d.ts.map +1 -1
- package/dist/search/searcher.js.map +1 -1
- package/dist/semantic-diff/index.d.ts +25 -2
- package/dist/semantic-diff/index.d.ts.map +1 -1
- package/dist/semantic-diff/index.js +147 -53
- package/dist/semantic-diff/index.js.map +1 -1
- package/dist/tools/gitleaks-config.toml +35 -0
- package/dist/tools/plugins/gitleaks.d.ts +10 -0
- package/dist/tools/plugins/gitleaks.d.ts.map +1 -1
- package/dist/tools/plugins/gitleaks.js +29 -2
- package/dist/tools/plugins/gitleaks.js.map +1 -1
- package/dist/tools/plugins/semgrep.d.ts +11 -0
- package/dist/tools/plugins/semgrep.d.ts.map +1 -1
- package/dist/tools/plugins/semgrep.js +30 -1
- package/dist/tools/plugins/semgrep.js.map +1 -1
- package/dist/tools/semgrep-rules.yml +305 -0
- package/dist/types.d.ts +51 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/diff.d.ts +22 -2
- package/dist/utils/diff.d.ts.map +1 -1
- package/dist/utils/diff.js +36 -40
- package/dist/utils/diff.js.map +1 -1
- package/package.json +21 -22
- package/dist/providers/fallback.d.ts +0 -54
- package/dist/providers/fallback.d.ts.map +0 -1
- package/dist/providers/fallback.js +0 -102
- package/dist/providers/fallback.js.map +0 -1
- package/dist/providers/index.d.ts +0 -49
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -146
- package/dist/providers/index.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ghagga-core",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Core review engine for GHAGGA — AI-powered multi-agent code reviewer",
|
|
@@ -39,32 +39,31 @@
|
|
|
39
39
|
"dist",
|
|
40
40
|
"README.md"
|
|
41
41
|
],
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@ai-sdk/openai": "^3.0.64",
|
|
44
|
+
"@ai-sdk/openai-compatible": "^2.0.47",
|
|
45
|
+
"@cursorless/tree-sitter-wasms": "^0.9.0",
|
|
46
|
+
"ai": "^6.0.187",
|
|
47
|
+
"fts5-sql-bundle": "^1.0.2",
|
|
48
|
+
"minimatch": "^10.2.5",
|
|
49
|
+
"web-tree-sitter": "^0.26.9",
|
|
50
|
+
"zod": "^4.4.3"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@stryker-mutator/core": "^9.6.1",
|
|
54
|
+
"@stryker-mutator/vitest-runner": "^9.6.1",
|
|
55
|
+
"@types/node": "^25.9.1",
|
|
56
|
+
"typescript": "^5.9.0",
|
|
57
|
+
"vitest": "^4.1.7"
|
|
58
|
+
},
|
|
42
59
|
"scripts": {
|
|
43
|
-
"build": "tsc",
|
|
60
|
+
"build": "tsc && node scripts/copy-assets.mjs",
|
|
44
61
|
"dev": "tsc --watch",
|
|
45
62
|
"typecheck": "tsc --noEmit",
|
|
46
63
|
"test": "vitest run",
|
|
47
64
|
"test:coverage": "vitest run --coverage",
|
|
48
65
|
"test:watch": "vitest",
|
|
49
66
|
"test:mutate": "stryker run",
|
|
50
|
-
"clean": "rm -rf dist"
|
|
51
|
-
"prepublishOnly": "npm run build"
|
|
52
|
-
},
|
|
53
|
-
"dependencies": {
|
|
54
|
-
"@ai-sdk/openai": "^3.0.0",
|
|
55
|
-
"@ai-sdk/openai-compatible": "^2.0.35",
|
|
56
|
-
"@cursorless/tree-sitter-wasms": "^0.8.1",
|
|
57
|
-
"ai": "^6.0.0",
|
|
58
|
-
"fts5-sql-bundle": "^1.0.2",
|
|
59
|
-
"minimatch": "^10.2.0",
|
|
60
|
-
"web-tree-sitter": "^0.26.8",
|
|
61
|
-
"zod": "^4.3.0"
|
|
62
|
-
},
|
|
63
|
-
"devDependencies": {
|
|
64
|
-
"@stryker-mutator/core": "^9.6.0",
|
|
65
|
-
"@stryker-mutator/vitest-runner": "^9.6.0",
|
|
66
|
-
"@types/node": "^25.3.5",
|
|
67
|
-
"typescript": "^5.9.0",
|
|
68
|
-
"vitest": "^4.0.0"
|
|
67
|
+
"clean": "rm -rf dist"
|
|
69
68
|
}
|
|
70
|
-
}
|
|
69
|
+
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Provider fallback chain.
|
|
3
|
-
*
|
|
4
|
-
* Tries each provider/model pair in order. If one fails with a
|
|
5
|
-
* server error (5xx) or times out, it moves to the next provider.
|
|
6
|
-
* Client errors (4xx) are NOT retried — they indicate misconfiguration.
|
|
7
|
-
*/
|
|
8
|
-
import type { LLMProvider } from '../types.js';
|
|
9
|
-
export interface FallbackProvider {
|
|
10
|
-
provider: LLMProvider;
|
|
11
|
-
model: string;
|
|
12
|
-
apiKey: string;
|
|
13
|
-
}
|
|
14
|
-
export interface FallbackOptions {
|
|
15
|
-
/** Ordered list of providers to try */
|
|
16
|
-
providers: FallbackProvider[];
|
|
17
|
-
/** System prompt */
|
|
18
|
-
system: string;
|
|
19
|
-
/** User prompt */
|
|
20
|
-
prompt: string;
|
|
21
|
-
/** Temperature for generation (default: 0.3 for review consistency) */
|
|
22
|
-
temperature?: number;
|
|
23
|
-
}
|
|
24
|
-
export interface FallbackResult {
|
|
25
|
-
/** Generated text */
|
|
26
|
-
text: string;
|
|
27
|
-
/** Provider that succeeded */
|
|
28
|
-
provider: LLMProvider;
|
|
29
|
-
/** Model that succeeded */
|
|
30
|
-
model: string;
|
|
31
|
-
/** Approximate tokens used (prompt + completion) */
|
|
32
|
-
tokensUsed: number;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Check if an error is retryable (should try the next provider in the chain).
|
|
36
|
-
*
|
|
37
|
-
* Retryable: 5xx, timeouts, rate limits (429), and payload-too-large (413).
|
|
38
|
-
* The 413 case is important for free-tier providers with low TPM limits —
|
|
39
|
-
* the next provider in the chain may have a higher limit.
|
|
40
|
-
*/
|
|
41
|
-
export declare function isRetryableError(error: unknown): boolean;
|
|
42
|
-
/**
|
|
43
|
-
* Generate text with automatic provider fallback.
|
|
44
|
-
*
|
|
45
|
-
* Tries each provider in order. On retryable errors (5xx, timeout,
|
|
46
|
-
* rate limit), moves to the next provider. Throws the last error
|
|
47
|
-
* if all providers fail.
|
|
48
|
-
*
|
|
49
|
-
* @param options - Providers, system prompt, and user prompt
|
|
50
|
-
* @returns Generated text with metadata about which provider succeeded
|
|
51
|
-
* @throws The last encountered error if all providers fail
|
|
52
|
-
*/
|
|
53
|
-
export declare function generateWithFallback(options: FallbackOptions): Promise<FallbackResult>;
|
|
54
|
-
//# sourceMappingURL=fallback.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../../src/providers/fallback.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM/C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAE9B,oBAAoB;IACpB,MAAM,EAAE,MAAM,CAAC;IAEf,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IAEf,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IAEb,8BAA8B;IAC9B,QAAQ,EAAE,WAAW,CAAC;IAEtB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IAEd,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;CACpB;AAID;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAmCxD;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CA0D5F"}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Provider fallback chain.
|
|
3
|
-
*
|
|
4
|
-
* Tries each provider/model pair in order. If one fails with a
|
|
5
|
-
* server error (5xx) or times out, it moves to the next provider.
|
|
6
|
-
* Client errors (4xx) are NOT retried — they indicate misconfiguration.
|
|
7
|
-
*/
|
|
8
|
-
import { generateTextWithTimeout } from '../utils/llm-timeout.js';
|
|
9
|
-
import { createModel } from './index.js';
|
|
10
|
-
// ─── Helpers ────────────────────────────────────────────────────
|
|
11
|
-
/**
|
|
12
|
-
* Check if an error is retryable (should try the next provider in the chain).
|
|
13
|
-
*
|
|
14
|
-
* Retryable: 5xx, timeouts, rate limits (429), and payload-too-large (413).
|
|
15
|
-
* The 413 case is important for free-tier providers with low TPM limits —
|
|
16
|
-
* the next provider in the chain may have a higher limit.
|
|
17
|
-
*/
|
|
18
|
-
export function isRetryableError(error) {
|
|
19
|
-
if (error instanceof Error) {
|
|
20
|
-
const message = error.message.toLowerCase();
|
|
21
|
-
// Network/timeout errors
|
|
22
|
-
if (message.includes('timeout') ||
|
|
23
|
-
message.includes('econnreset') ||
|
|
24
|
-
message.includes('econnrefused')) {
|
|
25
|
-
return true;
|
|
26
|
-
}
|
|
27
|
-
// Check for HTTP status codes in error (provider SDKs often include them)
|
|
28
|
-
const statusMatch = /status[:\s]*(\d{3})/i.exec(message);
|
|
29
|
-
if (statusMatch) {
|
|
30
|
-
const status = parseInt(statusMatch[1] ?? '0', 10);
|
|
31
|
-
// 5xx server errors + 413 payload too large (TPM exceeded) + 429 rate limit
|
|
32
|
-
return status >= 500 || status === 413 || status === 429;
|
|
33
|
-
}
|
|
34
|
-
// Rate limit / TPM exceeded — also retryable with a different provider
|
|
35
|
-
if (message.includes('rate limit') ||
|
|
36
|
-
message.includes('rate_limit') ||
|
|
37
|
-
message.includes('429') ||
|
|
38
|
-
message.includes('413') ||
|
|
39
|
-
message.includes('request too large') ||
|
|
40
|
-
message.includes('tokens per minute')) {
|
|
41
|
-
return true;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return false;
|
|
45
|
-
}
|
|
46
|
-
// ─── Main Function ──────────────────────────────────────────────
|
|
47
|
-
/**
|
|
48
|
-
* Generate text with automatic provider fallback.
|
|
49
|
-
*
|
|
50
|
-
* Tries each provider in order. On retryable errors (5xx, timeout,
|
|
51
|
-
* rate limit), moves to the next provider. Throws the last error
|
|
52
|
-
* if all providers fail.
|
|
53
|
-
*
|
|
54
|
-
* @param options - Providers, system prompt, and user prompt
|
|
55
|
-
* @returns Generated text with metadata about which provider succeeded
|
|
56
|
-
* @throws The last encountered error if all providers fail
|
|
57
|
-
*/
|
|
58
|
-
export async function generateWithFallback(options) {
|
|
59
|
-
const { providers, system, prompt, temperature = 0.3 } = options;
|
|
60
|
-
if (providers.length === 0) {
|
|
61
|
-
throw new Error('No providers configured for fallback chain');
|
|
62
|
-
}
|
|
63
|
-
let lastError;
|
|
64
|
-
for (const { provider, model, apiKey } of providers) {
|
|
65
|
-
try {
|
|
66
|
-
const languageModel = createModel(provider, model, apiKey);
|
|
67
|
-
const result = await generateTextWithTimeout({
|
|
68
|
-
model: languageModel,
|
|
69
|
-
system,
|
|
70
|
-
prompt,
|
|
71
|
-
temperature,
|
|
72
|
-
}, { provider, model });
|
|
73
|
-
// Timeout: treat as a retryable error and try next provider
|
|
74
|
-
if (result === null) {
|
|
75
|
-
lastError = new Error(`LLM call timed out for ${provider}/${model}`);
|
|
76
|
-
console.warn(`[ghagga] Provider ${provider}/${model} timed out, trying next...`);
|
|
77
|
-
continue;
|
|
78
|
-
}
|
|
79
|
-
// Calculate tokens used from the response
|
|
80
|
-
const tokensUsed = (result.usage?.inputTokens ?? 0) + (result.usage?.outputTokens ?? 0);
|
|
81
|
-
return {
|
|
82
|
-
text: result.text,
|
|
83
|
-
provider,
|
|
84
|
-
model,
|
|
85
|
-
tokensUsed,
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
catch (error) {
|
|
89
|
-
lastError = error;
|
|
90
|
-
if (isRetryableError(error)) {
|
|
91
|
-
// Log and continue to next provider
|
|
92
|
-
console.warn(`[ghagga] Provider ${provider}/${model} failed with retryable error, trying next...`, error instanceof Error ? error.message : String(error));
|
|
93
|
-
continue;
|
|
94
|
-
}
|
|
95
|
-
// Non-retryable error (4xx, auth, etc.) — throw immediately
|
|
96
|
-
throw error;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
// All providers failed with retryable errors
|
|
100
|
-
throw lastError;
|
|
101
|
-
}
|
|
102
|
-
//# sourceMappingURL=fallback.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fallback.js","sourceRoot":"","sources":["../../src/providers/fallback.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* LLM Provider factory using the Vercel AI SDK.
|
|
3
|
-
*
|
|
4
|
-
* Wraps @ai-sdk/anthropic, @ai-sdk/openai, @ai-sdk/google,
|
|
5
|
-
* GitHub Models, and Ollama behind a unified factory so the rest
|
|
6
|
-
* of the codebase doesn't need to know which provider is being used.
|
|
7
|
-
*
|
|
8
|
-
* GitHub Models uses the OpenAI-compatible endpoint at
|
|
9
|
-
* https://models.inference.ai.azure.com and authenticates with a
|
|
10
|
-
* GitHub Personal Access Token (PAT) with `models:read` scope.
|
|
11
|
-
*
|
|
12
|
-
* Ollama runs locally and exposes an OpenAI-compatible endpoint at
|
|
13
|
-
* http://localhost:11434/v1. No API key required.
|
|
14
|
-
*
|
|
15
|
-
* Qwen (Alibaba Cloud DashScope) uses the OpenAI-compatible endpoint at
|
|
16
|
-
* https://dashscope-intl.aliyuncs.com/compatible-mode/v1. Requires a
|
|
17
|
-
* DashScope API key (DASHSCOPE_API_KEY).
|
|
18
|
-
*
|
|
19
|
-
* Groq uses https://api.groq.com/openai/v1 (free tier: 1K–14.4K RPD).
|
|
20
|
-
* Cerebras uses https://api.cerebras.ai/v1 (free tier: 14.4K RPD, ~3000 tok/s).
|
|
21
|
-
* DeepSeek uses https://api.deepseek.com/v1 (near-free, no rate limit).
|
|
22
|
-
* OpenRouter uses https://openrouter.ai/api/v1 (gateway to 200+ models).
|
|
23
|
-
*/
|
|
24
|
-
import type { LanguageModel } from 'ai';
|
|
25
|
-
import type { LLMProvider } from '../types.js';
|
|
26
|
-
/**
|
|
27
|
-
* Create a provider instance configured with the given API key.
|
|
28
|
-
*
|
|
29
|
-
* Returns the provider's model creator function, which can be called
|
|
30
|
-
* with a model ID to get a LanguageModel instance.
|
|
31
|
-
*
|
|
32
|
-
* @param provider - Provider name ('anthropic' | 'openai' | 'google' | 'github' | 'ollama')
|
|
33
|
-
* @param apiKey - Decrypted API key for the provider
|
|
34
|
-
* @returns The provider's model creator function
|
|
35
|
-
*/
|
|
36
|
-
export declare function createProvider(provider: LLMProvider, apiKey: string): import("@ai-sdk/anthropic").AnthropicProvider | import("@ai-sdk/openai").OpenAIProvider | import("@ai-sdk/google").GoogleGenerativeAIProvider;
|
|
37
|
-
/**
|
|
38
|
-
* Create a LanguageModel instance for the given provider + model combo.
|
|
39
|
-
*
|
|
40
|
-
* This is the primary entry point for the rest of the codebase.
|
|
41
|
-
* It handles provider initialization and model creation in one step.
|
|
42
|
-
*
|
|
43
|
-
* @param provider - Provider name
|
|
44
|
-
* @param model - Model identifier (e.g., "claude-sonnet-4-20250514")
|
|
45
|
-
* @param apiKey - Decrypted API key
|
|
46
|
-
* @returns A LanguageModel ready for use with AI SDK's generateText/streamText
|
|
47
|
-
*/
|
|
48
|
-
export declare function createModel(provider: LLMProvider, model: string, apiKey: string): LanguageModel;
|
|
49
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAyB/C;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,iJAwFnE;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAG/F"}
|
package/dist/providers/index.js
DELETED
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* LLM Provider factory using the Vercel AI SDK.
|
|
3
|
-
*
|
|
4
|
-
* Wraps @ai-sdk/anthropic, @ai-sdk/openai, @ai-sdk/google,
|
|
5
|
-
* GitHub Models, and Ollama behind a unified factory so the rest
|
|
6
|
-
* of the codebase doesn't need to know which provider is being used.
|
|
7
|
-
*
|
|
8
|
-
* GitHub Models uses the OpenAI-compatible endpoint at
|
|
9
|
-
* https://models.inference.ai.azure.com and authenticates with a
|
|
10
|
-
* GitHub Personal Access Token (PAT) with `models:read` scope.
|
|
11
|
-
*
|
|
12
|
-
* Ollama runs locally and exposes an OpenAI-compatible endpoint at
|
|
13
|
-
* http://localhost:11434/v1. No API key required.
|
|
14
|
-
*
|
|
15
|
-
* Qwen (Alibaba Cloud DashScope) uses the OpenAI-compatible endpoint at
|
|
16
|
-
* https://dashscope-intl.aliyuncs.com/compatible-mode/v1. Requires a
|
|
17
|
-
* DashScope API key (DASHSCOPE_API_KEY).
|
|
18
|
-
*
|
|
19
|
-
* Groq uses https://api.groq.com/openai/v1 (free tier: 1K–14.4K RPD).
|
|
20
|
-
* Cerebras uses https://api.cerebras.ai/v1 (free tier: 14.4K RPD, ~3000 tok/s).
|
|
21
|
-
* DeepSeek uses https://api.deepseek.com/v1 (near-free, no rate limit).
|
|
22
|
-
* OpenRouter uses https://openrouter.ai/api/v1 (gateway to 200+ models).
|
|
23
|
-
*/
|
|
24
|
-
import { createAnthropic } from '@ai-sdk/anthropic';
|
|
25
|
-
import { createGoogleGenerativeAI } from '@ai-sdk/google';
|
|
26
|
-
import { createOpenAI } from '@ai-sdk/openai';
|
|
27
|
-
import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
|
|
28
|
-
/** GitHub Models inference endpoint (OpenAI-compatible) */
|
|
29
|
-
const GITHUB_MODELS_BASE_URL = 'https://models.inference.ai.azure.com';
|
|
30
|
-
/** Ollama local inference endpoint (OpenAI-compatible) */
|
|
31
|
-
const OLLAMA_BASE_URL = 'http://localhost:11434/v1';
|
|
32
|
-
/** Qwen / DashScope international endpoint (OpenAI-compatible) */
|
|
33
|
-
const QWEN_BASE_URL = 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1';
|
|
34
|
-
/** Groq Cloud inference endpoint (OpenAI-compatible) */
|
|
35
|
-
const GROQ_BASE_URL = 'https://api.groq.com/openai/v1';
|
|
36
|
-
/** Cerebras inference endpoint (OpenAI-compatible) */
|
|
37
|
-
const CEREBRAS_BASE_URL = 'https://api.cerebras.ai/v1';
|
|
38
|
-
/** DeepSeek inference endpoint (OpenAI-compatible) */
|
|
39
|
-
const DEEPSEEK_BASE_URL = 'https://api.deepseek.com/v1';
|
|
40
|
-
/** OpenRouter gateway endpoint (OpenAI-compatible) */
|
|
41
|
-
const OPENROUTER_BASE_URL = 'https://openrouter.ai/api/v1';
|
|
42
|
-
// ─── Provider Factory ───────────────────────────────────────────
|
|
43
|
-
/**
|
|
44
|
-
* Create a provider instance configured with the given API key.
|
|
45
|
-
*
|
|
46
|
-
* Returns the provider's model creator function, which can be called
|
|
47
|
-
* with a model ID to get a LanguageModel instance.
|
|
48
|
-
*
|
|
49
|
-
* @param provider - Provider name ('anthropic' | 'openai' | 'google' | 'github' | 'ollama')
|
|
50
|
-
* @param apiKey - Decrypted API key for the provider
|
|
51
|
-
* @returns The provider's model creator function
|
|
52
|
-
*/
|
|
53
|
-
export function createProvider(provider, apiKey) {
|
|
54
|
-
switch (provider) {
|
|
55
|
-
case 'anthropic':
|
|
56
|
-
return createAnthropic({ apiKey });
|
|
57
|
-
case 'openai':
|
|
58
|
-
return createOpenAI({ apiKey });
|
|
59
|
-
case 'google':
|
|
60
|
-
return createGoogleGenerativeAI({ apiKey });
|
|
61
|
-
case 'github': {
|
|
62
|
-
// GitHub Models doesn't support the OpenAI Responses API (/responses).
|
|
63
|
-
// Use openai-compatible which sends to /chat/completions instead.
|
|
64
|
-
const ghProvider = createOpenAICompatible({
|
|
65
|
-
apiKey,
|
|
66
|
-
baseURL: GITHUB_MODELS_BASE_URL,
|
|
67
|
-
name: 'github-models',
|
|
68
|
-
});
|
|
69
|
-
// Return a callable that matches createOpenAI's interface
|
|
70
|
-
return ((modelId) => ghProvider.chatModel(modelId));
|
|
71
|
-
}
|
|
72
|
-
case 'ollama':
|
|
73
|
-
return createOpenAI({
|
|
74
|
-
apiKey: apiKey || 'ollama',
|
|
75
|
-
baseURL: OLLAMA_BASE_URL,
|
|
76
|
-
name: 'ollama',
|
|
77
|
-
});
|
|
78
|
-
case 'qwen':
|
|
79
|
-
return createOpenAI({
|
|
80
|
-
apiKey,
|
|
81
|
-
baseURL: QWEN_BASE_URL,
|
|
82
|
-
name: 'qwen',
|
|
83
|
-
});
|
|
84
|
-
case 'groq':
|
|
85
|
-
return createOpenAI({
|
|
86
|
-
apiKey,
|
|
87
|
-
baseURL: GROQ_BASE_URL,
|
|
88
|
-
name: 'groq',
|
|
89
|
-
});
|
|
90
|
-
case 'cerebras': {
|
|
91
|
-
const provider = createOpenAICompatible({
|
|
92
|
-
name: 'cerebras',
|
|
93
|
-
baseURL: CEREBRAS_BASE_URL,
|
|
94
|
-
apiKey,
|
|
95
|
-
});
|
|
96
|
-
return ((modelId) => provider.chatModel(modelId));
|
|
97
|
-
}
|
|
98
|
-
case 'deepseek': {
|
|
99
|
-
const provider = createOpenAICompatible({
|
|
100
|
-
name: 'deepseek',
|
|
101
|
-
baseURL: DEEPSEEK_BASE_URL,
|
|
102
|
-
apiKey,
|
|
103
|
-
});
|
|
104
|
-
return ((modelId) => provider.chatModel(modelId));
|
|
105
|
-
}
|
|
106
|
-
case 'openrouter': {
|
|
107
|
-
const provider = createOpenAICompatible({
|
|
108
|
-
name: 'openrouter',
|
|
109
|
-
baseURL: OPENROUTER_BASE_URL,
|
|
110
|
-
apiKey,
|
|
111
|
-
});
|
|
112
|
-
return ((modelId) => provider.chatModel(modelId));
|
|
113
|
-
}
|
|
114
|
-
case 'cli-bridge':
|
|
115
|
-
// CLI Bridge does not use the AI SDK — it calls CLIs via child_process.
|
|
116
|
-
// Return a dummy provider that throws if accidentally called via createModel().
|
|
117
|
-
// The pipeline intercepts cli-bridge before reaching createModel().
|
|
118
|
-
throw new Error('cli-bridge provider cannot be used with createModel(). Use generateViaCLI() from providers/cli-bridge.js instead.');
|
|
119
|
-
case 'gateway':
|
|
120
|
-
// Gateway does not use the AI SDK — it delegates to an external LLM Gateway service.
|
|
121
|
-
// The pipeline intercepts gateway before reaching createModel().
|
|
122
|
-
throw new Error('gateway provider cannot be used with createModel(). Use generateViaGateway() from providers/gateway.js instead.');
|
|
123
|
-
default: {
|
|
124
|
-
// Exhaustive check — TypeScript will error if a provider is missing
|
|
125
|
-
const _exhaustive = provider;
|
|
126
|
-
throw new Error(`Unknown provider: ${_exhaustive}`);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
// ─── Model Factory ──────────────────────────────────────────────
|
|
131
|
-
/**
|
|
132
|
-
* Create a LanguageModel instance for the given provider + model combo.
|
|
133
|
-
*
|
|
134
|
-
* This is the primary entry point for the rest of the codebase.
|
|
135
|
-
* It handles provider initialization and model creation in one step.
|
|
136
|
-
*
|
|
137
|
-
* @param provider - Provider name
|
|
138
|
-
* @param model - Model identifier (e.g., "claude-sonnet-4-20250514")
|
|
139
|
-
* @param apiKey - Decrypted API key
|
|
140
|
-
* @returns A LanguageModel ready for use with AI SDK's generateText/streamText
|
|
141
|
-
*/
|
|
142
|
-
export function createModel(provider, model, apiKey) {
|
|
143
|
-
const providerInstance = createProvider(provider, apiKey);
|
|
144
|
-
return providerInstance(model);
|
|
145
|
-
}
|
|
146
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAInE,2DAA2D;AAC3D,MAAM,sBAAsB,GAAG,uCAAuC,CAAC;AAEvE,0DAA0D;AAC1D,MAAM,eAAe,GAAG,2BAA2B,CAAC;AAEpD,kEAAkE;AAClE,MAAM,aAAa,GAAG,wDAAwD,CAAC;AAE/E,wDAAwD;AACxD,MAAM,aAAa,GAAG,gCAAgC,CAAC;AAEvD,sDAAsD;AACtD,MAAM,iBAAiB,GAAG,4BAA4B,CAAC;AAEvD,sDAAsD;AACtD,MAAM,iBAAiB,GAAG,6BAA6B,CAAC;AAExD,sDAAsD;AACtD,MAAM,mBAAmB,GAAG,8BAA8B,CAAC;AAE3D,mEAAmE;AAEnE;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,QAAqB,EAAE,MAAc;IAClE,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,WAAW;YACd,OAAO,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAClC,KAAK,QAAQ;YACX,OAAO,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,uEAAuE;YACvE,kEAAkE;YAClE,MAAM,UAAU,GAAG,sBAAsB,CAAC;gBACxC,MAAM;gBACN,OAAO,EAAE,sBAAsB;gBAC/B,IAAI,EAAE,eAAe;aACtB,CAAC,CAAC;YACH,0DAA0D;YAC1D,OAAO,CAAC,CAAC,OAAe,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAEzD,CAAC;QACJ,CAAC;QACD,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC;gBAClB,MAAM,EAAE,MAAM,IAAI,QAAQ;gBAC1B,OAAO,EAAE,eAAe;gBACxB,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,KAAK,MAAM;YACT,OAAO,YAAY,CAAC;gBAClB,MAAM;gBACN,OAAO,EAAE,aAAa;gBACtB,IAAI,EAAE,MAAM;aACb,CAAC,CAAC;QACL,KAAK,MAAM;YACT,OAAO,YAAY,CAAC;gBAClB,MAAM;gBACN,OAAO,EAAE,aAAa;gBACtB,IAAI,EAAE,MAAM;aACb,CAAC,CAAC;QACL,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,QAAQ,GAAG,sBAAsB,CAAC;gBACtC,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,iBAAiB;gBAC1B,MAAM;aACP,CAAC,CAAC;YACH,OAAO,CAAC,CAAC,OAAe,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAEvD,CAAC;QACJ,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,QAAQ,GAAG,sBAAsB,CAAC;gBACtC,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,iBAAiB;gBAC1B,MAAM;aACP,CAAC,CAAC;YACH,OAAO,CAAC,CAAC,OAAe,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAEvD,CAAC;QACJ,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,QAAQ,GAAG,sBAAsB,CAAC;gBACtC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,mBAAmB;gBAC5B,MAAM;aACP,CAAC,CAAC;YACH,OAAO,CAAC,CAAC,OAAe,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAEvD,CAAC;QACJ,CAAC;QACD,KAAK,YAAY;YACf,wEAAwE;YACxE,gFAAgF;YAChF,oEAAoE;YACpE,MAAM,IAAI,KAAK,CACb,mHAAmH,CACpH,CAAC;QACJ,KAAK,SAAS;YACZ,qFAAqF;YACrF,iEAAiE;YACjE,MAAM,IAAI,KAAK,CACb,iHAAiH,CAClH,CAAC;QACJ,OAAO,CAAC,CAAC,CAAC;YACR,oEAAoE;YACpE,MAAM,WAAW,GAAU,QAAQ,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,qBAAqB,WAAW,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;AACH,CAAC;AAED,mEAAmE;AAEnE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,QAAqB,EAAE,KAAa,EAAE,MAAc;IAC9E,MAAM,gBAAgB,GAAG,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1D,OAAO,gBAAgB,CAAC,KAAK,CAAkB,CAAC;AAClD,CAAC"}
|