From 9947963c7de6b5012044cf6b88d1e3f6677a9c65 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Thu, 19 Feb 2026 17:10:57 -0800 Subject: [PATCH] feat: enable running ai monitor on individual guardrails --- ui/litellm-dashboard/src/app/page.tsx | 2 +- .../EvaluationSettingsModal.tsx | 157 ++++++++++++++++++ .../GuardrailsMonitor/GuardrailDetail.tsx | 38 +++-- .../GuardrailsMonitorView.tsx | 14 +- .../GuardrailsMonitor/GuardrailsOverview.tsx | 63 ++++--- 5 files changed, 239 insertions(+), 35 deletions(-) create mode 100644 ui/litellm-dashboard/src/components/GuardrailsMonitor/EvaluationSettingsModal.tsx diff --git a/ui/litellm-dashboard/src/app/page.tsx b/ui/litellm-dashboard/src/app/page.tsx index 8b882e9cd23..fb749d7afb0 100644 --- a/ui/litellm-dashboard/src/app/page.tsx +++ b/ui/litellm-dashboard/src/app/page.tsx @@ -549,7 +549,7 @@ function CreateKeyPageContent() { ) : page == "vector-stores" ? ( ) : page == "guardrails-monitor" ? ( - + ) : page == "new_usage" ? ( void; + guardrailName?: string; + accessToken: string | null; + onRunEvaluation?: (settings: { prompt: string; schema: string; model: string }) => void; +} + +export function EvaluationSettingsModal({ + open, + onClose, + guardrailName, + accessToken, + onRunEvaluation, +}: EvaluationSettingsModalProps) { + const [prompt, setPrompt] = useState(DEFAULT_PROMPT); + const [schema, setSchema] = useState(DEFAULT_SCHEMA); + const [model, setModel] = useState(null); + const [modelOptions, setModelOptions] = useState([]); + const [loadingModels, setLoadingModels] = useState(false); + + useEffect(() => { + if (!open || !accessToken) { + setModelOptions([]); + return; + } + let cancelled = false; + setLoadingModels(true); + fetchAvailableModels(accessToken) + .then((list) => { + if (!cancelled) setModelOptions(list); + }) + .catch(() => { + if (!cancelled) setModelOptions([]); + }) + .finally(() => { + if (!cancelled) setLoadingModels(false); + }); + return () => { + cancelled = true; + }; + }, [open, accessToken]); + + const handleResetPrompt = () => setPrompt(DEFAULT_PROMPT); + const handleRun = () => { + if (model) { + onRunEvaluation?.({ prompt, schema, model }); + onClose(); + } + }; + + const modelSelectOptions = modelOptions.map((m) => ({ + value: m.model_group, + label: m.model_group, + })); + + return ( + } + destroyOnClose + > +

+ {guardrailName + ? `Configure AI evaluation for ${guardrailName}` + : "Configure AI evaluation for re-running on logs"} +

+ +
+
+
+ + +
+ setPrompt(e.target.value)} + rows={6} + className="font-mono text-sm" + /> +

+ System prompt sent to the evaluation model. Output is structured via response_format. +

+
+ +
+ +

response_format: json_schema

+ setSchema(e.target.value)} + rows={6} + className="font-mono text-sm" + /> +
+ +
+ +