diff --git a/ui/litellm-dashboard/src/app/page.tsx b/ui/litellm-dashboard/src/app/page.tsx index a0c7b46a9..382d72b8d 100644 --- a/ui/litellm-dashboard/src/app/page.tsx +++ b/ui/litellm-dashboard/src/app/page.tsx @@ -10,6 +10,7 @@ import AdminPanel from "@/components/admins"; import Settings from "@/components/settings"; import GeneralSettings from "@/components/general_settings"; import BudgetPanel from "@/components/budgets/budget_panel"; +import ModelHub from "@/components/model_hub"; import APIRef from "@/components/api_ref"; import ChatUI from "@/components/chat_ui"; import Sidebar from "../components/leftnav"; @@ -193,7 +194,17 @@ const CreateKeyPage = () => { accessToken={accessToken} modelData={modelData} /> - ) : ( + ) : page == "model-hub" ? ( + + ) + : ( = ({ setPage("api_ref")}> API Reference + setPage("model-hub")}> + Model Hub + diff --git a/ui/litellm-dashboard/src/components/model_hub.tsx b/ui/litellm-dashboard/src/components/model_hub.tsx new file mode 100644 index 000000000..22456ae64 --- /dev/null +++ b/ui/litellm-dashboard/src/components/model_hub.tsx @@ -0,0 +1,200 @@ +import React, { useEffect, useState } from 'react'; + +import { modelHubCall } from "./networking"; + +import { Card, Text, Title, Grid, Button } from "@tremor/react"; + +import { RightOutlined } from '@ant-design/icons'; + +import { Modal } from 'antd'; + + +interface ModelHubProps { + + userID: string; + + userRole: string; + + token: string; + + accessToken: string; + + keys: any; // Replace with the appropriate type for 'keys' prop + + premiumUser: boolean; + +} + + + +const ModelHub: React.FC = ({ + + userID, + + userRole, + + token, + + accessToken, + + keys, + + premiumUser, + +}) => { + + const [modelHubData, setModelHubData] = useState(null); + + const [isModalVisible, setIsModalVisible] = useState(false); + + const [selectedModel, setSelectedModel] = useState(null); + + + useEffect(() => { + + if (!accessToken || !token || !userRole || !userID) { + + return; + + } + + + + const fetchData = async () => { + + try { + + const _modelHubData = await modelHubCall(accessToken, userID, userRole); + + console.log("ModelHubData:", _modelHubData); + + setModelHubData(_modelHubData.data); + + + + } catch (error) { + + console.error("There was an error fetching the model data", error); + + } + + }; + + + + fetchData(); + + }, [accessToken, token, userRole, userID]); + + + + const showModal = (model) => { + + setSelectedModel(model); + + setIsModalVisible(true); + + }; + + + + const handleOk = () => { + + setIsModalVisible(false); + + setSelectedModel(null); + + }; + + + + const handleCancel = () => { + + setIsModalVisible(false); + + setSelectedModel(null); + + }; + + + + return ( + + + + Model Hub + + + + + + {modelHubData && modelHubData.map((model: any) => ( + + + + + {model.model_name} + + + + + + showModal(model)} style={{ color: '#1890ff', fontSize: 'smaller' }}> + + View more + + + + + + + + ))} + + + + + + + + {selectedModel && ( + + + + Model Name: {selectedModel.model_name} + + Additional Params: {JSON.stringify(selectedModel.litellm_params)} + + {/* Add other model details here */} + + + + )} + + + + + + ); + +}; + + + +export default ModelHub; \ No newline at end of file diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index 28964a4a8..0a01c10e4 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -579,6 +579,46 @@ export const modelInfoCall = async ( } }; + +export const modelHubCall = async ( + accessToken: String, + userID: String, + userRole: String +) => { + /** + * Get all models on proxy + */ + try { + let url = proxyBaseUrl ? `${proxyBaseUrl}/v2/model/info` : `/v2/model/info`; + + //message.info("Requesting model data"); + const response = await fetch(url, { + method: "GET", + headers: { + Authorization: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + }); + + if (!response.ok) { + const errorData = await response.text(); + message.error(errorData, 10); + throw new Error("Network response was not ok"); + } + + const data = await response.json(); + console.log("modelHubCall:", data); + //message.info("Received model data"); + return data; + // Handle success - you might want to update some state or UI based on the created key + } catch (error) { + console.error("Failed to create key:", error); + throw error; + } +}; + + + export const modelMetricsCall = async ( accessToken: String, userID: String,
+ + {model.model_name} + +
Model Name: {selectedModel.model_name}
Additional Params: {JSON.stringify(selectedModel.litellm_params)}