From 0e89bcab60022ea777792856c59780665c6c77d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=AE=AE=E0=AE=A9=E0=AF=8B=E0=AE=9C=E0=AF=8D=E0=AE=95?= =?UTF-8?q?=E0=AF=81=E0=AE=AE=E0=AE=BE=E0=AE=B0=E0=AF=8D=20=E0=AE=AA?= =?UTF-8?q?=E0=AE=B4=E0=AE=A9=E0=AE=BF=E0=AE=9A=E0=AF=8D=E0=AE=9A=E0=AE=BE?= =?UTF-8?q?=E0=AE=AE=E0=AE=BF?= Date: Sun, 2 Mar 2025 19:46:05 +0530 Subject: [PATCH] Fix inconsistent base_url behavior in module client and OpenAIClient Fixes #1373 Update `base_url` behavior to enforce trailing slash in module client * Modify `src/openai/__init__.py` to enforce a trailing slash for `base_url` in the `_ModuleClient` class. * Add a helper method `_enforce_trailing_slash` to the `_ModuleClient` class. * Update tests in `tests/test_module_client.py` to verify the consistent behavior of `base_url` in both module client and `OpenAIClient`. --- For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/openai/openai-python/issues/1373?shareId=XXXX-XXXX-XXXX-XXXX). --- src/openai/__init__.py | 7 ++++++- tests/test_module_client.py | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/openai/__init__.py b/src/openai/__init__.py index fe85956a4a..ae7e2950e8 100644 --- a/src/openai/__init__.py +++ b/src/openai/__init__.py @@ -182,7 +182,7 @@ def project(self, value: str | None) -> None: # type: ignore @override def base_url(self) -> _httpx.URL: if base_url is not None: - return _httpx.URL(base_url) + return self._enforce_trailing_slash(_httpx.URL(base_url)) return super().base_url @@ -245,6 +245,11 @@ def _client(self, value: _httpx.Client) -> None: # type: ignore http_client = value + def _enforce_trailing_slash(self, url: _httpx.URL) -> _httpx.URL: + if url.raw_path.endswith(b"/"): + return url + return url.copy_with(raw_path=url.raw_path + b"/") + class _AzureModuleClient(_ModuleClient, AzureOpenAI): # type: ignore ... diff --git a/tests/test_module_client.py b/tests/test_module_client.py index 6bab33a1d7..bab3e95f70 100644 --- a/tests/test_module_client.py +++ b/tests/test_module_client.py @@ -41,8 +41,8 @@ def test_base_url_option() -> None: openai.base_url = "http://foo.com" - assert openai.base_url == URL("http://foo.com") - assert openai.completions._client.base_url == URL("http://foo.com") + assert openai.base_url == URL("http://foo.com/") + assert openai.completions._client.base_url == URL("http://foo.com/") def test_timeout_option() -> None: