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 604d5923caa..fcea0296de1 100644 --- a/ui/litellm-dashboard/src/components/provider_info_helpers.test.tsx +++ b/ui/litellm-dashboard/src/components/provider_info_helpers.test.tsx @@ -142,6 +142,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 167343fc05e..b8359113d3d 100644 --- a/ui/litellm-dashboard/src/components/provider_info_helpers.tsx +++ b/ui/litellm-dashboard/src/components/provider_info_helpers.tsx @@ -58,6 +58,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"; @@ -181,6 +182,7 @@ export enum Providers { Sail = "Sail", Sambanova = "Sambanova", SAP = "SAP Generative AI Hub", + Scaleway = "Scaleway", SCX_AI = "SCX.ai", Snowflake = "Snowflake", Soniox = "Soniox", @@ -317,6 +319,7 @@ export const provider_map: Record = { Sail: "sail", Sambanova: "sambanova", SAP: "sap", + Scaleway: "scaleway", SCX_AI: "scx-ai", Snowflake: "snowflake", Soniox: "soniox", @@ -434,6 +437,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,