From 980ecf943cbe289fb9f93af4eb3321ac762d5542 Mon Sep 17 00:00:00 2001 From: Chaitanya Laxman Date: Mon, 7 Sep 2026 11:17:40 +0400 Subject: [PATCH] fix(ui): render Z.AI API Key and API Base on the credential form The Add Credential provider list comes from the UI enum, so Z.AI (Zhipu AI) already appears. GET /public/providers/fields reads provider_create_fields.json, which had 117 rows and none with litellm_provider=zai, so the form rendered no fields. Add Model uses that same catalog and never listed Z.AI. Add the missing catalog row (required api_key, optional api_base) and a regression on TestZAIDashboardRegistration. Revert-check: the new test fails with assert 0 == 1 when the row is removed. --- .../provider_create_fields.json | 28 +++++++++++++++++++ .../llms/zai/test_zai_provider.py | 26 +++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/litellm/proxy/public_endpoints/provider_create_fields.json b/litellm/proxy/public_endpoints/provider_create_fields.json index 66f8c2ea36f..d6edcd734b4 100644 --- a/litellm/proxy/public_endpoints/provider_create_fields.json +++ b/litellm/proxy/public_endpoints/provider_create_fields.json @@ -3414,6 +3414,34 @@ ], "default_model_placeholder": "gpt-3.5-turbo" }, + { + "provider": "ZAI", + "provider_display_name": "Z.AI (Zhipu AI)", + "litellm_provider": "zai", + "credential_fields": [ + { + "key": "api_base", + "label": "API Base", + "placeholder": "https://api.z.ai/api/paas/v4", + "tooltip": null, + "required": false, + "field_type": "text", + "options": null, + "default_value": null + }, + { + "key": "api_key", + "label": "API Key", + "placeholder": null, + "tooltip": null, + "required": true, + "field_type": "password", + "options": null, + "default_value": null + } + ], + "default_model_placeholder": "zai/glm-4.5" + }, { "provider": "CURSOR", "provider_display_name": "Cursor", diff --git a/tests/test_litellm/llms/zai/test_zai_provider.py b/tests/test_litellm/llms/zai/test_zai_provider.py index 38ddac8d510..0c8413c46b1 100644 --- a/tests/test_litellm/llms/zai/test_zai_provider.py +++ b/tests/test_litellm/llms/zai/test_zai_provider.py @@ -172,3 +172,29 @@ def test_zai_sync_completion(respx_mock, zai_response, monkeypatch): assert response.choices[0].message.content == "Hello! How can I help you today?" assert response.usage.total_tokens == 25 + + +class TestZAIDashboardRegistration: + @staticmethod + def _provider_create_fields(): + from pathlib import Path + + path = Path(litellm.__file__).parent / "proxy" / "public_endpoints" / "provider_create_fields.json" + with open(path) as f: + return json.load(f) + + def test_zai_is_selectable_in_the_add_model_form(self): + entries = [e for e in self._provider_create_fields() if e["litellm_provider"] == "zai"] + assert len(entries) == 1, "zai must appear exactly once in provider_create_fields.json" + + entry = entries[0] + assert entry["provider"] == "ZAI" + assert entry["provider_display_name"] == "Z.AI (Zhipu AI)" + assert entry["default_model_placeholder"].startswith("zai/") + + fields = {f["key"]: f for f in entry["credential_fields"]} + assert fields["api_key"]["required"] is True + assert fields["api_key"]["field_type"] == "password" + assert fields["api_base"]["required"] is False + assert fields["api_base"]["field_type"] == "text" + assert fields["api_base"]["placeholder"] == "https://api.z.ai/api/paas/v4"