diff --git a/ui/litellm-dashboard/src/components/per_user_usage.tsx b/ui/litellm-dashboard/src/components/per_user_usage.tsx index 59aed14292e..48f225256f5 100644 --- a/ui/litellm-dashboard/src/components/per_user_usage.tsx +++ b/ui/litellm-dashboard/src/components/per_user_usage.tsx @@ -1,7 +1,6 @@ -import React, { useState, useEffect } from "react"; +import React, { useCallback, useState, useEffect } from "react"; +// eslint-disable-next-line litellm-ui/no-banned-ui-imports import { - Title, - Subtitle, Table, TableHead, TableRow, @@ -9,14 +8,13 @@ import { TableBody, TableCell, BarChart, - Text, - Button, Tab, TabGroup, TabList, TabPanel, TabPanels, } from "@tremor/react"; +import { Button } from "@/components/ui/button"; import { perUserAnalyticsCall } from "./networking"; interface PerUserMetrics { @@ -55,10 +53,11 @@ const PerUserUsage: React.FC = ({ accessToken, selectedTags, total_pages: 0, }); - const [loading, setLoading] = useState(false); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [_loading, setLoading] = useState(false); const [currentPage, setCurrentPage] = useState(1); - const fetchPerUserData = async () => { + const fetchPerUserData = useCallback(async () => { if (!accessToken) return; setLoading(true); @@ -75,11 +74,11 @@ const PerUserUsage: React.FC = ({ accessToken, selectedTags, } finally { setLoading(false); } - }; + }, [accessToken, currentPage, selectedTags]); useEffect(() => { fetchPerUserData(); - }, [accessToken, selectedTags, currentPage]); + }, [fetchPerUserData]); const handleNextPage = () => { if (currentPage < perUserData.total_pages) { @@ -95,8 +94,10 @@ const PerUserUsage: React.FC = ({ accessToken, selectedTags, return (
- Per User Usage - Individual developer usage metrics +

Per User Usage

+

+ Individual developer usage metrics +

@@ -120,39 +121,56 @@ const PerUserUsage: React.FC = ({ accessToken, selectedTags, - {perUserData.results.slice(0, 10).map((item: PerUserMetrics, index: number) => ( - - - {item.user_id} - - - {item.user_email || "N/A"} - - - {item.user_agent || "Unknown"} - - - {formatAbbreviatedNumber(item.successful_requests)} - - - {formatAbbreviatedNumber(item.total_tokens)} - - - {formatAbbreviatedNumber(item.failed_requests)} - - - ${formatAbbreviatedNumber(item.spend, 4)} - - - ))} + {perUserData.results + .slice(0, 10) + .map((item: PerUserMetrics, index: number) => ( + + + {item.user_id} + + + {item.user_email || "N/A"} + + + {item.user_agent || "Unknown"} + + + + {formatAbbreviatedNumber(item.successful_requests)} + + + + + {formatAbbreviatedNumber(item.total_tokens)} + + + + + {formatAbbreviatedNumber(item.failed_requests)} + + + + + ${formatAbbreviatedNumber(item.spend, 4)} + + + + ))} {perUserData.results.length > 10 && (
- Showing 10 of {perUserData.total_count} results + + Showing 10 of {perUserData.total_count} results +
-