learngraph 0.2.0 → 0.4.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 (76) hide show
  1. package/README.md +82 -1
  2. package/dist/cjs/llm/adapters/anthropic.js +124 -0
  3. package/dist/cjs/llm/adapters/anthropic.js.map +1 -0
  4. package/dist/cjs/llm/adapters/base.js +100 -0
  5. package/dist/cjs/llm/adapters/base.js.map +1 -0
  6. package/dist/cjs/llm/adapters/gemini.js +156 -0
  7. package/dist/cjs/llm/adapters/gemini.js.map +1 -0
  8. package/dist/cjs/llm/adapters/index.js +33 -0
  9. package/dist/cjs/llm/adapters/index.js.map +1 -0
  10. package/dist/cjs/llm/adapters/mediapipe.js +290 -0
  11. package/dist/cjs/llm/adapters/mediapipe.js.map +1 -0
  12. package/dist/cjs/llm/adapters/ollama.js +149 -0
  13. package/dist/cjs/llm/adapters/ollama.js.map +1 -0
  14. package/dist/cjs/llm/adapters/openai.js +126 -0
  15. package/dist/cjs/llm/adapters/openai.js.map +1 -0
  16. package/dist/cjs/llm/adapters/openrouter.js +190 -0
  17. package/dist/cjs/llm/adapters/openrouter.js.map +1 -0
  18. package/dist/cjs/llm/index.js +42 -5
  19. package/dist/cjs/llm/index.js.map +1 -1
  20. package/dist/cjs/llm/orchestrator.js +219 -0
  21. package/dist/cjs/llm/orchestrator.js.map +1 -0
  22. package/dist/cjs/llm/prompts.js +367 -0
  23. package/dist/cjs/llm/prompts.js.map +1 -0
  24. package/dist/cjs/types/llm.js +8 -0
  25. package/dist/cjs/types/llm.js.map +1 -0
  26. package/dist/esm/llm/adapters/anthropic.js +119 -0
  27. package/dist/esm/llm/adapters/anthropic.js.map +1 -0
  28. package/dist/esm/llm/adapters/base.js +95 -0
  29. package/dist/esm/llm/adapters/base.js.map +1 -0
  30. package/dist/esm/llm/adapters/gemini.js +151 -0
  31. package/dist/esm/llm/adapters/gemini.js.map +1 -0
  32. package/dist/esm/llm/adapters/index.js +13 -0
  33. package/dist/esm/llm/adapters/index.js.map +1 -0
  34. package/dist/esm/llm/adapters/mediapipe.js +252 -0
  35. package/dist/esm/llm/adapters/mediapipe.js.map +1 -0
  36. package/dist/esm/llm/adapters/ollama.js +144 -0
  37. package/dist/esm/llm/adapters/ollama.js.map +1 -0
  38. package/dist/esm/llm/adapters/openai.js +121 -0
  39. package/dist/esm/llm/adapters/openai.js.map +1 -0
  40. package/dist/esm/llm/adapters/openrouter.js +185 -0
  41. package/dist/esm/llm/adapters/openrouter.js.map +1 -0
  42. package/dist/esm/llm/index.js +12 -6
  43. package/dist/esm/llm/index.js.map +1 -1
  44. package/dist/esm/llm/orchestrator.js +214 -0
  45. package/dist/esm/llm/orchestrator.js.map +1 -0
  46. package/dist/esm/llm/prompts.js +360 -0
  47. package/dist/esm/llm/prompts.js.map +1 -0
  48. package/dist/esm/types/llm.js +7 -0
  49. package/dist/esm/types/llm.js.map +1 -0
  50. package/dist/types/llm/adapters/anthropic.d.ts +21 -0
  51. package/dist/types/llm/adapters/anthropic.d.ts.map +1 -0
  52. package/dist/types/llm/adapters/base.d.ts +46 -0
  53. package/dist/types/llm/adapters/base.d.ts.map +1 -0
  54. package/dist/types/llm/adapters/gemini.d.ts +30 -0
  55. package/dist/types/llm/adapters/gemini.d.ts.map +1 -0
  56. package/dist/types/llm/adapters/index.d.ts +14 -0
  57. package/dist/types/llm/adapters/index.d.ts.map +1 -0
  58. package/dist/types/llm/adapters/mediapipe.d.ts +113 -0
  59. package/dist/types/llm/adapters/mediapipe.d.ts.map +1 -0
  60. package/dist/types/llm/adapters/ollama.d.ts +30 -0
  61. package/dist/types/llm/adapters/ollama.d.ts.map +1 -0
  62. package/dist/types/llm/adapters/openai.d.ts +22 -0
  63. package/dist/types/llm/adapters/openai.d.ts.map +1 -0
  64. package/dist/types/llm/adapters/openrouter.d.ts +58 -0
  65. package/dist/types/llm/adapters/openrouter.d.ts.map +1 -0
  66. package/dist/types/llm/index.d.ts +5 -0
  67. package/dist/types/llm/index.d.ts.map +1 -1
  68. package/dist/types/llm/orchestrator.d.ts +35 -0
  69. package/dist/types/llm/orchestrator.d.ts.map +1 -0
  70. package/dist/types/llm/prompts.d.ts +269 -0
  71. package/dist/types/llm/prompts.d.ts.map +1 -0
  72. package/dist/types/types/index.d.ts +1 -0
  73. package/dist/types/types/index.d.ts.map +1 -1
  74. package/dist/types/types/llm.d.ts +337 -0
  75. package/dist/types/types/llm.d.ts.map +1 -0
  76. package/package.json +6 -2
