diff --git a/ui/litellm-dashboard/src/components/policies/ai_suggestion_modal.tsx b/ui/litellm-dashboard/src/components/policies/ai_suggestion_modal.tsx index 1a3745df86e..0528572fb80 100644 --- a/ui/litellm-dashboard/src/components/policies/ai_suggestion_modal.tsx +++ b/ui/litellm-dashboard/src/components/policies/ai_suggestion_modal.tsx @@ -8,6 +8,7 @@ import { DownOutlined, RightOutlined, } from "@ant-design/icons"; +import { useTranslation } from "react-i18next"; import { suggestPolicyTemplates, modelHubCall, testPolicyTemplate, enrichPolicyTemplateStream } from "../networking"; const { TextArea } = Input; @@ -59,6 +60,7 @@ const AiSuggestionModal: React.FC = ({ accessToken, allTemplates, }) => { + const { t } = useTranslation(); const [attackExamples, setAttackExamples] = useState([""]); const [description, setDescription] = useState(""); const [isLoading, setIsLoading] = useState(false); @@ -159,7 +161,7 @@ const AiSuggestionModal: React.FC = ({ setSelectedIds(new Set((result.selected_templates || []).map((s: SuggestedTemplate) => s.template_id))); } catch { setSuggestions([]); - setExplanation("Failed to get suggestions. Please try again."); + setExplanation(t("policies.aiSuggestionModal.fetchSuggestionsFailed")); } finally { setIsLoading(false); } @@ -285,7 +287,7 @@ const AiSuggestionModal: React.FC = ({ try { for (const template of templatesToEnrich) { const paramName = template.llm_enrichment.parameter; - setEnrichStatusMessage(`Discovering competitors for ${template.title}...`); + setEnrichStatusMessage(t("policies.aiSuggestionModal.discoveringCompetitors", { title: template.title })); // Keep existing guardrails until streaming completes to avoid temporary empty payloads. setEnrichedDefs((prev) => { @@ -397,8 +399,8 @@ const AiSuggestionModal: React.FC = ({ d="M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /> -

No matching templates found

-

Try adjusting your examples or description.

+

{t("policies.aiSuggestionModal.noTemplatesFound")}

+

{t("policies.aiSuggestionModal.adjustExamplesHint")}

); } @@ -442,7 +444,7 @@ const AiSuggestionModal: React.FC = ({ )} {template.estimated_latency_ms != null && ( - + = ({ ))} {template.guardrails && template.guardrails.length > 4 && ( - +{template.guardrails.length - 4} more + + {t("policies.aiSuggestionModal.moreGuardrails", { count: template.guardrails.length - 4 })} + )}
@@ -487,7 +491,7 @@ const AiSuggestionModal: React.FC = ({
- Why these templates + {t("policies.aiSuggestionModal.whyTheseTemplates")}

{explanation}

@@ -508,7 +512,9 @@ const AiSuggestionModal: React.FC = ({ {/* Test header */}
-

Test Guardrails

+

+ {t("policies.aiSuggestionModal.testGuardrailsTitle")} +

- {allSelectedGuardrailDefs.length} guardrails across {selectedIds.size} template - {selectedIds.size !== 1 ? "s" : ""} + {t("policies.aiSuggestionModal.guardrailsAcrossTemplates", { + guardrailCount: allSelectedGuardrailDefs.length, + templateCount: selectedIds.size, + })}

@@ -561,14 +569,14 @@ const AiSuggestionModal: React.FC = ({ )} - Competitor template requires your brand name to discover competitors + {t("policies.aiSuggestionModal.competitorBrandRequired")}
setEnrichBrandName(e.target.value)} onPressEnter={() => enrichBrandName.trim() && handleEnrichCompetitors()} @@ -580,7 +588,11 @@ const AiSuggestionModal: React.FC = ({ loading={isEnriching} disabled={!enrichBrandName.trim() || isEnriching} > - {isEnriching ? "Discovering..." : hasEnrichedGuardrails ? "Re-discover" : "Discover"} + {isEnriching + ? t("policies.aiSuggestionModal.discovering") + : hasEnrichedGuardrails + ? t("policies.aiSuggestionModal.rediscover") + : t("policies.aiSuggestionModal.discover")}
@@ -594,7 +606,9 @@ const AiSuggestionModal: React.FC = ({ {hasEnrichedGuardrails && (
- Competitor names loaded for {enrichBrandName} + + {t("policies.aiSuggestionModal.competitorNamesLoaded", { brand: enrichBrandName })} +
)} @@ -604,7 +618,7 @@ const AiSuggestionModal: React.FC = ({
- Generated Competitors ({generatedCompetitors.length}) + {t("policies.aiSuggestionModal.generatedCompetitors", { count: generatedCompetitors.length })}
@@ -625,26 +639,27 @@ const AiSuggestionModal: React.FC = ({
- - + +
- Characters: {testInputText.length} + + {t("policies.aiSuggestionModal.characterCount", { count: testInputText.length })} +