agl 40.4.0 → 40.5.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/changelog.md +27 -0
- package/dist_serve/bundle.js +2228 -2177
- package/dist_serve/bundle.js.map +2 -2
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/aglapi/aglapisurface.document.js +2 -2
- package/dist_ts/classes.accountsactions.d.ts +11 -1
- package/dist_ts/classes.accountsactions.js +59 -2
- package/dist_ts/classes.controller.js +5 -5
- package/dist_ts/classes.flexaccountaccess.js +3 -2
- package/dist_ts/classes.harnessreleases.d.ts +14 -4
- package/dist_ts/classes.harnessreleases.js +28 -4
- package/dist_ts/classes.inferencegateway.d.ts +28 -3
- package/dist_ts/classes.inferencegateway.js +177 -61
- package/dist_ts/classes.inferenceplacement.d.ts +5 -3
- package/dist_ts/classes.inferenceplacement.js +2 -2
- package/dist_ts/classes.inferencerouter.d.ts +349 -91
- package/dist_ts/classes.inferencerouter.js +804 -297
- package/dist_ts/classes.inferenceservice.d.ts +14 -2
- package/dist_ts/classes.inferenceservice.js +53 -14
- package/dist_ts/classes.inferencespend.d.ts +339 -0
- package/dist_ts/classes.inferencespend.js +815 -0
- package/dist_ts/classes.inferenceusagecache.d.ts +8 -0
- package/dist_ts/classes.inferenceusagecache.js +9 -5
- package/dist_ts/classes.inferenceusagetap.d.ts +50 -9
- package/dist_ts/classes.inferenceusagetap.js +185 -31
- package/dist_ts/classes.proxycontrol.d.ts +3 -2
- package/dist_ts/classes.proxycontrol.js +1 -2
- package/dist_ts/classes.proxydaemon.js +3 -2
- package/dist_ts/classes.proxystore.d.ts +6 -0
- package/dist_ts/classes.proxystore.js +11 -2
- package/dist_ts/fleet/classes.claudeworkers.d.ts +5 -4
- package/dist_ts/fleet/classes.claudeworkers.js +10 -9
- package/dist_ts/functions.claudecoderelease.d.ts +12 -6
- package/dist_ts/functions.claudecoderelease.js +13 -7
- package/dist_ts/functions.inferencecli.js +12 -8
- package/dist_ts/interfaces.auth.d.ts +1 -1
- package/dist_ts/interfaces.auth.js +3 -1
- package/dist_ts/plugins.d.ts +3 -1
- package/dist_ts/plugins.js +7 -2
- package/dist_ts_authswitch/authority-apikeys.d.ts +32 -0
- package/dist_ts_authswitch/authority-apikeys.js +65 -0
- package/dist_ts_authswitch/authority-contract.d.ts +142 -28
- package/dist_ts_authswitch/authority-contract.js +48 -1
- package/dist_ts_authswitch/authority-overview.js +8 -1
- package/dist_ts_authswitch/authority-placement.d.ts +7 -2
- package/dist_ts_authswitch/authority-placement.js +10 -3
- package/dist_ts_authswitch/authority-runtime-contract.d.ts +2 -2
- package/dist_ts_authswitch/authority-spend.d.ts +103 -0
- package/dist_ts_authswitch/authority-spend.js +110 -0
- package/dist_ts_authswitch/authority-subscription.d.ts +12 -1
- package/dist_ts_authswitch/authority-subscription.js +24 -1
- package/dist_ts_authswitch/authority-usagelimit.d.ts +7 -4
- package/dist_ts_authswitch/authority-usagelimit.js +89 -39
- package/dist_ts_authswitch/authority-usagewindows.d.ts +4 -1
- package/dist_ts_authswitch/authority-usagewindows.js +41 -16
- package/dist_ts_authswitch/classes.authoritybroker.d.ts +30 -19
- package/dist_ts_authswitch/classes.authoritybroker.js +152 -61
- package/dist_ts_authswitch/classes.authoritycli.d.ts +9 -4
- package/dist_ts_authswitch/classes.authoritycli.js +94 -29
- package/dist_ts_authswitch/classes.authorityclient.d.ts +24 -7
- package/dist_ts_authswitch/classes.authorityclient.js +31 -11
- package/dist_ts_authswitch/classes.authoritydaemon.js +39 -12
- package/dist_ts_authswitch/classes.authoritydatabase.d.ts +28 -5
- package/dist_ts_authswitch/classes.authoritydatabase.js +171 -9
- package/dist_ts_authswitch/classes.authorityimport.js +2 -2
- package/dist_ts_authswitch/classes.authoritymodels.d.ts +71 -3
- package/dist_ts_authswitch/classes.authoritymodels.js +249 -20
- package/dist_ts_authswitch/classes.authorityregistry.js +4 -2
- package/dist_ts_authswitch/classes.authorityusage.d.ts +69 -7
- package/dist_ts_authswitch/classes.authorityusage.js +118 -4
- package/dist_ts_authswitch/classes.claudenative.d.ts +16 -7
- package/dist_ts_authswitch/classes.claudenative.js +29 -16
- package/dist_ts_authswitch/classes.claudesignin.js +5 -2
- package/dist_ts_authswitch/testsupport.d.ts +24 -5
- package/dist_ts_authswitch/testsupport.js +56 -12
- package/dist_ts_authswitch/ts_migration/0011_account_api_key_fields.d.ts +12 -0
- package/dist_ts_authswitch/ts_migration/0011_account_api_key_fields.js +21 -0
- package/dist_ts_authswitch/ts_migration/index.js +3 -1
- package/dist_ts_interfaces/functions.authorityscope.d.ts +18 -7
- package/dist_ts_interfaces/functions.authorityscope.js +35 -8
- package/dist_ts_interfaces/interfaces.d.ts +1 -1
- package/dist_ts_interfaces/interfaces.js +1 -1
- package/dist_ts_interfaces/plugins.d.ts +2 -1
- package/dist_ts_interfaces/plugins.js +7 -4
- package/dist_ts_interfaces/requests.accounts.d.ts +56 -0
- package/dist_ts_interfaces/requests.accounts.js +11 -1
- package/dist_ts_interfaces/requests.d.ts +2 -2
- package/dist_ts_interfaces/requests.js +1 -1
- package/docs/authswitch.md +75 -12
- package/package.json +5 -5
- package/readme.md +198 -21
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/aglapi/aglapisurface.document.ts +2 -2
- package/ts/classes.accountsactions.ts +75 -1
- package/ts/classes.controller.ts +4 -4
- package/ts/classes.flexaccountaccess.ts +2 -1
- package/ts/classes.harnessreleases.ts +25 -4
- package/ts/classes.inferencegateway.ts +184 -64
- package/ts/classes.inferenceplacement.ts +6 -4
- package/ts/classes.inferencerouter.ts +1026 -314
- package/ts/classes.inferenceservice.ts +56 -13
- package/ts/classes.inferencespend.ts +870 -0
- package/ts/classes.inferenceusagecache.ts +16 -4
- package/ts/classes.inferenceusagetap.ts +159 -34
- package/ts/classes.proxycontrol.ts +3 -3
- package/ts/classes.proxydaemon.ts +2 -1
- package/ts/classes.proxystore.ts +11 -1
- package/ts/fleet/classes.claudeworkers.ts +9 -8
- package/ts/functions.claudecoderelease.ts +13 -6
- package/ts/functions.inferencecli.ts +11 -7
- package/ts/interfaces.auth.ts +2 -0
- package/ts/plugins.ts +7 -0
- package/ts_authswitch/authority-apikeys.ts +85 -0
- package/ts_authswitch/authority-contract.ts +167 -29
- package/ts_authswitch/authority-overview.ts +7 -0
- package/ts_authswitch/authority-placement.ts +12 -4
- package/ts_authswitch/authority-runtime-contract.ts +2 -2
- package/ts_authswitch/authority-spend.ts +168 -0
- package/ts_authswitch/authority-subscription.ts +28 -1
- package/ts_authswitch/authority-usagelimit.ts +95 -40
- package/ts_authswitch/authority-usagewindows.ts +42 -17
- package/ts_authswitch/classes.authoritybroker.ts +161 -68
- package/ts_authswitch/classes.authoritycli.ts +108 -32
- package/ts_authswitch/classes.authorityclient.ts +41 -10
- package/ts_authswitch/classes.authoritydaemon.ts +43 -13
- package/ts_authswitch/classes.authoritydatabase.ts +178 -8
- package/ts_authswitch/classes.authorityimport.ts +1 -1
- package/ts_authswitch/classes.authoritymodels.ts +165 -19
- package/ts_authswitch/classes.authorityregistry.ts +3 -0
- package/ts_authswitch/classes.authorityusage.ts +171 -10
- package/ts_authswitch/classes.claudenative.ts +28 -15
- package/ts_authswitch/classes.claudesignin.ts +4 -1
- package/ts_authswitch/native-contracts.md +81 -20
- package/ts_authswitch/readme.md +1 -1
- package/ts_authswitch/testsupport.ts +58 -11
- package/ts_authswitch/ts_migration/0011_account_api_key_fields.ts +20 -0
- package/ts_authswitch/ts_migration/index.ts +2 -0
- package/ts_interfaces/functions.authorityscope.ts +43 -8
- package/ts_interfaces/interfaces.ts +1 -1
- package/ts_interfaces/plugins.ts +6 -3
- package/ts_interfaces/requests.accounts.ts +48 -0
- package/ts_interfaces/requests.ts +4 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/accounts.plugins.ts +3 -1
- package/ts_web/accounts.templates.ts +20 -11
- package/ts_web/classes.accountsreadmodel.ts +322 -70
- package/ts_web/elements.accounts.ts +219 -20
- package/ts_web/elements.codexconnections.ts +3 -1
- package/ts_web/plugins.ts +4 -2
|
@@ -55,19 +55,48 @@ export const inferenceRetryAfterSeconds = (valueArg, nowArg) => {
|
|
|
55
55
|
const at = parseHttpDate(value, nowArg);
|
|
56
56
|
return at === undefined ? undefined : Math.max(0, Math.ceil((at - nowArg) / 1000));
|
|
57
57
|
};
|
|
58
|
+
/**
|
|
59
|
+
* The credential tiers a pool is served from, best first: the one a policy names alone, or with none the provider's
|
|
60
|
+
* subscription sign-ins first and its API keys after them. A key takes a request only when no subscription can take it,
|
|
61
|
+
* for whatever reason, and a session placed on a key returns to a subscription at the next request one can take.
|
|
62
|
+
*/
|
|
63
|
+
export const inferenceCredentialTiers = (credentialArg) => credentialArg ? [credentialArg] : ['subscription', 'api_key'];
|
|
64
|
+
/**
|
|
65
|
+
* What a payment problem's report adds for the account service (`IReq_AuthSwitchReportPaymentProblem`): the cause of an
|
|
66
|
+
* API key's spend cap or quota, nothing for a billing error, whose cause a missing one means -- so a Claude account's
|
|
67
|
+
* report is the one an accounts service of 40.3.0, which refuses a cause, takes.
|
|
68
|
+
*/
|
|
69
|
+
export const inferencePaymentReportOptions = (causeArg) => causeArg === 'billing' ? {} : { cause: causeArg };
|
|
70
|
+
/** A payment mark as the refusal it makes. */
|
|
71
|
+
const paymentUnavailable = (markArg) => ({ reason: 'payment_problem',
|
|
72
|
+
cause: markArg.cause, ...(markArg.until === null ? {} : { retryAt: new Date(markArg.until).toISOString() }) });
|
|
58
73
|
const writePaymentReportFailure = (failureArg) => {
|
|
59
74
|
process.stderr.write(`AGL proxy could not tell the account service of the payment problem of account `
|
|
60
|
-
+ `${failureArg.account}, so it keeps the account out of rotation until it restarts:
|
|
75
|
+
+ `${failureArg.account}, so it keeps the account out of rotation until it restarts, or a spend cap ends: `
|
|
76
|
+
+ `${failureArg.error}\n`);
|
|
61
77
|
};
|
|
78
|
+
/** A payment problem in words, as the status, the journal line and a pinned refusal state it. */
|
|
79
|
+
const paymentProblemText = (unavailableArg) => unavailableArg.cause === 'spend_cap' ? 'Anthropic refused a request on it: its organization reached its usage tier\'s '
|
|
80
|
+
+ `monthly spend cap (HTTP 429)${unavailableArg.retryAt ? `; it takes requests again at ${unavailableArg.retryAt}` : ''}`
|
|
81
|
+
: unavailableArg.cause === 'quota' ? 'OpenAI refused a request on it for its quota (HTTP 429 insufficient_quota): no '
|
|
82
|
+
+ 'prepaid credit left, or a spend or usage limit reached'
|
|
83
|
+
: 'Anthropic refused a request on it with a billing error (HTTP 402), a payment problem';
|
|
62
84
|
/** An account's refusal in words, as the pinned refusal, the status and the journal line state it. */
|
|
63
85
|
const unavailableText = (unavailableArg) => unavailableArg.reason === 'usage_unread' ? `no usage reading to route on${unavailableArg.retryAt
|
|
64
86
|
? `; the account service reads its usage next at ${unavailableArg.retryAt}` : ''}`
|
|
65
87
|
: unavailableArg.reason === 'catalog_failed' ? `its model list could not be read (${unavailableArg.failure})`
|
|
66
88
|
: unavailableArg.reason === 'needs_login' ? 'it needs a fresh sign-in'
|
|
67
89
|
: unavailableArg.reason === 'access_failed' ? 'the account service answered no access for it'
|
|
68
|
-
: unavailableArg.reason === 'payment_problem'
|
|
69
|
-
|
|
70
|
-
|
|
90
|
+
: unavailableArg.reason === 'payment_problem' ? paymentProblemText(unavailableArg)
|
|
91
|
+
: unavailableArg.reason === 'spend_unread'
|
|
92
|
+
? 'it has a monthly spend limit, and its spend could not be read, so it might be at it'
|
|
93
|
+
: unavailableArg.reason === 'spend_unrecorded'
|
|
94
|
+
? 'it has a monthly spend limit, and spend the proxy relayed on it is not recorded yet -- the account service '
|
|
95
|
+
+ 'refused its report, or neither the proxy\'s store nor the account service took an answer -- so it might '
|
|
96
|
+
+ 'be at it'
|
|
97
|
+
: unavailableArg.reason === 'model_unpriced'
|
|
98
|
+
? `it has a monthly spend limit, and ${unavailableArg.failure ?? 'the request'} has no price`
|
|
99
|
+
: 'its model list lacks the requested model';
|
|
71
100
|
const writeAccountChange = (changeArg) => {
|
|
72
101
|
process.stderr.write(`AGL proxy account ${changeArg.account}: ${changeArg.unavailable === null
|
|
73
102
|
? `${changeArg.previous} ended` : changeArg.lastCatalog
|
|
@@ -88,6 +117,30 @@ const cooldownUntil = (cooldownArg, usageArg) => {
|
|
|
88
117
|
const readAt = usageArg?.readAt ? Date.parse(usageArg.readAt) : Number.NaN;
|
|
89
118
|
return Number.isFinite(readAt) && readAt > cooldownArg.at ? 0 : cooldownArg.until;
|
|
90
119
|
};
|
|
120
|
+
/**
|
|
121
|
+
* A key's month in words, from its spend reading: `$12.40 of $50.00 this month`, or `$12.40 this month, no spend limit`,
|
|
122
|
+
* and how many answers could not be priced, when any.
|
|
123
|
+
*/
|
|
124
|
+
const spendText = (spendArg) => {
|
|
125
|
+
const usd = plugins.authswitchSpend.authSwitchUsdText;
|
|
126
|
+
const unpriced = spendArg.unpricedAnswers === 0 ? ''
|
|
127
|
+
: `, ${spendArg.unpricedAnswers} ${spendArg.unpricedAnswers === 1 ? 'answer' : 'answers'} of it could not be priced`;
|
|
128
|
+
return `${usd(spendArg.spentMicroUsd)} ${spendArg.limitMicroUsd === null ? 'this month, no spend limit'
|
|
129
|
+
: `of ${usd(spendArg.limitMicroUsd)} this month`}${unpriced}`;
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* What a refusal says of the API keys it found held by their monthly spend limit: each key with its month, and when the
|
|
133
|
+
* first of them takes requests again. Empty without any.
|
|
134
|
+
*/
|
|
135
|
+
export const inferenceSpendLimitText = (keysArg) => {
|
|
136
|
+
const keys = [...new Map(keysArg.map((keyArg) => [keyArg.accountId, keyArg])).values()];
|
|
137
|
+
if (!keys.length)
|
|
138
|
+
return '';
|
|
139
|
+
const resetAt = keys.map((keyArg) => keyArg.spend.resetAt).sort()[0];
|
|
140
|
+
const named = keys.map((keyArg) => `${keyArg.label} (${spendText(keyArg.spend)})`).join(', ');
|
|
141
|
+
return `${keys.length === 1 ? 'The API key' : 'The API keys'} ${named} ${keys.length === 1 ? 'is' : 'are'} held by the `
|
|
142
|
+
+ `monthly spend limit set in AGL until ${resetAt}.`;
|
|
143
|
+
};
|
|
91
144
|
export class InferenceRoutingError extends Error {
|
|
92
145
|
status;
|
|
93
146
|
code;
|
|
@@ -95,7 +148,8 @@ export class InferenceRoutingError extends Error {
|
|
|
95
148
|
plans;
|
|
96
149
|
accountLimit;
|
|
97
150
|
accountId;
|
|
98
|
-
|
|
151
|
+
unavailable;
|
|
152
|
+
spendLimited;
|
|
99
153
|
constructor(status, code, messageArg, retryAfterSeconds,
|
|
100
154
|
/** For `accounts_exhausted`: the provider plans of the accounts found at their limits. */
|
|
101
155
|
plans = [],
|
|
@@ -103,8 +157,13 @@ export class InferenceRoutingError extends Error {
|
|
|
103
157
|
accountLimit,
|
|
104
158
|
/** The account a refusal for a reason of its own (`reason`) names. */
|
|
105
159
|
accountId,
|
|
106
|
-
/**
|
|
107
|
-
|
|
160
|
+
/**
|
|
161
|
+
* For `no_eligible_accounts` of a pinned account: why that account takes no request though no limit says so, in
|
|
162
|
+
* full -- a payment problem's cause, say.
|
|
163
|
+
*/
|
|
164
|
+
unavailable,
|
|
165
|
+
/** For `accounts_exhausted`: the API keys found held by their monthly spend limit, which its message names. */
|
|
166
|
+
spendLimited = []) {
|
|
108
167
|
super(messageArg);
|
|
109
168
|
this.status = status;
|
|
110
169
|
this.code = code;
|
|
@@ -112,9 +171,14 @@ export class InferenceRoutingError extends Error {
|
|
|
112
171
|
this.plans = plans;
|
|
113
172
|
this.accountLimit = accountLimit;
|
|
114
173
|
this.accountId = accountId;
|
|
115
|
-
this.
|
|
174
|
+
this.unavailable = unavailable;
|
|
175
|
+
this.spendLimited = spendLimited;
|
|
116
176
|
this.name = 'InferenceRoutingError';
|
|
117
177
|
}
|
|
178
|
+
/** The reason of `unavailable`: a refusal names a reason of its own only with the refusal in full. */
|
|
179
|
+
get reason() {
|
|
180
|
+
return this.unavailable?.reason;
|
|
181
|
+
}
|
|
118
182
|
}
|
|
119
183
|
/**
|
|
120
184
|
* Whether an account's read failed for want of a sign-in: ChatGPT rejected its access even when renewed
|
|
@@ -123,38 +187,69 @@ export class InferenceRoutingError extends Error {
|
|
|
123
187
|
const needsSignIn = (errorArg) => (errorArg instanceof InferenceRoutingError && errorArg.code === 'account_needs_login')
|
|
124
188
|
|| (errorArg instanceof FlexServiceError && errorArg.code === 'PROVIDER_REAUTH_REQUIRED');
|
|
125
189
|
/**
|
|
126
|
-
* How long
|
|
127
|
-
* failed sign-in holds before the next read: a sign-in does not heal
|
|
190
|
+
* How long an account's model list -- a Claude account's, an Anthropic or an OpenAI API key's -- is used before it is read
|
|
191
|
+
* again, and how long a failed model-list read or a failed sign-in holds before the next read: a sign-in does not heal
|
|
192
|
+
* itself, and a new one changes the account's revision.
|
|
128
193
|
*/
|
|
129
|
-
const
|
|
194
|
+
const modelListMs = 60_000;
|
|
130
195
|
/**
|
|
131
|
-
* How long
|
|
196
|
+
* How long an account whose access failed for a reason other than sign-in is refused before access is tried again.
|
|
132
197
|
* Such a failure is usually a brief outage of the local account service: retries stay bounded to one per account per 5 s
|
|
133
198
|
* without turning a short outage into a minute of refusals.
|
|
134
199
|
*/
|
|
135
|
-
const
|
|
200
|
+
const modelListAccessRetryMs = 5_000;
|
|
136
201
|
/**
|
|
137
|
-
* Why
|
|
202
|
+
* Why an account's held model list keeps it from routing: a failure of its access or sign-in always, a failed
|
|
138
203
|
* model-list read (`catalog_failed`) only while no list is held -- the account routes on the last list meanwhile.
|
|
139
204
|
*/
|
|
140
|
-
const
|
|
141
|
-
?
|
|
142
|
-
/**
|
|
143
|
-
class
|
|
205
|
+
const heldListRefusal = (listArg) => listArg.failure && (listArg.models === null || listArg.failure.reason !== 'catalog_failed')
|
|
206
|
+
? listArg.failure : undefined;
|
|
207
|
+
/** An account's model list could not be read, and why (`InferenceRouter.readModelList`). */
|
|
208
|
+
class ModelListError extends Error {
|
|
144
209
|
unavailable;
|
|
145
210
|
constructor(unavailable) {
|
|
146
211
|
super(unavailableText(unavailable));
|
|
147
212
|
this.unavailable = unavailable;
|
|
148
|
-
this.name = '
|
|
213
|
+
this.name = 'ModelListError';
|
|
149
214
|
}
|
|
150
215
|
}
|
|
151
216
|
/** A failed model list read in a few words: its HTTP status, or the kind of failure; never its message. */
|
|
152
217
|
const catalogFailure = (errorArg) => {
|
|
153
|
-
if (errorArg instanceof plugins.anthropicProvider.AnthropicOAuthModelListError
|
|
218
|
+
if (errorArg instanceof plugins.anthropicProvider.AnthropicOAuthModelListError
|
|
219
|
+
|| errorArg instanceof plugins.openAiProvider.OpenAiApiModelListError) {
|
|
154
220
|
return errorArg.code === 'HTTP_ERROR' && errorArg.status !== undefined ? `HTTP ${errorArg.status}` : errorArg.code;
|
|
155
221
|
}
|
|
222
|
+
// An OpenAI key that may not read the model list (403) is refused like a list that cannot be read.
|
|
223
|
+
if (errorArg instanceof plugins.openAiProvider.OpenAiApiKeyAuthError && errorArg.status !== undefined) {
|
|
224
|
+
return `HTTP ${errorArg.status}`;
|
|
225
|
+
}
|
|
156
226
|
return errorArg instanceof Error ? errorArg.name : typeof errorArg;
|
|
157
227
|
};
|
|
228
|
+
/** A provider's refusal of a key or sign-in it does not accept (401): renewed once for a sign-in, ended for a key. */
|
|
229
|
+
const accessRejected = (errorArg) => (errorArg instanceof plugins.anthropicProvider.AnthropicOAuthAuthError
|
|
230
|
+
|| errorArg instanceof plugins.anthropicProvider.AnthropicApiKeyAuthError
|
|
231
|
+
|| errorArg instanceof plugins.openAiProvider.OpenAiApiKeyAuthError) && errorArg.status === 401;
|
|
232
|
+
/**
|
|
233
|
+
* A model an OpenAI API key lists (`GET /v1/models`), as a route and a catalog state it: what flexharness's
|
|
234
|
+
* `OPENAI_API_MODELS` describes of it -- efforts, service tiers, context window -- and nothing more. A model it does not
|
|
235
|
+
* describe stays routable, hidden from the model lists, as a ChatGPT catalog's hidden model is; its id is sent as it is
|
|
236
|
+
* listed.
|
|
237
|
+
*/
|
|
238
|
+
const openAiKeyModel = (modelIdArg) => {
|
|
239
|
+
const described = plugins.openAiProvider.getOpenAiApiModel(modelIdArg);
|
|
240
|
+
return { providerId: 'openai', modelId: modelIdArg, wireModel: modelIdArg, displayName: described?.displayName ?? modelIdArg,
|
|
241
|
+
description: described?.description ?? '', hidden: described === undefined,
|
|
242
|
+
reasoningEfforts: described ? described.reasoningEfforts.map((effortArg) => ({ ...effortArg })) : [],
|
|
243
|
+
defaultReasoningEffort: described?.defaultReasoningEffort ?? '',
|
|
244
|
+
inputModalities: described ? [...described.inputModalities] : ['text'], supportsPersonality: false,
|
|
245
|
+
serviceTiers: described ? described.serviceTiers.map((tierArg) => ({ ...tierArg })) : [],
|
|
246
|
+
...(described ? { contextWindow: described.contextWindow } : {}), isDefault: false };
|
|
247
|
+
};
|
|
248
|
+
/**
|
|
249
|
+
* Whether an account of a ChatGPT pool is a ChatGPT sign-in: only those reach the ChatGPT backend -- its Codex catalog,
|
|
250
|
+
* its model list and its Responses endpoint. An OpenAI API key is never sent there.
|
|
251
|
+
*/
|
|
252
|
+
const chatGptSignIn = (accountArg) => accountArg.credential === 'subscription';
|
|
158
253
|
/** The headroom of an account whose provider reports no usage windows: below every known headroom. */
|
|
159
254
|
const unknownHeadroom = -1;
|
|
160
255
|
/** A held usage reading the router may route on: current, or stale but inside the account service's stale window. */
|
|
@@ -187,11 +282,53 @@ const claudeLimits = (usageArg, accountArg, nowArg) => {
|
|
|
187
282
|
return accountLimits(usageArg.reading, usageArg.reading.status.plan?.name ?? '', accountArg, unknownHeadroom, nowArg);
|
|
188
283
|
};
|
|
189
284
|
/**
|
|
190
|
-
* An
|
|
191
|
-
*
|
|
192
|
-
*
|
|
285
|
+
* An API key's limits, OpenAI's or Anthropic's, from its month's spend as the account service answers it (reading
|
|
286
|
+
* `kind: 'spend'`), by the shared rule (`authSwitchUsageLimit`): a key with a spend limit is exhausted while its month
|
|
287
|
+
* spent it or holds an answer that could not be priced, until the month ends, and its headroom is what is left of the
|
|
288
|
+
* limit; a key without one is never stopped by its spend and has no headroom to compare (`unknownHeadroom`). A reading
|
|
289
|
+
* whose month ended is the rule's as well: available, with all of the limit left. The account service answers a key's
|
|
290
|
+
* spend as current until its month ends, and the proxy asks again at every request, so no age is judged here.
|
|
291
|
+
*
|
|
292
|
+
* Without a spend reading -- the service could not read the key's ledger (`spend_unavailable`), or did not answer -- a
|
|
293
|
+
* key with a spend limit (`IInferenceAccount.spendLimitMicroUsd`) is refused (`undefined`, `spend_unread`), as it may be
|
|
294
|
+
* at its limit; one without a limit routes with unknown headroom. Rate limits are the provider's: a 429 rests a key.
|
|
193
295
|
*/
|
|
194
|
-
const
|
|
296
|
+
const keyLimits = (usageArg, accountArg, nowArg) => {
|
|
297
|
+
// The proxy hands a key's usage over judged (`InferenceSpendOutbox.judged`): its month's spend with the answers the
|
|
298
|
+
// account service has not acknowledged yet, in the month now falls in.
|
|
299
|
+
const reading = usageArg?.state === 'current' || usageArg?.state === 'stale' ? usageArg.reading : null;
|
|
300
|
+
if (reading?.kind === 'spend')
|
|
301
|
+
return accountLimits(reading, '', accountArg, unknownHeadroom, nowArg);
|
|
302
|
+
return accountArg.spendLimitMicroUsd === null
|
|
303
|
+
? { plan: '', state: 'available', headroom: unknownHeadroom, limit: null } : undefined;
|
|
304
|
+
};
|
|
305
|
+
/**
|
|
306
|
+
* Whether an API key has a monthly spend limit: by its spend reading's limit, which the account service answered with
|
|
307
|
+
* the reading, or without a reading by the limit the account carries.
|
|
308
|
+
*/
|
|
309
|
+
const keyHasSpendLimit = (usageArg, accountArg) => usageArg?.reading?.kind === 'spend'
|
|
310
|
+
? usageArg.reading.spend.limitMicroUsd !== null : accountArg.spendLimitMicroUsd !== null;
|
|
311
|
+
/**
|
|
312
|
+
* An API key's state in words, as `agl proxy status` shows it on its limits (`keyLimits`), with its month: available, at
|
|
313
|
+
* its spend limit, or held below it until the month ends for an answer that could not be priced; available after its
|
|
314
|
+
* month ended with nothing relayed on it since, or without a limit and a spend reading.
|
|
315
|
+
*/
|
|
316
|
+
const keyStateText = (limitsArg, usageArg, nowArg) => {
|
|
317
|
+
const readingArg = usageArg?.reading;
|
|
318
|
+
if (readingArg?.kind !== 'spend' || !limitsArg.limit)
|
|
319
|
+
return 'available (no spend limit, and no spend reading)';
|
|
320
|
+
const spend = readingArg.spend;
|
|
321
|
+
// A reading the account service observed before the judged month began is last month's, judged as the new month's.
|
|
322
|
+
const newMonth = usageArg?.observedAt !== null && usageArg?.observedAt !== undefined
|
|
323
|
+
&& Date.parse(usageArg.observedAt) < Date.parse(spend.periodStart);
|
|
324
|
+
if (plugins.authswitchSpend.authSwitchSpendMonthEnded(spend, nowArg) || (newMonth && spend.answers === 0)) {
|
|
325
|
+
return 'available (a new month began since its last spend reading)';
|
|
326
|
+
}
|
|
327
|
+
const state = limitsArg.state !== 'exhausted' ? 'available'
|
|
328
|
+
: spend.limitMicroUsd !== null && spend.spentMicroUsd < spend.limitMicroUsd ? 'held until its month ends'
|
|
329
|
+
: 'at its spend limit';
|
|
330
|
+
return `${state} (${spendText(spend)})`;
|
|
331
|
+
};
|
|
195
332
|
/**
|
|
196
333
|
* A ChatGPT account's limits from its usage reading (see `authSwitchUsageLimit`): unset, the main limit decides --
|
|
197
334
|
* allowed, not reached, both windows under 100% -- and named extra limits are left out; with a threshold every window
|
|
@@ -269,6 +406,40 @@ const mergeNativeModel = (previousArg, nextArg) => {
|
|
|
269
406
|
delete previousArg.default_reasoning_level;
|
|
270
407
|
}
|
|
271
408
|
};
|
|
409
|
+
/**
|
|
410
|
+
* The 402 a request gets when the accounts it could go to are all held with payment problems: what each was refused for,
|
|
411
|
+
* and what ends it.
|
|
412
|
+
*/
|
|
413
|
+
const paymentRefusalText = (refusalsArg) => {
|
|
414
|
+
const named = (matchArg, nounArg) => {
|
|
415
|
+
const labels = refusalsArg.filter(matchArg).map((refusalArg) => refusalArg.label);
|
|
416
|
+
return labels.length ? `${nounArg}${labels.length === 1 ? '' : 's'} ${labels.join(', ')}` : undefined;
|
|
417
|
+
};
|
|
418
|
+
const subscriptions = named((refusalArg) => refusalArg.unavailable.cause === 'billing'
|
|
419
|
+
&& refusalArg.credential === 'subscription', 'Claude account');
|
|
420
|
+
const billedKeys = named((refusalArg) => refusalArg.unavailable.cause === 'billing' && refusalArg.credential === 'api_key', 'Anthropic API key');
|
|
421
|
+
const cappedKeys = named((refusalArg) => refusalArg.unavailable.cause === 'spend_cap', 'Anthropic API key');
|
|
422
|
+
const capEnds = refusalsArg.flatMap((refusalArg) => refusalArg.unavailable.cause === 'spend_cap'
|
|
423
|
+
&& refusalArg.unavailable.retryAt ? [refusalArg.unavailable.retryAt] : []).sort()[0];
|
|
424
|
+
const quotaKeys = named((refusalArg) => refusalArg.unavailable.cause === 'quota', 'OpenAI API key');
|
|
425
|
+
return [
|
|
426
|
+
subscriptions && `Anthropic answered a billing error (HTTP 402) for the ${subscriptions}: a payment problem with the`
|
|
427
|
+
+ ' subscription. Settle the billing, then re-check the account in AGL Accounts or with'
|
|
428
|
+
+ ' `authswitch account recheck <account-id>`.',
|
|
429
|
+
billedKeys && `Anthropic answered a billing error (HTTP 402) for the ${billedKeys}: settle the billing of its`
|
|
430
|
+
+ ' organization in the Claude Console, then re-check the key in AGL Accounts.',
|
|
431
|
+
cappedKeys && `The organization of the ${cappedKeys} reached its usage tier's monthly spend cap (HTTP 429)`
|
|
432
|
+
+ `${capEnds ? `; it takes requests again at ${capEnds}` : ''}, or once Anthropic grants a higher tier and the key is`
|
|
433
|
+
+ ' re-checked in AGL Accounts.',
|
|
434
|
+
quotaKeys && `OpenAI refused the ${quotaKeys} for its quota (HTTP 429 insufficient_quota): add credit or raise the`
|
|
435
|
+
+ ' organization\'s or project\'s limit, then re-check the key in AGL Accounts.',
|
|
436
|
+
].filter((sentenceArg) => !!sentenceArg).join(' ');
|
|
437
|
+
};
|
|
438
|
+
/** What judging a request's accounts finds before any account is judged: nothing yet. */
|
|
439
|
+
const emptySelection = (accountsArg, pinnedArg) => ({ exhausted: false, reserved: false,
|
|
440
|
+
unavailable: false, modelKnown: false, earliestReset: Infinity, exhaustedPlans: new Set(), accounts: accountsArg,
|
|
441
|
+
pinned: pinnedArg, accountLimit: undefined, payment: [], spendLimited: [], spendUnread: [], spendUnrecorded: [],
|
|
442
|
+
unpriced: { labels: [], what: undefined } });
|
|
272
443
|
/** An account's placement by the shared rule, on the reading the router holds for it. */
|
|
273
444
|
const accountPlacement = (readingArg, accountArg, nowArg) => plugins.authswitchPlacement.authSwitchPlacement(readingArg, accountArg.maxUsagePercent, accountArg.lapsesAt, nowArg, accountArg.reserveLiftUntil);
|
|
274
445
|
/** Model-preserving account selection. Refresh grants and native sign-ins remain the authority's. */
|
|
@@ -277,21 +448,25 @@ export class InferenceRouter {
|
|
|
277
448
|
/** ChatGPT catalogs by account and the Codex release they were read as. */
|
|
278
449
|
catalogs = new Map();
|
|
279
450
|
nativeCatalogs = new Map();
|
|
451
|
+
/** The model lists of the Claude accounts and the Anthropic API keys (`claudeCatalog`). */
|
|
280
452
|
claudeCatalogs = new Map();
|
|
453
|
+
/** The model lists of the OpenAI API keys (`keyCatalog`). */
|
|
454
|
+
keyCatalogs = new Map();
|
|
281
455
|
/** Why each Claude account was last reported refused, or routed on its last model list (`noteAccount`). */
|
|
282
456
|
noted = new Map();
|
|
283
457
|
active = new Map();
|
|
284
458
|
cooldowns = new Map();
|
|
285
459
|
/**
|
|
286
|
-
* The
|
|
287
|
-
* holds the problem
|
|
460
|
+
* The accounts a payment problem took out of rotation (`reportPaymentProblem`): a Claude account until the account
|
|
461
|
+
* service holds the problem -- one it could not be told of stays here for the proxy's lifetime -- and an API key until
|
|
462
|
+
* its spend cap ends, or for the proxy's lifetime.
|
|
288
463
|
*/
|
|
289
464
|
paymentMarks = new Map();
|
|
290
465
|
/** The accounts whose payment problem the account service could not be told of, each reported once. */
|
|
291
466
|
paymentReportsFailed = new Set();
|
|
292
467
|
/**
|
|
293
|
-
* The
|
|
294
|
-
* so
|
|
468
|
+
* The API keys, Anthropic's and OpenAI's, among the accounts the last pool read listed: the account service reads no
|
|
469
|
+
* subscription usage for them, so no usage a request on one shows -- headers, tokens, a 429 -- is handed to it.
|
|
295
470
|
*/
|
|
296
471
|
apiKeyAccounts = new Set();
|
|
297
472
|
now;
|
|
@@ -303,20 +478,28 @@ export class InferenceRouter {
|
|
|
303
478
|
return (await this.pool(policyArg, signalArg)).accounts;
|
|
304
479
|
}
|
|
305
480
|
/**
|
|
306
|
-
* The
|
|
307
|
-
*
|
|
308
|
-
|
|
309
|
-
|
|
481
|
+
* The credential tiers of the policy's pool, best first (`inferenceCredentialTiers`). A plan restriction leaves the
|
|
482
|
+
* API keys out, as a key has no plan, so a lease with `plans` never reaches a key.
|
|
483
|
+
*/
|
|
484
|
+
tiers(policyArg) {
|
|
485
|
+
return inferenceCredentialTiers(policyArg.credential).filter((tierArg) => !policyArg.plans || tierArg !== 'api_key');
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* The policy's accounts of its provider and credential tiers (`tiers`), and every eligible account's id of that pool:
|
|
489
|
+
* an account absent from both left the pool. An account whose lapse date passed is in neither -- it is never routed to
|
|
490
|
+
* again -- and is named in `lapsed`. A pool that names its credential serves that kind alone: Flex's API-key pool
|
|
491
|
+
* never takes a Claude account. One that names none spans both, and a session placed on a key returns to a Claude
|
|
492
|
+
* account once one can take its request.
|
|
310
493
|
*/
|
|
311
494
|
async pool(policyArg, signalArg) {
|
|
312
495
|
const everyAccount = await this.options.accounts(signalArg);
|
|
313
496
|
this.apiKeyAccounts = new Set(everyAccount.filter((account) => account.credential === 'api_key')
|
|
314
497
|
.map((account) => account.id));
|
|
315
498
|
const provider = policyArg.provider ?? 'openai';
|
|
316
|
-
const
|
|
499
|
+
const tiers = this.tiers(policyArg);
|
|
317
500
|
const now = this.now();
|
|
318
501
|
const inPool = (accountArg) => accountArg.providerId === provider
|
|
319
|
-
&& accountArg.credential
|
|
502
|
+
&& tiers.includes(accountArg.credential);
|
|
320
503
|
const lapsed = new Set(everyAccount.filter((account) => inPool(account)
|
|
321
504
|
&& plugins.authswitchPlacement.authSwitchAccountLifecycle(account.lapsesAt, now) === 'lapsed').map((account) => account.id));
|
|
322
505
|
const allAccounts = everyAccount.filter((account) => inPool(account) && !lapsed.has(account.id));
|
|
@@ -324,7 +507,7 @@ export class InferenceRouter {
|
|
|
324
507
|
if (accounts.length > 64)
|
|
325
508
|
throw new InferenceRoutingError(503, 'pool_too_large', 'Select at most 64 accounts for this gateway.');
|
|
326
509
|
const known = new Set(everyAccount.map((account) => account.id));
|
|
327
|
-
for (const cache of [this.catalogs, this.nativeCatalogs, this.claudeCatalogs]) {
|
|
510
|
+
for (const cache of [this.catalogs, this.nativeCatalogs, this.claudeCatalogs, this.keyCatalogs]) {
|
|
328
511
|
for (const cacheKey of cache.keys())
|
|
329
512
|
if (!known.has(cacheKey.slice(0, 64)))
|
|
330
513
|
cache.delete(cacheKey);
|
|
@@ -335,7 +518,7 @@ export class InferenceRouter {
|
|
|
335
518
|
for (const id of this.noted.keys())
|
|
336
519
|
if (!known.has(id))
|
|
337
520
|
this.noted.delete(id);
|
|
338
|
-
return { accounts, eligible: new Set(allAccounts.map((account) => account.id)), lapsed };
|
|
521
|
+
return { accounts, eligible: new Set(allAccounts.map((account) => account.id)), lapsed, tiers };
|
|
339
522
|
}
|
|
340
523
|
/**
|
|
341
524
|
* The pool for one request of a session served by `accountIdArg`, which it refuses when that account cannot serve
|
|
@@ -392,60 +575,70 @@ export class InferenceRouter {
|
|
|
392
575
|
this.catalogs.set(cacheKey, { models, revision: accountArg.revision, until: this.now() + 60_000 });
|
|
393
576
|
return models;
|
|
394
577
|
}
|
|
578
|
+
/** The models a Claude account or an Anthropic API key may use (`heldModels`). */
|
|
579
|
+
claudeCatalog(accountArg, signalArg) {
|
|
580
|
+
return this.heldModels(this.claudeCatalogs, accountArg, signalArg, (accessArg, optionsArg) => accountArg.credential === 'api_key'
|
|
581
|
+
? plugins.anthropicProvider.listAnthropicApiKeyModels({ apiKey: accessArg.accessToken }, optionsArg)
|
|
582
|
+
: plugins.anthropicProvider.listAnthropicOAuthModels(accessArg, optionsArg));
|
|
583
|
+
}
|
|
584
|
+
/** The models an OpenAI API key may use, as its `GET /v1/models` lists them (`heldModels`, `openAiKeyModel`). */
|
|
585
|
+
keyCatalog(accountArg, signalArg) {
|
|
586
|
+
return this.heldModels(this.keyCatalogs, accountArg, signalArg, async (accessArg, optionsArg) => (await plugins.openAiProvider.listOpenAiApiKeyModels({ apiKey: accessArg.accessToken }, optionsArg))
|
|
587
|
+
.map((modelArg) => openAiKeyModel(modelArg.modelId)));
|
|
588
|
+
}
|
|
395
589
|
/**
|
|
396
|
-
* The models
|
|
590
|
+
* The models an account may use, from its list in `listsArg`: the list read within the last minute, else read now.
|
|
397
591
|
* A model-list read that fails keeps the list read before for the account's revision, which the account routes on
|
|
398
592
|
* meanwhile; with none, the account is unavailable for the failure's reason. A failure of the account's access or
|
|
399
593
|
* sign-in makes it unavailable whether a list is held or not. Either way the failure is noted and its account is not
|
|
400
|
-
* read again, however many requests ask, for a minute -- or 5 s after a failed access (`
|
|
594
|
+
* read again, however many requests ask, for a minute -- or 5 s after a failed access (`holdListFailure`).
|
|
401
595
|
*/
|
|
402
|
-
async
|
|
403
|
-
const cached =
|
|
596
|
+
async heldModels(listsArg, accountArg, signalArg, listArg) {
|
|
597
|
+
const cached = listsArg.get(accountArg.id);
|
|
404
598
|
if (cached?.revision === accountArg.revision && cached.until > this.now()) {
|
|
405
|
-
const refusal =
|
|
599
|
+
const refusal = heldListRefusal(cached);
|
|
406
600
|
if (refusal)
|
|
407
|
-
throw new
|
|
601
|
+
throw new ModelListError(refusal);
|
|
408
602
|
return cached.models;
|
|
409
603
|
}
|
|
410
604
|
try {
|
|
411
|
-
const models = await this.
|
|
412
|
-
|
|
413
|
-
failure: null });
|
|
605
|
+
const models = await this.readModelList(accountArg, signalArg, listArg);
|
|
606
|
+
listsArg.set(accountArg.id, { revision: accountArg.revision, until: this.now() + modelListMs, models, failure: null });
|
|
414
607
|
this.noteAccount(accountArg.id, null);
|
|
415
608
|
return models;
|
|
416
609
|
}
|
|
417
610
|
catch (errorArg) {
|
|
418
611
|
signalArg.throwIfAborted();
|
|
419
|
-
const failure = errorArg instanceof
|
|
612
|
+
const failure = errorArg instanceof ModelListError ? errorArg.unavailable
|
|
420
613
|
: { reason: 'catalog_failed', failure: catalogFailure(errorArg) };
|
|
421
|
-
const models = this.
|
|
614
|
+
const models = this.holdListFailure(listsArg, accountArg, failure);
|
|
422
615
|
if (models)
|
|
423
616
|
return models;
|
|
424
|
-
throw new
|
|
617
|
+
throw new ModelListError(failure);
|
|
425
618
|
}
|
|
426
619
|
}
|
|
427
620
|
/**
|
|
428
|
-
* Records why
|
|
621
|
+
* Records why an account's model list or access failed, keeping the list held for its revision, and notes it:
|
|
429
622
|
* neither is read again for a minute after a failed model-list read or sign-in, or for 5 s after a failed access
|
|
430
623
|
* (`access_failed`). The access is then tried again by reading the list again, even one read within the minute: a
|
|
431
624
|
* single list read on recovery. Answers the held list when the account routes on it meanwhile -- only after a failed
|
|
432
|
-
* model-list read (`
|
|
625
|
+
* model-list read (`heldListRefusal`).
|
|
433
626
|
*/
|
|
434
|
-
|
|
435
|
-
const
|
|
436
|
-
until: this.now() + (failureArg.reason === 'access_failed' ?
|
|
437
|
-
models: this.
|
|
438
|
-
|
|
439
|
-
const routed =
|
|
627
|
+
holdListFailure(listsArg, accountArg, failureArg) {
|
|
628
|
+
const list = { revision: accountArg.revision,
|
|
629
|
+
until: this.now() + (failureArg.reason === 'access_failed' ? modelListAccessRetryMs : modelListMs),
|
|
630
|
+
models: this.heldList(listsArg, accountArg) ?? null, failure: failureArg };
|
|
631
|
+
listsArg.set(accountArg.id, list);
|
|
632
|
+
const routed = heldListRefusal(list) ? undefined : list.models;
|
|
440
633
|
this.noteAccount(accountArg.id, failureArg, routed !== undefined);
|
|
441
634
|
return routed;
|
|
442
635
|
}
|
|
443
636
|
/**
|
|
444
|
-
* Reads the models
|
|
445
|
-
* renewed, while a key is ended, so the account service refuses the second read. Every failure but an abort
|
|
446
|
-
* `
|
|
637
|
+
* Reads the models an account may use through `listArg`. A rejected access (`accessRejected`) is reported once: a
|
|
638
|
+
* sign-in is renewed, while a key is ended, so the account service refuses the second read. Every failure but an abort
|
|
639
|
+
* is a `ModelListError` naming its reason.
|
|
447
640
|
*/
|
|
448
|
-
async
|
|
641
|
+
async readModelList(accountArg, signalArg, listArg) {
|
|
449
642
|
const read = async (rejectedGenerationArg) => {
|
|
450
643
|
let access;
|
|
451
644
|
try {
|
|
@@ -453,19 +646,15 @@ export class InferenceRouter {
|
|
|
453
646
|
}
|
|
454
647
|
catch (errorArg) {
|
|
455
648
|
signalArg.throwIfAborted();
|
|
456
|
-
throw new
|
|
649
|
+
throw new ModelListError({ reason: needsSignIn(errorArg) ? 'needs_login' : 'access_failed' });
|
|
457
650
|
}
|
|
458
|
-
const listOptions = { signal: signalArg, ...(this.options.providerFetch ? { fetch: this.options.providerFetch } : {}) };
|
|
459
651
|
try {
|
|
460
|
-
return { models:
|
|
461
|
-
?
|
|
462
|
-
: await plugins.anthropicProvider.listAnthropicOAuthModels(access, listOptions) };
|
|
652
|
+
return { models: await listArg(access, { signal: signalArg,
|
|
653
|
+
...(this.options.providerFetch ? { fetch: this.options.providerFetch } : {}) }) };
|
|
463
654
|
}
|
|
464
655
|
catch (errorArg) {
|
|
465
|
-
if ((errorArg
|
|
466
|
-
|| errorArg instanceof plugins.anthropicProvider.AnthropicApiKeyAuthError) && errorArg.status === 401) {
|
|
656
|
+
if (accessRejected(errorArg))
|
|
467
657
|
return { rejected: access.generation };
|
|
468
|
-
}
|
|
469
658
|
throw errorArg;
|
|
470
659
|
}
|
|
471
660
|
};
|
|
@@ -473,7 +662,7 @@ export class InferenceRouter {
|
|
|
473
662
|
if (result.rejected !== undefined)
|
|
474
663
|
result = await read(result.rejected);
|
|
475
664
|
if (!result.models)
|
|
476
|
-
throw new
|
|
665
|
+
throw new ModelListError({ reason: 'needs_login' });
|
|
477
666
|
return result.models;
|
|
478
667
|
}
|
|
479
668
|
/**
|
|
@@ -483,7 +672,8 @@ export class InferenceRouter {
|
|
|
483
672
|
noteAccount(accountIdArg, unavailableArg, lastCatalogArg = false) {
|
|
484
673
|
const previous = this.noted.get(accountIdArg);
|
|
485
674
|
if (unavailableArg === null ? !previous : previous?.lastCatalog === lastCatalogArg
|
|
486
|
-
&& previous.unavailable.reason === unavailableArg.reason && previous.unavailable.failure === unavailableArg.failure
|
|
675
|
+
&& previous.unavailable.reason === unavailableArg.reason && previous.unavailable.failure === unavailableArg.failure
|
|
676
|
+
&& previous.unavailable.cause === unavailableArg.cause)
|
|
487
677
|
return;
|
|
488
678
|
if (unavailableArg === null)
|
|
489
679
|
this.noted.delete(accountIdArg);
|
|
@@ -497,36 +687,54 @@ export class InferenceRouter {
|
|
|
497
687
|
}
|
|
498
688
|
catch { }
|
|
499
689
|
}
|
|
500
|
-
/** The model list
|
|
501
|
-
|
|
502
|
-
const cached =
|
|
690
|
+
/** The model list an account's revision was last read with, without reading it: `undefined` when none is held. */
|
|
691
|
+
heldList(listsArg, accountArg) {
|
|
692
|
+
const cached = listsArg.get(accountArg.id);
|
|
503
693
|
return cached?.revision === accountArg.revision ? cached.models ?? undefined : undefined;
|
|
504
694
|
}
|
|
505
695
|
/**
|
|
506
|
-
* Why
|
|
507
|
-
*
|
|
696
|
+
* Why an account's model list or access keeps it from routing, as a request would find it now, before its next read is
|
|
697
|
+
* due: a failed access or sign-in, or a failed model-list read with no list held for its revision. Only the accounts
|
|
698
|
+
* whose model list the router reads have one: Claude accounts and API keys.
|
|
508
699
|
*/
|
|
509
|
-
|
|
510
|
-
const
|
|
511
|
-
|
|
700
|
+
listRefusal(accountArg) {
|
|
701
|
+
const refusal = (cachedArg) => cachedArg?.revision === accountArg.revision
|
|
702
|
+
&& cachedArg.until > this.now() ? heldListRefusal(cachedArg) : undefined;
|
|
703
|
+
return accountArg.providerId === 'anthropic' ? refusal(this.claudeCatalogs.get(accountArg.id))
|
|
704
|
+
: accountArg.credential === 'api_key' ? refusal(this.keyCatalogs.get(accountArg.id)) : undefined;
|
|
512
705
|
}
|
|
513
706
|
/**
|
|
514
|
-
* The
|
|
515
|
-
*
|
|
516
|
-
*
|
|
517
|
-
*
|
|
707
|
+
* The Claude pool's models, from its best credential tier with a readable account (`inferenceCredentialTiers`): the
|
|
708
|
+
* Claude accounts' while one of them can read its model list, else the Anthropic API keys'. Within the tier, the
|
|
709
|
+
* models every readable account offers: a session may move to any of them, so a model one account lacks is not
|
|
710
|
+
* offered. Limits are the smallest any of them states; efforts are those all of them accept, and adaptive thinking is
|
|
711
|
+
* offered when all of them accept it. What one account does not state, the pool does not state.
|
|
518
712
|
*/
|
|
519
713
|
async claudeModels(policyArg, signalArg) {
|
|
520
714
|
if (policyArg.provider !== 'anthropic')
|
|
521
715
|
throw new Error('The Claude catalog belongs to a Claude pool.');
|
|
522
|
-
const accounts = await this.
|
|
716
|
+
const { accounts, tiers } = await this.pool(policyArg, signalArg);
|
|
717
|
+
for (const tier of tiers) {
|
|
718
|
+
const models = await this.tierClaudeModels(accounts.filter((account) => account.credential === tier), policyArg, signalArg);
|
|
719
|
+
if (models?.size)
|
|
720
|
+
return [...models.values()];
|
|
721
|
+
}
|
|
722
|
+
throw new InferenceRoutingError(503, 'no_eligible_accounts', policyArg.credential === 'api_key'
|
|
723
|
+
? 'No Anthropic API key could supply a model list. Add one with `authswitch account add anthropic-api-key`.'
|
|
724
|
+
: policyArg.credential === 'subscription' || policyArg.plans
|
|
725
|
+
? 'No eligible Claude account could supply a model list. Check the AGL account service and sign-ins.'
|
|
726
|
+
: 'No eligible Claude account or Anthropic API key could supply a model list. Check the AGL account service and '
|
|
727
|
+
+ 'sign-ins, or add a key with `authswitch account add anthropic-api-key`.');
|
|
728
|
+
}
|
|
729
|
+
/** The models every readable account of one credential tier of a Claude pool offers; `undefined` when none is readable. */
|
|
730
|
+
async tierClaudeModels(accountsArg, policyArg, signalArg) {
|
|
523
731
|
let models;
|
|
524
|
-
for (const account of
|
|
732
|
+
for (const account of accountsArg) {
|
|
525
733
|
signalArg.throwIfAborted();
|
|
526
734
|
try {
|
|
735
|
+
// A plan restriction leaves the keys out of the pool: only Claude accounts are judged on it.
|
|
527
736
|
if (policyArg.plans) {
|
|
528
|
-
const limits = account.
|
|
529
|
-
: claudeLimits(await this.options.usage(account.id, signalArg), account, this.now());
|
|
737
|
+
const limits = claudeLimits(await this.options.usage(account.id, signalArg), account, this.now());
|
|
530
738
|
if (!limits || !policyArg.plans.includes(limits.plan))
|
|
531
739
|
continue;
|
|
532
740
|
}
|
|
@@ -566,25 +774,48 @@ export class InferenceRouter {
|
|
|
566
774
|
// An unreadable account is unavailable; it never supplies guessed models.
|
|
567
775
|
}
|
|
568
776
|
}
|
|
569
|
-
|
|
570
|
-
throw new InferenceRoutingError(503, 'no_eligible_accounts', policyArg.credential === 'api_key'
|
|
571
|
-
? 'No Anthropic API key could supply a model list. Add one with `authswitch account add anthropic-api-key`.'
|
|
572
|
-
: 'No eligible Claude account could supply a model list. Check the AGL account service and sign-ins.');
|
|
573
|
-
return [...models.values()];
|
|
777
|
+
return models;
|
|
574
778
|
}
|
|
575
779
|
/**
|
|
576
|
-
*
|
|
577
|
-
*
|
|
780
|
+
* The ChatGPT pool's models, from its best credential tier with a readable account (`inferenceCredentialTiers`): the
|
|
781
|
+
* ChatGPT sign-ins' current entitlements while one of them can read its catalog, else the OpenAI API keys' models
|
|
782
|
+
* (`keyTierModels`). A pool whose every ChatGPT account read needs a fresh sign-in -- ChatGPT rejected its access even
|
|
783
|
+
* when renewed, or the account service could not renew it -- and no key to fall back to answers
|
|
578
784
|
* `account_needs_login`, so its caller asks for a sign-in rather than for the proxy.
|
|
579
785
|
*/
|
|
580
786
|
async models(policyArg, signalArg) {
|
|
581
787
|
if ((policyArg.provider ?? 'openai') !== 'openai')
|
|
582
788
|
throw new Error('The ChatGPT catalog belongs to a ChatGPT pool.');
|
|
583
|
-
const accounts = await this.
|
|
789
|
+
const { accounts, tiers } = await this.pool(policyArg, signalArg);
|
|
790
|
+
let signInNeeded = false;
|
|
791
|
+
for (const tier of tiers) {
|
|
792
|
+
if (tier === 'subscription') {
|
|
793
|
+
const read = await this.signInModels(accounts.filter(chatGptSignIn), policyArg, signalArg);
|
|
794
|
+
if (read.models.size)
|
|
795
|
+
return [...read.models.values()];
|
|
796
|
+
signInNeeded = read.signInNeeded;
|
|
797
|
+
}
|
|
798
|
+
else {
|
|
799
|
+
const models = await this.keyTierModels(accounts.filter((account) => !chatGptSignIn(account)), signalArg);
|
|
800
|
+
if (models?.size)
|
|
801
|
+
return [...models.values()];
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
if (signInNeeded)
|
|
805
|
+
throw new InferenceRoutingError(503, 'account_needs_login', 'An account needs a fresh sign-in.');
|
|
806
|
+
throw new InferenceRoutingError(503, 'no_eligible_accounts', policyArg.credential === 'api_key'
|
|
807
|
+
? 'No OpenAI API key could supply a model list. Add one in AGL Accounts or with `authswitch account add openai-api-key`.'
|
|
808
|
+
: 'No eligible account could supply a model catalog. Check the AGL account service and sign-ins.');
|
|
809
|
+
}
|
|
810
|
+
/**
|
|
811
|
+
* Current model entitlements, merged conservatively across the pool's ChatGPT sign-ins, and whether every account read
|
|
812
|
+
* needed a fresh sign-in.
|
|
813
|
+
*/
|
|
814
|
+
async signInModels(accountsArg, policyArg, signalArg) {
|
|
584
815
|
const models = new Map();
|
|
585
816
|
let read = 0;
|
|
586
817
|
let signInNeeded = 0;
|
|
587
|
-
for (const account of
|
|
818
|
+
for (const account of accountsArg) {
|
|
588
819
|
signalArg.throwIfAborted();
|
|
589
820
|
try {
|
|
590
821
|
if (policyArg.plans) {
|
|
@@ -614,21 +845,43 @@ export class InferenceRouter {
|
|
|
614
845
|
signInNeeded += 1;
|
|
615
846
|
}
|
|
616
847
|
}
|
|
617
|
-
|
|
618
|
-
|
|
848
|
+
return { models, signInNeeded: !models.size && read > 0 && signInNeeded === read };
|
|
849
|
+
}
|
|
850
|
+
/**
|
|
851
|
+
* The models every readable OpenAI API key of the pool lists and flexharness describes (`openAiKeyModel`), newest first
|
|
852
|
+
* as `OPENAI_API_MODELS` orders them, the first the default: a session may move to any of the keys, so a model one key
|
|
853
|
+
* lacks is not offered. `undefined` when no key is readable.
|
|
854
|
+
*/
|
|
855
|
+
async keyTierModels(accountsArg, signalArg) {
|
|
856
|
+
let offered;
|
|
857
|
+
for (const account of accountsArg) {
|
|
858
|
+
signalArg.throwIfAborted();
|
|
859
|
+
try {
|
|
860
|
+
const listed = new Set((await this.keyCatalog(account, signalArg)).filter((model) => !model.hidden).map((model) => model.modelId));
|
|
861
|
+
offered = offered ? new Set([...offered].filter((modelId) => listed.has(modelId))) : listed;
|
|
862
|
+
}
|
|
863
|
+
catch {
|
|
864
|
+
signalArg.throwIfAborted();
|
|
865
|
+
// An unreadable key is unavailable; it never supplies guessed models.
|
|
866
|
+
}
|
|
619
867
|
}
|
|
620
|
-
if (!
|
|
621
|
-
|
|
622
|
-
|
|
868
|
+
if (!offered)
|
|
869
|
+
return undefined;
|
|
870
|
+
const models = plugins.openAiProvider.OPENAI_API_MODELS.filter((model) => offered.has(model.modelId))
|
|
871
|
+
.map((model, index) => ({ ...openAiKeyModel(model.modelId), isDefault: index === 0 }));
|
|
872
|
+
return new Map(models.map((model) => [model.modelId, model]));
|
|
623
873
|
}
|
|
624
874
|
/**
|
|
625
|
-
* The pool's Codex model catalog in the Codex backend's own entry shape, read for the client's version
|
|
626
|
-
*
|
|
875
|
+
* The pool's Codex model catalog in the Codex backend's own entry shape, read for the client's version through its
|
|
876
|
+
* ChatGPT sign-ins alone: an OpenAI API key never reaches the ChatGPT catalog connection, so a pool of keys alone has
|
|
877
|
+
* no Codex catalog here (`no_eligible_accounts`; Codex then uses its bundled one). An entry shared by several
|
|
878
|
+
* accounts keeps only what every one of them offers.
|
|
627
879
|
*/
|
|
628
880
|
async nativeModels(policyArg, clientVersionArg, signalArg) {
|
|
629
881
|
if ((policyArg.provider ?? 'openai') !== 'openai')
|
|
630
882
|
throw new Error('The Codex catalog belongs to a ChatGPT pool.');
|
|
631
|
-
|
|
883
|
+
// The Codex catalog is the ChatGPT backend's: only a ChatGPT sign-in reads it, whatever credential the policy names.
|
|
884
|
+
const accounts = (await this.accounts(policyArg, signalArg)).filter(chatGptSignIn);
|
|
632
885
|
const models = new Map();
|
|
633
886
|
for (const account of accounts) {
|
|
634
887
|
signalArg.throwIfAborted();
|
|
@@ -685,36 +938,84 @@ export class InferenceRouter {
|
|
|
685
938
|
return models;
|
|
686
939
|
}
|
|
687
940
|
/**
|
|
688
|
-
* A ChatGPT account
|
|
689
|
-
*
|
|
941
|
+
* A ChatGPT account or an OpenAI API key for one request, chosen as `acquireClaude` chooses: the pinned session account
|
|
942
|
+
* if it is still eligible, else the best credential tier's least busy account with the most headroom
|
|
943
|
+
* (`inferenceCredentialTiers`). A ChatGPT account is judged on its usage reading and the Codex catalog of the release
|
|
944
|
+
* the client read it as (`clientVersion`). An OpenAI API key takes only a Responses request (`apiKeys`), never a
|
|
945
|
+
* translated Messages request, and is judged as an Anthropic API key is (`judgeListed`): a payment problem -- OpenAI's
|
|
946
|
+
* quota refusal -- or its month's spend at its limit keeps it out, a key with a limit takes no request it cannot price
|
|
947
|
+
* (`unpriced`, `model_unpriced`), and its model list (`GET /v1/models`, held a minute) must list the model. The accounts
|
|
948
|
+
* of `exclude` count as `excludedBecause` says, as for a Claude pool. `returnToBetterTier`: a session pinned to a key
|
|
949
|
+
* goes back to a ChatGPT account as soon as one can take its request, and the route says so (`returned`).
|
|
690
950
|
*/
|
|
691
951
|
async acquire(modelIdArg, policyArg, signalArg, optionsArg = {}) {
|
|
692
952
|
if ((policyArg.provider ?? 'openai') !== 'openai')
|
|
693
953
|
throw new Error('A ChatGPT route belongs to a ChatGPT pool.');
|
|
954
|
+
const { accounts, tiers } = await this.sessionPool(policyArg, signalArg, optionsArg.accountId);
|
|
955
|
+
const pinned = accounts.find((account) => account.id === optionsArg.accountId);
|
|
956
|
+
if (pinned && optionsArg.returnToBetterTier) {
|
|
957
|
+
// The session's account is of a later tier: an account of a better one that can take the request takes it, as a
|
|
958
|
+
// new session would be placed. When none can, the session stays where it is, judged as before.
|
|
959
|
+
const better = accounts.filter((account) => tiers.indexOf(account.credential) < tiers.indexOf(pinned.credential));
|
|
960
|
+
if (better.length) {
|
|
961
|
+
try {
|
|
962
|
+
const { accountId: _pinned, ...unpinned } = optionsArg;
|
|
963
|
+
return { ...await this.routeOpenAi(modelIdArg, policyArg, better, tiers, signalArg, unpinned), returned: true };
|
|
964
|
+
}
|
|
965
|
+
catch (errorArg) {
|
|
966
|
+
signalArg.throwIfAborted();
|
|
967
|
+
if (!(errorArg instanceof InferenceRoutingError))
|
|
968
|
+
throw errorArg;
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
return this.routeOpenAi(modelIdArg, policyArg, accounts, tiers, signalArg, optionsArg);
|
|
973
|
+
}
|
|
974
|
+
/** `acquire` among `accountsArg`, the pool's accounts or those of its better tiers. */
|
|
975
|
+
async routeOpenAi(modelIdArg, policyArg, accountsArg, tiersArg, signalArg, optionsArg) {
|
|
694
976
|
const candidates = [];
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
let
|
|
698
|
-
|
|
699
|
-
let earliestReset = Infinity;
|
|
700
|
-
let accountLimit;
|
|
701
|
-
const exhaustedPlans = new Set();
|
|
702
|
-
const { accounts } = await this.sessionPool(policyArg, signalArg, optionsArg.accountId);
|
|
703
|
-
for (const account of accounts) {
|
|
977
|
+
const state = emptySelection(accountsArg.length, optionsArg.accountId !== undefined);
|
|
978
|
+
/** Why the last account judged takes no request though no limit says so: a pinned refusal names it. */
|
|
979
|
+
let refusal;
|
|
980
|
+
for (const account of accountsArg) {
|
|
704
981
|
signalArg.throwIfAborted();
|
|
705
982
|
if (optionsArg.accountId && optionsArg.accountId !== account.id)
|
|
706
983
|
continue;
|
|
707
984
|
if (optionsArg.exclude?.has(account.id)) {
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
985
|
+
this.countLeft(state, account, optionsArg.excludedBecause?.get(account.id));
|
|
986
|
+
continue;
|
|
987
|
+
}
|
|
988
|
+
// A translated Messages request never goes to an OpenAI API key: only a Responses request does.
|
|
989
|
+
if (!chatGptSignIn(account) && !optionsArg.apiKeys) {
|
|
990
|
+
state.unavailable = true;
|
|
712
991
|
continue;
|
|
713
992
|
}
|
|
714
993
|
try {
|
|
994
|
+
if (!chatGptSignIn(account)) {
|
|
995
|
+
// A key's usage is its month's spend, with the payment problem the account service holds on it.
|
|
996
|
+
const usage = await this.options.usage(account.id, signalArg)
|
|
997
|
+
.catch(() => { signalArg.throwIfAborted(); return undefined; });
|
|
998
|
+
const judged = await this.judgeListed(state, account, usage, keyLimits(usage, account, this.now()), {
|
|
999
|
+
modelId: modelIdArg, lists: this.keyCatalogs, read: (accountArg, innerSignalArg) => this.keyCatalog(accountArg, innerSignalArg),
|
|
1000
|
+
...(optionsArg.unpriced === undefined ? {} : { unpriced: optionsArg.unpriced })
|
|
1001
|
+
}, signalArg);
|
|
1002
|
+
if (judged?.kind !== 'candidate') {
|
|
1003
|
+
if (judged)
|
|
1004
|
+
refusal = judged.unavailable;
|
|
1005
|
+
continue;
|
|
1006
|
+
}
|
|
1007
|
+
// The request goes to OpenAI as the client sent it: its effort and service tier are OpenAI's to judge, a limited
|
|
1008
|
+
// key's tier the price check's (`unpriced`).
|
|
1009
|
+
const placement = accountPlacement(judged.limits.limit ? usage.reading : null, account, this.now());
|
|
1010
|
+
candidates.push({ account, tier: tiersArg.indexOf(account.credential), model: judged.model,
|
|
1011
|
+
reading: judged.limits.limit ? usage.reading : null, ignoreLimits: false, plan: judged.limits.plan,
|
|
1012
|
+
headroom: judged.limits.headroom, score: placement.score, lastResort: placement.eligibility === 'last_resort',
|
|
1013
|
+
spendLimit: judged.spendLimit });
|
|
1014
|
+
continue;
|
|
1015
|
+
}
|
|
715
1016
|
const usage = await this.options.usage(account.id, signalArg);
|
|
716
1017
|
if (!usableReading(usage, this.now()) || usage.reading?.kind !== 'openai') {
|
|
717
|
-
unavailable = true;
|
|
1018
|
+
state.unavailable = true;
|
|
718
1019
|
continue;
|
|
719
1020
|
}
|
|
720
1021
|
const plan = usage.reading.rateLimits.plan;
|
|
@@ -723,7 +1024,7 @@ export class InferenceRouter {
|
|
|
723
1024
|
const model = (await this.catalog(account, signalArg, optionsArg.clientVersion)).find((entry) => entry.modelId === modelIdArg);
|
|
724
1025
|
if (!model)
|
|
725
1026
|
continue;
|
|
726
|
-
modelKnown = true;
|
|
1027
|
+
state.modelKnown = true;
|
|
727
1028
|
if (optionsArg.reasoningEffort && !model.reasoningEfforts.some((effort) => effort.effort === optionsArg.reasoningEffort))
|
|
728
1029
|
continue;
|
|
729
1030
|
if (optionsArg.serviceTier && !['auto', 'default'].includes(optionsArg.serviceTier)
|
|
@@ -731,56 +1032,95 @@ export class InferenceRouter {
|
|
|
731
1032
|
continue;
|
|
732
1033
|
const limits = chatGptLimits(usage, account, this.now());
|
|
733
1034
|
if (!limits) {
|
|
734
|
-
unavailable = true;
|
|
1035
|
+
state.unavailable = true;
|
|
735
1036
|
continue;
|
|
736
1037
|
}
|
|
737
1038
|
const cooldown = cooldownUntil(this.cooldowns.get(account.id), usage);
|
|
738
1039
|
if (limits.state !== 'available' || cooldown > this.now()) {
|
|
739
|
-
exhausted = true;
|
|
740
|
-
reserved ||= limits.state === 'reserved';
|
|
741
|
-
accountLimit = limits.state === 'available' ? 'cooling' : limits.state;
|
|
742
|
-
exhaustedPlans.add(limits.plan);
|
|
1040
|
+
state.exhausted = true;
|
|
1041
|
+
state.reserved ||= limits.state === 'reserved';
|
|
1042
|
+
state.accountLimit = limits.state === 'available' ? 'cooling' : limits.state;
|
|
1043
|
+
state.exhaustedPlans.add(limits.plan);
|
|
743
1044
|
const reset = Math.max(cooldown, limits.resetAt ?? 0);
|
|
744
1045
|
if (reset > this.now())
|
|
745
|
-
earliestReset = Math.min(earliestReset, reset);
|
|
1046
|
+
state.earliestReset = Math.min(state.earliestReset, reset);
|
|
746
1047
|
continue;
|
|
747
1048
|
}
|
|
748
1049
|
const placement = accountPlacement(usage.reading, account, this.now());
|
|
749
|
-
candidates.push({ account, model, reading: usage.reading, ignoreLimits: false,
|
|
750
|
-
lastResort: placement.eligibility === 'last_resort'
|
|
1050
|
+
candidates.push({ account, tier: tiersArg.indexOf(account.credential), model, reading: usage.reading, ignoreLimits: false,
|
|
1051
|
+
plan: limits.plan, headroom: limits.headroom, score: placement.score, lastResort: placement.eligibility === 'last_resort',
|
|
1052
|
+
spendLimit: false });
|
|
751
1053
|
}
|
|
752
|
-
catch {
|
|
1054
|
+
catch (errorArg) {
|
|
753
1055
|
signalArg.throwIfAborted();
|
|
754
|
-
unavailable = true;
|
|
1056
|
+
state.unavailable = true;
|
|
1057
|
+
if (errorArg instanceof ModelListError)
|
|
1058
|
+
refusal = errorArg.unavailable;
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
if (optionsArg.accountId !== undefined && refusal)
|
|
1062
|
+
state.refusal = { accountId: optionsArg.accountId, unavailable: refusal };
|
|
1063
|
+
// The chosen account's access is resolved before anything is sent. An OpenAI API key whose access fails takes no
|
|
1064
|
+
// request, as an Anthropic key's does (`routeClaude`): the failure is held for the key (`keyCatalogs`) and noted, and
|
|
1065
|
+
// the request goes to the next candidate -- a pinned request has none, so it is refused naming the key and the reason.
|
|
1066
|
+
// A ChatGPT account's failure fails the request.
|
|
1067
|
+
let selected;
|
|
1068
|
+
let initial;
|
|
1069
|
+
let release;
|
|
1070
|
+
for (;;) {
|
|
1071
|
+
selected = this.select(candidates, state);
|
|
1072
|
+
release = this.reserve(selected.account.id);
|
|
1073
|
+
try {
|
|
1074
|
+
initial = await this.options.resolveAccess(selected.account.id, signalArg);
|
|
1075
|
+
break;
|
|
1076
|
+
}
|
|
1077
|
+
catch (errorArg) {
|
|
1078
|
+
release();
|
|
1079
|
+
if (chatGptSignIn(selected.account))
|
|
1080
|
+
throw errorArg;
|
|
1081
|
+
signalArg.throwIfAborted();
|
|
1082
|
+
const failure = { reason: needsSignIn(errorArg) ? 'needs_login' : 'access_failed' };
|
|
1083
|
+
this.holdListFailure(this.keyCatalogs, selected.account, failure);
|
|
1084
|
+
candidates.splice(candidates.indexOf(selected), 1);
|
|
1085
|
+
state.unavailable = true;
|
|
1086
|
+
if (state.pinned)
|
|
1087
|
+
state.refusal = { accountId: selected.account.id, unavailable: failure };
|
|
755
1088
|
}
|
|
756
1089
|
}
|
|
757
|
-
const selectionState = { exhausted, reserved, unavailable, modelKnown, earliestReset, exhaustedPlans,
|
|
758
|
-
accounts: accounts.length, pinned: optionsArg.accountId !== undefined, accountLimit, payment: [] };
|
|
759
|
-
const selected = this.select(candidates, selectionState);
|
|
760
1090
|
const id = selected.account.id;
|
|
761
|
-
const release = this.reserve(id);
|
|
762
1091
|
try {
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
1092
|
+
this.select([selected], state);
|
|
1093
|
+
const connection = chatGptSignIn(selected.account)
|
|
1094
|
+
? plugins.openAiProvider.createOpenAiChatGptResolvingModelConnection({
|
|
1095
|
+
expectedIdentity: initial,
|
|
1096
|
+
resolveAccess: async ({ signal, rejectedGeneration }) => {
|
|
1097
|
+
const access = await this.options.resolveAccess(id, signal, rejectedGeneration);
|
|
1098
|
+
this.select([selected], state);
|
|
1099
|
+
return access;
|
|
1100
|
+
},
|
|
1101
|
+
fetch: async (inputArg, initArg) => {
|
|
1102
|
+
const response = await (this.options.providerFetch ?? fetch)(inputArg, initArg);
|
|
1103
|
+
this.observe(id, 'openai', response.headers, response.status);
|
|
1104
|
+
if (response.status === 429) {
|
|
1105
|
+
this.reportQuota(id, this.retryAfterSeconds(response.headers));
|
|
1106
|
+
}
|
|
1107
|
+
return response;
|
|
1108
|
+
},
|
|
1109
|
+
originator: 'agl',
|
|
1110
|
+
})
|
|
1111
|
+
: plugins.openAiProvider.createOpenAiApiKeyConnection({
|
|
1112
|
+
apiKey: initial.accessToken,
|
|
1113
|
+
// A key is never renewed: OpenAI's 401 is reported before the connection fails the request with it.
|
|
1114
|
+
fetch: async (inputArg, initArg) => {
|
|
1115
|
+
const response = await (this.options.providerFetch ?? fetch)(inputArg, initArg);
|
|
1116
|
+
if (response.status === 401)
|
|
1117
|
+
await this.rejectApiKey(id, initial.generation, signalArg);
|
|
1118
|
+
return response;
|
|
1119
|
+
},
|
|
1120
|
+
});
|
|
1121
|
+
return { provider: 'openai', credential: selected.account.credential, accountId: id, plan: selected.plan,
|
|
1122
|
+
score: selected.score, model: selected.model, connection, returned: false, loginId: selected.account.loginId,
|
|
1123
|
+
spendLimit: selected.spendLimit, release };
|
|
784
1124
|
}
|
|
785
1125
|
catch (errorArg) {
|
|
786
1126
|
release();
|
|
@@ -788,123 +1128,237 @@ export class InferenceRouter {
|
|
|
788
1128
|
}
|
|
789
1129
|
}
|
|
790
1130
|
/**
|
|
791
|
-
*
|
|
792
|
-
*
|
|
793
|
-
*
|
|
794
|
-
*
|
|
795
|
-
*
|
|
1131
|
+
* Counts an account the request left already (`exclude`) as its own judgement counts the reason the request left it
|
|
1132
|
+
* for (`excludedBecause`): a payment problem joins the 402 list, a key whose spend could not be read or recorded is
|
|
1133
|
+
* named in the 503, one that could not price the request joins the 400 list, one without the model leads to the 404,
|
|
1134
|
+
* and every other reason to the 503 for want of an account. An account left for no reason of its own counts as at its
|
|
1135
|
+
* limit (429). The switch is exhaustive: a new reason must be placed here.
|
|
1136
|
+
*/
|
|
1137
|
+
countLeft(stateArg, accountArg, leftArg) {
|
|
1138
|
+
if (!leftArg) {
|
|
1139
|
+
stateArg.exhausted = true;
|
|
1140
|
+
const reset = this.cooldowns.get(accountArg.id)?.until ?? 0;
|
|
1141
|
+
if (reset > this.now())
|
|
1142
|
+
stateArg.earliestReset = Math.min(stateArg.earliestReset, reset);
|
|
1143
|
+
return;
|
|
1144
|
+
}
|
|
1145
|
+
switch (leftArg.reason) {
|
|
1146
|
+
case 'payment_problem':
|
|
1147
|
+
stateArg.payment.push({ label: accountArg.label, credential: accountArg.credential, unavailable: leftArg });
|
|
1148
|
+
return;
|
|
1149
|
+
case 'model_missing':
|
|
1150
|
+
return;
|
|
1151
|
+
case 'model_unpriced':
|
|
1152
|
+
stateArg.unpriced.labels.push(accountArg.label);
|
|
1153
|
+
stateArg.unpriced.what ??= leftArg.failure;
|
|
1154
|
+
return;
|
|
1155
|
+
case 'spend_unread':
|
|
1156
|
+
stateArg.unavailable = true;
|
|
1157
|
+
stateArg.spendUnread.push(accountArg.label);
|
|
1158
|
+
return;
|
|
1159
|
+
case 'spend_unrecorded':
|
|
1160
|
+
stateArg.unavailable = true;
|
|
1161
|
+
stateArg.spendUnrecorded.push(accountArg.label);
|
|
1162
|
+
return;
|
|
1163
|
+
case 'usage_unread':
|
|
1164
|
+
case 'catalog_failed':
|
|
1165
|
+
case 'needs_login':
|
|
1166
|
+
case 'access_failed':
|
|
1167
|
+
stateArg.unavailable = true;
|
|
1168
|
+
return;
|
|
1169
|
+
default: {
|
|
1170
|
+
const unhandledReason = leftArg.reason;
|
|
1171
|
+
return unhandledReason;
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
/**
|
|
1176
|
+
* Judges an account whose model list the router reads -- a Claude account, an Anthropic or an OpenAI API key -- for one
|
|
1177
|
+
* request, as placement takes it, recording on `stateArg` what keeps it out. A payment problem refuses it before anything
|
|
1178
|
+
* else; without limits to route on (`limitsArg`) it is unavailable (`usage_unread`, a key's `spend_unread`); a key with
|
|
1179
|
+
* a spend limit whose spend is recorded nowhere yet is refused (`spend_unrecorded`). Limits and cool-down are judged
|
|
1180
|
+
* before any model list is read: an account that cannot take the request now is never read for it, its held list says
|
|
1181
|
+
* whether it would serve the model, and without one it counts as at its limit, so a session on it moves rather than
|
|
1182
|
+
* waiting for a list. A key's spend reading says nothing of the provider's rate limits, so only its own end ends a key's
|
|
1183
|
+
* cool-down. A key with a spend limit then takes no request whose cost the price table cannot count (`unpriced`,
|
|
1184
|
+
* Decision Q4), and the model list (`read`) must list the model. Answers the candidate's model and limits, or the refusal
|
|
1185
|
+
* of an account that takes no request for a reason of its own -- a pinned refusal names it -- or `undefined`.
|
|
1186
|
+
*/
|
|
1187
|
+
async judgeListed(stateArg, accountArg, usageArg, limitsArg, optionsArg, signalArg) {
|
|
1188
|
+
const apiKey = accountArg.credential === 'api_key';
|
|
1189
|
+
const refused = (unavailableArg) => ({ kind: 'refused', unavailable: unavailableArg });
|
|
1190
|
+
// A payment problem refuses the account before anything else is judged, whatever limits a request ignores.
|
|
1191
|
+
const problem = this.paymentProblem(accountArg.id, usageArg);
|
|
1192
|
+
if (problem) {
|
|
1193
|
+
stateArg.payment.push({ label: accountArg.label, credential: accountArg.credential, unavailable: problem });
|
|
1194
|
+
this.noteAccount(accountArg.id, problem);
|
|
1195
|
+
return refused(problem);
|
|
1196
|
+
}
|
|
1197
|
+
if (this.noted.get(accountArg.id)?.unavailable.reason === 'payment_problem')
|
|
1198
|
+
this.noteAccount(accountArg.id, null);
|
|
1199
|
+
if (!limitsArg) {
|
|
1200
|
+
stateArg.unavailable = true;
|
|
1201
|
+
const unavailable = apiKey ? { reason: 'spend_unread' }
|
|
1202
|
+
: { reason: 'usage_unread', retryAt: usageArg?.nextAttemptAt ?? null };
|
|
1203
|
+
if (apiKey)
|
|
1204
|
+
stateArg.spendUnread.push(accountArg.label);
|
|
1205
|
+
this.noteAccount(accountArg.id, unavailable);
|
|
1206
|
+
return refused(unavailable);
|
|
1207
|
+
}
|
|
1208
|
+
// A key with a spend limit whose spend the proxy relayed is recorded nowhere yet takes nothing while it is not,
|
|
1209
|
+
// whatever its spend: the account service's ledger lacks those answers.
|
|
1210
|
+
const spendLimit = apiKey && keyHasSpendLimit(usageArg, accountArg);
|
|
1211
|
+
if (spendLimit && this.options.spend?.held(accountArg.id)) {
|
|
1212
|
+
stateArg.unavailable = true;
|
|
1213
|
+
stateArg.spendUnrecorded.push(accountArg.label);
|
|
1214
|
+
const unavailable = { reason: 'spend_unrecorded' };
|
|
1215
|
+
this.noteAccount(accountArg.id, unavailable);
|
|
1216
|
+
return refused(unavailable);
|
|
1217
|
+
}
|
|
1218
|
+
const notedReason = this.noted.get(accountArg.id)?.unavailable.reason;
|
|
1219
|
+
if (notedReason === 'usage_unread' || notedReason === 'spend_unread' || notedReason === 'spend_unrecorded') {
|
|
1220
|
+
this.noteAccount(accountArg.id, null);
|
|
1221
|
+
}
|
|
1222
|
+
if (optionsArg.plans && !optionsArg.plans.includes(limitsArg.plan))
|
|
1223
|
+
return undefined;
|
|
1224
|
+
const cooldown = cooldownUntil(this.cooldowns.get(accountArg.id), apiKey ? undefined : usageArg);
|
|
1225
|
+
if (!optionsArg.ignoreLimits && (limitsArg.state !== 'available' || cooldown > this.now())) {
|
|
1226
|
+
const held = this.heldList(optionsArg.lists, accountArg);
|
|
1227
|
+
if (held && !held.some((entry) => entry.modelId === optionsArg.modelId))
|
|
1228
|
+
return refused({ reason: 'model_missing' });
|
|
1229
|
+
if (held)
|
|
1230
|
+
stateArg.modelKnown = true;
|
|
1231
|
+
stateArg.exhausted = true;
|
|
1232
|
+
stateArg.reserved ||= limitsArg.state === 'reserved';
|
|
1233
|
+
stateArg.accountLimit = limitsArg.state === 'available' ? 'cooling' : limitsArg.state;
|
|
1234
|
+
// A key has no plan to name.
|
|
1235
|
+
if (limitsArg.plan)
|
|
1236
|
+
stateArg.exhaustedPlans.add(limitsArg.plan);
|
|
1237
|
+
if (limitsArg.state === 'exhausted' && usageArg?.reading?.kind === 'spend') {
|
|
1238
|
+
stateArg.spendLimited.push({ accountId: accountArg.id, label: accountArg.label, spend: usageArg.reading.spend });
|
|
1239
|
+
}
|
|
1240
|
+
const reset = Math.max(cooldown, limitsArg.resetAt ?? 0);
|
|
1241
|
+
if (reset > this.now())
|
|
1242
|
+
stateArg.earliestReset = Math.min(stateArg.earliestReset, reset);
|
|
1243
|
+
return undefined;
|
|
1244
|
+
}
|
|
1245
|
+
if (spendLimit && optionsArg.unpriced !== undefined && !optionsArg.ignoreLimits) {
|
|
1246
|
+
stateArg.unpriced.labels.push(accountArg.label);
|
|
1247
|
+
stateArg.unpriced.what ??= optionsArg.unpriced;
|
|
1248
|
+
return refused({ reason: 'model_unpriced', failure: optionsArg.unpriced });
|
|
1249
|
+
}
|
|
1250
|
+
const model = (await optionsArg.read(accountArg, signalArg)).find((entry) => entry.modelId === optionsArg.modelId);
|
|
1251
|
+
if (!model)
|
|
1252
|
+
return refused({ reason: 'model_missing' });
|
|
1253
|
+
stateArg.modelKnown = true;
|
|
1254
|
+
return { kind: 'candidate', model, limits: limitsArg, spendLimit };
|
|
1255
|
+
}
|
|
1256
|
+
/**
|
|
1257
|
+
* A Claude account or an Anthropic API key for one of Claude Code's requests, or an Anthropic API key for one of
|
|
1258
|
+
* Flex's, chosen as `acquire` chooses: the pinned session account if it is still eligible, else the least busy account
|
|
1259
|
+
* with the most headroom whose current reading shows it available -- every counted window under its threshold, no
|
|
1260
|
+
* provider retry ahead -- with no cooldown after a provider 429, and which lists the model. A key is judged on its
|
|
1261
|
+
* month's spend (`keyLimits`): at its spend limit it takes no request until the month ends, as an account at its limit,
|
|
1262
|
+
* and a session on it moves; with a limit and no readable spend it is refused (`spend_unread`). A pool that names no
|
|
1263
|
+
* credential places on its Claude accounts first and on its keys only when no Claude account can take the request, for
|
|
1264
|
+
* whatever reason (`inferenceCredentialTiers`).
|
|
796
1265
|
* `ignoreLimits` serves a request that uses no quota (`count_tokens`) on an account at its limit as well. A pinned
|
|
797
1266
|
* account that takes no request for a reason of its own -- no usage reading, no model list, no access, or no such
|
|
798
1267
|
* model -- is refused naming the account and the reason (`InferenceRoutingError.reason`). An unpinned request whose
|
|
799
|
-
* chosen account's access fails goes to the next candidate.
|
|
1268
|
+
* chosen account's access fails goes to the next candidate. `returnToBetterTier`: a session pinned to a key goes back
|
|
1269
|
+
* to a Claude account as soon as one can take its request, and the route says so (`returned`).
|
|
800
1270
|
*
|
|
801
|
-
*
|
|
802
|
-
*
|
|
803
|
-
*
|
|
804
|
-
*
|
|
805
|
-
*
|
|
1271
|
+
* An account held with a payment problem -- Anthropic answered a request on it with a billing error (HTTP 402), or on
|
|
1272
|
+
* a key with its organization's spend cap (HTTP 429 `enforced_spend_limit_reached`), as its usage reading says or this
|
|
1273
|
+
* proxy saw (`reportPaymentProblem`) -- takes no request, `count_tokens` included, and is refused for the reason
|
|
1274
|
+
* `payment_problem`. So is an account of `exclude` that `excludedBecause` names with a payment problem: the request
|
|
1275
|
+
* left it for one. Neither counts as at its limit: when such accounts are all that is left the refusal is a 402
|
|
1276
|
+
* `payment_problem` naming them, and while another account is merely at its limit the 429 stands. Any other account
|
|
1277
|
+
* of `exclude` that `excludedBecause` names counts as its reason counts on the account's own judgement: a key whose
|
|
1278
|
+
* spend could not be read is named in the 503, an account without the model leads to the 404, and every other reason
|
|
1279
|
+
* to the 503 for want of an account -- never to the 429 of accounts at their limits.
|
|
806
1280
|
*/
|
|
807
1281
|
async acquireClaude(modelIdArg, policyArg, signalArg, optionsArg = {}) {
|
|
808
1282
|
if (policyArg.provider !== 'anthropic')
|
|
809
1283
|
throw new Error('A Claude route belongs to a Claude pool.');
|
|
810
|
-
const
|
|
811
|
-
let exhausted = false;
|
|
812
|
-
let reserved = false;
|
|
813
|
-
let modelKnown = false;
|
|
814
|
-
let unavailable = false;
|
|
815
|
-
let earliestReset = Infinity;
|
|
816
|
-
let accountLimit;
|
|
817
|
-
/** Why the last account judged takes no request though no limit says so: a pinned refusal names it. */
|
|
818
|
-
let refusal;
|
|
819
|
-
const exhaustedPlans = new Set();
|
|
820
|
-
const payment = [];
|
|
821
|
-
const { accounts } = await this.sessionPool(policyArg, signalArg, optionsArg.accountId);
|
|
1284
|
+
const { accounts, tiers } = await this.sessionPool(policyArg, signalArg, optionsArg.accountId);
|
|
822
1285
|
if (policyArg.credential === 'api_key' && !accounts.length)
|
|
823
1286
|
throw new InferenceRoutingError(503, 'no_eligible_accounts', 'No Anthropic API key is added, and this pool runs on API keys alone, never on a Claude sign-in. Add one with '
|
|
824
1287
|
+ '`authswitch account add anthropic-api-key`.');
|
|
825
|
-
|
|
1288
|
+
const pinned = accounts.find((account) => account.id === optionsArg.accountId);
|
|
1289
|
+
if (pinned && optionsArg.returnToBetterTier && !optionsArg.ignoreLimits) {
|
|
1290
|
+
// The session's account is of a later tier: an account of a better one that can take the request takes it, as a
|
|
1291
|
+
// new session would be placed. When none can, the session stays where it is, judged as before.
|
|
1292
|
+
const better = accounts.filter((account) => tiers.indexOf(account.credential) < tiers.indexOf(pinned.credential));
|
|
1293
|
+
if (better.length) {
|
|
1294
|
+
try {
|
|
1295
|
+
const route = await this.routeClaude(modelIdArg, policyArg, better, tiers, signalArg, {
|
|
1296
|
+
...(optionsArg.exclude ? { exclude: optionsArg.exclude } : {}),
|
|
1297
|
+
...(optionsArg.excludedBecause ? { excludedBecause: optionsArg.excludedBecause } : {}),
|
|
1298
|
+
...(optionsArg.unpriced === undefined ? {} : { unpriced: optionsArg.unpriced })
|
|
1299
|
+
});
|
|
1300
|
+
return { ...route, returned: true };
|
|
1301
|
+
}
|
|
1302
|
+
catch (errorArg) {
|
|
1303
|
+
signalArg.throwIfAborted();
|
|
1304
|
+
if (!(errorArg instanceof InferenceRoutingError))
|
|
1305
|
+
throw errorArg;
|
|
1306
|
+
}
|
|
1307
|
+
}
|
|
1308
|
+
}
|
|
1309
|
+
return this.routeClaude(modelIdArg, policyArg, accounts, tiers, signalArg, optionsArg);
|
|
1310
|
+
}
|
|
1311
|
+
/** `acquireClaude` among `accountsArg`, the pool's accounts or those of its better tiers. */
|
|
1312
|
+
async routeClaude(modelIdArg, policyArg, accountsArg, tiersArg, signalArg, optionsArg) {
|
|
1313
|
+
const candidates = [];
|
|
1314
|
+
const selectionState = emptySelection(accountsArg.length, optionsArg.accountId !== undefined);
|
|
1315
|
+
/** Why the last account judged takes no request though no limit says so: a pinned refusal names it. */
|
|
1316
|
+
let refusal;
|
|
1317
|
+
for (const account of accountsArg) {
|
|
826
1318
|
signalArg.throwIfAborted();
|
|
827
1319
|
if (optionsArg.accountId && optionsArg.accountId !== account.id)
|
|
828
1320
|
continue;
|
|
829
1321
|
if (optionsArg.exclude?.has(account.id)) {
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
continue;
|
|
833
|
-
}
|
|
834
|
-
exhausted = true;
|
|
835
|
-
const reset = this.cooldowns.get(account.id)?.until ?? 0;
|
|
836
|
-
if (reset > this.now())
|
|
837
|
-
earliestReset = Math.min(earliestReset, reset);
|
|
1322
|
+
// An account left for a reason of its own counts as that reason counts on its own judgement.
|
|
1323
|
+
this.countLeft(selectionState, account, optionsArg.excludedBecause?.get(account.id));
|
|
838
1324
|
continue;
|
|
839
1325
|
}
|
|
840
1326
|
try {
|
|
841
1327
|
// A usage read the account service did not answer leaves the account as unread as a reading it cannot route on.
|
|
842
|
-
|
|
1328
|
+
// A key's usage is its month's spend, with the payment problem the account service holds on it.
|
|
1329
|
+
const usage = await this.options.usage(account.id, signalArg)
|
|
843
1330
|
.catch(() => { signalArg.throwIfAborted(); return undefined; });
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
if (!limits) {
|
|
856
|
-
unavailable = true;
|
|
857
|
-
refusal = { reason: 'usage_unread', retryAt: usage?.nextAttemptAt ?? null };
|
|
858
|
-
this.noteAccount(account.id, refusal);
|
|
859
|
-
continue;
|
|
860
|
-
}
|
|
861
|
-
if (this.noted.get(account.id)?.unavailable.reason === 'usage_unread')
|
|
862
|
-
this.noteAccount(account.id, null);
|
|
863
|
-
if (policyArg.plans && !policyArg.plans.includes(limits.plan))
|
|
864
|
-
continue;
|
|
865
|
-
// Limits and cool-down are judged before any model list is read: an account that cannot take the request now
|
|
866
|
-
// is never read for it. Its last model list, if one is held, says whether it would serve the model; without
|
|
867
|
-
// one it counts as limited, so a session on it moves rather than waiting for a list.
|
|
868
|
-
const cooldown = cooldownUntil(this.cooldowns.get(account.id), usage);
|
|
869
|
-
if (!optionsArg.ignoreLimits && (limits.state !== 'available' || cooldown > this.now())) {
|
|
870
|
-
const held = this.heldClaudeCatalog(account);
|
|
871
|
-
if (held && !held.some((entry) => entry.modelId === modelIdArg)) {
|
|
872
|
-
refusal = { reason: 'model_missing' };
|
|
873
|
-
continue;
|
|
874
|
-
}
|
|
875
|
-
if (held)
|
|
876
|
-
modelKnown = true;
|
|
877
|
-
exhausted = true;
|
|
878
|
-
reserved ||= limits.state === 'reserved';
|
|
879
|
-
accountLimit = limits.state === 'available' ? 'cooling' : limits.state;
|
|
880
|
-
exhaustedPlans.add(limits.plan);
|
|
881
|
-
const reset = Math.max(cooldown, limits.resetAt ?? 0);
|
|
882
|
-
if (reset > this.now())
|
|
883
|
-
earliestReset = Math.min(earliestReset, reset);
|
|
884
|
-
continue;
|
|
885
|
-
}
|
|
886
|
-
const model = (await this.claudeCatalog(account, signalArg)).find((entry) => entry.modelId === modelIdArg);
|
|
887
|
-
if (!model) {
|
|
888
|
-
refusal = { reason: 'model_missing' };
|
|
1331
|
+
const apiKey = account.credential === 'api_key';
|
|
1332
|
+
const judged = await this.judgeListed(selectionState, account, usage, apiKey ? keyLimits(usage, account, this.now())
|
|
1333
|
+
: usage ? claudeLimits(usage, account, this.now()) : undefined, {
|
|
1334
|
+
modelId: modelIdArg, lists: this.claudeCatalogs, read: (accountArg, innerSignalArg) => this.claudeCatalog(accountArg, innerSignalArg),
|
|
1335
|
+
...(policyArg.plans ? { plans: policyArg.plans } : {}),
|
|
1336
|
+
...(optionsArg.unpriced === undefined ? {} : { unpriced: optionsArg.unpriced }),
|
|
1337
|
+
...(optionsArg.ignoreLimits ? { ignoreLimits: true } : {})
|
|
1338
|
+
}, signalArg);
|
|
1339
|
+
if (judged?.kind !== 'candidate') {
|
|
1340
|
+
if (judged)
|
|
1341
|
+
refusal = judged.unavailable;
|
|
889
1342
|
continue;
|
|
890
1343
|
}
|
|
891
|
-
|
|
892
|
-
// A reading the router does not route on (`usage_unavailable`), and a key's
|
|
1344
|
+
const { model, limits, spendLimit } = judged;
|
|
1345
|
+
// A reading the router does not route on (`usage_unavailable`), and a key's without a spend reading, score nothing.
|
|
893
1346
|
const placement = accountPlacement(limits.limit ? usage.reading : null, account, this.now());
|
|
894
|
-
candidates.push({ account,
|
|
895
|
-
|
|
896
|
-
|
|
1347
|
+
candidates.push({ account, tier: tiersArg.indexOf(account.credential), model,
|
|
1348
|
+
reading: apiKey ? (limits.limit ? usage.reading : null) : usage?.reading ?? null,
|
|
1349
|
+
ignoreLimits: optionsArg.ignoreLimits === true, plan: limits.plan, headroom: limits.headroom,
|
|
1350
|
+
score: placement.score, lastResort: placement.eligibility === 'last_resort', spendLimit });
|
|
897
1351
|
}
|
|
898
1352
|
catch (errorArg) {
|
|
899
1353
|
signalArg.throwIfAborted();
|
|
900
|
-
unavailable = true;
|
|
901
|
-
if (errorArg instanceof
|
|
1354
|
+
selectionState.unavailable = true;
|
|
1355
|
+
if (errorArg instanceof ModelListError)
|
|
902
1356
|
refusal = errorArg.unavailable;
|
|
903
1357
|
}
|
|
904
1358
|
}
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
1359
|
+
if (optionsArg.accountId !== undefined && refusal) {
|
|
1360
|
+
selectionState.refusal = { accountId: optionsArg.accountId, unavailable: refusal };
|
|
1361
|
+
}
|
|
908
1362
|
// The chosen account's access is resolved before anything is sent. One that fails takes no request, as a failed
|
|
909
1363
|
// access found reading its model list does: it is recorded and noted for the account, and the request goes to the
|
|
910
1364
|
// next candidate -- a pinned request has none, so it is refused naming the account and the reason.
|
|
@@ -922,7 +1376,7 @@ export class InferenceRouter {
|
|
|
922
1376
|
release();
|
|
923
1377
|
signalArg.throwIfAborted();
|
|
924
1378
|
const failure = { reason: needsSignIn(errorArg) ? 'needs_login' : 'access_failed' };
|
|
925
|
-
this.
|
|
1379
|
+
this.holdListFailure(this.claudeCatalogs, selected.account, failure);
|
|
926
1380
|
candidates.splice(candidates.indexOf(selected), 1);
|
|
927
1381
|
selectionState.unavailable = true;
|
|
928
1382
|
if (selectionState.pinned)
|
|
@@ -955,7 +1409,8 @@ export class InferenceRouter {
|
|
|
955
1409
|
...(this.options.providerFetch ? { fetch: this.options.providerFetch } : {}),
|
|
956
1410
|
});
|
|
957
1411
|
return { provider: 'anthropic', credential, accountId: id, plan: selected.plan, score: selected.score,
|
|
958
|
-
model: selected.model, connection,
|
|
1412
|
+
model: selected.model, connection, returned: false, loginId: selected.account.loginId, spendLimit: selected.spendLimit,
|
|
1413
|
+
release };
|
|
959
1414
|
}
|
|
960
1415
|
catch (errorArg) {
|
|
961
1416
|
release();
|
|
@@ -978,9 +1433,9 @@ export class InferenceRouter {
|
|
|
978
1433
|
}
|
|
979
1434
|
}
|
|
980
1435
|
/**
|
|
981
|
-
* The candidate a request goes to
|
|
982
|
-
* none. A pinned request has its session's
|
|
983
|
-
* An account at its reserve is refused like one at its limit, and the refusal names the reserve. A pinned account
|
|
1436
|
+
* The candidate a request goes to -- of the best credential tier, then by the placement order
|
|
1437
|
+
* (`authSwitchPlacementOrder`) -- or the refusal that says why there is none. A pinned request has its session's
|
|
1438
|
+
* account as its one candidate, so the order only ever places new sessions. An account at its reserve is refused like one at its limit, and the refusal names the reserve. A pinned account
|
|
984
1439
|
* that takes no request for a reason of its own (`refusal`) is refused with that account and reason.
|
|
985
1440
|
*/
|
|
986
1441
|
select(candidatesArg, stateArg) {
|
|
@@ -1004,46 +1459,62 @@ export class InferenceRouter {
|
|
|
1004
1459
|
candidate.score = placement.score;
|
|
1005
1460
|
return true;
|
|
1006
1461
|
});
|
|
1462
|
+
// The best credential tier first, then the placement order within it.
|
|
1007
1463
|
const order = plugins.authswitchPlacement.authSwitchPlacementOrder((accountIdArg) => this.active.get(accountIdArg) ?? 0);
|
|
1008
|
-
candidatesArg.sort((left, right) => order({ id: left.account.id, score: left.score,
|
|
1009
|
-
headroom: left.headroom }, { id: right.account.id, score: right.score,
|
|
1010
|
-
headroom: right.headroom }));
|
|
1464
|
+
candidatesArg.sort((left, right) => left.tier - right.tier || order({ id: left.account.id, score: left.score,
|
|
1465
|
+
lastResort: left.lastResort, headroom: left.headroom }, { id: right.account.id, score: right.score,
|
|
1466
|
+
lastResort: right.lastResort, headroom: right.headroom }));
|
|
1011
1467
|
const selected = candidatesArg[0];
|
|
1012
1468
|
if (selected)
|
|
1013
1469
|
return selected;
|
|
1470
|
+
// A refusal names the API keys held by their spend limit, and those with a limit whose spend could not be read.
|
|
1471
|
+
const named = (messageArg, sentenceArg) => sentenceArg ? `${messageArg} ${sentenceArg}` : messageArg;
|
|
1014
1472
|
if (stateArg.exhausted)
|
|
1015
|
-
throw new InferenceRoutingError(429, 'accounts_exhausted', stateArg.pinned
|
|
1473
|
+
throw new InferenceRoutingError(429, 'accounts_exhausted', named(stateArg.pinned
|
|
1016
1474
|
? `The account that owns this conversation state is at its ${stateArg.reserved ? 'reserve' : 'limit'}.`
|
|
1017
|
-
: `All eligible accounts are at their limits${stateArg.reserved ? ' or their reserve' : ''}.`, Number.isFinite(stateArg.earliestReset) ? Math.max(1, Math.ceil((stateArg.earliestReset - this.now()) / 1000)) : undefined, [...stateArg.exhaustedPlans], stateArg.pinned ? stateArg.accountLimit : undefined);
|
|
1475
|
+
: `All eligible accounts are at their limits${stateArg.reserved ? ' or their reserve' : ''}.`, inferenceSpendLimitText(stateArg.spendLimited)), Number.isFinite(stateArg.earliestReset) ? Math.max(1, Math.ceil((stateArg.earliestReset - this.now()) / 1000)) : undefined, [...stateArg.exhaustedPlans], stateArg.pinned ? stateArg.accountLimit : undefined, undefined, undefined, stateArg.spendLimited);
|
|
1018
1476
|
if (stateArg.pinned && stateArg.refusal) {
|
|
1019
1477
|
const { accountId, unavailable } = stateArg.refusal;
|
|
1020
|
-
throw new InferenceRoutingError(503, 'no_eligible_accounts', `The account that owns this conversation state (${accountId}) takes no request: ${unavailableText(unavailable)}.`, undefined, [], undefined, accountId, unavailable
|
|
1478
|
+
throw new InferenceRoutingError(503, 'no_eligible_accounts', `The account that owns this conversation state (${accountId}) takes no request: ${unavailableText(unavailable)}.`, undefined, [], undefined, accountId, unavailable);
|
|
1021
1479
|
}
|
|
1022
1480
|
if (stateArg.payment.length && !stateArg.unavailable) {
|
|
1023
|
-
throw new InferenceRoutingError(402, 'payment_problem',
|
|
1024
|
-
+ ` Claude ${stateArg.payment.length === 1 ? 'account' : 'accounts'} ${stateArg.payment.join(', ')}: a payment`
|
|
1025
|
-
+ ' problem with the subscription. Settle the billing, then re-check the account in AGL Accounts or with'
|
|
1026
|
-
+ ' `authswitch account recheck <account-id>`.');
|
|
1481
|
+
throw new InferenceRoutingError(402, 'payment_problem', paymentRefusalText(stateArg.payment));
|
|
1027
1482
|
}
|
|
1483
|
+
if (stateArg.unpriced.labels.length && !stateArg.unavailable) {
|
|
1484
|
+
const keys = [...new Set(stateArg.unpriced.labels)];
|
|
1485
|
+
throw new InferenceRoutingError(400, 'model_unpriced', `The API ${keys.length === 1 ? 'key' : 'keys'} ${keys.join(', ')} `
|
|
1486
|
+
+ `${keys.length === 1 ? 'has' : 'have'} a monthly spend limit set in AGL, and AGL's price table has no price for `
|
|
1487
|
+
+ `${stateArg.unpriced.what ?? 'this request'}, so the cost of the answer could not be counted against the limit. `
|
|
1488
|
+
+ 'Send it with a model, service tier, speed and tools the price table prices, or remove the spend limit in AGL '
|
|
1489
|
+
+ 'Accounts.');
|
|
1490
|
+
}
|
|
1491
|
+
const keysNamed = (labelsArg, whatArg) => labelsArg.length
|
|
1492
|
+
? `The spend of the API ${labelsArg.length === 1 ? 'key' : 'keys'} ${labelsArg.join(', ')} ${whatArg}, and AGL `
|
|
1493
|
+
+ 'places nothing on a key with a monthly spend limit until it can.' : '';
|
|
1028
1494
|
if (!stateArg.accounts || stateArg.unavailable || stateArg.pinned)
|
|
1029
|
-
throw new InferenceRoutingError(503, 'no_eligible_accounts', 'No eligible account has current usage, an available sign-in, and access to the requested model.')
|
|
1495
|
+
throw new InferenceRoutingError(503, 'no_eligible_accounts', named('No eligible account has current usage, an available sign-in, and access to the requested model.', [keysNamed(stateArg.spendUnread, 'could not be read'),
|
|
1496
|
+
keysNamed(stateArg.spendUnrecorded, 'could not be recorded')]
|
|
1497
|
+
.filter(Boolean).join(' ')));
|
|
1030
1498
|
throw new InferenceRoutingError(404, 'model_not_available', stateArg.modelKnown
|
|
1031
1499
|
? 'No eligible account supports the requested model options.' : 'The requested model is not available to this account pool.');
|
|
1032
1500
|
}
|
|
1033
1501
|
/**
|
|
1034
1502
|
* The accounts as `agl proxy status` shows them: each judged as placement would judge it on the reading `heldArg`
|
|
1035
|
-
* answers for it, which the caller read beforehand -- an
|
|
1503
|
+
* answers for it, which the caller read beforehand -- an API key on its month's spend (`keyLimits`), in dollars -- with
|
|
1036
1504
|
* its cooldown, the requests it serves now, its lifecycle and where a new session of an unrestricted client of its
|
|
1037
|
-
*
|
|
1505
|
+
* provider would go (`placementRank`): a client that names no credential, so a provider's subscriptions rank before its
|
|
1506
|
+
* keys (`inferenceCredentialTiers`).
|
|
1038
1507
|
*/
|
|
1039
1508
|
accountStatus(accountsArg, heldArg) {
|
|
1040
1509
|
const now = this.now();
|
|
1041
1510
|
const statuses = accountsArg.map((account) => {
|
|
1042
1511
|
const apiKey = account.credential === 'api_key';
|
|
1043
|
-
|
|
1044
|
-
const
|
|
1512
|
+
// A key's usage is its month's spend, with the payment problem the account service holds on it.
|
|
1513
|
+
const held = heldArg(account.id);
|
|
1514
|
+
const limits = apiKey ? keyLimits(held, account, now)
|
|
1045
1515
|
: held ? (account.providerId === 'anthropic' ? claudeLimits : chatGptLimits)(held, account, now) : undefined;
|
|
1046
|
-
|
|
1516
|
+
// A key's spend reading says nothing of the provider's rate limits, so only its own end ends a key's cool-down.
|
|
1517
|
+
const cooldown = cooldownUntil(this.cooldowns.get(account.id), apiKey ? undefined : held);
|
|
1047
1518
|
const placement = accountPlacement(limits?.limit ? held.reading : null, account, now);
|
|
1048
1519
|
const base = { id: account.id, label: account.label, provider: account.providerId, credential: account.credential,
|
|
1049
1520
|
maxUsagePercent: account.maxUsagePercent, reserveLiftUntil: account.reserveLiftUntil, inFlight: this.active.get(account.id) ?? 0,
|
|
@@ -1056,39 +1527,43 @@ export class InferenceRouter {
|
|
|
1056
1527
|
.some((windowArg) => windowArg.estimatedUsedPercent !== null),
|
|
1057
1528
|
lastReadRateLimited: held?.lastReadError?.rateLimited ?? false };
|
|
1058
1529
|
// A payment problem refuses the account whatever its reading says, as a request finds it.
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
return { ...base, state: 'unavailable', stateText: `unavailable (${unavailableText(
|
|
1530
|
+
const unpaid = this.paymentProblem(account.id, held);
|
|
1531
|
+
if (unpaid) {
|
|
1532
|
+
return { ...base, state: 'unavailable', stateText: `unavailable (${unavailableText(unpaid)})`, unavailable: unpaid,
|
|
1062
1533
|
plan: limits?.plan || null, headroom: null, crossing: [], resetAt: null };
|
|
1063
1534
|
}
|
|
1064
|
-
|
|
1065
|
-
|
|
1535
|
+
const unrecorded = apiKey && limits && keyHasSpendLimit(held, account) && this.options.spend?.held(account.id) === true;
|
|
1536
|
+
if (!limits || unrecorded) {
|
|
1537
|
+
const unavailable = unrecorded ? { reason: 'spend_unrecorded' }
|
|
1538
|
+
: apiKey ? { reason: 'spend_unread' } : { reason: 'usage_unread', retryAt: held?.nextAttemptAt ?? null };
|
|
1066
1539
|
return { ...base, state: 'unavailable', stateText: `unavailable (${unavailableText(unavailable)})`, unavailable,
|
|
1067
1540
|
plan: null, headroom: null, crossing: [], resetAt: null };
|
|
1068
1541
|
}
|
|
1069
1542
|
// An account whose model list a request could not read takes no request until it is read again; one at its limit
|
|
1070
1543
|
// or cooling down is judged on that alone, as a request judges it.
|
|
1071
|
-
const refusal =
|
|
1544
|
+
const refusal = this.listRefusal(account);
|
|
1072
1545
|
const state = limits.state === 'available' && cooldown > now ? 'cooling'
|
|
1073
1546
|
: limits.state === 'available' && refusal ? 'unavailable' : limits.state;
|
|
1074
1547
|
return { ...base, state, ...(state === 'unavailable' && refusal ? { unavailable: refusal } : {}),
|
|
1075
1548
|
stateText: placement.lifecycle === 'lapsed' ? 'lapsed (its subscription ended; never routed to again)'
|
|
1076
1549
|
: state === 'cooling' ? 'cooling down after a provider 429'
|
|
1077
1550
|
: state === 'unavailable' && refusal ? `unavailable (${unavailableText(refusal)})`
|
|
1078
|
-
:
|
|
1079
|
-
:
|
|
1551
|
+
: apiKey ? keyStateText(limits, held, now)
|
|
1552
|
+
: limits.limit ? plugins.authswitchUsageLimit.authSwitchUsageLimitText(limits.limit)
|
|
1553
|
+
: 'available (no usage reported)',
|
|
1080
1554
|
plan: limits.plan || null, headroom: limits.limit?.headroom ?? null, crossing: limits.limit?.crossing ?? [],
|
|
1081
1555
|
resetAt: state === 'cooling' ? new Date(cooldown).toISOString() : limits.limit?.resetAt ?? null };
|
|
1082
1556
|
});
|
|
1083
|
-
// Each
|
|
1557
|
+
// Each provider's accounts that take a new session now, in the order placement takes them: the best credential tier
|
|
1558
|
+
// first.
|
|
1084
1559
|
const order = plugins.authswitchPlacement.authSwitchPlacementOrder((accountIdArg) => this.active.get(accountIdArg) ?? 0);
|
|
1085
|
-
const
|
|
1086
|
-
for (const
|
|
1087
|
-
statuses.filter((statusArg) =>
|
|
1560
|
+
const tiers = inferenceCredentialTiers(undefined);
|
|
1561
|
+
for (const provider of new Set(statuses.map((statusArg) => statusArg.provider))) {
|
|
1562
|
+
statuses.filter((statusArg) => statusArg.provider === provider && statusArg.state === 'available'
|
|
1088
1563
|
&& statusArg.lifecycle !== 'lapsed')
|
|
1089
|
-
.map((statusArg) => ({ status: statusArg, rank: { id: statusArg.id,
|
|
1090
|
-
lastResort: statusArg.lastResort, headroom: statusArg.headroom ?? unknownHeadroom } }))
|
|
1091
|
-
.sort((left, right) => order(left.rank, right.rank))
|
|
1564
|
+
.map((statusArg) => ({ status: statusArg, tier: tiers.indexOf(statusArg.credential), rank: { id: statusArg.id,
|
|
1565
|
+
score: statusArg.placementScore, lastResort: statusArg.lastResort, headroom: statusArg.headroom ?? unknownHeadroom } }))
|
|
1566
|
+
.sort((left, right) => left.tier - right.tier || order(left.rank, right.rank))
|
|
1092
1567
|
.forEach((entryArg, indexArg) => { entryArg.status.placementRank = indexArg + 1; });
|
|
1093
1568
|
}
|
|
1094
1569
|
return statuses;
|
|
@@ -1121,23 +1596,26 @@ export class InferenceRouter {
|
|
|
1121
1596
|
this.options.observe(accountIdArg, observation);
|
|
1122
1597
|
}
|
|
1123
1598
|
/**
|
|
1124
|
-
*
|
|
1125
|
-
*
|
|
1126
|
-
* account's usage carries it, and that decides from then on
|
|
1127
|
-
*
|
|
1128
|
-
*
|
|
1599
|
+
* A provider refused a request on the account for a payment problem (`TInferencePaymentCause`): the account is out of
|
|
1600
|
+
* rotation at once, and the refusal it now carries is answered. The problem is reported to the account service
|
|
1601
|
+
* (`reportPaymentProblem`); once it holds the problem the account's usage carries it, and that decides from then on --
|
|
1602
|
+
* until a re-check clears it, or a spend cap's month ends -- so the router's own mark is dropped. When the service
|
|
1603
|
+
* cannot be told -- it is not running, or an older release that does not know the report or the account's kind --
|
|
1604
|
+
* the mark holds, a spend cap until 00:00 UTC on the first day of the next month (`authSwitchSpendPeriod`), anything
|
|
1605
|
+
* else for as long as the proxy runs, and the failure is reported once.
|
|
1129
1606
|
*/
|
|
1130
|
-
reportPaymentProblem(accountIdArg) {
|
|
1131
|
-
if (this.apiKeyAccounts.has(accountIdArg))
|
|
1132
|
-
return;
|
|
1607
|
+
reportPaymentProblem(accountIdArg, causeArg) {
|
|
1133
1608
|
const at = this.now();
|
|
1134
|
-
|
|
1135
|
-
|
|
1609
|
+
const mark = { at, cause: causeArg,
|
|
1610
|
+
until: causeArg === 'spend_cap' ? Date.parse(plugins.authswitchSpend.authSwitchSpendPeriod(at).end) : null };
|
|
1611
|
+
this.paymentMarks.set(accountIdArg, mark);
|
|
1612
|
+
const unavailable = paymentUnavailable(mark);
|
|
1613
|
+
this.noteAccount(accountIdArg, unavailable);
|
|
1136
1614
|
const report = this.options.reportPaymentProblem;
|
|
1137
1615
|
if (!report)
|
|
1138
|
-
return;
|
|
1139
|
-
void (async () => report(accountIdArg, new Date(at).toISOString()))().then(() => {
|
|
1140
|
-
if (this.paymentMarks.get(accountIdArg) ===
|
|
1616
|
+
return unavailable;
|
|
1617
|
+
void (async () => report(accountIdArg, new Date(at).toISOString(), causeArg))().then(() => {
|
|
1618
|
+
if (this.paymentMarks.get(accountIdArg) === mark)
|
|
1141
1619
|
this.paymentMarks.delete(accountIdArg);
|
|
1142
1620
|
}, (errorArg) => {
|
|
1143
1621
|
if (this.paymentReportsFailed.has(accountIdArg))
|
|
@@ -1151,10 +1629,24 @@ export class InferenceRouter {
|
|
|
1151
1629
|
}
|
|
1152
1630
|
catch { }
|
|
1153
1631
|
});
|
|
1632
|
+
return unavailable;
|
|
1154
1633
|
}
|
|
1155
|
-
/**
|
|
1156
|
-
|
|
1157
|
-
|
|
1634
|
+
/**
|
|
1635
|
+
* The payment problem an account is held with, as a refusal: by this proxy's own mark while it holds -- a spend cap's
|
|
1636
|
+
* ends at its time -- or by the account's usage reading, which carries it once the account service holds it, with its
|
|
1637
|
+
* cause (absent: `billing`) and, for a spend cap, when it ends; one whose spend cap ended holds nothing
|
|
1638
|
+
* (`authSwitchPaymentProblemHeld`, the rule the account service holds it by).
|
|
1639
|
+
*/
|
|
1640
|
+
paymentProblem(accountIdArg, usageArg) {
|
|
1641
|
+
const now = this.now();
|
|
1642
|
+
const mark = this.paymentMarks.get(accountIdArg);
|
|
1643
|
+
if (mark && (mark.until === null || mark.until > now))
|
|
1644
|
+
return paymentUnavailable(mark);
|
|
1645
|
+
if (mark)
|
|
1646
|
+
this.paymentMarks.delete(accountIdArg);
|
|
1647
|
+
const held = usageArg?.paymentProblem;
|
|
1648
|
+
return held === undefined || !plugins.authswitchSubscription.authSwitchPaymentProblemHeld(held, now) ? undefined
|
|
1649
|
+
: { reason: 'payment_problem', cause: held.cause ?? 'billing', ...(held.until === undefined ? {} : { retryAt: held.until }) };
|
|
1158
1650
|
}
|
|
1159
1651
|
/** A provider answer's `Retry-After`, in seconds from now, in either of its forms. */
|
|
1160
1652
|
retryAfterSeconds(headersArg) {
|
|
@@ -1169,11 +1661,26 @@ export class InferenceRouter {
|
|
|
1169
1661
|
return;
|
|
1170
1662
|
this.options.tokens?.(accountIdArg, usageArg);
|
|
1171
1663
|
}
|
|
1664
|
+
/**
|
|
1665
|
+
* Takes the spend of an answer an API key served on the login `loginIdArg` (`inferenceAnthropicSpend`): it counts
|
|
1666
|
+
* against the key's limit from now on and is reported to the account service (`spend`).
|
|
1667
|
+
*/
|
|
1668
|
+
recordSpend(accountIdArg, loginIdArg, recordArg) {
|
|
1669
|
+
this.options.spend?.record(accountIdArg, loginIdArg, recordArg);
|
|
1670
|
+
}
|
|
1671
|
+
/**
|
|
1672
|
+
* Says that an answer an API key served ended before its provider stated its usage, so nothing of it counts against
|
|
1673
|
+
* the key's limit (`IInferenceSpendLedger.uncounted`).
|
|
1674
|
+
*/
|
|
1675
|
+
uncountedSpend(accountIdArg, modelArg) {
|
|
1676
|
+
this.options.spend?.uncounted(accountIdArg, modelArg);
|
|
1677
|
+
}
|
|
1172
1678
|
/**
|
|
1173
1679
|
* A provider 429 on the account. Only a definitive pre-stream refusal permits another account to be tried. The
|
|
1174
1680
|
* account cools down for the provider's `Retry-After`, at most a day; without one, or with one already due, for 60
|
|
1175
1681
|
* seconds or until the account service holds a usage read made after the 429 (see `cooldownUntil`), which the 429
|
|
1176
|
-
* asks it to make at once. An API key, whose
|
|
1682
|
+
* asks it to make at once. An API key, whose spend reading says nothing of the provider's rate limits, cools down
|
|
1683
|
+
* the 60 seconds.
|
|
1177
1684
|
*/
|
|
1178
1685
|
reportQuota(accountIdArg, retryAfterSecondsArg) {
|
|
1179
1686
|
const explicit = Number.isFinite(retryAfterSecondsArg) && retryAfterSecondsArg > 0;
|
|
@@ -1184,4 +1691,4 @@ export class InferenceRouter {
|
|
|
1184
1691
|
this.options.rateLimited?.(accountIdArg);
|
|
1185
1692
|
}
|
|
1186
1693
|
}
|
|
1187
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pbmZlcmVuY2Vyb3V0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jbGFzc2VzLmluZmVyZW5jZXJvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUd4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQU0zRCxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDNUcsTUFBTSxXQUFXLEdBQUcsaUNBQWlDLENBQUM7QUFDdEQsTUFBTSxhQUFhLEdBQUcsbURBQW1ELENBQUM7QUFDMUUsTUFBTSxZQUFZLEdBQUcsNEJBQTRCLENBQUM7QUFDbEQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLFdBQVcsY0FBYyxhQUFhLGFBQWEsWUFBWSxPQUFPLENBQUMsQ0FBQztBQUNqSCxNQUFNLGlCQUFpQixHQUFHLElBQUksTUFBTSxDQUNsQywyRUFBMkUsYUFBYSxhQUFhLFlBQVksT0FBTyxDQUFDLENBQUM7QUFDNUgsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLFdBQVcsSUFBSSxhQUFhLGtCQUFrQixZQUFZLFlBQVksQ0FBQyxDQUFDO0FBRWxIOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxRQUFnQixFQUFFLE1BQWMsRUFBc0IsRUFBRTtJQUNwRixNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FB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
|
|
1694
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pbmZlcmVuY2Vyb3V0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jbGFzc2VzLmluZmVyZW5jZXJvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUd4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQU8zRCxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDNUcsTUFBTSxXQUFXLEdBQUcsaUNBQWlDLENBQUM7QUFDdEQsTUFBTSxhQUFhLEdBQUcsbURBQW1ELENBQUM7QUFDMUUsTUFBTSxZQUFZLEdBQUcsNEJBQTRCLENBQUM7QUFDbEQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLFdBQVcsY0FBYyxhQUFhLGFBQWEsWUFBWSxPQUFPLENBQUMsQ0FBQztBQUNqSCxNQUFNLGlCQUFpQixHQUFHLElBQUksTUFBTSxDQUNsQywyRUFBMkUsYUFBYSxhQUFhLFlBQVksT0FBTyxDQUFDLENBQUM7QUFDNUgsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLFdBQVcsSUFBSSxhQUFhLGtCQUFrQixZQUFZLFlBQVksQ0FBQyxDQUFDO0FBRWxIOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxRQUFnQixFQUFFLE1BQWMsRUFBc0IsRUFBRTtJQUNwRixNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FB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
|