From de5de438bf0b1259181962f0ccad1aea3f0a808a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B9=E9=9B=AA?= <2b@yorha.xyz> Date: Thu, 11 Jun 2026 08:28:52 +0900 Subject: [PATCH] fix(ui): i18n audit repair round 2 --- .../AIHub/forms/MakeModelPublicForm.tsx | 2 +- .../AccessGroups/AccessGroupsDetailsPage.tsx | 2 +- .../components/MemoryView/MemoryEditModal.tsx | 2 +- .../src/components/alerting/dynamic_form.tsx | 2 +- .../ContentCategoryConfiguration.tsx | 3 +- .../custom_code/CustomCodeModal.tsx | 36 +++++++------- .../mcp_tools/StdioConfiguration.tsx | 13 +---- .../src/components/model_info_view.tsx | 11 +---- .../playground/chat_ui/A2AMetrics.tsx | 4 +- .../src/components/team/TeamInfo.tsx | 6 ++- .../VectorStoreForm.tsx | 2 +- .../LogDetailsDrawer/prettyMessagesUtils.ts | 13 ++--- ui/litellm-dashboard/src/locales/en.json | 48 +++++++++++++++---- ui/litellm-dashboard/src/locales/zh-CN.json | 48 +++++++++++++++---- 14 files changed, 122 insertions(+), 70 deletions(-) diff --git a/ui/litellm-dashboard/src/components/AIHub/forms/MakeModelPublicForm.tsx b/ui/litellm-dashboard/src/components/AIHub/forms/MakeModelPublicForm.tsx index ba6fdcdc787..bf76a660213 100644 --- a/ui/litellm-dashboard/src/components/AIHub/forms/MakeModelPublicForm.tsx +++ b/ui/litellm-dashboard/src/components/AIHub/forms/MakeModelPublicForm.tsx @@ -226,7 +226,7 @@ const MakeModelPublicForm: React.FC = ({
- Warning:{" "} + {t("common.warning")}:{" "} }} />
diff --git a/ui/litellm-dashboard/src/components/AccessGroups/AccessGroupsDetailsPage.tsx b/ui/litellm-dashboard/src/components/AccessGroups/AccessGroupsDetailsPage.tsx index 77bd6ea021d..2ca0945f2d4 100644 --- a/ui/litellm-dashboard/src/components/AccessGroups/AccessGroupsDetailsPage.tsx +++ b/ui/litellm-dashboard/src/components/AccessGroups/AccessGroupsDetailsPage.tsx @@ -180,7 +180,7 @@ export function AccessGroupDetail({ accessGroupId, onBack }: AccessGroupDetailPr {accessGroup.access_group_name} - ID: {accessGroup.access_group_id} + {t("accessGroups.accessGroupsDetailsPage.idLabel")} {accessGroup.access_group_id} diff --git a/ui/litellm-dashboard/src/components/MemoryView/MemoryEditModal.tsx b/ui/litellm-dashboard/src/components/MemoryView/MemoryEditModal.tsx index 14a1ceeafc1..33999645737 100644 --- a/ui/litellm-dashboard/src/components/MemoryView/MemoryEditModal.tsx +++ b/ui/litellm-dashboard/src/components/MemoryView/MemoryEditModal.tsx @@ -91,7 +91,7 @@ export const MemoryEditModal: React.FC = ({ open, mode, in > diff --git a/ui/litellm-dashboard/src/components/alerting/dynamic_form.tsx b/ui/litellm-dashboard/src/components/alerting/dynamic_form.tsx index c74a392f6ca..ca743a49b34 100644 --- a/ui/litellm-dashboard/src/components/alerting/dynamic_form.tsx +++ b/ui/litellm-dashboard/src/components/alerting/dynamic_form.tsx @@ -134,7 +134,7 @@ const DynamicForm: React.FC = ({ handleResetField(value.field_name, index)}> - Reset + {t("common.reset")} diff --git a/ui/litellm-dashboard/src/components/guardrails/content_filter/ContentCategoryConfiguration.tsx b/ui/litellm-dashboard/src/components/guardrails/content_filter/ContentCategoryConfiguration.tsx index 94ec6b27202..34f7c256d25 100644 --- a/ui/litellm-dashboard/src/components/guardrails/content_filter/ContentCategoryConfiguration.tsx +++ b/ui/litellm-dashboard/src/components/guardrails/content_filter/ContentCategoryConfiguration.tsx @@ -290,7 +290,8 @@ const ContentCategoryConfiguration: React.FC }} >
- Preview: {availableCategories.find((c) => c.name === selectedCategoryName)?.display_name} + {t("guardrails.contentCategoryConfiguration.previewLabel")}:{" "} + {availableCategories.find((c) => c.name === selectedCategoryName)?.display_name} {categoryFileTypes[selectedCategoryName] && ( ({categoryFileTypes[selectedCategoryName]?.toUpperCase()}) diff --git a/ui/litellm-dashboard/src/components/guardrails/custom_code/CustomCodeModal.tsx b/ui/litellm-dashboard/src/components/guardrails/custom_code/CustomCodeModal.tsx index 097acfa4124..9ae2d06a2fa 100644 --- a/ui/litellm-dashboard/src/components/guardrails/custom_code/CustomCodeModal.tsx +++ b/ui/litellm-dashboard/src/components/guardrails/custom_code/CustomCodeModal.tsx @@ -95,14 +95,14 @@ const CODE_TEMPLATES = { }, }; -const MODE_OPTIONS = [ - { value: "pre_call", label: "pre_call (Request)" }, - { value: "post_call", label: "post_call (Response)" }, - { value: "during_call", label: "during_call (Parallel)" }, +const getModeOptions = (t: TFunction) => [ + { value: "pre_call", label: t("guardrails.customCodeModal.modePreCall") }, + { value: "post_call", label: t("guardrails.customCodeModal.modePostCall") }, + { value: "during_call", label: t("guardrails.customCodeModal.modeDuringCall") }, { value: "logging_only", label: "logging_only" }, - { value: "pre_mcp_call", label: "pre_mcp_call (Before MCP Tool Call)" }, - { value: "post_mcp_call", label: "post_mcp_call (After MCP Tool Call)" }, - { value: "during_mcp_call", label: "during_mcp_call (During MCP Tool Call)" }, + { value: "pre_mcp_call", label: t("guardrails.customCodeModal.modePreMcpCall") }, + { value: "post_mcp_call", label: t("guardrails.customCodeModal.modePostMcpCall") }, + { value: "during_mcp_call", label: t("guardrails.customCodeModal.modeDuringMcpCall") }, ]; const getPrimitives = (t: TFunction) => ({ @@ -173,6 +173,7 @@ const CustomCodeModal: React.FC = ({ visible, onClose, onS const { t } = useTranslation(); const isEditMode = !!editData; const primitives = useMemo(() => getPrimitives(t), [t]); + const modeOptions = useMemo(() => getModeOptions(t), [t]); const [guardrailName, setGuardrailName] = useState(""); const [mode, setMode] = useState(["pre_call"]); const [defaultOn, setDefaultOn] = useState(false); @@ -518,7 +519,7 @@ const CustomCodeModal: React.FC = ({ visible, onClose, onS mode="multiple" value={mode} onChange={setMode} - options={MODE_OPTIONS} + options={modeOptions} className="w-full" size="middle" placeholder={t("guardrails.customCodeModal.modePlaceholder")} @@ -678,25 +679,28 @@ const CustomCodeModal: React.FC = ({ visible, onClose, onS
- texts: Message content (always) + texts: {t("guardrails.customCodeModal.fieldTextsDesc")}
- images: Base64 images (vision) + images: {t("guardrails.customCodeModal.fieldImagesDesc")}
- tools: Tool definitions (pre_call), - MCP as OpenAI tool (pre_mcp_call) + tools: {t("guardrails.customCodeModal.fieldToolsDesc")}{" "} + (pre_call),{" "} + {t("guardrails.customCodeModal.fieldToolsMcpDesc")}{" "} + (pre_mcp_call)
- tool_calls: LLM tool calls{" "} + tool_calls: {t("guardrails.customCodeModal.fieldToolCallsDesc")}{" "} (post_call)
- structured_messages: Full messages{" "} + structured_messages:{" "} + {t("guardrails.customCodeModal.fieldStructuredMessagesDesc")}{" "} (pre_call)
- model: Model name (always) + model: {t("guardrails.customCodeModal.fieldModelDesc")}
@@ -705,7 +709,7 @@ const CustomCodeModal: React.FC = ({ visible, onClose, onS onChange={(e) => setTestInput(e.target.value)} rows={8} className="font-mono text-xs" - placeholder='{"texts": ["test message"], ...}' + placeholder={t("guardrails.customCodeModal.testInputPlaceholder")} />
diff --git a/ui/litellm-dashboard/src/components/mcp_tools/StdioConfiguration.tsx b/ui/litellm-dashboard/src/components/mcp_tools/StdioConfiguration.tsx index 1c8495b9d93..0a1a4229651 100644 --- a/ui/litellm-dashboard/src/components/mcp_tools/StdioConfiguration.tsx +++ b/ui/litellm-dashboard/src/components/mcp_tools/StdioConfiguration.tsx @@ -44,18 +44,7 @@ const StdioConfiguration: React.FC = ({ isVisible, requ ]} > diff --git a/ui/litellm-dashboard/src/components/model_info_view.tsx b/ui/litellm-dashboard/src/components/model_info_view.tsx index dfa688e4ad3..56c0f17bfac 100644 --- a/ui/litellm-dashboard/src/components/model_info_view.tsx +++ b/ui/litellm-dashboard/src/components/model_info_view.tsx @@ -1255,7 +1255,7 @@ export default function ModelInfoView({ @@ -1283,14 +1283,7 @@ export default function ModelInfoView({ {isEditing ? ( - + ) : (
diff --git a/ui/litellm-dashboard/src/components/playground/chat_ui/A2AMetrics.tsx b/ui/litellm-dashboard/src/components/playground/chat_ui/A2AMetrics.tsx index 8489be12511..0f9dc4a1d39 100644 --- a/ui/litellm-dashboard/src/components/playground/chat_ui/A2AMetrics.tsx +++ b/ui/litellm-dashboard/src/components/playground/chat_ui/A2AMetrics.tsx @@ -132,7 +132,9 @@ const A2AMetrics: React.FC = ({ a2aMetadata, timeToFirstToken, {/* Time to first token */} {timeToFirstToken !== undefined && ( - TTFT: {(timeToFirstToken / 1000).toFixed(2)}s + + {t("playground.a2AMetrics.ttftPrefix")} {(timeToFirstToken / 1000).toFixed(2)}s + )}
diff --git a/ui/litellm-dashboard/src/components/team/TeamInfo.tsx b/ui/litellm-dashboard/src/components/team/TeamInfo.tsx index 676995589c0..ecfd716ad2b 100644 --- a/ui/litellm-dashboard/src/components/team/TeamInfo.tsx +++ b/ui/litellm-dashboard/src/components/team/TeamInfo.tsx @@ -684,7 +684,9 @@ const TeamInfoView: React.FC = ({ onMouseDown={preventTagMouseDown} style={{ marginInlineEnd: 4 }} > - {isGlobal && } + {isGlobal && ( + + )} {label} ); @@ -1508,7 +1510,7 @@ const TeamInfoView: React.FC = ({ > diff --git a/ui/litellm-dashboard/src/components/vector_store_management/VectorStoreForm.tsx b/ui/litellm-dashboard/src/components/vector_store_management/VectorStoreForm.tsx index 7dd17f00502..b521964295e 100644 --- a/ui/litellm-dashboard/src/components/vector_store_management/VectorStoreForm.tsx +++ b/ui/litellm-dashboard/src/components/vector_store_management/VectorStoreForm.tsx @@ -412,7 +412,7 @@ const VectorStoreForm: React.FC = ({ rows={4} value={metadataJson} onChange={(e) => setMetadataJson(e.target.value)} - placeholder='{"key": "value"}' + placeholder={t("vectorStoreManagement.vectorStoreForm.metadataPlaceholder")} /> diff --git a/ui/litellm-dashboard/src/components/view_logs/LogDetailsDrawer/prettyMessagesUtils.ts b/ui/litellm-dashboard/src/components/view_logs/LogDetailsDrawer/prettyMessagesUtils.ts index 32ae294b1ee..070e6573e3a 100644 --- a/ui/litellm-dashboard/src/components/view_logs/LogDetailsDrawer/prettyMessagesUtils.ts +++ b/ui/litellm-dashboard/src/components/view_logs/LogDetailsDrawer/prettyMessagesUtils.ts @@ -2,38 +2,39 @@ * Utility functions for parsing and formatting messages for pretty view */ +import type { TFunction } from "i18next"; import { ParsedMessage, ParsedMessages, RoleStyle } from "./prettyMessagesTypes"; /** * Role color styles for message cards - minimal, professional design * Color only used for labels and left border accent */ -export const ROLE_STYLES: Record = { +export const getRoleStyles = (t: TFunction): Record => ({ system: { background: "transparent", borderColor: "#8c8c8c", - label: "SYSTEM", + label: t("viewLogs.prettyMessagesUtils.roleSystem"), labelColor: "#8c8c8c", }, user: { background: "transparent", borderColor: "#1677ff", - label: "USER", + label: t("viewLogs.prettyMessagesUtils.roleUser"), labelColor: "#1677ff", }, assistant: { background: "transparent", borderColor: "#52c41a", - label: "ASSISTANT", + label: t("viewLogs.prettyMessagesUtils.roleAssistant"), labelColor: "#52c41a", }, tool: { background: "transparent", borderColor: "#fa8c16", - label: "TOOL RESULT", + label: t("viewLogs.prettyMessagesUtils.roleTool"), labelColor: "#fa8c16", }, -}; +}); /** * Parse request messages and response message from log data diff --git a/ui/litellm-dashboard/src/locales/en.json b/ui/litellm-dashboard/src/locales/en.json index 99752b66e90..41ca8144b0a 100644 --- a/ui/litellm-dashboard/src/locales/en.json +++ b/ui/litellm-dashboard/src/locales/en.json @@ -1423,7 +1423,8 @@ "unableToLoadContent": "Unable to load category content", "viewFileFor": "View {{fileType}} for {{name}}", "contentWillLoad": "Content will load when expanded", - "noTopicsSelected": "No blocked topics selected. Add topics to detect and block harmful content." + "noTopicsSelected": "No blocked topics selected. Add topics to detect and block harmful content.", + "previewLabel": "Preview" }, "contentFilterConfiguration": { "description": "Configure patterns, keywords, and content categories to detect and filter sensitive information in requests and responses.", @@ -1571,7 +1572,21 @@ "primContainsAnyDesc": "Check if any substring exists", "primWordCountDesc": "Count words", "primCharCountDesc": "Count characters", - "primStringTransformsDesc": "String transforms" + "primStringTransformsDesc": "String transforms", + "modePreCall": "pre_call (Request)", + "modePostCall": "post_call (Response)", + "modeDuringCall": "during_call (Parallel)", + "modePreMcpCall": "pre_mcp_call (Before MCP Tool Call)", + "modePostMcpCall": "post_mcp_call (After MCP Tool Call)", + "modeDuringMcpCall": "during_mcp_call (During MCP Tool Call)", + "fieldTextsDesc": "Message content (always)", + "fieldImagesDesc": "Base64 images (vision)", + "fieldToolsDesc": "Tool definitions", + "fieldToolsMcpDesc": "MCP as OpenAI tool", + "fieldToolCallsDesc": "LLM tool calls", + "fieldStructuredMessagesDesc": "Full messages", + "fieldModelDesc": "Model name (always)", + "testInputPlaceholder": "{\"texts\": [\"test message\"], ...}" }, "editGuardrailForm": { "modalTitle": "Edit Guardrail", @@ -2127,7 +2142,9 @@ "connectionTestSuccess": "Connection test successful!", "connectionTestError": "Error testing connection: {{error}}", "modelDeleteSuccess": "Model deleted successfully", - "modelDeleteFailed": "Failed to delete model" + "modelDeleteFailed": "Failed to delete model", + "placeholderModelInfo": "{\"gpt-4\": 100, \"claude-v1\": 200}", + "placeholderLitellmParams": "{\"rpm\": 100, \"timeout\": 0, \"stream_timeout\": 0}" }, "common": { "save": "Save", @@ -3221,6 +3238,12 @@ "imagesCoverage": "images {{guarded}}/{{total}}", "automatedReasoningFindings": "Automated Reasoning Findings", "rawResponse": "Raw Bedrock Guardrail Response" + }, + "prettyMessagesUtils": { + "roleSystem": "SYSTEM", + "roleUser": "USER", + "roleAssistant": "ASSISTANT", + "roleTool": "TOOL RESULT" } }, "userAgentActivity": { @@ -3581,7 +3604,8 @@ "label": "Stdio Configuration (JSON)", "tooltip": "Paste your stdio MCP server configuration in JSON format. You can use the full mcpServers structure from config.yaml or just the inner server configuration.", "required": "Please enter stdio configuration", - "invalidJson": "Please enter valid JSON" + "invalidJson": "Please enter valid JSON", + "placeholder": "{\n \"mcpServers\": {\n \"circleci-mcp-server\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@circleci/mcp-server-circleci\"],\n \"env\": {\n \"CIRCLECI_TOKEN\": \"your-circleci-token\",\n \"CIRCLECI_BASE_URL\": \"https://circleci.com\"\n }\n }\n }\n}" }, "userEnvVarsModal": { "title": "Set your credentials", @@ -4127,7 +4151,8 @@ "statusMessage": "Status Message:", "taskId": "Task ID:", "sessionId": "Session ID:", - "customMetadata": "Custom Metadata:" + "customMetadata": "Custom Metadata:", + "ttftPrefix": "TTFT:" }, "additionalModelSettings": { "useAdvancedParams": "Use Advanced Parameters", @@ -6084,7 +6109,8 @@ "metadataTooltip": "JSON metadata for the vector store (optional)", "invalidMetadataJson": "Invalid JSON in metadata field", "createSuccess": "Vector store created successfully", - "createFailed": "Error creating vector store: {{error}}" + "createFailed": "Error creating vector store: {{error}}", + "metadataPlaceholder": "{\"key\": \"value\"}" }, "vectorStoreTable": { "colVectorStoreId": "Vector Store ID", @@ -6639,7 +6665,9 @@ "deleteMemberInfoTitle": "Team Member Information", "userIdLabel": "User ID", "emailLabel": "Email", - "roleLabel": "Role" + "roleLabel": "Role", + "globalGuardrailAriaLabel": "Global guardrail", + "vaultConfigPlaceholder": "{\"namespace\": \"admin\", \"mount\": \"secret\", \"path_prefix\": \"litellm\"}" }, "teamMemberTab": { "noLimits": "No Limits", @@ -7265,7 +7293,8 @@ "attachedTeams": "Attached Teams", "noTeams": "No teams attached", "created": "Created", - "lastUpdated": "Last Updated" + "lastUpdated": "Last Updated", + "idLabel": "ID:" }, "accessGroupsPage": { "title": "Access Groups", @@ -8116,7 +8145,8 @@ "valueTooltip": "Markdown/text injected into LLM context. Plain strings are fine.", "valuePlaceholder": "What the agent should remember…", "labelMetadata": "Metadata (optional JSON)", - "metadataTooltip": "Optional structured metadata — must be valid JSON if provided." + "metadataTooltip": "Optional structured metadata — must be valid JSON if provided.", + "metadataPlaceholder": "{\"tags\": [\"example\"]}" }, "memoryView": { "pageTitle": "Memory", diff --git a/ui/litellm-dashboard/src/locales/zh-CN.json b/ui/litellm-dashboard/src/locales/zh-CN.json index 76cea0e58b7..49255fa4f46 100644 --- a/ui/litellm-dashboard/src/locales/zh-CN.json +++ b/ui/litellm-dashboard/src/locales/zh-CN.json @@ -1423,7 +1423,8 @@ "unableToLoadContent": "无法加载分类内容", "viewFileFor": "查看 {{fileType}} 文件:{{name}}", "contentWillLoad": "展开后将加载内容", - "noTopicsSelected": "未选择封锁主题。添加主题以检测和拦截有害内容。" + "noTopicsSelected": "未选择封锁主题。添加主题以检测和拦截有害内容。", + "previewLabel": "预览" }, "contentFilterConfiguration": { "description": "配置模式、关键词和内容分类,以检测和过滤请求及响应中的敏感信息。", @@ -1571,7 +1572,21 @@ "primContainsAnyDesc": "检查是否存在任意子字符串", "primWordCountDesc": "统计单词数", "primCharCountDesc": "统计字符数", - "primStringTransformsDesc": "字符串转换" + "primStringTransformsDesc": "字符串转换", + "modePreCall": "pre_call(请求)", + "modePostCall": "post_call(响应)", + "modeDuringCall": "during_call(并行)", + "modePreMcpCall": "pre_mcp_call(MCP 工具调用前)", + "modePostMcpCall": "post_mcp_call(MCP 工具调用后)", + "modeDuringMcpCall": "during_mcp_call(MCP 工具调用中)", + "fieldTextsDesc": "消息内容(始终)", + "fieldImagesDesc": "Base64 图像(视觉)", + "fieldToolsDesc": "工具定义", + "fieldToolsMcpDesc": "MCP 作为 OpenAI 工具", + "fieldToolCallsDesc": "LLM 工具调用", + "fieldStructuredMessagesDesc": "完整消息", + "fieldModelDesc": "模型名称(始终)", + "testInputPlaceholder": "{\"texts\": [\"测试消息\"], ...}" }, "editGuardrailForm": { "modalTitle": "编辑护栏", @@ -2127,7 +2142,9 @@ "connectionTestSuccess": "连接测试成功!", "connectionTestError": "测试连接时出错:{{error}}", "modelDeleteSuccess": "模型已成功删除", - "modelDeleteFailed": "删除模型失败" + "modelDeleteFailed": "删除模型失败", + "placeholderModelInfo": "{\"gpt-4\": 100, \"claude-v1\": 200}", + "placeholderLitellmParams": "{\"rpm\": 100, \"timeout\": 0, \"stream_timeout\": 0}" }, "common": { "save": "保存", @@ -3221,6 +3238,12 @@ "imagesCoverage": "图片 {{guarded}}/{{total}}", "automatedReasoningFindings": "自动推理发现", "rawResponse": "原始 Bedrock 护栏响应" + }, + "prettyMessagesUtils": { + "roleSystem": "系统", + "roleUser": "用户", + "roleAssistant": "助手", + "roleTool": "工具结果" } }, "userAgentActivity": { @@ -3581,7 +3604,8 @@ "label": "Stdio 配置(JSON)", "tooltip": "以 JSON 格式粘贴您的 stdio MCP 服务器配置。可使用 config.yaml 中的完整 mcpServers 结构,或仅填写内部服务器配置。", "required": "请输入 stdio 配置", - "invalidJson": "请输入有效的 JSON" + "invalidJson": "请输入有效的 JSON", + "placeholder": "{\n \"mcpServers\": {\n \"circleci-mcp-server\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@circleci/mcp-server-circleci\"],\n \"env\": {\n \"CIRCLECI_TOKEN\": \"your-circleci-token\",\n \"CIRCLECI_BASE_URL\": \"https://circleci.com\"\n }\n }\n }\n}" }, "userEnvVarsModal": { "title": "设置您的凭据", @@ -4127,7 +4151,8 @@ "statusMessage": "状态消息:", "taskId": "任务 ID:", "sessionId": "会话 ID:", - "customMetadata": "自定义元数据:" + "customMetadata": "自定义元数据:", + "ttftPrefix": "TTFT:" }, "additionalModelSettings": { "useAdvancedParams": "使用高级参数", @@ -6084,7 +6109,8 @@ "metadataTooltip": "向量存储的 JSON 元数据(可选)", "invalidMetadataJson": "元数据字段中的 JSON 无效", "createSuccess": "向量存储创建成功", - "createFailed": "创建向量存储失败:{{error}}" + "createFailed": "创建向量存储失败:{{error}}", + "metadataPlaceholder": "{\"key\": \"value\"}" }, "vectorStoreTable": { "colVectorStoreId": "向量存储 ID", @@ -6639,7 +6665,9 @@ "deleteMemberInfoTitle": "团队成员信息", "userIdLabel": "用户 ID", "emailLabel": "邮箱", - "roleLabel": "角色" + "roleLabel": "角色", + "globalGuardrailAriaLabel": "全局护栏", + "vaultConfigPlaceholder": "{\"namespace\": \"admin\", \"mount\": \"secret\", \"path_prefix\": \"litellm\"}" }, "teamMemberTab": { "noLimits": "无限制", @@ -7265,7 +7293,8 @@ "attachedTeams": "关联团队", "noTeams": "暂无关联团队", "created": "创建时间", - "lastUpdated": "最后更新" + "lastUpdated": "最后更新", + "idLabel": "ID:" }, "accessGroupsPage": { "title": "访问组", @@ -8116,7 +8145,8 @@ "valueTooltip": "注入 LLM 上下文的 Markdown/文本内容,普通字符串即可。", "valuePlaceholder": "Agent 需要记住的内容……", "labelMetadata": "元数据 (可选 JSON)", - "metadataTooltip": "可选的结构化元数据——如填写必须为有效 JSON。" + "metadataTooltip": "可选的结构化元数据——如填写必须为有效 JSON。", + "metadataPlaceholder": "{\"tags\": [\"示例\"]}" }, "memoryView": { "pageTitle": "记忆",