saros-proxy 0.10.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +261 -78
- package/dist/cli/daemon.d.ts +38 -6
- package/dist/cli/daemon.js +524 -109
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/dsh-config.js +34 -9
- package/dist/cli/dsh-config.js.map +1 -1
- package/dist/cli/help.js +3 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/key-state.d.ts +21 -0
- package/dist/cli/key-state.js +57 -0
- package/dist/cli/key-state.js.map +1 -0
- package/dist/cli/keys.d.ts +28 -0
- package/dist/cli/keys.js +185 -0
- package/dist/cli/keys.js.map +1 -0
- package/dist/cli/overview.js +6 -1
- package/dist/cli/overview.js.map +1 -1
- package/dist/cli/secret.d.ts +31 -0
- package/dist/cli/secret.js +89 -0
- package/dist/cli/secret.js.map +1 -0
- package/dist/cli/usage.js +20 -10
- package/dist/cli/usage.js.map +1 -1
- package/dist/config.d.ts +15 -1
- package/dist/config.js +98 -25
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -1
- package/dist/debug-buffer.d.ts +58 -0
- package/dist/debug-buffer.js +42 -0
- package/dist/debug-buffer.js.map +1 -0
- package/dist/index.js +30 -4
- package/dist/index.js.map +1 -1
- package/dist/log-redact.d.ts +18 -0
- package/dist/log-redact.js +41 -0
- package/dist/log-redact.js.map +1 -0
- package/dist/logger.d.ts +6 -0
- package/dist/logger.js +30 -0
- package/dist/logger.js.map +1 -1
- package/dist/models-fetcher.js +2 -0
- package/dist/models-fetcher.js.map +1 -1
- package/dist/providers/commandcode.d.ts +20 -5
- package/dist/providers/commandcode.js +115 -7
- package/dist/providers/commandcode.js.map +1 -1
- package/dist/providers/index.d.ts +2 -2
- package/dist/providers/index.js +2 -2
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/infer.d.ts +11 -0
- package/dist/providers/infer.js.map +1 -1
- package/dist/providers/opencode-go.d.ts +8 -0
- package/dist/providers/opencode-go.js +35 -7
- package/dist/providers/opencode-go.js.map +1 -1
- package/dist/providers/types.d.ts +10 -2
- package/dist/proxy-logic.d.ts +101 -7
- package/dist/proxy-logic.js +197 -41
- package/dist/proxy-logic.js.map +1 -1
- package/dist/proxy.d.ts +33 -1
- package/dist/proxy.js +369 -67
- package/dist/proxy.js.map +1 -1
- package/dist/secrets/boot.d.ts +33 -0
- package/dist/secrets/boot.js +65 -0
- package/dist/secrets/boot.js.map +1 -0
- package/dist/secrets/envelope.d.ts +44 -0
- package/dist/secrets/envelope.js +132 -0
- package/dist/secrets/envelope.js.map +1 -0
- package/dist/secrets/source.d.ts +130 -0
- package/dist/secrets/source.js +332 -0
- package/dist/secrets/source.js.map +1 -0
- package/dist/token-usage.d.ts +9 -2
- package/dist/token-usage.js +20 -4
- package/dist/token-usage.js.map +1 -1
- package/dist/usage-client.d.ts +43 -13
- package/dist/usage-client.js +37 -54
- package/dist/usage-client.js.map +1 -1
- package/dist/validation.d.ts +3 -3
- package/dist/validation.js +3 -3
- package/dist/validation.js.map +1 -1
- package/package.json +1 -1
package/dist/proxy-logic.js
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* C4. Request-scoped key tracking (activeRequests map)
|
|
11
11
|
*/
|
|
12
12
|
import { DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MS } from './constants.js';
|
|
13
|
+
import { redactSecrets } from './log-redact.js';
|
|
13
14
|
// ---------------------------------------------------------------------------
|
|
14
15
|
// State Factory
|
|
15
16
|
// ---------------------------------------------------------------------------
|
|
@@ -19,13 +20,17 @@ export function createProxyState(keys, options) {
|
|
|
19
20
|
label: k.label,
|
|
20
21
|
key: k.key,
|
|
21
22
|
provider: k.provider ?? 'opencode-go',
|
|
22
|
-
enabled: true,
|
|
23
|
+
enabled: k.enabled ?? true,
|
|
23
24
|
consecutiveFailures: 0,
|
|
24
25
|
lastUsed: null,
|
|
25
26
|
disabledAt: null,
|
|
26
27
|
usagePercent: null,
|
|
28
|
+
exhausted: false,
|
|
27
29
|
entitled: true,
|
|
28
30
|
currentWeight: 0,
|
|
31
|
+
lastError: null,
|
|
32
|
+
disabledByConfig: k.enabled === false,
|
|
33
|
+
encrypted: k.encrypted === true,
|
|
29
34
|
})),
|
|
30
35
|
currentIndex: 0,
|
|
31
36
|
circuitBreakerThreshold: options?.circuitBreakerThreshold ?? 3,
|
|
@@ -49,6 +54,10 @@ function toSnapshot(key) {
|
|
|
49
54
|
* (C1 — fixes dead-code cooldown).
|
|
50
55
|
*/
|
|
51
56
|
function isKeyAvailable(state, key) {
|
|
57
|
+
// Retired in config: never re-enabled by a cooldown, a success or a restart
|
|
58
|
+
// without a config change.
|
|
59
|
+
if (key.disabledByConfig)
|
|
60
|
+
return false;
|
|
52
61
|
// Entitlement is definitive, not transient: a key whose account has no
|
|
53
62
|
// plan for this provider must not be retried until the usage refresh
|
|
54
63
|
// clears the flag.
|
|
@@ -95,13 +104,17 @@ function buildBookedLabels(state) {
|
|
|
95
104
|
*
|
|
96
105
|
* Selection strategy (smooth weighted round-robin, nginx-style):
|
|
97
106
|
* - When usage data is known for the candidates, keys with more remaining
|
|
98
|
-
*
|
|
99
|
-
* 70%
|
|
100
|
-
* not random sampling.
|
|
101
|
-
* -
|
|
102
|
-
*
|
|
107
|
+
* **monthly** budget are proportionally preferred. E.g. key X at 30% of its
|
|
108
|
+
* monthly allowance and key Y at 70% receive ~70%/30% of requests — exact
|
|
109
|
+
* proportions over a cycle, not random sampling.
|
|
110
|
+
* - A key with any exhausted window weighs 0, so it is not selected while
|
|
111
|
+
* another candidate still has room.
|
|
112
|
+
* - Keys without usage data take the median of the other candidates'
|
|
113
|
+
* non-exhausted weights (not plain round-robin). Round-robin only applies
|
|
114
|
+
* when no candidate has usage data at all; with `allowExhausted` (Tier 2+)
|
|
115
|
+
* it is also the last resort when every candidate is exhausted.
|
|
103
116
|
*/
|
|
104
|
-
function findNextKey(state, excludeLabels, providerFilter) {
|
|
117
|
+
function findNextKey(state, excludeLabels, providerFilter, allowExhausted = true) {
|
|
105
118
|
const n = state.keys.length;
|
|
106
119
|
if (n === 0)
|
|
107
120
|
return null;
|
|
@@ -118,50 +131,97 @@ function findNextKey(state, excludeLabels, providerFilter) {
|
|
|
118
131
|
}
|
|
119
132
|
if (candidates.length === 0)
|
|
120
133
|
return null;
|
|
121
|
-
const picked = pickWeighted(state, candidates);
|
|
134
|
+
const picked = pickWeighted(state, candidates, allowExhausted);
|
|
135
|
+
if (!picked)
|
|
136
|
+
return null;
|
|
122
137
|
state.currentIndex = (state.keys.indexOf(picked) + 1) % n;
|
|
123
138
|
picked.lastUsed = Date.now();
|
|
124
139
|
return toSnapshot(picked);
|
|
125
140
|
}
|
|
126
141
|
/**
|
|
127
142
|
* Internal: smooth weighted round-robin over the candidates.
|
|
128
|
-
*
|
|
129
|
-
*
|
|
143
|
+
*
|
|
144
|
+
* Weight is the remaining **monthly** budget (`100 - usedPercent`), except
|
|
145
|
+
* that a key with any exhausted window weighs 0 — the upstream would reject it
|
|
146
|
+
* even while the month still has room.
|
|
147
|
+
*
|
|
148
|
+
* Keys without usage data get the median of the *non-exhausted* known weights.
|
|
149
|
+
* Including the zeros of exhausted keys here would silently drag the neutral
|
|
150
|
+
* weight to 0 (and starve the unknown keys); when no known key has room they
|
|
151
|
+
* get a positive weight instead, so an exhausted key is never preferred.
|
|
152
|
+
* Keys with weight 0 are skipped and their residual `currentWeight` cleared,
|
|
153
|
+
* so a key that just became exhausted cannot win on leftover momentum.
|
|
154
|
+
*
|
|
155
|
+
* Falls back to the first candidate (round-robin order) when no candidate has
|
|
156
|
+
* usage data at all, or — only when `allowExhausted` — when every candidate is
|
|
157
|
+
* out of capacity. Tier 1 passes `false`, so a zero-weight pool yields null
|
|
158
|
+
* and the next tier can share a healthy key instead of serving an exhausted
|
|
159
|
+
* one.
|
|
130
160
|
*/
|
|
131
|
-
function pickWeighted(state, candidates) {
|
|
132
|
-
const known = candidates.
|
|
133
|
-
|
|
161
|
+
function pickWeighted(state, candidates, allowExhausted) {
|
|
162
|
+
const known = candidates.map((k) => {
|
|
163
|
+
if (k.usagePercent === null)
|
|
164
|
+
return null;
|
|
165
|
+
return k.exhausted ? 0 : Math.max(0, 100 - k.usagePercent);
|
|
166
|
+
});
|
|
167
|
+
if (known.every((w) => w === null))
|
|
134
168
|
return candidates[0];
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
169
|
+
const roomWeights = candidates
|
|
170
|
+
.map((k, i) => (known[i] !== null && !k.exhausted ? known[i] : null))
|
|
171
|
+
.filter((w) => w !== null && w > 0)
|
|
172
|
+
.sort((a, b) => a - b);
|
|
173
|
+
// No known key has room: unknown keys must still be tried, so give them a
|
|
174
|
+
// full weight instead of the zero median.
|
|
175
|
+
const neutralWeight = roomWeights.length > 0
|
|
176
|
+
? roomWeights[Math.floor(roomWeights.length / 2)]
|
|
177
|
+
: 100;
|
|
178
|
+
const finalWeights = known.map((w) => w ?? neutralWeight);
|
|
179
|
+
const totalWeight = finalWeights.reduce((sum, w) => sum + w, 0);
|
|
180
|
+
if (totalWeight === 0) {
|
|
181
|
+
// Nothing has room: keep the round-robin fallback momentum-free so a key
|
|
182
|
+
// that frees up later does not start with stale weight.
|
|
183
|
+
for (const key of candidates)
|
|
184
|
+
key.currentWeight = 0;
|
|
185
|
+
return allowExhausted ? candidates[0] : null;
|
|
186
|
+
}
|
|
187
|
+
let best = null;
|
|
145
188
|
let bestWeight = -Infinity;
|
|
146
189
|
for (let i = 0; i < candidates.length; i++) {
|
|
147
|
-
|
|
190
|
+
if (finalWeights[i] === 0) {
|
|
191
|
+
candidates[i].currentWeight = 0;
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
candidates[i].currentWeight += finalWeights[i];
|
|
148
195
|
if (candidates[i].currentWeight > bestWeight) {
|
|
149
196
|
bestWeight = candidates[i].currentWeight;
|
|
150
197
|
best = candidates[i];
|
|
151
198
|
}
|
|
152
199
|
}
|
|
200
|
+
if (best === null)
|
|
201
|
+
return candidates[0];
|
|
153
202
|
best.currentWeight -= totalWeight;
|
|
154
203
|
return best;
|
|
155
204
|
}
|
|
156
205
|
/**
|
|
157
|
-
* Update per-key usage data
|
|
158
|
-
*
|
|
206
|
+
* Update per-key usage data. `usedPercent` is the **monthly** percentage of
|
|
207
|
+
* the key's **own provider budget**, not absolute capacity: a mixed pool
|
|
208
|
+
* feeds every provider's number into `pickWeighted`, where only this
|
|
209
|
+
* normalized percent is comparable (opencode-go publishes percentages alone —
|
|
210
|
+
* no counts or caps). `exhausted` means a shorter window already hit its cap,
|
|
211
|
+
* so the key weighs 0 even when the month has room. A null `usedPercent` means
|
|
212
|
+
* the payload had no derivable monthly value and the previous percentage is
|
|
213
|
+
* kept. Keys absent from the map keep their previous values.
|
|
159
214
|
*/
|
|
160
215
|
export function updateKeyUsage(state, usage) {
|
|
161
216
|
for (const key of state.keys) {
|
|
162
|
-
const
|
|
163
|
-
if (
|
|
164
|
-
|
|
217
|
+
const metrics = usage.get(key.label);
|
|
218
|
+
if (!metrics)
|
|
219
|
+
continue;
|
|
220
|
+
// A null monthly metric is "no data", not 0%: keep the last known value
|
|
221
|
+
// so an underivable payload can never turn into maximum weight.
|
|
222
|
+
if (metrics.usedPercent !== null)
|
|
223
|
+
key.usagePercent = metrics.usedPercent;
|
|
224
|
+
key.exhausted = metrics.exhausted;
|
|
165
225
|
}
|
|
166
226
|
}
|
|
167
227
|
/**
|
|
@@ -178,14 +238,21 @@ export function setKeyEntitlement(state, keyLabel, entitled) {
|
|
|
178
238
|
// ---------------------------------------------------------------------------
|
|
179
239
|
// Request-Scoped Key Tracking (C4)
|
|
180
240
|
// ---------------------------------------------------------------------------
|
|
241
|
+
/**
|
|
242
|
+
* Split a model id into its model and its optional `@provider` pin.
|
|
243
|
+
* `'a@b@c'` → `{ model: 'a@b', provider: 'c' }`; no pin → `provider: null`.
|
|
244
|
+
*/
|
|
245
|
+
function splitModelSuffix(modelId) {
|
|
246
|
+
const at = modelId.lastIndexOf('@');
|
|
247
|
+
if (at <= 0 || at === modelId.length - 1)
|
|
248
|
+
return { model: modelId, provider: null };
|
|
249
|
+
return { model: modelId.slice(0, at), provider: modelId.slice(at + 1) };
|
|
250
|
+
}
|
|
181
251
|
/** Parse a trailing '@provider' suffix from a model id ('x@cc' → 'cc'). */
|
|
182
252
|
function parseModelSuffix(modelId) {
|
|
183
253
|
if (!modelId)
|
|
184
254
|
return null;
|
|
185
|
-
|
|
186
|
-
if (at <= 0 || at === modelId.length - 1)
|
|
187
|
-
return null;
|
|
188
|
-
return modelId.slice(at + 1);
|
|
255
|
+
return splitModelSuffix(modelId).provider;
|
|
189
256
|
}
|
|
190
257
|
/**
|
|
191
258
|
* Resolve the provider-preference predicate for a request.
|
|
@@ -199,6 +266,15 @@ function parseModelSuffix(modelId) {
|
|
|
199
266
|
function makeProviderFilter(state, modelId) {
|
|
200
267
|
if (!modelId)
|
|
201
268
|
return undefined;
|
|
269
|
+
const { model, provider: pinned } = splitModelSuffix(modelId);
|
|
270
|
+
// A pin is an explicit user instruction, and providerForKey always routes the
|
|
271
|
+
// request to the pinned upstream. Selection must therefore stay inside that
|
|
272
|
+
// provider: the old code handed the raw id (`deepseek@commandcode`) to the
|
|
273
|
+
// catalogs, every provider answered 'no', the whole pool got excluded and
|
|
274
|
+
// every pinned request returned 503. Whether the provider can serve the model
|
|
275
|
+
// is the upstream's call — its error beats a generic 503.
|
|
276
|
+
if (pinned)
|
|
277
|
+
return (provider) => provider === pinned;
|
|
202
278
|
const resolver = state.affinityResolver;
|
|
203
279
|
if (!resolver)
|
|
204
280
|
return undefined;
|
|
@@ -206,7 +282,7 @@ function makeProviderFilter(state, modelId) {
|
|
|
206
282
|
for (const key of state.keys) {
|
|
207
283
|
if (excluded.has(key.provider))
|
|
208
284
|
continue;
|
|
209
|
-
if (resolver(key.provider,
|
|
285
|
+
if (resolver(key.provider, model) === 'no') {
|
|
210
286
|
excluded.add(key.provider);
|
|
211
287
|
}
|
|
212
288
|
}
|
|
@@ -242,10 +318,11 @@ export function selectKeyForRequest(state, requestId, modelId) {
|
|
|
242
318
|
for (const label of booked) {
|
|
243
319
|
excludeLabels.add(label);
|
|
244
320
|
}
|
|
245
|
-
let snapshot = findNextKey(state, excludeLabels, providerFilter);
|
|
321
|
+
let snapshot = findNextKey(state, excludeLabels, providerFilter, false);
|
|
246
322
|
// Tier 2: all healthy preferred keys are booked — share one via
|
|
247
323
|
// round-robin. Better to share a key than return 503 when concurrent
|
|
248
|
-
// requests outnumber the key pool.
|
|
324
|
+
// requests outnumber the key pool. This tier may fall back to an exhausted
|
|
325
|
+
// key when no healthy one exists at all.
|
|
249
326
|
if (!snapshot) {
|
|
250
327
|
snapshot = findNextKey(state, new Set(ctx.triedKeys), providerFilter);
|
|
251
328
|
}
|
|
@@ -281,10 +358,11 @@ export function failoverRequest(state, requestId) {
|
|
|
281
358
|
for (const label of booked) {
|
|
282
359
|
excludeLabels.add(label);
|
|
283
360
|
}
|
|
284
|
-
let snapshot = findNextKey(state, excludeLabels, filter);
|
|
361
|
+
let snapshot = findNextKey(state, excludeLabels, filter, false);
|
|
285
362
|
// Tier 2: all remaining healthy preferred keys are booked — share one.
|
|
286
363
|
// Still respects per-request triedKeys (don't re-use a key this
|
|
287
|
-
// request already failed on).
|
|
364
|
+
// request already failed on). May fall back to an exhausted key only when
|
|
365
|
+
// no healthy candidate exists.
|
|
288
366
|
if (!snapshot) {
|
|
289
367
|
snapshot = findNextKey(state, new Set(ctx.triedKeys), filter);
|
|
290
368
|
}
|
|
@@ -312,17 +390,45 @@ export function completeRequest(state, requestId, success) {
|
|
|
312
390
|
// Key Status Mutations
|
|
313
391
|
// ---------------------------------------------------------------------------
|
|
314
392
|
/**
|
|
315
|
-
*
|
|
393
|
+
* Map an upstream verdict onto the reason shown by /health and the 503 body.
|
|
394
|
+
* classifyHttpError already narrowed the class: KeyFault is a 401 or a 5xx
|
|
395
|
+
* carrying a quota/balance hint, ServerFault is 429 or any other 5xx.
|
|
396
|
+
*/
|
|
397
|
+
function deriveKeyFailureReason(errorType, status, body) {
|
|
398
|
+
if (status === 401)
|
|
399
|
+
return 'auth';
|
|
400
|
+
if (status === 429)
|
|
401
|
+
return 'rate_limit';
|
|
402
|
+
// classifyHttpError treats any 5xx mentioning "limit" as KeyFault, so a
|
|
403
|
+
// rate-limited 5xx would otherwise be reported as a quota wall.
|
|
404
|
+
if (body && /rate.?limit/i.test(body))
|
|
405
|
+
return 'rate_limit';
|
|
406
|
+
if (errorType === 'KeyFault')
|
|
407
|
+
return 'quota';
|
|
408
|
+
return 'server';
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Mark a key as failed according to the error type (C2) and record why.
|
|
316
412
|
* - KeyFault / ServerFault: penalise the key (KeyFault disables immediately)
|
|
317
413
|
* - RequestFault / NetworkFault: no penalisation (bad request, or network
|
|
318
414
|
* trouble that is not the key's fault)
|
|
319
415
|
*/
|
|
320
|
-
export function markKeyFailed(state, keyLabel, errorType) {
|
|
416
|
+
export function markKeyFailed(state, keyLabel, errorType, info) {
|
|
321
417
|
if (errorType === 'RequestFault' || errorType === 'NetworkFault')
|
|
322
418
|
return;
|
|
323
419
|
const key = state.keys.find((k) => k.label === keyLabel);
|
|
324
420
|
if (!key)
|
|
325
421
|
return;
|
|
422
|
+
// Recorded even when the key stays in rotation (ServerFault below the
|
|
423
|
+
// threshold): this is what explains the state after a later disable.
|
|
424
|
+
key.lastError = {
|
|
425
|
+
status: info?.status ?? null,
|
|
426
|
+
reason: deriveKeyFailureReason(errorType, info?.status, info?.body),
|
|
427
|
+
at: Date.now(),
|
|
428
|
+
// The raw body travels to clients in the 503/502 diagnosis; a provider that
|
|
429
|
+
// echoes the submitted bearer must not leak a working key.
|
|
430
|
+
detail: info?.body ? redactSecrets(info.body.slice(0, 200)) : null,
|
|
431
|
+
};
|
|
326
432
|
if (errorType === 'KeyFault') {
|
|
327
433
|
// Disable immediately — the key is compromised / rate-limited
|
|
328
434
|
key.consecutiveFailures = state.circuitBreakerThreshold;
|
|
@@ -339,12 +445,21 @@ export function markKeyFailed(state, keyLabel, errorType) {
|
|
|
339
445
|
}
|
|
340
446
|
}
|
|
341
447
|
/**
|
|
342
|
-
* Mark a key as succeeded — resets consecutive failures
|
|
448
|
+
* Mark a key as succeeded — resets consecutive failures and clears any
|
|
449
|
+
* cooldown. `enabled` must come back too: a success can arrive after the key
|
|
450
|
+
* was disabled (tier 2 shares a key between concurrent requests, and a stream
|
|
451
|
+
* that fails after completeRequest(…, true) marks failure late). Leaving
|
|
452
|
+
* `enabled=false` with `disabledAt=null` made the key unselectable forever,
|
|
453
|
+
* because isKeyAvailable only revives keys that still carry a disabledAt.
|
|
343
454
|
*/
|
|
344
455
|
export function markKeySucceeded(state, keyLabel) {
|
|
345
456
|
const key = state.keys.find((k) => k.label === keyLabel);
|
|
346
457
|
if (!key)
|
|
347
458
|
return;
|
|
459
|
+
// A key retired in config stays out; only the config brings it back.
|
|
460
|
+
if (key.disabledByConfig)
|
|
461
|
+
return;
|
|
462
|
+
key.enabled = true;
|
|
348
463
|
key.consecutiveFailures = 0;
|
|
349
464
|
// C1: clear cooldown on success so next selection isn't penalised
|
|
350
465
|
key.disabledAt = null;
|
|
@@ -352,6 +467,47 @@ export function markKeySucceeded(state, keyLabel) {
|
|
|
352
467
|
// ---------------------------------------------------------------------------
|
|
353
468
|
// Status Queries
|
|
354
469
|
// ---------------------------------------------------------------------------
|
|
470
|
+
/**
|
|
471
|
+
* Milliseconds until the key becomes selectable again, or null when nothing
|
|
472
|
+
* will bring it back (healthy, retired in config, or no cooldown recorded).
|
|
473
|
+
* A key past its cooldown but not yet lazily revived reports 0 — it is
|
|
474
|
+
* selectable on the next request, which is not "already selectable" here.
|
|
475
|
+
* Pure: unlike isKeyAvailable this never revives the key.
|
|
476
|
+
*/
|
|
477
|
+
export function keyRetryAfterMs(state, key, now = Date.now()) {
|
|
478
|
+
const usable = key.enabled && key.consecutiveFailures < state.circuitBreakerThreshold;
|
|
479
|
+
if (usable)
|
|
480
|
+
return null;
|
|
481
|
+
if (!key.enabled && key.disabledAt !== null) {
|
|
482
|
+
return Math.max(0, key.disabledAt + state.circuitBreakerCooldownMs - now);
|
|
483
|
+
}
|
|
484
|
+
return null;
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Per-key state for /health. Labels are already public (X-Proxy-Key-Label);
|
|
488
|
+
* the credential and the upstream message are not part of this projection.
|
|
489
|
+
*/
|
|
490
|
+
export function describeKeys(state, now = Date.now()) {
|
|
491
|
+
return state.keys.map((key) => ({
|
|
492
|
+
label: key.label,
|
|
493
|
+
provider: key.provider,
|
|
494
|
+
enabled: key.enabled,
|
|
495
|
+
entitled: key.entitled,
|
|
496
|
+
disabledByConfig: key.disabledByConfig,
|
|
497
|
+
encrypted: key.encrypted,
|
|
498
|
+
consecutiveFailures: key.consecutiveFailures,
|
|
499
|
+
disabledAt: key.disabledAt === null ? null : new Date(key.disabledAt).toISOString(),
|
|
500
|
+
retryAfterMs: keyRetryAfterMs(state, key, now),
|
|
501
|
+
lastError: key.lastError
|
|
502
|
+
? {
|
|
503
|
+
status: key.lastError.status,
|
|
504
|
+
reason: key.lastError.reason,
|
|
505
|
+
at: new Date(key.lastError.at).toISOString(),
|
|
506
|
+
}
|
|
507
|
+
: null,
|
|
508
|
+
usagePercent: key.usagePercent,
|
|
509
|
+
}));
|
|
510
|
+
}
|
|
355
511
|
// ---------------------------------------------------------------------------
|
|
356
512
|
// Error Classification (C2)
|
|
357
513
|
// ---------------------------------------------------------------------------
|
package/dist/proxy-logic.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-logic.js","sourceRoot":"","sources":["../src/proxy-logic.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"proxy-logic.js","sourceRoot":"","sources":["../src/proxy-logic.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy.d.ts
CHANGED
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
* selection, circuit-breaker failover, and streaming pass-through.
|
|
6
6
|
*/
|
|
7
7
|
import { Hono } from 'hono';
|
|
8
|
-
import type
|
|
8
|
+
import { type KeyFailureReason } from './proxy-logic.js';
|
|
9
|
+
import { type ProxyConfig } from './config.js';
|
|
9
10
|
import type { KeyProvider } from './providers/index.js';
|
|
10
11
|
/**
|
|
11
12
|
* Resolve the upstream URL for one attempt: per-provider base URL + path
|
|
@@ -73,4 +74,35 @@ export declare function buildDownstreamHeaders(upstreamHeaders: Headers): Header
|
|
|
73
74
|
* Check if a request body indicates streaming mode.
|
|
74
75
|
*/
|
|
75
76
|
export declare function isStreamingRequest(bodyText: string): boolean;
|
|
77
|
+
/** One key that cannot serve a request, as reported in the 503 body. */
|
|
78
|
+
export interface UnavailableKey {
|
|
79
|
+
label: string;
|
|
80
|
+
provider: string;
|
|
81
|
+
state: 'disabled' | 'not_entitled' | 'disabled_by_config';
|
|
82
|
+
reason: KeyFailureReason | null;
|
|
83
|
+
lastStatus: number | null;
|
|
84
|
+
disabledAt: string | null;
|
|
85
|
+
retryAfterMs: number | null;
|
|
86
|
+
detail: string | null;
|
|
87
|
+
}
|
|
88
|
+
export interface NoKeysBody {
|
|
89
|
+
error: string;
|
|
90
|
+
message: string;
|
|
91
|
+
requestId: string;
|
|
92
|
+
retryAfterMs: number | null;
|
|
93
|
+
keys: UnavailableKey[];
|
|
94
|
+
causes: string[];
|
|
95
|
+
}
|
|
96
|
+
export interface KeyDiagnosis {
|
|
97
|
+
retryAfterMs: number | null;
|
|
98
|
+
keys: UnavailableKey[];
|
|
99
|
+
causes: string[];
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Shared diagnosis for "no key can serve this": which keys are out, why, when
|
|
103
|
+
* one may return. Pure so it can be tested without an app instance.
|
|
104
|
+
*/
|
|
105
|
+
export declare function buildKeyDiagnosis(keys: UnavailableKey[], modelId?: string, triedLabels?: string[]): KeyDiagnosis;
|
|
106
|
+
/** Build the 503 body sent when no key can be selected at all. */
|
|
107
|
+
export declare function buildNoKeysBody(keys: UnavailableKey[], requestId: string, modelId?: string, triedLabels?: string[]): NoKeysBody;
|
|
76
108
|
export declare function createProxyApp(config: ProxyConfig): Hono;
|