+ Please save this secret user somewhere safe and accessible. For
+ security reasons, you will not be able to view it again through
+ your LiteLLM account. If you lose this secret user, you will need to
+ generate a new one.
+
+
{apiuser != null ? `API user: ${apiuser}` : "User being created, this might take 30s"}
+
+ )}
+
+ );
+};
+
+export default Createuser;
diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx
index 4c4fb72d939..250515eeb84 100644
--- a/ui/litellm-dashboard/src/components/networking.tsx
+++ b/ui/litellm-dashboard/src/components/networking.tsx
@@ -69,6 +69,71 @@ export const keyCreateCall = async (
}
};
+
+export const userCreateCall = async (
+ accessToken: string,
+ userID: string,
+ formValues: Record // Assuming formValues is an object
+) => {
+ try {
+ console.log("Form Values in keyCreateCall:", formValues); // Log the form values before making the API call
+
+ // check if formValues.description is not undefined, make it a string and add it to formValues.metadata
+ if (formValues.description) {
+ // add to formValues.metadata
+ if (!formValues.metadata) {
+ formValues.metadata = {};
+ }
+ // value needs to be in "", valid JSON
+ formValues.metadata.description = formValues.description;
+ // remove descrption from formValues
+ delete formValues.description;
+ formValues.metadata = JSON.stringify(formValues.metadata);
+ }
+ // if formValues.metadata is not undefined, make it a valid dict
+ if (formValues.metadata) {
+ console.log("formValues.metadata:", formValues.metadata);
+ // if there's an exception JSON.parse, show it in the message
+ try {
+ formValues.metadata = JSON.parse(formValues.metadata);
+ } catch (error) {
+ message.error("Failed to parse metadata: " + error);
+ throw new Error("Failed to parse metadata: " + error);
+ }
+ }
+
+ console.log("Form Values after check:", formValues);
+ const url = proxyBaseUrl ? `${proxyBaseUrl}/user/new` : `/user/new`;
+ const response = await fetch(url, {
+ method: "POST",
+ headers: {
+ Authorization: `Bearer ${accessToken}`,
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ user_id: userID,
+ ...formValues, // Include formValues in the request body
+ }),
+ });
+
+ if (!response.ok) {
+ const errorData = await response.text();
+ message.error("Failed to create key: " + errorData);
+ console.error("Error response from the server:", errorData);
+ throw new Error("Network response was not ok");
+ }
+
+ const data = await response.json();
+ console.log("API Response:", 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 keyDeleteCall = async (accessToken: String, user_key: String) => {
try {
const url = proxyBaseUrl ? `${proxyBaseUrl}/key/delete` : `/key/delete`;
diff --git a/ui/litellm-dashboard/src/components/view_users.tsx b/ui/litellm-dashboard/src/components/view_users.tsx
index 9db7b878e4b..9335d73f107 100644
--- a/ui/litellm-dashboard/src/components/view_users.tsx
+++ b/ui/litellm-dashboard/src/components/view_users.tsx
@@ -3,6 +3,7 @@ import { Card, Title, Subtitle, Table, TableHead, TableRow, TableCell, TableBody
import { userInfoCall } from "./networking";
import { Badge, BadgeDelta, Button } from '@tremor/react';
import RequestAccess from "./request_model_access";
+import CreateUser from "./create_user_button";
interface ViewUserDashboardProps {
accessToken: string | null;
@@ -55,6 +56,11 @@ const ViewUserDashboard: React.FC = ({
return (