diff --git a/gui/public/provider-icons/alibaba-color.svg b/gui/public/provider-icons/alibaba-color.svg
index be1080a1b8..69e374735d 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 5301a1b1ca..bf746e1246 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 c0c5b1f168..0000000000
--- 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 62dc0db12d..9c2cb59c26 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 e29f328257..0000000000
--- 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 317f01c5f5..90a30f1acc 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 cf27626831..cf80692961 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 95945cd819..c5b411ad2f 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 95945cd819..0000000000
--- 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 f06306d91d..d903610064 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 d583431639..0000000000
--- 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 f25017e006..f3be195b8e 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 7c4766ecb0..01f493c58c 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 7c4766ecb0..01f493c58c 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 62681dfa7c..822a18de8a 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 87736bbe09..0000000000
--- 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 4c1e12c077..e713560a88 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 ab1286a210..562154d5d3 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 f34a855c38..0000000000
--- 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 f34a855c38..7374eefe94 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 d2953eedb5..2eecc367cc 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 9f855aaa2c..2267427337 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 580a63be26..39c3e2f9b2 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 1905360027..0cf048bec2 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 63c0286dee..0000000000
--- 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 f9503437e2..c50f3a6526 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 70f05829f8..a02c1ba31c 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 580a63be26..ed2bbfbfe5 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 d35752c369..c3ac1b8df2 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 1c0ab7b629..1e3879cc60 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 78caf4fa20..a25156f3bb 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 a84a97e6b7..d617075e7f 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 1d1e68cb08..e0f98db715 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 c28d624233..976e4ba744 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 89325f6dac..fa72fb221b 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 27fdc5ade0..bcbcdd90b8 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 956f5c7a99..054f1df640 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 672395deed..f8a5a23134 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 44c3b8e33c..68457a9783 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 4079e61a12..af12944219 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 f3e1b215ac..acd0b78de1 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 c0e1d0677c..4b1e0871d7 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 066316aea3..31ab807b4b 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 b847a68e70..1fe15f95fb 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;