fix(codex): format reset credit API errors (#3778)

This commit is contained in:
Raisal P Wardana
2026-09-05 21:15:26 +07:00
parent 97f3ab97b1
commit 1a3d446831
2 changed files with 19 additions and 1 deletions

View File

@@ -21,6 +21,13 @@ function toIsoDate(value) {
return Number.isFinite(time) ? date.toISOString() : null;
}
function errorMessage(value, fallback) {
if (!value) return fallback;
if (typeof value === "string") return value;
if (typeof value.message === "string") return value.message;
return JSON.stringify(value);
}
function getCodexAccountId(providerSpecificData) {
return providerSpecificData?.workspaceId || providerSpecificData?.accountId || providerSpecificData?.chatgptAccountId || null;
}
@@ -162,7 +169,7 @@ export async function getCodexRateLimitResetCredits(accessToken, proxyOptions =
}
if (!response.ok) {
const message = data?.message || data?.error || data?.detail || `Codex reset credits API unavailable (${response.status}).`;
const message = errorMessage(data?.message || data?.error || data?.detail, `Codex reset credits API unavailable (${response.status}).`);
throw new Error(message);
}

View File

@@ -91,6 +91,17 @@ describe("Codex reset credits", () => {
});
});
it("surfaces structured upstream errors as readable messages", async () => {
mocks.proxyAwareFetch.mockResolvedValue({
ok: false,
status: 403,
json: async () => ({ error: { message: "Reset credits are unavailable for this account" } }),
});
const { getCodexRateLimitResetCredits } = await import("../../open-sse/services/usage/codex.js");
await expect(getCodexRateLimitResetCredits("token")).rejects.toThrow("Reset credits are unavailable for this account");
});
it("GET refreshes OAuth credentials before returning reset credit details", async () => {
const connection = {
id: "conn_1",