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
@@ -0,0 +1,290 @@
1
+ "use strict";
2
+ /**
3
+ * MediaPipe LLM Inference adapter for local Gemma models
4
+ *
5
+ * This adapter integrates with Google's MediaPipe LLM Inference Task API
6
+ * to run Gemma models locally using WebGPU acceleration.
7
+ *
8
+ * Supported models:
9
+ * - Gemma 2B / 7B
10
+ * - Gemma 2 2B
11
+ * - Gemma 3n (2B, 4B parameters)
12
+ *
13
+ * Requirements:
14
+ * - WebGPU-capable browser or Node.js with WebGPU support
15
+ * - @mediapipe/tasks-genai package
16
+ * - Downloaded model weights (.bin file)
17
+ *
18
+ * @packageDocumentation
19
+ */
20
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ var desc = Object.getOwnPropertyDescriptor(m, k);
23
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
24
+ desc = { enumerable: true, get: function() { return m[k]; } };
25
+ }
26
+ Object.defineProperty(o, k2, desc);
27
+ }) : (function(o, m, k, k2) {
28
+ if (k2 === undefined) k2 = k;
29
+ o[k2] = m[k];
30
+ }));
31
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
32
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
33
+ }) : function(o, v) {
34
+ o["default"] = v;
35
+ });
36
+ var __importStar = (this && this.__importStar) || (function () {
37
+ var ownKeys = function(o) {
38
+ ownKeys = Object.getOwnPropertyNames || function (o) {
39
+ var ar = [];
40
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
41
+ return ar;
42
+ };
43
+ return ownKeys(o);
44
+ };
45
+ return function (mod) {
46
+ if (mod && mod.__esModule) return mod;
47
+ var result = {};
48
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
49
+ __setModuleDefault(result, mod);
50
+ return result;
51
+ };
52
+ })();
53
+ Object.defineProperty(exports, "__esModule", { value: true });
54
+ exports.MediaPipeAdapter = exports.MEDIAPIPE_MODELS = void 0;
55
+ exports.createMediaPipeAdapter = createMediaPipeAdapter;
56
+ const base_js_1 = require("./base.js");
57
+ /**
58
+ * Gemma model variants for MediaPipe
59
+ */
60
+ exports.MEDIAPIPE_MODELS = {
61
+ 'gemma-2b': 'gemma-2b-it-gpu-int4.bin',
62
+ 'gemma-7b': 'gemma-7b-it-gpu-int8.bin',
63
+ 'gemma2-2b': 'gemma2-2b-it-gpu-int4.bin',
64
+ 'gemma3n-e2b': 'gemma-3n-E2B-it-int4.task',
65
+ 'gemma3n-e4b': 'gemma-3n-E4B-it-int4.task',
66
+ };
67
+ /**
68
+ * Adapter for MediaPipe LLM Inference API
69
+ *
70
+ * Runs Gemma models locally using WebGPU acceleration.
71
+ * The adapter lazily loads the model on first use.
72
+ *
73
+ * @example
74
+ * ```typescript
75
+ * import { MediaPipeAdapter } from 'learngraph/llm';
76
+ *
77
+ * const adapter = new MediaPipeAdapter({
78
+ * provider: 'mediapipe',
79
+ * model: 'gemma3n-e2b',
80
+ * modelPath: '/models/gemma-3n-E2B-it-int4.task',
81
+ * });
82
+ *
83
+ * // Use with orchestrator
84
+ * const orchestrator = createOrchestrator(adapter);
85
+ * ```
86
+ */
87
+ class MediaPipeAdapter extends base_js_1.BaseLLMAdapter {
88
+ inference = null;
89
+ modelPath;
90
+ randomSeed;
91
+ topK;
92
+ loraRanks;
93
+ initPromise = null;
94
+ constructor(config) {
95
+ super(config);
96
+ this.modelPath = config.modelPath;
97
+ this.topK = config.topK ?? 40;
98
+ if (config.randomSeed !== undefined) {
99
+ this.randomSeed = config.randomSeed;
100
+ }
101
+ if (config.loraRanks !== undefined) {
102
+ this.loraRanks = config.loraRanks;
103
+ }
104
+ }
105
+ get provider() {
106
+ return 'mediapipe';
107
+ }
108
+ /**
109
+ * Check if MediaPipe is configured (model path exists)
110
+ */
111
+ isConfigured() {
112
+ return !!this.modelPath;
113
+ }
114
+ /**
115
+ * Initialize the MediaPipe LLM Inference engine
116
+ * Called automatically on first request
117
+ */
118
+ async initialize() {
119
+ if (this.inference) {
120
+ return;
121
+ }
122
+ // Prevent multiple simultaneous initializations
123
+ if (this.initPromise) {
124
+ return this.initPromise;
125
+ }
126
+ this.initPromise = this.doInitialize();
127
+ await this.initPromise;
128
+ }
129
+ async doInitialize() {
130
+ try {
131
+ // Dynamic import of MediaPipe
132
+ // Users must install @mediapipe/tasks-genai separately
133
+ const mediapipe = await this.loadMediaPipe();
134
+ const maxTokens = this.config.maxTokens ?? 1024;
135
+ const temperature = this.config.temperature ?? 0.3;
136
+ const options = {
137
+ baseOptions: {
138
+ modelAssetPath: this.modelPath,
139
+ },
140
+ maxTokens,
141
+ temperature,
142
+ topK: this.topK,
143
+ };
144
+ if (this.randomSeed !== undefined) {
145
+ options.randomSeed = this.randomSeed;
146
+ }
147
+ if (this.loraRanks !== undefined) {
148
+ options.loraRanks = this.loraRanks;
149
+ }
150
+ this.inference = await mediapipe.LlmInference.createFromOptions(options);
151
+ }
152
+ catch (error) {
153
+ this.initPromise = null;
154
+ throw new base_js_1.LLMError(`Failed to initialize MediaPipe: ${error instanceof Error ? error.message : 'Unknown error'}. ` +
155
+ 'Make sure @mediapipe/tasks-genai is installed and the model file exists.', 'NOT_CONFIGURED', this.provider, error instanceof Error ? error : undefined);
156
+ }
157
+ }
158
+ /**
159
+ * Load MediaPipe library dynamically
160
+ */
161
+ async loadMediaPipe() {
162
+ try {
163
+ // Try to import the MediaPipe package dynamically
164
+ // @ts-expect-error - Dynamic import of optional dependency
165
+ const module = await Promise.resolve().then(() => __importStar(require('@mediapipe/tasks-genai')));
166
+ return module;
167
+ }
168
+ catch {
169
+ throw new Error('MediaPipe tasks-genai not found. Install it with: npm install @mediapipe/tasks-genai');
170
+ }
171
+ }
172
+ async complete(request) {
173
+ if (!this.isConfigured()) {
174
+ throw new base_js_1.LLMError('MediaPipe adapter is not configured. Provide modelPath in config.', 'NOT_CONFIGURED', this.provider);
175
+ }
176
+ // Initialize on first use
177
+ await this.initialize();
178
+ if (!this.inference) {
179
+ throw new base_js_1.LLMError('MediaPipe inference engine not initialized', 'NOT_CONFIGURED', this.provider);
180
+ }
181
+ // Build prompt from messages
182
+ const prompt = this.buildPrompt(request);
183
+ try {
184
+ const response = await this.inference.generateResponse(prompt);
185
+ return this.parseGeneratedResponse(response, prompt);
186
+ }
187
+ catch (error) {
188
+ throw new base_js_1.LLMError(`MediaPipe generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`, 'API_ERROR', this.provider, error instanceof Error ? error : undefined);
189
+ }
190
+ }
191
+ /**
192
+ * Build a prompt string from chat messages
193
+ * Uses Gemma's instruction format
194
+ */
195
+ buildPrompt(request) {
196
+ const parts = [];
197
+ for (const message of request.messages) {
198
+ switch (message.role) {
199
+ case 'system':
200
+ // Gemma uses <start_of_turn> format
201
+ parts.push(`<start_of_turn>user\n${message.content}<end_of_turn>`);
202
+ break;
203
+ case 'user':
204
+ parts.push(`<start_of_turn>user\n${message.content}<end_of_turn>`);
205
+ break;
206
+ case 'assistant':
207
+ parts.push(`<start_of_turn>model\n${message.content}<end_of_turn>`);
208
+ break;
209
+ }
210
+ }
211
+ // Add model turn prefix
212
+ parts.push('<start_of_turn>model\n');
213
+ // Add JSON format instruction if requested
214
+ if (request.responseFormat === 'json') {
215
+ return parts.join('\n') + '\nRespond with valid JSON only:\n';
216
+ }
217
+ return parts.join('\n');
218
+ }
219
+ /**
220
+ * Parse the generated response
221
+ */
222
+ parseGeneratedResponse(response, prompt) {
223
+ // Estimate tokens (rough approximation: ~4 chars per token)
224
+ const promptTokens = Math.ceil(prompt.length / 4);
225
+ const completionTokens = Math.ceil(response.length / 4);
226
+ // Try to parse JSON if present
227
+ let json;
228
+ try {
229
+ json = this.parseJSON(response);
230
+ }
231
+ catch {
232
+ // Not JSON, that's fine
233
+ }
234
+ return {
235
+ content: response,
236
+ json,
237
+ usage: {
238
+ promptTokens,
239
+ completionTokens,
240
+ totalTokens: promptTokens + completionTokens,
241
+ },
242
+ model: this.config.model,
243
+ finishReason: 'stop', // MediaPipe doesn't provide finish reason, assume stop
244
+ };
245
+ }
246
+ /**
247
+ * Close the inference engine and release resources
248
+ */
249
+ close() {
250
+ if (this.inference) {
251
+ this.inference.close();
252
+ this.inference = null;
253
+ this.initPromise = null;
254
+ }
255
+ }
256
+ }
257
+ exports.MediaPipeAdapter = MediaPipeAdapter;
258
+ /**
259
+ * Create a MediaPipe adapter for local Gemma models
260
+ *
261
+ * @param modelPath - Path to the model file (.bin or .task)
262
+ * @param model - Model identifier (for reference)
263
+ * @param overrides - Additional configuration options
264
+ *
265
+ * @example
266
+ * ```typescript
267
+ * // Using a Gemma 3n model
268
+ * const adapter = createMediaPipeAdapter(
269
+ * '/models/gemma-3n-E2B-it-int4.task',
270
+ * 'gemma3n-e2b'
271
+ * );
272
+ *
273
+ * // With custom options
274
+ * const adapter = createMediaPipeAdapter(
275
+ * '/models/gemma2-2b-it-gpu-int4.bin',
276
+ * 'gemma2-2b',
277
+ * { maxTokens: 2048, temperature: 0.5 }
278
+ * );
279
+ * ```
280
+ */
281
+ function createMediaPipeAdapter(modelPath, model = 'gemma3n', overrides) {
282
+ const config = {
283
+ provider: 'mediapipe',
284
+ model,
285
+ modelPath,
286
+ ...overrides,
287
+ };
288
+ return new MediaPipeAdapter(config);
289
+ }
290
+ //# sourceMappingURL=mediapipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mediapipe.js","sourceRoot":"","sources":["../../../../src/llm/adapters/mediapipe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ /**
3
+ * Ollama adapter for local LLM integration
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.OllamaAdapter = void 0;
9
+ exports.createOllamaAdapter = createOllamaAdapter;
10
+ const base_js_1 = require("./base.js");
11
+ /**
12
+ * Ollama adapter for local models
13
+ */
14
+ class OllamaAdapter extends base_js_1.BaseLLMAdapter {
15
+ baseUrl;
16
+ constructor(config) {
17
+ super(config);
18
+ this.baseUrl = config.baseUrl ?? 'http://localhost:11434';
19
+ }
20
+ get provider() {
21
+ return 'ollama';
22
+ }
23
+ isConfigured() {
24
+ return !!this.config.model;
25
+ }
26
+ async complete(request) {
27
+ if (!this.isConfigured()) {
28
+ throw new base_js_1.LLMError('Ollama adapter not configured. Set model in config.', 'NOT_CONFIGURED', this.provider);
29
+ }
30
+ return this.withRetry(async () => {
31
+ const body = {
32
+ model: this.config.model,
33
+ messages: request.messages.map((m) => ({
34
+ role: m.role,
35
+ content: m.content,
36
+ })),
37
+ stream: false,
38
+ options: {
39
+ num_predict: request.maxTokens ?? this.config.maxTokens ?? base_js_1.DEFAULT_CONFIG.maxTokens,
40
+ temperature: request.temperature ?? this.config.temperature ?? base_js_1.DEFAULT_CONFIG.temperature,
41
+ },
42
+ };
43
+ // Add JSON format if requested
44
+ if (request.responseFormat === 'json') {
45
+ body.format = 'json';
46
+ }
47
+ const controller = new AbortController();
48
+ // Ollama can be slow, use longer timeout
49
+ const timeout = setTimeout(() => controller.abort(), this.config.timeout ?? base_js_1.DEFAULT_CONFIG.timeout * 2);
50
+ try {
51
+ const response = await fetch(`${this.baseUrl}/api/chat`, {
52
+ method: 'POST',
53
+ headers: {
54
+ 'Content-Type': 'application/json',
55
+ },
56
+ body: JSON.stringify(body),
57
+ signal: controller.signal,
58
+ });
59
+ clearTimeout(timeout);
60
+ if (!response.ok) {
61
+ const errorText = await response.text().catch(() => '');
62
+ throw new base_js_1.LLMError(`Ollama API error: HTTP ${response.status} - ${errorText}`, 'API_ERROR', this.provider);
63
+ }
64
+ const data = (await response.json());
65
+ const content = data.message?.content ?? '';
66
+ let json;
67
+ if (request.responseFormat === 'json') {
68
+ json = this.parseJSON(content);
69
+ }
70
+ // Estimate tokens (Ollama provides eval_count)
71
+ const promptTokens = data.prompt_eval_count ?? Math.ceil(request.messages.reduce((acc, m) => acc + m.content.length, 0) / 4);
72
+ const completionTokens = data.eval_count ?? Math.ceil(content.length / 4);
73
+ return {
74
+ content,
75
+ json,
76
+ usage: {
77
+ promptTokens,
78
+ completionTokens,
79
+ totalTokens: promptTokens + completionTokens,
80
+ },
81
+ model: data.model,
82
+ finishReason: data.done ? 'stop' : 'error',
83
+ };
84
+ }
85
+ catch (error) {
86
+ clearTimeout(timeout);
87
+ if (error instanceof base_js_1.LLMError) {
88
+ throw error;
89
+ }
90
+ if (error instanceof Error) {
91
+ if (error.name === 'AbortError') {
92
+ throw new base_js_1.LLMError('Request timeout', 'TIMEOUT', this.provider, error);
93
+ }
94
+ // Check for connection refused
95
+ if (error.message.includes('ECONNREFUSED') || error.message.includes('fetch failed')) {
96
+ throw new base_js_1.LLMError(`Cannot connect to Ollama at ${this.baseUrl}. Is Ollama running?`, 'NETWORK_ERROR', this.provider, error);
97
+ }
98
+ throw new base_js_1.LLMError(`Network error: ${error.message}`, 'NETWORK_ERROR', this.provider, error);
99
+ }
100
+ throw new base_js_1.LLMError('Unknown error', 'API_ERROR', this.provider);
101
+ }
102
+ });
103
+ }
104
+ /**
105
+ * Check if Ollama is available
106
+ */
107
+ async isAvailable() {
108
+ try {
109
+ const response = await fetch(`${this.baseUrl}/api/tags`, {
110
+ method: 'GET',
111
+ });
112
+ return response.ok;
113
+ }
114
+ catch {
115
+ return false;
116
+ }
117
+ }
118
+ /**
119
+ * List available models
120
+ */
121
+ async listModels() {
122
+ try {
123
+ const response = await fetch(`${this.baseUrl}/api/tags`, {
124
+ method: 'GET',
125
+ });
126
+ if (!response.ok) {
127
+ return [];
128
+ }
129
+ const data = (await response.json());
130
+ return data.models?.map((m) => m.name) ?? [];
131
+ }
132
+ catch {
133
+ return [];
134
+ }
135
+ }
136
+ }
137
+ exports.OllamaAdapter = OllamaAdapter;
138
+ /**
139
+ * Create an Ollama adapter
140
+ */
141
+ function createOllamaAdapter(model = 'llama3.2', overrides) {
142
+ return new OllamaAdapter({
143
+ provider: 'ollama',
144
+ model,
145
+ baseUrl: 'http://localhost:11434',
146
+ ...overrides,
147
+ });
148
+ }
149
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../../src/llm/adapters/ollama.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ /**
3
+ * OpenAI adapter for LLM integration
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.OpenAIAdapter = void 0;
9
+ exports.createOpenAIAdapter = createOpenAIAdapter;
10
+ const base_js_1 = require("./base.js");
11
+ /**
12
+ * OpenAI adapter for chat completions
13
+ */
14
+ class OpenAIAdapter extends base_js_1.BaseLLMAdapter {
15
+ baseUrl;
16
+ organization;
17
+ constructor(config) {
18
+ super(config);
19
+ this.baseUrl = config.baseUrl ?? 'https://api.openai.com/v1';
20
+ if (config.organization) {
21
+ this.organization = config.organization;
22
+ }
23
+ }
24
+ get provider() {
25
+ return 'openai';
26
+ }
27
+ async complete(request) {
28
+ if (!this.isConfigured()) {
29
+ throw new base_js_1.LLMError('OpenAI adapter not configured. Set OPENAI_API_KEY or pass apiKey in config.', 'NOT_CONFIGURED', this.provider);
30
+ }
31
+ return this.withRetry(async () => {
32
+ const headers = {
33
+ 'Content-Type': 'application/json',
34
+ Authorization: `Bearer ${this.config.apiKey}`,
35
+ };
36
+ if (this.organization) {
37
+ headers['OpenAI-Organization'] = this.organization;
38
+ }
39
+ const body = {
40
+ model: this.config.model,
41
+ messages: request.messages.map((m) => ({
42
+ role: m.role,
43
+ content: m.content,
44
+ })),
45
+ max_tokens: request.maxTokens ?? this.config.maxTokens ?? base_js_1.DEFAULT_CONFIG.maxTokens,
46
+ temperature: request.temperature ?? this.config.temperature ?? base_js_1.DEFAULT_CONFIG.temperature,
47
+ };
48
+ // Add JSON mode if requested
49
+ if (request.responseFormat === 'json') {
50
+ body.response_format = { type: 'json_object' };
51
+ }
52
+ const controller = new AbortController();
53
+ const timeout = setTimeout(() => controller.abort(), this.config.timeout ?? base_js_1.DEFAULT_CONFIG.timeout);
54
+ try {
55
+ const response = await fetch(`${this.baseUrl}/chat/completions`, {
56
+ method: 'POST',
57
+ headers,
58
+ body: JSON.stringify(body),
59
+ signal: controller.signal,
60
+ });
61
+ clearTimeout(timeout);
62
+ if (!response.ok) {
63
+ const errorData = (await response.json().catch(() => ({})));
64
+ const errorMessage = errorData.error?.message ?? `HTTP ${response.status}`;
65
+ if (response.status === 429) {
66
+ throw new base_js_1.LLMError(`Rate limit exceeded: ${errorMessage}`, 'RATE_LIMIT', this.provider);
67
+ }
68
+ throw new base_js_1.LLMError(`OpenAI API error: ${errorMessage}`, 'API_ERROR', this.provider);
69
+ }
70
+ const data = (await response.json());
71
+ const choice = data.choices[0];
72
+ if (!choice) {
73
+ throw new base_js_1.LLMError('No response from OpenAI', 'INVALID_RESPONSE', this.provider);
74
+ }
75
+ const content = choice.message.content;
76
+ let json;
77
+ if (request.responseFormat === 'json') {
78
+ json = this.parseJSON(content);
79
+ }
80
+ return {
81
+ content,
82
+ json,
83
+ usage: {
84
+ promptTokens: data.usage.prompt_tokens,
85
+ completionTokens: data.usage.completion_tokens,
86
+ totalTokens: data.usage.total_tokens,
87
+ },
88
+ model: data.model,
89
+ finishReason: choice.finish_reason === 'stop' ? 'stop' :
90
+ choice.finish_reason === 'length' ? 'length' :
91
+ choice.finish_reason === 'content_filter' ? 'content_filter' : 'error',
92
+ };
93
+ }
94
+ catch (error) {
95
+ clearTimeout(timeout);
96
+ if (error instanceof base_js_1.LLMError) {
97
+ throw error;
98
+ }
99
+ if (error instanceof Error) {
100
+ if (error.name === 'AbortError') {
101
+ throw new base_js_1.LLMError('Request timeout', 'TIMEOUT', this.provider, error);
102
+ }
103
+ throw new base_js_1.LLMError(`Network error: ${error.message}`, 'NETWORK_ERROR', this.provider, error);
104
+ }
105
+ throw new base_js_1.LLMError('Unknown error', 'API_ERROR', this.provider);
106
+ }
107
+ });
108
+ }
109
+ }
110
+ exports.OpenAIAdapter = OpenAIAdapter;
111
+ /**
112
+ * Create an OpenAI adapter from environment variables
113
+ */
114
+ function createOpenAIAdapter(model = 'gpt-4o', overrides) {
115
+ const apiKey = typeof process !== 'undefined' ? process.env.OPENAI_API_KEY : undefined;
116
+ const config = {
117
+ provider: 'openai',
118
+ model,
119
+ ...overrides,
120
+ };
121
+ if (apiKey) {
122
+ config.apiKey = apiKey;
123
+ }
124
+ return new OpenAIAdapter(config);
125
+ }
126
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../../src/llm/adapters/openai.ts"],"names":[],"mappings":"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"}