@stackbilt/llm-providers 1.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 (59) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +261 -0
  3. package/dist/errors.d.ts +79 -0
  4. package/dist/errors.d.ts.map +1 -0
  5. package/dist/errors.js +183 -0
  6. package/dist/errors.js.map +1 -0
  7. package/dist/factory.d.ts +95 -0
  8. package/dist/factory.d.ts.map +1 -0
  9. package/dist/factory.js +418 -0
  10. package/dist/factory.js.map +1 -0
  11. package/dist/index.d.ts +137 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +263 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/providers/anthropic.d.ts +38 -0
  16. package/dist/providers/anthropic.d.ts.map +1 -0
  17. package/dist/providers/anthropic.js +378 -0
  18. package/dist/providers/anthropic.js.map +1 -0
  19. package/dist/providers/base.d.ts +107 -0
  20. package/dist/providers/base.d.ts.map +1 -0
  21. package/dist/providers/base.js +230 -0
  22. package/dist/providers/base.js.map +1 -0
  23. package/dist/providers/cerebras.d.ts +30 -0
  24. package/dist/providers/cerebras.d.ts.map +1 -0
  25. package/dist/providers/cerebras.js +292 -0
  26. package/dist/providers/cerebras.js.map +1 -0
  27. package/dist/providers/cloudflare.d.ts +47 -0
  28. package/dist/providers/cloudflare.d.ts.map +1 -0
  29. package/dist/providers/cloudflare.js +544 -0
  30. package/dist/providers/cloudflare.js.map +1 -0
  31. package/dist/providers/groq.d.ts +30 -0
  32. package/dist/providers/groq.d.ts.map +1 -0
  33. package/dist/providers/groq.js +222 -0
  34. package/dist/providers/groq.js.map +1 -0
  35. package/dist/providers/openai.d.ts +36 -0
  36. package/dist/providers/openai.d.ts.map +1 -0
  37. package/dist/providers/openai.js +331 -0
  38. package/dist/providers/openai.js.map +1 -0
  39. package/dist/types.d.ts +238 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +6 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/utils/circuit-breaker.d.ts +111 -0
  44. package/dist/utils/circuit-breaker.d.ts.map +1 -0
  45. package/dist/utils/circuit-breaker.js +365 -0
  46. package/dist/utils/circuit-breaker.js.map +1 -0
  47. package/dist/utils/cost-tracker.d.ts +130 -0
  48. package/dist/utils/cost-tracker.d.ts.map +1 -0
  49. package/dist/utils/cost-tracker.js +272 -0
  50. package/dist/utils/cost-tracker.js.map +1 -0
  51. package/dist/utils/credit-ledger.d.ts +161 -0
  52. package/dist/utils/credit-ledger.d.ts.map +1 -0
  53. package/dist/utils/credit-ledger.js +463 -0
  54. package/dist/utils/credit-ledger.js.map +1 -0
  55. package/dist/utils/retry.d.ts +46 -0
  56. package/dist/utils/retry.d.ts.map +1 -0
  57. package/dist/utils/retry.js +125 -0
  58. package/dist/utils/retry.js.map +1 -0
  59. package/package.json +57 -0
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Groq Provider
3
+ * Implementation for Groq fast inference models (OpenAI-compatible API)
4
+ */
5
+ import { BaseProvider } from './base';
6
+ import { LLMErrorFactory, AuthenticationError } from '../errors';
7
+ export class GroqProvider extends BaseProvider {
8
+ name = 'groq';
9
+ models = [
10
+ 'llama-3.3-70b-versatile',
11
+ 'llama-3.1-8b-instant'
12
+ ];
13
+ supportsStreaming = true;
14
+ supportsTools = false;
15
+ supportsBatching = false;
16
+ apiKey;
17
+ baseUrl;
18
+ constructor(config) {
19
+ super(config);
20
+ if (!config.apiKey) {
21
+ throw new AuthenticationError('groq', 'Groq API key is required');
22
+ }
23
+ this.apiKey = config.apiKey;
24
+ this.baseUrl = config.baseUrl || 'https://api.groq.com/openai/v1';
25
+ }
26
+ async generateResponse(request) {
27
+ this.validateRequest(request);
28
+ const startTime = Date.now();
29
+ try {
30
+ const response = await this.executeWithResiliency(async () => {
31
+ const groqRequest = this.formatRequest(request);
32
+ const httpResponse = await this.makeGroqRequest('/chat/completions', groqRequest);
33
+ if (!httpResponse.ok) {
34
+ throw await LLMErrorFactory.fromFetchResponse('groq', httpResponse);
35
+ }
36
+ const data = await httpResponse.json();
37
+ return this.formatResponse(data, Date.now() - startTime);
38
+ });
39
+ this.updateMetrics(response.responseTime, true, response.usage.cost);
40
+ this.logRequest(request, response);
41
+ return response;
42
+ }
43
+ catch (error) {
44
+ const responseTime = Date.now() - startTime;
45
+ this.updateMetrics(responseTime, false);
46
+ this.logRequest(request, undefined, error);
47
+ throw error;
48
+ }
49
+ }
50
+ validateConfig() {
51
+ return !!(this.apiKey && this.baseUrl);
52
+ }
53
+ getModels() {
54
+ return [...this.models];
55
+ }
56
+ estimateCost(request) {
57
+ const model = request.model || 'llama-3.3-70b-versatile';
58
+ const capabilities = this.getModelCapabilities()[model];
59
+ if (!capabilities)
60
+ return 0;
61
+ const inputTokens = request.messages.reduce((sum, msg) => sum + Math.ceil(msg.content.length / 4), 0);
62
+ const outputTokens = request.maxTokens || 1000;
63
+ return this.calculateCost(inputTokens, outputTokens, model);
64
+ }
65
+ async healthCheck() {
66
+ try {
67
+ const response = await this.makeGroqRequest('/models', null, 'GET');
68
+ return response.ok;
69
+ }
70
+ catch {
71
+ return false;
72
+ }
73
+ }
74
+ getModelCapabilities() {
75
+ return {
76
+ 'llama-3.3-70b-versatile': {
77
+ maxContextLength: 128000,
78
+ supportsStreaming: true,
79
+ supportsTools: false,
80
+ supportsBatching: false,
81
+ inputTokenCost: 0.00059, // $0.59 per 1M tokens
82
+ outputTokenCost: 0.00079, // $0.79 per 1M tokens
83
+ description: 'Llama 3.3 70B Versatile - High-quality fast inference on Groq'
84
+ },
85
+ 'llama-3.1-8b-instant': {
86
+ maxContextLength: 128000,
87
+ supportsStreaming: true,
88
+ supportsTools: false,
89
+ supportsBatching: false,
90
+ inputTokenCost: 0.00005, // $0.05 per 1M tokens
91
+ outputTokenCost: 0.00008, // $0.08 per 1M tokens
92
+ description: 'Llama 3.1 8B Instant - Ultra-fast inference on Groq'
93
+ }
94
+ };
95
+ }
96
+ /**
97
+ * Stream response support (OpenAI-compatible SSE format)
98
+ */
99
+ async streamResponse(request) {
100
+ this.validateRequest(request);
101
+ const groqRequest = { ...this.formatRequest(request), stream: true };
102
+ return new ReadableStream({
103
+ start: async (controller) => {
104
+ try {
105
+ const response = await this.makeGroqRequest('/chat/completions', groqRequest);
106
+ if (!response.ok) {
107
+ throw await LLMErrorFactory.fromFetchResponse('groq', response);
108
+ }
109
+ const reader = response.body?.getReader();
110
+ if (!reader) {
111
+ throw new Error('No response body');
112
+ }
113
+ const decoder = new TextDecoder();
114
+ let buffer = '';
115
+ while (true) {
116
+ const { done, value } = await reader.read();
117
+ if (done)
118
+ break;
119
+ buffer += decoder.decode(value, { stream: true });
120
+ const lines = buffer.split('\n');
121
+ buffer = lines.pop() || '';
122
+ for (const line of lines) {
123
+ if (line.startsWith('data: ')) {
124
+ const data = line.slice(6);
125
+ if (data === '[DONE]') {
126
+ controller.close();
127
+ return;
128
+ }
129
+ try {
130
+ const parsed = JSON.parse(data);
131
+ const content = parsed.choices?.[0]?.delta?.content;
132
+ if (content) {
133
+ controller.enqueue(content);
134
+ }
135
+ }
136
+ catch (error) {
137
+ console.warn('Failed to parse SSE data:', error);
138
+ }
139
+ }
140
+ }
141
+ }
142
+ controller.close();
143
+ }
144
+ catch (error) {
145
+ controller.error(error);
146
+ }
147
+ }
148
+ });
149
+ }
150
+ async makeGroqRequest(endpoint, body, method = 'POST') {
151
+ const headers = {
152
+ 'Authorization': `Bearer ${this.apiKey}`,
153
+ 'Content-Type': 'application/json'
154
+ };
155
+ const options = {
156
+ method,
157
+ headers
158
+ };
159
+ if (body && method !== 'GET') {
160
+ options.body = JSON.stringify(body);
161
+ }
162
+ return this.makeRequest(`${this.baseUrl}${endpoint}`, options);
163
+ }
164
+ formatRequest(request) {
165
+ const messages = [];
166
+ if (request.systemPrompt) {
167
+ messages.push({
168
+ role: 'system',
169
+ content: request.systemPrompt
170
+ });
171
+ }
172
+ for (const message of request.messages) {
173
+ if (message.role === 'system' && request.systemPrompt) {
174
+ continue;
175
+ }
176
+ messages.push({
177
+ role: message.role,
178
+ content: message.content
179
+ });
180
+ }
181
+ const groqRequest = {
182
+ model: request.model || 'llama-3.3-70b-versatile',
183
+ messages,
184
+ temperature: request.temperature,
185
+ max_tokens: request.maxTokens,
186
+ stream: request.stream
187
+ };
188
+ // Pass through response_format if provided
189
+ if (request.response_format) {
190
+ groqRequest.response_format = request.response_format;
191
+ }
192
+ return groqRequest;
193
+ }
194
+ formatResponse(data, responseTime) {
195
+ const choice = data.choices[0];
196
+ if (!choice) {
197
+ throw new Error('No choices returned from Groq');
198
+ }
199
+ const content = choice.message.content || '';
200
+ const usage = {
201
+ inputTokens: data.usage.prompt_tokens,
202
+ outputTokens: data.usage.completion_tokens,
203
+ totalTokens: data.usage.total_tokens,
204
+ cost: this.calculateCost(data.usage.prompt_tokens, data.usage.completion_tokens, data.model)
205
+ };
206
+ return {
207
+ id: data.id,
208
+ message: content,
209
+ content,
210
+ usage,
211
+ model: data.model,
212
+ provider: this.name,
213
+ responseTime,
214
+ finishReason: choice.finish_reason,
215
+ metadata: {
216
+ systemFingerprint: data.system_fingerprint,
217
+ created: data.created
218
+ }
219
+ };
220
+ }
221
+ }
222
+ //# sourceMappingURL=groq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groq.js","sourceRoot":"","sources":["../../src/providers/groq.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * OpenAI Provider
3
+ * Implementation for OpenAI GPT models with streaming and tools support
4
+ */
5
+ import type { LLMRequest, LLMResponse, OpenAIConfig, ModelCapabilities } from '../types';
6
+ import { BaseProvider } from './base';
7
+ export declare class OpenAIProvider extends BaseProvider {
8
+ name: string;
9
+ models: string[];
10
+ supportsStreaming: boolean;
11
+ supportsTools: boolean;
12
+ supportsBatching: boolean;
13
+ private apiKey;
14
+ private baseUrl;
15
+ private organization?;
16
+ private project?;
17
+ constructor(config: OpenAIConfig);
18
+ generateResponse(request: LLMRequest): Promise<LLMResponse>;
19
+ validateConfig(): boolean;
20
+ getModels(): string[];
21
+ estimateCost(request: LLMRequest): number;
22
+ healthCheck(): Promise<boolean>;
23
+ protected getModelCapabilities(): Record<string, ModelCapabilities>;
24
+ private makeOpenAIRequest;
25
+ private formatRequest;
26
+ private formatResponse;
27
+ /**
28
+ * Stream response support
29
+ */
30
+ streamResponse(request: LLMRequest): Promise<ReadableStream<string>>;
31
+ /**
32
+ * Batch processing support
33
+ */
34
+ processBatch(requests: LLMRequest[]): Promise<LLMResponse[]>;
35
+ }
36
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAkDtC,qBAAa,cAAe,SAAQ,YAAY;IAC9C,IAAI,SAAY;IAChB,MAAM,WAQJ;IACF,iBAAiB,UAAQ;IACzB,aAAa,UAAQ;IACrB,gBAAgB,UAAQ;IAExB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAC,CAAS;gBAEb,MAAM,EAAE,YAAY;IAa1B,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IA8BjE,cAAc,IAAI,OAAO;IAIzB,SAAS,IAAI,MAAM,EAAE;IAIrB,YAAY,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM;IAenC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IASrC,SAAS,CAAC,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC;YA2DrD,iBAAiB;IA8B/B,OAAO,CAAC,aAAa;IA+DrB,OAAO,CAAC,cAAc;IAgDtB;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IA8D1E;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAwBnE"}
@@ -0,0 +1,331 @@
1
+ /**
2
+ * OpenAI Provider
3
+ * Implementation for OpenAI GPT models with streaming and tools support
4
+ */
5
+ import { BaseProvider } from './base';
6
+ import { LLMErrorFactory, AuthenticationError } from '../errors';
7
+ export class OpenAIProvider extends BaseProvider {
8
+ name = 'openai';
9
+ models = [
10
+ 'gpt-4o',
11
+ 'gpt-4o-mini',
12
+ 'gpt-4-turbo',
13
+ 'gpt-4-turbo-preview',
14
+ 'gpt-4',
15
+ 'gpt-3.5-turbo',
16
+ 'gpt-3.5-turbo-16k'
17
+ ];
18
+ supportsStreaming = true;
19
+ supportsTools = true;
20
+ supportsBatching = true;
21
+ apiKey;
22
+ baseUrl;
23
+ organization;
24
+ project;
25
+ constructor(config) {
26
+ super(config);
27
+ if (!config.apiKey) {
28
+ throw new AuthenticationError('openai', 'OpenAI API key is required');
29
+ }
30
+ this.apiKey = config.apiKey;
31
+ this.baseUrl = config.baseUrl || 'https://api.openai.com/v1';
32
+ this.organization = config.organization;
33
+ this.project = config.project;
34
+ }
35
+ async generateResponse(request) {
36
+ this.validateRequest(request);
37
+ const startTime = Date.now();
38
+ try {
39
+ const response = await this.executeWithResiliency(async () => {
40
+ const openaiRequest = this.formatRequest(request);
41
+ const httpResponse = await this.makeOpenAIRequest('/chat/completions', openaiRequest);
42
+ if (!httpResponse.ok) {
43
+ throw await LLMErrorFactory.fromFetchResponse('openai', httpResponse);
44
+ }
45
+ const data = await httpResponse.json();
46
+ return this.formatResponse(data, Date.now() - startTime);
47
+ });
48
+ this.updateMetrics(response.responseTime, true, response.usage.cost);
49
+ this.logRequest(request, response);
50
+ return response;
51
+ }
52
+ catch (error) {
53
+ const responseTime = Date.now() - startTime;
54
+ this.updateMetrics(responseTime, false);
55
+ this.logRequest(request, undefined, error);
56
+ throw error;
57
+ }
58
+ }
59
+ validateConfig() {
60
+ return !!(this.apiKey && this.baseUrl);
61
+ }
62
+ getModels() {
63
+ return [...this.models];
64
+ }
65
+ estimateCost(request) {
66
+ const model = request.model || 'gpt-3.5-turbo';
67
+ const capabilities = this.getModelCapabilities()[model];
68
+ if (!capabilities)
69
+ return 0;
70
+ // Estimate input tokens (rough approximation)
71
+ const inputTokens = request.messages.reduce((sum, msg) => sum + Math.ceil(msg.content.length / 4), 0);
72
+ const outputTokens = request.maxTokens || 1000;
73
+ return this.calculateCost(inputTokens, outputTokens, model);
74
+ }
75
+ async healthCheck() {
76
+ try {
77
+ const response = await this.makeOpenAIRequest('/models', null, 'GET');
78
+ return response.ok;
79
+ }
80
+ catch {
81
+ return false;
82
+ }
83
+ }
84
+ getModelCapabilities() {
85
+ return {
86
+ 'gpt-4o': {
87
+ maxContextLength: 128000,
88
+ supportsStreaming: true,
89
+ supportsTools: true,
90
+ supportsBatching: true,
91
+ inputTokenCost: 0.005, // $5 per 1M tokens
92
+ outputTokenCost: 0.015, // $15 per 1M tokens
93
+ description: 'GPT-4 Omni - Latest multimodal model'
94
+ },
95
+ 'gpt-4o-mini': {
96
+ maxContextLength: 128000,
97
+ supportsStreaming: true,
98
+ supportsTools: true,
99
+ supportsBatching: true,
100
+ inputTokenCost: 0.00015, // $0.15 per 1M tokens
101
+ outputTokenCost: 0.0006, // $0.60 per 1M tokens
102
+ description: 'GPT-4 Omni Mini - Cost-effective version'
103
+ },
104
+ 'gpt-4-turbo': {
105
+ maxContextLength: 128000,
106
+ supportsStreaming: true,
107
+ supportsTools: true,
108
+ supportsBatching: true,
109
+ inputTokenCost: 0.01, // $10 per 1M tokens
110
+ outputTokenCost: 0.03, // $30 per 1M tokens
111
+ description: 'GPT-4 Turbo - High performance model'
112
+ },
113
+ 'gpt-4': {
114
+ maxContextLength: 8192,
115
+ supportsStreaming: true,
116
+ supportsTools: true,
117
+ supportsBatching: true,
118
+ inputTokenCost: 0.03, // $30 per 1M tokens
119
+ outputTokenCost: 0.06, // $60 per 1M tokens
120
+ description: 'GPT-4 - Original high-capability model'
121
+ },
122
+ 'gpt-3.5-turbo': {
123
+ maxContextLength: 16385,
124
+ supportsStreaming: true,
125
+ supportsTools: true,
126
+ supportsBatching: true,
127
+ inputTokenCost: 0.0005, // $0.50 per 1M tokens
128
+ outputTokenCost: 0.0015, // $1.50 per 1M tokens
129
+ description: 'GPT-3.5 Turbo - Fast and cost-effective'
130
+ },
131
+ 'gpt-3.5-turbo-16k': {
132
+ maxContextLength: 16385,
133
+ supportsStreaming: true,
134
+ supportsTools: true,
135
+ supportsBatching: true,
136
+ inputTokenCost: 0.001, // $1 per 1M tokens
137
+ outputTokenCost: 0.002, // $2 per 1M tokens
138
+ description: 'GPT-3.5 Turbo 16k - Extended context'
139
+ }
140
+ };
141
+ }
142
+ async makeOpenAIRequest(endpoint, body, method = 'POST') {
143
+ const headers = {
144
+ 'Authorization': `Bearer ${this.apiKey}`,
145
+ 'Content-Type': 'application/json'
146
+ };
147
+ if (this.organization) {
148
+ headers['OpenAI-Organization'] = this.organization;
149
+ }
150
+ if (this.project) {
151
+ headers['OpenAI-Project'] = this.project;
152
+ }
153
+ const options = {
154
+ method,
155
+ headers
156
+ };
157
+ if (body && method !== 'GET') {
158
+ options.body = JSON.stringify(body);
159
+ }
160
+ return this.makeRequest(`${this.baseUrl}${endpoint}`, options);
161
+ }
162
+ formatRequest(request) {
163
+ const messages = [];
164
+ // Add system prompt if provided
165
+ if (request.systemPrompt) {
166
+ messages.push({
167
+ role: 'system',
168
+ content: request.systemPrompt
169
+ });
170
+ }
171
+ // Convert messages
172
+ for (const message of request.messages) {
173
+ if (message.role === 'system' && request.systemPrompt) {
174
+ continue; // Skip if system prompt already added
175
+ }
176
+ const openaiMessage = {
177
+ role: message.role,
178
+ content: message.content
179
+ };
180
+ // Add tool calls if present
181
+ if (message.toolCalls && message.toolCalls.length > 0) {
182
+ openaiMessage.tool_calls = message.toolCalls.map(tc => ({
183
+ id: tc.id,
184
+ type: tc.type,
185
+ function: tc.function
186
+ }));
187
+ openaiMessage.content = null; // Content must be null when tool_calls present
188
+ }
189
+ messages.push(openaiMessage);
190
+ }
191
+ const openaiRequest = {
192
+ model: request.model || 'gpt-3.5-turbo',
193
+ messages,
194
+ temperature: request.temperature,
195
+ max_tokens: request.maxTokens,
196
+ stream: request.stream
197
+ };
198
+ // Add tools if provided
199
+ if (request.tools && request.tools.length > 0) {
200
+ openaiRequest.tools = request.tools.map(tool => ({
201
+ type: tool.type,
202
+ function: tool.function
203
+ }));
204
+ if (request.toolChoice) {
205
+ openaiRequest.tool_choice = request.toolChoice;
206
+ }
207
+ }
208
+ // Pass through response_format if provided
209
+ if (request.response_format) {
210
+ openaiRequest.response_format = request.response_format;
211
+ }
212
+ return openaiRequest;
213
+ }
214
+ formatResponse(data, responseTime) {
215
+ const choice = data.choices[0];
216
+ if (!choice) {
217
+ throw new Error('No choices returned from OpenAI');
218
+ }
219
+ const content = choice.message.content || '';
220
+ const usage = {
221
+ inputTokens: data.usage.prompt_tokens,
222
+ outputTokens: data.usage.completion_tokens,
223
+ totalTokens: data.usage.total_tokens,
224
+ cost: this.calculateCost(data.usage.prompt_tokens, data.usage.completion_tokens, data.model)
225
+ };
226
+ const response = {
227
+ id: data.id,
228
+ message: content,
229
+ content,
230
+ usage,
231
+ model: data.model,
232
+ provider: this.name,
233
+ responseTime,
234
+ finishReason: choice.finish_reason,
235
+ metadata: {
236
+ systemFingerprint: data.system_fingerprint,
237
+ created: data.created
238
+ }
239
+ };
240
+ // Add tool calls if present
241
+ if (choice.message.tool_calls && choice.message.tool_calls.length > 0) {
242
+ response.toolCalls = choice.message.tool_calls.map(tc => ({
243
+ id: tc.id,
244
+ type: tc.type,
245
+ function: tc.function
246
+ }));
247
+ }
248
+ return response;
249
+ }
250
+ /**
251
+ * Stream response support
252
+ */
253
+ async streamResponse(request) {
254
+ this.validateRequest(request);
255
+ const openaiRequest = { ...this.formatRequest(request), stream: true };
256
+ return new ReadableStream({
257
+ start: async (controller) => {
258
+ try {
259
+ const response = await this.makeOpenAIRequest('/chat/completions', openaiRequest);
260
+ if (!response.ok) {
261
+ throw await LLMErrorFactory.fromFetchResponse('openai', response);
262
+ }
263
+ const reader = response.body?.getReader();
264
+ if (!reader) {
265
+ throw new Error('No response body');
266
+ }
267
+ const decoder = new TextDecoder();
268
+ let buffer = '';
269
+ while (true) {
270
+ const { done, value } = await reader.read();
271
+ if (done)
272
+ break;
273
+ buffer += decoder.decode(value, { stream: true });
274
+ const lines = buffer.split('\n');
275
+ buffer = lines.pop() || '';
276
+ for (const line of lines) {
277
+ if (line.startsWith('data: ')) {
278
+ const data = line.slice(6);
279
+ if (data === '[DONE]') {
280
+ controller.close();
281
+ return;
282
+ }
283
+ try {
284
+ const parsed = JSON.parse(data);
285
+ const content = parsed.choices?.[0]?.delta?.content;
286
+ if (content) {
287
+ controller.enqueue(content);
288
+ }
289
+ }
290
+ catch (error) {
291
+ console.warn('Failed to parse SSE data:', error);
292
+ }
293
+ }
294
+ }
295
+ }
296
+ controller.close();
297
+ }
298
+ catch (error) {
299
+ controller.error(error);
300
+ }
301
+ }
302
+ });
303
+ }
304
+ /**
305
+ * Batch processing support
306
+ */
307
+ async processBatch(requests) {
308
+ // OpenAI doesn't have native batch API, so we process sequentially
309
+ // In production, you might want to implement concurrent processing with rate limiting
310
+ const responses = [];
311
+ for (const request of requests) {
312
+ try {
313
+ const response = await this.generateResponse(request);
314
+ responses.push(response);
315
+ }
316
+ catch (error) {
317
+ // Handle individual request failures
318
+ responses.push({
319
+ message: '',
320
+ usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
321
+ model: request.model || 'gpt-3.5-turbo',
322
+ provider: this.name,
323
+ responseTime: 0,
324
+ metadata: { error: error.message }
325
+ });
326
+ }
327
+ }
328
+ return responses;
329
+ }
330
+ }
331
+ //# 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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"}