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,