From 334aedf2d49cbc1992b153610950a12b6603a97d Mon Sep 17 00:00:00 2001 From: Blossom Date: Sun, 26 Apr 2026 01:52:17 +0800 Subject: [PATCH] fix(ui): add missing 'zai' (Z.AI / Zhipu AI) provider to Add-Model dropdown (#25482) (#26419) The Z.AI (Zhipu AI) provider was missing from the Add-Model dropdown in the admin UI, even though the rest of the stack already supports it: - /public/providers returns 'zai' in the provider list - provider_endpoints_support.json includes a full 'zai' entry with endpoints and a docs URL (https://docs.litellm.ai/docs/providers/zai) - Backend routing works for zai/* models (e.g. zai/glm-4.5, zai/glm-5) - There are many zai/* entries in model_prices_and_context_window.json The dropdown is driven by the hard-coded Providers enum and provider_map in provider_info_helpers.tsx, which did not include 'zai', so users could not select Z.AI when adding a model through the UI. This PR: - Adds Providers.ZAI ('Z.AI (Zhipu AI)') to the enum. - Maps it to 'zai' in provider_map so the UI round-trips the existing backend provider key. - Wires a reasonable placeholder 'zai/glm-4.5' in getPlaceholder, since glm-4.5 is an established zai/* model in the pricing catalog. - Adds two regression tests in provider_info_helpers.test.tsx: 1. getProviderLogoAndName('zai') resolves to Providers.ZAI. 2. getPlaceholder(Providers.ZAI) returns 'zai/glm-4.5'. No logo asset is added in this PR; getProviderLogoAndName already gracefully returns an empty logo string for providers missing from providerLogoMap, matching the existing pattern for several other providers. A follow-up can add a dedicated logo. Fixes #25482 Co-authored-by: yuneng-jiang --- .../src/components/provider_info_helpers.test.tsx | 14 ++++++++++++++ .../src/components/provider_info_helpers.tsx | 4 ++++ 2 files changed, 18 insertions(+) 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 a8021f94d84..fa014de4e62 100644 --- a/ui/litellm-dashboard/src/components/provider_info_helpers.test.tsx +++ b/ui/litellm-dashboard/src/components/provider_info_helpers.test.tsx @@ -68,6 +68,16 @@ describe("provider_info_helpers", () => { expect(result.logo).toBe(providerLogoMap[Providers.OpenAI]); }); + it("should resolve the zai (Z.AI) provider value to the Z.AI display name", () => { + // Regression test for https://github.com/BerriAI/litellm/issues/25482 — + // the backend already returns `zai` from /public/providers and the docs + // have a dedicated page, but the UI dropdown was missing an entry, so + // `getProviderLogoAndName("zai")` previously returned the raw value as + // the display name (no mapping). + const result = getProviderLogoAndName("zai"); + expect(result.displayName).toBe(Providers.ZAI); + }); + it("should return provider value as display name when no mapping exists", () => { const unknownProvider = "unknown_provider"; const result = getProviderLogoAndName(unknownProvider); @@ -156,6 +166,10 @@ describe("provider_info_helpers", () => { expect(getPlaceholder(Providers.WATSONX)).toBe("watsonx/ibm/granite-3-3-8b-instruct"); }); + it("should return zai/glm-4.5 placeholder for Z.AI provider", () => { + expect(getPlaceholder(Providers.ZAI)).toBe("zai/glm-4.5"); + }); + it("should return default gpt-3.5-turbo placeholder for unknown provider", () => { expect(getPlaceholder("UnknownProvider" as any)).toBe("gpt-3.5-turbo"); }); diff --git a/ui/litellm-dashboard/src/components/provider_info_helpers.tsx b/ui/litellm-dashboard/src/components/provider_info_helpers.tsx index e833d0eb4fb..62c0633d117 100644 --- a/ui/litellm-dashboard/src/components/provider_info_helpers.tsx +++ b/ui/litellm-dashboard/src/components/provider_info_helpers.tsx @@ -103,6 +103,7 @@ export enum Providers { WATSONX_TEXT = "Watsonx Text", xAI = "xAI", XINFERENCE = "Xinference", + ZAI = "Z.AI (Zhipu AI)", } export const provider_map: Record = { @@ -210,6 +211,7 @@ export const provider_map: Record = { WATSONX_TEXT: "watsonx_text", xAI: "xai", XINFERENCE: "xinference", + ZAI: "zai", }; const asset_logos_folder = "../ui/assets/logos/"; @@ -366,6 +368,8 @@ export const getPlaceholder = (selectedProvider: string): string => { return "watsonx/ibm/granite-3-3-8b-instruct"; } else if (selectedProvider === Providers.Cursor) { return "cursor/claude-4-sonnet"; + } else if (selectedProvider === Providers.ZAI) { + return "zai/glm-4.5"; } else { return "gpt-3.5-turbo"; }