From cd18740cd9e35ebf28139e6b254e364f06968659 Mon Sep 17 00:00:00 2001 From: Yann Sofian Smatti Date: Wed, 29 Jul 2026 17:34:35 +0200 Subject: [PATCH] feat(ui): add Scaleway provider logo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Scaleway models are already supported server-side — they appear in `model_prices_and_context_window.json` with `litellm_provider: "scaleway"` and route correctly through the proxy. Only the dashboard was unaware of them, so every Scaleway model rendered with the generic grey letter fallback instead of a provider logo. This adds the missing entries in the three structures that the dashboard uses to resolve a logo (`Providers`, `provider_map`, `providerLogoMap`), each inserted at its alphabetical position, plus the logo asset. The SVG comes from Simple Icons (CC0) and is tinted with Scaleway's brand violet, so it sits consistently among the other coloured marks in the list. --- .../public/assets/logos/scaleway.svg | 1 + .../src/components/provider_info_helpers.test.tsx | 15 +++++++++++++++ .../src/components/provider_info_helpers.tsx | 4 ++++ 3 files changed, 20 insertions(+) create mode 100644 ui/litellm-dashboard/public/assets/logos/scaleway.svg diff --git a/ui/litellm-dashboard/public/assets/logos/scaleway.svg b/ui/litellm-dashboard/public/assets/logos/scaleway.svg new file mode 100644 index 00000000000..2227f1be91f --- /dev/null +++ b/ui/litellm-dashboard/public/assets/logos/scaleway.svg @@ -0,0 +1 @@ +Scaleway \ No newline at end of file diff --git a/ui/litellm-dashboard/src/components/provider_info_helpers.test.tsx b/ui/litellm-dashboard/src/components/provider_info_helpers.test.tsx index 4c68e302267..c753559507e 100644 --- a/ui/litellm-dashboard/src/components/provider_info_helpers.test.tsx +++ b/ui/litellm-dashboard/src/components/provider_info_helpers.test.tsx @@ -73,6 +73,21 @@ describe("provider_info_helpers", () => { expect(fromEnumKey.logo).toBe(providerLogoMap[Providers.SCX_AI]); }); + it("should map the scaleway slug and Scaleway enum key to the Scaleway display name and logo", () => { + // The models table passes the litellm_provider slug the backend emits + // ("scaleway"), while the Add Model dropdown passes the provider_map key + // ("Scaleway"). Both must resolve, or Scaleway models fall back to the + // grey letter placeholder. + const fromSlug = getProviderLogoAndName("scaleway"); + expect(fromSlug.displayName).toBe(Providers.Scaleway); + expect(fromSlug.logo).toBe(providerLogoMap[Providers.Scaleway]); + expect(fromSlug.logo).toBeTruthy(); + + const fromEnumKey = getProviderLogoAndName("Scaleway"); + expect(fromEnumKey.displayName).toBe(Providers.Scaleway); + expect(fromEnumKey.logo).toBe(providerLogoMap[Providers.Scaleway]); + }); + it("should map bedrock_mantle slug to Bedrock Mantle display name and logo", () => { const result = getProviderLogoAndName("bedrock_mantle"); expect(result.displayName).toBe(Providers.BedrockMantle); diff --git a/ui/litellm-dashboard/src/components/provider_info_helpers.tsx b/ui/litellm-dashboard/src/components/provider_info_helpers.tsx index de83cd00790..5871f8fde87 100644 --- a/ui/litellm-dashboard/src/components/provider_info_helpers.tsx +++ b/ui/litellm-dashboard/src/components/provider_info_helpers.tsx @@ -51,6 +51,7 @@ import replicateLogo from "../../public/assets/logos/replicate.svg"; import runwayLogo from "../../public/assets/logos/runway.png"; import sambanovaLogo from "../../public/assets/logos/sambanova.svg"; import sapLogo from "../../public/assets/logos/sap.png"; +import scalewayLogo from "../../public/assets/logos/scaleway.svg"; import scxAiLogo from "../../public/assets/logos/scx_ai.svg"; import snowflakeLogo from "../../public/assets/logos/snowflake.svg"; import sonioxLogo from "../../public/assets/logos/soniox.svg"; @@ -159,6 +160,7 @@ export enum Providers { SAGEMAKER_LEGACY = "Sagemaker", Sambanova = "Sambanova", SAP = "SAP Generative AI Hub", + Scaleway = "Scaleway", SCX_AI = "SCX.ai", Snowflake = "Snowflake", Soniox = "Soniox", @@ -275,6 +277,7 @@ export const provider_map: Record = { SageMaker: "sagemaker_chat", Sambanova: "sambanova", SAP: "sap", + Scaleway: "scaleway", SCX_AI: "scx-ai", Snowflake: "snowflake", Soniox: "soniox", @@ -372,6 +375,7 @@ export const providerLogoMap: Partial> = { [Providers.SAGEMAKER_LEGACY]: bedrockLogo.src, [Providers.Sambanova]: sambanovaLogo.src, [Providers.SAP]: sapLogo.src, + [Providers.Scaleway]: scalewayLogo.src, [Providers.SCX_AI]: scxAiLogo.src, [Providers.Snowflake]: snowflakeLogo.src, [Providers.Soniox]: sonioxLogo.src,