diff --git a/ui/litellm-dashboard/src/components/model_dashboard.tsx b/ui/litellm-dashboard/src/components/model_dashboard.tsx index 2491b40e62..a48736f14b 100644 --- a/ui/litellm-dashboard/src/components/model_dashboard.tsx +++ b/ui/litellm-dashboard/src/components/model_dashboard.tsx @@ -18,7 +18,7 @@ import { } from "@tremor/react"; import { TabPanel, TabPanels, TabGroup, TabList, Tab, TextInput, Icon } from "@tremor/react"; import { Select, SelectItem, MultiSelect, MultiSelectItem } from "@tremor/react"; -import { modelInfoCall, userGetRequesedtModelsCall, modelCreateCall, Model, modelCostMap, modelDeleteCall, healthCheckCall, modelUpdateCall } from "./networking"; +import { modelInfoCall, userGetRequesedtModelsCall, modelCreateCall, Model, modelCostMap, modelDeleteCall, healthCheckCall, modelUpdateCall, modelMetricsCall } from "./networking"; import { BarChart } from "@tremor/react"; import { Button as Button2, @@ -200,6 +200,8 @@ const ModelDashboard: React.FC = ({ const [selectedModel, setSelectedModel] = useState(null); const [availableModelGroups, setAvailableModelGroups] = useState>([]); const [selectedModelGroup, setSelectedModelGroup] = useState(null); + const [modelLatencyMetrics, setModelLatencyMetrics] = useState([]); + const [modelMetrics, setModelMetrics] = useState([]); const EditModelModal: React.FC = ({ visible, onCancel, model, onSubmit }) => { const [form] = Form.useForm(); @@ -445,12 +447,20 @@ const handleEditSubmit = async (formValues: Record) => { let _array_model_groups = Array.from(all_model_groups) setAvailableModelGroups(_array_model_groups); - // if userRole is Admin, show the pending requests - if (userRole === "Admin" && accessToken) { - const user_requests = await userGetRequesedtModelsCall(accessToken); - console.log("Pending Requests:", pendingRequests); - setPendingRequests(user_requests.requests || []); - } + const modelMetricsResponse = await modelMetricsCall( + accessToken, + userID, + userRole, + null + ); + + console.log("Model metrics response:", modelMetricsResponse); + // Sort by latency (avg_latency_seconds) + 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("There was an error fetching the model data", error); } @@ -603,6 +613,30 @@ const handleEditSubmit = async (formValues: Record) => { }; + 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); + } + } + + const getPlaceholder = (selectedProvider: string): string => { if (selectedProvider === Providers.Vertex_AI) { @@ -639,6 +673,7 @@ const handleEditSubmit = async (formValues: Record) => {
All Models Add Model + Model Analytics
/health Models
@@ -944,6 +979,59 @@ const handleEditSubmit = async (formValues: Record) => { + +

View how requests were load balanced within a model group

+

(Beta feature) only supported for Azure Model Groups

+ + + + + Number Requests per Model + + + + Latency Per Model + + + +
`/health` will run a very small request through your models configured on litellm