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 @@
-
+
\ 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 @@
-
+
\ 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 @@
-
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 @@
-
\ No newline at end of file
+
\ 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 @@
-
\ 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 @@
-
\ 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 (
+
+ {initial}
+
+ );
+}
+
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;