diff --git a/ui/litellm-dashboard/src/components/usage.tsx b/ui/litellm-dashboard/src/components/usage.tsx index d96184b9a..33f0c8445 100644 --- a/ui/litellm-dashboard/src/components/usage.tsx +++ b/ui/litellm-dashboard/src/components/usage.tsx @@ -3,7 +3,7 @@ import { BarChart, BarList, Card, Title, Table, TableHead, TableHeaderCell, Tabl import React, { useState, useEffect } from "react"; import ViewUserSpend from "./view_user_spend"; -import { Grid, Col, Text, LineChart, TabPanel, TabPanels, TabGroup, TabList, Tab } from "@tremor/react"; +import { Grid, Col, Text, LineChart, TabPanel, TabPanels, TabGroup, TabList, Tab, Select, SelectItem } from "@tremor/react"; import { userSpendLogsCall, keyInfoCall, @@ -13,6 +13,8 @@ import { teamSpendLogsCall, tagsSpendLogsCall, modelMetricsCall, + modelAvailableCall, + modelInfoCall, } from "./networking"; import { start } from "repl"; @@ -146,6 +148,8 @@ const UsagePage: React.FC = ({ const [totalSpendPerTeam, setTotalSpendPerTeam] = useState([]); const [modelMetrics, setModelMetrics] = useState([]); const [modelLatencyMetrics, setModelLatencyMetrics] = useState([]); + const [modelGroups, setModelGroups] = useState([]); + const [selectedModelGroup, setSelectedModelGroup] = useState(null); const firstDay = new Date( currentDate.getFullYear(), @@ -227,7 +231,25 @@ const UsagePage: React.FC = ({ const top_tags = await tagsSpendLogsCall(accessToken); setTopTagsData(top_tags.top_10_tags); - + // get model groups + const _model_groups = await modelInfoCall(accessToken, userID, userRole); + let model_groups = _model_groups.data; + console.log("model groups in model dashboard", model_groups); + + let available_model_groups = []; + // loop through each model in model_group, access litellm_params and only inlclude the model if model["litellm_params"]["model"] startswith "azure/" + for (let i = 0; i < model_groups.length; i++) { + let model = model_groups[i]; + console.log("model check", model); + let model_group = model["litellm_params"]["model"]; + console.log("model group", model_group); + if (model_group.startsWith("azure/")) { + available_model_groups.push(model["model_name"]); + } + } + setModelGroups(available_model_groups); + + } else if (userRole == "App Owner") { await userSpendLogsCall( accessToken, @@ -268,7 +290,8 @@ const UsagePage: React.FC = ({ const modelMetricsResponse = await modelMetricsCall( accessToken, userID, - userRole + userRole, + null ); console.log("Model metrics response:", modelMetricsResponse); @@ -288,6 +311,31 @@ const UsagePage: React.FC = ({ } }, [accessToken, token, userRole, userID, startTime, endTime]); + + const updateModelMetrics = async (modelGroup: string | null) => { + console.log("Updating model metrics for group:", modelGroup); + if (!accessToken || !userID || !userRole) { + return + } + setSelectedModelGroup(modelGroup); // If you want to store the selected model group in state + + + try { + const modelMetricsResponse = await modelMetricsCall(accessToken, userID, userRole, modelGroup); + console.log("Model metrics response:", modelMetricsResponse); + + // Assuming modelMetricsResponse now contains the metric data for the specified model group + const sortedByLatency = [...modelMetricsResponse].sort((a, b) => b.avg_latency_seconds - a.avg_latency_seconds); + console.log("Sorted by latency:", sortedByLatency); + + setModelMetrics(modelMetricsResponse); + setModelLatencyMetrics(sortedByLatency); + } catch (error) { + console.error("Failed to fetch model metrics", error); + } + } + + return (
= ({ - + Spend Per Tag - Last 30 Days @@ -445,6 +493,27 @@ const UsagePage: React.FC = ({ + + Number Requests per Model