From 399480e941d2c7dd6c28d61f4cbd8fdd374551f5 Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Thu, 19 Feb 2026 11:55:43 -0800 Subject: [PATCH] add template queue for processing multiple AI-suggested templates --- .../src/components/policies/index.tsx | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/ui/litellm-dashboard/src/components/policies/index.tsx b/ui/litellm-dashboard/src/components/policies/index.tsx index db2da493bd7..9ca382d3432 100644 --- a/ui/litellm-dashboard/src/components/policies/index.tsx +++ b/ui/litellm-dashboard/src/components/policies/index.tsx @@ -66,6 +66,8 @@ const PoliciesPanel: React.FC = ({ const [pendingTemplate, setPendingTemplate] = useState(null); const [isAiSuggestionModalOpen, setIsAiSuggestionModalOpen] = useState(false); const [loadedTemplates, setLoadedTemplates] = useState([]); + const [templateQueue, setTemplateQueue] = useState([]); + const [templateQueueProgress, setTemplateQueueProgress] = useState<{ current: number; total: number } | null>(null); const isAdmin = userRole ? isAdminRole(userRole) : false; @@ -328,8 +330,23 @@ const PoliciesPanel: React.FC = ({ `Failed to create ${failedGuardrails.length} guardrail(s): ${failedGuardrails.join(", ")}. You may need to create them manually.` ); } + + // Process next template in queue if any + if (templateQueue.length > 0) { + const [nextTemplate, ...remaining] = templateQueue; + setTemplateQueue(remaining); + setTemplateQueueProgress((prev) => + prev ? { ...prev, current: prev.current + 1 } : null + ); + // Small delay so user can see the success message + setTimeout(() => handleUseTemplate(nextTemplate), 500); + } else { + setTemplateQueueProgress(null); + } } catch (error) { setIsCreatingGuardrails(false); + setTemplateQueue([]); + setTemplateQueueProgress(null); console.error("Error creating guardrails:", error); message.error("Failed to create guardrails. Please try again."); } @@ -338,6 +355,8 @@ const PoliciesPanel: React.FC = ({ const handleGuardrailSelectionCancel = () => { setIsGuardrailSelectionModalOpen(false); setSelectedTemplate(null); + setTemplateQueue([]); + setTemplateQueueProgress(null); }; return ( @@ -500,6 +519,7 @@ const PoliciesPanel: React.FC = ({ onConfirm={handleGuardrailSelectionConfirm} onCancel={handleGuardrailSelectionCancel} isLoading={isCreatingGuardrails} + progressInfo={templateQueueProgress} /> = ({ onSelectTemplates={(selectedTemplates) => { setIsAiSuggestionModalOpen(false); if (selectedTemplates.length > 0) { - handleUseTemplate(selectedTemplates[0]); + // Queue all templates: process first immediately, queue the rest + const [first, ...rest] = selectedTemplates; + setTemplateQueue(rest); + setTemplateQueueProgress( + selectedTemplates.length > 1 + ? { current: 1, total: selectedTemplates.length } + : null + ); + handleUseTemplate(first); } }} onCancel={() => setIsAiSuggestionModalOpen(false)}