agentic-qe 2.6.4 → 2.6.5

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 (44) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +26 -1
  3. package/dist/cli/commands/providers/index.d.ts +20 -0
  4. package/dist/cli/commands/providers/index.d.ts.map +1 -0
  5. package/dist/cli/commands/providers/index.js +143 -0
  6. package/dist/cli/commands/providers/index.js.map +1 -0
  7. package/dist/cli/commands/providers/status.d.ts +117 -0
  8. package/dist/cli/commands/providers/status.d.ts.map +1 -0
  9. package/dist/cli/commands/providers/status.js +368 -0
  10. package/dist/cli/commands/providers/status.js.map +1 -0
  11. package/dist/cli/index.js +8 -62
  12. package/dist/cli/index.js.map +1 -1
  13. package/dist/core/memory/HNSWVectorMemory.js +1 -1
  14. package/dist/mcp/server-instructions.d.ts +1 -1
  15. package/dist/mcp/server-instructions.js +1 -1
  16. package/dist/monitoring/ProviderHealthMonitor.d.ts +195 -0
  17. package/dist/monitoring/ProviderHealthMonitor.d.ts.map +1 -0
  18. package/dist/monitoring/ProviderHealthMonitor.js +431 -0
  19. package/dist/monitoring/ProviderHealthMonitor.js.map +1 -0
  20. package/dist/monitoring/QuotaManager.d.ts +122 -0
  21. package/dist/monitoring/QuotaManager.d.ts.map +1 -0
  22. package/dist/monitoring/QuotaManager.js +351 -0
  23. package/dist/monitoring/QuotaManager.js.map +1 -0
  24. package/dist/providers/GitHubModelsProvider.d.ts +117 -0
  25. package/dist/providers/GitHubModelsProvider.d.ts.map +1 -0
  26. package/dist/providers/GitHubModelsProvider.js +464 -0
  27. package/dist/providers/GitHubModelsProvider.js.map +1 -0
  28. package/dist/providers/GroqProvider.d.ts +115 -0
  29. package/dist/providers/GroqProvider.d.ts.map +1 -0
  30. package/dist/providers/GroqProvider.js +443 -0
  31. package/dist/providers/GroqProvider.js.map +1 -0
  32. package/dist/providers/HybridRouterHealthIntegration.d.ts +191 -0
  33. package/dist/providers/HybridRouterHealthIntegration.d.ts.map +1 -0
  34. package/dist/providers/HybridRouterHealthIntegration.js +439 -0
  35. package/dist/providers/HybridRouterHealthIntegration.js.map +1 -0
  36. package/dist/providers/index.d.ts +6 -0
  37. package/dist/providers/index.d.ts.map +1 -1
  38. package/dist/providers/index.js +12 -1
  39. package/dist/providers/index.js.map +1 -1
  40. package/package.json +2 -2
  41. package/dist/cli/commands/providers.d.ts +0 -50
  42. package/dist/cli/commands/providers.d.ts.map +0 -1
  43. package/dist/cli/commands/providers.js +0 -403
  44. package/dist/cli/commands/providers.js.map +0 -1
