@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.
- package/LICENSE +201 -0
- package/README.md +261 -0
- package/dist/errors.d.ts +79 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +183 -0
- package/dist/errors.js.map +1 -0
- package/dist/factory.d.ts +95 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +418 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +137 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +263 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/anthropic.d.ts +38 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +378 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +107 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +230 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/cerebras.d.ts +30 -0
- package/dist/providers/cerebras.d.ts.map +1 -0
- package/dist/providers/cerebras.js +292 -0
- package/dist/providers/cerebras.js.map +1 -0
- package/dist/providers/cloudflare.d.ts +47 -0
- package/dist/providers/cloudflare.d.ts.map +1 -0
- package/dist/providers/cloudflare.js +544 -0
- package/dist/providers/cloudflare.js.map +1 -0
- package/dist/providers/groq.d.ts +30 -0
- package/dist/providers/groq.d.ts.map +1 -0
- package/dist/providers/groq.js +222 -0
- package/dist/providers/groq.js.map +1 -0
- package/dist/providers/openai.d.ts +36 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +331 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/types.d.ts +238 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/circuit-breaker.d.ts +111 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +365 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/cost-tracker.d.ts +130 -0
- package/dist/utils/cost-tracker.d.ts.map +1 -0
- package/dist/utils/cost-tracker.js +272 -0
- package/dist/utils/cost-tracker.js.map +1 -0
- package/dist/utils/credit-ledger.d.ts +161 -0
- package/dist/utils/credit-ledger.d.ts.map +1 -0
- package/dist/utils/credit-ledger.js +463 -0
- package/dist/utils/credit-ledger.js.map +1 -0
- package/dist/utils/retry.d.ts +46 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +125 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic Provider
|
|
3
|
+
* Implementation for Claude models with streaming and tools support
|
|
4
|
+
*/
|
|
5
|
+
import { BaseProvider } from './base';
|
|
6
|
+
import { LLMErrorFactory, AuthenticationError } from '../errors';
|
|
7
|
+
export class AnthropicProvider extends BaseProvider {
|
|
8
|
+
name = 'anthropic';
|
|
9
|
+
models = [
|
|
10
|
+
'claude-sonnet-4-20250514',
|
|
11
|
+
'claude-opus-4-20250514',
|
|
12
|
+
'claude-sonnet-3.7-20241120',
|
|
13
|
+
'claude-3-5-sonnet-20241022',
|
|
14
|
+
'claude-3-5-haiku-20241022',
|
|
15
|
+
'claude-3-opus-20240229',
|
|
16
|
+
'claude-3-sonnet-20240229',
|
|
17
|
+
'claude-3-haiku-20240307'
|
|
18
|
+
];
|
|
19
|
+
supportsStreaming = true;
|
|
20
|
+
supportsTools = true;
|
|
21
|
+
supportsBatching = false;
|
|
22
|
+
apiKey;
|
|
23
|
+
baseUrl;
|
|
24
|
+
version;
|
|
25
|
+
constructor(config) {
|
|
26
|
+
super(config);
|
|
27
|
+
if (!config.apiKey) {
|
|
28
|
+
throw new AuthenticationError('anthropic', 'Anthropic API key is required');
|
|
29
|
+
}
|
|
30
|
+
this.apiKey = config.apiKey;
|
|
31
|
+
this.baseUrl = config.baseUrl || 'https://api.anthropic.com';
|
|
32
|
+
this.version = config.version || '2023-06-01';
|
|
33
|
+
}
|
|
34
|
+
async generateResponse(request) {
|
|
35
|
+
this.validateRequest(request);
|
|
36
|
+
const startTime = Date.now();
|
|
37
|
+
const jsonMode = request.response_format?.type === 'json_object';
|
|
38
|
+
try {
|
|
39
|
+
const response = await this.executeWithResiliency(async () => {
|
|
40
|
+
const anthropicRequest = this.formatRequest(request);
|
|
41
|
+
const httpResponse = await this.makeAnthropicRequest('/v1/messages', anthropicRequest);
|
|
42
|
+
if (!httpResponse.ok) {
|
|
43
|
+
throw await LLMErrorFactory.fromFetchResponse('anthropic', httpResponse);
|
|
44
|
+
}
|
|
45
|
+
const data = await httpResponse.json();
|
|
46
|
+
const formatted = this.formatResponse(data, Date.now() - startTime);
|
|
47
|
+
// Prepend the prefilled '{' that was consumed by the assistant turn
|
|
48
|
+
if (jsonMode) {
|
|
49
|
+
const restored = '{' + formatted.message;
|
|
50
|
+
formatted.message = restored;
|
|
51
|
+
formatted.content = restored;
|
|
52
|
+
}
|
|
53
|
+
return formatted;
|
|
54
|
+
});
|
|
55
|
+
this.updateMetrics(response.responseTime, true, response.usage.cost);
|
|
56
|
+
this.logRequest(request, response);
|
|
57
|
+
return response;
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
const responseTime = Date.now() - startTime;
|
|
61
|
+
this.updateMetrics(responseTime, false);
|
|
62
|
+
this.logRequest(request, undefined, error);
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
validateConfig() {
|
|
67
|
+
return !!(this.apiKey && this.baseUrl);
|
|
68
|
+
}
|
|
69
|
+
getModels() {
|
|
70
|
+
return [...this.models];
|
|
71
|
+
}
|
|
72
|
+
estimateCost(request) {
|
|
73
|
+
const model = request.model || 'claude-3-5-haiku-20241022';
|
|
74
|
+
const capabilities = this.getModelCapabilities()[model];
|
|
75
|
+
if (!capabilities)
|
|
76
|
+
return 0;
|
|
77
|
+
// Estimate input tokens (rough approximation)
|
|
78
|
+
const inputTokens = request.messages.reduce((sum, msg) => sum + Math.ceil(msg.content.length / 4), 0);
|
|
79
|
+
const outputTokens = request.maxTokens || 1000;
|
|
80
|
+
return this.calculateCost(inputTokens, outputTokens, model);
|
|
81
|
+
}
|
|
82
|
+
async healthCheck() {
|
|
83
|
+
try {
|
|
84
|
+
// Anthropic doesn't have a simple health check endpoint
|
|
85
|
+
// So we'll make a minimal request
|
|
86
|
+
const testRequest = {
|
|
87
|
+
model: 'claude-3-5-haiku-20241022',
|
|
88
|
+
messages: [{ role: 'user', content: 'Hi' }],
|
|
89
|
+
max_tokens: 1
|
|
90
|
+
};
|
|
91
|
+
const response = await this.makeAnthropicRequest('/v1/messages', testRequest);
|
|
92
|
+
return response.ok;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
getModelCapabilities() {
|
|
99
|
+
return {
|
|
100
|
+
'claude-sonnet-4-20250514': {
|
|
101
|
+
maxContextLength: 200000,
|
|
102
|
+
supportsStreaming: true,
|
|
103
|
+
supportsTools: true,
|
|
104
|
+
supportsBatching: false,
|
|
105
|
+
inputTokenCost: 0.003, // Estimated - actual pricing TBD
|
|
106
|
+
outputTokenCost: 0.015, // Estimated - actual pricing TBD
|
|
107
|
+
description: 'Claude Sonnet 4 - High intelligence and balanced performance'
|
|
108
|
+
},
|
|
109
|
+
'claude-opus-4-20250514': {
|
|
110
|
+
maxContextLength: 200000,
|
|
111
|
+
supportsStreaming: true,
|
|
112
|
+
supportsTools: true,
|
|
113
|
+
supportsBatching: false,
|
|
114
|
+
inputTokenCost: 0.015, // Estimated - actual pricing TBD
|
|
115
|
+
outputTokenCost: 0.075, // Estimated - actual pricing TBD
|
|
116
|
+
description: 'Claude Opus 4 - Highest level of intelligence and capability'
|
|
117
|
+
},
|
|
118
|
+
'claude-sonnet-3.7-20241120': {
|
|
119
|
+
maxContextLength: 200000,
|
|
120
|
+
supportsStreaming: true,
|
|
121
|
+
supportsTools: true,
|
|
122
|
+
supportsBatching: false,
|
|
123
|
+
inputTokenCost: 0.003, // Estimated - actual pricing TBD
|
|
124
|
+
outputTokenCost: 0.015, // Estimated - actual pricing TBD
|
|
125
|
+
description: 'Claude Sonnet 3.7 - High intelligence with toggleable extended thinking'
|
|
126
|
+
},
|
|
127
|
+
'claude-3-5-sonnet-20241022': {
|
|
128
|
+
maxContextLength: 200000,
|
|
129
|
+
supportsStreaming: true,
|
|
130
|
+
supportsTools: true,
|
|
131
|
+
supportsBatching: false,
|
|
132
|
+
inputTokenCost: 0.003, // $3 per 1M tokens
|
|
133
|
+
outputTokenCost: 0.015, // $15 per 1M tokens
|
|
134
|
+
description: 'Claude 3.5 Sonnet - Latest high-performance model'
|
|
135
|
+
},
|
|
136
|
+
'claude-3-5-haiku-20241022': {
|
|
137
|
+
maxContextLength: 200000,
|
|
138
|
+
supportsStreaming: true,
|
|
139
|
+
supportsTools: true,
|
|
140
|
+
supportsBatching: false,
|
|
141
|
+
inputTokenCost: 0.00025, // $0.25 per 1M tokens
|
|
142
|
+
outputTokenCost: 0.00125, // $1.25 per 1M tokens
|
|
143
|
+
description: 'Claude 3.5 Haiku - Fast and cost-effective'
|
|
144
|
+
},
|
|
145
|
+
'claude-3-opus-20240229': {
|
|
146
|
+
maxContextLength: 200000,
|
|
147
|
+
supportsStreaming: true,
|
|
148
|
+
supportsTools: true,
|
|
149
|
+
supportsBatching: false,
|
|
150
|
+
inputTokenCost: 0.015, // $15 per 1M tokens
|
|
151
|
+
outputTokenCost: 0.075, // $75 per 1M tokens
|
|
152
|
+
description: 'Claude 3 Opus - Most capable model'
|
|
153
|
+
},
|
|
154
|
+
'claude-3-sonnet-20240229': {
|
|
155
|
+
maxContextLength: 200000,
|
|
156
|
+
supportsStreaming: true,
|
|
157
|
+
supportsTools: true,
|
|
158
|
+
supportsBatching: false,
|
|
159
|
+
inputTokenCost: 0.003, // $3 per 1M tokens
|
|
160
|
+
outputTokenCost: 0.015, // $15 per 1M tokens
|
|
161
|
+
description: 'Claude 3 Sonnet - Balanced performance'
|
|
162
|
+
},
|
|
163
|
+
'claude-3-haiku-20240307': {
|
|
164
|
+
maxContextLength: 200000,
|
|
165
|
+
supportsStreaming: true,
|
|
166
|
+
supportsTools: true,
|
|
167
|
+
supportsBatching: false,
|
|
168
|
+
inputTokenCost: 0.00025, // $0.25 per 1M tokens
|
|
169
|
+
outputTokenCost: 0.00125, // $1.25 per 1M tokens
|
|
170
|
+
description: 'Claude 3 Haiku - Fast and economical'
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
async makeAnthropicRequest(endpoint, body, method = 'POST') {
|
|
175
|
+
const headers = {
|
|
176
|
+
'x-api-key': this.apiKey,
|
|
177
|
+
'anthropic-version': this.version,
|
|
178
|
+
'Content-Type': 'application/json'
|
|
179
|
+
};
|
|
180
|
+
const options = {
|
|
181
|
+
method,
|
|
182
|
+
headers
|
|
183
|
+
};
|
|
184
|
+
if (body && method !== 'GET') {
|
|
185
|
+
options.body = JSON.stringify(body);
|
|
186
|
+
}
|
|
187
|
+
return this.makeRequest(`${this.baseUrl}${endpoint}`, options);
|
|
188
|
+
}
|
|
189
|
+
formatRequest(request) {
|
|
190
|
+
const messages = [];
|
|
191
|
+
const jsonMode = request.response_format?.type === 'json_object';
|
|
192
|
+
// Convert messages (skip system messages as they go in separate field)
|
|
193
|
+
for (const message of request.messages) {
|
|
194
|
+
if (message.role === 'system')
|
|
195
|
+
continue;
|
|
196
|
+
const anthropicMessage = {
|
|
197
|
+
role: message.role,
|
|
198
|
+
content: message.content
|
|
199
|
+
};
|
|
200
|
+
// Handle tool calls and results
|
|
201
|
+
if (message.toolCalls && message.toolCalls.length > 0) {
|
|
202
|
+
anthropicMessage.content = message.toolCalls.map(tc => ({
|
|
203
|
+
type: 'tool_use',
|
|
204
|
+
id: tc.id,
|
|
205
|
+
name: tc.function.name,
|
|
206
|
+
input: JSON.parse(tc.function.arguments)
|
|
207
|
+
}));
|
|
208
|
+
}
|
|
209
|
+
if (message.toolResults && message.toolResults.length > 0) {
|
|
210
|
+
anthropicMessage.content = message.toolResults.map(tr => ({
|
|
211
|
+
type: 'tool_result',
|
|
212
|
+
id: tr.id,
|
|
213
|
+
content: tr.output,
|
|
214
|
+
is_error: !!tr.error
|
|
215
|
+
}));
|
|
216
|
+
}
|
|
217
|
+
messages.push(anthropicMessage);
|
|
218
|
+
}
|
|
219
|
+
// Add prefilled assistant message for JSON mode
|
|
220
|
+
if (jsonMode) {
|
|
221
|
+
messages.push({ role: 'assistant', content: '{' });
|
|
222
|
+
}
|
|
223
|
+
const anthropicRequest = {
|
|
224
|
+
model: request.model || 'claude-3-5-haiku-20241022',
|
|
225
|
+
messages,
|
|
226
|
+
max_tokens: request.maxTokens || 1000,
|
|
227
|
+
temperature: request.temperature,
|
|
228
|
+
stream: request.stream
|
|
229
|
+
};
|
|
230
|
+
// Add system prompt if provided
|
|
231
|
+
const systemMessage = request.messages.find(m => m.role === 'system');
|
|
232
|
+
const jsonInstruction = '\n\nYou must respond with valid JSON only. No markdown fences, no commentary, no text outside the JSON.';
|
|
233
|
+
if (request.systemPrompt) {
|
|
234
|
+
anthropicRequest.system = jsonMode
|
|
235
|
+
? request.systemPrompt + jsonInstruction
|
|
236
|
+
: request.systemPrompt;
|
|
237
|
+
}
|
|
238
|
+
else if (systemMessage) {
|
|
239
|
+
anthropicRequest.system = jsonMode
|
|
240
|
+
? systemMessage.content + jsonInstruction
|
|
241
|
+
: systemMessage.content;
|
|
242
|
+
}
|
|
243
|
+
else if (jsonMode) {
|
|
244
|
+
anthropicRequest.system = jsonInstruction.trimStart();
|
|
245
|
+
}
|
|
246
|
+
// Add tools if provided
|
|
247
|
+
if (request.tools && request.tools.length > 0) {
|
|
248
|
+
anthropicRequest.tools = request.tools.map(tool => ({
|
|
249
|
+
name: tool.function.name,
|
|
250
|
+
description: tool.function.description,
|
|
251
|
+
input_schema: tool.function.parameters
|
|
252
|
+
}));
|
|
253
|
+
if (request.toolChoice) {
|
|
254
|
+
anthropicRequest.tool_choice = request.toolChoice;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return anthropicRequest;
|
|
258
|
+
}
|
|
259
|
+
formatResponse(data, responseTime) {
|
|
260
|
+
// Extract text content from response
|
|
261
|
+
const textContent = data.content
|
|
262
|
+
.filter(block => block.type === 'text')
|
|
263
|
+
.map(block => block.text)
|
|
264
|
+
.join('');
|
|
265
|
+
const usage = {
|
|
266
|
+
inputTokens: data.usage.input_tokens,
|
|
267
|
+
outputTokens: data.usage.output_tokens,
|
|
268
|
+
totalTokens: data.usage.input_tokens + data.usage.output_tokens,
|
|
269
|
+
cost: this.calculateCost(data.usage.input_tokens, data.usage.output_tokens, data.model)
|
|
270
|
+
};
|
|
271
|
+
const response = {
|
|
272
|
+
id: data.id,
|
|
273
|
+
message: textContent,
|
|
274
|
+
content: textContent,
|
|
275
|
+
usage,
|
|
276
|
+
model: data.model,
|
|
277
|
+
provider: this.name,
|
|
278
|
+
responseTime,
|
|
279
|
+
finishReason: this.mapStopReason(data.stop_reason),
|
|
280
|
+
metadata: {
|
|
281
|
+
stopSequence: data.stop_sequence
|
|
282
|
+
}
|
|
283
|
+
};
|
|
284
|
+
// Extract tool calls if present
|
|
285
|
+
const toolUses = data.content.filter(block => block.type === 'tool_use');
|
|
286
|
+
if (toolUses.length > 0) {
|
|
287
|
+
response.toolCalls = toolUses.map(tool => ({
|
|
288
|
+
id: tool.id,
|
|
289
|
+
type: 'function',
|
|
290
|
+
function: {
|
|
291
|
+
name: tool.name,
|
|
292
|
+
arguments: JSON.stringify(tool.input)
|
|
293
|
+
}
|
|
294
|
+
}));
|
|
295
|
+
}
|
|
296
|
+
return response;
|
|
297
|
+
}
|
|
298
|
+
mapStopReason(stopReason) {
|
|
299
|
+
switch (stopReason) {
|
|
300
|
+
case 'end_turn':
|
|
301
|
+
return 'stop';
|
|
302
|
+
case 'max_tokens':
|
|
303
|
+
return 'length';
|
|
304
|
+
case 'tool_use':
|
|
305
|
+
return 'tool_calls';
|
|
306
|
+
default:
|
|
307
|
+
return 'stop';
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Stream response support
|
|
312
|
+
*/
|
|
313
|
+
async streamResponse(request) {
|
|
314
|
+
this.validateRequest(request);
|
|
315
|
+
const anthropicRequest = { ...this.formatRequest(request), stream: true };
|
|
316
|
+
return new ReadableStream({
|
|
317
|
+
start: async (controller) => {
|
|
318
|
+
try {
|
|
319
|
+
const response = await this.makeAnthropicRequest('/v1/messages', anthropicRequest);
|
|
320
|
+
if (!response.ok) {
|
|
321
|
+
throw await LLMErrorFactory.fromFetchResponse('anthropic', response);
|
|
322
|
+
}
|
|
323
|
+
const reader = response.body?.getReader();
|
|
324
|
+
if (!reader) {
|
|
325
|
+
throw new Error('No response body');
|
|
326
|
+
}
|
|
327
|
+
const decoder = new TextDecoder();
|
|
328
|
+
let buffer = '';
|
|
329
|
+
while (true) {
|
|
330
|
+
const { done, value } = await reader.read();
|
|
331
|
+
if (done)
|
|
332
|
+
break;
|
|
333
|
+
buffer += decoder.decode(value, { stream: true });
|
|
334
|
+
const lines = buffer.split('\n');
|
|
335
|
+
buffer = lines.pop() || '';
|
|
336
|
+
for (const line of lines) {
|
|
337
|
+
if (line.startsWith('data: ')) {
|
|
338
|
+
const data = line.slice(6);
|
|
339
|
+
if (data === '[DONE]') {
|
|
340
|
+
controller.close();
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
try {
|
|
344
|
+
const parsed = JSON.parse(data);
|
|
345
|
+
if (parsed.type === 'content_block_delta' && parsed.delta?.text) {
|
|
346
|
+
controller.enqueue(parsed.delta.text);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
console.warn('Failed to parse SSE data:', error);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
controller.close();
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
controller.error(error);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Tool usage support
|
|
365
|
+
*/
|
|
366
|
+
async generateWithTools(request) {
|
|
367
|
+
const response = await this.generateResponse(request);
|
|
368
|
+
// If the response contains tool calls, we need to execute them
|
|
369
|
+
// and potentially make another request with the results
|
|
370
|
+
if (response.toolCalls && response.toolCalls.length > 0) {
|
|
371
|
+
// This would typically involve executing the tools and making another request
|
|
372
|
+
// For now, we just return the response with tool calls
|
|
373
|
+
console.log('Tool calls detected in Anthropic response:', response.toolCalls);
|
|
374
|
+
}
|
|
375
|
+
return response;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Provider
|
|
3
|
+
* Abstract base class for all LLM providers with common functionality
|
|
4
|
+
*/
|
|
5
|
+
import type { LLMProvider, LLMRequest, LLMResponse, ProviderConfig, ModelCapabilities, ProviderMetrics } from '../types';
|
|
6
|
+
import { RetryManager } from '../utils/retry';
|
|
7
|
+
import { CircuitBreaker } from '../utils/circuit-breaker';
|
|
8
|
+
import { CostTracker } from '../utils/cost-tracker';
|
|
9
|
+
export declare abstract class BaseProvider implements LLMProvider {
|
|
10
|
+
abstract name: string;
|
|
11
|
+
abstract models: string[];
|
|
12
|
+
abstract supportsStreaming: boolean;
|
|
13
|
+
abstract supportsTools: boolean;
|
|
14
|
+
abstract supportsBatching: boolean;
|
|
15
|
+
protected config: ProviderConfig;
|
|
16
|
+
protected retryManager: RetryManager;
|
|
17
|
+
protected circuitBreaker: CircuitBreaker;
|
|
18
|
+
protected costTracker: CostTracker;
|
|
19
|
+
protected metrics: ProviderMetrics;
|
|
20
|
+
constructor(config?: ProviderConfig);
|
|
21
|
+
/**
|
|
22
|
+
* Abstract method that must be implemented by each provider
|
|
23
|
+
*/
|
|
24
|
+
abstract generateResponse(request: LLMRequest): Promise<LLMResponse>;
|
|
25
|
+
/**
|
|
26
|
+
* Abstract method for configuration validation
|
|
27
|
+
*/
|
|
28
|
+
abstract validateConfig(): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Abstract method to get available models
|
|
31
|
+
*/
|
|
32
|
+
abstract getModels(): string[];
|
|
33
|
+
/**
|
|
34
|
+
* Abstract method to estimate cost
|
|
35
|
+
*/
|
|
36
|
+
abstract estimateCost(request: LLMRequest): number;
|
|
37
|
+
/**
|
|
38
|
+
* Abstract method for health check
|
|
39
|
+
*/
|
|
40
|
+
abstract healthCheck(): Promise<boolean>;
|
|
41
|
+
/**
|
|
42
|
+
* Common HTTP request method with timeout and error handling
|
|
43
|
+
*/
|
|
44
|
+
protected makeRequest(url: string, options?: RequestInit, timeoutMs?: number): Promise<Response>;
|
|
45
|
+
/**
|
|
46
|
+
* Execute request with circuit breaker and retry logic
|
|
47
|
+
*/
|
|
48
|
+
protected executeWithResiliency<T>(operation: () => Promise<T>): Promise<T>;
|
|
49
|
+
/**
|
|
50
|
+
* Update metrics after request
|
|
51
|
+
*/
|
|
52
|
+
protected updateMetrics(responseTime: number, success: boolean, cost?: number): void;
|
|
53
|
+
/**
|
|
54
|
+
* Get provider metrics
|
|
55
|
+
*/
|
|
56
|
+
getMetrics(): ProviderMetrics;
|
|
57
|
+
/**
|
|
58
|
+
* Reset metrics
|
|
59
|
+
*/
|
|
60
|
+
resetMetrics(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Get provider health status
|
|
63
|
+
*/
|
|
64
|
+
getHealth(): {
|
|
65
|
+
healthy: boolean;
|
|
66
|
+
circuitBreakerState: string;
|
|
67
|
+
metrics: ProviderMetrics;
|
|
68
|
+
lastError?: number;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Update provider configuration
|
|
72
|
+
*/
|
|
73
|
+
updateConfig(config: Partial<ProviderConfig>): void;
|
|
74
|
+
/**
|
|
75
|
+
* Get current configuration (without sensitive data)
|
|
76
|
+
*/
|
|
77
|
+
getConfig(): Omit<ProviderConfig, 'apiKey'>;
|
|
78
|
+
/**
|
|
79
|
+
* Providers share the named singleton breaker so factory-level routing and
|
|
80
|
+
* per-provider execution observe the same failure history.
|
|
81
|
+
*/
|
|
82
|
+
protected getCircuitBreaker(): CircuitBreaker;
|
|
83
|
+
/**
|
|
84
|
+
* Common model capability definitions
|
|
85
|
+
*/
|
|
86
|
+
protected getModelCapabilities(): Record<string, ModelCapabilities>;
|
|
87
|
+
/**
|
|
88
|
+
* Validate request before processing
|
|
89
|
+
*/
|
|
90
|
+
protected validateRequest(request: LLMRequest): void;
|
|
91
|
+
/**
|
|
92
|
+
* Calculate token usage cost
|
|
93
|
+
*/
|
|
94
|
+
protected calculateCost(inputTokens: number, outputTokens: number, model: string): number;
|
|
95
|
+
/**
|
|
96
|
+
* Common response formatting
|
|
97
|
+
*/
|
|
98
|
+
protected buildResponse(content: string, usage: {
|
|
99
|
+
inputTokens: number;
|
|
100
|
+
outputTokens: number;
|
|
101
|
+
}, model: string, responseTime: number, metadata?: Record<string, any>): LLMResponse;
|
|
102
|
+
/**
|
|
103
|
+
* Log request/response for debugging
|
|
104
|
+
*/
|
|
105
|
+
protected logRequest(request: LLMRequest, response?: LLMResponse, error?: Error): void;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"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"}
|