diff --git a/ui/litellm-dashboard/src/components/guardrails/guardrail_garden.tsx b/ui/litellm-dashboard/src/components/guardrails/guardrail_garden.tsx index de7c29dc31c..8678c8dcd79 100644 --- a/ui/litellm-dashboard/src/components/guardrails/guardrail_garden.tsx +++ b/ui/litellm-dashboard/src/components/guardrails/guardrail_garden.tsx @@ -1,6 +1,7 @@ import React, { useState } from "react"; import { Input } from "antd"; import { SearchOutlined, ArrowRightOutlined } from "@ant-design/icons"; +import { useTranslation } from "react-i18next"; import { GuardrailCardInfo, ALL_CARDS } from "./guardrail_garden_data"; import GuardrailCard from "./guardrail_garden_card"; import GuardrailDetailView from "./guardrail_garden_detail"; @@ -11,6 +12,7 @@ interface GuardrailGardenProps { } const GuardrailGarden: React.FC = ({ accessToken, onGuardrailCreated }) => { + const { t } = useTranslation(); const [searchQuery, setSearchQuery] = useState(""); const [selectedCard, setSelectedCard] = useState(null); const [showAllLitellm, setShowAllLitellm] = useState(false); @@ -47,7 +49,7 @@ const GuardrailGarden: React.FC = ({ accessToken, onGuardr
} value={searchQuery} onChange={(e) => setSearchQuery(e.target.value)} @@ -58,7 +60,9 @@ const GuardrailGarden: React.FC = ({ accessToken, onGuardr {/* LiteLLM Content Filter Section */}
-

LiteLLM Content Filter

+

+ {t("guardrails.guardrailGarden.litellmSectionTitle")} +

= ({ accessToken, onGuardr onClick={() => setShowAllLitellm(!showAllLitellm)} > {showAllLitellm ? ( - <>Show less + <>{t("guardrails.guardrailGarden.showLess")} ) : ( <> - {`Show all (${litellmCards.length})`} + {t("guardrails.guardrailGarden.showAll", { count: litellmCards.length })} )}

- Built-in guardrails powered by LiteLLM. Zero latency, no external dependencies, no additional cost. + {t("guardrails.guardrailGarden.litellmSectionDesc")}

= ({ accessToken, onGuardr {/* Partner Guardrails Section */}
-

Partner Guardrails

+

+ {t("guardrails.guardrailGarden.partnerSectionTitle")} +

- Third-party guardrail integrations from leading AI security providers. + {t("guardrails.guardrailGarden.partnerSectionDesc")}

= ({ src, name }) => { @@ -38,6 +39,7 @@ const LogoWithFallback: React.FC<{ src: string; name: string }> = ({ src, name } }; const GuardrailCard: React.FC<{ card: GuardrailCardInfo; onClick: () => void }> = ({ card, onClick }) => { + const { t } = useTranslation(); const [hovered, setHovered] = useState(false); return ( @@ -74,7 +76,7 @@ const GuardrailCard: React.FC<{ card: GuardrailCardInfo; onClick: () => void }>
- F1: {card.eval.f1}% · {card.eval.testCases} test cases + {t("guardrails.guardrailGardenCard.evalBadge", { f1: card.eval.f1, testCases: card.eval.testCases })}
)} diff --git a/ui/litellm-dashboard/src/components/guardrails/guardrail_garden_detail.tsx b/ui/litellm-dashboard/src/components/guardrails/guardrail_garden_detail.tsx index 00daeeb8f01..a62b3ec9823 100644 --- a/ui/litellm-dashboard/src/components/guardrails/guardrail_garden_detail.tsx +++ b/ui/litellm-dashboard/src/components/guardrails/guardrail_garden_detail.tsx @@ -1,6 +1,7 @@ import React, { useState } from "react"; import { Button } from "antd"; import { ArrowLeftOutlined } from "@ant-design/icons"; +import { useTranslation } from "react-i18next"; import AddGuardrailForm from "./add_guardrail_form"; import { GUARDRAIL_PRESETS } from "./guardrail_garden_configs"; import { GuardrailCardInfo } from "./guardrail_garden_data"; @@ -13,30 +14,53 @@ interface GuardrailDetailViewProps { } const GuardrailDetailView: React.FC = ({ card, onBack, accessToken, onGuardrailCreated }) => { + const { t } = useTranslation(); const [isAddFormVisible, setIsAddFormVisible] = useState(false); const [activeTab, setActiveTab] = useState("overview"); const detailRows = [ - { property: "Provider", value: card.category === "litellm" ? "LiteLLM Content Filter" : "Partner Guardrail" }, - ...(card.subcategory ? [{ property: "Subcategory", value: card.subcategory }] : []), - ...(card.category === "litellm" ? [{ property: "Cost", value: "$0 / request" }] : []), - ...(card.category === "litellm" ? [{ property: "External Dependencies", value: "None" }] : []), - ...(card.category === "litellm" ? [{ property: "Latency", value: card.eval?.latency || "<1ms" }] : []), + { + property: t("guardrails.guardrailGardenDetail.propertyProvider"), + value: + card.category === "litellm" + ? t("guardrails.guardrailGardenDetail.litellmContentFilter") + : t("guardrails.guardrailGardenDetail.partnerGuardrail"), + }, + ...(card.subcategory + ? [{ property: t("guardrails.guardrailGardenDetail.propertySubcategory"), value: card.subcategory }] + : []), + ...(card.category === "litellm" + ? [ + { + property: t("guardrails.guardrailGardenDetail.propertyCost"), + value: t("guardrails.guardrailGardenDetail.costFree"), + }, + ] + : []), + ...(card.category === "litellm" + ? [{ property: t("guardrails.guardrailGardenDetail.propertyExternalDeps"), value: t("common.none") }] + : []), + ...(card.category === "litellm" + ? [{ property: t("guardrails.guardrailGardenDetail.propertyLatency"), value: card.eval?.latency || "<1ms" }] + : []), ]; const evalRows = card.eval ? [ - { metric: "Precision", value: `${card.eval.precision}%` }, - { metric: "Recall", value: `${card.eval.recall}%` }, - { metric: "F1 Score", value: `${card.eval.f1}%` }, - { metric: "Test Cases", value: String(card.eval.testCases) }, - { metric: "False Positives", value: "0" }, - { metric: "False Negatives", value: "0" }, - { metric: "Latency (p50)", value: card.eval.latency }, + { metric: t("guardrails.guardrailGardenDetail.metricPrecision"), value: `${card.eval.precision}%` }, + { metric: t("guardrails.guardrailGardenDetail.metricRecall"), value: `${card.eval.recall}%` }, + { metric: t("guardrails.guardrailGardenDetail.metricF1Score"), value: `${card.eval.f1}%` }, + { metric: t("guardrails.guardrailGardenDetail.metricTestCases"), value: String(card.eval.testCases) }, + { metric: t("guardrails.guardrailGardenDetail.metricFalsePositives"), value: "0" }, + { metric: t("guardrails.guardrailGardenDetail.metricFalseNegatives"), value: "0" }, + { metric: t("guardrails.guardrailGardenDetail.metricLatencyP50"), value: card.eval.latency }, ] : []; - const tabs = [{ key: "overview", label: "Overview" }, ...(card.eval ? [{ key: "eval", label: "Eval Results" }] : [])]; + const tabs = [ + { key: "overview", label: t("guardrails.guardrailGardenDetail.tabOverview") }, + ...(card.eval ? [{ key: "eval", label: t("guardrails.guardrailGardenDetail.tabEval") }] : []), + ]; return (
@@ -86,7 +110,7 @@ const GuardrailDetailView: React.FC = ({ card, onBack, fontSize: 14, }} > - Create Guardrail + {t("guardrails.guardrailGardenDetail.createGuardrail")}
@@ -118,17 +142,23 @@ const GuardrailDetailView: React.FC = ({ card, onBack,
{/* Left column — overview + details table */}
-

Overview

+

+ {t("guardrails.guardrailGardenDetail.tabOverview")} +

{card.description}

-

Guardrail Details

-

Details are as follows

+

+ {t("guardrails.guardrailGardenDetail.guardrailDetails")} +

+

+ {t("guardrails.guardrailGardenDetail.detailsSubtitle")} +

- Property + {t("guardrails.guardrailGardenDetail.propertyHeader")} {card.name} @@ -150,22 +180,30 @@ const GuardrailDetailView: React.FC = ({ card, onBack,
{/* Guardrail ID */}
-
Guardrail ID
+
+ {t("guardrails.guardrailGardenDetail.guardrailId")} +
litellm/{card.id}
{/* Type */}
-
Type
+
+ {t("guardrails.guardrailGardenDetail.typeLabel")} +
- {card.category === "litellm" ? "Content Filter" : "Partner"} + {card.category === "litellm" + ? t("guardrails.guardrailGardenDetail.typeContentFilter") + : t("guardrails.guardrailGardenDetail.typePartner")}
{/* Tags — pill style like Vertex */} {card.tags.length > 0 && (
-
Tags
+
+ {t("guardrails.guardrailGardenDetail.tagsLabel")} +
{card.tags.map((tag) => ( = ({ card, onBack, {activeTab === "eval" && (
-

Eval Results

+

+ {t("guardrails.guardrailGardenDetail.tabEval")} +

- - + + diff --git a/ui/litellm-dashboard/src/components/guardrails/guardrail_info.tsx b/ui/litellm-dashboard/src/components/guardrails/guardrail_info.tsx index 897e9d26aff..4dbc3c0e392 100644 --- a/ui/litellm-dashboard/src/components/guardrails/guardrail_info.tsx +++ b/ui/litellm-dashboard/src/components/guardrails/guardrail_info.tsx @@ -11,6 +11,7 @@ import { Badge, Card, Grid, Tab, TabGroup, TabList, TabPanel, TabPanels, Text, T import { Button, Divider, Form, Input, Select, Tooltip } from "antd"; import { CheckIcon, CopyIcon } from "lucide-react"; import React, { useCallback, useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; import NotificationsManager from "../molecules/notifications_manager"; import ContentFilterManager, { formatContentFilterDataForAPI } from "./content_filter/ContentFilterManager"; import CustomCodeModal, { EditGuardrailData } from "./custom_code/CustomCodeModal"; @@ -51,6 +52,7 @@ interface ProviderParamsResponse { } const GuardrailInfoView: React.FC = ({ guardrailId, onClose, accessToken, isAdmin }) => { + const { t } = useTranslation(); const [guardrailData, setGuardrailData] = useState(null); const [guardrailProviderSpecificParams, setGuardrailProviderSpecificParams] = useState(null); const [loading, setLoading] = useState(true); @@ -162,7 +164,7 @@ const GuardrailInfoView: React.FC = ({ guardrailId, onClose, setSelectedPiiActions({}); } } catch (error) { - NotificationsManager.fromBackend("Failed to load guardrail information"); + NotificationsManager.fromBackend(t("guardrails.guardrailInfo.loadFailed")); console.error("Error fetching guardrail info:", error); } finally { setLoading(false); @@ -447,28 +449,28 @@ const GuardrailInfoView: React.FC = ({ guardrailId, onClose, // Only proceed with update if there are actual changes if (Object.keys(updateData).length === 0) { - NotificationsManager.info("No changes detected"); + NotificationsManager.info(t("guardrails.guardrailInfo.noChanges")); setIsEditing(false); return; } await updateGuardrailCall(accessToken, guardrailId, updateData); - NotificationsManager.success("Guardrail updated successfully"); + NotificationsManager.success(t("guardrails.guardrailInfo.updateSuccess")); setHasUnsavedContentFilterChanges(false); fetchGuardrailInfo(); setIsEditing(false); } catch (error) { console.error("Error updating guardrail:", error); - NotificationsManager.fromBackend("Failed to update guardrail"); + NotificationsManager.fromBackend(t("guardrails.guardrailInfo.updateFailed")); } }; if (loading) { - return
Loading...
; + return
{t("common.loading")}
; } if (!guardrailData) { - return
Guardrail not found
; + return
{t("guardrails.guardrailInfo.notFound")}
; } // Format date helper function @@ -497,9 +499,9 @@ const GuardrailInfoView: React.FC = ({ guardrailId, onClose,
- {guardrailData.guardrail_name || "Unnamed Guardrail"} + {guardrailData.guardrail_name || t("guardrails.guardrailInfo.unnamedGuardrail")}
{guardrailData.guardrail_id} @@ -519,8 +521,8 @@ const GuardrailInfoView: React.FC = ({ guardrailId, onClose, - Overview - {isAdmin ? Settings : <>} + {t("guardrails.guardrailInfo.tabOverview")} + {isAdmin ? {t("guardrails.guardrailInfo.tabSettings")} : <>} @@ -528,7 +530,7 @@ const GuardrailInfoView: React.FC = ({ guardrailId, onClose, - Provider + {t("guardrails.guardrailInfo.provider")}
{logo && ( = ({ guardrailId, onClose, - Mode + {t("guardrails.guardrailInfo.mode")}
{guardrailData.litellm_params?.mode || "-"} - {guardrailData.litellm_params?.default_on ? "Default On" : "Default Off"} + {guardrailData.litellm_params?.default_on + ? t("guardrails.guardrailInfo.defaultOn") + : t("guardrails.guardrailInfo.defaultOff")}
- Created At + {t("common.createdAt")}
{formatDate(guardrailData.created_at)} - Last Updated: {formatDate(guardrailData.updated_at)} + + {t("guardrails.guardrailInfo.lastUpdated", { date: formatDate(guardrailData.updated_at) })} +
@@ -568,9 +574,11 @@ const GuardrailInfoView: React.FC = ({ guardrailId, onClose, Object.keys(guardrailData.litellm_params.pii_entities_config).length > 0 && (
- PII Protection + {t("guardrails.guardrailInfo.piiProtection")} - {Object.keys(guardrailData.litellm_params.pii_entities_config).length} PII entities configured + {t("guardrails.guardrailInfo.piiEntitiesConfigured", { + count: Object.keys(guardrailData.litellm_params.pii_entities_config).length, + })}
@@ -579,11 +587,17 @@ const GuardrailInfoView: React.FC = ({ guardrailId, onClose, {guardrailData.litellm_params?.pii_entities_config && Object.keys(guardrailData.litellm_params.pii_entities_config).length > 0 && ( - PII Entity Configuration + + {t("guardrails.guardrailInfo.piiEntityConfiguration")} +
- Entity Type - Configuration + + {t("guardrails.guardrailInfo.entityType")} + + + {t("guardrails.guardrailInfo.configuration")} +
{Object.entries(guardrailData.litellm_params?.pii_entities_config).map(([key, value]) => ( @@ -618,11 +632,11 @@ const GuardrailInfoView: React.FC = ({ guardrailId, onClose,
- Custom Code + {t("guardrails.guardrailInfo.customCode")}
{isAdmin && !isConfigGuardrail && ( )}
@@ -651,9 +665,9 @@ const GuardrailInfoView: React.FC = ({ guardrailId, onClose,
- Guardrail Settings + {t("guardrails.guardrailInfo.guardrailSettings")} {isConfigGuardrail && ( - + )} @@ -661,10 +675,10 @@ const GuardrailInfoView: React.FC = ({ guardrailId, onClose, !isConfigGuardrail && (guardrailData.litellm_params?.guardrail === "custom_code" ? ( ) : ( - + ))}
@@ -697,47 +711,47 @@ const GuardrailInfoView: React.FC = ({ guardrailId, onClose, layout="vertical" > - + - + {guardrailData.litellm_params?.guardrail === "presidio" && ( <> - PII Protection + {t("guardrails.guardrailInfo.piiProtection")}
{guardrailSettings && ( = ({ guardrailId, onClose, /> {(guardrailData.litellm_params?.guardrail === "tool_permission" || - guardrailProviderSpecificParams) && Provider Settings} + guardrailProviderSpecificParams) && ( + {t("guardrails.guardrailInfo.providerSettings")} + )} {guardrailData.litellm_params?.guardrail === "tool_permission" ? ( @@ -806,8 +822,8 @@ const GuardrailInfoView: React.FC = ({ guardrailId, onClose, )} - Advanced Settings - + {t("guardrails.guardrailInfo.advancedSettings")} + @@ -819,57 +835,58 @@ const GuardrailInfoView: React.FC = ({ guardrailId, onClose, resetToolPermissionEditor(); }} > - Cancel + {t("common.cancel")}
) : (
- Guardrail ID + {t("guardrails.guardrailInfo.guardrailIdLabel")}
{guardrailData.guardrail_id}
- Guardrail Name -
{guardrailData.guardrail_name || "Unnamed Guardrail"}
+ {t("guardrails.guardrailInfo.guardrailName")} +
{guardrailData.guardrail_name || t("guardrails.guardrailInfo.unnamedGuardrail")}
- Provider + {t("guardrails.guardrailInfo.provider")}
{displayName}
- Mode + {t("guardrails.guardrailInfo.mode")}
{guardrailData.litellm_params?.mode || "-"}
- Default On + {t("guardrails.guardrailInfo.defaultOnLabel")} - {guardrailData.litellm_params?.default_on ? "Yes" : "No"} + {guardrailData.litellm_params?.default_on ? t("common.yes") : t("common.no")}
{guardrailData.litellm_params?.pii_entities_config && Object.keys(guardrailData.litellm_params.pii_entities_config).length > 0 && (
- PII Protection + {t("guardrails.guardrailInfo.piiProtection")}
- {Object.keys(guardrailData.litellm_params.pii_entities_config).length} PII entities - configured + {t("guardrails.guardrailInfo.piiEntitiesConfigured", { + count: Object.keys(guardrailData.litellm_params.pii_entities_config).length, + })}
)}
- Created At + {t("common.createdAt")}
{formatDate(guardrailData.created_at)}
- Last Updated + {t("guardrails.guardrailInfo.lastUpdatedLabel")}
{formatDate(guardrailData.updated_at)}
diff --git a/ui/litellm-dashboard/src/locales/en.json b/ui/litellm-dashboard/src/locales/en.json index d2e5c81acfc..73210802593 100644 --- a/ui/litellm-dashboard/src/locales/en.json +++ b/ui/litellm-dashboard/src/locales/en.json @@ -2862,6 +2862,92 @@ "invalidJsonConfig": "Invalid JSON in configuration", "loadSettingsFailed": "Failed to load guardrail settings", "updateFailed": "Failed to update guardrail: {{error}}" + }, + "guardrailGarden": { + "searchPlaceholder": "Search guardrails", + "litellmSectionTitle": "LiteLLM Content Filter", + "showLess": "Show less", + "showAll": "Show all ({{count}})", + "litellmSectionDesc": "Built-in guardrails powered by LiteLLM. Zero latency, no external dependencies, no additional cost.", + "partnerSectionTitle": "Partner Guardrails", + "partnerSectionDesc": "Third-party guardrail integrations from leading AI security providers." + }, + "guardrailGardenCard": { + "evalBadge": "F1: {{f1}}% · {{testCases}} test cases" + }, + "guardrailGardenDetail": { + "propertyProvider": "Provider", + "litellmContentFilter": "LiteLLM Content Filter", + "partnerGuardrail": "Partner Guardrail", + "propertySubcategory": "Subcategory", + "propertyCost": "Cost", + "costFree": "$0 / request", + "propertyExternalDeps": "External Dependencies", + "propertyLatency": "Latency", + "metricPrecision": "Precision", + "metricRecall": "Recall", + "metricF1Score": "F1 Score", + "metricTestCases": "Test Cases", + "metricFalsePositives": "False Positives", + "metricFalseNegatives": "False Negatives", + "metricLatencyP50": "Latency (p50)", + "tabOverview": "Overview", + "tabEval": "Eval Results", + "createGuardrail": "Create Guardrail", + "guardrailDetails": "Guardrail Details", + "detailsSubtitle": "Details are as follows", + "propertyHeader": "Property", + "guardrailId": "Guardrail ID", + "typeLabel": "Type", + "typeContentFilter": "Content Filter", + "typePartner": "Partner", + "tagsLabel": "Tags", + "metricHeader": "Metric", + "valueHeader": "Value" + }, + "guardrailInfo": { + "backToGuardrails": "Back to Guardrails", + "unnamedGuardrail": "Unnamed Guardrail", + "tabOverview": "Overview", + "tabSettings": "Settings", + "provider": "Provider", + "mode": "Mode", + "defaultOn": "Default On", + "defaultOff": "Default Off", + "lastUpdated": "Last Updated: {{date}}", + "piiProtection": "PII Protection", + "piiEntitiesConfigured_one": "{{count}} PII entity configured", + "piiEntitiesConfigured_other": "{{count}} PII entities configured", + "piiEntityConfiguration": "PII Entity Configuration", + "entityType": "Entity Type", + "configuration": "Configuration", + "customCode": "Custom Code", + "editCode": "Edit Code", + "guardrailSettings": "Guardrail Settings", + "configGuardrailTooltip": "Guardrail is defined in the config file and cannot be edited.", + "editSettings": "Edit Settings", + "guardrailName": "Guardrail Name", + "guardrailNameRequired": "Please input a guardrail name", + "guardrailNamePlaceholder": "Enter guardrail name", + "defaultOnLabel": "Default On", + "useGlobalDefault": "Use global default", + "yesExcludeFromScan": "Yes — exclude from guardrail scan", + "noAlwaysInclude": "No — always include in scan", + "skipSystemMsg": "Skip system messages in guardrail", + "skipSystemMsgTooltip": "Unified guardrails: omit role: system from guardrail input (LLM still gets full messages). Use global default follows litellm_settings.skip_system_message_in_guardrail.", + "skipToolMsg": "Skip tool messages in guardrail", + "skipToolMsgTooltip": "Unified guardrails: omit role: tool from guardrail input (LLM still gets full messages). Use global default follows litellm_settings.skip_tool_message_in_guardrail.", + "providerSettings": "Provider Settings", + "advancedSettings": "Advanced Settings", + "guardrailInformation": "Guardrail Information", + "saveChanges": "Save Changes", + "guardrailIdLabel": "Guardrail ID", + "lastUpdatedLabel": "Last Updated", + "loadFailed": "Failed to load guardrail information", + "noChanges": "No changes detected", + "updateSuccess": "Guardrail updated successfully", + "updateFailed": "Failed to update guardrail", + "notFound": "Guardrail not found" } } } diff --git a/ui/litellm-dashboard/src/locales/zh-CN.json b/ui/litellm-dashboard/src/locales/zh-CN.json index 2c2ed69f192..1bffd34b59c 100644 --- a/ui/litellm-dashboard/src/locales/zh-CN.json +++ b/ui/litellm-dashboard/src/locales/zh-CN.json @@ -2862,6 +2862,92 @@ "invalidJsonConfig": "配置中的 JSON 格式无效", "loadSettingsFailed": "加载护栏设置失败", "updateFailed": "更新护栏失败:{{error}}" + }, + "guardrailGarden": { + "searchPlaceholder": "搜索护栏", + "litellmSectionTitle": "LiteLLM 内容过滤器", + "showLess": "收起", + "showAll": "显示全部({{count}})", + "litellmSectionDesc": "由 LiteLLM 内置的护栏,零延迟,无外部依赖,无额外费用。", + "partnerSectionTitle": "合作伙伴护栏", + "partnerSectionDesc": "来自领先 AI 安全提供商的第三方护栏集成。" + }, + "guardrailGardenCard": { + "evalBadge": "F1:{{f1}}% · {{testCases}} 个测试用例" + }, + "guardrailGardenDetail": { + "propertyProvider": "提供商", + "litellmContentFilter": "LiteLLM 内容过滤器", + "partnerGuardrail": "合作伙伴护栏", + "propertySubcategory": "子类别", + "propertyCost": "费用", + "costFree": "$0 / 次请求", + "propertyExternalDeps": "外部依赖", + "propertyLatency": "延迟", + "metricPrecision": "精确率", + "metricRecall": "召回率", + "metricF1Score": "F1 分数", + "metricTestCases": "测试用例", + "metricFalsePositives": "误报", + "metricFalseNegatives": "漏报", + "metricLatencyP50": "延迟(p50)", + "tabOverview": "概览", + "tabEval": "评估结果", + "createGuardrail": "创建护栏", + "guardrailDetails": "护栏详情", + "detailsSubtitle": "详细信息如下", + "propertyHeader": "属性", + "guardrailId": "护栏 ID", + "typeLabel": "类型", + "typeContentFilter": "内容过滤器", + "typePartner": "合作伙伴", + "tagsLabel": "标签", + "metricHeader": "指标", + "valueHeader": "值" + }, + "guardrailInfo": { + "backToGuardrails": "返回护栏列表", + "unnamedGuardrail": "未命名护栏", + "tabOverview": "概览", + "tabSettings": "设置", + "provider": "提供商", + "mode": "模式", + "defaultOn": "默认启用", + "defaultOff": "默认关闭", + "lastUpdated": "最近更新:{{date}}", + "piiProtection": "PII 保护", + "piiEntitiesConfigured_one": "已配置 {{count}} 个 PII 实体", + "piiEntitiesConfigured_other": "已配置 {{count}} 个 PII 实体", + "piiEntityConfiguration": "PII 实体配置", + "entityType": "实体类型", + "configuration": "配置", + "customCode": "自定义代码", + "editCode": "编辑代码", + "guardrailSettings": "护栏设置", + "configGuardrailTooltip": "护栏在配置文件中定义,无法编辑。", + "editSettings": "编辑设置", + "guardrailName": "护栏名称", + "guardrailNameRequired": "请输入护栏名称", + "guardrailNamePlaceholder": "输入护栏名称", + "defaultOnLabel": "默认启用", + "useGlobalDefault": "使用全局默认", + "yesExcludeFromScan": "是 — 从护栏扫描中排除", + "noAlwaysInclude": "否 — 始终包含在扫描中", + "skipSystemMsg": "在护栏中跳过系统消息", + "skipSystemMsgTooltip": "统一护栏:从护栏输入中省略 role: system(LLM 仍接收完整消息)。使用全局默认值遵循 litellm_settings.skip_system_message_in_guardrail。", + "skipToolMsg": "在护栏中跳过工具消息", + "skipToolMsgTooltip": "统一护栏:从护栏输入中省略 role: tool(LLM 仍接收完整消息)。使用全局默认值遵循 litellm_settings.skip_tool_message_in_guardrail。", + "providerSettings": "提供商设置", + "advancedSettings": "高级设置", + "guardrailInformation": "护栏信息", + "saveChanges": "保存更改", + "guardrailIdLabel": "护栏 ID", + "lastUpdatedLabel": "最近更新", + "loadFailed": "加载护栏信息失败", + "noChanges": "未检测到更改", + "updateSuccess": "护栏已成功更新", + "updateFailed": "更新护栏失败", + "notFound": "未找到护栏" } } }
MetricValue + {t("guardrails.guardrailGardenDetail.metricHeader")} + + {t("guardrails.guardrailGardenDetail.valueHeader")} +