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 <yuneng@berri.ai>
This commit is contained in:
Blossom 2026-04-26 01:52:17 +08:00 committed by GitHub
parent e2d0fd9eac
commit 334aedf2d4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 18 additions and 0 deletions

View file

@ -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");
});

View file

@ -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<string, string> = {
@ -210,6 +211,7 @@ export const provider_map: Record<string, string> = {
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";
}