From 7a9ee45057dac80770b7ff8ab7378d5321f8c010 Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Thu, 3 Sep 2026 17:15:38 -0700 Subject: [PATCH] fix(openai): treat an empty api_base as unset when discovering models --- litellm/llms/openai/chat/gpt_transformation.py | 2 +- .../llms/openai/test_openai_workload_identity.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/litellm/llms/openai/chat/gpt_transformation.py b/litellm/llms/openai/chat/gpt_transformation.py index 3c8e26ff443..d2a1fc98c73 100644 --- a/litellm/llms/openai/chat/gpt_transformation.py +++ b/litellm/llms/openai/chat/gpt_transformation.py @@ -777,7 +777,7 @@ class OpenAIGPTConfig(BaseLLMModelInfo, BaseConfig): def _fetch_model_ids( api_base: str | None, bearer_token: str | None ) -> list[str]: # mutable-ok: matches get_models' list[str] contract shared by every provider override - parsed_url: Final = httpx.URL("https://api.openai.com" if api_base is None else api_base) + parsed_url: Final = httpx.URL(api_base or "https://api.openai.com") port_suffix: Final = f":{parsed_url.port}" if parsed_url.port else "" response: Final = litellm.module_level_client.get( url=f"{parsed_url.scheme}://{parsed_url.host}{port_suffix}/v1/models", diff --git a/tests/test_litellm/llms/openai/test_openai_workload_identity.py b/tests/test_litellm/llms/openai/test_openai_workload_identity.py index 18ba5e003b6..74415d45638 100644 --- a/tests/test_litellm/llms/openai/test_openai_workload_identity.py +++ b/tests/test_litellm/llms/openai/test_openai_workload_identity.py @@ -581,6 +581,14 @@ class TestDiscoverModels: assert models_route.calls.last.request.headers["Authorization"] == "Bearer sk-discovery" assert not exchange_route.called + @respx.mock + def test_blank_api_base_in_params_discovers_from_openai(self, deployment_wif: dict[str, str]) -> None: + mock_token_exchange("blank-base-bearer") + models_route: Final = self.mock_models() + + assert OpenAIGPTConfig().discover_models({**deployment_wif, "api_base": ""}) == ["gpt-4o-mini", "gpt-4.1"] + assert models_route.calls.last.request.headers["Authorization"] == "Bearer blank-base-bearer" + @respx.mock def test_openai_compatible_subclass_never_mints_wif(self, deployment_wif: dict[str, str]) -> None: exchange_route: Final = mock_token_exchange()