From 7c0faa8bc6f6cd255bab2e9d2e658db8f6d99cf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B9=E9=9B=AA?= <2b@yorha.xyz> Date: Wed, 10 Jun 2026 13:35:09 +0900 Subject: [PATCH] feat(ui): i18n for model info view --- .../src/components/model_info_view.tsx | 278 +++++++++--------- ui/litellm-dashboard/src/locales/en.json | 98 ++++++ ui/litellm-dashboard/src/locales/zh-CN.json | 98 ++++++ 3 files changed, 342 insertions(+), 132 deletions(-) diff --git a/ui/litellm-dashboard/src/components/model_info_view.tsx b/ui/litellm-dashboard/src/components/model_info_view.tsx index 66a00b9bbe3..dfa688e4ad3 100644 --- a/ui/litellm-dashboard/src/components/model_info_view.tsx +++ b/ui/litellm-dashboard/src/components/model_info_view.tsx @@ -2,6 +2,7 @@ import { useModelCostMap } from "@/app/(dashboard)/hooks/models/useModelCostMap" import { useModelHub, useModelsInfo } from "@/app/(dashboard)/hooks/models/useModels"; import { transformModelData } from "@/app/(dashboard)/models-and-endpoints/utils/modelDataTransformer"; import { InfoCircleOutlined } from "@ant-design/icons"; +import { useTranslation } from "react-i18next"; import { ArrowLeftIcon, KeyIcon, RefreshIcon, TrashIcon } from "@heroicons/react/outline"; import { Card, @@ -63,6 +64,7 @@ export default function ModelInfoView({ onModelUpdate, modelAccessGroups, }: ModelInfoViewProps) { + const { t } = useTranslation(); const [form] = Form.useForm(); const [localModelData, setLocalModelData] = useState(null); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); @@ -220,9 +222,9 @@ export default function ModelInfoView({ custom_llm_provider: localModelData.litellm_params?.custom_llm_provider, }, }; - NotificationsManager.info("Storing credential.."); + NotificationsManager.info(t("modelInfoView.storingCredential")); let credentialResponse = await credentialCreateCall(accessToken, credentialItem); - NotificationsManager.success("Credential stored successfully"); + NotificationsManager.success(t("modelInfoView.credentialStoredSuccess")); }; const handleModelUpdate = async (values: any) => { @@ -236,7 +238,7 @@ export default function ModelInfoView({ parsedExtraParams = values.litellm_extra_params ? JSON.parse(values.litellm_extra_params) : {}; delete parsedExtraParams.litellm_credential_name; } catch (e) { - NotificationsManager.fromBackend("Invalid JSON in LiteLLM Params"); + NotificationsManager.fromBackend(t("modelInfoView.invalidJsonLitellmParams")); setIsSaving(false); return; } @@ -347,7 +349,7 @@ export default function ModelInfoView({ }; } } catch (e) { - NotificationsManager.fromBackend("Invalid JSON in Model Info"); + NotificationsManager.fromBackend(t("modelInfoView.invalidJsonModelInfo")); return; } @@ -373,12 +375,12 @@ export default function ModelInfoView({ onModelUpdate(updatedModelData); } - NotificationsManager.success("Model settings updated successfully"); + NotificationsManager.success(t("modelInfoView.modelSettingsUpdateSuccess")); setIsDirty(false); setIsEditing(false); } catch (error) { console.error("Error updating model:", error); - NotificationsManager.fromBackend("Failed to update model settings"); + NotificationsManager.fromBackend(t("modelInfoView.modelSettingsUpdateFailed")); } finally { setIsSaving(false); } @@ -389,9 +391,9 @@ export default function ModelInfoView({ return (
- Back to Models + {t("modelInfoView.backToModels")} - Loading... + {t("common.loading")}
); } @@ -401,9 +403,9 @@ export default function ModelInfoView({ return (
- Back to Models + {t("modelInfoView.backToModels")} - Model not found + {t("modelInfoView.modelNotFound")}
); } @@ -411,7 +413,7 @@ export default function ModelInfoView({ const handleTestConnection = async () => { if (!accessToken) return; try { - NotificationsManager.info("Testing connection..."); + NotificationsManager.info(t("modelInfoView.testingConnection")); const response = await testConnectionRequest( accessToken, { @@ -432,15 +434,17 @@ export default function ModelInfoView({ ); if (response.status === "success") { - NotificationsManager.success("Connection test successful!"); + NotificationsManager.success(t("modelInfoView.connectionTestSuccess")); } else { throw new Error(response?.result?.error || response?.message || "Unknown error"); } } catch (error) { if (error instanceof Error) { - NotificationsManager.error("Error testing connection: " + truncateString(error.message, 100)); + NotificationsManager.error( + t("modelInfoView.connectionTestError", { error: truncateString(error.message, 100) }), + ); } else { - NotificationsManager.error("Error testing connection: " + String(error)); + NotificationsManager.error(t("modelInfoView.connectionTestError", { error: String(error) })); } } }; @@ -450,7 +454,7 @@ export default function ModelInfoView({ setDeleteLoading(true); if (!accessToken) return; await modelDeleteCall(accessToken, modelId); - NotificationsManager.success("Model deleted successfully"); + NotificationsManager.success(t("modelInfoView.modelDeleteSuccess")); if (onModelUpdate) { onModelUpdate({ @@ -462,7 +466,7 @@ export default function ModelInfoView({ onClose(); } catch (error) { console.error("Error deleting the model:", error); - NotificationsManager.fromBackend("Failed to delete model"); + NotificationsManager.fromBackend(t("modelInfoView.modelDeleteFailed")); } finally { setDeleteLoading(false); setIsDeleteModalOpen(false); @@ -492,9 +496,9 @@ export default function ModelInfoView({
- Back to Models + {t("modelInfoView.backToModels")} - Public Model Name: {getDisplayModelName(modelData)} + {t("modelInfoView.publicModelName", { name: getDisplayModelName(modelData) })}
{modelData.model_info.id}
- Overview - Raw JSON + {t("modelInfoView.tabOverview")} + {t("modelInfoView.tabRawJson")} @@ -555,12 +559,12 @@ export default function ModelInfoView({ {/* Overview Grid */} - Provider + {t("modelInfoView.provider")}
{modelData.provider && ( {`${modelData.provider} { const target = e.currentTarget as HTMLImageElement; @@ -581,24 +585,24 @@ export default function ModelInfoView({ }} /> )} - {modelData.provider || "Not Set"} + {modelData.provider || t("modelInfoView.notSet")}
- LiteLLM Model + {t("modelInfoView.litellmModel")}
- +
- {modelData.litellm_model_name || "Not Set"} + {modelData.litellm_model_name || t("modelInfoView.notSet")}
- Pricing + {t("modelInfoView.pricing")}
- Input: ${modelData.input_cost}/1M tokens - Output: ${modelData.output_cost}/1M tokens + {t("modelInfoView.pricingInput", { cost: modelData.input_cost })} + {t("modelInfoView.pricingOutput", { cost: modelData.output_cost })}
@@ -614,14 +618,14 @@ export default function ModelInfoView({ d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" /> - Created At{" "} + {t("modelInfoView.createdAt")}{" "} {modelData.model_info.created_at ? new Date(modelData.model_info.created_at).toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric", }) - : "Not Set"} + : t("modelInfoView.notSet")}
@@ -632,28 +636,30 @@ export default function ModelInfoView({ d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" /> - Created By {modelData.model_info.created_by || "Not Set"} + {t("modelInfoView.createdBy", { + creator: modelData.model_info.created_by || t("modelInfoView.notSet"), + })}
{/* Settings Card */}
- Model Settings + {t("modelInfoView.modelSettings")}
{isAutoRouter && canEditModel && !isEditing && ( setIsAutoRouterModalOpen(true)} className="flex items-center"> - Edit Auto Router + {t("modelInfoView.editAutoRouter")} )} {canEditModel ? ( !isEditing && ( setIsEditing(true)} className="flex items-center"> - Edit Settings + {t("modelInfoView.editSettings")} ) ) : ( - + )} @@ -728,10 +734,10 @@ export default function ModelInfoView({
- Model Name + {t("modelInfoView.fieldModelName")} {isEditing ? ( - + ) : (
{localModelData.model_name}
@@ -739,10 +745,10 @@ export default function ModelInfoView({
- LiteLLM Model Name + {t("modelInfoView.fieldLitellmModelName")} {isEditing ? ( - + ) : (
{localModelData.litellm_model_name}
@@ -750,10 +756,10 @@ export default function ModelInfoView({
- Input Cost (per 1M tokens) + {t("modelInfoView.fieldInputCost")} {isEditing ? ( - + ) : (
@@ -761,16 +767,16 @@ export default function ModelInfoView({ ? (localModelData.litellm_params?.input_cost_per_token * 1_000_000).toFixed(4) : localModelData?.model_info?.input_cost_per_token ? (localModelData.model_info.input_cost_per_token * 1_000_000).toFixed(4) - : "Not Set"} + : t("modelInfoView.notSet")}
)}
- Output Cost (per 1M tokens) + {t("modelInfoView.fieldOutputCost")} {isEditing ? ( - + ) : (
@@ -778,20 +784,20 @@ export default function ModelInfoView({ ? (localModelData.litellm_params.output_cost_per_token * 1_000_000).toFixed(4) : localModelData?.model_info?.output_cost_per_token ? (localModelData.model_info.output_cost_per_token * 1_000_000).toFixed(4) - : "Not Set"} + : t("modelInfoView.notSet")}
)}
- Cache Read Cost (per 1M tokens) + {t("modelInfoView.fieldCacheReadCost")} {isEditing ? ( - + ) : (
@@ -801,20 +807,20 @@ export default function ModelInfoView({ : localModelData?.model_info?.cache_read_input_token_cost !== undefined && localModelData?.model_info?.cache_read_input_token_cost !== null ? (localModelData.model_info.cache_read_input_token_cost * 1_000_000).toFixed(4) - : "Not Set"} + : t("modelInfoView.notSet")}
)}
- Cache Write Cost (per 1M tokens) + {t("modelInfoView.fieldCacheWriteCost")} {isEditing ? ( - + ) : (
@@ -824,123 +830,123 @@ export default function ModelInfoView({ : localModelData?.model_info?.cache_creation_input_token_cost !== undefined && localModelData?.model_info?.cache_creation_input_token_cost !== null ? (localModelData.model_info.cache_creation_input_token_cost * 1_000_000).toFixed(4) - : "Not Set"} + : t("modelInfoView.notSet")}
)}
- API Base + {t("modelInfoView.fieldApiBase")} {isEditing ? ( - + ) : (
- {localModelData.litellm_params?.api_base || "Not Set"} + {localModelData.litellm_params?.api_base || t("modelInfoView.notSet")}
)}
- Custom LLM Provider + {t("modelInfoView.fieldCustomLlmProvider")} {isEditing ? ( - + ) : (
- {localModelData.litellm_params?.custom_llm_provider || "Not Set"} + {localModelData.litellm_params?.custom_llm_provider || t("modelInfoView.notSet")}
)}
- Organization + {t("modelInfoView.fieldOrganization")} {isEditing ? ( - + ) : (
- {localModelData.litellm_params?.organization || "Not Set"} + {localModelData.litellm_params?.organization || t("modelInfoView.notSet")}
)}
- TPM (Tokens per Minute) + {t("modelInfoView.fieldTpm")} {isEditing ? ( - + ) : (
- {localModelData.litellm_params?.tpm || "Not Set"} + {localModelData.litellm_params?.tpm || t("modelInfoView.notSet")}
)}
- RPM (Requests per Minute) + {t("modelInfoView.fieldRpm")} {isEditing ? ( - + ) : (
- {localModelData.litellm_params?.rpm || "Not Set"} + {localModelData.litellm_params?.rpm || t("modelInfoView.notSet")}
)}
- Max Retries + {t("modelInfoView.fieldMaxRetries")} {isEditing ? ( - + ) : (
- {localModelData.litellm_params?.max_retries || "Not Set"} + {localModelData.litellm_params?.max_retries || t("modelInfoView.notSet")}
)}
- Timeout (seconds) + {t("modelInfoView.fieldTimeout")} {isEditing ? ( - + ) : (
- {localModelData.litellm_params?.timeout || "Not Set"} + {localModelData.litellm_params?.timeout || t("modelInfoView.notSet")}
)}
- Stream Timeout (seconds) + {t("modelInfoView.fieldStreamTimeout")} {isEditing ? ( - + ) : (
- {localModelData.litellm_params?.stream_timeout || "Not Set"} + {localModelData.litellm_params?.stream_timeout || t("modelInfoView.notSet")}
)}
- Model Access Groups + {t("modelInfoView.fieldModelAccessGroups")} {isEditing ? ( ) : ( - "No tags assigned" + t("modelInfoView.noTagsAssigned") ) ) : ( localModelData.litellm_params.tags ) ) : ( - "Not Set" + t("modelInfoView.notSet") )}
)}
- Existing Credentials + {t("modelInfoView.fieldExistingCredentials")} {isEditing ? ( { @@ -1199,7 +1206,7 @@ export default function ModelInfoView({ ) : (
- {localModelData.model_info?.health_check_model || "Not Set"} + {localModelData.model_info?.health_check_model || t("modelInfoView.notSet")}
)}
@@ -1214,31 +1221,36 @@ export default function ModelInfoView({ /> ) : (
- Cache Control + {t("modelInfoView.fieldCacheControl")}
{localModelData.litellm_params?.cache_control_injection_points ? (
-

Enabled

+

{t("common.enabled")}

{localModelData.litellm_params.cache_control_injection_points.map( (point: any, i: number) => (
- Location: {point.location},{point.role && Role: {point.role}} - {point.index !== undefined && Index: {point.index}} + {t("modelInfoView.cacheControlLocation", { location: point.location })} + {point.role && ( + {t("modelInfoView.cacheControlRole", { role: point.role })} + )} + {point.index !== undefined && ( + {t("modelInfoView.cacheControlIndex", { index: point.index })} + )}
), )}
) : ( - "Disabled" + t("common.disabled") )}
)} )}
) : ( - Loading... + {t("common.loading")} )} @@ -1330,26 +1344,26 @@ export default function ModelInfoView({ setIsDeleteModalOpen(false)} @@ -1369,7 +1383,7 @@ export default function ModelInfoView({ setIsCredentialModalOpen(false)} - title="Using Existing Credential" + title={t("modelInfoView.usingExistingCredentialTitle")} > {modelData.litellm_params.litellm_credential_name} diff --git a/ui/litellm-dashboard/src/locales/en.json b/ui/litellm-dashboard/src/locales/en.json index 97775079fbf..0095e87a1d7 100644 --- a/ui/litellm-dashboard/src/locales/en.json +++ b/ui/litellm-dashboard/src/locales/en.json @@ -1299,6 +1299,104 @@ "public": "Public", "infoShort": "Info" }, + "modelInfoView": { + "backToModels": "Back to Models", + "publicModelName": "Public Model Name: {{name}}", + "modelNotFound": "Model not found", + "testConnection": "Test Connection", + "reuseCredentials": "Re-use Credentials", + "deleteModel": "Delete Model", + "tabOverview": "Overview", + "tabRawJson": "Raw JSON", + "provider": "Provider", + "providerLogoAlt": "{{provider}} logo", + "notSet": "Not Set", + "litellmModel": "LiteLLM Model", + "pricing": "Pricing", + "pricingInput": "Input: ${{cost}}/1M tokens", + "pricingOutput": "Output: ${{cost}}/1M tokens", + "createdAt": "Created At", + "createdBy": "Created By {{creator}}", + "createdByLabel": "Created By", + "modelSettings": "Model Settings", + "editAutoRouter": "Edit Auto Router", + "editSettings": "Edit Settings", + "editTooltip": "Only DB models can be edited. You must be an admin or the creator of the model to edit it.", + "fieldModelName": "Model Name", + "placeholderModelName": "Enter model name", + "fieldLitellmModelName": "LiteLLM Model Name", + "placeholderLitellmModelName": "Enter LiteLLM model name", + "fieldInputCost": "Input Cost (per 1M tokens)", + "placeholderInputCost": "Enter input cost", + "fieldOutputCost": "Output Cost (per 1M tokens)", + "placeholderOutputCost": "Enter output cost", + "fieldCacheReadCost": "Cache Read Cost (per 1M tokens)", + "tooltipCacheReadCost": "If left blank on save, defaults to Input Cost.", + "placeholderCacheReadCost": "Defaults to Input Cost if blank", + "fieldCacheWriteCost": "Cache Write Cost (per 1M tokens)", + "tooltipCacheWriteCost": "If left blank on save, defaults to Input Cost (backend falls back to input_cost_per_token).", + "placeholderCacheWriteCost": "Defaults to Input Cost if blank", + "fieldApiBase": "API Base", + "placeholderApiBase": "Enter API base", + "fieldCustomLlmProvider": "Custom LLM Provider", + "placeholderCustomLlmProvider": "Enter custom LLM provider", + "fieldOrganization": "Organization", + "placeholderOrganization": "Enter organization", + "fieldTpm": "TPM (Tokens per Minute)", + "placeholderTpm": "Enter TPM", + "fieldRpm": "RPM (Requests per Minute)", + "placeholderRpm": "Enter RPM", + "fieldMaxRetries": "Max Retries", + "placeholderMaxRetries": "Enter max retries", + "fieldTimeout": "Timeout (seconds)", + "placeholderTimeout": "Enter timeout", + "fieldStreamTimeout": "Stream Timeout (seconds)", + "placeholderStreamTimeout": "Enter stream timeout", + "fieldModelAccessGroups": "Model Access Groups", + "placeholderModelAccessGroups": "Select existing groups or type to create new ones", + "noGroupsAssigned": "No groups assigned", + "fieldGuardrails": "Guardrails", + "tooltipGuardrails": "Apply safety guardrails to this model to filter content or enforce policies", + "placeholderGuardrails": "Select existing guardrails or type to create new ones", + "noGuardrailsAssigned": "No guardrails assigned", + "fieldKnowledgeBases": "Attached Knowledge Bases (RAG)", + "tooltipKnowledgeBases": "Vector stores used for RAG. Every request to this model will automatically retrieve context from these knowledge bases.", + "placeholderKnowledgeBases": "Select knowledge bases (optional)", + "noKnowledgeBasesAttached": "No knowledge bases attached", + "fieldTags": "Tags", + "placeholderTags": "Select existing tags or type to create new ones", + "noTagsAssigned": "No tags assigned", + "fieldExistingCredentials": "Existing Credentials", + "placeholderCredentials": "Select or search for existing credentials", + "credentialManual": "Manual", + "fieldHealthCheckModel": "Health Check Model", + "placeholderHealthCheckModel": "Select existing health check model", + "fieldCacheControl": "Cache Control", + "cacheControlLocation": "Location: {{location}},", + "cacheControlRole": "Role: {{role}}", + "cacheControlIndex": "Index: {{index}}", + "fieldModelInfo": "Model Info", + "fieldLitellmParams": "LiteLLM Params", + "tooltipLitellmParams": "Optional litellm params used for making a litellm.completion() call. Some params are automatically added by LiteLLM.", + "fieldTeamId": "Team ID", + "saveChanges": "Save Changes", + "deleteModalTitle": "Delete Model", + "deleteModalAlert": "This action cannot be undone.", + "deleteModalMessage": "Are you sure you want to delete this model?", + "deleteModalResourceTitle": "Model Information", + "usingExistingCredentialTitle": "Using Existing Credential", + "storingCredential": "Storing credential..", + "credentialStoredSuccess": "Credential stored successfully", + "invalidJsonLitellmParams": "Invalid JSON in LiteLLM Params", + "invalidJsonModelInfo": "Invalid JSON in Model Info", + "modelSettingsUpdateSuccess": "Model settings updated successfully", + "modelSettingsUpdateFailed": "Failed to update model settings", + "testingConnection": "Testing connection...", + "connectionTestSuccess": "Connection test successful!", + "connectionTestError": "Error testing connection: {{error}}", + "modelDeleteSuccess": "Model deleted successfully", + "modelDeleteFailed": "Failed to delete model" + }, "common": { "save": "Save", "cancel": "Cancel", diff --git a/ui/litellm-dashboard/src/locales/zh-CN.json b/ui/litellm-dashboard/src/locales/zh-CN.json index 6eaab904dad..cbfe08966ca 100644 --- a/ui/litellm-dashboard/src/locales/zh-CN.json +++ b/ui/litellm-dashboard/src/locales/zh-CN.json @@ -1299,6 +1299,104 @@ "public": "公开", "infoShort": "详情" }, + "modelInfoView": { + "backToModels": "返回模型列表", + "publicModelName": "公开模型名称:{{name}}", + "modelNotFound": "未找到模型", + "testConnection": "测试连接", + "reuseCredentials": "复用凭据", + "deleteModel": "删除模型", + "tabOverview": "概览", + "tabRawJson": "原始 JSON", + "provider": "提供商", + "providerLogoAlt": "{{provider}} 标志", + "notSet": "未设置", + "litellmModel": "LiteLLM 模型", + "pricing": "定价", + "pricingInput": "输入:${{cost}}/百万 Token", + "pricingOutput": "输出:${{cost}}/百万 Token", + "createdAt": "创建时间", + "createdBy": "创建者:{{creator}}", + "createdByLabel": "创建者", + "modelSettings": "模型设置", + "editAutoRouter": "编辑自动路由器", + "editSettings": "编辑设置", + "editTooltip": "只有数据库模型可以编辑。您必须是管理员或该模型的创建者才能编辑。", + "fieldModelName": "模型名称", + "placeholderModelName": "输入模型名称", + "fieldLitellmModelName": "LiteLLM 模型名称", + "placeholderLitellmModelName": "输入 LiteLLM 模型名称", + "fieldInputCost": "输入费用(每百万 Token)", + "placeholderInputCost": "输入输入费用", + "fieldOutputCost": "输出费用(每百万 Token)", + "placeholderOutputCost": "输入输出费用", + "fieldCacheReadCost": "缓存读取费用(每百万 Token)", + "tooltipCacheReadCost": "保存时若留空,默认使用输入费用。", + "placeholderCacheReadCost": "留空则默认使用输入费用", + "fieldCacheWriteCost": "缓存写入费用(每百万 Token)", + "tooltipCacheWriteCost": "保存时若留空,默认使用输入费用(后端回退到 input_cost_per_token)。", + "placeholderCacheWriteCost": "留空则默认使用输入费用", + "fieldApiBase": "API 基础地址", + "placeholderApiBase": "输入 API 基础地址", + "fieldCustomLlmProvider": "自定义 LLM 提供商", + "placeholderCustomLlmProvider": "输入自定义 LLM 提供商", + "fieldOrganization": "组织", + "placeholderOrganization": "输入组织", + "fieldTpm": "TPM(每分钟 Token 数)", + "placeholderTpm": "输入 TPM", + "fieldRpm": "RPM(每分钟请求数)", + "placeholderRpm": "输入 RPM", + "fieldMaxRetries": "最大重试次数", + "placeholderMaxRetries": "输入最大重试次数", + "fieldTimeout": "超时(秒)", + "placeholderTimeout": "输入超时时间", + "fieldStreamTimeout": "流式超时(秒)", + "placeholderStreamTimeout": "输入流式超时时间", + "fieldModelAccessGroups": "模型访问组", + "placeholderModelAccessGroups": "选择现有访问组或输入新组名", + "noGroupsAssigned": "未分配访问组", + "fieldGuardrails": "护栏", + "tooltipGuardrails": "为此模型应用安全护栏以过滤内容或执行策略", + "placeholderGuardrails": "选择现有护栏或输入新的护栏", + "noGuardrailsAssigned": "未分配护栏", + "fieldKnowledgeBases": "关联知识库(RAG)", + "tooltipKnowledgeBases": "用于 RAG 的向量存储。每次请求此模型时将自动从这些知识库中检索上下文。", + "placeholderKnowledgeBases": "选择知识库(可选)", + "noKnowledgeBasesAttached": "未关联知识库", + "fieldTags": "标签", + "placeholderTags": "选择现有标签或输入新标签", + "noTagsAssigned": "未分配标签", + "fieldExistingCredentials": "现有凭据", + "placeholderCredentials": "选择或搜索现有凭据", + "credentialManual": "手动", + "fieldHealthCheckModel": "健康检查模型", + "placeholderHealthCheckModel": "选择现有健康检查模型", + "fieldCacheControl": "缓存控制", + "cacheControlLocation": "位置:{{location}},", + "cacheControlRole": "角色:{{role}}", + "cacheControlIndex": "索引:{{index}}", + "fieldModelInfo": "模型信息", + "fieldLitellmParams": "LiteLLM 参数", + "tooltipLitellmParams": "用于调用 litellm.completion() 的可选参数,部分参数由 LiteLLM 自动添加。", + "fieldTeamId": "团队 ID", + "saveChanges": "保存更改", + "deleteModalTitle": "删除模型", + "deleteModalAlert": "此操作无法撤销。", + "deleteModalMessage": "确定要删除此模型吗?", + "deleteModalResourceTitle": "模型信息", + "usingExistingCredentialTitle": "使用现有凭据", + "storingCredential": "正在存储凭据...", + "credentialStoredSuccess": "凭据已成功存储", + "invalidJsonLitellmParams": "LiteLLM 参数中存在无效的 JSON", + "invalidJsonModelInfo": "模型信息中存在无效的 JSON", + "modelSettingsUpdateSuccess": "模型设置已成功更新", + "modelSettingsUpdateFailed": "更新模型设置失败", + "testingConnection": "正在测试连接...", + "connectionTestSuccess": "连接测试成功!", + "connectionTestError": "测试连接时出错:{{error}}", + "modelDeleteSuccess": "模型已成功删除", + "modelDeleteFailed": "删除模型失败" + }, "common": { "save": "保存", "cancel": "取消",