diff --git a/ui/litellm-dashboard/src/components/edit_user.tsx b/ui/litellm-dashboard/src/components/edit_user.tsx index 850793d01b7..4932abe1927 100644 --- a/ui/litellm-dashboard/src/components/edit_user.tsx +++ b/ui/litellm-dashboard/src/components/edit_user.tsx @@ -23,12 +23,13 @@ import { interface EditUserModalProps { visible: boolean; + possibleUIRoles: null | Record>; onCancel: () => void; user: any; onSubmit: (data: any) => void; } -const EditUserModal: React.FC = ({ visible, onCancel, user, onSubmit }) => { +const EditUserModal: React.FC = ({ visible, possibleUIRoles, onCancel, user, onSubmit }) => { const [editedUser, setEditedUser] = useState(user); const [form] = Form.useForm(); @@ -94,9 +95,15 @@ const EditUserModal: React.FC = ({ visible, onCancel, user, name="user_role" > - Proxy Admin (Can create, edit, delete keys, teams) - Proxy Viewer (Can just view spend, cannot created keys, teams) - + {possibleUIRoles && + Object.entries(possibleUIRoles).map(([role, { ui_label, description }]) => ( + +
+ {ui_label}

{description}

+
+
+ ))} + diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index 523c951b595..5299c0392af 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -1390,6 +1390,34 @@ export const userGetAllUsersCall = async ( } }; +export const getPossibleUserRoles = async ( + accessToken: String, +) => { + try { + const url = proxyBaseUrl + ? `${proxyBaseUrl}/user/available_roles` + : `/user/available_roles`; + const response = await fetch(url, { + method: "GET", + headers: { + Authorization: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + }); + + if (!response.ok) { + const errorData = await response.text(); + throw new Error("Network response was not ok"); + } + const data = await response.json(); + console.log("response from user/available_role", data); + return data; + // Handle success - you might want to update some state or UI based on the created key + } catch (error) { + throw error; + } +}; + export const teamCreateCall = async ( accessToken: string, formValues: Record // Assuming formValues is an object diff --git a/ui/litellm-dashboard/src/components/view_users.tsx b/ui/litellm-dashboard/src/components/view_users.tsx index b87524bc6e9..9e289132850 100644 --- a/ui/litellm-dashboard/src/components/view_users.tsx +++ b/ui/litellm-dashboard/src/components/view_users.tsx @@ -24,7 +24,7 @@ import { Icon, TextInput, } from "@tremor/react"; -import { userInfoCall, userUpdateUserCall } from "./networking"; +import { userInfoCall, userUpdateUserCall, getPossibleUserRoles } from "./networking"; import { Badge, BadgeDelta, Button } from "@tremor/react"; import RequestAccess from "./request_model_access"; import CreateUser from "./create_user_button"; @@ -63,6 +63,7 @@ const ViewUserDashboard: React.FC = ({ const [selectedItem, setSelectedItem] = useState(null); const [editModalVisible, setEditModalVisible] = useState(false); const [selectedUser, setSelectedUser] = useState(null); + const [possibleUIRoles, setPossibleUIRoles] = useState>>({}); const defaultPageSize = 25; const handleEditCancel = async () => { @@ -107,11 +108,16 @@ const ViewUserDashboard: React.FC = ({ ); console.log("user data response:", userDataResponse); setUserData(userDataResponse); + + const availableUserRoles = await getPossibleUserRoles(accessToken); + setPossibleUIRoles(availableUserRoles); + } catch (error) { console.error("There was an error fetching the model data", error); } }; + if (accessToken && token && userRole && userID) { fetchData(); } @@ -283,6 +289,7 @@ const ViewUserDashboard: React.FC = ({