From 911b0cfd736d986ff8abada919c6280fd141818c Mon Sep 17 00:00:00 2001 From: tanjiro <56165694+NANDINI-star@users.noreply.github.com> Date: Wed, 13 Aug 2025 09:21:04 +0900 Subject: [PATCH] Display Error from Backend on the UI - Keys Page (#13435) * fix sso logout - add a new login page with sso button * lint fix * lint fix * lint fix * fix tests * fix test * Revert "fix test" This reverts commit 74eb7345710892d5a9d02baec0ef389b98d0dde3. * Reapply "fix test" This reverts commit 72d0b2d4c62f6bb9351a7656ff88efc2ba91aef7. * add host to add modal * close modal after save is clicked. and auto-refresh * show old values in edit modal * send the whole payload on edit * Update settings.tsx * resolve conflict * fix conflict * merge main * first draft of notifications added to settings * add error compatibility by taking errors from the backend - db errors - auth errors * add support for different types of errors * minor * name change * email alerts page notifications modified * remove unused code * move create_key to organisms/ folder * move view_key_table to templates * keys page notifications * move regenerate_key to organisms * notifications for regenerate key modal * move key info view and key edit view to templates/ folder * replace "Network response was not ok" with error data * resolve merge conflict --- ui/litellm-dashboard/src/app/page.tsx | 635 +++++----- .../src/components/all_keys_table.tsx | 580 +++++----- .../src/components/networking.tsx | 2 +- .../{ => organisms}/create_key_button.tsx | 68 +- .../{ => organisms}/regenerate_key_modal.tsx | 133 +-- .../components/tag_management/tag_info.tsx | 141 +-- .../{ => templates}/key_edit_view.tsx | 261 ++--- .../{ => templates}/key_info_view.tsx | 180 ++- .../{ => templates}/view_key_table.tsx | 396 +++---- .../src/components/top_key_view.tsx | 198 ++-- .../src/components/user_dashboard.tsx | 4 +- .../src/components/view_logs/index.tsx | 1031 ++++++++--------- 12 files changed, 1670 insertions(+), 1959 deletions(-) rename ui/litellm-dashboard/src/components/{ => organisms}/create_key_button.tsx (96%) rename ui/litellm-dashboard/src/components/{ => organisms}/regenerate_key_modal.tsx (71%) rename ui/litellm-dashboard/src/components/{ => templates}/key_edit_view.tsx (58%) rename ui/litellm-dashboard/src/components/{ => templates}/key_info_view.tsx (84%) rename ui/litellm-dashboard/src/components/{ => templates}/view_key_table.tsx (62%) diff --git a/ui/litellm-dashboard/src/app/page.tsx b/ui/litellm-dashboard/src/app/page.tsx index 7106a6f884f..22f0e29d11f 100644 --- a/ui/litellm-dashboard/src/app/page.tsx +++ b/ui/litellm-dashboard/src/app/page.tsx @@ -1,234 +1,220 @@ -"use client"; +"use client" -import React, { Suspense, useEffect, useState } from "react"; -import { useSearchParams } from "next/navigation"; -import { jwtDecode } from "jwt-decode"; -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { Team } from "@/components/key_team_helpers/key_list"; -import Navbar from "@/components/navbar"; -import { ThemeProvider } from "@/contexts/ThemeContext"; -import UserDashboard from "@/components/user_dashboard"; -import ModelDashboard from "@/components/model_dashboard"; -import ViewUserDashboard from "@/components/view_users"; -import Teams from "@/components/teams"; -import Organizations from "@/components/organizations"; -import { fetchOrganizations } from "@/components/organizations"; -import AdminPanel from "@/components/admins"; -import Settings from "@/components/settings"; -import GeneralSettings from "@/components/general_settings"; -import PassThroughSettings from "@/components/pass_through_settings"; -import BudgetPanel from "@/components/budgets/budget_panel"; -import SpendLogsTable from "@/components/view_logs"; -import ModelHubTable from "@/components/model_hub_table"; -import NewUsagePage from "@/components/new_usage"; -import APIRef from "@/components/api_ref"; -import ChatUI from "@/components/chat_ui"; -import Sidebar from "@/components/leftnav"; -import Usage from "@/components/usage"; -import CacheDashboard from "@/components/cache_dashboard"; -import { - getUiConfig, - proxyBaseUrl, - setGlobalLitellmHeaderName, -} from "@/components/networking"; -import { Organization } from "@/components/networking"; -import GuardrailsPanel from "@/components/guardrails"; -import PromptsPanel from "@/components/prompts"; -import TransformRequestPanel from "@/components/transform_request"; -import { fetchUserModels } from "@/components/create_key_button"; -import { fetchTeams } from "@/components/common_components/fetch_teams"; -import { MCPServers } from "@/components/mcp_tools"; -import TagManagement from "@/components/tag_management"; -import VectorStoreManagement from "@/components/vector_store_management"; -import UIThemeSettings from "@/components/ui_theme_settings"; -import { UiLoadingSpinner } from "@/components/ui/ui-loading-spinner"; -import { cx } from "@/lib/cva.config"; +import React, { Suspense, useEffect, useState } from "react" +import { useSearchParams } from "next/navigation" +import { jwtDecode } from "jwt-decode" +import { QueryClient, QueryClientProvider } from "@tanstack/react-query" +import { Team } from "@/components/key_team_helpers/key_list" +import Navbar from "@/components/navbar" +import { ThemeProvider } from "@/contexts/ThemeContext" +import UserDashboard from "@/components/user_dashboard" +import ModelDashboard from "@/components/model_dashboard" +import ViewUserDashboard from "@/components/view_users" +import Teams from "@/components/teams" +import Organizations from "@/components/organizations" +import { fetchOrganizations } from "@/components/organizations" +import AdminPanel from "@/components/admins" +import Settings from "@/components/settings" +import GeneralSettings from "@/components/general_settings" +import PassThroughSettings from "@/components/pass_through_settings" +import BudgetPanel from "@/components/budgets/budget_panel" +import SpendLogsTable from "@/components/view_logs" +import ModelHubTable from "@/components/model_hub_table" +import NewUsagePage from "@/components/new_usage" +import APIRef from "@/components/api_ref" +import ChatUI from "@/components/chat_ui" +import Sidebar from "@/components/leftnav" +import Usage from "@/components/usage" +import CacheDashboard from "@/components/cache_dashboard" +import { getUiConfig, proxyBaseUrl, setGlobalLitellmHeaderName } from "@/components/networking" +import { Organization } from "@/components/networking" +import GuardrailsPanel from "@/components/guardrails" +import PromptsPanel from "@/components/prompts" +import TransformRequestPanel from "@/components/transform_request" +import { fetchUserModels } from "@/components/organisms/create_key_button" +import { fetchTeams } from "@/components/common_components/fetch_teams" +import { MCPServers } from "@/components/mcp_tools" +import TagManagement from "@/components/tag_management" +import VectorStoreManagement from "@/components/vector_store_management" +import UIThemeSettings from "@/components/ui_theme_settings" +import { UiLoadingSpinner } from "@/components/ui/ui-loading-spinner" +import { cx } from "@/lib/cva.config" function getCookie(name: string) { - const cookieValue = document.cookie - .split("; ") - .find((row) => row.startsWith(name + "=")); - return cookieValue ? cookieValue.split("=")[1] : null; + const cookieValue = document.cookie.split("; ").find((row) => row.startsWith(name + "=")) + return cookieValue ? cookieValue.split("=")[1] : null } function formatUserRole(userRole: string) { if (!userRole) { - return "Undefined Role"; + return "Undefined Role" } switch (userRole.toLowerCase()) { case "app_owner": - return "App Owner"; + return "App Owner" case "demo_app_owner": - return "App Owner"; + return "App Owner" case "app_admin": - return "Admin"; + return "Admin" case "proxy_admin": - return "Admin"; + return "Admin" case "proxy_admin_viewer": - return "Admin Viewer"; + return "Admin Viewer" case "org_admin": - return "Org Admin"; + return "Org Admin" case "internal_user": - return "Internal User"; + return "Internal User" case "internal_user_viewer": case "internal_viewer": // TODO:remove if deprecated - return "Internal Viewer"; + return "Internal Viewer" case "app_user": - return "App User"; + return "App User" default: - return "Unknown Role"; + return "Unknown Role" } } interface ProxySettings { - PROXY_BASE_URL: string; - PROXY_LOGOUT_URL: string; + PROXY_BASE_URL: string + PROXY_LOGOUT_URL: string } -const queryClient = new QueryClient(); +const queryClient = new QueryClient() function LoadingScreen() { return (
- Please replace your old key with the new key generated. For - security reasons, you will not be able to view it again{" "} - through your LiteLLM account. If you lose this secret key, you - will need to generate a new one. + Please replace your old key with the new key generated. For security reasons,{" "} + you will not be able to view it again through your LiteLLM account. If you lose this secret key, + you will need to generate a new one.
- {selectedToken?.key_alias || "No alias set"}
-
+ {selectedToken?.key_alias || "No alias set"}
{regeneratedKey}
- Are you sure you want to delete this key? -
+Are you sure you want to delete this key?