From 456f2a2635a3031768bd01c5918d87479033f783 Mon Sep 17 00:00:00 2001 From: decolua Date: Thu, 13 Aug 2026 11:31:07 +0700 Subject: [PATCH] feat(usage): wire force flag through client + usage route MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Manual refresh (↻) sends ?force=1 so it bypasses the Claude quota cache (dedup + TTL) added in cd4003bc. Auto-refresh and multi-tab stays cached, so Anthropic's usage endpoint is no longer hammered. Co-Authored-By: Claude --- .../dashboard/usage/components/ProviderLimits/index.js | 7 ++++--- src/app/api/usage/[connectionId]/route.js | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js b/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js index eb486cc0..c55633c2 100644 --- a/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js +++ b/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js @@ -216,7 +216,7 @@ export default function ProviderLimits() { ); // Fetch quota for a specific connection - const fetchQuota = useCallback(async (connectionId, provider) => { + const fetchQuota = useCallback(async (connectionId, provider, { force = false } = {}) => { setLoading((prev) => ({ ...prev, [connectionId]: true })); setErrors((prev) => ({ ...prev, [connectionId]: null })); @@ -224,7 +224,8 @@ export default function ProviderLimits() { console.log( `[ProviderLimits] Fetching quota for ${provider} (${connectionId})`, ); - const response = await fetch(`/api/usage/${connectionId}`); + const url = `/api/usage/${connectionId}${force ? "?force=1" : ""}`; + const response = await fetch(url); if (!response.ok) { const errorData = await response.json().catch(() => ({})); @@ -295,7 +296,7 @@ export default function ProviderLimits() { // Refresh quota for a specific provider const refreshProvider = useCallback( async (connectionId, provider) => { - await fetchQuota(connectionId, provider); + await fetchQuota(connectionId, provider, { force: true }); setLastUpdated(new Date()); }, [fetchQuota], diff --git a/src/app/api/usage/[connectionId]/route.js b/src/app/api/usage/[connectionId]/route.js index 8ccdc015..84dd7674 100644 --- a/src/app/api/usage/[connectionId]/route.js +++ b/src/app/api/usage/[connectionId]/route.js @@ -123,6 +123,7 @@ export async function GET(request, { params }) { let connection; try { const { connectionId } = await params; + const force = new URL(request.url).searchParams.get("force") === "1"; // Get connection from database @@ -168,7 +169,7 @@ export async function GET(request, { params }) { } // Fetch usage from provider API - let usage = await getUsageForProvider(connection, proxyOptions); + let usage = await getUsageForProvider(connection, proxyOptions, { force }); // If provider returned an auth-expired message instead of throwing, // force-refresh token and retry once (OAuth only) @@ -176,7 +177,7 @@ export async function GET(request, { params }) { try { const retryResult = await refreshAndUpdateCredentials(connection, true, proxyOptions); connection = retryResult.connection; - usage = await getUsageForProvider(connection, proxyOptions); + usage = await getUsageForProvider(connection, proxyOptions, { force }); } catch (retryError) { console.warn(`[Usage] ${connection.provider}: force refresh failed: ${retryError.message}`); }