From 7e1c860ffe509f6ffe190d03e9261ef1c8fd3db3 Mon Sep 17 00:00:00 2001 From: Ryan Crabbe Date: Wed, 11 Mar 2026 16:52:25 -0700 Subject: [PATCH] fix: make token breakdown cards click-to-expand on Total Tokens card --- .../components/UsagePageView.test.tsx | 2 + .../UsagePage/components/UsagePageView.tsx | 85 +++++++++++-------- 2 files changed, 51 insertions(+), 36 deletions(-) diff --git a/ui/litellm-dashboard/src/components/UsagePage/components/UsagePageView.test.tsx b/ui/litellm-dashboard/src/components/UsagePage/components/UsagePageView.test.tsx index 410d751017..b9fe1687e6 100644 --- a/ui/litellm-dashboard/src/components/UsagePage/components/UsagePageView.test.tsx +++ b/ui/litellm-dashboard/src/components/UsagePage/components/UsagePageView.test.tsx @@ -249,6 +249,8 @@ vi.mock("@ant-design/icons", async () => { CalendarOutlined: Icon, InfoCircleOutlined: Icon, UserOutlined: Icon, + DownOutlined: Icon, + RightOutlined: Icon, LoadingOutlined, }; }); diff --git a/ui/litellm-dashboard/src/components/UsagePage/components/UsagePageView.tsx b/ui/litellm-dashboard/src/components/UsagePage/components/UsagePageView.tsx index 1de28e3de3..9f3fec67aa 100644 --- a/ui/litellm-dashboard/src/components/UsagePage/components/UsagePageView.tsx +++ b/ui/litellm-dashboard/src/components/UsagePage/components/UsagePageView.tsx @@ -6,7 +6,7 @@ * Works at 1m+ spend logs, by querying an aggregate table instead. */ -import { InfoCircleOutlined, LoadingOutlined } from "@ant-design/icons"; +import { DownOutlined, InfoCircleOutlined, LoadingOutlined, RightOutlined } from "@ant-design/icons"; import { BarChart, Card, @@ -148,6 +148,7 @@ const UsagePage: React.FC = ({ teams, organizations }) => { const [showCredentialBanner, setShowCredentialBanner] = useState(true); const [topKeysLimit, setTopKeysLimit] = useState(5); const [topModelsLimit, setTopModelsLimit] = useState(5); + const [showTokenBreakdown, setShowTokenBreakdown] = useState(false); const getAllTags = async () => { if (!accessToken) { return; @@ -640,47 +641,59 @@ const UsagePage: React.FC = ({ teams, organizations }) => { )} - - Total Tokens + setShowTokenBreakdown(!showTokenBreakdown)} + > +
+ Total Tokens + {showTokenBreakdown ? ( + + ) : ( + + )} +
{userSpendData.metadata?.total_tokens?.toLocaleString() || 0}
-
-
- - Input Tokens - - {userSpendData.metadata?.total_prompt_tokens?.toLocaleString() || 0} - - + {showTokenBreakdown && ( +
+
+ + Input Tokens + + {userSpendData.metadata?.total_prompt_tokens?.toLocaleString() || 0} + + +
+
+ + Output Tokens + + {userSpendData.metadata?.total_completion_tokens?.toLocaleString() || 0} + + +
+
+ + Cache Read Tokens + + {userSpendData.metadata?.total_cache_read_input_tokens?.toLocaleString() || 0} + + +
+
+ + Cache Write Tokens + + {userSpendData.metadata?.total_cache_creation_input_tokens?.toLocaleString() || 0} + + +
-
- - Output Tokens - - {userSpendData.metadata?.total_completion_tokens?.toLocaleString() || 0} - - -
-
- - Cache Read Tokens - - {userSpendData.metadata?.total_cache_read_input_tokens?.toLocaleString() || 0} - - -
-
- - Cache Write Tokens - - {userSpendData.metadata?.total_cache_creation_input_tokens?.toLocaleString() || 0} - - -
-
+ )}