= {
"theme.dark": "深色",
"theme.system": "跟随系统",
"lang.label": "语言",
+ "provider.name.commandCodeAuth": "Command Code - Auth",
+ "provider.name.commandCodeApi": "Command Code - API",
"provider.name.volcengine": "火山方舟",
"provider.name.volcengineCodingPlan": "火山方舟编程套餐",
"provider.name.volcengineAgentPlan": "火山方舟智能体套餐",
diff --git a/gui/src/pages/ApiKeys.tsx b/gui/src/pages/ApiKeys.tsx
index b920fc375..7b2358412 100644
--- a/gui/src/pages/ApiKeys.tsx
+++ b/gui/src/pages/ApiKeys.tsx
@@ -1,6 +1,7 @@
import { useCallback, useMemo, useRef, useState } from "react";
import { Notice } from "../ui";
import { useI18n, LOCALES } from "../i18n/shared";
+import { formatProviderDisplayName } from "../provider-icons";
import { readJsonIfOk, readJsonOrThrow } from "../fetch-json";
import {
classifyExternalModel,
@@ -320,7 +321,7 @@ export default function ApiKeys({ apiBase, active = true }: { apiBase: string; a
if (model.native) return t("api.sourceNative");
if (model.provider === "combo") return t("api.sourceCombo");
if (model.custom) return t("api.sourceCustom");
- return model.provider;
+ return formatProviderDisplayName(model.provider, t);
};
const protocolLabel = (protocol: GatewayInboundProtocol): string => {
diff --git a/gui/src/pages/Logs.tsx b/gui/src/pages/Logs.tsx
index b513d754f..b1aa6b867 100644
--- a/gui/src/pages/Logs.tsx
+++ b/gui/src/pages/Logs.tsx
@@ -1,6 +1,7 @@
import { useCallback, useEffect, useRef, useState } from "react";
import { useVirtualizer } from "@tanstack/react-virtual";
import { useI18n, LOCALES, type TFn } from "../i18n/shared";
+import { formatProviderDisplayName } from "../provider-icons";
import { formatTokens } from "../format-tokens";
import { hashLogConversationQuery, matchesLogConversationId } from "../log-conversation-id";
import { statusCodeInfo } from "../status-codes";
@@ -786,7 +787,7 @@ export default function Logs({ apiBase }: { apiBase: string }) {
{reasoningWire && {reasoningWire}}
- | {log.provider} |
+ {formatProviderDisplayName(log.provider, t)} |
{log.status}
@@ -924,7 +925,7 @@ function LogDetailDialog({
>
)}
{t("logs.col.model")}{modelLabel(detail.resolvedModel ?? detail.model)}
- {t("logs.col.provider")}{detail.provider}
+ {t("logs.col.provider")}{formatProviderDisplayName(detail.provider, t)}
{(detail.requestedEffort || detail.effectiveEffort) && (
<>{t("logs.col.effort")}{effortLabel(detail)}{reasoningWire ? ` (${reasoningWire})` : ""}>
)}
@@ -1048,7 +1049,7 @@ function LogDetailDialog({
| {attempt.ordinal} |
- {attempt.provider}
+ {formatProviderDisplayName(attempt.provider, t)}
{attempt.model}
{(attempt.requestedEffort || attempt.effectiveEffort) && (
<>
diff --git a/gui/src/pages/Models.tsx b/gui/src/pages/Models.tsx
index f2ff909c3..8e3cb117d 100644
--- a/gui/src/pages/Models.tsx
+++ b/gui/src/pages/Models.tsx
@@ -4,6 +4,7 @@ import { IconChevron, IconBoxes, IconInfo, IconShuffle, IconCheck, IconAlert } f
import { useT } from "../i18n/shared";
import type { TFn, TKey } from "../i18n/shared";
import { modelLabel } from "../model-display";
+import { formatNamespacedModelId, formatProviderDisplayName, providerDisplaySlug } from "../provider-icons";
import { type ComboItem, parseComboList } from "../combo-workspace-data";
import { readJsonIfOk, readJsonOrThrow } from "../fetch-json";
import { readSessionListCache, writeSessionListCache } from "../session-list-cache";
@@ -170,8 +171,8 @@ export default function Models({ apiBase }: { apiBase: string }) {
}, []);
const shadowModelOptions = useMemo(
- () => activeModelOptions(models, disabled, selectedModels ?? {}),
- [models, disabled, selectedModels],
+ () => activeModelOptions(models, disabled, selectedModels ?? {}, t),
+ [models, disabled, selectedModels, t],
);
const loadShadowCall = useCallback(async () => {
@@ -723,7 +724,7 @@ export default function Models({ apiBase }: { apiBase: string }) {
style={{ flex: 1, border: 0, background: "transparent", padding: 0, color: "inherit", cursor: "pointer", textAlign: "left" }}
>
- {provider}
+ {providerDisplaySlug(provider)}
{isNative && {t("models.nativeGroupLabel")}}
{discoveryFailure && (
void applyVisibility("models", provider, [{ id: m.id, native: m.native === true }], off)} disabled={busy} label={m.native ? m.id : m.namespaced} />
- {m.native ? modelLabel(m.id) : m.namespaced}
+ {m.native ? modelLabel(m.id) : formatNamespacedModelId(m.namespaced, t)}
{m.custom && (
{t("models.customBadge")}
@@ -823,7 +824,7 @@ export default function Models({ apiBase }: { apiBase: string }) {
onMouseEnter={keepRowTipOpen}
onMouseLeave={onRowLeave}
>
- {m.native ? m.id : m.namespaced}
+ {m.native ? m.id : m.namespaced}
{m.displayName && {m.displayName} }
{m.custom && (
@@ -832,7 +833,7 @@ export default function Models({ apiBase }: { apiBase: string }) {
)}
{t("models.tipProvider")}
- {m.provider}
+ {formatProviderDisplayName(m.provider, t)}
{(m.contextWindow || m.contextCap) && (
<>
{t("models.tipContext")}
@@ -1204,8 +1205,8 @@ export default function Models({ apiBase }: { apiBase: string }) {
{customModalMode === "add"
- ? t("models.customAddTitle", { provider: customModalProvider })
- : t("models.customEditTitle", { provider: customModalProvider })}
+ ? t("models.customAddTitle", { provider: formatProviderDisplayName(customModalProvider, t) })
+ : t("models.customEditTitle", { provider: formatProviderDisplayName(customModalProvider, t) })}
);
diff --git a/gui/src/pages/Usage.tsx b/gui/src/pages/Usage.tsx
index acd0b78de..afca8218f 100644
--- a/gui/src/pages/Usage.tsx
+++ b/gui/src/pages/Usage.tsx
@@ -1,5 +1,6 @@
import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from "react";
import { useI18n, type TFn, type Locale } from "../i18n/shared";
+import { formatProviderDisplayName } from "../provider-icons";
import { formatTokens } from "../format-tokens";
import { formatEstimatedUsdValue as formatUsdEstimate } from "../intl-formatters";
import { readSessionListCache, writeSessionListCache } from "../session-list-cache";
@@ -512,7 +513,7 @@ function UsageModelsTable({
{models.map(model => (
| {modelLabel(model.model)} |
- {model.provider} |
+ {formatProviderDisplayName(model.provider, t)} |
{model.requests} |
{model.measuredRequests} |
{formatTokens(model.totalTokens, locale)} |
@@ -572,7 +573,7 @@ function UsageProvidersTable({
{providers.map(provider => (
- | {provider.provider} |
+ {formatProviderDisplayName(provider.provider, t)} |
{provider.requests} |
{provider.measuredRequests} |
{formatTokens(provider.totalTokens, locale)} |
diff --git a/gui/src/pages/dashboard-models-section.tsx b/gui/src/pages/dashboard-models-section.tsx
index a3d2f1af2..b839828e5 100644
--- a/gui/src/pages/dashboard-models-section.tsx
+++ b/gui/src/pages/dashboard-models-section.tsx
@@ -2,6 +2,7 @@ import { type Dispatch, type SetStateAction } from "react";
import { IconChevron, IconSearch } from "../icons";
import type { TFn } from "../i18n/shared";
import { EmptyState } from "../ui";
+import { formatProviderDisplayName } from "../provider-icons";
import type { ModelInfo } from "./dashboard-shared";
export function DashboardModelsSection({
@@ -60,7 +61,7 @@ export function DashboardModelsSection({
aria-expanded={open}
>
- {provider}
+ {formatProviderDisplayName(provider, t)}
{rows.length}
{open && (
diff --git a/gui/src/pages/dashboard-overview-sections.tsx b/gui/src/pages/dashboard-overview-sections.tsx
index b293884e6..26a75c3d8 100644
--- a/gui/src/pages/dashboard-overview-sections.tsx
+++ b/gui/src/pages/dashboard-overview-sections.tsx
@@ -2,6 +2,7 @@ import { useEffect, useRef, useState } from "react";
import { IconAlert, IconCheck, IconInfo, IconRefresh, IconX } from "../icons";
import { Trans } from "../i18n/provider";
import { Select } from "../ui";
+import { formatNamespacedModelId } from "../provider-icons";
import { navigateHash } from "../hash-routing";
import { EFFORT_CAP_LEVELS, requireJson, sidecarBackendForModel, updateJobLabel } from "./dashboard-shared";
import { shadowSourceModelBadge } from "./shadow-call-source";
@@ -112,7 +113,7 @@ export function DashboardInjectionPanel({ d }: { apiBase: string; d: Dash }) {
value={injectionModel}
options={[
{ value: "", label: t("dash.injectionNone") },
- ...injectionAvailable.map(m => ({ value: m.namespaced, label: `${m.provider} / ${m.model}` })),
+ ...injectionAvailable.map(m => ({ value: m.namespaced, label: formatNamespacedModelId(`${m.provider}/${m.model}`, t) })),
]}
onChange={(v) => { void saveInjection({ model: v || null, effort: injectionEffort || null }); }}
disabled={injectionSaving}
@@ -360,7 +361,7 @@ export function DashboardSidecarPanels({ d }: { d: Dash }) {
| |