diff --git a/ui/litellm-dashboard/.eslintrc.json b/ui/litellm-dashboard/.eslintrc.json index b00d944a961..c1b974f1f0a 100644 --- a/ui/litellm-dashboard/.eslintrc.json +++ b/ui/litellm-dashboard/.eslintrc.json @@ -84,6 +84,7 @@ "src/components/team/available_teams.tsx", "src/components/AIHub/forms/MakeAgentPublicForm.tsx", "src/components/AIHub/forms/MakeMCPPublicForm.tsx", + "src/components/AIHub/forms/MakeModelPublicForm.tsx", "src/components/permissions/VectorStorePermissions.tsx", "src/components/permissions/AgentPermissions.tsx", "src/components/permissions/MCPServerPermissions.tsx", diff --git a/ui/litellm-dashboard/src/components/AIHub/forms/MakeModelPublicForm.tsx b/ui/litellm-dashboard/src/components/AIHub/forms/MakeModelPublicForm.tsx index 16ed04c1779..95ef399f1a2 100644 --- a/ui/litellm-dashboard/src/components/AIHub/forms/MakeModelPublicForm.tsx +++ b/ui/litellm-dashboard/src/components/AIHub/forms/MakeModelPublicForm.tsx @@ -1,6 +1,14 @@ import React, { useState, useCallback, useEffect } from "react"; -import { Modal, Form, Steps, Button, Checkbox } from "antd"; -import { Text, Title, Badge } from "@tremor/react"; +import { Form, Steps } from "antd"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; import { makeModelGroupPublic } from "../../networking"; import ModelFilters from "../../model_filters"; import NotificationsManager from "../../molecules/notifications_manager"; @@ -22,6 +30,7 @@ interface ModelGroupInfo { supports_function_calling: boolean; supported_openai_params?: string[]; is_public_model_group: boolean; + // eslint-disable-next-line @typescript-eslint/no-explicit-any [key: string]: any; } @@ -57,7 +66,9 @@ const MakeModelPublicForm: React.FC = ({ const handleNext = () => { if (currentStep === 0) { if (selectedModels.size === 0) { - NotificationsManager.fromBackend("Please select at least one model to make public"); + NotificationsManager.fromBackend( + "Please select at least one model to make public", + ); return; } setCurrentStep(1); @@ -89,17 +100,17 @@ const MakeModelPublicForm: React.FC = ({ } }; - const handleFilteredDataChange = useCallback((newFilteredData: ModelGroupInfo[]) => { - setFilteredData(newFilteredData); - // Keep existing selections when filters change - don't clear them - }, []); + const handleFilteredDataChange = useCallback( + (newFilteredData: ModelGroupInfo[]) => { + setFilteredData(newFilteredData); + }, + [], + ); - // Initialize filtered data and preselect already public models when modal opens useEffect(() => { if (visible && modelHubData.length > 0) { setFilteredData(modelHubData); - // Preselect models that are already public const alreadyPublicModels = modelHubData .filter((model) => model.is_public_model_group === true) .map((model) => model.model_group); @@ -110,7 +121,9 @@ const MakeModelPublicForm: React.FC = ({ const handleSubmit = async () => { if (selectedModels.size === 0) { - NotificationsManager.fromBackend("Please select at least one model to make public"); + NotificationsManager.fromBackend( + "Please select at least one model to make public", + ); return; } @@ -119,12 +132,16 @@ const MakeModelPublicForm: React.FC = ({ const modelGroupsToMakePublic = Array.from(selectedModels); await makeModelGroupPublic(accessToken, modelGroupsToMakePublic); - NotificationsManager.success(`Successfully made ${modelGroupsToMakePublic.length} model group(s) public!`); + NotificationsManager.success( + `Successfully made ${modelGroupsToMakePublic.length} model group(s) public!`, + ); handleClose(); onSuccess(); } catch (error) { console.error("Error making model groups public:", error); - NotificationsManager.fromBackend("Failed to make model groups public. Please try again."); + NotificationsManager.fromBackend( + "Failed to make model groups public. Please try again.", + ); } finally { setLoading(false); } @@ -132,82 +149,96 @@ const MakeModelPublicForm: React.FC = ({ const renderStep1Content = () => { const allModelsSelected = - filteredData.length > 0 && filteredData.every((model) => selectedModels.has(model.model_group)); + filteredData.length > 0 && + filteredData.every((model) => selectedModels.has(model.model_group)); const isIndeterminate = selectedModels.size > 0 && !allModelsSelected; return (
- Select Models to Make Public -
+

Select Models to Make Public

+
+ /> + + Select All{" "} + {filteredData.length > 0 && `(${filteredData.length})`} + +
- - Select the models you want to be visible on the public model hub. Users will still require a valid Virtual Key - to use these models. - +

+ Select the models you want to be visible on the public model hub. + Users will still require a valid Virtual Key to use these models. +

{/* Filters */} -
+
{filteredData.length === 0 ? ( -
- No models match the current filters. +
+

No models match the current filters.

) : ( filteredData.map((model) => ( -
handleModelSelection(model.model_group, e.target.checked)} + onCheckedChange={(c) => + handleModelSelection(model.model_group, c === true) + } />
- {model.model_group} + {model.model_group} {model.mode && ( - + {model.mode} )}
{model.providers.map((provider) => ( - + {provider} ))}
-
+ )) )}
{selectedModels.size > 0 && ( -
- - {selectedModels.size} model{selectedModels.size !== 1 ? "s" : ""} selected - +
+

+ {selectedModels.size} model + {selectedModels.size !== 1 ? "s" : ""} selected +

)}
@@ -217,29 +248,38 @@ const MakeModelPublicForm: React.FC = ({ const renderStep2Content = () => { return (
- Confirm Making Models Public +

Confirm Making Models Public

-
- - Warning: Once you make these models public, anyone who can go to the{" "} - /ui/model_hub_table will be able to know they exist on the proxy. - +
+

+ Warning: Once you make these models public, anyone + who can go to the /ui/model_hub_table will be able to + know they exist on the proxy. +

- Models to be made public: -
+

Models to be made public:

+
{Array.from(selectedModels).map((modelGroup) => { - const model = modelHubData.find((m) => m.model_group === modelGroup); + const model = modelHubData.find( + (m) => m.model_group === modelGroup, + ); return ( -
+
- {modelGroup} + {modelGroup} {model && (
{model.providers.map((provider) => ( - + {provider} ))} @@ -253,11 +293,11 @@ const MakeModelPublicForm: React.FC = ({
-
- - Total: {selectedModels.size} model{selectedModels.size !== 1 ? "s" : ""} will be made - public - +
+

+ Total: {selectedModels.size} model + {selectedModels.size !== 1 ? "s" : ""} will be made public +

); @@ -277,7 +317,10 @@ const MakeModelPublicForm: React.FC = ({ const renderStepButtons = () => { return (
- @@ -289,8 +332,8 @@ const MakeModelPublicForm: React.FC = ({ )} {currentStep === 1 && ( - )}
@@ -299,24 +342,25 @@ const MakeModelPublicForm: React.FC = ({ }; return ( - (!o ? handleClose() : undefined)} > -
- - - - + + + Make Models Public + + + + + + - {renderStepContent()} - {renderStepButtons()} - -
+ {renderStepContent()} + {renderStepButtons()} + + + ); };