package/README.md CHANGED
@@ -156,6 +156,81 @@ await storage.connect({
156
156
  });
157
157
  ```
158
158
 
159
+ ## LLM-Powered Curriculum Decomposition
160
+
161
+ LearnGraph can automatically decompose curriculum content into skill graphs using LLMs:
162
+
163
+ ```typescript
164
+ import { createOpenAIAdapter, createOrchestrator } from 'learngraph/llm';
165
+
166
+ // Create an adapter (OpenAI, Anthropic, or Ollama)
167
+ const adapter = createOpenAIAdapter('gpt-4o');
168
+ const orchestrator = createOrchestrator(adapter);
169
+
170
+ // Extract skills from curriculum content
171
+ const extraction = await orchestrator.extractSkills({
172
+ content: `
173
+ Chapter 1: Introduction to Calculus
174
+ - Understand the concept of limits
175
+ - Calculate derivatives using the power rule
176
+ - Apply differentiation to real-world problems
177
+ `,
178
+ domain: 'Mathematics',
179
+ gradeLevel: 'College',
180
+ });
181
+
182
+ console.log(extraction.skills);
183
+ // [{ name: 'Limits', bloomLevel: 'understand', ... }, ...]
184
+
185
+ // Infer prerequisites between skills
186
+ const prerequisites = await orchestrator.inferPrerequisites({
187
+ skills: extraction.skills,
188
+ domain: 'Mathematics',
189
+ });
190
+
191
+ // Full decomposition: skills + prerequisites in one call
192
+ const decomposition = await orchestrator.decompose({
193
+ content: 'Full calculus syllabus here...',
194
+ title: 'Calculus I',
195
+ domain: 'Mathematics',
196
+ });
197
+
198
+ // Returns: { title, skills, prerequisites, skillInputs }
199
+ // skillInputs are ready to insert into storage
200
+ ```
201
+
202
+ ### Supported LLM Providers
203
+
204
+ ```typescript
205
+ import {
206
+ createOpenAIAdapter, // GPT-4o, GPT-4, GPT-3.5
207
+ createAnthropicAdapter, // Claude 3.5, Claude 3
208
+ createOllamaAdapter, // Llama, Mistral, etc.
209
+ } from 'learngraph/llm';
210
+
211
+ // OpenAI (set OPENAI_API_KEY env var)
212
+ const openai = createOpenAIAdapter('gpt-4o');
213
+
214
+ // Anthropic (set ANTHROPIC_API_KEY env var)
215
+ const anthropic = createAnthropicAdapter('claude-3-5-sonnet-20241022');
216
+
217
+ // Ollama (local models, no API key needed)
218
+ const ollama = createOllamaAdapter('llama3.2');
219
+ ```
220
+
221
+ ### Bloom's Taxonomy Analysis
222
+
223
+ Analyze the cognitive level of learning objectives:
224
+
225
+ ```typescript
226
+ const analysis = await orchestrator.analyzeBloomLevel({
227
+ text: 'Compare and contrast mitosis and meiosis',
228
+ });
229
+
230
+ console.log(analysis);
231
+ // { level: 'analyze', confidence: 0.9, indicators: ['compare', 'contrast'] }
232
+ ```
233
+
159
234
  ## Submodule Exports
160
235
 
161
236
  ```typescript
