diff --git a/ui/litellm-dashboard/src/components/model_dashboard.tsx b/ui/litellm-dashboard/src/components/model_dashboard.tsx index f57afcdf89..dbd5c7c94d 100644 --- a/ui/litellm-dashboard/src/components/model_dashboard.tsx +++ b/ui/litellm-dashboard/src/components/model_dashboard.tsx @@ -114,7 +114,7 @@ const ModelDashboard: React.FC = ({ {model.provider} - {model.user_access ? Yes : } + {model.user_access ? Yes : } {model.input_cost} diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index 3a22350411..ccdc279d23 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -292,3 +292,38 @@ export const spendUsersCall = async (accessToken: String, userID: String) => { throw error; } }; + + + + +export const userRequestModelCall = async (accessToken: String, model: String, UserID: String, justification: String) => { + try { + const url = proxyBaseUrl ? `${proxyBaseUrl}/user/request_model` : `user/request_model`; + const response = await fetch(url, { + method: "POST", + headers: { + Authorization: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + body: JSON.stringify({ + models: [model], + user_id: UserID, + justification: justification, + }), + }); + + if (!response.ok) { + const errorData = await response.text(); + message.error("Failed to delete key: " + errorData); + throw new Error("Network response was not ok"); + } + const data = await response.json(); + console.log(data); + message.success(""); + 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; + } +}; \ No newline at end of file diff --git a/ui/litellm-dashboard/src/components/request_model_access.tsx b/ui/litellm-dashboard/src/components/request_model_access.tsx index fa1d33a077..c884d03b2c 100644 --- a/ui/litellm-dashboard/src/components/request_model_access.tsx +++ b/ui/litellm-dashboard/src/components/request_model_access.tsx @@ -3,19 +3,21 @@ import React, { useState, useEffect, useRef } from "react"; import { Modal, Form, Input, Select, InputNumber, message } from "antd"; import { Button } from "@tremor/react"; -import { keyCreateCall } from "./networking"; +import { userRequestModelCall } from "./networking"; const { Option } = Select; interface RequestAccessProps { userModels: string[]; + accessToken: string; + userID: string; } function onRequestAccess(formData: Record): void { // This function does nothing for now } -const RequestAccess: React.FC = ({ userModels }) => { +const RequestAccess: React.FC = ({ userModels, accessToken, userID }) => { const [form] = Form.useForm(); const [isModalVisible, setIsModalVisible] = useState(false); @@ -32,6 +34,17 @@ const RequestAccess: React.FC = ({ userModels }) => { const handleRequestAccess = async (formValues: Record) => { try { message.info("Requesting access"); + // Extract form values + const { selectedModel, accessReason } = formValues; + + // Call userRequestModelCall + const response = await userRequestModelCall( + accessToken, // You need to have accessToken available + selectedModel, + userID, // You need to have UserID available + accessReason + ); + onRequestAccess(formValues); setIsModalVisible(true); } catch (error) { @@ -41,7 +54,7 @@ const RequestAccess: React.FC = ({ userModels }) => { return (
-