@@ -0,0 +1,443 @@
1
+ "use strict";
2
+ /**
3
+ * GroqProvider - High-Performance LLM Inference via Groq
4
+ *
5
+ * Provides cloud-based LLM inference through Groq's ultra-fast API with support for:
6
+ * - FREE tier: 14,400 requests/day (10 req/min)
7
+ * - Streaming responses via SSE
8
+ * - Rate limit handling with exponential backoff
9
+ * - Rate limiting (10 req/min free tier)
10
+ * - Multiple model families (LLaMA, Mixtral, DeepSeek)
11
+ * - OpenAI-compatible API format
12
+ *
13
+ * @module providers/GroqProvider
14
+ * @version 1.0.0
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.GroqProvider = void 0;
18
+ const ILLMProvider_1 = require("./ILLMProvider");
19
+ const Logger_1 = require("../utils/Logger");
20
+ /**
21
+ * GroqProvider - High-performance cloud LLM inference
22
+ *
23
+ * This provider enables ultra-fast LLM inference using Groq's specialized
24
+ * LPU (Language Processing Unit) architecture, providing significantly
25
+ * faster inference than traditional GPU-based providers.
26
+ *
27
+ * Supported Models:
28
+ * - llama-3.3-70b-versatile (primary general-purpose model)
29
+ * - deepseek-r1-distill-llama-70b (reasoning-focused)
30
+ * - mixtral-8x7b-32768 (large context window)
31
+ * - llama-3.1-8b-instant (fast lightweight)
32
+ *
33
+ * Rate Limits (FREE tier):
34
+ * - 14,400 requests per day
35
+ * - 10 requests per minute
36
+ * - Automatic retry with exponential backoff
37
+ */
38
+ class GroqProvider {
39
+ constructor(config = {}) {
40
+ this.logger = Logger_1.Logger.getInstance();
41
+ this.config = {
42
+ name: config.name || 'groq',
43
+ debug: config.debug ?? false,
44
+ timeout: config.timeout ?? 60000, // 60 seconds
45
+ maxRetries: config.maxRetries ?? 3,
46
+ baseUrl: config.baseUrl || 'https://api.groq.com/openai/v1',
47
+ defaultModel: config.defaultModel || 'llama-3.3-70b-versatile',
48
+ rateLimitRetryDelay: config.rateLimitRetryDelay ?? 6000 // 6 seconds
49
+ };
50
+ this.isInitialized = false;
51
+ this.apiKey = config.apiKey || process.env.GROQ_API_KEY || '';
52
+ this.baseUrl = this.config.baseUrl;
53
+ this.requestCount = 0;
54
+ this.lastRequestTime = 0;
55
+ }
56
+ /**
57
+ * Initialize the Groq provider
58
+ */
59
+ async initialize() {
60
+ if (this.isInitialized) {
61
+ this.logger.warn('GroqProvider already initialized');
62
+ return;
63
+ }
64
+ try {
65
+ // Validate API key
66
+ if (!this.apiKey) {
67
+ throw new Error('Groq API key is required. Set GROQ_API_KEY environment variable or pass apiKey in config.');
68
+ }
69
+ // Test connection with health check
70
+ const health = await this.healthCheck();
71
+ if (!health.healthy) {
72
+ throw new Error(`Groq API health check failed: ${health.error}`);
73
+ }
74
+ this.isInitialized = true;
75
+ this.logger.info('GroqProvider initialized', {
76
+ baseUrl: this.baseUrl,
77
+ defaultModel: this.config.defaultModel,
78
+ maxRetries: this.config.maxRetries
79
+ });
80
+ }
81
+ catch (error) {
82
+ throw new ILLMProvider_1.LLMProviderError(`Failed to initialize Groq: ${error.message}`, 'groq', 'INIT_ERROR', false, error);
83
+ }
84
+ }
85
+ /**
86
+ * Complete a prompt using Groq
87
+ */
88
+ async complete(options) {
89
+ this.ensureInitialized();
90
+ const startTime = Date.now();
91
+ const model = options.model || this.config.defaultModel;
92
+ let lastError = null;
93
+ let retries = 0;
94
+ while (retries <= this.config.maxRetries) {
95
+ try {
96
+ // Build request payload
97
+ const requestBody = this.buildChatRequest(options, model);
98
+ // Make request to Groq
99
+ const response = await fetch(`${this.baseUrl}/chat/completions`, {
100
+ method: 'POST',
101
+ headers: {
102
+ 'Content-Type': 'application/json',
103
+ 'Authorization': `Bearer ${this.apiKey}`
104
+ },
105
+ body: JSON.stringify(requestBody),
106
+ signal: AbortSignal.timeout(this.config.timeout)
107
+ });
108
+ // Handle rate limiting
109
+ if (response.status === 429) {
110
+ const retryAfter = this.extractRetryAfter(response);
111
+ const delay = retryAfter || this.config.rateLimitRetryDelay;
112
+ this.logger.warn('Rate limit hit, retrying', {
113
+ retryAfter: delay,
114
+ attempt: retries + 1
115
+ });
116
+ if (retries < this.config.maxRetries) {
117
+ await this.sleep(delay);
118
+ retries++;
119
+ continue;
120
+ }
121
+ throw new ILLMProvider_1.LLMProviderError('Rate limit exceeded. Free tier: 10 req/min, 14,400 req/day', 'groq', 'RATE_LIMITED', true);
122
+ }
123
+ // Handle authentication errors
124
+ if (response.status === 401) {
125
+ const errorData = await response.json();
126
+ throw new ILLMProvider_1.LLMProviderError(`Authentication failed: ${errorData.error.message}`, 'groq', 'AUTH_ERROR', false);
127
+ }
128
+ // Handle other errors
129
+ if (!response.ok) {
130
+ const errorData = await response.json();
131
+ throw new Error(`Groq API error: ${errorData.error.message}`);
132
+ }
133
+ const data = await response.json();
134
+ this.requestCount++;
135
+ this.lastRequestTime = Date.now();
136
+ const latency = Date.now() - startTime;
137
+ // Map to standardized response format
138
+ const usage = {
139
+ input_tokens: data.usage.prompt_tokens,
140
+ output_tokens: data.usage.completion_tokens
141
+ };
142
+ return {
143
+ content: [{
144
+ type: 'text',
145
+ text: data.choices[0].message.content
146
+ }],
147
+ usage,
148
+ model: data.model,
149
+ stop_reason: this.mapStopReason(data.choices[0].finish_reason),
150
+ id: data.id,
151
+ metadata: {
152
+ latency,
153
+ cost: this.trackCost(usage),
154
+ groq_metadata: {
155
+ queue_time: data.usage.queue_time,
156
+ prompt_time: data.usage.prompt_time,
157
+ completion_time: data.usage.completion_time,
158
+ total_time: data.usage.total_time,
159
+ system_fingerprint: data.system_fingerprint
160
+ }
161
+ }
162
+ };
163
+ }
164
+ catch (error) {
165
+ lastError = error;
166
+ // Don't retry on auth errors or rate limit errors that exceed max retries
167
+ if (error instanceof ILLMProvider_1.LLMProviderError) {
168
+ if (error.code === 'AUTH_ERROR') {
169
+ throw error;
170
+ }
171
+ if (error.code === 'RATE_LIMITED' && retries >= this.config.maxRetries) {
172
+ throw error;
173
+ }
174
+ }
175
+ // Retry on network errors with exponential backoff
176
+ if (retries < this.config.maxRetries) {
177
+ const backoffDelay = Math.min(1000 * Math.pow(2, retries), 10000);
178
+ this.logger.warn('Request failed, retrying', {
179
+ error: error.message,
180
+ attempt: retries + 1,
181
+ delay: backoffDelay
182
+ });
183
+ await this.sleep(backoffDelay);
184
+ retries++;
185
+ continue;
186
+ }
187
+ break;
188
+ }
189
+ }
190
+ // All retries exhausted
191
+ throw new ILLMProvider_1.LLMProviderError(`Groq completion failed after ${retries} retries: ${lastError?.message}`, 'groq', 'API_ERROR', true, lastError);
192
+ }
193
+ /**
194
+ * Stream a completion using Groq
195
+ */
196
+ async *streamComplete(options) {
197
+ this.ensureInitialized();
198
+ const model = options.model || this.config.defaultModel;
199
+ try {
200
+ const requestBody = this.buildChatRequest(options, model);
201
+ requestBody.stream = true;
202
+ const response = await fetch(`${this.baseUrl}/chat/completions`, {
203
+ method: 'POST',
204
+ headers: {
205
+ 'Content-Type': 'application/json',
206
+ 'Authorization': `Bearer ${this.apiKey}`
207
+ },
208
+ body: JSON.stringify(requestBody)
209
+ });
210
+ if (response.status === 429) {
211
+ throw new ILLMProvider_1.LLMProviderError('Rate limit exceeded', 'groq', 'RATE_LIMITED', true);
212
+ }
213
+ if (response.status === 401) {
214
+ throw new ILLMProvider_1.LLMProviderError('Authentication failed', 'groq', 'AUTH_ERROR', false);
215
+ }
216
+ if (!response.ok) {
217
+ const errorData = await response.json();
218
+ throw new Error(`Groq API error: ${errorData.error.message}`);
219
+ }
220
+ const reader = response.body?.getReader();
221
+ if (!reader) {
222
+ throw new Error('No response body');
223
+ }
224
+ const decoder = new TextDecoder();
225
+ let buffer = '';
226
+ yield { type: 'message_start' };
227
+ yield { type: 'content_block_start', content_block: { type: 'text', text: '' } };
228
+ while (true) {
229
+ const { done, value } = await reader.read();
230
+ if (done)
231
+ break;
232
+ buffer += decoder.decode(value, { stream: true });
233
+ const lines = buffer.split('\n');
234
+ buffer = lines.pop() || '';
235
+ for (const line of lines) {
236
+ if (line.trim() === '' || line.trim() === 'data: [DONE]')
237
+ continue;
238
+ if (!line.startsWith('data: '))
239
+ continue;
240
+ try {
241
+ const jsonData = line.slice(6); // Remove 'data: ' prefix
242
+ const chunk = JSON.parse(jsonData);
243
+ const delta = chunk.choices[0]?.delta;
244
+ if (delta?.content) {
245
+ yield {
246
+ type: 'content_block_delta',
247
+ delta: { type: 'text_delta', text: delta.content }
248
+ };
249
+ }
250
+ if (chunk.choices[0]?.finish_reason) {
251
+ yield { type: 'content_block_stop' };
252
+ yield { type: 'message_stop' };
253
+ this.requestCount++;
254
+ return;
255
+ }
256
+ }
257
+ catch (parseError) {
258
+ // Skip invalid JSON lines
259
+ this.logger.debug('Failed to parse SSE chunk', { line });
260
+ }
261
+ }
262
+ }
263
+ }
264
+ catch (error) {
265
+ if (error instanceof ILLMProvider_1.LLMProviderError) {
266
+ throw error;
267
+ }
268
+ throw new ILLMProvider_1.LLMProviderError(`Groq stream failed: ${error.message}`, 'groq', 'STREAM_ERROR', true, error);
269
+ }
270
+ }
271
+ /**
272
+ * Generate embeddings (not supported by Groq)
273
+ */
274
+ async embed(options) {
275
+ throw new ILLMProvider_1.LLMProviderError('Groq does not support embeddings. Use a dedicated embedding provider.', 'groq', 'UNSUPPORTED_OPERATION', false);
276
+ }
277
+ /**
278
+ * Count tokens in text (approximate)
279
+ */
280
+ async countTokens(options) {
281
+ // Approximate token count: 1 token ≈ 4 characters (similar to GPT tokenization)
282
+ return Math.ceil(options.text.length / 4);
283
+ }
284
+ /**
285
+ * Health check - ping Groq API
286
+ */
287
+ async healthCheck() {
288
+ const startTime = Date.now();
289
+ try {
290
+ // Use a minimal request to test API connectivity
291
+ const response = await fetch(`${this.baseUrl}/models`, {
292
+ method: 'GET',
293
+ headers: {
294
+ 'Authorization': `Bearer ${this.apiKey}`
295
+ },
296
+ signal: AbortSignal.timeout(5000)
297
+ });
298
+ const latency = Date.now() - startTime;
299
+ if (response.ok) {
300
+ return {
301
+ healthy: true,
302
+ latency,
303
+ timestamp: new Date(),
304
+ metadata: {
305
+ baseUrl: this.baseUrl,
306
+ requestCount: this.requestCount
307
+ }
308
+ };
309
+ }
310
+ return {
311
+ healthy: false,
312
+ error: `API returned ${response.status}`,
313
+ timestamp: new Date()
314
+ };
315
+ }
316
+ catch (error) {
317
+ return {
318
+ healthy: false,
319
+ error: error.message,
320
+ timestamp: new Date()
321
+ };
322
+ }
323
+ }
324
+ /**
325
+ * Get provider metadata
326
+ */
327
+ getMetadata() {
328
+ return {
329
+ name: 'groq',
330
+ version: '1.0.0',
331
+ models: [
332
+ 'llama-3.3-70b-versatile',
333
+ 'llama-3.1-70b-versatile',
334
+ 'llama-3.1-8b-instant',
335
+ 'deepseek-r1-distill-llama-70b',
336
+ 'mixtral-8x7b-32768',
337
+ 'gemma2-9b-it',
338
+ 'llama3-70b-8192',
339
+ 'llama3-8b-8192'
340
+ ],
341
+ capabilities: {
342
+ streaming: true,
343
+ caching: false, // No caching implementation
344
+ embeddings: false,
345
+ vision: false
346
+ },
347
+ costs: {
348
+ inputPerMillion: 0, // Free tier
349
+ outputPerMillion: 0 // Free tier
350
+ },
351
+ location: 'cloud'
352
+ };
353
+ }
354
+ /**
355
+ * Shutdown the provider
356
+ */
357
+ async shutdown() {
358
+ this.isInitialized = false;
359
+ this.logger.info('GroqProvider shutdown', {
360
+ requestCount: this.requestCount
361
+ });
362
+ }
363
+ /**
364
+ * Track cost (free tier = $0)
365
+ */
366
+ trackCost(usage) {
367
+ // Groq free tier has no cost
368
+ // For paid tier, costs would be calculated here
369
+ return 0;
370
+ }
371
+ /**
372
+ * Build chat completion request
373
+ */
374
+ buildChatRequest(options, model) {
375
+ const messages = [];
376
+ // Add system messages
377
+ if (options.system && options.system.length > 0) {
378
+ const systemContent = options.system.map(s => s.text).join('\n\n');
379
+ messages.push({
380
+ role: 'system',
381
+ content: systemContent
382
+ });
383
+ }
384
+ // Add conversation messages
385
+ for (const message of options.messages) {
386
+ const content = typeof message.content === 'string'
387
+ ? message.content
388
+ : message.content.map(c => c.text || '').join('');
389
+ messages.push({
390
+ role: message.role,
391
+ content
392
+ });
393
+ }
394
+ return {
395
+ model,
396
+ messages,
397
+ temperature: options.temperature ?? 0.7,
398
+ max_tokens: options.maxTokens || 2048,
399
+ stream: false
400
+ };
401
+ }
402
+ /**
403
+ * Map Groq finish reason to standard stop reason
404
+ */
405
+ mapStopReason(finishReason) {
406
+ switch (finishReason) {
407
+ case 'stop':
408
+ return 'end_turn';
409
+ case 'length':
410
+ return 'max_tokens';
411
+ case 'content_filter':
412
+ return 'stop_sequence';
413
+ default:
414
+ return 'end_turn';
415
+ }
416
+ }
417
+ /**
418
+ * Extract retry-after header from rate limit response
419
+ */
420
+ extractRetryAfter(response) {
421
+ const retryAfter = response.headers.get('retry-after');
422
+ if (!retryAfter)
423
+ return null;
424
+ const seconds = parseInt(retryAfter, 10);
425
+ return isNaN(seconds) ? null : seconds * 1000;
426
+ }
427
+ /**
428
+ * Sleep utility for retry delays
429
+ */
430
+ sleep(ms) {
431
+ return new Promise(resolve => setTimeout(resolve, ms));
432
+ }
433
+ /**
434
+ * Ensure provider is initialized
435
+ */
436
+ ensureInitialized() {
437
+ if (!this.isInitialized) {
438
+ throw new ILLMProvider_1.LLMProviderError('GroqProvider not initialized. Call initialize() first.', 'groq', 'NOT_INITIALIZED', false);
439
+ }
440
+ }
441
+ }
442
+ exports.GroqProvider = GroqProvider;
443
+ //# sourceMappingURL=GroqProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroqProvider.js","sourceRoot":"","sources":["../../src/providers/GroqProvider.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;AAGH,iDAYwB;AACxB,4CAAyC;AA+FzC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAa,YAAY;IASvB,YAAY,SAA6B,EAAE;QACzC,IAAI,CAAC,MAAM,GAAG,eAAM,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG;YACZ,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM;YAC3B,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK;YAC5B,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK,EAAE,aAAa;YAC/C,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;YAClC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,gCAAgC;YAC3D,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,yBAAyB;YAC9D,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,IAAI,CAAC,YAAY;SACrE,CAAC;QACF,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;QAC9D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAQ,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,mBAAmB;YACnB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,2FAA2F,CAAC,CAAC;YAC/G,CAAC;YAED,oCAAoC;YACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACnE,CAAC;YAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAE1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;gBAC3C,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;gBACtC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;aACnC,CAAC,CAAC;QAEL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,+BAAgB,CACxB,8BAA+B,KAAe,CAAC,OAAO,EAAE,EACxD,MAAM,EACN,YAAY,EACZ,KAAK,EACL,KAAc,CACf,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,OAA6B;QAC1C,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,YAAa,CAAC;QAEzD,IAAI,SAAS,GAAiB,IAAI,CAAC;QACnC,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,OAAO,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,UAAW,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,wBAAwB;gBACxB,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAE1D,uBAAuB;gBACvB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,mBAAmB,EAAE;oBAC/D,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;qBACzC;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;oBACjC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAQ,CAAC;iBAClD,CAAC,CAAC;gBAEH,uBAAuB;gBACvB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;oBACpD,MAAM,KAAK,GAAG,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAoB,CAAC;oBAE7D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;wBAC3C,UAAU,EAAE,KAAK;wBACjB,OAAO,EAAE,OAAO,GAAG,CAAC;qBACrB,CAAC,CAAC;oBAEH,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,UAAW,EAAE,CAAC;wBACtC,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;wBACxB,OAAO,EAAE,CAAC;wBACV,SAAS;oBACX,CAAC;oBAED,MAAM,IAAI,+BAAgB,CACxB,4DAA4D,EAC5D,MAAM,EACN,cAAc,EACd,IAAI,CACL,CAAC;gBACJ,CAAC;gBAED,+BAA+B;gBAC/B,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC5B,MAAM,SAAS,GAAsB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBAC3D,MAAM,IAAI,+BAAgB,CACxB,0BAA0B,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,EACnD,MAAM,EACN,YAAY,EACZ,KAAK,CACN,CAAC;gBACJ,CAAC;gBAED,sBAAsB;gBACtB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,SAAS,GAAsB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBAC3D,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAChE,CAAC;gBAED,MAAM,IAAI,GAA+B,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC/D,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAElC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAEvC,sCAAsC;gBACtC,MAAM,KAAK,GAAG;oBACZ,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;oBACtC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB;iBAC5C,CAAC;gBAEF,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO;yBACtC,CAAC;oBACF,KAAK;oBACL,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;oBAC9D,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,QAAQ,EAAE;wBACR,OAAO;wBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;wBAC3B,aAAa,EAAE;4BACb,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;4BACjC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW;4BACnC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe;4BAC3C,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;4BACjC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;yBAC5C;qBACF;iBACF,CAAC;YAEJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAc,CAAC;gBAE3B,0EAA0E;gBAC1E,IAAI,KAAK,YAAY,+BAAgB,EAAE,CAAC;oBACtC,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;wBAChC,MAAM,KAAK,CAAC;oBACd,CAAC;oBACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,UAAW,EAAE,CAAC;wBACxE,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC;gBAED,mDAAmD;gBACnD,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,UAAW,EAAE,CAAC;oBACtC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;oBAClE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;wBAC3C,KAAK,EAAG,KAAe,CAAC,OAAO;wBAC/B,OAAO,EAAE,OAAO,GAAG,CAAC;wBACpB,KAAK,EAAE,YAAY;qBACpB,CAAC,CAAC;oBACH,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;oBAC/B,OAAO,EAAE,CAAC;oBACV,SAAS;gBACX,CAAC;gBAED,MAAM;YACR,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,MAAM,IAAI,+BAAgB,CACxB,gCAAgC,OAAO,aAAa,SAAS,EAAE,OAAO,EAAE,EACxE,MAAM,EACN,WAAW,EACX,IAAI,EACJ,SAAU,CACX,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,CAAC,cAAc,CAAC,OAA6B;QACjD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,YAAa,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1D,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC;YAE1B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,mBAAmB,EAAE;gBAC/D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;iBACzC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;aAClC,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,MAAM,IAAI,+BAAgB,CACxB,qBAAqB,EACrB,MAAM,EACN,cAAc,EACd,IAAI,CACL,CAAC;YACJ,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,MAAM,IAAI,+BAAgB,CACxB,uBAAuB,EACvB,MAAM,EACN,YAAY,EACZ,KAAK,CACN,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAsB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC3D,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAChE,CAAC;YAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACtC,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAClC,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;YAChC,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;YAEjF,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI;oBAAE,MAAM;gBAEhB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,cAAc;wBAAE,SAAS;oBACnE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;wBAAE,SAAS;oBAEzC,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB;wBACzD,MAAM,KAAK,GAAoB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;wBAEpD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;wBACtC,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;4BACnB,MAAM;gCACJ,IAAI,EAAE,qBAAqB;gCAC3B,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE;6BACnD,CAAC;wBACJ,CAAC;wBAED,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;4BACpC,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;4BACrC,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;4BAC/B,IAAI,CAAC,YAAY,EAAE,CAAC;4BACpB,OAAO;wBACT,CAAC;oBACH,CAAC;oBAAC,OAAO,UAAU,EAAE,CAAC;wBACpB,0BAA0B;wBAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC3D,CAAC;gBACH,CAAC;YACH,CAAC;QAEH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,+BAAgB,EAAE,CAAC;gBACtC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,+BAAgB,CACxB,uBAAwB,KAAe,CAAC,OAAO,EAAE,EACjD,MAAM,EACN,cAAc,EACd,IAAI,EACJ,KAAc,CACf,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,OAA4B;QACtC,MAAM,IAAI,+BAAgB,CACxB,uEAAuE,EACvE,MAAM,EACN,uBAAuB,EACvB,KAAK,CACN,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,OAA6B;QAC7C,gFAAgF;QAChF,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,iDAAiD;YACjD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,SAAS,EAAE;gBACrD,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE;oBACP,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;iBACzC;gBACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAEvC,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO;oBACP,SAAS,EAAE,IAAI,IAAI,EAAE;oBACrB,QAAQ,EAAE;wBACR,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,YAAY,EAAE,IAAI,CAAC,YAAY;qBAChC;iBACF,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,gBAAgB,QAAQ,CAAC,MAAM,EAAE;gBACxC,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC;QAEJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAG,KAAe,CAAC,OAAO;gBAC/B,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE;gBACN,yBAAyB;gBACzB,yBAAyB;gBACzB,sBAAsB;gBACtB,+BAA+B;gBAC/B,oBAAoB;gBACpB,cAAc;gBACd,iBAAiB;gBACjB,gBAAgB;aACjB;YACD,YAAY,EAAE;gBACZ,SAAS,EAAE,IAAI;gBACf,OAAO,EAAE,KAAK,EAAE,4BAA4B;gBAC5C,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,KAAK;aACd;YACD,KAAK,EAAE;gBACL,eAAe,EAAE,CAAC,EAAE,YAAY;gBAChC,gBAAgB,EAAE,CAAC,CAAC,YAAY;aACjC;YACD,QAAQ,EAAE,OAAO;SAClB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;YACxC,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAqC;QAC7C,6BAA6B;QAC7B,gDAAgD;QAChD,OAAO,CAAC,CAAC;IACX,CAAC;IAED;;OAEG;IACK,gBAAgB,CACtB,OAA6B,EAC7B,KAAa;QAEb,MAAM,QAAQ,GAA0C,EAAE,CAAC;QAE3D,sBAAsB;QACtB,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnE,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,aAAa;aACvB,CAAC,CAAC;QACL,CAAC;QAED,4BAA4B;QAC5B,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;gBACjD,CAAC,CAAC,OAAO,CAAC,OAAO;gBACjB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEpD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,OAAO,CAAC,IAAuC;gBACrD,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,KAAK;YACL,QAAQ;YACR,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,GAAG;YACvC,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;YACrC,MAAM,EAAE,KAAK;SACd,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,aAAa,CACnB,YAAkD;QAElD,QAAQ,YAAY,EAAE,CAAC;YACrB,KAAK,MAAM;gBACT,OAAO,UAAU,CAAC;YACpB,KAAK,QAAQ;gBACX,OAAO,YAAY,CAAC;YACtB,KAAK,gBAAgB;gBACnB,OAAO,eAAe,CAAC;YACzB;gBACE,OAAO,UAAU,CAAC;QACtB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,QAAkB;QAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAE7B,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACzC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;IAChD,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,+BAAgB,CACxB,wDAAwD,EACxD,MAAM,EACN,iBAAiB,EACjB,KAAK,CACN,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAvgBD,oCAugBC"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * HybridRouterHealthIntegration - Health-aware routing integration for HybridRouter
3
+ *
4
+ * Integrates ProviderHealthMonitor with HybridRouter for:
5
+ * - Real-time health status-based routing decisions
6
+ * - Automatic fallback chain when primary provider is unhealthy
7
+ * - Circuit breaker coordination
8
+ * - Provider ranking by health score
9
+ *
10
+ * @module providers/HybridRouterHealthIntegration
11
+ * @version 1.0.0
12
+ */
13
+ import { EventEmitter } from 'events';
14
+ import { ProviderHealthMonitor, HealthCheckResult, ProviderHealthConfig } from '../monitoring/ProviderHealthMonitor';
15
+ import { ILLMProvider, LLMCompletionOptions, LLMCompletionResponse } from './ILLMProvider';
16
+ /**
17
+ * Fallback strategy configuration
18
+ */
19
+ export interface FallbackConfig {
20
+ /** Enable automatic fallback to next healthy provider */
21
+ enabled: boolean;
22
+ /** Maximum number of fallback attempts */
23
+ maxAttempts: number;
24
+ /** Delay between fallback attempts (ms) */
25
+ retryDelay: number;
26
+ /** Prefer providers with lower latency in fallback chain */
27
+ preferLowLatency: boolean;
28
+ /** Prefer providers with higher availability in fallback chain */
29
+ preferHighAvailability: boolean;
30
+ /** Minimum health score (0-1) to consider provider for fallback */
31
+ minHealthScore: number;
32
+ }
33
+ /**
34
+ * Provider with priority and health info
35
+ */
36
+ export interface RankedProvider {
37
+ providerId: string;
38
+ provider: ILLMProvider;
39
+ healthScore: number;
40
+ latency: number;
41
+ availability: number;
42
+ isHealthy: boolean;
43
+ circuitState: 'closed' | 'open' | 'half-open';
44
+ }
45
+ /**
46
+ * Fallback result
47
+ */
48
+ export interface FallbackResult {
49
+ success: boolean;
50
+ providerId: string;
51
+ attemptCount: number;
52
+ response?: LLMCompletionResponse;
53
+ error?: string;
54
+ fallbackChain: string[];
55
+ }
56
+ /**
57
+ * HybridRouterHealthIntegration - Coordinates health monitoring with routing
58
+ *
59
+ * This class sits between HybridRouter and ProviderHealthMonitor to provide:
60
+ * 1. Health-aware provider selection
61
+ * 2. Intelligent fallback chain based on health metrics
62
+ * 3. Event coordination for health/routing decisions
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * const healthMonitor = new ProviderHealthMonitor();
67
+ * const integration = new HybridRouterHealthIntegration(healthMonitor);
68
+ *
69
+ * // Register providers
70
+ * integration.registerProvider('claude', claudeProvider);
71
+ * integration.registerProvider('groq', groqProvider);
72
+ * integration.registerProvider('github-models', githubModelsProvider);
73
+ *
74
+ * // Get ranked providers for routing
75
+ * const ranked = integration.getRankedProviders();
76
+ *
77
+ * // Execute with automatic fallback
78
+ * const result = await integration.executeWithFallback(options);
79
+ * ```
80
+ */
81
+ export declare class HybridRouterHealthIntegration extends EventEmitter {
82
+ private readonly logger;
83
+ private readonly healthMonitor;
84
+ private readonly fallbackConfig;
85
+ private readonly providers;
86
+ private lastRoutingDecision?;
87
+ constructor(healthMonitor: ProviderHealthMonitor, fallbackConfig?: Partial<FallbackConfig>);
88
+ /**
89
+ * Register a provider for health-aware routing
90
+ *
91
+ * @param providerId - Unique identifier for the provider
92
+ * @param provider - LLM provider instance
93
+ */
94
+ registerProvider(providerId: string, provider: ILLMProvider): void;
95
+ /**
96
+ * Unregister a provider
97
+ *
98
+ * @param providerId - Provider to unregister
99
+ */
100
+ unregisterProvider(providerId: string): void;
101
+ /**
102
+ * Get all providers ranked by health score
103
+ *
104
+ * Providers are ranked considering:
105
+ * - Current health status
106
+ * - Circuit breaker state
107
+ * - Latency (if preferLowLatency enabled)
108
+ * - Availability (if preferHighAvailability enabled)
109
+ *
110
+ * @returns Array of providers sorted by priority (best first)
111
+ */
112
+ getRankedProviders(): RankedProvider[];
113
+ /**
114
+ * Get the best available provider based on health
115
+ *
116
+ * @returns Best provider or undefined if none available
117
+ */
118
+ getBestProvider(): RankedProvider | undefined;
119
+ /**
120
+ * Build fallback chain for a primary provider
121
+ *
122
+ * @param excludeProviderId - Provider ID to exclude (primary)
123
+ * @returns Array of provider IDs in fallback order
124
+ */
125
+ buildFallbackChain(excludeProviderId?: string): string[];
126
+ /**
127
+ * Execute a completion request with automatic fallback
128
+ *
129
+ * Attempts to execute with the best provider, falling back to
130
+ * alternatives if the primary fails.
131
+ *
132
+ * @param options - Completion options
133
+ * @param preferredProviderId - Optional preferred provider to try first
134
+ * @returns Fallback result with response or error
135
+ */
136
+ executeWithFallback(options: LLMCompletionOptions, preferredProviderId?: string): Promise<FallbackResult>;
137
+ /**
138
+ * Check if a specific provider is available for use
139
+ *
140
+ * @param providerId - Provider to check
141
+ * @returns True if provider can be used
142
+ */
143
+ isProviderAvailable(providerId: string): boolean;
144
+ /**
145
+ * Get health summary for all providers
146
+ *
147
+ * @returns Map of provider IDs to health status
148
+ */
149
+ getHealthSummary(): Map<string, {
150
+ healthy: boolean;
151
+ circuitState: string;
152
+ healthScore: number;
153
+ lastCheck: Date;
154
+ }>;
155
+ /**
156
+ * Force health check on all providers
157
+ *
158
+ * @returns Array of health check results
159
+ */
160
+ forceHealthCheck(): Promise<HealthCheckResult[]>;
161
+ /**
162
+ * Get the last routing decision
163
+ */
164
+ getLastRoutingDecision(): typeof this.lastRoutingDecision;
165
+ /**
166
+ * Calculate composite health score
167
+ *
168
+ * Score is based on:
169
+ * - Base health status (40%)
170
+ * - Availability (30%)
171
+ * - Latency score (20%)
172
+ * - Circuit state (10%)
173
+ */
174
+ private calculateHealthScore;
175
+ /**
176
+ * Setup listeners for health monitor events
177
+ */
178
+ private setupHealthEventListeners;
179
+ /**
180
+ * Delay helper
181
+ */
182
+ private delay;
183
+ }
184
+ /**
185
+ * Factory function to create integration with default config
186
+ */
187
+ export declare function createHealthAwareRouter(healthConfig?: Partial<ProviderHealthConfig>, fallbackConfig?: Partial<FallbackConfig>): {
188
+ healthMonitor: ProviderHealthMonitor;
189
+ integration: HybridRouterHealthIntegration;
190
+ };
191
+ //# sourceMappingURL=HybridRouterHealthIntegration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HybridRouterHealthIntegration.d.ts","sourceRoot":"","sources":["../../src/providers/HybridRouterHealthIntegration.ts"],"names":[],"mappings":"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"}