diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index 8b624f7caf6..1cb1e18672e 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -9546,3 +9546,33 @@ export const checkGdprCompliance = async ( } return response.json(); }; + +export const provisionPartnerGuardrailCall = async ( + accessToken: string, + data: { + guardrail_name: string; + provider: string; + credential_name: string; + provision_config: Record; + aws_region_name?: string; + mode?: string; + default_on?: boolean; + } +) => { + const url = proxyBaseUrl + ? `${proxyBaseUrl}/guardrails/provision_partner` + : `/guardrails/provision_partner`; + const response = await fetch(url, { + method: "POST", + headers: { + [globalLitellmHeaderName]: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + }); + if (!response.ok) { + const errorData = await response.json(); + throw new Error(deriveErrorMessage(errorData)); + } + return response.json(); +}; diff --git a/ui/litellm-dashboard/src/components/policies/index.tsx b/ui/litellm-dashboard/src/components/policies/index.tsx index 9ca382d3432..84d01db4896 100644 --- a/ui/litellm-dashboard/src/components/policies/index.tsx +++ b/ui/litellm-dashboard/src/components/policies/index.tsx @@ -26,7 +26,9 @@ import { createPolicyAttachmentCall, createGuardrailCall, enrichPolicyTemplate, + provisionPartnerGuardrailCall, } from "../networking"; +import { PartnerGuardrailSelection } from "./guardrail_selection_modal"; import { Policy, PolicyAttachment, @@ -281,7 +283,10 @@ const PoliciesPanel: React.FC = ({ setPendingTemplate(null); }; - const handleGuardrailSelectionConfirm = async (selectedGuardrailDefinitions: any[]) => { + const handleGuardrailSelectionConfirm = async ( + selectedGuardrailDefinitions: any[], + partnerGuardrails?: PartnerGuardrailSelection[] + ) => { if (!accessToken || !selectedTemplate) return; setIsCreatingGuardrails(true); @@ -293,7 +298,7 @@ const PoliciesPanel: React.FC = ({ // Create selected guardrails for (const guardrailDef of selectedGuardrailDefinitions) { const guardrailName = guardrailDef.guardrail_name; - + try { await createGuardrailCall(accessToken, guardrailDef); createdGuardrails.push(guardrailName); @@ -304,6 +309,28 @@ const PoliciesPanel: React.FC = ({ } } + // Provision partner guardrails + if (partnerGuardrails && partnerGuardrails.length > 0) { + for (const pg of partnerGuardrails) { + const partnerName = `${selectedTemplate.id}-${pg.provider}`; + try { + await provisionPartnerGuardrailCall(accessToken, { + guardrail_name: partnerName, + provider: pg.provider, + credential_name: pg.credential_name, + provision_config: pg.provision_config, + aws_region_name: pg.aws_region_name, + mode: "pre_call", + default_on: true, + }); + createdGuardrails.push(`${partnerName} (partner)`); + } catch (error) { + console.error(`Failed to provision partner guardrail "${pg.provider}":`, error); + failedGuardrails.push(`${partnerName} (partner)`); + } + } + } + // Refresh guardrails list await fetchGuardrails(); @@ -520,6 +547,7 @@ const PoliciesPanel: React.FC = ({ onCancel={handleGuardrailSelectionCancel} isLoading={isCreatingGuardrails} progressInfo={templateQueueProgress} + accessToken={accessToken || undefined} /> void; } +const partnerProviderLogoMap: Record = { + bedrock: "../ui/assets/logos/bedrock.svg", +}; + const PolicyTemplateCard: React.FC = ({ title, description, @@ -32,6 +42,7 @@ const PolicyTemplateCard: React.FC = ({ tags, inherits, complexity, + partnerGuardrails, onUseTemplate, }) => { const getComplexityStyle = () => { @@ -86,6 +97,23 @@ const PolicyTemplateCard: React.FC = ({ )} + {partnerGuardrails && partnerGuardrails.length > 0 && ( +
+ {partnerProviderLogoMap[partnerGuardrails[0].provider] && ( + {partnerGuardrails[0].provider} { e.currentTarget.style.display = "none"; }} + /> + )} + + Partner guardrail available + + Optional +
+ )} +
Included Guardrails @@ -290,6 +318,7 @@ const PolicyTemplates: React.FC = ({ onUseTemplate, onOpen tags={template.tags || []} inherits={template.inherits} complexity={template.complexity} + partnerGuardrails={template.partnerGuardrails} onUseTemplate={() => onUseTemplate(template)} /> ))}