@splashcodex/api-key-manager 3.0.0 → 4.1.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/README.md +64 -13
- package/dist/index.d.ts +50 -2
- package/dist/index.js +237 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +277 -8
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# @splashcodex/
|
|
1
|
+
# @splashcodex/ApiKeyManager v4.1 — Mastermind Edition
|
|
2
2
|
|
|
3
|
-
> Universal API Key Rotation System with Resilience, Load Balancing & AI Gateway Features
|
|
3
|
+
> Universal API Key Rotation System with Resilience, Load Balancing, Semantic Caching & AI Gateway Features
|
|
4
4
|
|
|
5
|
-
[](https://www.npmjs.com/package/@splashcodex/ApiKeyManager)
|
|
6
6
|
|
|
7
7
|
## Features
|
|
8
8
|
|
|
@@ -17,8 +17,11 @@
|
|
|
17
17
|
- **Provider Tagging** — Multi-provider routing (`openai`, `gemini`, etc.)
|
|
18
18
|
- **Health Checks** — Periodic key validation and auto-recovery
|
|
19
19
|
- **Bulkhead / Concurrency** — Limits concurrent `execute()` calls
|
|
20
|
+
- **Semantic Cache** *(v4 NEW)* — Cosine-similarity cache with pluggable embeddings
|
|
21
|
+
- **Streaming Support** *(v4.1 NEW)* — `executeStream()` with initial retry + cache replay
|
|
22
|
+
- **Recursion Guard** *(v4 NEW)* — Prevents infinite loops when `getEmbedding` calls `execute()`
|
|
20
23
|
- **State Persistence** — Survives restarts via pluggable storage
|
|
21
|
-
- **100% Backward Compatible** — v1.x and
|
|
24
|
+
- **100% Backward Compatible** — v1.x, v2.x, and v3.x code works without changes
|
|
22
25
|
|
|
23
26
|
## Installation
|
|
24
27
|
|
|
@@ -36,16 +39,62 @@ const manager = new ApiKeyManager(['key1', 'key2', 'key3']);
|
|
|
36
39
|
const key = manager.getKey();
|
|
37
40
|
manager.markSuccess(key!);
|
|
38
41
|
|
|
39
|
-
// v3 — Full power
|
|
42
|
+
// v3+ — Full power
|
|
40
43
|
const result = await manager.execute(
|
|
41
44
|
(key) => fetch(`https://api.example.com?key=${key}`),
|
|
42
45
|
{ maxRetries: 3, timeoutMs: 5000 }
|
|
43
46
|
);
|
|
44
47
|
```
|
|
45
48
|
|
|
46
|
-
##
|
|
49
|
+
## v4.0 — Semantic Cache (Mastermind Edition)
|
|
47
50
|
|
|
48
|
-
|
|
51
|
+
Automatically cache API responses by semantic similarity. Identical or near-identical prompts return cached results without consuming API quota.
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
import { ApiKeyManager } from '@splashcodex/api-key-manager';
|
|
55
|
+
|
|
56
|
+
const manager = new ApiKeyManager(['key1', 'key2'], {
|
|
57
|
+
semanticCache: {
|
|
58
|
+
threshold: 0.92, // 92% cosine similarity to match
|
|
59
|
+
ttlMs: 86400000, // 24-hour TTL (default)
|
|
60
|
+
getEmbedding: async (text) => {
|
|
61
|
+
// Your embedding function (e.g. OpenAI, Gemini, local model)
|
|
62
|
+
return await myEmbeddingModel.embed(text);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// First call → API hit, cached
|
|
68
|
+
const r1 = await manager.execute(apiFn, { prompt: 'What is the weather?' });
|
|
69
|
+
|
|
70
|
+
// Second call → Semantic Cache HIT (no API call)
|
|
71
|
+
const r2 = await manager.execute(apiFn, { prompt: 'How is the weather today?' });
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### v4.1 — Streaming Support
|
|
75
|
+
|
|
76
|
+
Real-time response handling with the same resilience as `execute()`.
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
const stream = await manager.executeStream(async (key) => {
|
|
80
|
+
return await gemini.generateContentStream({ prompt: "..." });
|
|
81
|
+
}, { prompt: "..." });
|
|
82
|
+
|
|
83
|
+
for await (const chunk of stream) {
|
|
84
|
+
console.log(chunk.text()); // Zero-latency interaction
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
- **Smart Retries**: If the initial connection fails, it rotates keys and retries.
|
|
89
|
+
- **Cache Replay**: Semantic cache accumulates stream chunks and replays the full stream on a cache hit.
|
|
90
|
+
- **Event Driven**: Emits `executeSuccess`, `executeFailed`, and `retry` just like the standard wrapper.
|
|
91
|
+
|
|
92
|
+
> **Recursion Guard**: If your `getEmbedding` callback internally calls `execute()`,
|
|
93
|
+
> the cache automatically skips on nested calls to prevent infinite recursion.
|
|
94
|
+
|
|
95
|
+
## execute() Wrapper
|
|
96
|
+
|
|
97
|
+
Wraps the entire lifecycle into one method:
|
|
49
98
|
|
|
50
99
|
```typescript
|
|
51
100
|
const manager = new ApiKeyManager(keys, {
|
|
@@ -62,7 +111,7 @@ const result = await manager.execute(
|
|
|
62
111
|
},
|
|
63
112
|
{ maxRetries: 3, timeoutMs: 10000 }
|
|
64
113
|
);
|
|
65
|
-
// Handles: key selection → timeout → retry → fallback → latency tracking
|
|
114
|
+
// Handles: key selection → cache → timeout → retry → fallback → latency tracking
|
|
66
115
|
```
|
|
67
116
|
|
|
68
117
|
## Event Emitter
|
|
@@ -163,12 +212,13 @@ try {
|
|
|
163
212
|
// Legacy (v1/v2)
|
|
164
213
|
new ApiKeyManager(keys, storage?, strategy?)
|
|
165
214
|
|
|
166
|
-
// v3 Options
|
|
215
|
+
// v3+ Options
|
|
167
216
|
new ApiKeyManager(keys, {
|
|
168
|
-
storage?,
|
|
169
|
-
strategy?,
|
|
170
|
-
fallbackFn?,
|
|
171
|
-
concurrency?,
|
|
217
|
+
storage?, // Pluggable storage { getItem, setItem }
|
|
218
|
+
strategy?, // LoadBalancingStrategy instance
|
|
219
|
+
fallbackFn?, // () => any — called when all keys exhausted
|
|
220
|
+
concurrency?, // Max concurrent execute() calls
|
|
221
|
+
semanticCache?, // v4: { threshold, ttlMs, getEmbedding }
|
|
172
222
|
})
|
|
173
223
|
```
|
|
174
224
|
|
|
@@ -182,6 +232,7 @@ new ApiKeyManager(keys, {
|
|
|
182
232
|
| `markFailed(key, classification)` | Report failure with error type |
|
|
183
233
|
| `classifyError(error, finishReason?)` | Classify an error automatically |
|
|
184
234
|
| `execute(fn, options?)` | Full lifecycle wrapper with retry/timeout |
|
|
235
|
+
| `executeStream(fn, options?)` | Streaming lifecycle wrapper |
|
|
185
236
|
| `calculateBackoff(attempt)` | Get backoff delay with jitter |
|
|
186
237
|
| `getStats()` | Get pool health statistics |
|
|
187
238
|
| `getKeyCount()` | Count of non-DEAD keys |
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Universal ApiKeyManager
|
|
2
|
+
* Universal ApiKeyManager v4.0 — Mastermind Edition
|
|
3
3
|
* Implements: Rotation, Circuit Breaker, Persistence, Exponential Backoff, Strategies,
|
|
4
4
|
* Event Emitter, Fallback, execute(), Timeout, Auto-Retry, Provider Tags,
|
|
5
5
|
* Health Checks, Bulkhead/Concurrency
|
|
@@ -41,12 +41,24 @@ export interface ExecuteOptions {
|
|
|
41
41
|
timeoutMs?: number;
|
|
42
42
|
maxRetries?: number;
|
|
43
43
|
finishReason?: string;
|
|
44
|
+
provider?: string;
|
|
44
45
|
}
|
|
45
46
|
export interface ApiKeyManagerOptions {
|
|
46
47
|
storage?: any;
|
|
47
48
|
strategy?: LoadBalancingStrategy;
|
|
48
49
|
fallbackFn?: () => any;
|
|
49
50
|
concurrency?: number;
|
|
51
|
+
semanticCache?: {
|
|
52
|
+
threshold?: number;
|
|
53
|
+
ttlMs?: number;
|
|
54
|
+
getEmbedding: (text: string) => Promise<number[]>;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export interface CacheEntry {
|
|
58
|
+
vector: number[];
|
|
59
|
+
prompt: string;
|
|
60
|
+
response: any;
|
|
61
|
+
timestamp: number;
|
|
50
62
|
}
|
|
51
63
|
export interface ApiKeyManagerEventMap {
|
|
52
64
|
keyDead: (key: string) => void;
|
|
@@ -96,6 +108,22 @@ export declare class WeightedStrategy implements LoadBalancingStrategy {
|
|
|
96
108
|
export declare class LatencyStrategy implements LoadBalancingStrategy {
|
|
97
109
|
next(candidates: KeyState[]): KeyState | null;
|
|
98
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* High-performance Vanilla Semantic Cache
|
|
113
|
+
* Implements Cosine Similarity math from scratch.
|
|
114
|
+
*/
|
|
115
|
+
export declare class SemanticCache {
|
|
116
|
+
private entries;
|
|
117
|
+
private threshold;
|
|
118
|
+
private ttlMs;
|
|
119
|
+
constructor(threshold?: number, ttlMs?: number);
|
|
120
|
+
set(prompt: string, vector: number[], response: any): void;
|
|
121
|
+
get(vector: number[]): any | null;
|
|
122
|
+
/**
|
|
123
|
+
* Vanilla Cosine Similarity: (A·B) / (||A|| * ||B||)
|
|
124
|
+
*/
|
|
125
|
+
private calculateCosineSimilarity;
|
|
126
|
+
}
|
|
99
127
|
export declare class ApiKeyManager extends EventEmitter {
|
|
100
128
|
private keys;
|
|
101
129
|
private storageKey;
|
|
@@ -106,6 +134,9 @@ export declare class ApiKeyManager extends EventEmitter {
|
|
|
106
134
|
private activeCalls;
|
|
107
135
|
private healthCheckFn?;
|
|
108
136
|
private healthCheckInterval?;
|
|
137
|
+
private semanticCache?;
|
|
138
|
+
private getEmbeddingFn?;
|
|
139
|
+
private _isResolvingEmbedding;
|
|
109
140
|
/**
|
|
110
141
|
* Constructor supports both legacy positional args and new options object.
|
|
111
142
|
*
|
|
@@ -151,7 +182,24 @@ export declare class ApiKeyManager extends EventEmitter {
|
|
|
151
182
|
* { maxRetries: 3, timeoutMs: 5000 }
|
|
152
183
|
* );
|
|
153
184
|
*/
|
|
154
|
-
execute<T>(fn: (key: string, signal?: AbortSignal) => Promise<T>, options?: ExecuteOptions
|
|
185
|
+
execute<T>(fn: (key: string, signal?: AbortSignal) => Promise<T>, options?: ExecuteOptions & {
|
|
186
|
+
prompt?: string;
|
|
187
|
+
}): Promise<T>;
|
|
188
|
+
/**
|
|
189
|
+
* Executes a streaming function (AsyncGenerator) with retry logic and semantic caching.
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* const stream = await manager.executeStream(async (key) => {
|
|
193
|
+
* return await gemini.generateContentStream({ prompt: "..." });
|
|
194
|
+
* }, { prompt: "..." });
|
|
195
|
+
*
|
|
196
|
+
* for await (const chunk of stream) {
|
|
197
|
+
* console.log(chunk.text());
|
|
198
|
+
* }
|
|
199
|
+
*/
|
|
200
|
+
executeStream<T>(fn: (key: string, signal?: AbortSignal) => AsyncGenerator<T, any, unknown>, options?: ExecuteOptions & {
|
|
201
|
+
prompt?: string;
|
|
202
|
+
}): AsyncGenerator<T, any, unknown>;
|
|
155
203
|
private _executeWithRetry;
|
|
156
204
|
private _executeWithTimeout;
|
|
157
205
|
private _sleep;
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Universal ApiKeyManager
|
|
3
|
+
* Universal ApiKeyManager v4.0 — Mastermind Edition
|
|
4
4
|
* Implements: Rotation, Circuit Breaker, Persistence, Exponential Backoff, Strategies,
|
|
5
5
|
* Event Emitter, Fallback, execute(), Timeout, Auto-Retry, Provider Tags,
|
|
6
6
|
* Health Checks, Bulkhead/Concurrency
|
|
7
7
|
* Gemini-Specific: finishReason handling, Safety blocks, RECITATION detection
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.ApiKeyManager = exports.LatencyStrategy = exports.WeightedStrategy = exports.StandardStrategy = exports.AllKeysExhaustedError = exports.BulkheadRejectionError = exports.TimeoutError = void 0;
|
|
10
|
+
exports.ApiKeyManager = exports.SemanticCache = exports.LatencyStrategy = exports.WeightedStrategy = exports.StandardStrategy = exports.AllKeysExhaustedError = exports.BulkheadRejectionError = exports.TimeoutError = void 0;
|
|
11
11
|
const events_1 = require("events");
|
|
12
12
|
// ─── Config ──────────────────────────────────────────────────────────────────
|
|
13
13
|
const CONFIG = {
|
|
@@ -94,6 +94,70 @@ class LatencyStrategy {
|
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
exports.LatencyStrategy = LatencyStrategy;
|
|
97
|
+
// ─── Semantic Engine ─────────────────────────────────────────────────────────
|
|
98
|
+
/**
|
|
99
|
+
* High-performance Vanilla Semantic Cache
|
|
100
|
+
* Implements Cosine Similarity math from scratch.
|
|
101
|
+
*/
|
|
102
|
+
class SemanticCache {
|
|
103
|
+
entries = [];
|
|
104
|
+
threshold;
|
|
105
|
+
ttlMs;
|
|
106
|
+
constructor(threshold = 0.95, ttlMs = 24 * 60 * 60 * 1000) {
|
|
107
|
+
this.threshold = threshold;
|
|
108
|
+
this.ttlMs = ttlMs;
|
|
109
|
+
}
|
|
110
|
+
set(prompt, vector, response) {
|
|
111
|
+
// Expire old entry for same prompt if exists
|
|
112
|
+
this.entries = this.entries.filter(e => e.prompt !== prompt);
|
|
113
|
+
this.entries.push({
|
|
114
|
+
prompt,
|
|
115
|
+
vector,
|
|
116
|
+
response,
|
|
117
|
+
timestamp: Date.now()
|
|
118
|
+
});
|
|
119
|
+
// Optional: Cap size to prevent memory leaks
|
|
120
|
+
if (this.entries.length > 500)
|
|
121
|
+
this.entries.shift();
|
|
122
|
+
}
|
|
123
|
+
get(vector) {
|
|
124
|
+
const now = Date.now();
|
|
125
|
+
let bestMatch = null;
|
|
126
|
+
let highestSimilarity = -1;
|
|
127
|
+
for (let i = this.entries.length - 1; i >= 0; i--) {
|
|
128
|
+
const entry = this.entries[i];
|
|
129
|
+
// Check TTL
|
|
130
|
+
if (now - entry.timestamp > this.ttlMs) {
|
|
131
|
+
this.entries.splice(i, 1);
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const similarity = this.calculateCosineSimilarity(vector, entry.vector);
|
|
135
|
+
if (similarity >= this.threshold && similarity > highestSimilarity) {
|
|
136
|
+
highestSimilarity = similarity;
|
|
137
|
+
bestMatch = entry;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return bestMatch ? bestMatch.response : null;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Vanilla Cosine Similarity: (A·B) / (||A|| * ||B||)
|
|
144
|
+
*/
|
|
145
|
+
calculateCosineSimilarity(vecA, vecB) {
|
|
146
|
+
if (vecA.length !== vecB.length)
|
|
147
|
+
return 0;
|
|
148
|
+
let dotProduct = 0;
|
|
149
|
+
let normA = 0;
|
|
150
|
+
let normB = 0;
|
|
151
|
+
for (let i = 0; i < vecA.length; i++) {
|
|
152
|
+
dotProduct += vecA[i] * vecB[i];
|
|
153
|
+
normA += vecA[i] * vecA[i];
|
|
154
|
+
normB += vecB[i] * vecB[i];
|
|
155
|
+
}
|
|
156
|
+
const denominator = Math.sqrt(normA) * Math.sqrt(normB);
|
|
157
|
+
return denominator === 0 ? 0 : dotProduct / denominator;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.SemanticCache = SemanticCache;
|
|
97
161
|
// ─── Main Class ──────────────────────────────────────────────────────────────
|
|
98
162
|
class ApiKeyManager extends events_1.EventEmitter {
|
|
99
163
|
keys = [];
|
|
@@ -107,6 +171,10 @@ class ApiKeyManager extends events_1.EventEmitter {
|
|
|
107
171
|
// Health check state
|
|
108
172
|
healthCheckFn;
|
|
109
173
|
healthCheckInterval;
|
|
174
|
+
// Semantic Cache v4
|
|
175
|
+
semanticCache;
|
|
176
|
+
getEmbeddingFn;
|
|
177
|
+
_isResolvingEmbedding = false; // Recursion guard
|
|
110
178
|
/**
|
|
111
179
|
* Constructor supports both legacy positional args and new options object.
|
|
112
180
|
*
|
|
@@ -120,7 +188,7 @@ class ApiKeyManager extends events_1.EventEmitter {
|
|
|
120
188
|
super();
|
|
121
189
|
// Detect if second arg is options object or legacy storage
|
|
122
190
|
let options = {};
|
|
123
|
-
if (storageOrOptions && typeof storageOrOptions === 'object' && ('storage' in storageOrOptions || 'strategy' in storageOrOptions || 'fallbackFn' in storageOrOptions || 'concurrency' in storageOrOptions)) {
|
|
191
|
+
if (storageOrOptions && typeof storageOrOptions === 'object' && ('storage' in storageOrOptions || 'strategy' in storageOrOptions || 'fallbackFn' in storageOrOptions || 'concurrency' in storageOrOptions || 'semanticCache' in storageOrOptions)) {
|
|
124
192
|
// New v3 options object
|
|
125
193
|
options = storageOrOptions;
|
|
126
194
|
}
|
|
@@ -138,6 +206,11 @@ class ApiKeyManager extends events_1.EventEmitter {
|
|
|
138
206
|
this.strategy = options.strategy || new StandardStrategy();
|
|
139
207
|
this.fallbackFn = options.fallbackFn;
|
|
140
208
|
this.maxConcurrency = options.concurrency || Infinity;
|
|
209
|
+
// Init Semantic Cache if provided
|
|
210
|
+
if (options.semanticCache) {
|
|
211
|
+
this.semanticCache = new SemanticCache(options.semanticCache.threshold, options.semanticCache.ttlMs);
|
|
212
|
+
this.getEmbeddingFn = options.semanticCache.getEmbedding;
|
|
213
|
+
}
|
|
141
214
|
// Normalize input to objects
|
|
142
215
|
let inputKeys = [];
|
|
143
216
|
if (initialKeys.length > 0 && typeof initialKeys[0] === 'string') {
|
|
@@ -386,23 +459,173 @@ class ApiKeyManager extends events_1.EventEmitter {
|
|
|
386
459
|
const maxRetries = options?.maxRetries ?? 0;
|
|
387
460
|
const timeoutMs = options?.timeoutMs;
|
|
388
461
|
const finishReason = options?.finishReason;
|
|
389
|
-
|
|
462
|
+
const prompt = options?.prompt;
|
|
463
|
+
const provider = options?.provider;
|
|
464
|
+
// 1. Semantic Cache Check (Mastermind Edition)
|
|
465
|
+
// Guard: skip cache if we're already resolving an embedding to prevent
|
|
466
|
+
// infinite recursion when getEmbeddingFn calls execute() internally.
|
|
467
|
+
let currentPromptVector = null;
|
|
468
|
+
if (this.semanticCache && this.getEmbeddingFn && prompt && !this._isResolvingEmbedding) {
|
|
469
|
+
try {
|
|
470
|
+
this._isResolvingEmbedding = true;
|
|
471
|
+
currentPromptVector = await this.getEmbeddingFn(prompt);
|
|
472
|
+
const cachedResponse = this.semanticCache.get(currentPromptVector);
|
|
473
|
+
if (cachedResponse !== null) {
|
|
474
|
+
console.log(`[Semantic Cache HIT] for prompt: "${prompt.slice(0, 30)}..."`);
|
|
475
|
+
this.emit('executeSuccess', 'CACHE_HIT', 0);
|
|
476
|
+
return cachedResponse;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
catch (e) {
|
|
480
|
+
console.warn('[Semantic Cache Check Failed] Proceeding to live API', e);
|
|
481
|
+
}
|
|
482
|
+
finally {
|
|
483
|
+
this._isResolvingEmbedding = false;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
// 2. Bulkhead check
|
|
390
487
|
if (this.activeCalls >= this.maxConcurrency) {
|
|
391
488
|
this.emit('bulkheadRejected');
|
|
392
489
|
throw new BulkheadRejectionError();
|
|
393
490
|
}
|
|
394
491
|
this.activeCalls++;
|
|
395
492
|
try {
|
|
396
|
-
|
|
493
|
+
const result = await this._executeWithRetry(fn, maxRetries, timeoutMs, finishReason, provider);
|
|
494
|
+
// 3. Store in Semantic Cache on success
|
|
495
|
+
if (this.semanticCache && prompt && currentPromptVector) {
|
|
496
|
+
this.semanticCache.set(prompt, currentPromptVector, result);
|
|
497
|
+
}
|
|
498
|
+
return result;
|
|
397
499
|
}
|
|
398
500
|
finally {
|
|
399
501
|
this.activeCalls--;
|
|
400
502
|
}
|
|
401
503
|
}
|
|
402
|
-
|
|
504
|
+
/**
|
|
505
|
+
* Executes a streaming function (AsyncGenerator) with retry logic and semantic caching.
|
|
506
|
+
*
|
|
507
|
+
* @example
|
|
508
|
+
* const stream = await manager.executeStream(async (key) => {
|
|
509
|
+
* return await gemini.generateContentStream({ prompt: "..." });
|
|
510
|
+
* }, { prompt: "..." });
|
|
511
|
+
*
|
|
512
|
+
* for await (const chunk of stream) {
|
|
513
|
+
* console.log(chunk.text());
|
|
514
|
+
* }
|
|
515
|
+
*/
|
|
516
|
+
async *executeStream(fn, options) {
|
|
517
|
+
const maxRetries = options?.maxRetries ?? 0;
|
|
518
|
+
const timeoutMs = options?.timeoutMs;
|
|
519
|
+
const finishReason = options?.finishReason;
|
|
520
|
+
const prompt = options?.prompt;
|
|
521
|
+
const provider = options?.provider;
|
|
522
|
+
// 1. Semantic Cache Check
|
|
523
|
+
let currentPromptVector = null;
|
|
524
|
+
if (this.semanticCache && this.getEmbeddingFn && prompt && !this._isResolvingEmbedding) {
|
|
525
|
+
try {
|
|
526
|
+
this._isResolvingEmbedding = true;
|
|
527
|
+
currentPromptVector = await this.getEmbeddingFn(prompt);
|
|
528
|
+
const cachedResponse = this.semanticCache.get(currentPromptVector);
|
|
529
|
+
if (cachedResponse !== null) {
|
|
530
|
+
console.log(`[Semantic Cache HIT] Streaming cached response for prompt: "${prompt.slice(0, 30)}..."`);
|
|
531
|
+
this.emit('executeSuccess', 'CACHE_HIT_STREAM', 0);
|
|
532
|
+
// Replay full response as a single chunk (or iterate if it's an array)
|
|
533
|
+
if (Array.isArray(cachedResponse)) {
|
|
534
|
+
for (const chunk of cachedResponse)
|
|
535
|
+
yield chunk;
|
|
536
|
+
}
|
|
537
|
+
else {
|
|
538
|
+
yield cachedResponse;
|
|
539
|
+
}
|
|
540
|
+
return;
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
catch (e) {
|
|
544
|
+
console.warn('[Semantic Cache Check Failed] Proceeding to live stream', e);
|
|
545
|
+
}
|
|
546
|
+
finally {
|
|
547
|
+
this._isResolvingEmbedding = false;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
// 2. Bulkhead check
|
|
551
|
+
if (this.activeCalls >= this.maxConcurrency) {
|
|
552
|
+
this.emit('bulkheadRejected');
|
|
553
|
+
throw new BulkheadRejectionError();
|
|
554
|
+
}
|
|
555
|
+
this.activeCalls++;
|
|
556
|
+
const accumulatedChunks = [];
|
|
557
|
+
let lastError;
|
|
558
|
+
try {
|
|
559
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
560
|
+
const key = provider ? this.getKeyByProvider(provider) : this.getKey();
|
|
561
|
+
if (!key) {
|
|
562
|
+
if (this.fallbackFn) {
|
|
563
|
+
this.emit('fallback', 'all keys exhausted (stream)');
|
|
564
|
+
yield this.fallbackFn();
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
throw new AllKeysExhaustedError();
|
|
568
|
+
}
|
|
569
|
+
let iterator;
|
|
570
|
+
try {
|
|
571
|
+
// Start the generator
|
|
572
|
+
iterator = fn(key);
|
|
573
|
+
// PRIME THE ITERATOR:
|
|
574
|
+
// Try to get the first chunk. This forces the generator body to
|
|
575
|
+
// execute until the first 'yield' or until it throws.
|
|
576
|
+
const firstResult = await iterator.next();
|
|
577
|
+
// If we got here, the INITIAL connection/logic succeeded!
|
|
578
|
+
if (firstResult.done)
|
|
579
|
+
return;
|
|
580
|
+
// Yield first chunk
|
|
581
|
+
yield firstResult.value;
|
|
582
|
+
if (this.semanticCache && prompt)
|
|
583
|
+
accumulatedChunks.push(firstResult.value);
|
|
584
|
+
// Yield rest of chunks
|
|
585
|
+
for await (const chunk of iterator) {
|
|
586
|
+
yield chunk;
|
|
587
|
+
if (this.semanticCache && prompt)
|
|
588
|
+
accumulatedChunks.push(chunk);
|
|
589
|
+
}
|
|
590
|
+
// Success! Store in cache
|
|
591
|
+
if (this.semanticCache && prompt && currentPromptVector && accumulatedChunks.length > 0) {
|
|
592
|
+
this.semanticCache.set(prompt, currentPromptVector, accumulatedChunks);
|
|
593
|
+
}
|
|
594
|
+
return; // Full success, exit retry loop
|
|
595
|
+
}
|
|
596
|
+
catch (error) {
|
|
597
|
+
lastError = error;
|
|
598
|
+
const classification = this.classifyError(error, finishReason);
|
|
599
|
+
this.markFailed(key, classification);
|
|
600
|
+
this.emit('executeFailed', key, error);
|
|
601
|
+
// Note: If we already yielded the FIRST chunk, we CANNOT retry the connection
|
|
602
|
+
// because the user has already received data. Mid-stream failures propagate.
|
|
603
|
+
if (accumulatedChunks.length > 0) {
|
|
604
|
+
throw error;
|
|
605
|
+
}
|
|
606
|
+
if (!classification.retryable || attempt >= maxRetries) {
|
|
607
|
+
if (this.fallbackFn && attempt >= maxRetries) {
|
|
608
|
+
this.emit('fallback', 'max retries exceeded (stream)');
|
|
609
|
+
yield this.fallbackFn();
|
|
610
|
+
return;
|
|
611
|
+
}
|
|
612
|
+
throw error;
|
|
613
|
+
}
|
|
614
|
+
const delay = this.calculateBackoff(attempt);
|
|
615
|
+
this.emit('retry', key, attempt + 1, delay);
|
|
616
|
+
await this._sleep(delay);
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
finally {
|
|
621
|
+
this.activeCalls--;
|
|
622
|
+
}
|
|
623
|
+
throw lastError;
|
|
624
|
+
}
|
|
625
|
+
async _executeWithRetry(fn, maxRetries, timeoutMs, finishReason, provider) {
|
|
403
626
|
let lastError;
|
|
404
627
|
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
405
|
-
const key = this.getKey();
|
|
628
|
+
const key = provider ? this.getKeyByProvider(provider) : this.getKey();
|
|
406
629
|
if (!key) {
|
|
407
630
|
// All keys exhausted — try fallback
|
|
408
631
|
if (this.fallbackFn) {
|
|
@@ -466,7 +689,11 @@ class ApiKeyManager extends events_1.EventEmitter {
|
|
|
466
689
|
}
|
|
467
690
|
}
|
|
468
691
|
_sleep(ms) {
|
|
469
|
-
return new Promise(resolve =>
|
|
692
|
+
return new Promise(resolve => {
|
|
693
|
+
const timer = setTimeout(resolve, ms);
|
|
694
|
+
if (timer.unref)
|
|
695
|
+
timer.unref();
|
|
696
|
+
});
|
|
470
697
|
}
|
|
471
698
|
// ─── Health Checks ───────────────────────────────────────────────────────
|
|
472
699
|
/**
|
|
@@ -482,6 +709,8 @@ class ApiKeyManager extends events_1.EventEmitter {
|
|
|
482
709
|
startHealthChecks(intervalMs = 60_000) {
|
|
483
710
|
this.stopHealthChecks(); // Clear any existing interval
|
|
484
711
|
this.healthCheckInterval = setInterval(() => this._runHealthChecks(), intervalMs);
|
|
712
|
+
if (this.healthCheckInterval.unref)
|
|
713
|
+
this.healthCheckInterval.unref();
|
|
485
714
|
}
|
|
486
715
|
/**
|
|
487
716
|
* Stop periodic health checks
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Universal ApiKeyManager
|
|
2
|
+
* Universal ApiKeyManager v4.0 — Mastermind Edition
|
|
3
3
|
* Implements: Rotation, Circuit Breaker, Persistence, Exponential Backoff, Strategies,
|
|
4
4
|
* Event Emitter, Fallback, execute(), Timeout, Auto-Retry, Provider Tags,
|
|
5
5
|
* Health Checks, Bulkhead/Concurrency
|
|
@@ -59,6 +59,7 @@ export interface ExecuteOptions {
|
|
|
59
59
|
timeoutMs?: number; // Timeout per attempt in ms
|
|
60
60
|
maxRetries?: number; // Max retry attempts (default: 0 = no retry)
|
|
61
61
|
finishReason?: string; // For Gemini finishReason handling
|
|
62
|
+
provider?: string; // Filter keys by provider (e.g. 'openai')
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
export interface ApiKeyManagerOptions {
|
|
@@ -66,6 +67,18 @@ export interface ApiKeyManagerOptions {
|
|
|
66
67
|
strategy?: LoadBalancingStrategy;
|
|
67
68
|
fallbackFn?: () => any;
|
|
68
69
|
concurrency?: number; // Max concurrent execute() calls
|
|
70
|
+
semanticCache?: {
|
|
71
|
+
threshold?: number; // Similarity threshold (0.0 - 1.0, default 0.95)
|
|
72
|
+
ttlMs?: number; // Cache TTL
|
|
73
|
+
getEmbedding: (text: string) => Promise<number[]>;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface CacheEntry {
|
|
78
|
+
vector: number[];
|
|
79
|
+
prompt: string;
|
|
80
|
+
response: any;
|
|
81
|
+
timestamp: number;
|
|
69
82
|
}
|
|
70
83
|
|
|
71
84
|
// ─── Event Types ─────────────────────────────────────────────────────────────
|
|
@@ -182,6 +195,79 @@ export class LatencyStrategy implements LoadBalancingStrategy {
|
|
|
182
195
|
}
|
|
183
196
|
}
|
|
184
197
|
|
|
198
|
+
// ─── Semantic Engine ─────────────────────────────────────────────────────────
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* High-performance Vanilla Semantic Cache
|
|
202
|
+
* Implements Cosine Similarity math from scratch.
|
|
203
|
+
*/
|
|
204
|
+
export class SemanticCache {
|
|
205
|
+
private entries: CacheEntry[] = [];
|
|
206
|
+
private threshold: number;
|
|
207
|
+
private ttlMs: number;
|
|
208
|
+
|
|
209
|
+
constructor(threshold: number = 0.95, ttlMs: number = 24 * 60 * 60 * 1000) {
|
|
210
|
+
this.threshold = threshold;
|
|
211
|
+
this.ttlMs = ttlMs;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
public set(prompt: string, vector: number[], response: any) {
|
|
215
|
+
// Expire old entry for same prompt if exists
|
|
216
|
+
this.entries = this.entries.filter(e => e.prompt !== prompt);
|
|
217
|
+
this.entries.push({
|
|
218
|
+
prompt,
|
|
219
|
+
vector,
|
|
220
|
+
response,
|
|
221
|
+
timestamp: Date.now()
|
|
222
|
+
});
|
|
223
|
+
// Optional: Cap size to prevent memory leaks
|
|
224
|
+
if (this.entries.length > 500) this.entries.shift();
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
public get(vector: number[]): any | null {
|
|
228
|
+
const now = Date.now();
|
|
229
|
+
let bestMatch: CacheEntry | null = null;
|
|
230
|
+
let highestSimilarity = -1;
|
|
231
|
+
|
|
232
|
+
for (let i = this.entries.length - 1; i >= 0; i--) {
|
|
233
|
+
const entry = this.entries[i];
|
|
234
|
+
|
|
235
|
+
// Check TTL
|
|
236
|
+
if (now - entry.timestamp > this.ttlMs) {
|
|
237
|
+
this.entries.splice(i, 1);
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const similarity = this.calculateCosineSimilarity(vector, entry.vector);
|
|
242
|
+
if (similarity >= this.threshold && similarity > highestSimilarity) {
|
|
243
|
+
highestSimilarity = similarity;
|
|
244
|
+
bestMatch = entry;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return bestMatch ? bestMatch.response : null;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Vanilla Cosine Similarity: (A·B) / (||A|| * ||B||)
|
|
253
|
+
*/
|
|
254
|
+
private calculateCosineSimilarity(vecA: number[], vecB: number[]): number {
|
|
255
|
+
if (vecA.length !== vecB.length) return 0;
|
|
256
|
+
let dotProduct = 0;
|
|
257
|
+
let normA = 0;
|
|
258
|
+
let normB = 0;
|
|
259
|
+
|
|
260
|
+
for (let i = 0; i < vecA.length; i++) {
|
|
261
|
+
dotProduct += vecA[i] * vecB[i];
|
|
262
|
+
normA += vecA[i] * vecA[i];
|
|
263
|
+
normB += vecB[i] * vecB[i];
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
const denominator = Math.sqrt(normA) * Math.sqrt(normB);
|
|
267
|
+
return denominator === 0 ? 0 : dotProduct / denominator;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
185
271
|
// ─── Main Class ──────────────────────────────────────────────────────────────
|
|
186
272
|
|
|
187
273
|
export class ApiKeyManager extends EventEmitter {
|
|
@@ -199,6 +285,11 @@ export class ApiKeyManager extends EventEmitter {
|
|
|
199
285
|
private healthCheckFn?: (key: string) => Promise<boolean>;
|
|
200
286
|
private healthCheckInterval?: ReturnType<typeof setInterval>;
|
|
201
287
|
|
|
288
|
+
// Semantic Cache v4
|
|
289
|
+
private semanticCache?: SemanticCache;
|
|
290
|
+
private getEmbeddingFn?: (text: string) => Promise<number[]>;
|
|
291
|
+
private _isResolvingEmbedding: boolean = false; // Recursion guard
|
|
292
|
+
|
|
202
293
|
/**
|
|
203
294
|
* Constructor supports both legacy positional args and new options object.
|
|
204
295
|
*
|
|
@@ -217,7 +308,7 @@ export class ApiKeyManager extends EventEmitter {
|
|
|
217
308
|
|
|
218
309
|
// Detect if second arg is options object or legacy storage
|
|
219
310
|
let options: ApiKeyManagerOptions = {};
|
|
220
|
-
if (storageOrOptions && typeof storageOrOptions === 'object' && ('storage' in storageOrOptions || 'strategy' in storageOrOptions || 'fallbackFn' in storageOrOptions || 'concurrency' in storageOrOptions)) {
|
|
311
|
+
if (storageOrOptions && typeof storageOrOptions === 'object' && ('storage' in storageOrOptions || 'strategy' in storageOrOptions || 'fallbackFn' in storageOrOptions || 'concurrency' in storageOrOptions || 'semanticCache' in storageOrOptions)) {
|
|
221
312
|
// New v3 options object
|
|
222
313
|
options = storageOrOptions as ApiKeyManagerOptions;
|
|
223
314
|
} else {
|
|
@@ -236,6 +327,15 @@ export class ApiKeyManager extends EventEmitter {
|
|
|
236
327
|
this.fallbackFn = options.fallbackFn;
|
|
237
328
|
this.maxConcurrency = options.concurrency || Infinity;
|
|
238
329
|
|
|
330
|
+
// Init Semantic Cache if provided
|
|
331
|
+
if (options.semanticCache) {
|
|
332
|
+
this.semanticCache = new SemanticCache(
|
|
333
|
+
options.semanticCache.threshold,
|
|
334
|
+
options.semanticCache.ttlMs
|
|
335
|
+
);
|
|
336
|
+
this.getEmbeddingFn = options.semanticCache.getEmbedding;
|
|
337
|
+
}
|
|
338
|
+
|
|
239
339
|
// Normalize input to objects
|
|
240
340
|
let inputKeys: { key: string; weight?: number; provider?: string }[] = [];
|
|
241
341
|
if (initialKeys.length > 0 && typeof initialKeys[0] === 'string') {
|
|
@@ -514,36 +614,201 @@ export class ApiKeyManager extends EventEmitter {
|
|
|
514
614
|
*/
|
|
515
615
|
public async execute<T>(
|
|
516
616
|
fn: (key: string, signal?: AbortSignal) => Promise<T>,
|
|
517
|
-
options?: ExecuteOptions
|
|
617
|
+
options?: ExecuteOptions & { prompt?: string }
|
|
518
618
|
): Promise<T> {
|
|
519
619
|
const maxRetries = options?.maxRetries ?? 0;
|
|
520
620
|
const timeoutMs = options?.timeoutMs;
|
|
521
621
|
const finishReason = options?.finishReason;
|
|
622
|
+
const prompt = options?.prompt;
|
|
623
|
+
const provider = options?.provider;
|
|
624
|
+
|
|
625
|
+
// 1. Semantic Cache Check (Mastermind Edition)
|
|
626
|
+
// Guard: skip cache if we're already resolving an embedding to prevent
|
|
627
|
+
// infinite recursion when getEmbeddingFn calls execute() internally.
|
|
628
|
+
let currentPromptVector: number[] | null = null;
|
|
629
|
+
if (this.semanticCache && this.getEmbeddingFn && prompt && !this._isResolvingEmbedding) {
|
|
630
|
+
try {
|
|
631
|
+
this._isResolvingEmbedding = true;
|
|
632
|
+
currentPromptVector = await this.getEmbeddingFn(prompt);
|
|
633
|
+
const cachedResponse = this.semanticCache.get(currentPromptVector);
|
|
634
|
+
if (cachedResponse !== null) {
|
|
635
|
+
console.log(`[Semantic Cache HIT] for prompt: "${prompt.slice(0, 30)}..."`);
|
|
636
|
+
this.emit('executeSuccess', 'CACHE_HIT', 0);
|
|
637
|
+
return cachedResponse as T;
|
|
638
|
+
}
|
|
639
|
+
} catch (e) {
|
|
640
|
+
console.warn('[Semantic Cache Check Failed] Proceeding to live API', e);
|
|
641
|
+
} finally {
|
|
642
|
+
this._isResolvingEmbedding = false;
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
// 2. Bulkhead check
|
|
647
|
+
if (this.activeCalls >= this.maxConcurrency) {
|
|
648
|
+
this.emit('bulkheadRejected');
|
|
649
|
+
throw new BulkheadRejectionError();
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
this.activeCalls++;
|
|
653
|
+
try {
|
|
654
|
+
const result = await this._executeWithRetry(fn, maxRetries, timeoutMs, finishReason, provider);
|
|
655
|
+
|
|
656
|
+
// 3. Store in Semantic Cache on success
|
|
657
|
+
if (this.semanticCache && prompt && currentPromptVector) {
|
|
658
|
+
this.semanticCache.set(prompt, currentPromptVector, result);
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
return result;
|
|
662
|
+
} finally {
|
|
663
|
+
this.activeCalls--;
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
/**
|
|
668
|
+
* Executes a streaming function (AsyncGenerator) with retry logic and semantic caching.
|
|
669
|
+
*
|
|
670
|
+
* @example
|
|
671
|
+
* const stream = await manager.executeStream(async (key) => {
|
|
672
|
+
* return await gemini.generateContentStream({ prompt: "..." });
|
|
673
|
+
* }, { prompt: "..." });
|
|
674
|
+
*
|
|
675
|
+
* for await (const chunk of stream) {
|
|
676
|
+
* console.log(chunk.text());
|
|
677
|
+
* }
|
|
678
|
+
*/
|
|
679
|
+
public async *executeStream<T>(
|
|
680
|
+
fn: (key: string, signal?: AbortSignal) => AsyncGenerator<T, any, unknown>,
|
|
681
|
+
options?: ExecuteOptions & { prompt?: string }
|
|
682
|
+
): AsyncGenerator<T, any, unknown> {
|
|
683
|
+
const maxRetries = options?.maxRetries ?? 0;
|
|
684
|
+
const timeoutMs = options?.timeoutMs;
|
|
685
|
+
const finishReason = options?.finishReason;
|
|
686
|
+
const prompt = options?.prompt;
|
|
687
|
+
const provider = options?.provider;
|
|
522
688
|
|
|
523
|
-
//
|
|
689
|
+
// 1. Semantic Cache Check
|
|
690
|
+
let currentPromptVector: number[] | null = null;
|
|
691
|
+
if (this.semanticCache && this.getEmbeddingFn && prompt && !this._isResolvingEmbedding) {
|
|
692
|
+
try {
|
|
693
|
+
this._isResolvingEmbedding = true;
|
|
694
|
+
currentPromptVector = await this.getEmbeddingFn(prompt);
|
|
695
|
+
const cachedResponse = this.semanticCache.get(currentPromptVector);
|
|
696
|
+
if (cachedResponse !== null) {
|
|
697
|
+
console.log(`[Semantic Cache HIT] Streaming cached response for prompt: "${prompt.slice(0, 30)}..."`);
|
|
698
|
+
this.emit('executeSuccess', 'CACHE_HIT_STREAM', 0);
|
|
699
|
+
// Replay full response as a single chunk (or iterate if it's an array)
|
|
700
|
+
if (Array.isArray(cachedResponse)) {
|
|
701
|
+
for (const chunk of cachedResponse) yield chunk as T;
|
|
702
|
+
} else {
|
|
703
|
+
yield cachedResponse as T;
|
|
704
|
+
}
|
|
705
|
+
return;
|
|
706
|
+
}
|
|
707
|
+
} catch (e) {
|
|
708
|
+
console.warn('[Semantic Cache Check Failed] Proceeding to live stream', e);
|
|
709
|
+
} finally {
|
|
710
|
+
this._isResolvingEmbedding = false;
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
// 2. Bulkhead check
|
|
524
715
|
if (this.activeCalls >= this.maxConcurrency) {
|
|
525
716
|
this.emit('bulkheadRejected');
|
|
526
717
|
throw new BulkheadRejectionError();
|
|
527
718
|
}
|
|
528
719
|
|
|
529
720
|
this.activeCalls++;
|
|
721
|
+
const accumulatedChunks: T[] = [];
|
|
722
|
+
let lastError: any;
|
|
723
|
+
|
|
530
724
|
try {
|
|
531
|
-
|
|
725
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
726
|
+
const key = provider ? this.getKeyByProvider(provider) : this.getKey();
|
|
727
|
+
|
|
728
|
+
if (!key) {
|
|
729
|
+
if (this.fallbackFn) {
|
|
730
|
+
this.emit('fallback', 'all keys exhausted (stream)');
|
|
731
|
+
yield this.fallbackFn();
|
|
732
|
+
return;
|
|
733
|
+
}
|
|
734
|
+
throw new AllKeysExhaustedError();
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
let iterator: AsyncGenerator<T, any, unknown>;
|
|
738
|
+
try {
|
|
739
|
+
// Start the generator
|
|
740
|
+
iterator = fn(key);
|
|
741
|
+
|
|
742
|
+
// PRIME THE ITERATOR:
|
|
743
|
+
// Try to get the first chunk. This forces the generator body to
|
|
744
|
+
// execute until the first 'yield' or until it throws.
|
|
745
|
+
const firstResult = await iterator.next();
|
|
746
|
+
|
|
747
|
+
// If we got here, the INITIAL connection/logic succeeded!
|
|
748
|
+
if (firstResult.done) return;
|
|
749
|
+
|
|
750
|
+
// Yield first chunk
|
|
751
|
+
yield firstResult.value;
|
|
752
|
+
if (this.semanticCache && prompt) accumulatedChunks.push(firstResult.value);
|
|
753
|
+
|
|
754
|
+
// Yield rest of chunks
|
|
755
|
+
for await (const chunk of iterator) {
|
|
756
|
+
yield chunk;
|
|
757
|
+
if (this.semanticCache && prompt) accumulatedChunks.push(chunk);
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
// Success! Store in cache
|
|
761
|
+
if (this.semanticCache && prompt && currentPromptVector && accumulatedChunks.length > 0) {
|
|
762
|
+
this.semanticCache.set(prompt, currentPromptVector, accumulatedChunks);
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
return; // Full success, exit retry loop
|
|
766
|
+
|
|
767
|
+
} catch (error: any) {
|
|
768
|
+
lastError = error;
|
|
769
|
+
const classification = this.classifyError(error, finishReason);
|
|
770
|
+
|
|
771
|
+
this.markFailed(key, classification);
|
|
772
|
+
this.emit('executeFailed', key, error);
|
|
773
|
+
|
|
774
|
+
// Note: If we already yielded the FIRST chunk, we CANNOT retry the connection
|
|
775
|
+
// because the user has already received data. Mid-stream failures propagate.
|
|
776
|
+
if (accumulatedChunks.length > 0) {
|
|
777
|
+
throw error;
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
if (!classification.retryable || attempt >= maxRetries) {
|
|
781
|
+
if (this.fallbackFn && attempt >= maxRetries) {
|
|
782
|
+
this.emit('fallback', 'max retries exceeded (stream)');
|
|
783
|
+
yield this.fallbackFn();
|
|
784
|
+
return;
|
|
785
|
+
}
|
|
786
|
+
throw error;
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
const delay = this.calculateBackoff(attempt);
|
|
790
|
+
this.emit('retry', key, attempt + 1, delay);
|
|
791
|
+
await this._sleep(delay);
|
|
792
|
+
}
|
|
793
|
+
}
|
|
532
794
|
} finally {
|
|
533
795
|
this.activeCalls--;
|
|
534
796
|
}
|
|
797
|
+
|
|
798
|
+
throw lastError;
|
|
535
799
|
}
|
|
536
800
|
|
|
537
801
|
private async _executeWithRetry<T>(
|
|
538
802
|
fn: (key: string, signal?: AbortSignal) => Promise<T>,
|
|
539
803
|
maxRetries: number,
|
|
540
804
|
timeoutMs?: number,
|
|
541
|
-
finishReason?: string
|
|
805
|
+
finishReason?: string,
|
|
806
|
+
provider?: string
|
|
542
807
|
): Promise<T> {
|
|
543
808
|
let lastError: any;
|
|
544
809
|
|
|
545
810
|
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
546
|
-
const key = this.getKey();
|
|
811
|
+
const key = provider ? this.getKeyByProvider(provider) : this.getKey();
|
|
547
812
|
|
|
548
813
|
if (!key) {
|
|
549
814
|
// All keys exhausted — try fallback
|
|
@@ -620,7 +885,10 @@ export class ApiKeyManager extends EventEmitter {
|
|
|
620
885
|
}
|
|
621
886
|
|
|
622
887
|
private _sleep(ms: number): Promise<void> {
|
|
623
|
-
return new Promise(resolve =>
|
|
888
|
+
return new Promise(resolve => {
|
|
889
|
+
const timer = setTimeout(resolve, ms);
|
|
890
|
+
if (timer.unref) timer.unref();
|
|
891
|
+
});
|
|
624
892
|
}
|
|
625
893
|
|
|
626
894
|
// ─── Health Checks ───────────────────────────────────────────────────────
|
|
@@ -639,6 +907,7 @@ export class ApiKeyManager extends EventEmitter {
|
|
|
639
907
|
public startHealthChecks(intervalMs: number = 60_000) {
|
|
640
908
|
this.stopHealthChecks(); // Clear any existing interval
|
|
641
909
|
this.healthCheckInterval = setInterval(() => this._runHealthChecks(), intervalMs);
|
|
910
|
+
if (this.healthCheckInterval.unref) this.healthCheckInterval.unref();
|
|
642
911
|
}
|
|
643
912
|
|
|
644
913
|
/**
|