diff --git a/gui/public/provider-icons/alibaba-color.svg b/gui/public/provider-icons/alibaba-color.svg index be1080a1b..69e374735 100644 --- a/gui/public/provider-icons/alibaba-color.svg +++ b/gui/public/provider-icons/alibaba-color.svg @@ -1 +1 @@ -Alibaba Cloud +Alibaba Cloud \ No newline at end of file diff --git a/gui/public/provider-icons/antigravity-color.svg b/gui/public/provider-icons/antigravity-color.svg index 5301a1b1c..bf746e124 100644 --- a/gui/public/provider-icons/antigravity-color.svg +++ b/gui/public/provider-icons/antigravity-color.svg @@ -1 +1 @@ -Antigravity +Antigravity \ No newline at end of file diff --git a/gui/public/provider-icons/antigravity.svg b/gui/public/provider-icons/antigravity.svg deleted file mode 100644 index c0c5b1f16..000000000 --- a/gui/public/provider-icons/antigravity.svg +++ /dev/null @@ -1 +0,0 @@ -Antigravity diff --git a/gui/public/provider-icons/claude-color.svg b/gui/public/provider-icons/claude-color.svg index 62dc0db12..9c2cb59c2 100644 --- a/gui/public/provider-icons/claude-color.svg +++ b/gui/public/provider-icons/claude-color.svg @@ -1 +1 @@ -Claude \ No newline at end of file +Claude \ No newline at end of file diff --git a/gui/public/provider-icons/claude.svg b/gui/public/provider-icons/claude.svg deleted file mode 100644 index e29f32825..000000000 --- a/gui/public/provider-icons/claude.svg +++ /dev/null @@ -1 +0,0 @@ -Claude \ No newline at end of file diff --git a/gui/public/provider-icons/cline-color.svg b/gui/public/provider-icons/cline-color.svg index 317f01c5f..90a30f1ac 100644 --- a/gui/public/provider-icons/cline-color.svg +++ b/gui/public/provider-icons/cline-color.svg @@ -1,5 +1,5 @@ - + Cline @@ -13,4 +13,4 @@ - + \ No newline at end of file diff --git a/gui/public/provider-icons/cloudflare-ai-gateway-color.svg b/gui/public/provider-icons/cloudflare-ai-gateway-color.svg index cf2762683..cf8069296 100644 --- a/gui/public/provider-icons/cloudflare-ai-gateway-color.svg +++ b/gui/public/provider-icons/cloudflare-ai-gateway-color.svg @@ -1 +1 @@ -Cloudflare +Cloudflare \ No newline at end of file diff --git a/gui/public/provider-icons/copilot-color.svg b/gui/public/provider-icons/copilot-color.svg index 95945cd81..c5b411ad2 100644 --- a/gui/public/provider-icons/copilot-color.svg +++ b/gui/public/provider-icons/copilot-color.svg @@ -1 +1 @@ -Copilot +Copilot \ No newline at end of file diff --git a/gui/public/provider-icons/copilot.svg b/gui/public/provider-icons/copilot.svg deleted file mode 100644 index 95945cd81..000000000 --- a/gui/public/provider-icons/copilot.svg +++ /dev/null @@ -1 +0,0 @@ -Copilot diff --git a/gui/public/provider-icons/cursor-color.svg b/gui/public/provider-icons/cursor-color.svg index f06306d91..d90361006 100644 --- a/gui/public/provider-icons/cursor-color.svg +++ b/gui/public/provider-icons/cursor-color.svg @@ -1,2 +1,2 @@ -Cursor +Cursor \ No newline at end of file diff --git a/gui/public/provider-icons/cursor.svg b/gui/public/provider-icons/cursor.svg deleted file mode 100644 index d58343163..000000000 --- a/gui/public/provider-icons/cursor.svg +++ /dev/null @@ -1,2 +0,0 @@ - -Cursor diff --git a/gui/public/provider-icons/deepseek-color.svg b/gui/public/provider-icons/deepseek-color.svg index f25017e00..f3be195b8 100644 --- a/gui/public/provider-icons/deepseek-color.svg +++ b/gui/public/provider-icons/deepseek-color.svg @@ -1 +1 @@ -DeepSeek +DeepSeek \ No newline at end of file diff --git a/gui/public/provider-icons/firepass-color.svg b/gui/public/provider-icons/firepass-color.svg index 7c4766ecb..01f493c58 100644 --- a/gui/public/provider-icons/firepass-color.svg +++ b/gui/public/provider-icons/firepass-color.svg @@ -1 +1 @@ -Fireworks +Fireworks \ No newline at end of file diff --git a/gui/public/provider-icons/fireworks-color.svg b/gui/public/provider-icons/fireworks-color.svg index 7c4766ecb..01f493c58 100644 --- a/gui/public/provider-icons/fireworks-color.svg +++ b/gui/public/provider-icons/fireworks-color.svg @@ -1 +1 @@ -Fireworks +Fireworks \ No newline at end of file diff --git a/gui/public/provider-icons/gemini-color.svg b/gui/public/provider-icons/gemini-color.svg index 62681dfa7..822a18de8 100644 --- a/gui/public/provider-icons/gemini-color.svg +++ b/gui/public/provider-icons/gemini-color.svg @@ -1 +1 @@ -Gemini \ No newline at end of file +Gemini \ No newline at end of file diff --git a/gui/public/provider-icons/gemini.svg b/gui/public/provider-icons/gemini.svg deleted file mode 100644 index 87736bbe0..000000000 --- a/gui/public/provider-icons/gemini.svg +++ /dev/null @@ -1 +0,0 @@ -Gemini \ No newline at end of file diff --git a/gui/public/provider-icons/github-copilot-color.svg b/gui/public/provider-icons/github-copilot-color.svg index 4c1e12c07..e713560a8 100644 --- a/gui/public/provider-icons/github-copilot-color.svg +++ b/gui/public/provider-icons/github-copilot-color.svg @@ -1 +1 @@ -GitHub Copilot +GitHub Copilot \ No newline at end of file diff --git a/gui/public/provider-icons/gitlab-duo-color.svg b/gui/public/provider-icons/gitlab-duo-color.svg index ab1286a21..562154d5d 100644 --- a/gui/public/provider-icons/gitlab-duo-color.svg +++ b/gui/public/provider-icons/gitlab-duo-color.svg @@ -1 +1 @@ -GitLab +GitLab \ No newline at end of file diff --git a/gui/public/provider-icons/grok-color.svg b/gui/public/provider-icons/grok-color.svg deleted file mode 100644 index f34a855c3..000000000 --- a/gui/public/provider-icons/grok-color.svg +++ /dev/null @@ -1 +0,0 @@ -Grok diff --git a/gui/public/provider-icons/grok.svg b/gui/public/provider-icons/grok.svg index f34a855c3..7374eefe9 100644 --- a/gui/public/provider-icons/grok.svg +++ b/gui/public/provider-icons/grok.svg @@ -1 +1 @@ -Grok +Grok diff --git a/gui/public/provider-icons/groq-color.svg b/gui/public/provider-icons/groq-color.svg index d2953eedb..2eecc367c 100644 --- a/gui/public/provider-icons/groq-color.svg +++ b/gui/public/provider-icons/groq-color.svg @@ -1 +1 @@ -Groq +Groq \ No newline at end of file diff --git a/gui/public/provider-icons/huggingface-color.svg b/gui/public/provider-icons/huggingface-color.svg index 9f855aaa2..226742733 100644 --- a/gui/public/provider-icons/huggingface-color.svg +++ b/gui/public/provider-icons/huggingface-color.svg @@ -1 +1 @@ -Hugging Face +Hugging Face \ No newline at end of file diff --git a/gui/public/provider-icons/kimi-color.svg b/gui/public/provider-icons/kimi-color.svg index 580a63be2..39c3e2f9b 100644 --- a/gui/public/provider-icons/kimi-color.svg +++ b/gui/public/provider-icons/kimi-color.svg @@ -1 +1 @@ -Moonshot AI +Moonshot AI \ No newline at end of file diff --git a/gui/public/provider-icons/kiro-color.svg b/gui/public/provider-icons/kiro-color.svg index 190536002..0cf048bec 100644 --- a/gui/public/provider-icons/kiro-color.svg +++ b/gui/public/provider-icons/kiro-color.svg @@ -1,5 +1,5 @@ - + Kiro @@ -12,4 +12,4 @@ - + \ No newline at end of file diff --git a/gui/public/provider-icons/kiro.svg b/gui/public/provider-icons/kiro.svg deleted file mode 100644 index 63c0286de..000000000 --- a/gui/public/provider-icons/kiro.svg +++ /dev/null @@ -1,14 +0,0 @@ - - -Kiro - - - - - - - - - - - diff --git a/gui/public/provider-icons/lm-studio-color.svg b/gui/public/provider-icons/lm-studio-color.svg index f9503437e..c50f3a652 100644 --- a/gui/public/provider-icons/lm-studio-color.svg +++ b/gui/public/provider-icons/lm-studio-color.svg @@ -1 +1 @@ -LM Studio +LM Studio \ No newline at end of file diff --git a/gui/public/provider-icons/mistral-color.svg b/gui/public/provider-icons/mistral-color.svg index 70f05829f..a02c1ba31 100644 --- a/gui/public/provider-icons/mistral-color.svg +++ b/gui/public/provider-icons/mistral-color.svg @@ -1 +1 @@ -Mistral AI +Mistral AI \ No newline at end of file diff --git a/gui/public/provider-icons/moonshot-color.svg b/gui/public/provider-icons/moonshot-color.svg index 580a63be2..ed2bbfbfe 100644 --- a/gui/public/provider-icons/moonshot-color.svg +++ b/gui/public/provider-icons/moonshot-color.svg @@ -1 +1 @@ -Moonshot AI +Moonshot AI \ No newline at end of file diff --git a/gui/public/provider-icons/nvidia-color.svg b/gui/public/provider-icons/nvidia-color.svg index d35752c36..c3ac1b8df 100644 --- a/gui/public/provider-icons/nvidia-color.svg +++ b/gui/public/provider-icons/nvidia-color.svg @@ -1 +1 @@ -NVIDIA +NVIDIA \ No newline at end of file diff --git a/gui/public/provider-icons/ollama-color.svg b/gui/public/provider-icons/ollama-color.svg index 1c0ab7b62..1e3879cc6 100644 --- a/gui/public/provider-icons/ollama-color.svg +++ b/gui/public/provider-icons/ollama-color.svg @@ -1 +1 @@ -Ollama +Ollama \ No newline at end of file diff --git a/gui/public/provider-icons/openai.svg b/gui/public/provider-icons/openai.svg index 78caf4fa2..a25156f3b 100644 --- a/gui/public/provider-icons/openai.svg +++ b/gui/public/provider-icons/openai.svg @@ -1 +1 @@ -OpenAI \ No newline at end of file +OpenAI \ No newline at end of file diff --git a/gui/public/provider-icons/opencode.svg b/gui/public/provider-icons/opencode.svg index a84a97e6b..d617075e7 100644 --- a/gui/public/provider-icons/opencode.svg +++ b/gui/public/provider-icons/opencode.svg @@ -1 +1,2 @@ - + +OpenCodeX diff --git a/gui/public/provider-icons/openrouter-color.svg b/gui/public/provider-icons/openrouter-color.svg index 1d1e68cb0..e0f98db71 100644 --- a/gui/public/provider-icons/openrouter-color.svg +++ b/gui/public/provider-icons/openrouter-color.svg @@ -1 +1 @@ -OpenRouter +OpenRouter \ No newline at end of file diff --git a/gui/public/provider-icons/pi.svg b/gui/public/provider-icons/pi.svg index c28d62423..976e4ba74 100644 --- a/gui/public/provider-icons/pi.svg +++ b/gui/public/provider-icons/pi.svg @@ -1,5 +1,5 @@ - + - + \ No newline at end of file diff --git a/gui/public/provider-icons/qianfan-color.svg b/gui/public/provider-icons/qianfan-color.svg index 89325f6da..fa72fb221 100644 --- a/gui/public/provider-icons/qianfan-color.svg +++ b/gui/public/provider-icons/qianfan-color.svg @@ -1 +1 @@ -Baidu +Baidu \ No newline at end of file diff --git a/gui/public/provider-icons/qwen-portal-color.svg b/gui/public/provider-icons/qwen-portal-color.svg index 27fdc5ade..bcbcdd90b 100644 --- a/gui/public/provider-icons/qwen-portal-color.svg +++ b/gui/public/provider-icons/qwen-portal-color.svg @@ -1 +1 @@ -QWen +QWen \ No newline at end of file diff --git a/gui/public/provider-icons/vercel-ai-gateway-color.svg b/gui/public/provider-icons/vercel-ai-gateway-color.svg index 956f5c7a9..054f1df64 100644 --- a/gui/public/provider-icons/vercel-ai-gateway-color.svg +++ b/gui/public/provider-icons/vercel-ai-gateway-color.svg @@ -1 +1 @@ -Vercel +Vercel \ No newline at end of file diff --git a/gui/public/provider-icons/vllm-color.svg b/gui/public/provider-icons/vllm-color.svg index 672395dee..f8a5a2313 100644 --- a/gui/public/provider-icons/vllm-color.svg +++ b/gui/public/provider-icons/vllm-color.svg @@ -1 +1 @@ -vLLM +vLLM \ No newline at end of file diff --git a/gui/public/provider-icons/xiaomi-color.svg b/gui/public/provider-icons/xiaomi-color.svg index 44c3b8e33..68457a978 100644 --- a/gui/public/provider-icons/xiaomi-color.svg +++ b/gui/public/provider-icons/xiaomi-color.svg @@ -1 +1 @@ -Xiaomi +Xiaomi \ No newline at end of file diff --git a/gui/src/components/provider-workspace/ProviderRail.tsx b/gui/src/components/provider-workspace/ProviderRail.tsx index 4079e61a1..af1294421 100644 --- a/gui/src/components/provider-workspace/ProviderRail.tsx +++ b/gui/src/components/provider-workspace/ProviderRail.tsx @@ -5,7 +5,7 @@ */ /* eslint-disable react-refresh/only-export-components -- label helpers co-locate with the rail row */ import { useT, type TFn } from "../../i18n/shared"; -import { IconServer, IconStar } from "../../icons"; +import { IconStar } from "../../icons"; import { binProviderStatus, isFreeProvider, @@ -48,18 +48,41 @@ export function ProviderIcon({ name, adapter, baseUrl, cls }: { baseUrl?: string; cls: string; }) { + const t = useT(); const src = providerIconSrc(name, { adapter, baseUrl }); return ( {src ? ( ) : ( - ); } +/** + * Colored initial-letter tile for providers without a logo asset (long-tail + * presets and custom providers). Hue is derived deterministically from the + * provider id so the same provider always gets the same color. + */ +export function ProviderFallbackMark({ name, label }: { name: string; label: string }) { + const hue = [...name].reduce((acc, ch) => acc + ch.charCodeAt(0), 0) % 360; + const initial = (label.trim()[0] ?? name[0] ?? "?").toUpperCase(); + return ( + + ); +} + export function RailRow({ item, selected, tabbable, modelCount, isDefault, showConfigId, onClick, onFocus }: { item: WorkspaceItem; selected: boolean; diff --git a/gui/src/pages/Usage.tsx b/gui/src/pages/Usage.tsx index f3e1b215a..acd0b78de 100644 --- a/gui/src/pages/Usage.tsx +++ b/gui/src/pages/Usage.tsx @@ -231,7 +231,7 @@ function UsageFilters({ )} {choice === "claude" && ( - + )} {choice === "grok" && ( diff --git a/gui/src/provider-icons.ts b/gui/src/provider-icons.ts index c0e1d0677..4b1e0871d 100644 --- a/gui/src/provider-icons.ts +++ b/gui/src/provider-icons.ts @@ -43,7 +43,7 @@ const PROVIDER_ICON_ALIASES: Record = { "qwen-cloud": "qwen-portal-color.svg", "vercel-ai-gateway": "vercel-ai-gateway-color.svg", vllm: "vllm-color.svg", - xai: "grok-color.svg", + xai: "grok.svg", "mimo-free": "xiaomi-color.svg", xiaomi: "xiaomi-color.svg", }; diff --git a/gui/src/styles.css b/gui/src/styles.css index 066316aea..31ab807b4 100644 --- a/gui/src/styles.css +++ b/gui/src/styles.css @@ -1994,11 +1994,6 @@ button.prov-account-row.active { cursor: default; } .usage-segmented-btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; border: none; background: transparent; color: var(--muted); padding: 4px 12px; border-radius: var(--radius-pill); cursor: pointer; font: inherit; white-space: nowrap; } .usage-segmented-btn.active { background: var(--raised); color: var(--text); font-weight: var(--weight-semibold); } .usage-source-mark { width: var(--icon-sm); height: var(--icon-sm); flex: 0 0 auto; object-fit: contain; } -:root[data-theme="dark"] .usage-source-mark { filter: invert(1); } - -@media (prefers-color-scheme: dark) { - :root:not([data-theme="light"]) .usage-source-mark { filter: invert(1); } -} @media (max-width: 760px) { .usage-segmented-btn { min-height: var(--control-touch); } diff --git a/gui/src/styles/provider-workspace-shell.css b/gui/src/styles/provider-workspace-shell.css index b847a68e7..1fe15f95f 100644 --- a/gui/src/styles/provider-workspace-shell.css +++ b/gui/src/styles/provider-workspace-shell.css @@ -316,6 +316,20 @@ display: block; } +/* Colored initial-letter fallback for providers without a logo asset. */ +.provider-icon-fallback { + width: 100%; + height: 100%; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: var(--radius-xs); + font-weight: var(--weight-semibold); + font-size: 13px; + line-height: 1; + user-select: none; +} + .provider-icon-mask { mask-size: contain; mask-repeat: no-repeat;