@modelprofile.com/flexharness-providers 7.0.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -22,11 +22,15 @@ const utf8ByteLength = (valueArg) => textEncoder.encode(valueArg).byteLength;
22
22
  export class OpenAiChatGptAuthError extends Error {
23
23
  status;
24
24
  body;
25
+ requestOutcome;
26
+ retryAfterMs;
25
27
  constructor(message, options = {}) {
26
28
  super(message);
27
29
  this.name = 'OpenAiChatGptAuthError';
28
30
  this.status = options.status;
29
31
  this.body = options.body;
32
+ this.requestOutcome = options.requestOutcome;
33
+ this.retryAfterMs = options.retryAfterMs;
30
34
  }
31
35
  }
32
36
  function getFetch(options) {
@@ -148,10 +152,27 @@ async function readJson(response, context, options) {
148
152
  : `${context} returned invalid JSON: ${error.message}`, options, { status: response.status, body });
149
153
  }
150
154
  }
155
+ const parseRetryAfterMs = (headerArg) => {
156
+ if (!headerArg || headerArg.length > 128)
157
+ return undefined;
158
+ const maximumDelayMs = 24 * 60 * 60 * 1000;
159
+ if (/^\d{1,10}$/.test(headerArg)) {
160
+ return Math.min(Number(headerArg) * 1000, maximumDelayMs);
161
+ }
162
+ const retryAt = Date.parse(headerArg);
163
+ if (!Number.isFinite(retryAt))
164
+ return undefined;
165
+ return Math.min(Math.max(0, retryAt - Date.now()), maximumDelayMs);
166
+ };
151
167
  async function runFetch(url, init, options, responseHandlerArg, timeoutMsArg = AUTH_REQUEST_TIMEOUT_MS) {
152
- throwIfAborted(options);
168
+ if (options.signal?.aborted) {
169
+ throw new OpenAiChatGptAuthError('OpenAI ChatGPT authentication was aborted.', {
170
+ requestOutcome: 'notSent',
171
+ });
172
+ }
153
173
  const controller = new AbortController();
154
174
  let response;
175
+ let requestStarted = false;
155
176
  const onExternalAbort = () => controller.abort();
156
177
  const onRequestAbort = () => {
157
178
  void response?.body?.cancel().catch(() => undefined);
@@ -170,7 +191,9 @@ async function runFetch(url, init, options, responseHandlerArg, timeoutMsArg = A
170
191
  try {
171
192
  return await Promise.race([
172
193
  (async () => {
173
- response = await getFetch(options)(url, {
194
+ const fetchImplementation = getFetch(options);
195
+ requestStarted = true;
196
+ response = await fetchImplementation(url, {
174
197
  ...init,
175
198
  redirect: 'error',
176
199
  signal: controller.signal,
@@ -185,13 +208,28 @@ async function runFetch(url, init, options, responseHandlerArg, timeoutMsArg = A
185
208
  ]);
186
209
  }
187
210
  catch (error) {
188
- if (error instanceof OpenAiChatGptAuthError)
189
- throw error;
211
+ const requestOutcome = requestStarted
212
+ ? 'outcomeUnknown'
213
+ : 'notSent';
214
+ const retryAfterMs = response ? parseRetryAfterMs(response.headers.get('retry-after')) : undefined;
215
+ if (error instanceof OpenAiChatGptAuthError) {
216
+ throw new OpenAiChatGptAuthError(error.message, {
217
+ ...(error.status !== undefined ? { status: error.status }
218
+ : response ? { status: response.status } : {}),
219
+ ...(error.body !== undefined ? { body: error.body } : {}),
220
+ requestOutcome,
221
+ ...(retryAfterMs !== undefined ? { retryAfterMs } : {}),
222
+ });
223
+ }
190
224
  if (!usesSafeErrors(options))
191
225
  throw error;
192
- throw authError(options.signal?.aborted
226
+ throw new OpenAiChatGptAuthError(options.signal?.aborted
193
227
  ? 'OpenAI ChatGPT authentication was aborted.'
194
- : 'OpenAI ChatGPT authentication request failed.', options);
228
+ : 'OpenAI ChatGPT authentication request failed.', {
229
+ requestOutcome,
230
+ ...(response ? { status: response.status } : {}),
231
+ ...(retryAfterMs !== undefined ? { retryAfterMs } : {}),
232
+ });
195
233
  }
196
234
  finally {
197
235
  clearTimeout(timer);
@@ -281,7 +319,9 @@ export function parseOpenAiChatGptTokenInfo(token) {
281
319
  chatgptUserId: asOptionalString(auth?.chatgpt_user_id) ?? asOptionalString(auth?.user_id),
282
320
  chatgptAccountId: asOptionalString(auth?.chatgpt_account_id),
283
321
  chatgptAccountIsFedramp: auth?.chatgpt_account_is_fedramp === true,
284
- expiresAt: expiresAtSeconds ? new Date(expiresAtSeconds * 1000).toISOString() : undefined,
322
+ expiresAt: expiresAtSeconds !== undefined
323
+ ? new Date(expiresAtSeconds * 1000).toISOString()
324
+ : undefined,
285
325
  rawJwt: token,
286
326
  };
287
327
  }
@@ -577,14 +617,28 @@ export async function revokeOpenAiChatGptToken(token, options) {
577
617
  });
578
618
  }
579
619
  export function createOpenAiChatGptProviderSettings(credentials) {
580
- const tokenAccountId = credentials.tokenInfo?.chatgptAccountId;
620
+ const currentTokenInfo = parseOpenAiChatGptTokenInfo(credentials.accessToken);
621
+ if (currentTokenInfo.expiresAt === undefined
622
+ || Date.parse(currentTokenInfo.expiresAt) <= Date.now()) {
623
+ throw new OpenAiChatGptAuthError('OpenAI ChatGPT access token has no valid future expiry.');
624
+ }
625
+ const tokenAccountId = currentTokenInfo.chatgptAccountId;
581
626
  if (credentials.accountId !== undefined
582
- && tokenAccountId !== undefined
583
627
  && credentials.accountId !== tokenAccountId) {
584
628
  throw new OpenAiChatGptAuthError('OpenAI ChatGPT account ID does not match the token claim.');
585
629
  }
586
- const accountId = tokenAccountId ?? credentials.accountId;
587
- const isFedrampAccount = credentials.tokenInfo?.chatgptAccountIsFedramp === true;
630
+ if (credentials.tokenInfo !== undefined
631
+ && (credentials.tokenInfo.chatgptAccountId !== tokenAccountId
632
+ || credentials.tokenInfo.chatgptAccountIsFedramp !== currentTokenInfo.chatgptAccountIsFedramp)) {
633
+ throw new OpenAiChatGptAuthError('OpenAI ChatGPT token information does not match the current access token.');
634
+ }
635
+ if (credentials.isFedrampAccount !== undefined
636
+ && (typeof credentials.isFedrampAccount !== 'boolean'
637
+ || credentials.isFedrampAccount !== currentTokenInfo.chatgptAccountIsFedramp)) {
638
+ throw new OpenAiChatGptAuthError('OpenAI ChatGPT FedRAMP status does not match the token claim.');
639
+ }
640
+ const accountId = tokenAccountId;
641
+ const isFedrampAccount = currentTokenInfo.chatgptAccountIsFedramp;
588
642
  const headers = {
589
643
  originator: credentials.originator ?? OPENAI_CHATGPT_DEFAULT_ORIGINATOR,
590
644
  };
@@ -600,4 +654,4 @@ export function createOpenAiChatGptProviderSettings(credentials) {
600
654
  headers,
601
655
  };
602
656
  }
603
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhaS5hdXRoLm9wZW5haS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX29wZW5haV9hdXRoL3NtYXJ0YWkuYXV0aC5vcGVuYWkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLHlCQUF5QixDQUFDO0FBQ3BFLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLDhCQUE4QixDQUFDO0FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLHVDQUF1QyxDQUFDO0FBQ3JGLE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLFNBQVMsQ0FBQztBQUUzRCxNQUFNLHNCQUFzQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzlDLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDdkMsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ25ELE1BQU0seUJBQXlCLEdBQUcsSUFBSSxDQUFDO0FBQ3ZDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0FBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDbEMscUNBQXFDO0lBQ3JDLHFDQUFxQztDQUN0QyxDQUFDLENBQUM7QUFDSCxNQUFNLFlBQVksR0FBRywrRUFBK0UsQ0FBQztBQUNyRyxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO0FBQzVDLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFDdEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUV0QyxNQUFNLGNBQWMsR0FBRyxDQUFDLFVBQXFDLEVBQVcsRUFBRSxDQUN4RSxVQUFVLENBQUMsVUFBVSxLQUFLLEtBQUss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
657
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhaS5hdXRoLm9wZW5haS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX29wZW5haV9hdXRoL3NtYXJ0YWkuYXV0aC5vcGVuYWkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0JBLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLHlCQUF5QixDQUFDO0FBQ3BFLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLDhCQUE4QixDQUFDO0FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLHVDQUF1QyxDQUFDO0FBQ3JGLE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLFNBQVMsQ0FBQztBQUUzRCxNQUFNLHNCQUFzQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzlDLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDdkMsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ25ELE1BQU0seUJBQXlCLEdBQUcsSUFBSSxDQUFDO0FBQ3ZDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0FBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDbEMscUNBQXFDO0lBQ3JDLHFDQUFxQztDQUN0QyxDQUFDLENBQUM7QUFDSCxNQUFNLFlBQVksR0FBRywrRUFBK0UsQ0FBQztBQUNyRyxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO0FBQzVDLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFDdEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUV0QyxNQUFNLGNBQWMsR0FBRyxDQUFDLFVBQXFDLEVBQVcsRUFBRSxDQUN4RSxVQUFVLENBQUMsVUFBVSxLQUFLLEtBQUss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
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "author": "Task Venture Capital GmbH",
3
3
  "license": "MIT",
4
4
  "name": "@modelprofile.com/flexharness-providers",
5
- "version": "7.0.0",
5
+ "version": "8.0.0",
6
6
  "type": "module",
7
7
  "description": "Model providers, authentication, account management, media and research integrations in one package.",
8
8
  "main": "./dist_ts_providers/index.js",
@@ -75,7 +75,7 @@
75
75
  "@ai-sdk/provider": "^4.0.8",
76
76
  "@ai-sdk/xai": "^4.0.44",
77
77
  "@anthropic-ai/sdk": "0.95.2",
78
- "@modelprofile.com/flexharness-models": "7.0.0",
78
+ "@modelprofile.com/flexharness-models": "8.0.0",
79
79
  "ai": "^7.0.79",
80
80
  "openai": "^6.37.0",
81
81
  "proper-lockfile": "^4.1.2"
@@ -11,6 +11,58 @@ pnpm add @modelprofile.com/flexharness-providers
11
11
  See the [toolbox usage and migration guide](https://code.foss.global/modelprofile.com/flexharness#readme)
12
12
  for composition examples and the SmartAI/SmartAgent migration map.
13
13
 
14
+ ## Authority-managed access
15
+
16
+ `OpenAiProviderAdapter.listModels()` and `getAccountRateLimits()` accept an
17
+ `IOpenAiChatGptAccessCredential` resolved by a separate account authority:
18
+
19
+ ```typescript
20
+ import {
21
+ OpenAiProviderAdapter,
22
+ type IOpenAiChatGptAccessCredential,
23
+ } from '@modelprofile.com/flexharness-providers/accounts';
24
+
25
+ async function readAccount(grant: {
26
+ accessToken: string;
27
+ accountId: string;
28
+ isFedrampAccount: boolean;
29
+ }) {
30
+ const adapter = new OpenAiProviderAdapter();
31
+ const access: IOpenAiChatGptAccessCredential = {
32
+ kind: 'chatgptAccess',
33
+ providerId: 'openai',
34
+ accessToken: grant.accessToken,
35
+ accountId: grant.accountId,
36
+ isFedrampAccount: grant.isFedrampAccount,
37
+ };
38
+ try {
39
+ return {
40
+ models: await adapter.listModels(access),
41
+ usage: await adapter.getAccountRateLimits(access),
42
+ };
43
+ } finally {
44
+ await adapter.dispose();
45
+ }
46
+ }
47
+ ```
48
+
49
+ The authority verifies the account ID and FedRAMP flag against the current token,
50
+ owns refresh, and supplies a fresh access grant before each operation. A rejected
51
+ token returns `CREDENTIAL_REFRESH_REQUIRED` to the caller; the adapter does not
52
+ refresh it. Access-only grants cannot be serialized as provider credential
53
+ envelopes. Login, refresh and logout still require the full OAuth credential.
54
+
55
+ For inference, `createOpenAiChatGptModelConnection()` from `/auth` accepts
56
+ `{ accessToken, accountId, isFedrampAccount }` without a refresh token.
57
+
58
+ `refreshCredential()` failures report `requestOutcome: 'notSent'` only when the
59
+ call was rejected before a fetch invocation. All failures after a fetch invocation,
60
+ including HTTP 429, timeout, and a malformed successful response, report
61
+ `outcomeUnknown`: the provider might have rotated the refresh token. A failure
62
+ may also contain a numeric `responseStatus` and a bounded `retryAfterMs` from an
63
+ observed HTTP response. These are scheduling facts, not permission to replay
64
+ the old refresh token. Provider response bodies are never returned in this API.
65
+
14
66
  ## Issue Reporting and Security
15
67
 
16
68
  Report issues and security concerns through [community.foss.global](https://community.foss.global).
@@ -1,3 +1,5 @@
1
+ import type { TOpenAiChatGptRequestOutcome } from '@modelprofile.com/flexharness-providers/auth';
2
+
1
3
  export type TSmartAiProviderId = string;
2
4
  export type TSmartAiProviderLoginFlow = 'browser' | 'device';
3
5
  export type TSmartAiProviderInputModality = 'text' | 'image' | 'audio';
@@ -24,6 +26,21 @@ export interface IOpenAiChatGptOAuthCredential {
24
26
  lastRefreshAt?: string;
25
27
  }
26
28
 
29
+ /** A short-lived, authority-resolved access grant for read and inference operations. */
30
+ export interface IOpenAiChatGptAccessCredential {
31
+ kind: 'chatgptAccess';
32
+ providerId: 'openai';
33
+ accessToken: string;
34
+ /** The verified ChatGPT workspace/account ID, not an email address. */
35
+ accountId: string;
36
+ isFedrampAccount: boolean;
37
+ }
38
+
39
+ /** Access grants are deliberately excluded from stored provider credential envelopes. */
40
+ export type TOpenAiChatGptReadCredential =
41
+ | IOpenAiChatGptOAuthCredential
42
+ | IOpenAiChatGptAccessCredential;
43
+
27
44
  export type TSmartAiProviderCredential =
28
45
  | ISmartAiProviderApiKeyCredential
29
46
  | IOpenAiChatGptOAuthCredential;
@@ -117,6 +134,12 @@ export interface ISmartAiProviderRefreshFailure {
117
134
  success: false;
118
135
  credential: IOpenAiChatGptOAuthCredential;
119
136
  errorCode: TSmartAiProviderCredentialOperationErrorCode | 'REFRESH_FAILED';
137
+ /** Never replay a rotating grant when this is outcomeUnknown. */
138
+ requestOutcome: TOpenAiChatGptRequestOutcome;
139
+ /** The response status, when an HTTP response was observed. */
140
+ responseStatus?: number;
141
+ /** Bounded Retry-After delay from the observed response. */
142
+ retryAfterMs?: number;
120
143
  }
121
144
 
122
145
  export type TSmartAiProviderRefreshResult =
@@ -201,11 +224,11 @@ export interface ISmartAiProviderAdapter {
201
224
  options?: ISmartAiProviderOperationOptions,
202
225
  ): Promise<TSmartAiProviderRefreshResult>;
203
226
  listModels(
204
- credential: IOpenAiChatGptOAuthCredential,
227
+ credential: TOpenAiChatGptReadCredential,
205
228
  options?: ISmartAiProviderModelListOptions,
206
229
  ): Promise<TSmartAiProviderModelListResult>;
207
230
  getAccountRateLimits(
208
- credential: IOpenAiChatGptOAuthCredential,
231
+ credential: TOpenAiChatGptReadCredential,
209
232
  options?: ISmartAiProviderOperationOptions,
210
233
  ): Promise<TSmartAiProviderAccountRateLimitsResult>;
211
234
  logoutCredential(
@@ -3,6 +3,7 @@ import * as plugins from './plugins.js';
3
3
  import {
4
4
  OPENAI_CHATGPT_CODEX_BASE_URL,
5
5
  OPENAI_CHATGPT_DEFAULT_ORIGINATOR,
6
+ OpenAiChatGptAuthError,
6
7
  completeOpenAiChatGptDeviceCodeLogin,
7
8
  createOpenAiChatGptBrowserAuthorization,
8
9
  exchangeOpenAiChatGptBrowserAuthorizationCode,
@@ -29,6 +30,7 @@ import type {
29
30
  ISmartAiProviderOperationOptions,
30
31
  ISmartAiProviderRateLimitDetails,
31
32
  ISmartAiProviderRateLimitWindow,
33
+ TOpenAiChatGptReadCredential,
32
34
  TSmartAiProviderCancelStatus,
33
35
  TSmartAiProviderAccountRateLimitsResult,
34
36
  TSmartAiProviderCredential,
@@ -183,6 +185,46 @@ const toTokenData = (credentialArg: IOpenAiChatGptOAuthCredential): IOpenAiChatG
183
185
  };
184
186
  };
185
187
 
188
+ interface IOpenAiChatGptReadAccess {
189
+ accessToken: string;
190
+ accountId?: string;
191
+ isFedrampAccount: boolean;
192
+ }
193
+
194
+ const toReadAccess = (
195
+ credentialArg: TOpenAiChatGptReadCredential,
196
+ ): IOpenAiChatGptReadAccess => {
197
+ if (!isRecord(credentialArg)) throw createSmartAiProviderError('CREDENTIAL_INVALID');
198
+ if (credentialArg.kind === 'chatgptOAuth') {
199
+ const tokenData = toTokenData(credentialArg);
200
+ return {
201
+ accessToken: tokenData.accessToken,
202
+ accountId: tokenData.tokenInfo.chatgptAccountId,
203
+ isFedrampAccount: tokenData.tokenInfo.chatgptAccountIsFedramp,
204
+ };
205
+ }
206
+ const access = credentialArg;
207
+ if (
208
+ access.kind !== 'chatgptAccess'
209
+ || access.providerId !== 'openai'
210
+ || typeof access.accessToken !== 'string'
211
+ || access.accessToken.length === 0
212
+ || plugins.Buffer.byteLength(access.accessToken, 'utf8') > maximumHeaderBytes
213
+ || typeof access.accountId !== 'string'
214
+ || access.accountId.length === 0
215
+ || plugins.Buffer.byteLength(access.accountId, 'utf8') > maximumHeaderBytes
216
+ || typeof access.isFedrampAccount !== 'boolean'
217
+ || Object.keys(access).length !== 5
218
+ ) {
219
+ throw createSmartAiProviderError('CREDENTIAL_INVALID');
220
+ }
221
+ return {
222
+ accessToken: access.accessToken,
223
+ accountId: access.accountId,
224
+ isFedrampAccount: access.isFedrampAccount,
225
+ };
226
+ };
227
+
186
228
  const toCredential = (
187
229
  tokenDataArg: IOpenAiChatGptTokenData,
188
230
  lastRefreshAtArg?: string,
@@ -849,6 +891,7 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
849
891
  success: false,
850
892
  credential: credentialArg,
851
893
  errorCode: waitOperation.timedOut ? 'TIMEOUT' : 'ABORTED',
894
+ requestOutcome: 'notSent',
852
895
  };
853
896
  waitOperation.cleanup();
854
897
  return failure;
@@ -888,6 +931,7 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
888
931
  success: false,
889
932
  credential: credentialArg,
890
933
  errorCode: waitOperation.timedOut ? 'TIMEOUT' : 'ABORTED',
934
+ requestOutcome: 'outcomeUnknown',
891
935
  });
892
936
  waitOperation.signal.addEventListener('abort', onAbort, { once: true });
893
937
  });
@@ -914,7 +958,12 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
914
958
  const tokenChanged = refreshed.accessToken !== input.accessToken
915
959
  || refreshed.refreshToken !== input.refreshToken;
916
960
  if (!tokenChanged || !refreshed.idToken) {
917
- return { success: false, credential: credentialArg, errorCode: 'REFRESH_FAILED' };
961
+ return {
962
+ success: false,
963
+ credential: credentialArg,
964
+ errorCode: 'REFRESH_FAILED',
965
+ requestOutcome: 'outcomeUnknown',
966
+ };
918
967
  }
919
968
  const previous = credentialArg.lastRefreshAt === undefined
920
969
  ? 0
@@ -929,6 +978,15 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
929
978
  success: false,
930
979
  credential: credentialArg,
931
980
  errorCode: classifyOperationError(errorArg, operation, 'REFRESH_FAILED'),
981
+ requestOutcome: errorArg instanceof OpenAiChatGptAuthError
982
+ ? errorArg.requestOutcome ?? 'outcomeUnknown'
983
+ : 'outcomeUnknown',
984
+ ...(errorArg instanceof OpenAiChatGptAuthError && errorArg.status !== undefined
985
+ ? { responseStatus: errorArg.status }
986
+ : {}),
987
+ ...(errorArg instanceof OpenAiChatGptAuthError && errorArg.retryAfterMs !== undefined
988
+ ? { retryAfterMs: errorArg.retryAfterMs }
989
+ : {}),
932
990
  };
933
991
  } finally {
934
992
  this.operations.delete(operation.controller);
@@ -937,11 +995,10 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
937
995
  }
938
996
 
939
997
  private async fetchCatalog(
940
- credentialArg: IOpenAiChatGptOAuthCredential,
998
+ accessArg: IOpenAiChatGptReadAccess,
941
999
  signalArg: AbortSignal,
942
1000
  ): Promise<ISmartAiProviderModel[]> {
943
- const tokenData = toTokenData(credentialArg);
944
- const accountId = tokenData.tokenInfo.chatgptAccountId;
1001
+ const accountId = accessArg.accountId;
945
1002
  const url = `${OPENAI_CHATGPT_CODEX_BASE_URL}/models?client_version=${encodeURIComponent(defaultClientVersion)}`;
946
1003
  let response: Response;
947
1004
  let onAbort!: () => void;
@@ -952,9 +1009,9 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
952
1009
  signal: signalArg,
953
1010
  headers: {
954
1011
  Accept: 'application/json',
955
- Authorization: `Bearer ${credentialArg.accessToken}`,
1012
+ Authorization: `Bearer ${accessArg.accessToken}`,
956
1013
  ...(accountId ? { 'ChatGPT-Account-ID': accountId } : {}),
957
- ...(tokenData.tokenInfo.chatgptAccountIsFedramp ? { 'X-OpenAI-Fedramp': 'true' } : {}),
1014
+ ...(accessArg.isFedrampAccount ? { 'X-OpenAI-Fedramp': 'true' } : {}),
958
1015
  originator: this.originator,
959
1016
  version: defaultClientVersion,
960
1017
  },
@@ -1023,18 +1080,18 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
1023
1080
  }
1024
1081
 
1025
1082
  public async listModels(
1026
- credentialArg: IOpenAiChatGptOAuthCredential,
1083
+ credentialArg: TOpenAiChatGptReadCredential,
1027
1084
  optionsArg: ISmartAiProviderModelListOptions = {},
1028
1085
  ): Promise<TSmartAiProviderModelListResult> {
1029
1086
  this.requireOpen();
1030
- toTokenData(credentialArg);
1087
+ const access = toReadAccess(credentialArg);
1031
1088
  const options = normalizeModelListOptions(optionsArg);
1032
1089
  const operation = createOperation(options, defaultOperationTimeoutMs);
1033
1090
  this.operations.add(operation.controller);
1034
1091
  try {
1035
1092
  let catalog: ISmartAiProviderModel[];
1036
1093
  try {
1037
- catalog = await this.fetchCatalog(credentialArg, operation.signal);
1094
+ catalog = await this.fetchCatalog(access, operation.signal);
1038
1095
  } catch (errorArg) {
1039
1096
  if (!(errorArg instanceof ModelHttpError) || errorArg.status !== 401) throw errorArg;
1040
1097
  return { success: false, errorCode: 'CREDENTIAL_REFRESH_REQUIRED' };
@@ -1084,11 +1141,10 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
1084
1141
  }
1085
1142
 
1086
1143
  private async fetchAccountRateLimits(
1087
- credentialArg: IOpenAiChatGptOAuthCredential,
1144
+ accessArg: IOpenAiChatGptReadAccess,
1088
1145
  signalArg: AbortSignal,
1089
1146
  ): Promise<ISmartAiProviderAccountRateLimits> {
1090
- const tokenData = toTokenData(credentialArg);
1091
- const accountId = tokenData.tokenInfo.chatgptAccountId;
1147
+ const accountId = accessArg.accountId;
1092
1148
  let response: Response;
1093
1149
  let onAbort!: () => void;
1094
1150
  try {
@@ -1098,9 +1154,9 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
1098
1154
  signal: signalArg,
1099
1155
  headers: {
1100
1156
  Accept: 'application/json',
1101
- Authorization: `Bearer ${credentialArg.accessToken}`,
1157
+ Authorization: `Bearer ${accessArg.accessToken}`,
1102
1158
  ...(accountId ? { 'ChatGPT-Account-Id': accountId } : {}),
1103
- ...(tokenData.tokenInfo.chatgptAccountIsFedramp ? { 'X-OpenAI-Fedramp': 'true' } : {}),
1159
+ ...(accessArg.isFedrampAccount ? { 'X-OpenAI-Fedramp': 'true' } : {}),
1104
1160
  'User-Agent': this.originator,
1105
1161
  },
1106
1162
  });
@@ -1130,16 +1186,16 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
1130
1186
  }
1131
1187
 
1132
1188
  public async getAccountRateLimits(
1133
- credentialArg: IOpenAiChatGptOAuthCredential,
1189
+ credentialArg: TOpenAiChatGptReadCredential,
1134
1190
  optionsArg: ISmartAiProviderOperationOptions = {},
1135
1191
  ): Promise<TSmartAiProviderAccountRateLimitsResult> {
1136
1192
  this.requireOpen();
1137
- toTokenData(credentialArg);
1193
+ const access = toReadAccess(credentialArg);
1138
1194
  const operation = createOperation(optionsArg, defaultOperationTimeoutMs);
1139
1195
  this.operations.add(operation.controller);
1140
1196
  try {
1141
1197
  try {
1142
- const rateLimits = await this.fetchAccountRateLimits(credentialArg, operation.signal);
1198
+ const rateLimits = await this.fetchAccountRateLimits(access, operation.signal);
1143
1199
  return { success: true, rateLimits };
1144
1200
  } catch (errorArg) {
1145
1201
  if (!(errorArg instanceof AccountRateLimitsHttpError) || errorArg.status !== 401) {
@@ -13,6 +13,8 @@ export interface IOpenAiChatGptAuthCredentials {
13
13
  refreshToken?: string;
14
14
  idToken?: string;
15
15
  accountId?: string;
16
+ /** Verified from the current access token when tokenInfo is not supplied. */
17
+ isFedrampAccount?: boolean;
16
18
  tokenInfo?: IOpenAiChatGptTokenInfo;
17
19
  originator?: string;
18
20
  }
@@ -37,6 +39,9 @@ export interface IOpenAiChatGptAuthOptions {
37
39
  safeErrors?: boolean;
38
40
  }
39
41
 
42
+ /** A failed refresh is replayable only when no request was handed to fetch. */
43
+ export type TOpenAiChatGptRequestOutcome = 'notSent' | 'outcomeUnknown';
44
+
40
45
  export interface IOpenAiChatGptBrowserAuthorizationOptions extends IOpenAiChatGptAuthOptions {
41
46
  redirectUri: string;
42
47
  originator?: string;
@@ -86,4 +91,3 @@ export interface IOpenAiChatGptDeviceCodePollOptions extends IOpenAiChatGptAuthO
86
91
  export interface IOpenAiChatGptCompleteDeviceCodeOptions extends IOpenAiChatGptDeviceCodePollOptions {
87
92
  forcedChatGptWorkspaceId?: string;
88
93
  }
89
-