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") ? ( + ) : ( - + )} );