diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 42b48446e7a..4f72e30ac64 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -622,6 +622,8 @@ class LiteLLMRoutes(enum.Enum): "/global/activity/model", "/v1/models/{model_id}", "/models/{model_id}", + "/guardrails/list", + "/v2/guardrails/list", ] + spend_tracking_routes + key_management_routes diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index f2cb613ee29..9df2a3401e0 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -5460,8 +5460,8 @@ export const testMCPSemanticFilter = async (accessToken: string, model: string, export const getGuardrailsList = async (accessToken: string) => { try { - const url = proxyBaseUrl ? `${proxyBaseUrl}/v2/guardrails/list` : `/v2/guardrails/list`; - const response = await fetch(url, { + const v2Url = proxyBaseUrl ? `${proxyBaseUrl}/v2/guardrails/list` : `/v2/guardrails/list`; + const response = await fetch(v2Url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, @@ -5470,17 +5470,35 @@ export const getGuardrailsList = async (accessToken: string) => { }); if (!response.ok) { - const errorData = await response.json(); - const errorMessage = deriveErrorMessage(errorData); - handleError(errorMessage); - throw new Error(errorMessage); + throw new Error(`v2 guardrails/list returned ${response.status}`); } const data = await response.json(); return data; } catch (error) { - console.error("Failed to get guardrails list:", error); - throw error; + console.log("v2/guardrails/list failed, falling back to v1:", error); + try { + const v1Url = proxyBaseUrl ? `${proxyBaseUrl}/guardrails/list` : `/guardrails/list`; + const fallbackResponse = await fetch(v1Url, { + method: "GET", + headers: { + [globalLitellmHeaderName]: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + }); + + if (!fallbackResponse.ok) { + const errorData = await fallbackResponse.json(); + const errorMessage = deriveErrorMessage(errorData); + handleError(errorMessage); + throw new Error(errorMessage); + } + + return await fallbackResponse.json(); + } catch (fallbackError) { + console.error("Failed to get guardrails list:", fallbackError); + throw fallbackError; + } } }; diff --git a/ui/litellm-dashboard/src/components/organisms/create_key_button.tsx b/ui/litellm-dashboard/src/components/organisms/create_key_button.tsx index 802dfd14b63..19a07c49a3d 100644 --- a/ui/litellm-dashboard/src/components/organisms/create_key_button.tsx +++ b/ui/litellm-dashboard/src/components/organisms/create_key_button.tsx @@ -146,6 +146,7 @@ export const fetchUserModels = async ( */ const CreateKey: React.FC = ({ team, teams, data, addKey }) => { const { accessToken, userId: userID, userRole, premiumUser } = useAuthorized(); + const canEditGuardrails = premiumUser || (userRole != null && rolesWithWriteAccess.includes(userRole)); const { data: projects, isLoading: isProjectsLoading } = useProjects(); const { data: uiSettingsData } = useUISettings(); const enableProjectsUI = Boolean(uiSettingsData?.values?.enable_projects_ui); @@ -1000,7 +1001,7 @@ const CreateKey: React.FC = ({ team, teams, data, addKey }) => { name="guardrails" className="mt-4" help={ - premiumUser + canEditGuardrails ? "Select existing guardrails or enter new ones" : "Premium feature - Upgrade to set guardrails by key" } @@ -1008,9 +1009,9 @@ const CreateKey: React.FC = ({ team, teams, data, addKey }) => {