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.
Files changed (149) hide show
  1. package/changelog.md +27 -0
  2. package/dist_serve/bundle.js +2228 -2177
  3. package/dist_serve/bundle.js.map +2 -2
  4. package/dist_ts/00_commitinfo_data.js +1 -1
  5. package/dist_ts/aglapi/aglapisurface.document.js +2 -2
  6. package/dist_ts/classes.accountsactions.d.ts +11 -1
  7. package/dist_ts/classes.accountsactions.js +59 -2
  8. package/dist_ts/classes.controller.js +5 -5
  9. package/dist_ts/classes.flexaccountaccess.js +3 -2
  10. package/dist_ts/classes.harnessreleases.d.ts +14 -4
  11. package/dist_ts/classes.harnessreleases.js +28 -4
  12. package/dist_ts/classes.inferencegateway.d.ts +28 -3
  13. package/dist_ts/classes.inferencegateway.js +177 -61
  14. package/dist_ts/classes.inferenceplacement.d.ts +5 -3
  15. package/dist_ts/classes.inferenceplacement.js +2 -2
  16. package/dist_ts/classes.inferencerouter.d.ts +349 -91
  17. package/dist_ts/classes.inferencerouter.js +804 -297
  18. package/dist_ts/classes.inferenceservice.d.ts +14 -2
  19. package/dist_ts/classes.inferenceservice.js +53 -14
  20. package/dist_ts/classes.inferencespend.d.ts +339 -0
  21. package/dist_ts/classes.inferencespend.js +815 -0
  22. package/dist_ts/classes.inferenceusagecache.d.ts +8 -0
  23. package/dist_ts/classes.inferenceusagecache.js +9 -5
  24. package/dist_ts/classes.inferenceusagetap.d.ts +50 -9
  25. package/dist_ts/classes.inferenceusagetap.js +185 -31
  26. package/dist_ts/classes.proxycontrol.d.ts +3 -2
  27. package/dist_ts/classes.proxycontrol.js +1 -2
  28. package/dist_ts/classes.proxydaemon.js +3 -2
  29. package/dist_ts/classes.proxystore.d.ts +6 -0
  30. package/dist_ts/classes.proxystore.js +11 -2
  31. package/dist_ts/fleet/classes.claudeworkers.d.ts +5 -4
  32. package/dist_ts/fleet/classes.claudeworkers.js +10 -9
  33. package/dist_ts/functions.claudecoderelease.d.ts +12 -6
  34. package/dist_ts/functions.claudecoderelease.js +13 -7
  35. package/dist_ts/functions.inferencecli.js +12 -8
  36. package/dist_ts/interfaces.auth.d.ts +1 -1
  37. package/dist_ts/interfaces.auth.js +3 -1
  38. package/dist_ts/plugins.d.ts +3 -1
  39. package/dist_ts/plugins.js +7 -2
  40. package/dist_ts_authswitch/authority-apikeys.d.ts +32 -0
  41. package/dist_ts_authswitch/authority-apikeys.js +65 -0
  42. package/dist_ts_authswitch/authority-contract.d.ts +142 -28
  43. package/dist_ts_authswitch/authority-contract.js +48 -1
  44. package/dist_ts_authswitch/authority-overview.js +8 -1
  45. package/dist_ts_authswitch/authority-placement.d.ts +7 -2
  46. package/dist_ts_authswitch/authority-placement.js +10 -3
  47. package/dist_ts_authswitch/authority-runtime-contract.d.ts +2 -2
  48. package/dist_ts_authswitch/authority-spend.d.ts +103 -0
  49. package/dist_ts_authswitch/authority-spend.js +110 -0
  50. package/dist_ts_authswitch/authority-subscription.d.ts +12 -1
  51. package/dist_ts_authswitch/authority-subscription.js +24 -1
  52. package/dist_ts_authswitch/authority-usagelimit.d.ts +7 -4
  53. package/dist_ts_authswitch/authority-usagelimit.js +89 -39
  54. package/dist_ts_authswitch/authority-usagewindows.d.ts +4 -1
  55. package/dist_ts_authswitch/authority-usagewindows.js +41 -16
  56. package/dist_ts_authswitch/classes.authoritybroker.d.ts +30 -19
  57. package/dist_ts_authswitch/classes.authoritybroker.js +152 -61
  58. package/dist_ts_authswitch/classes.authoritycli.d.ts +9 -4
  59. package/dist_ts_authswitch/classes.authoritycli.js +94 -29
  60. package/dist_ts_authswitch/classes.authorityclient.d.ts +24 -7
  61. package/dist_ts_authswitch/classes.authorityclient.js +31 -11
  62. package/dist_ts_authswitch/classes.authoritydaemon.js +39 -12
  63. package/dist_ts_authswitch/classes.authoritydatabase.d.ts +28 -5
  64. package/dist_ts_authswitch/classes.authoritydatabase.js +171 -9
  65. package/dist_ts_authswitch/classes.authorityimport.js +2 -2
  66. package/dist_ts_authswitch/classes.authoritymodels.d.ts +71 -3
  67. package/dist_ts_authswitch/classes.authoritymodels.js +249 -20
  68. package/dist_ts_authswitch/classes.authorityregistry.js +4 -2
  69. package/dist_ts_authswitch/classes.authorityusage.d.ts +69 -7
  70. package/dist_ts_authswitch/classes.authorityusage.js +118 -4
  71. package/dist_ts_authswitch/classes.claudenative.d.ts +16 -7
  72. package/dist_ts_authswitch/classes.claudenative.js +29 -16
  73. package/dist_ts_authswitch/classes.claudesignin.js +5 -2
  74. package/dist_ts_authswitch/testsupport.d.ts +24 -5
  75. package/dist_ts_authswitch/testsupport.js +56 -12
  76. package/dist_ts_authswitch/ts_migration/0011_account_api_key_fields.d.ts +12 -0
  77. package/dist_ts_authswitch/ts_migration/0011_account_api_key_fields.js +21 -0
  78. package/dist_ts_authswitch/ts_migration/index.js +3 -1
  79. package/dist_ts_interfaces/functions.authorityscope.d.ts +18 -7
  80. package/dist_ts_interfaces/functions.authorityscope.js +35 -8
  81. package/dist_ts_interfaces/interfaces.d.ts +1 -1
  82. package/dist_ts_interfaces/interfaces.js +1 -1
  83. package/dist_ts_interfaces/plugins.d.ts +2 -1
  84. package/dist_ts_interfaces/plugins.js +7 -4
  85. package/dist_ts_interfaces/requests.accounts.d.ts +56 -0
  86. package/dist_ts_interfaces/requests.accounts.js +11 -1
  87. package/dist_ts_interfaces/requests.d.ts +2 -2
  88. package/dist_ts_interfaces/requests.js +1 -1
  89. package/docs/authswitch.md +75 -12
  90. package/package.json +5 -5
  91. package/readme.md +198 -21
  92. package/ts/00_commitinfo_data.ts +1 -1
  93. package/ts/aglapi/aglapisurface.document.ts +2 -2
  94. package/ts/classes.accountsactions.ts +75 -1
  95. package/ts/classes.controller.ts +4 -4
  96. package/ts/classes.flexaccountaccess.ts +2 -1
  97. package/ts/classes.harnessreleases.ts +25 -4
  98. package/ts/classes.inferencegateway.ts +184 -64
  99. package/ts/classes.inferenceplacement.ts +6 -4
  100. package/ts/classes.inferencerouter.ts +1026 -314
  101. package/ts/classes.inferenceservice.ts +56 -13
  102. package/ts/classes.inferencespend.ts +870 -0
  103. package/ts/classes.inferenceusagecache.ts +16 -4
  104. package/ts/classes.inferenceusagetap.ts +159 -34
  105. package/ts/classes.proxycontrol.ts +3 -3
  106. package/ts/classes.proxydaemon.ts +2 -1
  107. package/ts/classes.proxystore.ts +11 -1
  108. package/ts/fleet/classes.claudeworkers.ts +9 -8
  109. package/ts/functions.claudecoderelease.ts +13 -6
  110. package/ts/functions.inferencecli.ts +11 -7
  111. package/ts/interfaces.auth.ts +2 -0
  112. package/ts/plugins.ts +7 -0
  113. package/ts_authswitch/authority-apikeys.ts +85 -0
  114. package/ts_authswitch/authority-contract.ts +167 -29
  115. package/ts_authswitch/authority-overview.ts +7 -0
  116. package/ts_authswitch/authority-placement.ts +12 -4
  117. package/ts_authswitch/authority-runtime-contract.ts +2 -2
  118. package/ts_authswitch/authority-spend.ts +168 -0
  119. package/ts_authswitch/authority-subscription.ts +28 -1
  120. package/ts_authswitch/authority-usagelimit.ts +95 -40
  121. package/ts_authswitch/authority-usagewindows.ts +42 -17
  122. package/ts_authswitch/classes.authoritybroker.ts +161 -68
  123. package/ts_authswitch/classes.authoritycli.ts +108 -32
  124. package/ts_authswitch/classes.authorityclient.ts +41 -10
  125. package/ts_authswitch/classes.authoritydaemon.ts +43 -13
  126. package/ts_authswitch/classes.authoritydatabase.ts +178 -8
  127. package/ts_authswitch/classes.authorityimport.ts +1 -1
  128. package/ts_authswitch/classes.authoritymodels.ts +165 -19
  129. package/ts_authswitch/classes.authorityregistry.ts +3 -0
  130. package/ts_authswitch/classes.authorityusage.ts +171 -10
  131. package/ts_authswitch/classes.claudenative.ts +28 -15
  132. package/ts_authswitch/classes.claudesignin.ts +4 -1
  133. package/ts_authswitch/native-contracts.md +81 -20
  134. package/ts_authswitch/readme.md +1 -1
  135. package/ts_authswitch/testsupport.ts +58 -11
  136. package/ts_authswitch/ts_migration/0011_account_api_key_fields.ts +20 -0
  137. package/ts_authswitch/ts_migration/index.ts +2 -0
  138. package/ts_interfaces/functions.authorityscope.ts +43 -8
  139. package/ts_interfaces/interfaces.ts +1 -1
  140. package/ts_interfaces/plugins.ts +6 -3
  141. package/ts_interfaces/requests.accounts.ts +48 -0
  142. package/ts_interfaces/requests.ts +4 -0
  143. package/ts_web/00_commitinfo_data.ts +1 -1
  144. package/ts_web/accounts.plugins.ts +3 -1
  145. package/ts_web/accounts.templates.ts +20 -11
  146. package/ts_web/classes.accountsreadmodel.ts +322 -70
  147. package/ts_web/elements.accounts.ts +219 -20
  148. package/ts_web/elements.codexconnections.ts +3 -1
  149. 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: ${failureArg.error}\n`);
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
- ? 'Anthropic refused a request on it with a billing error (HTTP 402), a payment problem'
70
- : 'its model list lacks the requested model';
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
- reason;
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
- /** For `no_eligible_accounts` of a pinned account: why that account takes no request, though no limit says so. */
107
- reason) {
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.reason = reason;
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 a Claude account's model list is used before it is read again, and how long a failed model-list read or a
127
- * failed sign-in holds before the next read: a sign-in does not heal itself, and a new one changes the account's revision.
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 claudeCatalogMs = 60_000;
194
+ const modelListMs = 60_000;
130
195
  /**
131
- * How long a Claude account whose access failed for a reason other than sign-in is refused before access is tried again.
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 claudeAccessRetryMs = 5_000;
200
+ const modelListAccessRetryMs = 5_000;
136
201
  /**
137
- * Why a Claude account's held model list keeps it from routing: a failure of its access or sign-in always, a failed
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 claudeCatalogRefusal = (catalogArg) => catalogArg.failure && (catalogArg.models === null || catalogArg.failure.reason !== 'catalog_failed')
141
- ? catalogArg.failure : undefined;
142
- /** A Claude account's model list could not be read, and why (`InferenceRouter.readClaudeCatalog`). */
143
- class ClaudeCatalogError extends Error {
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 = 'ClaudeCatalogError';
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 Anthropic API key's limits. The account service reads no usage for a key -- its spend and rate limits are its
191
- * Claude Console organization's -- so a key routes with unknown headroom, as an account that reports no windows does,
192
- * and only a provider 429 rests it. A usage threshold has nothing to count against.
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 apiKeyLimits = { plan: '', state: 'available', headroom: unknownHeadroom, limit: null };
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 Claude accounts a billing error (HTTP 402) took out of rotation, by when it was seen, until the account service
287
- * holds the problem; one it could not be told of stays here for the proxy's lifetime (`reportPaymentProblem`).
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 Anthropic API keys among the accounts the last pool read listed: the account service reads no usage for them,
294
- * so nothing a request on one shows is handed to it.
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 policy's accounts of its provider and credential, and every eligible account's id of that pool: an account
307
- * absent from both left the pool. An account whose lapse date passed is in neither -- it is never routed to again --
308
- * and is named in `lapsed`. A Claude account and an Anthropic API key never share a pool, so a session placed on one
309
- * kind never moves to the other.
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 credential = policyArg.credential ?? 'subscription';
499
+ const tiers = this.tiers(policyArg);
317
500
  const now = this.now();
318
501
  const inPool = (accountArg) => accountArg.providerId === provider
319
- && accountArg.credential === 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 a Claude account or an Anthropic API key may use: the list read within the last minute, else read now.
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 (`holdClaudeFailure`).
594
+ * read again, however many requests ask, for a minute -- or 5 s after a failed access (`holdListFailure`).
401
595
  */
402
- async claudeCatalog(accountArg, signalArg) {
403
- const cached = this.claudeCatalogs.get(accountArg.id);
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 = claudeCatalogRefusal(cached);
599
+ const refusal = heldListRefusal(cached);
406
600
  if (refusal)
407
- throw new ClaudeCatalogError(refusal);
601
+ throw new ModelListError(refusal);
408
602
  return cached.models;
409
603
  }
410
604
  try {
411
- const models = await this.readClaudeCatalog(accountArg, signalArg);
412
- this.claudeCatalogs.set(accountArg.id, { revision: accountArg.revision, until: this.now() + claudeCatalogMs, models,
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 ClaudeCatalogError ? errorArg.unavailable
612
+ const failure = errorArg instanceof ModelListError ? errorArg.unavailable
420
613
  : { reason: 'catalog_failed', failure: catalogFailure(errorArg) };
421
- const models = this.holdClaudeFailure(accountArg, failure);
614
+ const models = this.holdListFailure(listsArg, accountArg, failure);
422
615
  if (models)
423
616
  return models;
424
- throw new ClaudeCatalogError(failure);
617
+ throw new ModelListError(failure);
425
618
  }
426
619
  }
427
620
  /**
428
- * Records why a Claude account's model list or access failed, keeping the list held for its revision, and notes it:
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 (`claudeCatalogRefusal`).
625
+ * model-list read (`heldListRefusal`).
433
626
  */
434
- holdClaudeFailure(accountArg, failureArg) {
435
- const catalog = { revision: accountArg.revision,
436
- until: this.now() + (failureArg.reason === 'access_failed' ? claudeAccessRetryMs : claudeCatalogMs),
437
- models: this.heldClaudeCatalog(accountArg) ?? null, failure: failureArg };
438
- this.claudeCatalogs.set(accountArg.id, catalog);
439
- const routed = claudeCatalogRefusal(catalog) ? undefined : catalog.models;
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 a Claude account or an Anthropic API key may use. A rejected access is reported once: a sign-in is
445
- * renewed, while a key is ended, so the account service refuses the second read. Every failure but an abort is a
446
- * `ClaudeCatalogError` naming its reason.
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 readClaudeCatalog(accountArg, signalArg) {
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 ClaudeCatalogError({ reason: needsSignIn(errorArg) ? 'needs_login' : 'access_failed' });
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: accountArg.credential === 'api_key'
461
- ? await plugins.anthropicProvider.listAnthropicApiKeyModels({ apiKey: access.accessToken }, listOptions)
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 instanceof plugins.anthropicProvider.AnthropicOAuthAuthError
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 ClaudeCatalogError({ reason: 'needs_login' });
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 a Claude account's revision was last read with, without reading it: `undefined` when none is held. */
501
- heldClaudeCatalog(accountArg) {
502
- const cached = this.claudeCatalogs.get(accountArg.id);
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 a Claude account's model list or access keeps it from routing, as a request would find it now, before its next
507
- * read is due: a failed access or sign-in, or a failed model-list read with no list held for its revision.
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
- catalogRefusal(accountArg) {
510
- const cached = this.claudeCatalogs.get(accountArg.id);
511
- return cached?.revision === accountArg.revision && cached.until > this.now() ? claudeCatalogRefusal(cached) : undefined;
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 models every readable account of the Claude pool -- its Claude accounts, or its Anthropic API keys -- offers: a
515
- * session may move to any of them, so a model one account lacks is not offered. Limits are the smallest any of them
516
- * states; efforts are those all of them accept, and adaptive thinking is offered when all of them accept it. What one
517
- * account does not state, the pool does not state.
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.accounts(policyArg, signalArg);
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 accounts) {
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.credential === 'api_key' ? apiKeyLimits
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
- if (!models?.size)
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
- * Current model entitlements, merged conservatively across the account pool. A pool whose every account read needs a
577
- * fresh sign-in -- ChatGPT rejected its access even when renewed, or the account service could not renew it -- answers
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.accounts(policyArg, signalArg);
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 accounts) {
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
- if (!models.size && read > 0 && signInNeeded === read) {
618
- throw new InferenceRoutingError(503, 'account_needs_login', 'An account needs a fresh sign-in.');
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 (!models.size)
621
- throw new InferenceRoutingError(503, 'no_eligible_accounts', 'No eligible account could supply a model catalog. Check the AGL account service and sign-ins.');
622
- return [...models.values()];
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
- * An entry shared by several accounts keeps only what every one of them offers.
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
- const accounts = await this.accounts(policyArg, signalArg);
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 for one request. `clientVersion` is the Codex release the client read its catalog as, so the
689
- * model it names is checked against the catalog it was offered.
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
- let exhausted = false;
696
- let reserved = false;
697
- let modelKnown = false;
698
- let unavailable = false;
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
- exhausted = true;
709
- const reset = this.cooldowns.get(account.id)?.until ?? 0;
710
- if (reset > this.now())
711
- earliestReset = Math.min(earliestReset, reset);
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, plan: limits.plan, headroom: limits.headroom, score: placement.score,
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
- const initial = await this.options.resolveAccess(id, signalArg);
764
- this.select([selected], selectionState);
765
- const connection = plugins.openAiProvider.createOpenAiChatGptResolvingModelConnection({
766
- expectedIdentity: initial,
767
- resolveAccess: async ({ signal, rejectedGeneration }) => {
768
- const access = await this.options.resolveAccess(id, signal, rejectedGeneration);
769
- this.select([selected], selectionState);
770
- return access;
771
- },
772
- fetch: async (inputArg, initArg) => {
773
- const response = await (this.options.providerFetch ?? fetch)(inputArg, initArg);
774
- this.observe(id, 'openai', response.headers, response.status);
775
- if (response.status === 429) {
776
- this.reportQuota(id, this.retryAfterSeconds(response.headers));
777
- }
778
- return response;
779
- },
780
- originator: 'agl',
781
- });
782
- return { provider: 'openai', accountId: id, plan: selected.plan, score: selected.score, model: selected.model,
783
- connection, release };
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
- * A Claude account for one of Claude Code's requests, or an Anthropic API key for one of Flex's, chosen as `acquire`
792
- * chooses: the pinned session account if it is still eligible, else the least busy account with the most headroom
793
- * whose current reading shows it available -- every counted window under its threshold, no provider retry ahead --
794
- * with no cooldown after a provider 429, and which lists the model. A key has no reading (`apiKeyLimits`): it is
795
- * available unless it cools down after a 429.
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
- * A Claude account held with a payment problem -- Anthropic answered a request on it with a billing error (HTTP 402),
802
- * as its usage reading says or this proxy saw (`reportPaymentProblem`) -- takes no request, `count_tokens` included,
803
- * and is refused for the reason `payment_problem`. So is an account of `exclude` that `paymentExcluded` names: the
804
- * request left it for a payment problem. Neither counts as at its limit: when such accounts are all that is left the
805
- * refusal is a 402 `payment_problem` naming them, and while another account is merely at its limit the 429 stands.
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 candidates = [];
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
- for (const account of accounts) {
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
- if (optionsArg.paymentExcluded?.has(account.id)) {
831
- payment.push(account.label);
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
- const usage = account.credential === 'api_key' ? undefined : await this.options.usage(account.id, signalArg)
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
- // A payment problem refuses the account before anything else is judged, whatever limits a request ignores.
845
- if (account.credential !== 'api_key' && this.paymentRefused(account.id, usage)) {
846
- refusal = { reason: 'payment_problem' };
847
- payment.push(account.label);
848
- this.noteAccount(account.id, refusal);
849
- continue;
850
- }
851
- if (this.noted.get(account.id)?.unavailable.reason === 'payment_problem')
852
- this.noteAccount(account.id, null);
853
- const limits = account.credential === 'api_key' ? apiKeyLimits
854
- : usage ? claudeLimits(usage, account, this.now()) : undefined;
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
- modelKnown = true;
892
- // A reading the router does not route on (`usage_unavailable`), and a key's absent one, score nothing.
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, model, reading: usage?.reading ?? null, ignoreLimits: optionsArg.ignoreLimits === true,
895
- plan: limits.plan, headroom: limits.headroom, score: placement.score,
896
- lastResort: placement.eligibility === 'last_resort' });
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 ClaudeCatalogError)
1354
+ selectionState.unavailable = true;
1355
+ if (errorArg instanceof ModelListError)
902
1356
  refusal = errorArg.unavailable;
903
1357
  }
904
1358
  }
905
- const selectionState = { exhausted, reserved, unavailable, modelKnown, payment,
906
- earliestReset, exhaustedPlans, accounts: accounts.length, pinned: optionsArg.accountId !== undefined, accountLimit,
907
- ...(optionsArg.accountId !== undefined && refusal ? { refusal: { accountId: optionsArg.accountId, unavailable: refusal } } : {}) };
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.holdClaudeFailure(selected.account, failure);
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, release };
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 by the placement order (`authSwitchPlacementOrder`), or the refusal that says why there is
982
- * none. A pinned request has its session's account as its one candidate, so the order only ever places new sessions.
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, lastResort: left.lastResort,
1009
- headroom: left.headroom }, { id: right.account.id, score: right.score, lastResort: right.lastResort,
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.reason);
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', `Anthropic answered a billing error (HTTP 402) for the`
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 Anthropic API key, which has none, as `apiKeyLimits` judges it -- with
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
- * pool would go (`placementRank`).
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
- const held = apiKey ? undefined : heldArg(account.id);
1044
- const limits = apiKey ? apiKeyLimits
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
- const cooldown = cooldownUntil(this.cooldowns.get(account.id), held);
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
- if (!apiKey && account.providerId === 'anthropic' && this.paymentRefused(account.id, held)) {
1060
- const unavailable = { reason: 'payment_problem' };
1061
- return { ...base, state: 'unavailable', stateText: `unavailable (${unavailableText(unavailable)})`, unavailable,
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
- if (!limits) {
1065
- const unavailable = { reason: 'usage_unread', retryAt: held?.nextAttemptAt ?? null };
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 = account.providerId === 'anthropic' ? this.catalogRefusal(account) : undefined;
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
- : limits.limit ? plugins.authswitchUsageLimit.authSwitchUsageLimitText(limits.limit)
1079
- : apiKey ? 'available (an API key; no usage is read for it)' : 'available (no usage reported)',
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 pool's accounts that take a new session now, in the order placement takes them.
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 poolOf = (statusArg) => `${statusArg.provider}:${statusArg.credential}`;
1086
- for (const pool of new Set(statuses.map(poolOf))) {
1087
- statuses.filter((statusArg) => poolOf(statusArg) === pool && statusArg.state === 'available'
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, score: statusArg.placementScore,
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
- * Anthropic refused a request on the Claude account with a billing error (HTTP 402 `billing_error`): the account is out
1125
- * of rotation at once, and the account service is told (`reportPaymentProblem`). Once it holds the problem the
1126
- * account's usage carries it, and that decides from then on, so the router's own mark is dropped; when the service
1127
- * cannot be told -- it is not running, or an older release that does not know the report -- the mark holds for as long
1128
- * as the proxy runs, and the failure is reported once. An API key's 402 is no payment problem the service holds.
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
- this.paymentMarks.set(accountIdArg, at);
1135
- this.noteAccount(accountIdArg, { reason: 'payment_problem' });
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) === at)
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
- /** Whether a Claude account is held with a payment problem: by its usage reading, or by this proxy's own mark. */
1156
- paymentRefused(accountIdArg, usageArg) {
1157
- return this.paymentMarks.has(accountIdArg) || usageArg?.paymentProblem !== undefined;
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 usage the account service does not read, cools down the 60 seconds.
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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