From 852429c4fa50e886f69a154441022d0b6a88a46e Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 23 Apr 2026 20:51:58 +0000 Subject: [PATCH] feat(ui): guardrails/guardrail_provider_fields to shadcn - antd Spin/Input \u2192 lucide Loader2 spinner + shadcn Input. AntInput.Password kept (no shadcn Password component). antd Form/ Form.Item/Select/Slider preserved. - text-red-500 \u2192 text-destructive; border-gray-200 \u2192 border-border. - Removed console.log debug spam. Gates: TS \u2713 | Build \u2713. Co-authored-by: yuneng-jiang --- .../guardrails/guardrail_provider_fields.tsx | 44 ++++++++++++------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/ui/litellm-dashboard/src/components/guardrails/guardrail_provider_fields.tsx b/ui/litellm-dashboard/src/components/guardrails/guardrail_provider_fields.tsx index 7e9568c04d5..05ed3c86cbf 100644 --- a/ui/litellm-dashboard/src/components/guardrails/guardrail_provider_fields.tsx +++ b/ui/litellm-dashboard/src/components/guardrails/guardrail_provider_fields.tsx @@ -1,5 +1,7 @@ import React, { useState, useEffect } from "react"; -import { Form, Select, Spin, Input, Slider } from "antd"; +import { Form, Select, Input as AntInput, Slider } from "antd"; +import { Input } from "@/components/ui/input"; +import { Loader2 } from "lucide-react"; import { guardrail_provider_map, populateGuardrailProviders, @@ -13,6 +15,7 @@ interface GuardrailProviderFieldsProps { selectedProvider: string | null; accessToken?: string | null; providerParams?: ProviderParamsResponse | null; + // eslint-disable-next-line @typescript-eslint/no-explicit-any value?: Record | null; } @@ -61,7 +64,6 @@ const GuardrailProviderFields: React.FC = ({ try { const data = await getGuardrailProviderSpecificParams(accessToken); - console.log("Provider params API response:", data); setProviderParams(data); // Populate dynamic providers from API response @@ -88,12 +90,17 @@ const GuardrailProviderFields: React.FC = ({ // Show loading state if (loading) { - return ; + return ( +
+ + Loading provider parameters... +
+ ); } // Show error state if (error) { - return
{error}
; + return
{error}
; } // Get the provider key matching the selected provider in the guardrail_provider_map @@ -102,14 +109,10 @@ const GuardrailProviderFields: React.FC = ({ // Get parameters for the selected provider const providerFields = providerParams && providerParams[providerKey]; - console.log("Provider key:", providerKey); - console.log("Provider fields:", providerFields); - if (!providerFields || Object.keys(providerFields).length === 0) { return
No configuration fields available for this provider.
; } - console.log("Value:", value); // Fields to skip for content filter provider (handled in dedicated steps) const contentFilterFieldsToSkip = new Set([ @@ -124,12 +127,15 @@ const GuardrailProviderFields: React.FC = ({ const isContentFilterProvider = shouldRenderContentFilterConfigSettings(selectedProvider); - // Convert object to array of entries and render fields - const renderFields = (fields: { [key: string]: ProviderParam }, parentKey = "", parentValue?: any) => { + const renderFields = ( + fields: { [key: string]: ProviderParam }, + parentKey = "", + // eslint-disable-next-line @typescript-eslint/no-explicit-any + parentValue?: any, + ) => { return Object.entries(fields).map(([fieldKey, field]) => { const fullFieldKey = parentKey ? `${parentKey}.${fieldKey}` : fieldKey; const fieldValue = parentValue ? parentValue[fieldKey] : value?.[fieldKey]; - console.log("Field value:", fieldValue); // Skip ui_friendly_name - it's metadata for the UI dropdown, not a user configuration field if (fieldKey === "ui_friendly_name") { return null; @@ -150,7 +156,7 @@ const GuardrailProviderFields: React.FC = ({ return (
{fieldKey}
-
+
{renderFields(field.fields, fullFieldKey, fieldValue)}
@@ -210,10 +216,18 @@ const GuardrailProviderFields: React.FC = ({ placeholder={field.description} defaultValue={fieldValue !== undefined ? Number(fieldValue) : undefined} /> - ) : fieldKey.includes("password") || fieldKey.includes("secret") || fieldKey.includes("key") ? ( - + ) : fieldKey.includes("password") || + fieldKey.includes("secret") || + fieldKey.includes("key") ? ( + ) : ( - + )} );