diff --git a/ui/litellm-dashboard/src/components/model_dashboard/model_alias_management.tsx b/ui/litellm-dashboard/src/components/model_dashboard/model_alias_management.tsx index 8b6011a629a..c7ea458d042 100644 --- a/ui/litellm-dashboard/src/components/model_dashboard/model_alias_management.tsx +++ b/ui/litellm-dashboard/src/components/model_dashboard/model_alias_management.tsx @@ -9,17 +9,25 @@ import { TableHeaderCell, TableCell, TableBody, - Button } from "@tremor/react"; import { Input, Select, message, - Button as AntdButton, + Button, + Form, + Spin, + Tooltip, + Space, + Empty, + Divider, } from "antd"; import { PencilIcon, TrashIcon, + PlusIcon, + InformationCircleIcon, + RefreshIcon, } from "@heroicons/react/outline"; import { getRouterSettings, updateRouterSettings } from "../networking"; @@ -39,6 +47,8 @@ const ModelAliasManagement: React.FC = ({ const [selectedModelForAlias, setSelectedModelForAlias] = useState(""); const [editingAlias, setEditingAlias] = useState(null); const [isLoading, setIsLoading] = useState(false); + const [formLoading, setFormLoading] = useState(false); + const [form] = Form.useForm(); // Fetch router settings useEffect(() => { @@ -51,7 +61,6 @@ const ModelAliasManagement: React.FC = ({ setIsLoading(true); try { const settings = await getRouterSettings(accessToken); - console.log("Router settings response:", settings); // Log the response for debugging // Check both possible structures for model_group_alias if (settings?.router_settings?.model_group_alias) { @@ -71,45 +80,52 @@ const ModelAliasManagement: React.FC = ({ }; // Handle adding or updating a model group alias - const handleSaveModelGroupAlias = async () => { - if (!accessToken || !newAliasName || !selectedModelForAlias) { + const handleSaveModelGroupAlias = async (values: any) => { + const { aliasName, targetModel } = values; + + if (!accessToken || !aliasName || !targetModel) { message.error("Alias name and model selection are required"); return; } - setIsLoading(true); + setFormLoading(true); try { const updatedAliases = { ...modelGroupAliases }; // If editing, remove the old alias first - if (editingAlias && editingAlias !== newAliasName) { + if (editingAlias && editingAlias !== aliasName) { delete updatedAliases[editingAlias]; } - updatedAliases[newAliasName] = selectedModelForAlias; + updatedAliases[aliasName] = targetModel; await updateRouterSettings(accessToken, { model_group_alias: updatedAliases }); setModelGroupAliases(updatedAliases); - setNewAliasName(""); - setSelectedModelForAlias(""); + form.resetFields(); setEditingAlias(null); - message.success(`Model group alias ${editingAlias ? 'updated' : 'created'} successfully`); + message.success({ + content: `Model alias ${editingAlias ? 'updated' : 'created'} successfully`, + key: 'aliasUpdate', + }); onRefresh(); } catch (error) { console.error("Failed to save model group alias:", error); - message.error(`Failed to ${editingAlias ? 'update' : 'create'} model group alias`); + message.error({ + content: `Failed to ${editingAlias ? 'update' : 'create'} model alias`, + key: 'aliasError', + }); } finally { - setIsLoading(false); + setFormLoading(false); } }; // Handle deleting a model group alias const handleDeleteModelGroupAlias = async (aliasName: string) => { - setIsLoading(true); + setFormLoading(true); try { const updatedAliases = { ...modelGroupAliases }; delete updatedAliases[aliasName]; @@ -119,125 +135,191 @@ const ModelAliasManagement: React.FC = ({ }); setModelGroupAliases(updatedAliases); - message.success(`Model group alias deleted successfully`); + message.success({ + content: "Model alias deleted successfully", + key: 'aliasDelete', + }); onRefresh(); } catch (error) { console.error("Failed to delete model group alias:", error); - message.error("Failed to delete model group alias"); + message.error({ + content: "Failed to delete model alias", + key: 'aliasDeleteError', + }); } finally { - setIsLoading(false); + setFormLoading(false); } }; // Handle editing a model group alias const handleEditModelGroupAlias = (aliasName: string) => { setEditingAlias(aliasName); - setNewAliasName(aliasName); - setSelectedModelForAlias(modelGroupAliases[aliasName] || ""); + form.setFieldsValue({ + aliasName: aliasName, + targetModel: modelGroupAliases[aliasName] || "", + }); + }; + + const handleCancelEdit = () => { + form.resetFields(); + setEditingAlias(null); }; return ( - - Model Group Aliases - - Map model alias names to actual model names. Aliases can be used interchangeably with the original model names in API calls. - - -
-
-
-
- Alias Name - setNewAliasName(e.target.value)} - /> -
- -
- Target Model - -
- - - {editingAlias ? "Update" : "Add"} Alias - - - {editingAlias && ( - { - setEditingAlias(null); - setNewAliasName(""); - setSelectedModelForAlias(""); - }} - disabled={isLoading} - > - Cancel - - )} -
-
+ +
+
+ Model Group Aliases + + Map model alias names to actual model names. Aliases can be used interchangeably with the original model names in API calls. + +
+ +
- - - - Alias Name - Target Model - Actions - - - - {Object.entries(modelGroupAliases).map(([alias, model], idx) => ( - - {alias} - {model} - -
-
-
-
- ))} - {Object.keys(modelGroupAliases).length === 0 && ( - - - No model group aliases defined - - - )} -
-
+ + +
+
+ + + + + } + /> + + + + + + +
+ + + + + {editingAlias && ( + + + + )} +
+
+
+ + +
+ + + + Alias Name + Target Model + Actions + + + + {Object.entries(modelGroupAliases).map(([alias, model], idx) => ( + + {alias} + {model} + + + + + + + + )} + +
+
+
); };