diff --git a/apps/server/src/provider/CodexProvider.ts b/apps/server/src/provider/CodexProvider.ts index 7d4bbfdf5d0fa..4393230eeae4b 100644 --- a/apps/server/src/provider/CodexProvider.ts +++ b/apps/server/src/provider/CodexProvider.ts @@ -740,6 +740,8 @@ export const checkCodexProviderStatus = Effect.fn("checkCodexProviderStatus")(fu ? { status: "ready" as const, auth: managedAuth, message: undefined } : accountProbeStatus(snapshot); const usageLimits = + // Only a ChatGPT login has quotas; a custom model provider runs with no account. + (!snapshot.account.account && !snapshot.account.requiresOpenaiAuth) || snapshot.account.account?.type === "apiKey" ? makeUnavailableUsageLimits({ checkedAt, reason: "unsupported" }) : snapshot.rateLimits === undefined || "failure" in snapshot.rateLimits diff --git a/apps/server/src/provider/ProviderRegistry.test.ts b/apps/server/src/provider/ProviderRegistry.test.ts index d0c1f348a7366..2e4d7662551d0 100644 --- a/apps/server/src/provider/ProviderRegistry.test.ts +++ b/apps/server/src/provider/ProviderRegistry.test.ts @@ -506,6 +506,7 @@ it.layer( status.message, "Codex CLI is not authenticated. Run `codex login` and try again.", ); + assert.strictEqual(status.usageLimits?.unavailable?.reason, "probeFailed"); }), ); @@ -547,6 +548,22 @@ it.layer( }), ); + it.effect("marks usage unsupported when a custom provider runs without an account", () => + Effect.gen(function* () { + const status = yield* checkCodexProviderStatus(defaultCodexSettings, () => + Effect.succeed( + makeCodexProbeSnapshot({ + account: { account: null, requiresOpenaiAuth: false }, + rateLimits: { failure: "Codex could not read usage (JSON-RPC -32600)." }, + }), + ), + ); + + assert.strictEqual(status.status, "ready"); + assert.deepStrictEqual(status.usageLimits?.unavailable, { reason: "unsupported" }); + }), + ); + it.effect("returns an Amazon Bedrock label for codex Bedrock auth", () => Effect.gen(function* () { const status = yield* checkCodexProviderStatus(defaultCodexSettings, () =>