ai.matey.backend 0.2.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 (159) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/index.js +60 -0
  3. package/dist/cjs/index.js.map +1 -0
  4. package/dist/cjs/providers/ai21.js +331 -0
  5. package/dist/cjs/providers/ai21.js.map +1 -0
  6. package/dist/cjs/providers/anthropic.js +664 -0
  7. package/dist/cjs/providers/anthropic.js.map +1 -0
  8. package/dist/cjs/providers/anyscale.js +338 -0
  9. package/dist/cjs/providers/anyscale.js.map +1 -0
  10. package/dist/cjs/providers/aws-bedrock.js +374 -0
  11. package/dist/cjs/providers/aws-bedrock.js.map +1 -0
  12. package/dist/cjs/providers/azure-openai.js +406 -0
  13. package/dist/cjs/providers/azure-openai.js.map +1 -0
  14. package/dist/cjs/providers/cerebras.js +356 -0
  15. package/dist/cjs/providers/cerebras.js.map +1 -0
  16. package/dist/cjs/providers/cloudflare.js +359 -0
  17. package/dist/cjs/providers/cloudflare.js.map +1 -0
  18. package/dist/cjs/providers/cohere.js +368 -0
  19. package/dist/cjs/providers/cohere.js.map +1 -0
  20. package/dist/cjs/providers/deepinfra.js +343 -0
  21. package/dist/cjs/providers/deepinfra.js.map +1 -0
  22. package/dist/cjs/providers/deepseek.js +104 -0
  23. package/dist/cjs/providers/deepseek.js.map +1 -0
  24. package/dist/cjs/providers/fireworks.js +363 -0
  25. package/dist/cjs/providers/fireworks.js.map +1 -0
  26. package/dist/cjs/providers/gemini.js +292 -0
  27. package/dist/cjs/providers/gemini.js.map +1 -0
  28. package/dist/cjs/providers/groq.js +143 -0
  29. package/dist/cjs/providers/groq.js.map +1 -0
  30. package/dist/cjs/providers/huggingface.js +392 -0
  31. package/dist/cjs/providers/huggingface.js.map +1 -0
  32. package/dist/cjs/providers/lmstudio.js +144 -0
  33. package/dist/cjs/providers/lmstudio.js.map +1 -0
  34. package/dist/cjs/providers/mistral.js +288 -0
  35. package/dist/cjs/providers/mistral.js.map +1 -0
  36. package/dist/cjs/providers/nvidia.js +167 -0
  37. package/dist/cjs/providers/nvidia.js.map +1 -0
  38. package/dist/cjs/providers/ollama.js +257 -0
  39. package/dist/cjs/providers/ollama.js.map +1 -0
  40. package/dist/cjs/providers/openai.js +640 -0
  41. package/dist/cjs/providers/openai.js.map +1 -0
  42. package/dist/cjs/providers/openrouter.js +379 -0
  43. package/dist/cjs/providers/openrouter.js.map +1 -0
  44. package/dist/cjs/providers/perplexity.js +372 -0
  45. package/dist/cjs/providers/perplexity.js.map +1 -0
  46. package/dist/cjs/providers/replicate.js +340 -0
  47. package/dist/cjs/providers/replicate.js.map +1 -0
  48. package/dist/cjs/providers/together-ai.js +341 -0
  49. package/dist/cjs/providers/together-ai.js.map +1 -0
  50. package/dist/cjs/providers/xai.js +339 -0
  51. package/dist/cjs/providers/xai.js.map +1 -0
  52. package/dist/cjs/shared.js +279 -0
  53. package/dist/cjs/shared.js.map +1 -0
  54. package/dist/esm/index.js +44 -0
  55. package/dist/esm/index.js.map +1 -0
  56. package/dist/esm/providers/ai21.js +327 -0
  57. package/dist/esm/providers/ai21.js.map +1 -0
  58. package/dist/esm/providers/anthropic.js +660 -0
  59. package/dist/esm/providers/anthropic.js.map +1 -0
  60. package/dist/esm/providers/anyscale.js +334 -0
  61. package/dist/esm/providers/anyscale.js.map +1 -0
  62. package/dist/esm/providers/aws-bedrock.js +370 -0
  63. package/dist/esm/providers/aws-bedrock.js.map +1 -0
  64. package/dist/esm/providers/azure-openai.js +402 -0
  65. package/dist/esm/providers/azure-openai.js.map +1 -0
  66. package/dist/esm/providers/cerebras.js +352 -0
  67. package/dist/esm/providers/cerebras.js.map +1 -0
  68. package/dist/esm/providers/cloudflare.js +355 -0
  69. package/dist/esm/providers/cloudflare.js.map +1 -0
  70. package/dist/esm/providers/cohere.js +364 -0
  71. package/dist/esm/providers/cohere.js.map +1 -0
  72. package/dist/esm/providers/deepinfra.js +339 -0
  73. package/dist/esm/providers/deepinfra.js.map +1 -0
  74. package/dist/esm/providers/deepseek.js +99 -0
  75. package/dist/esm/providers/deepseek.js.map +1 -0
  76. package/dist/esm/providers/fireworks.js +359 -0
  77. package/dist/esm/providers/fireworks.js.map +1 -0
  78. package/dist/esm/providers/gemini.js +288 -0
  79. package/dist/esm/providers/gemini.js.map +1 -0
  80. package/dist/esm/providers/groq.js +138 -0
  81. package/dist/esm/providers/groq.js.map +1 -0
  82. package/dist/esm/providers/huggingface.js +387 -0
  83. package/dist/esm/providers/huggingface.js.map +1 -0
  84. package/dist/esm/providers/lmstudio.js +139 -0
  85. package/dist/esm/providers/lmstudio.js.map +1 -0
  86. package/dist/esm/providers/mistral.js +284 -0
  87. package/dist/esm/providers/mistral.js.map +1 -0
  88. package/dist/esm/providers/nvidia.js +162 -0
  89. package/dist/esm/providers/nvidia.js.map +1 -0
  90. package/dist/esm/providers/ollama.js +253 -0
  91. package/dist/esm/providers/ollama.js.map +1 -0
  92. package/dist/esm/providers/openai.js +636 -0
  93. package/dist/esm/providers/openai.js.map +1 -0
  94. package/dist/esm/providers/openrouter.js +375 -0
  95. package/dist/esm/providers/openrouter.js.map +1 -0
  96. package/dist/esm/providers/perplexity.js +368 -0
  97. package/dist/esm/providers/perplexity.js.map +1 -0
  98. package/dist/esm/providers/replicate.js +336 -0
  99. package/dist/esm/providers/replicate.js.map +1 -0
  100. package/dist/esm/providers/together-ai.js +337 -0
  101. package/dist/esm/providers/together-ai.js.map +1 -0
  102. package/dist/esm/providers/xai.js +335 -0
  103. package/dist/esm/providers/xai.js.map +1 -0
  104. package/dist/esm/shared.js +272 -0
  105. package/dist/esm/shared.js.map +1 -0
  106. package/dist/types/index.d.ts +38 -0
  107. package/dist/types/index.d.ts.map +1 -0
  108. package/dist/types/providers/ai21.d.ts +106 -0
  109. package/dist/types/providers/ai21.d.ts.map +1 -0
  110. package/dist/types/providers/anthropic.d.ts +194 -0
  111. package/dist/types/providers/anthropic.d.ts.map +1 -0
  112. package/dist/types/providers/anyscale.d.ts +109 -0
  113. package/dist/types/providers/anyscale.d.ts.map +1 -0
  114. package/dist/types/providers/aws-bedrock.d.ts +152 -0
  115. package/dist/types/providers/aws-bedrock.d.ts.map +1 -0
  116. package/dist/types/providers/azure-openai.d.ts +142 -0
  117. package/dist/types/providers/azure-openai.d.ts.map +1 -0
  118. package/dist/types/providers/cerebras.d.ts +130 -0
  119. package/dist/types/providers/cerebras.d.ts.map +1 -0
  120. package/dist/types/providers/cloudflare.d.ts +125 -0
  121. package/dist/types/providers/cloudflare.d.ts.map +1 -0
  122. package/dist/types/providers/cohere.d.ts +114 -0
  123. package/dist/types/providers/cohere.d.ts.map +1 -0
  124. package/dist/types/providers/deepinfra.d.ts +118 -0
  125. package/dist/types/providers/deepinfra.d.ts.map +1 -0
  126. package/dist/types/providers/deepseek.d.ts +68 -0
  127. package/dist/types/providers/deepseek.d.ts.map +1 -0
  128. package/dist/types/providers/fireworks.d.ts +127 -0
  129. package/dist/types/providers/fireworks.d.ts.map +1 -0
  130. package/dist/types/providers/gemini.d.ts +71 -0
  131. package/dist/types/providers/gemini.d.ts.map +1 -0
  132. package/dist/types/providers/groq.d.ts +83 -0
  133. package/dist/types/providers/groq.d.ts.map +1 -0
  134. package/dist/types/providers/huggingface.d.ts +154 -0
  135. package/dist/types/providers/huggingface.d.ts.map +1 -0
  136. package/dist/types/providers/lmstudio.d.ts +88 -0
  137. package/dist/types/providers/lmstudio.d.ts.map +1 -0
  138. package/dist/types/providers/mistral.d.ts +65 -0
  139. package/dist/types/providers/mistral.d.ts.map +1 -0
  140. package/dist/types/providers/nvidia.d.ts +100 -0
  141. package/dist/types/providers/nvidia.d.ts.map +1 -0
  142. package/dist/types/providers/ollama.d.ts +59 -0
  143. package/dist/types/providers/ollama.d.ts.map +1 -0
  144. package/dist/types/providers/openai.d.ts +205 -0
  145. package/dist/types/providers/openai.d.ts.map +1 -0
  146. package/dist/types/providers/openrouter.d.ts +135 -0
  147. package/dist/types/providers/openrouter.d.ts.map +1 -0
  148. package/dist/types/providers/perplexity.d.ts +116 -0
  149. package/dist/types/providers/perplexity.d.ts.map +1 -0
  150. package/dist/types/providers/replicate.d.ts +91 -0
  151. package/dist/types/providers/replicate.d.ts.map +1 -0
  152. package/dist/types/providers/together-ai.d.ts +118 -0
  153. package/dist/types/providers/together-ai.d.ts.map +1 -0
  154. package/dist/types/providers/xai.d.ts +119 -0
  155. package/dist/types/providers/xai.d.ts.map +1 -0
  156. package/dist/types/shared.d.ts +116 -0
  157. package/dist/types/shared.d.ts.map +1 -0
  158. package/package.json +327 -0
  159. package/readme.md +86 -0
