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.
- package/CHANGELOG.md +43 -0
- package/README.md +26 -1
- package/dist/cli/commands/providers/index.d.ts +20 -0
- package/dist/cli/commands/providers/index.d.ts.map +1 -0
- package/dist/cli/commands/providers/index.js +143 -0
- package/dist/cli/commands/providers/index.js.map +1 -0
- package/dist/cli/commands/providers/status.d.ts +117 -0
- package/dist/cli/commands/providers/status.d.ts.map +1 -0
- package/dist/cli/commands/providers/status.js +368 -0
- package/dist/cli/commands/providers/status.js.map +1 -0
- package/dist/cli/index.js +8 -62
- package/dist/cli/index.js.map +1 -1
- package/dist/core/memory/HNSWVectorMemory.js +1 -1
- package/dist/mcp/server-instructions.d.ts +1 -1
- package/dist/mcp/server-instructions.js +1 -1
- package/dist/monitoring/ProviderHealthMonitor.d.ts +195 -0
- package/dist/monitoring/ProviderHealthMonitor.d.ts.map +1 -0
- package/dist/monitoring/ProviderHealthMonitor.js +431 -0
- package/dist/monitoring/ProviderHealthMonitor.js.map +1 -0
- package/dist/monitoring/QuotaManager.d.ts +122 -0
- package/dist/monitoring/QuotaManager.d.ts.map +1 -0
- package/dist/monitoring/QuotaManager.js +351 -0
- package/dist/monitoring/QuotaManager.js.map +1 -0
- package/dist/providers/GitHubModelsProvider.d.ts +117 -0
- package/dist/providers/GitHubModelsProvider.d.ts.map +1 -0
- package/dist/providers/GitHubModelsProvider.js +464 -0
- package/dist/providers/GitHubModelsProvider.js.map +1 -0
- package/dist/providers/GroqProvider.d.ts +115 -0
- package/dist/providers/GroqProvider.d.ts.map +1 -0
- package/dist/providers/GroqProvider.js +443 -0
- package/dist/providers/GroqProvider.js.map +1 -0
- package/dist/providers/HybridRouterHealthIntegration.d.ts +191 -0
- package/dist/providers/HybridRouterHealthIntegration.d.ts.map +1 -0
- package/dist/providers/HybridRouterHealthIntegration.js +439 -0
- package/dist/providers/HybridRouterHealthIntegration.js.map +1 -0
- package/dist/providers/index.d.ts +6 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +12 -1
- package/dist/providers/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/cli/commands/providers.d.ts +0 -50
- package/dist/cli/commands/providers.d.ts.map +0 -1
- package/dist/cli/commands/providers.js +0 -403
- package/dist/cli/commands/providers.js.map +0 -1
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ProviderHealthMonitor - Health monitoring and circuit breaker for LLM providers
|
|
4
|
+
*
|
|
5
|
+
* Monitors provider health with circuit breaker pattern to prevent cascading failures.
|
|
6
|
+
* Tracks response time, error rate, availability, and manages circuit state transitions.
|
|
7
|
+
*
|
|
8
|
+
* @module monitoring/ProviderHealthMonitor
|
|
9
|
+
* @version 1.0.0
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ProviderHealthMonitor = void 0;
|
|
13
|
+
const events_1 = require("events");
|
|
14
|
+
const Logger_1 = require("../utils/Logger");
|
|
15
|
+
/**
|
|
16
|
+
* Default configuration values
|
|
17
|
+
*/
|
|
18
|
+
const DEFAULT_CONFIG = {
|
|
19
|
+
checkIntervalMs: 30000,
|
|
20
|
+
timeoutMs: 5000,
|
|
21
|
+
failureThreshold: 3,
|
|
22
|
+
recoveryTimeMs: 60000,
|
|
23
|
+
healthyLatencyThresholdMs: 3000
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* ProviderHealthMonitor - Monitors LLM provider health with circuit breaker pattern
|
|
27
|
+
*
|
|
28
|
+
* Features:
|
|
29
|
+
* - Automatic health checks at configurable intervals
|
|
30
|
+
* - Circuit breaker pattern (closed → open → half-open → closed)
|
|
31
|
+
* - Error rate and availability tracking with sliding window
|
|
32
|
+
* - Event emission for health changes and circuit state transitions
|
|
33
|
+
* - Concurrent health checks with timeout protection
|
|
34
|
+
* - Manual circuit control (force open, reset)
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* const monitor = new ProviderHealthMonitor({
|
|
39
|
+
* checkIntervalMs: 30000,
|
|
40
|
+
* failureThreshold: 3
|
|
41
|
+
* });
|
|
42
|
+
*
|
|
43
|
+
* monitor.registerProvider('ollama', async () => {
|
|
44
|
+
* return await ollamaProvider.healthCheck();
|
|
45
|
+
* });
|
|
46
|
+
*
|
|
47
|
+
* monitor.on('health-change', (data) => {
|
|
48
|
+
* console.log(`Provider ${data.providerId} health: ${data.healthy}`);
|
|
49
|
+
* });
|
|
50
|
+
*
|
|
51
|
+
* monitor.startMonitoring();
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
class ProviderHealthMonitor extends events_1.EventEmitter {
|
|
55
|
+
constructor(config) {
|
|
56
|
+
super();
|
|
57
|
+
this.logger = Logger_1.Logger.getInstance();
|
|
58
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
59
|
+
this.providers = new Map();
|
|
60
|
+
this.isMonitoring = false;
|
|
61
|
+
this.logger.debug('ProviderHealthMonitor initialized', { config: this.config });
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Register a provider for health monitoring
|
|
65
|
+
*
|
|
66
|
+
* @param providerId - Unique identifier for the provider
|
|
67
|
+
* @param healthCheckFn - Function that returns provider health status
|
|
68
|
+
*/
|
|
69
|
+
registerProvider(providerId, healthCheckFn) {
|
|
70
|
+
if (this.providers.has(providerId)) {
|
|
71
|
+
this.logger.warn(`Provider ${providerId} already registered, replacing`);
|
|
72
|
+
}
|
|
73
|
+
const state = {
|
|
74
|
+
providerId,
|
|
75
|
+
healthy: true,
|
|
76
|
+
latency: 0,
|
|
77
|
+
errorRate: 0,
|
|
78
|
+
availability: 1.0,
|
|
79
|
+
consecutiveFailures: 0,
|
|
80
|
+
circuitState: 'closed',
|
|
81
|
+
lastCheck: new Date(),
|
|
82
|
+
checkCount: 0,
|
|
83
|
+
successCount: 0
|
|
84
|
+
};
|
|
85
|
+
this.providers.set(providerId, {
|
|
86
|
+
providerId,
|
|
87
|
+
healthCheckFn,
|
|
88
|
+
state
|
|
89
|
+
});
|
|
90
|
+
this.logger.info(`Provider ${providerId} registered for health monitoring`);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Unregister a provider from health monitoring
|
|
94
|
+
*
|
|
95
|
+
* @param providerId - Provider to unregister
|
|
96
|
+
*/
|
|
97
|
+
unregisterProvider(providerId) {
|
|
98
|
+
if (!this.providers.has(providerId)) {
|
|
99
|
+
this.logger.warn(`Provider ${providerId} not registered`);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
this.providers.delete(providerId);
|
|
103
|
+
this.logger.info(`Provider ${providerId} unregistered from health monitoring`);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Start automatic health monitoring
|
|
107
|
+
*
|
|
108
|
+
* Begins periodic health checks for all registered providers.
|
|
109
|
+
*/
|
|
110
|
+
startMonitoring() {
|
|
111
|
+
if (this.isMonitoring) {
|
|
112
|
+
this.logger.warn('Health monitoring already started');
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
this.isMonitoring = true;
|
|
116
|
+
// Perform immediate check on start
|
|
117
|
+
this.checkAllProviders().catch(error => {
|
|
118
|
+
this.logger.error('Initial health check failed', { error: error.message });
|
|
119
|
+
});
|
|
120
|
+
// Schedule periodic checks
|
|
121
|
+
this.monitoringInterval = setInterval(() => {
|
|
122
|
+
this.checkAllProviders().catch(error => {
|
|
123
|
+
this.logger.error('Periodic health check failed', { error: error.message });
|
|
124
|
+
});
|
|
125
|
+
}, this.config.checkIntervalMs);
|
|
126
|
+
this.logger.info('Health monitoring started', {
|
|
127
|
+
interval: this.config.checkIntervalMs,
|
|
128
|
+
providers: Array.from(this.providers.keys())
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Stop automatic health monitoring
|
|
133
|
+
*/
|
|
134
|
+
stopMonitoring() {
|
|
135
|
+
if (!this.isMonitoring) {
|
|
136
|
+
this.logger.warn('Health monitoring not started');
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (this.monitoringInterval) {
|
|
140
|
+
clearInterval(this.monitoringInterval);
|
|
141
|
+
this.monitoringInterval = undefined;
|
|
142
|
+
}
|
|
143
|
+
this.isMonitoring = false;
|
|
144
|
+
this.logger.info('Health monitoring stopped');
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Check health of a specific provider
|
|
148
|
+
*
|
|
149
|
+
* @param providerId - Provider to check
|
|
150
|
+
* @returns Health check result
|
|
151
|
+
*/
|
|
152
|
+
async checkProviderHealth(providerId) {
|
|
153
|
+
const provider = this.providers.get(providerId);
|
|
154
|
+
if (!provider) {
|
|
155
|
+
throw new Error(`Provider ${providerId} not registered`);
|
|
156
|
+
}
|
|
157
|
+
const startTime = Date.now();
|
|
158
|
+
let result;
|
|
159
|
+
try {
|
|
160
|
+
// Check if circuit is open and recovery time has passed
|
|
161
|
+
if (provider.state.circuitState === 'open') {
|
|
162
|
+
const timeSinceOpen = Date.now() - (provider.circuitOpenedAt?.getTime() || 0);
|
|
163
|
+
if (timeSinceOpen >= this.config.recoveryTimeMs) {
|
|
164
|
+
// Transition to half-open for retry
|
|
165
|
+
this.transitionCircuitState(provider, 'half-open');
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
// Circuit still open, fail fast
|
|
169
|
+
result = {
|
|
170
|
+
providerId,
|
|
171
|
+
healthy: false,
|
|
172
|
+
latency: 0,
|
|
173
|
+
timestamp: new Date(),
|
|
174
|
+
error: 'Circuit breaker is open'
|
|
175
|
+
};
|
|
176
|
+
this.updateProviderState(provider, result);
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Perform health check with timeout
|
|
181
|
+
const healthStatus = await this.withTimeout(provider.healthCheckFn(), this.config.timeoutMs, `Health check timeout for ${providerId}`);
|
|
182
|
+
const latency = Date.now() - startTime;
|
|
183
|
+
// Evaluate health based on response and latency
|
|
184
|
+
const healthy = healthStatus.healthy &&
|
|
185
|
+
latency < this.config.healthyLatencyThresholdMs;
|
|
186
|
+
result = {
|
|
187
|
+
providerId,
|
|
188
|
+
healthy,
|
|
189
|
+
latency,
|
|
190
|
+
timestamp: new Date(),
|
|
191
|
+
error: healthStatus.error
|
|
192
|
+
};
|
|
193
|
+
// Update state and handle circuit breaker logic
|
|
194
|
+
this.updateProviderState(provider, result);
|
|
195
|
+
if (result.healthy) {
|
|
196
|
+
this.handleSuccessfulCheck(provider);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
this.handleFailedCheck(provider, result.error);
|
|
200
|
+
}
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
const latency = Date.now() - startTime;
|
|
205
|
+
const errorMessage = error.message;
|
|
206
|
+
result = {
|
|
207
|
+
providerId,
|
|
208
|
+
healthy: false,
|
|
209
|
+
latency,
|
|
210
|
+
timestamp: new Date(),
|
|
211
|
+
error: errorMessage
|
|
212
|
+
};
|
|
213
|
+
this.updateProviderState(provider, result);
|
|
214
|
+
this.handleFailedCheck(provider, errorMessage);
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Check health of all registered providers concurrently
|
|
220
|
+
*
|
|
221
|
+
* @returns Array of health check results
|
|
222
|
+
*/
|
|
223
|
+
async checkAllProviders() {
|
|
224
|
+
if (this.providers.size === 0) {
|
|
225
|
+
this.logger.warn('No providers registered for health check');
|
|
226
|
+
return [];
|
|
227
|
+
}
|
|
228
|
+
const providerIds = Array.from(this.providers.keys());
|
|
229
|
+
const results = await Promise.all(providerIds.map(id => this.checkProviderHealth(id)));
|
|
230
|
+
this.logger.debug('Completed health check for all providers', {
|
|
231
|
+
total: results.length,
|
|
232
|
+
healthy: results.filter(r => r.healthy).length,
|
|
233
|
+
unhealthy: results.filter(r => !r.healthy).length
|
|
234
|
+
});
|
|
235
|
+
return results;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get current health state of a provider
|
|
239
|
+
*
|
|
240
|
+
* @param providerId - Provider to query
|
|
241
|
+
* @returns Current health state or undefined if not registered
|
|
242
|
+
*/
|
|
243
|
+
getProviderHealth(providerId) {
|
|
244
|
+
const provider = this.providers.get(providerId);
|
|
245
|
+
return provider ? { ...provider.state } : undefined;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Get health state of all registered providers
|
|
249
|
+
*
|
|
250
|
+
* @returns Map of provider IDs to health states
|
|
251
|
+
*/
|
|
252
|
+
getAllProviderHealth() {
|
|
253
|
+
const healthMap = new Map();
|
|
254
|
+
for (const [id, provider] of this.providers.entries()) {
|
|
255
|
+
healthMap.set(id, { ...provider.state });
|
|
256
|
+
}
|
|
257
|
+
return healthMap;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Get list of healthy providers
|
|
261
|
+
*
|
|
262
|
+
* @returns Array of provider IDs that are currently healthy
|
|
263
|
+
*/
|
|
264
|
+
getHealthyProviders() {
|
|
265
|
+
return Array.from(this.providers.entries())
|
|
266
|
+
.filter(([_, provider]) => provider.state.healthy && provider.state.circuitState === 'closed')
|
|
267
|
+
.map(([id, _]) => id);
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Check if a specific provider is healthy
|
|
271
|
+
*
|
|
272
|
+
* @param providerId - Provider to check
|
|
273
|
+
* @returns True if provider is healthy and circuit is closed
|
|
274
|
+
*/
|
|
275
|
+
isProviderHealthy(providerId) {
|
|
276
|
+
const provider = this.providers.get(providerId);
|
|
277
|
+
if (!provider) {
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
return provider.state.healthy && provider.state.circuitState === 'closed';
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Get current circuit breaker state for a provider
|
|
284
|
+
*
|
|
285
|
+
* @param providerId - Provider to query
|
|
286
|
+
* @returns Circuit state or 'closed' if not registered
|
|
287
|
+
*/
|
|
288
|
+
getCircuitState(providerId) {
|
|
289
|
+
const provider = this.providers.get(providerId);
|
|
290
|
+
return provider?.state.circuitState || 'closed';
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Manually force a circuit to open
|
|
294
|
+
*
|
|
295
|
+
* Useful for maintenance or emergency situations.
|
|
296
|
+
*
|
|
297
|
+
* @param providerId - Provider to open circuit for
|
|
298
|
+
*/
|
|
299
|
+
forceCircuitOpen(providerId) {
|
|
300
|
+
const provider = this.providers.get(providerId);
|
|
301
|
+
if (!provider) {
|
|
302
|
+
throw new Error(`Provider ${providerId} not registered`);
|
|
303
|
+
}
|
|
304
|
+
const previousState = provider.state.circuitState;
|
|
305
|
+
this.transitionCircuitState(provider, 'open');
|
|
306
|
+
provider.circuitOpenedAt = new Date();
|
|
307
|
+
this.logger.warn(`Circuit manually forced open for provider ${providerId}`, {
|
|
308
|
+
previousState
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Reset circuit breaker to closed state
|
|
313
|
+
*
|
|
314
|
+
* Useful for manual recovery or testing.
|
|
315
|
+
*
|
|
316
|
+
* @param providerId - Provider to reset
|
|
317
|
+
*/
|
|
318
|
+
resetCircuit(providerId) {
|
|
319
|
+
const provider = this.providers.get(providerId);
|
|
320
|
+
if (!provider) {
|
|
321
|
+
throw new Error(`Provider ${providerId} not registered`);
|
|
322
|
+
}
|
|
323
|
+
const previousState = provider.state.circuitState;
|
|
324
|
+
provider.state.consecutiveFailures = 0;
|
|
325
|
+
provider.circuitOpenedAt = undefined;
|
|
326
|
+
this.transitionCircuitState(provider, 'closed');
|
|
327
|
+
this.logger.info(`Circuit reset for provider ${providerId}`, {
|
|
328
|
+
previousState
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Update provider state based on health check result
|
|
333
|
+
*/
|
|
334
|
+
updateProviderState(provider, result) {
|
|
335
|
+
const prevHealthy = provider.state.healthy;
|
|
336
|
+
provider.state.healthy = result.healthy;
|
|
337
|
+
provider.state.latency = result.latency;
|
|
338
|
+
provider.state.lastCheck = result.timestamp;
|
|
339
|
+
provider.state.lastError = result.error;
|
|
340
|
+
provider.state.checkCount++;
|
|
341
|
+
if (result.healthy) {
|
|
342
|
+
provider.state.successCount++;
|
|
343
|
+
}
|
|
344
|
+
// Calculate error rate (last 100 checks)
|
|
345
|
+
const recentWindow = Math.min(provider.state.checkCount, 100);
|
|
346
|
+
const recentSuccesses = Math.min(provider.state.successCount, recentWindow);
|
|
347
|
+
provider.state.errorRate = 1 - (recentSuccesses / recentWindow);
|
|
348
|
+
// Calculate availability (all-time)
|
|
349
|
+
provider.state.availability = provider.state.successCount / provider.state.checkCount;
|
|
350
|
+
// Emit health change event if status changed
|
|
351
|
+
if (prevHealthy !== result.healthy) {
|
|
352
|
+
this.emit('health-change', {
|
|
353
|
+
providerId: provider.providerId,
|
|
354
|
+
healthy: result.healthy,
|
|
355
|
+
previousHealthy: prevHealthy,
|
|
356
|
+
errorRate: provider.state.errorRate,
|
|
357
|
+
availability: provider.state.availability,
|
|
358
|
+
latency: result.latency,
|
|
359
|
+
timestamp: result.timestamp
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Handle successful health check
|
|
365
|
+
*/
|
|
366
|
+
handleSuccessfulCheck(provider) {
|
|
367
|
+
// Reset consecutive failures on success
|
|
368
|
+
provider.state.consecutiveFailures = 0;
|
|
369
|
+
// If circuit was half-open, close it
|
|
370
|
+
if (provider.state.circuitState === 'half-open') {
|
|
371
|
+
this.transitionCircuitState(provider, 'closed');
|
|
372
|
+
provider.circuitOpenedAt = undefined;
|
|
373
|
+
this.logger.info(`Circuit closed for provider ${provider.providerId} after successful recovery`);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Handle failed health check
|
|
378
|
+
*/
|
|
379
|
+
handleFailedCheck(provider, error) {
|
|
380
|
+
provider.state.consecutiveFailures++;
|
|
381
|
+
this.logger.warn(`Health check failed for provider ${provider.providerId}`, {
|
|
382
|
+
consecutiveFailures: provider.state.consecutiveFailures,
|
|
383
|
+
failureThreshold: this.config.failureThreshold,
|
|
384
|
+
error
|
|
385
|
+
});
|
|
386
|
+
// Open circuit if failure threshold exceeded
|
|
387
|
+
if (provider.state.consecutiveFailures >= this.config.failureThreshold &&
|
|
388
|
+
provider.state.circuitState !== 'open') {
|
|
389
|
+
this.transitionCircuitState(provider, 'open');
|
|
390
|
+
provider.circuitOpenedAt = new Date();
|
|
391
|
+
this.logger.error(`Circuit opened for provider ${provider.providerId}`, {
|
|
392
|
+
consecutiveFailures: provider.state.consecutiveFailures,
|
|
393
|
+
failureThreshold: this.config.failureThreshold
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Transition circuit breaker state
|
|
399
|
+
*/
|
|
400
|
+
transitionCircuitState(provider, newState) {
|
|
401
|
+
const prevState = provider.state.circuitState;
|
|
402
|
+
provider.state.circuitState = newState;
|
|
403
|
+
// Emit circuit change event
|
|
404
|
+
this.emit('circuit-change', {
|
|
405
|
+
providerId: provider.providerId,
|
|
406
|
+
circuitState: newState,
|
|
407
|
+
previousState: prevState,
|
|
408
|
+
consecutiveFailures: provider.state.consecutiveFailures,
|
|
409
|
+
timestamp: new Date()
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Execute a promise with timeout
|
|
414
|
+
*/
|
|
415
|
+
async withTimeout(promise, timeoutMs, errorMessage) {
|
|
416
|
+
let timeoutHandle;
|
|
417
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
418
|
+
timeoutHandle = setTimeout(() => {
|
|
419
|
+
reject(new Error(errorMessage));
|
|
420
|
+
}, timeoutMs);
|
|
421
|
+
});
|
|
422
|
+
try {
|
|
423
|
+
return await Promise.race([promise, timeoutPromise]);
|
|
424
|
+
}
|
|
425
|
+
finally {
|
|
426
|
+
clearTimeout(timeoutHandle);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
exports.ProviderHealthMonitor = ProviderHealthMonitor;
|
|
431
|
+
//# sourceMappingURL=ProviderHealthMonitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProviderHealthMonitor.js","sourceRoot":"","sources":["../../src/monitoring/ProviderHealthMonitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
/**
|
|
3
|
+
* Quota configuration for a specific LLM provider
|
|
4
|
+
*/
|
|
5
|
+
export interface ProviderQuota {
|
|
6
|
+
providerId: string;
|
|
7
|
+
dailyLimit: number;
|
|
8
|
+
minuteLimit?: number;
|
|
9
|
+
resetTimeUtc: string;
|
|
10
|
+
warningThresholds: number[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Current quota status for a provider
|
|
14
|
+
*/
|
|
15
|
+
export interface QuotaStatus {
|
|
16
|
+
providerId: string;
|
|
17
|
+
dailyUsed: number;
|
|
18
|
+
dailyRemaining: number;
|
|
19
|
+
dailyLimit: number;
|
|
20
|
+
minuteUsed: number;
|
|
21
|
+
minuteRemaining: number;
|
|
22
|
+
minuteLimit: number;
|
|
23
|
+
percentageUsed: number;
|
|
24
|
+
nextResetTime: Date;
|
|
25
|
+
isExhausted: boolean;
|
|
26
|
+
warningLevel: 'none' | 'warning' | 'critical' | 'exhausted';
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Configuration for QuotaManager
|
|
30
|
+
*/
|
|
31
|
+
export interface QuotaManagerConfig {
|
|
32
|
+
providers: ProviderQuota[];
|
|
33
|
+
enforcementMode: 'warn' | 'block' | 'none';
|
|
34
|
+
alertCallback?: (status: QuotaStatus) => void;
|
|
35
|
+
persistState?: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Manages quota tracking and enforcement across LLM providers
|
|
39
|
+
*/
|
|
40
|
+
export declare class QuotaManager extends EventEmitter {
|
|
41
|
+
private config;
|
|
42
|
+
private quotas;
|
|
43
|
+
private usage;
|
|
44
|
+
private resetTimers;
|
|
45
|
+
private cleanupInterval?;
|
|
46
|
+
constructor(config: QuotaManagerConfig);
|
|
47
|
+
/**
|
|
48
|
+
* Register a new provider with quota limits
|
|
49
|
+
*/
|
|
50
|
+
registerProvider(quota: ProviderQuota): void;
|
|
51
|
+
/**
|
|
52
|
+
* Update quota configuration for a provider
|
|
53
|
+
*/
|
|
54
|
+
updateQuota(providerId: string, updates: Partial<ProviderQuota>): void;
|
|
55
|
+
/**
|
|
56
|
+
* Record a single request for a provider
|
|
57
|
+
*/
|
|
58
|
+
recordRequest(providerId: string): void;
|
|
59
|
+
/**
|
|
60
|
+
* Record multiple requests for a provider
|
|
61
|
+
*/
|
|
62
|
+
recordRequests(providerId: string, count: number): void;
|
|
63
|
+
/**
|
|
64
|
+
* Check if a request can be made without exceeding quota
|
|
65
|
+
*/
|
|
66
|
+
canMakeRequest(providerId: string): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Get remaining quota for a provider
|
|
69
|
+
*/
|
|
70
|
+
getRemainingQuota(providerId: string): {
|
|
71
|
+
daily: number;
|
|
72
|
+
minute: number;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Get current quota status for a provider
|
|
76
|
+
*/
|
|
77
|
+
getQuotaStatus(providerId: string): QuotaStatus | undefined;
|
|
78
|
+
/**
|
|
79
|
+
* Get quota status for all providers
|
|
80
|
+
*/
|
|
81
|
+
getAllQuotaStatus(): Map<string, QuotaStatus>;
|
|
82
|
+
/**
|
|
83
|
+
* Reset daily quota for a provider
|
|
84
|
+
*/
|
|
85
|
+
resetDailyQuota(providerId: string): void;
|
|
86
|
+
/**
|
|
87
|
+
* Reset daily quotas for all providers
|
|
88
|
+
*/
|
|
89
|
+
resetAllDailyQuotas(): void;
|
|
90
|
+
/**
|
|
91
|
+
* Start automatic quota reset scheduling
|
|
92
|
+
*/
|
|
93
|
+
startAutoReset(): void;
|
|
94
|
+
/**
|
|
95
|
+
* Stop automatic quota reset scheduling
|
|
96
|
+
*/
|
|
97
|
+
stopAutoReset(): void;
|
|
98
|
+
/**
|
|
99
|
+
* Stop cleanup interval (alias for use in CLI commands)
|
|
100
|
+
*/
|
|
101
|
+
stopCleanup(): void;
|
|
102
|
+
/**
|
|
103
|
+
* Save current state for persistence
|
|
104
|
+
*/
|
|
105
|
+
saveState(): void;
|
|
106
|
+
/**
|
|
107
|
+
* Load persisted state
|
|
108
|
+
*/
|
|
109
|
+
loadState(): void;
|
|
110
|
+
private scheduleNextReset;
|
|
111
|
+
private getMinuteUsage;
|
|
112
|
+
private cleanupOldMinuteEntries;
|
|
113
|
+
private cleanupMinuteWindows;
|
|
114
|
+
private determineWarningLevel;
|
|
115
|
+
private checkThresholds;
|
|
116
|
+
private calculateNextResetTime;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Factory function to create QuotaManager with common provider presets
|
|
120
|
+
*/
|
|
121
|
+
export declare function createQuotaManager(config?: Partial<QuotaManagerConfig>): QuotaManager;
|
|
122
|
+
//# sourceMappingURL=QuotaManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QuotaManager.d.ts","sourceRoot":"","sources":["../../src/monitoring/QuotaManager.ts"],"names":[],"mappings":"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"}
|