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.
Files changed (206) hide show
  1. package/LICENSE +21 -0
  2. package/dist/acp/adapter.d.ts.map +1 -1
  3. package/dist/acp/adapter.js +1 -1
  4. package/dist/acp/adapter.js.map +1 -1
  5. package/dist/acp/index.d.ts +1 -1
  6. package/dist/acp/index.d.ts.map +1 -1
  7. package/dist/acp/index.js.map +1 -1
  8. package/dist/acp/types.d.ts.map +1 -1
  9. package/dist/agents/consensus.d.ts.map +1 -1
  10. package/dist/agents/consensus.js +7 -2
  11. package/dist/agents/consensus.js.map +1 -1
  12. package/dist/agents/diagnostic.d.ts.map +1 -1
  13. package/dist/agents/diagnostic.js +7 -2
  14. package/dist/agents/diagnostic.js.map +1 -1
  15. package/dist/agents/fan-out-lenses.d.ts.map +1 -1
  16. package/dist/agents/fan-out-lenses.js +7 -2
  17. package/dist/agents/fan-out-lenses.js.map +1 -1
  18. package/dist/agents/prompts.d.ts +49 -1
  19. package/dist/agents/prompts.d.ts.map +1 -1
  20. package/dist/agents/prompts.js +133 -5
  21. package/dist/agents/prompts.js.map +1 -1
  22. package/dist/agents/simple.d.ts +1 -1
  23. package/dist/agents/simple.d.ts.map +1 -1
  24. package/dist/agents/simple.js +6 -4
  25. package/dist/agents/simple.js.map +1 -1
  26. package/dist/agents/workflow.d.ts.map +1 -1
  27. package/dist/agents/workflow.js +13 -4
  28. package/dist/agents/workflow.js.map +1 -1
  29. package/dist/critique/critique.d.ts.map +1 -1
  30. package/dist/critique/critique.js +14 -6
  31. package/dist/critique/critique.js.map +1 -1
  32. package/dist/critique/cross-model.d.ts.map +1 -1
  33. package/dist/critique/cross-model.js +1 -3
  34. package/dist/critique/cross-model.js.map +1 -1
  35. package/dist/critique/index.d.ts +1 -2
  36. package/dist/critique/index.d.ts.map +1 -1
  37. package/dist/critique/index.js +1 -2
  38. package/dist/critique/index.js.map +1 -1
  39. package/dist/diff/index.d.ts +12 -0
  40. package/dist/diff/index.d.ts.map +1 -0
  41. package/dist/diff/index.js +11 -0
  42. package/dist/diff/index.js.map +1 -0
  43. package/dist/diff/parse.d.ts +41 -0
  44. package/dist/diff/parse.d.ts.map +1 -0
  45. package/dist/diff/parse.js +303 -0
  46. package/dist/diff/parse.js.map +1 -0
  47. package/dist/diff/types.d.ts +106 -0
  48. package/dist/diff/types.d.ts.map +1 -0
  49. package/dist/diff/types.js +23 -0
  50. package/dist/diff/types.js.map +1 -0
  51. package/dist/embed.d.ts +5 -2
  52. package/dist/embed.d.ts.map +1 -1
  53. package/dist/embed.js +7 -3
  54. package/dist/embed.js.map +1 -1
  55. package/dist/enhance/prompt.d.ts +5 -1
  56. package/dist/enhance/prompt.d.ts.map +1 -1
  57. package/dist/enhance/prompt.js +9 -2
  58. package/dist/enhance/prompt.js.map +1 -1
  59. package/dist/format.d.ts +31 -0
  60. package/dist/format.d.ts.map +1 -1
  61. package/dist/format.js +256 -15
  62. package/dist/format.js.map +1 -1
  63. package/dist/index.d.ts +6 -7
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +4 -8
  66. package/dist/index.js.map +1 -1
  67. package/dist/memory/pageindex/chunker.d.ts +1 -1
  68. package/dist/memory/pageindex/chunker.d.ts.map +1 -1
  69. package/dist/memory/pageindex/chunker.js +5 -5
  70. package/dist/memory/pageindex/chunker.js.map +1 -1
  71. package/dist/memory/pageindex/example.d.ts +1 -1
  72. package/dist/memory/pageindex/example.d.ts.map +1 -1
  73. package/dist/memory/pageindex/example.js +1 -2
  74. package/dist/memory/pageindex/example.js.map +1 -1
  75. package/dist/memory/pageindex/index.d.ts +3 -3
  76. package/dist/memory/pageindex/index.d.ts.map +1 -1
  77. package/dist/memory/pageindex/index.js +1 -1
  78. package/dist/memory/pageindex/index.js.map +1 -1
  79. package/dist/memory/pageindex/service.d.ts +11 -2
  80. package/dist/memory/pageindex/service.d.ts.map +1 -1
  81. package/dist/memory/pageindex/service.js +12 -11
  82. package/dist/memory/pageindex/service.js.map +1 -1
  83. package/dist/memory/persist.d.ts.map +1 -1
  84. package/dist/memory/persist.js +10 -3
  85. package/dist/memory/persist.js.map +1 -1
  86. package/dist/memory/privacy.d.ts.map +1 -1
  87. package/dist/memory/privacy.js +45 -6
  88. package/dist/memory/privacy.js.map +1 -1
  89. package/dist/memory/sqlite.d.ts +1 -13
  90. package/dist/memory/sqlite.d.ts.map +1 -1
  91. package/dist/memory/sqlite.js +45 -27
  92. package/dist/memory/sqlite.js.map +1 -1
  93. package/dist/memory/taxonomy.d.ts.map +1 -1
  94. package/dist/memory/taxonomy.js +6 -1
  95. package/dist/memory/taxonomy.js.map +1 -1
  96. package/dist/pipeline/degrade.d.ts +61 -0
  97. package/dist/pipeline/degrade.d.ts.map +1 -0
  98. package/dist/pipeline/degrade.js +58 -0
  99. package/dist/pipeline/degrade.js.map +1 -0
  100. package/dist/pipeline/enrich.d.ts +29 -0
  101. package/dist/pipeline/enrich.d.ts.map +1 -0
  102. package/dist/pipeline/enrich.js +271 -0
  103. package/dist/pipeline/enrich.js.map +1 -0
  104. package/dist/pipeline/execute.d.ts +22 -0
  105. package/dist/pipeline/execute.d.ts.map +1 -0
  106. package/dist/pipeline/execute.js +250 -0
  107. package/dist/pipeline/execute.js.map +1 -0
  108. package/dist/pipeline/finalize.d.ts +26 -0
  109. package/dist/pipeline/finalize.d.ts.map +1 -0
  110. package/dist/pipeline/finalize.js +52 -0
  111. package/dist/pipeline/finalize.js.map +1 -0
  112. package/dist/pipeline/gather-context.d.ts +25 -0
  113. package/dist/pipeline/gather-context.d.ts.map +1 -0
  114. package/dist/pipeline/gather-context.js +169 -0
  115. package/dist/pipeline/gather-context.js.map +1 -0
  116. package/dist/pipeline/gather-safe.d.ts +39 -0
  117. package/dist/pipeline/gather-safe.d.ts.map +1 -0
  118. package/dist/pipeline/gather-safe.js +127 -0
  119. package/dist/pipeline/gather-safe.js.map +1 -0
  120. package/dist/pipeline/prepare-graph.d.ts +54 -0
  121. package/dist/pipeline/prepare-graph.d.ts.map +1 -0
  122. package/dist/pipeline/prepare-graph.js +174 -0
  123. package/dist/pipeline/prepare-graph.js.map +1 -0
  124. package/dist/pipeline/prepare.d.ts +40 -0
  125. package/dist/pipeline/prepare.d.ts.map +1 -0
  126. package/dist/pipeline/prepare.js +233 -0
  127. package/dist/pipeline/prepare.js.map +1 -0
  128. package/dist/pipeline/providers.d.ts +54 -0
  129. package/dist/pipeline/providers.d.ts.map +1 -0
  130. package/dist/pipeline/providers.js +163 -0
  131. package/dist/pipeline/providers.js.map +1 -0
  132. package/dist/pipeline/results.d.ts +35 -0
  133. package/dist/pipeline/results.d.ts.map +1 -0
  134. package/dist/pipeline/results.js +122 -0
  135. package/dist/pipeline/results.js.map +1 -0
  136. package/dist/pipeline/state.d.ts +92 -0
  137. package/dist/pipeline/state.d.ts.map +1 -0
  138. package/dist/pipeline/state.js +13 -0
  139. package/dist/pipeline/state.js.map +1 -0
  140. package/dist/pipeline.d.ts +10 -9
  141. package/dist/pipeline.d.ts.map +1 -1
  142. package/dist/pipeline.js +36 -1213
  143. package/dist/pipeline.js.map +1 -1
  144. package/dist/providers/gateway.d.ts.map +1 -1
  145. package/dist/providers/gateway.js +8 -0
  146. package/dist/providers/gateway.js.map +1 -1
  147. package/dist/recursive/index.d.ts +1 -0
  148. package/dist/recursive/index.d.ts.map +1 -1
  149. package/dist/recursive/index.js +7 -3
  150. package/dist/recursive/index.js.map +1 -1
  151. package/dist/recursive/patch-extractor.d.ts +58 -6
  152. package/dist/recursive/patch-extractor.d.ts.map +1 -1
  153. package/dist/recursive/patch-extractor.js +207 -26
  154. package/dist/recursive/patch-extractor.js.map +1 -1
  155. package/dist/sanitize.d.ts +51 -0
  156. package/dist/sanitize.d.ts.map +1 -0
  157. package/dist/sanitize.js +90 -0
  158. package/dist/sanitize.js.map +1 -0
  159. package/dist/scope/diff-mapper.d.ts +12 -0
  160. package/dist/scope/diff-mapper.d.ts.map +1 -1
  161. package/dist/scope/diff-mapper.js +25 -18
  162. package/dist/scope/diff-mapper.js.map +1 -1
  163. package/dist/scope/entity-diff.d.ts +21 -4
  164. package/dist/scope/entity-diff.d.ts.map +1 -1
  165. package/dist/scope/entity-diff.js +132 -34
  166. package/dist/scope/entity-diff.js.map +1 -1
  167. package/dist/scope/types.d.ts +10 -0
  168. package/dist/scope/types.d.ts.map +1 -1
  169. package/dist/search/index.d.ts +1 -1
  170. package/dist/search/index.d.ts.map +1 -1
  171. package/dist/search/index.js.map +1 -1
  172. package/dist/search/indexer.d.ts.map +1 -1
  173. package/dist/search/indexer.js +33 -4
  174. package/dist/search/indexer.js.map +1 -1
  175. package/dist/search/searcher.d.ts.map +1 -1
  176. package/dist/search/searcher.js.map +1 -1
  177. package/dist/semantic-diff/index.d.ts +25 -2
  178. package/dist/semantic-diff/index.d.ts.map +1 -1
  179. package/dist/semantic-diff/index.js +147 -53
  180. package/dist/semantic-diff/index.js.map +1 -1
  181. package/dist/tools/gitleaks-config.toml +35 -0
  182. package/dist/tools/plugins/gitleaks.d.ts +10 -0
  183. package/dist/tools/plugins/gitleaks.d.ts.map +1 -1
  184. package/dist/tools/plugins/gitleaks.js +29 -2
  185. package/dist/tools/plugins/gitleaks.js.map +1 -1
  186. package/dist/tools/plugins/semgrep.d.ts +11 -0
  187. package/dist/tools/plugins/semgrep.d.ts.map +1 -1
  188. package/dist/tools/plugins/semgrep.js +30 -1
  189. package/dist/tools/plugins/semgrep.js.map +1 -1
  190. package/dist/tools/semgrep-rules.yml +305 -0
  191. package/dist/types.d.ts +51 -1
  192. package/dist/types.d.ts.map +1 -1
  193. package/dist/types.js.map +1 -1
  194. package/dist/utils/diff.d.ts +22 -2
  195. package/dist/utils/diff.d.ts.map +1 -1
  196. package/dist/utils/diff.js +36 -40
  197. package/dist/utils/diff.js.map +1 -1
  198. package/package.json +21 -22
  199. package/dist/providers/fallback.d.ts +0 -54
  200. package/dist/providers/fallback.d.ts.map +0 -1
  201. package/dist/providers/fallback.js +0 -102
  202. package/dist/providers/fallback.js.map +0 -1
  203. package/dist/providers/index.d.ts +0 -49
  204. package/dist/providers/index.d.ts.map +0 -1
  205. package/dist/providers/index.js +0 -146
  206. 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": "2.9.0",
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"}
@@ -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":"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"}