@@ -166,7 +241,13 @@ import { SkillNode, SkillEdge } from 'learngraph';
166
241
  import { MemoryStorage, LevelGraphStorage, Neo4jStorage } from 'learngraph/storage';
167
242
 
168
243
  // LLM integration for curriculum decomposition
169
- import { LLMProvider } from 'learngraph/llm';
244
+ import {
245
+ createOpenAIAdapter,
246
+ createAnthropicAdapter,
247
+ createOllamaAdapter,
248
+ createOrchestrator,
249
+ LLMOrchestrator,
250
+ } from 'learngraph/llm';
170
251
 
171
252
  // Query builders and ZPD calculation
172
253
  import { ZPDResult, LearningPath } from 'learngraph/query';
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ /**
3
+ * Anthropic adapter for LLM integration
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.AnthropicAdapter = void 0;
9
+ exports.createAnthropicAdapter = createAnthropicAdapter;
10
+ const base_js_1 = require("./base.js");
11
+ /**
12
+ * Anthropic adapter for Claude models
13
+ */
14
+ class AnthropicAdapter extends base_js_1.BaseLLMAdapter {
15
+ baseUrl;
16
+ constructor(config) {
17
+ super(config);
18
+ this.baseUrl = config.baseUrl ?? 'https://api.anthropic.com/v1';
19
+ }
20
+ get provider() {
21
+ return 'anthropic';
22
+ }
23
+ async complete(request) {
24
+ if (!this.isConfigured()) {
25
+ throw new base_js_1.LLMError('Anthropic adapter not configured. Set ANTHROPIC_API_KEY or pass apiKey in config.', 'NOT_CONFIGURED', this.provider);
26
+ }
27
+ return this.withRetry(async () => {
28
+ // Extract system message
29
+ const systemMessage = request.messages.find((m) => m.role === 'system');
30
+ const otherMessages = request.messages.filter((m) => m.role !== 'system');
31
+ const headers = {
32
+ 'Content-Type': 'application/json',
33
+ 'x-api-key': this.config.apiKey,
34
+ 'anthropic-version': '2023-06-01',
35
+ };
36
+ const body = {
37
+ model: this.config.model,
38
+ messages: otherMessages.map((m) => ({
39
+ role: m.role,
40
+ content: m.content,
41
+ })),
42
+ max_tokens: request.maxTokens ?? this.config.maxTokens ?? base_js_1.DEFAULT_CONFIG.maxTokens,
43
+ };
44
+ // Add system message if present
45
+ if (systemMessage) {
46
+ body.system = systemMessage.content;
47
+ }
48
+ // Temperature (Anthropic uses 0-1 scale like OpenAI)
49
+ const temp = request.temperature ?? this.config.temperature ?? base_js_1.DEFAULT_CONFIG.temperature;
50
+ if (temp !== undefined) {
51
+ body.temperature = temp;
52
+ }
53
+ const controller = new AbortController();
54
+ const timeout = setTimeout(() => controller.abort(), this.config.timeout ?? base_js_1.DEFAULT_CONFIG.timeout);
55
+ try {
56
+ const response = await fetch(`${this.baseUrl}/messages`, {
57
+ method: 'POST',
58
+ headers,
59
+ body: JSON.stringify(body),
60
+ signal: controller.signal,
61
+ });
62
+ clearTimeout(timeout);
63
+ if (!response.ok) {
64
+ const errorData = (await response.json().catch(() => ({})));
65
+ const errorMessage = errorData.error?.message ?? `HTTP ${response.status}`;
66
+ if (response.status === 429) {
67
+ throw new base_js_1.LLMError(`Rate limit exceeded: ${errorMessage}`, 'RATE_LIMIT', this.provider);
68
+ }
69
+ throw new base_js_1.LLMError(`Anthropic API error: ${errorMessage}`, 'API_ERROR', this.provider);
70
+ }
71
+ const data = (await response.json());
72
+ // Get text content
73
+ const textBlock = data.content.find((block) => block.type === 'text');
74
+ const content = textBlock?.text ?? '';
75
+ let json;
76
+ if (request.responseFormat === 'json') {
77
+ json = this.parseJSON(content);
78
+ }
79
+ return {
80
+ content,
81
+ json,
82
+ usage: {
83
+ promptTokens: data.usage.input_tokens,
84
+ completionTokens: data.usage.output_tokens,
85
+ totalTokens: data.usage.input_tokens + data.usage.output_tokens,
86
+ },
87
+ model: data.model,
88
+ finishReason: data.stop_reason === 'end_turn' ? 'stop' :
89
+ data.stop_reason === 'max_tokens' ? 'length' : 'error',
90
+ };
91
+ }
92
+ catch (error) {
93
+ clearTimeout(timeout);
94
+ if (error instanceof base_js_1.LLMError) {
95
+ throw error;
96
+ }
97
+ if (error instanceof Error) {
98
+ if (error.name === 'AbortError') {
99
+ throw new base_js_1.LLMError('Request timeout', 'TIMEOUT', this.provider, error);
100
+ }
101
+ throw new base_js_1.LLMError(`Network error: ${error.message}`, 'NETWORK_ERROR', this.provider, error);
102
+ }
103
+ throw new base_js_1.LLMError('Unknown error', 'API_ERROR', this.provider);
104
+ }
105
+ });
106
+ }
107
+ }
108
+ exports.AnthropicAdapter = AnthropicAdapter;
109
+ /**
110
+ * Create an Anthropic adapter from environment variables
111
+ */
112
+ function createAnthropicAdapter(model = 'claude-3-5-sonnet-20241022', overrides) {
113
+ const apiKey = typeof process !== 'undefined' ? process.env.ANTHROPIC_API_KEY : undefined;
114
+ const config = {
115
+ provider: 'anthropic',
116
+ model,
117
+ ...overrides,
118
+ };
119
+ if (apiKey) {
120
+ config.apiKey = apiKey;
121
+ }
122
+ return new AnthropicAdapter(config);
123
+ }
124
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../../src/llm/adapters/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ /**
3
+ * Base adapter class for LLM providers
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.BaseLLMAdapter = exports.DEFAULT_CONFIG = exports.LLMError = void 0;
9
+ /**
10
+ * LLM-related errors
11
+ */
12
+ class LLMError extends Error {
13
+ code;
14
+ provider;
15
+ cause;
16
+ constructor(message, code, provider, cause) {
17
+ super(message);
18
+ this.code = code;
19
+ this.provider = provider;
20
+ this.cause = cause;
21
+ this.name = 'LLMError';
22
+ }
23
+ }
24
+ exports.LLMError = LLMError;
25
+ /**
26
+ * Default configuration values
27
+ */
28
+ exports.DEFAULT_CONFIG = {
29
+ maxTokens: 4096,
30
+ temperature: 0.3,
31
+ timeout: 60000,
32
+ retries: 2,
33
+ };
34
+ /**
35
+ * Abstract base class for LLM adapters
36
+ */
37
+ class BaseLLMAdapter {
38
+ config;
39
+ constructor(config) {
40
+ this.config = {
41
+ ...exports.DEFAULT_CONFIG,
42
+ ...config,
43
+ };
44
+ }
45
+ get model() {
46
+ return this.config.model;
47
+ }
48
+ isConfigured() {
49
+ if (this.provider === 'ollama') {
50
+ return !!this.config.model;
51
+ }
52
+ return !!this.config.apiKey && !!this.config.model;
53
+ }
54
+ getConfig() {
55
+ const { apiKey: _, ...rest } = this.config;
56
+ return rest;
57
+ }
58
+ /**
59
+ * Retry a function with exponential backoff
60
+ */
61
+ async withRetry(fn, maxRetries = this.config.retries ?? exports.DEFAULT_CONFIG.retries) {
62
+ let lastError;
63
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
64
+ try {
65
+ return await fn();
66
+ }
67
+ catch (error) {
68
+ lastError = error instanceof Error ? error : new Error(String(error));
69
+ // Don't retry on certain errors
70
+ if (error instanceof LLMError) {
71
+ if (error.code === 'NOT_CONFIGURED' || error.code === 'INVALID_RESPONSE') {
72
+ throw error;
73
+ }
74
+ }
75
+ if (attempt < maxRetries) {
76
+ // Exponential backoff: 1s, 2s, 4s, ...
77
+ const delay = Math.pow(2, attempt) * 1000;
78
+ await new Promise((resolve) => setTimeout(resolve, delay));
79
+ }
80
+ }
81
+ }
82
+ throw lastError;
83
+ }
84
+ /**
85
+ * Parse JSON from LLM response, handling common issues
86
+ */
87
+ parseJSON(content) {
88
+ // Try to extract JSON from markdown code blocks
89
+ const jsonMatch = content.match(/```(?:json)?\s*([\s\S]*?)```/);
90
+ const jsonStr = jsonMatch && jsonMatch[1] ? jsonMatch[1].trim() : content.trim();
91
+ try {
92
+ return JSON.parse(jsonStr);
93
+ }
94
+ catch (error) {
95
+ throw new LLMError(`Failed to parse JSON response: ${error instanceof Error ? error.message : 'Unknown error'}`, 'PARSE_ERROR', this.provider, error instanceof Error ? error : undefined);
96
+ }
97
+ }
98
+ }
99
+ exports.BaseLLMAdapter = BaseLLMAdapter;
100
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/llm/adapters/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ /**
3
+ * Google Gemini LLM adapter
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.GeminiAdapter = void 0;
9
+ exports.createGeminiAdapter = createGeminiAdapter;
10
+ const base_js_1 = require("./base.js");
11
+ /**
12
+ * Adapter for Google Gemini models
13
+ *
14
+ * Supports:
15
+ * - gemini-2.0-flash-exp
16
+ * - gemini-1.5-pro
17
+ * - gemini-1.5-flash
18
+ * - gemini-1.0-pro
19
+ */
20
+ class GeminiAdapter extends base_js_1.BaseLLMAdapter {
21
+ baseUrl;
22
+ constructor(config) {
23
+ super(config);
24
+ // Use Google AI Studio API by default
25
+ this.baseUrl =
26
+ config.baseUrl ?? 'https://generativelanguage.googleapis.com/v1beta';
27
+ }
28
+ get provider() {
29
+ return 'gemini';
30
+ }
31
+ async complete(request) {
32
+ if (!this.isConfigured()) {
33
+ throw new base_js_1.LLMError('Gemini adapter is not configured. Set GOOGLE_API_KEY or GEMINI_API_KEY environment variable.', 'NOT_CONFIGURED', this.provider);
34
+ }
35
+ const geminiRequest = this.buildRequest(request);
36
+ try {
37
+ const response = await this.executeRequest(geminiRequest);
38
+ return this.parseResponse(response);
39
+ }
40
+ catch (error) {
41
+ if (error instanceof base_js_1.LLMError) {
42
+ throw error;
43
+ }
44
+ throw new base_js_1.LLMError(`Gemini API request failed: ${error instanceof Error ? error.message : 'Unknown error'}`, 'API_ERROR', this.provider, error instanceof Error ? error : undefined);
45
+ }
46
+ }
47
+ buildRequest(request) {
48
+ const geminiRequest = {
49
+ contents: [],
50
+ generationConfig: {
51
+ maxOutputTokens: request.maxTokens ?? this.config.maxTokens ?? 4096,
52
+ temperature: request.temperature ?? this.config.temperature ?? 0.3,
53
+ },
54
+ };
55
+ // Handle JSON response format
56
+ if (request.responseFormat === 'json') {
57
+ geminiRequest.generationConfig.responseMimeType = 'application/json';
58
+ }
59
+ // Convert messages to Gemini format
60
+ for (const message of request.messages) {
61
+ if (message.role === 'system') {
62
+ // Gemini uses systemInstruction for system messages
63
+ geminiRequest.systemInstruction = {
64
+ parts: [{ text: message.content }],
65
+ };
66
+ }
67
+ else {
68
+ geminiRequest.contents.push({
69
+ role: message.role === 'assistant' ? 'model' : 'user',
70
+ parts: [{ text: message.content }],
71
+ });
72
+ }
73
+ }
74
+ return geminiRequest;
75
+ }
76
+ async executeRequest(request) {
77
+ const url = `${this.baseUrl}/models/${this.config.model}:generateContent?key=${this.config.apiKey}`;
78
+ const response = await fetch(url, {
79
+ method: 'POST',
80
+ headers: {
81
+ 'Content-Type': 'application/json',
82
+ },
83
+ body: JSON.stringify(request),
84
+ signal: AbortSignal.timeout(this.config.timeout ?? 60000),
85
+ });
86
+ if (!response.ok) {
87
+ const errorBody = await response.text();
88
+ let errorMessage = `HTTP ${response.status}`;
89
+ try {
90
+ const errorJson = JSON.parse(errorBody);
91
+ errorMessage = errorJson.error?.message ?? errorMessage;
92
+ }
93
+ catch {
94
+ errorMessage = errorBody || errorMessage;
95
+ }
96
+ if (response.status === 429) {
97
+ throw new base_js_1.LLMError(`Rate limit exceeded: ${errorMessage}`, 'RATE_LIMIT', this.provider);
98
+ }
99
+ throw new base_js_1.LLMError(`Gemini API error: ${errorMessage}`, 'API_ERROR', this.provider);
100
+ }
101
+ return response.json();
102
+ }
103
+ parseResponse(response) {
104
+ if (!response.candidates || response.candidates.length === 0) {
105
+ throw new base_js_1.LLMError('No candidates in Gemini response', 'INVALID_RESPONSE', this.provider);
106
+ }
107
+ const candidate = response.candidates[0];
108
+ if (!candidate) {
109
+ throw new base_js_1.LLMError('No candidate in Gemini response', 'INVALID_RESPONSE', this.provider);
110
+ }
111
+ const content = candidate.content.parts.map((p) => p.text).join('');
112
+ // Try to parse JSON if present
113
+ let json;
114
+ try {
115
+ json = this.parseJSON(content);
116
+ }
117
+ catch {
118
+ // Not JSON, that's fine
119
+ }
120
+ // Map Gemini finish reasons to our standard format
121
+ const finishReason = candidate.finishReason === 'STOP' ? 'stop' :
122
+ candidate.finishReason === 'MAX_TOKENS' ? 'length' :
123
+ candidate.finishReason === 'SAFETY' ? 'content_filter' : 'stop';
124
+ return {
125
+ content,
126
+ json,
127
+ usage: {
128
+ promptTokens: response.usageMetadata?.promptTokenCount ?? 0,
129
+ completionTokens: response.usageMetadata?.candidatesTokenCount ?? 0,
130
+ totalTokens: response.usageMetadata?.totalTokenCount ?? 0,
131
+ },
132
+ model: this.config.model,
133
+ finishReason,
134
+ };
135
+ }
136
+ }
137
+ exports.GeminiAdapter = GeminiAdapter;
138
+ /**
139
+ * Create a Gemini adapter from environment variables
140
+ */
141
+ function createGeminiAdapter(model = 'gemini-2.0-flash-exp', overrides) {
142
+ // Support both GOOGLE_API_KEY and GEMINI_API_KEY
143
+ const apiKey = typeof process !== 'undefined'
144
+ ? process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY
145
+ : undefined;
146
+ const config = {
147
+ provider: 'gemini',
148
+ model,
149
+ ...overrides,
150
+ };
151
+ if (apiKey) {
152
+ config.apiKey = apiKey;
153
+ }
154
+ return new GeminiAdapter(config);
155
+ }
156
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../../src/llm/adapters/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ /**
3
+ * LLM adapter exports
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.MEDIAPIPE_MODELS = exports.createMediaPipeAdapter = exports.MediaPipeAdapter = exports.OPENROUTER_MODELS = exports.createOpenRouterAdapter = exports.OpenRouterAdapter = exports.createGeminiAdapter = exports.GeminiAdapter = exports.createOllamaAdapter = exports.OllamaAdapter = exports.createAnthropicAdapter = exports.AnthropicAdapter = exports.createOpenAIAdapter = exports.OpenAIAdapter = exports.DEFAULT_CONFIG = exports.LLMError = exports.BaseLLMAdapter = void 0;
9
+ var base_js_1 = require("./base.js");
10
+ Object.defineProperty(exports, "BaseLLMAdapter", { enumerable: true, get: function () { return base_js_1.BaseLLMAdapter; } });
11
+ Object.defineProperty(exports, "LLMError", { enumerable: true, get: function () { return base_js_1.LLMError; } });
12
+ Object.defineProperty(exports, "DEFAULT_CONFIG", { enumerable: true, get: function () { return base_js_1.DEFAULT_CONFIG; } });
13
+ var openai_js_1 = require("./openai.js");
14
+ Object.defineProperty(exports, "OpenAIAdapter", { enumerable: true, get: function () { return openai_js_1.OpenAIAdapter; } });
15
+ Object.defineProperty(exports, "createOpenAIAdapter", { enumerable: true, get: function () { return openai_js_1.createOpenAIAdapter; } });
16
+ var anthropic_js_1 = require("./anthropic.js");
17
+ Object.defineProperty(exports, "AnthropicAdapter", { enumerable: true, get: function () { return anthropic_js_1.AnthropicAdapter; } });
18
+ Object.defineProperty(exports, "createAnthropicAdapter", { enumerable: true, get: function () { return anthropic_js_1.createAnthropicAdapter; } });
19
+ var ollama_js_1 = require("./ollama.js");
20
+ Object.defineProperty(exports, "OllamaAdapter", { enumerable: true, get: function () { return ollama_js_1.OllamaAdapter; } });
21
+ Object.defineProperty(exports, "createOllamaAdapter", { enumerable: true, get: function () { return ollama_js_1.createOllamaAdapter; } });
22
+ var gemini_js_1 = require("./gemini.js");
23
+ Object.defineProperty(exports, "GeminiAdapter", { enumerable: true, get: function () { return gemini_js_1.GeminiAdapter; } });
24
+ Object.defineProperty(exports, "createGeminiAdapter", { enumerable: true, get: function () { return gemini_js_1.createGeminiAdapter; } });
25
+ var openrouter_js_1 = require("./openrouter.js");
26
+ Object.defineProperty(exports, "OpenRouterAdapter", { enumerable: true, get: function () { return openrouter_js_1.OpenRouterAdapter; } });
27
+ Object.defineProperty(exports, "createOpenRouterAdapter", { enumerable: true, get: function () { return openrouter_js_1.createOpenRouterAdapter; } });
28
+ Object.defineProperty(exports, "OPENROUTER_MODELS", { enumerable: true, get: function () { return openrouter_js_1.OPENROUTER_MODELS; } });
29
+ var mediapipe_js_1 = require("./mediapipe.js");
30
+ Object.defineProperty(exports, "MediaPipeAdapter", { enumerable: true, get: function () { return mediapipe_js_1.MediaPipeAdapter; } });
31
+ Object.defineProperty(exports, "createMediaPipeAdapter", { enumerable: true, get: function () { return mediapipe_js_1.createMediaPipeAdapter; } });
32
+ Object.defineProperty(exports, "MEDIAPIPE_MODELS", { enumerable: true, get: function () { return mediapipe_js_1.MEDIAPIPE_MODELS; } });
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/llm/adapters/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,qCAAqE;AAA5D,yGAAA,cAAc,OAAA;AAAE,mGAAA,QAAQ,OAAA;AAAE,yGAAA,cAAc,OAAA;AAGjD,yCAAiE;AAAxD,0GAAA,aAAa,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAC3C,+CAA0E;AAAjE,gHAAA,gBAAgB,OAAA;AAAE,sHAAA,sBAAsB,OAAA;AACjD,yCAAiE;AAAxD,0GAAA,aAAa,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAC3C,yCAAiE;AAAxD,0GAAA,aAAa,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAC3C,iDAAgG;AAAvF,kHAAA,iBAAiB,OAAA;AAAE,wHAAA,uBAAuB,OAAA;AAAE,kHAAA,iBAAiB,OAAA;AACtE,+CAA4F;AAAnF,gHAAA,gBAAgB,OAAA;AAAE,sHAAA,sBAAsB,OAAA;AAAE,gHAAA,gBAAgB,OAAA"}