From 6ea8d094b24ec671c8f337c6287395ca82a06aa6 Mon Sep 17 00:00:00 2001 From: DavyMassoneto Date: Wed, 4 Mar 2026 18:19:17 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20invert=20utilization=20values=20?= =?UTF-8?q?=E2=80=94=20API=20returns=20remaining,=20not=20used?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The OAuth usage endpoint returns utilization as percentage remaining, not percentage used. Claude.ai showing 10% used corresponded to utilization=90 from the API. --- open-sse/services/usage.ts | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/open-sse/services/usage.ts b/open-sse/services/usage.ts index b974ce0058..e824d4f6ef 100644 --- a/open-sse/services/usage.ts +++ b/open-sse/services/usage.ts @@ -445,36 +445,45 @@ async function getClaudeUsage(accessToken) { const quotas: Record = {}; // Parse five_hour window (session limit) + // utilization = percentage remaining, not used if (data.five_hour !== undefined) { + const remaining = data.five_hour.utilization ?? 0; quotas["session (5h)"] = { - used: data.five_hour.utilization ?? 0, + used: 100 - remaining, total: 100, resetAt: data.five_hour.resets_at || null, - remainingPercentage: 100 - (data.five_hour.utilization ?? 0), + remainingPercentage: remaining, unlimited: false, }; } // Parse seven_day window (weekly limit) if (data.seven_day !== undefined) { + const remaining = data.seven_day.utilization ?? 0; quotas["weekly (7d)"] = { - used: data.seven_day.utilization ?? 0, + used: 100 - remaining, total: 100, resetAt: data.seven_day.resets_at || null, - remainingPercentage: 100 - (data.seven_day.utilization ?? 0), + remainingPercentage: remaining, unlimited: false, }; } // Parse model-specific weekly windows (e.g., seven_day_sonnet, seven_day_opus) for (const [key, value] of Object.entries(data)) { - if (key.startsWith("seven_day_") && key !== "seven_day" && value && typeof value === "object") { + if ( + key.startsWith("seven_day_") && + key !== "seven_day" && + value && + typeof value === "object" + ) { const modelName = key.replace("seven_day_", ""); + const remaining = (value as any).utilization ?? 0; quotas[`weekly ${modelName} (7d)`] = { - used: (value as any).utilization ?? 0, + used: 100 - remaining, total: 100, resetAt: (value as any).resets_at || null, - remainingPercentage: 100 - ((value as any).utilization ?? 0), + remainingPercentage: remaining, unlimited: false, }; }