@@ -0,0 +1,636 @@
1
+ /**
2
+ * OpenAI Backend Adapter
3
+ *
4
+ * Adapts Universal IR to OpenAI Chat Completions API.
5
+ * Handles OpenAI's in-messages system message strategy and 0-2 temperature range.
6
+ *
7
+ * @module
8
+ */
9
+ import { AdapterConversionError, NetworkError, ProviderError, StreamError, ErrorCode, createErrorFromHttpResponse, } from 'ai.matey.errors';
10
+ import { normalizeSystemMessages } from 'ai.matey.utils';
11
+ import { getModelCache } from 'ai.matey.utils';
12
+ import { getEffectiveStreamMode, mergeStreamingConfig } from 'ai.matey.utils';
13
+ import { estimateTokens, buildStaticResult, applyModelFilter, } from '../shared.js';
14
+ // ============================================================================
15
+ // OpenAI Backend Adapter
16
+ // ============================================================================
17
+ /**
18
+ * Backend adapter for OpenAI Chat Completions API.
19
+ */
20
+ export class OpenAIBackendAdapter {
21
+ metadata;
22
+ config;
23
+ baseURL;
24
+ modelCache;
25
+ /**
26
+ * Create a new OpenAI backend adapter.
27
+ *
28
+ * @param config Backend adapter configuration
29
+ * @param metadataOverride Optional metadata to override defaults (used by subclasses)
30
+ */
31
+ constructor(config, metadataOverride) {
32
+ this.config = config;
33
+ this.baseURL = config.baseURL || 'https://api.openai.com/v1';
34
+ this.modelCache = getModelCache(config.modelsCacheScope || 'global');
35
+ // Default OpenAI metadata
36
+ const defaultMetadata = {
37
+ name: 'openai-backend',
38
+ version: '1.0.0',
39
+ provider: 'OpenAI',
40
+ capabilities: {
41
+ streaming: true,
42
+ multiModal: true,
43
+ tools: true,
44
+ maxContextTokens: 128000,
45
+ systemMessageStrategy: 'in-messages',
46
+ supportsMultipleSystemMessages: false, // OpenAI prefers single system message
47
+ supportsTemperature: true,
48
+ supportsTopP: true,
49
+ supportsTopK: false,
50
+ supportsSeed: true,
51
+ supportsFrequencyPenalty: true,
52
+ supportsPresencePenalty: true,
53
+ maxStopSequences: 4,
54
+ },
55
+ config: {
56
+ baseURL: this.baseURL,
57
+ },
58
+ };
59
+ // Apply metadata overrides if provided (for subclasses)
60
+ this.metadata = metadataOverride
61
+ ? {
62
+ ...defaultMetadata,
63
+ ...metadataOverride,
64
+ capabilities: {
65
+ ...defaultMetadata.capabilities,
66
+ ...metadataOverride.capabilities,
67
+ },
68
+ config: {
69
+ ...defaultMetadata.config,
70
+ ...metadataOverride.config,
71
+ },
72
+ }
73
+ : defaultMetadata;
74
+ }
75
+ /**
76
+ * Execute non-streaming chat completion request.
77
+ */
78
+ async execute(request, signal) {
79
+ try {
80
+ // Convert IR to OpenAI format
81
+ const openaiRequest = this.fromIR(request);
82
+ // Make HTTP request
83
+ const startTime = Date.now();
84
+ const response = await this.makeRequest(openaiRequest, signal);
85
+ // Convert response to IR
86
+ const irResponse = this.toIR(response, request, Date.now() - startTime);
87
+ return irResponse;
88
+ }
89
+ catch (error) {
90
+ // Re-throw adapter errors
91
+ if (error instanceof AdapterConversionError ||
92
+ error instanceof NetworkError ||
93
+ error instanceof ProviderError) {
94
+ throw error;
95
+ }
96
+ // Wrap unknown errors
97
+ throw new ProviderError({
98
+ code: ErrorCode.PROVIDER_ERROR,
99
+ message: `OpenAI request failed: ${error instanceof Error ? error.message : String(error)}`,
100
+ isRetryable: true,
101
+ provenance: {
102
+ backend: this.metadata.name,
103
+ },
104
+ cause: error instanceof Error ? error : undefined,
105
+ });
106
+ }
107
+ }
108
+ /**
109
+ * Execute streaming chat completion request.
110
+ */
111
+ async *executeStream(request, signal) {
112
+ try {
113
+ // Convert IR to OpenAI format
114
+ const openaiRequest = this.fromIR(request);
115
+ openaiRequest.stream = true;
116
+ // Get effective streaming configuration
117
+ const streamingConfig = mergeStreamingConfig(this.config.streaming);
118
+ const effectiveMode = getEffectiveStreamMode(request.streamMode, undefined, streamingConfig);
119
+ const includeBoth = streamingConfig.includeBoth || effectiveMode === 'accumulated';
120
+ // Make streaming HTTP request
121
+ const response = await fetch(`${this.baseURL}/chat/completions`, {
122
+ method: 'POST',
123
+ headers: this.getHeaders(),
124
+ body: JSON.stringify(openaiRequest),
125
+ signal,
126
+ });
127
+ if (!response.ok) {
128
+ const errorBody = await response.text();
129
+ throw createErrorFromHttpResponse(response.status, response.statusText, errorBody, {
130
+ backend: this.metadata.name,
131
+ });
132
+ }
133
+ if (!response.body) {
134
+ throw new StreamError({
135
+ code: ErrorCode.STREAM_INTERRUPTED,
136
+ message: 'Response body is null',
137
+ provenance: {
138
+ backend: this.metadata.name,
139
+ },
140
+ });
141
+ }
142
+ // Parse SSE stream
143
+ let sequence = 0;
144
+ let contentBuffer = '';
145
+ let finishReasonReceived;
146
+ let usage;
147
+ // Yield start chunk
148
+ yield {
149
+ type: 'start',
150
+ sequence: sequence++,
151
+ metadata: {
152
+ ...request.metadata,
153
+ provenance: {
154
+ ...request.metadata.provenance,
155
+ backend: this.metadata.name,
156
+ },
157
+ },
158
+ };
159
+ // Read stream
160
+ const reader = response.body.getReader();
161
+ const decoder = new TextDecoder();
162
+ let buffer = '';
163
+ try {
164
+ while (true) {
165
+ const { done, value } = await reader.read();
166
+ if (done) {
167
+ break;
168
+ }
169
+ buffer += decoder.decode(value, { stream: true });
170
+ const lines = buffer.split('\n');
171
+ buffer = lines.pop() || '';
172
+ for (const line of lines) {
173
+ // Skip empty lines
174
+ if (!line.trim()) {
175
+ continue;
176
+ }
177
+ if (line.startsWith('data: ')) {
178
+ const data = line.slice(6).trim();
179
+ if (data === '[DONE]') {
180
+ // Stream complete - yield done chunk if not already sent
181
+ if (!finishReasonReceived) {
182
+ const message = {
183
+ role: 'assistant',
184
+ content: contentBuffer,
185
+ };
186
+ yield {
187
+ type: 'done',
188
+ sequence: sequence++,
189
+ finishReason: 'stop',
190
+ usage,
191
+ message,
192
+ };
193
+ }
194
+ continue;
195
+ }
196
+ try {
197
+ const chunk = JSON.parse(data);
198
+ // Validate chunk structure
199
+ if (!chunk.choices || chunk.choices.length === 0) {
200
+ console.warn('Invalid chunk structure: no choices', chunk);
201
+ continue;
202
+ }
203
+ const choice = chunk.choices[0];
204
+ if (!choice) {
205
+ continue;
206
+ }
207
+ // Content delta
208
+ if (choice.delta.content) {
209
+ contentBuffer += choice.delta.content;
210
+ // Build content chunk with optional accumulated field
211
+ const contentChunk = {
212
+ type: 'content',
213
+ sequence: sequence++,
214
+ delta: choice.delta.content,
215
+ role: 'assistant',
216
+ };
217
+ // Add accumulated field if configured
218
+ if (includeBoth) {
219
+ contentChunk.accumulated = contentBuffer;
220
+ }
221
+ yield contentChunk;
222
+ }
223
+ // Tool calls delta (not implemented yet - Phase 5)
224
+ if (choice.delta.tool_calls) {
225
+ // TODO: Handle tool call deltas in Phase 5
226
+ console.warn('Tool calls delta received but not yet implemented');
227
+ }
228
+ // Finish reason
229
+ if (choice.finish_reason && !finishReasonReceived) {
230
+ finishReasonReceived = this.mapFinishReason(choice.finish_reason);
231
+ // Build final message
232
+ const message = {
233
+ role: 'assistant',
234
+ content: contentBuffer,
235
+ };
236
+ yield {
237
+ type: 'done',
238
+ sequence: sequence++,
239
+ finishReason: finishReasonReceived,
240
+ usage,
241
+ message,
242
+ };
243
+ }
244
+ }
245
+ catch (parseError) {
246
+ // Log parse errors but continue streaming
247
+ console.warn('Failed to parse SSE chunk:', data, parseError);
248
+ continue;
249
+ }
250
+ }
251
+ else if (line.startsWith('event:')) {
252
+ // OpenAI doesn't typically use event: lines, but handle them
253
+ const eventType = line.slice(6).trim();
254
+ if (eventType === 'error') {
255
+ // Error event type
256
+ console.warn('Error event type detected');
257
+ }
258
+ }
259
+ }
260
+ }
261
+ // If stream ended without finish_reason, yield a done chunk
262
+ if (!finishReasonReceived) {
263
+ const message = {
264
+ role: 'assistant',
265
+ content: contentBuffer,
266
+ };
267
+ yield {
268
+ type: 'done',
269
+ sequence: sequence++,
270
+ finishReason: 'stop',
271
+ usage,
272
+ message,
273
+ };
274
+ }
275
+ }
276
+ finally {
277
+ reader.releaseLock();
278
+ }
279
+ }
280
+ catch (error) {
281
+ // Yield error chunk
282
+ yield {
283
+ type: 'error',
284
+ sequence: 0,
285
+ error: {
286
+ code: error instanceof Error ? error.name : 'UNKNOWN_ERROR',
287
+ message: error instanceof Error ? error.message : String(error),
288
+ },
289
+ };
290
+ }
291
+ }
292
+ /**
293
+ * Health check to verify OpenAI API is accessible.
294
+ */
295
+ async healthCheck() {
296
+ try {
297
+ const response = await fetch(`${this.baseURL}/models`, {
298
+ method: 'GET',
299
+ headers: this.getHeaders(),
300
+ signal: AbortSignal.timeout(5000),
301
+ });
302
+ return response.ok;
303
+ }
304
+ catch {
305
+ return false;
306
+ }
307
+ }
308
+ /**
309
+ * Estimate cost for a request (rough heuristic).
310
+ */
311
+ estimateCost(request) {
312
+ // Use shared token estimation utility
313
+ const estimatedInputTokens = estimateTokens(request);
314
+ // Rough cost: $0.01 per 1000 tokens (varies by model)
315
+ return Promise.resolve((estimatedInputTokens / 1000) * 0.01);
316
+ }
317
+ /**
318
+ * List available models from OpenAI.
319
+ *
320
+ * This method supports three sources:
321
+ * 1. Static config (config.models) - highest priority
322
+ * 2. Cache (if enabled and not expired)
323
+ * 3. Remote API (/v1/models endpoint)
324
+ */
325
+ async listModels(options) {
326
+ try {
327
+ // 1. Check static config override first
328
+ if (this.config.models && !options?.forceRefresh) {
329
+ return buildStaticResult(this.config.models, 'openai');
330
+ }
331
+ // 2. Check cache
332
+ if (this.config.cacheModels !== false && !options?.forceRefresh) {
333
+ const cached = this.modelCache.get(this.metadata.name);
334
+ if (cached) {
335
+ return applyModelFilter(cached, options?.filter);
336
+ }
337
+ }
338
+ // 3. Fetch from OpenAI API
339
+ const endpoint = this.config.modelsEndpoint || `${this.baseURL}/models`;
340
+ const response = await fetch(endpoint, {
341
+ method: 'GET',
342
+ headers: this.getHeaders(),
343
+ signal: AbortSignal.timeout(this.config.timeout || 30000),
344
+ });
345
+ if (!response.ok) {
346
+ throw createErrorFromHttpResponse(response.status, response.statusText, await response.text(), {
347
+ backend: this.metadata.name,
348
+ });
349
+ }
350
+ const data = (await response.json());
351
+ // 4. Transform to AIModel format
352
+ const models = data.data.map((model) => this.transformOpenAIModel(model));
353
+ // 5. Build result
354
+ const result = {
355
+ models,
356
+ source: 'remote',
357
+ fetchedAt: Date.now(),
358
+ isComplete: true,
359
+ };
360
+ // 6. Cache the result
361
+ if (this.config.cacheModels !== false) {
362
+ const ttl = this.config.modelsCacheTTL || 3600000; // 1 hour default
363
+ this.modelCache.set(this.metadata.name, result, ttl);
364
+ }
365
+ // 7. Apply filter if requested
366
+ return applyModelFilter(result, options?.filter);
367
+ }
368
+ catch (error) {
369
+ // If we have a cached result, return it as fallback
370
+ if (!options?.forceRefresh) {
371
+ const cached = this.modelCache.get(this.metadata.name);
372
+ if (cached) {
373
+ return cached;
374
+ }
375
+ }
376
+ // Re-throw known errors
377
+ if (error instanceof ProviderError || error instanceof NetworkError) {
378
+ throw error;
379
+ }
380
+ // Wrap unknown errors
381
+ throw new ProviderError({
382
+ code: ErrorCode.PROVIDER_ERROR,
383
+ message: `Failed to list OpenAI models: ${error instanceof Error ? error.message : String(error)}`,
384
+ isRetryable: true,
385
+ provenance: {
386
+ backend: this.metadata.name,
387
+ },
388
+ cause: error instanceof Error ? error : undefined,
389
+ });
390
+ }
391
+ }
392
+ /**
393
+ * Invalidate the cached model list.
394
+ *
395
+ * Forces the next listModels() call to fetch fresh data from the API
396
+ * (unless static models are configured).
397
+ *
398
+ * @returns This adapter for method chaining
399
+ */
400
+ invalidateModelCache() {
401
+ this.modelCache.invalidate(this.metadata.name);
402
+ return this;
403
+ }
404
+ // ==========================================================================
405
+ // Private Helper Methods
406
+ // ==========================================================================
407
+ /**
408
+ * Convert IR request to OpenAI format.
409
+ *
410
+ * Public method for testing and debugging - see what will be sent to OpenAI.
411
+ */
412
+ fromIR(request) {
413
+ try {
414
+ // Normalize system messages (OpenAI uses in-messages strategy)
415
+ const { messages } = normalizeSystemMessages(request.messages, this.metadata.capabilities.systemMessageStrategy, this.metadata.capabilities.supportsMultipleSystemMessages);
416
+ // Convert messages
417
+ const openaiMessages = messages.map((msg) => this.convertMessageToOpenAI(msg));
418
+ // Build OpenAI request
419
+ const openaiRequest = {
420
+ model: request.parameters?.model || this.config.defaultModel || 'gpt-3.5-turbo',
421
+ messages: openaiMessages,
422
+ temperature: request.parameters?.temperature,
423
+ max_tokens: request.parameters?.maxTokens,
424
+ top_p: request.parameters?.topP,
425
+ frequency_penalty: request.parameters?.frequencyPenalty,
426
+ presence_penalty: request.parameters?.presencePenalty,
427
+ stop: request.parameters?.stopSequences ? [...request.parameters.stopSequences] : undefined,
428
+ stream: request.stream,
429
+ user: request.parameters?.user,
430
+ seed: request.parameters?.seed,
431
+ };
432
+ return openaiRequest;
433
+ }
434
+ catch (error) {
435
+ throw new AdapterConversionError({
436
+ code: ErrorCode.ADAPTER_CONVERSION_ERROR,
437
+ message: `Failed to convert IR to OpenAI format: ${error instanceof Error ? error.message : String(error)}`,
438
+ provenance: {
439
+ backend: this.metadata.name,
440
+ },
441
+ cause: error instanceof Error ? error : undefined,
442
+ });
443
+ }
444
+ }
445
+ /**
446
+ * Convert OpenAI response to IR format.
447
+ *
448
+ * Public method for testing and debugging - parse OpenAI responses manually.
449
+ */
450
+ toIR(response, originalRequest, latencyMs) {
451
+ try {
452
+ const choice = response.choices[0];
453
+ if (!choice) {
454
+ throw new Error('No choices in OpenAI response');
455
+ }
456
+ // Convert message
457
+ const message = {
458
+ role: 'assistant',
459
+ content: this.convertMessageContentFromOpenAI(choice.message.content),
460
+ };
461
+ // Map finish reason
462
+ const finishReason = this.mapFinishReason(choice.finish_reason || 'stop');
463
+ // Build IR response
464
+ const irResponse = {
465
+ message,
466
+ finishReason,
467
+ usage: response.usage
468
+ ? {
469
+ promptTokens: response.usage.prompt_tokens,
470
+ completionTokens: response.usage.completion_tokens,
471
+ totalTokens: response.usage.total_tokens,
472
+ }
473
+ : undefined,
474
+ metadata: {
475
+ ...originalRequest.metadata,
476
+ providerResponseId: response.id,
477
+ provenance: {
478
+ ...originalRequest.metadata.provenance,
479
+ backend: this.metadata.name,
480
+ },
481
+ custom: {
482
+ ...originalRequest.metadata.custom,
483
+ openaiResponseId: response.id,
484
+ latencyMs,
485
+ },
486
+ },
487
+ raw: response,
488
+ };
489
+ return irResponse;
490
+ }
491
+ catch (error) {
492
+ throw new AdapterConversionError({
493
+ code: ErrorCode.ADAPTER_CONVERSION_ERROR,
494
+ message: `Failed to convert OpenAI response to IR: ${error instanceof Error ? error.message : String(error)}`,
495
+ provenance: {
496
+ backend: this.metadata.name,
497
+ },
498
+ cause: error instanceof Error ? error : undefined,
499
+ });
500
+ }
501
+ }
502
+ /**
503
+ * Convert IR message to OpenAI message.
504
+ */
505
+ convertMessageToOpenAI(message) {
506
+ // Convert content
507
+ let content;
508
+ if (typeof message.content === 'string') {
509
+ content = message.content;
510
+ }
511
+ else {
512
+ // Convert content blocks
513
+ content = message.content.map((block) => {
514
+ switch (block.type) {
515
+ case 'text':
516
+ return { type: 'text', text: block.text };
517
+ case 'image':
518
+ if (block.source.type === 'url') {
519
+ return {
520
+ type: 'image_url',
521
+ image_url: { url: block.source.url },
522
+ };
523
+ }
524
+ else {
525
+ // Convert base64 to data URL
526
+ const dataUrl = `data:${block.source.mediaType};base64,${block.source.data}`;
527
+ return {
528
+ type: 'image_url',
529
+ image_url: { url: dataUrl },
530
+ };
531
+ }
532
+ default:
533
+ // Fallback to text for unsupported types
534
+ return { type: 'text', text: JSON.stringify(block) };
535
+ }
536
+ });
537
+ }
538
+ return {
539
+ role: message.role,
540
+ content,
541
+ name: message.name,
542
+ };
543
+ }
544
+ /**
545
+ * Convert OpenAI message content to string.
546
+ */
547
+ convertMessageContentFromOpenAI(content) {
548
+ if (typeof content === 'string') {
549
+ return content;
550
+ }
551
+ // Extract text from content blocks
552
+ return content
553
+ .map((block) => {
554
+ if (block.type === 'text') {
555
+ return block.text;
556
+ }
557
+ return '';
558
+ })
559
+ .join('');
560
+ }
561
+ /**
562
+ * Map OpenAI finish reason to IR finish reason.
563
+ */
564
+ mapFinishReason(finishReason) {
565
+ switch (finishReason) {
566
+ case 'stop':
567
+ return 'stop';
568
+ case 'length':
569
+ return 'length';
570
+ case 'tool_calls':
571
+ return 'tool_calls';
572
+ case 'content_filter':
573
+ return 'content_filter';
574
+ default:
575
+ return 'stop';
576
+ }
577
+ }
578
+ /**
579
+ * Make HTTP request to OpenAI API.
580
+ */
581
+ async makeRequest(request, signal) {
582
+ try {
583
+ const response = await fetch(`${this.baseURL}/chat/completions`, {
584
+ method: 'POST',
585
+ headers: this.getHeaders(),
586
+ body: JSON.stringify(request),
587
+ signal,
588
+ });
589
+ if (!response.ok) {
590
+ const errorBody = await response.text();
591
+ throw createErrorFromHttpResponse(response.status, response.statusText, errorBody, {
592
+ backend: this.metadata.name,
593
+ });
594
+ }
595
+ const data = (await response.json());
596
+ return data;
597
+ }
598
+ catch (error) {
599
+ if (error instanceof TypeError && error.message.includes('fetch')) {
600
+ throw new NetworkError({
601
+ code: ErrorCode.NETWORK_ERROR,
602
+ message: `Network request failed: ${error.message}`,
603
+ provenance: {
604
+ backend: this.metadata.name,
605
+ },
606
+ cause: error,
607
+ });
608
+ }
609
+ throw error;
610
+ }
611
+ }
612
+ /**
613
+ * Get HTTP headers for OpenAI API requests.
614
+ */
615
+ getHeaders() {
616
+ return {
617
+ 'Content-Type': 'application/json',
618
+ Authorization: `Bearer ${this.config.apiKey}`,
619
+ ...this.config.headers,
620
+ };
621
+ }
622
+ /**
623
+ * Transform OpenAI model object to AIModel.
624
+ */
625
+ transformOpenAIModel(model) {
626
+ return {
627
+ id: model.id,
628
+ name: model.id, // OpenAI doesn't provide separate display names
629
+ created: new Date(model.created * 1000).toISOString(),
630
+ ownedBy: model.owned_by,
631
+ // Note: OpenAI /models endpoint doesn't include capability info
632
+ // This would need to be enriched from a static mapping if needed
633
+ };
634
+ }
635
+ }
636
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/providers/openai.ts"],"names":[],"mappings":"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"}