Skip to content

Commit 69d2c4d

Browse files
committed
fix(azure): preserve /v1/ path in _prepare_url for v1 API
When azure_deployment is passed with v1/preview/latest API, the _prepare_url method was rewriting URLs and dropping the /v1/ prefix, causing 404 errors for non-deployment endpoints like /responses. Now _prepare_url skips URL rewriting entirely for v1 API since the base_url already contains /openai/v1/.
1 parent 2c95dde commit 69d2c4d

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

src/openai/lib/azure.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ def _prepare_url(self, url: str) -> httpx.URL:
7676
and the API feature being called is **not** a deployments-based endpoint
7777
(i.e. requires /deployments/deployment-name in the URL path).
7878
"""
79+
# v1 API doesn't need URL rewriting - base_url already has /openai/v1/
80+
if getattr(self, '_is_v1_api', False):
81+
return super()._prepare_url(url)
82+
7983
if self._azure_deployment and self._azure_endpoint and url not in _deployments_endpoints:
8084
merge_url = httpx.URL(url)
8185
if merge_url.is_relative_url:

tests/lib/test_azure.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -887,3 +887,24 @@ def test_v1_api_ignores_azure_deployment_param(self, api_version: str) -> None:
887887
# base_url should still be /openai/v1, not /openai/deployments/ignored-deployment
888888
assert "/openai/v1" in str(client.base_url)
889889
assert "/deployments/" not in str(client.base_url)
890+
891+
@pytest.mark.parametrize("api_version", ["v1", "latest", "preview"])
892+
@pytest.mark.parametrize("client_cls", [AzureOpenAI, AsyncAzureOpenAI])
893+
def test_v1_api_non_deployment_endpoints_keep_v1_path(self, api_version: str, client_cls: type[Client]) -> None:
894+
"""v1 API should keep /v1/ path for non-deployment endpoints like /responses."""
895+
client = client_cls(
896+
api_version=api_version,
897+
api_key="test",
898+
azure_endpoint="https://example.azure.openai.com",
899+
azure_deployment="some-deployment", # Even with deployment param
900+
)
901+
req = client._build_request(
902+
FinalRequestOptions.construct(
903+
method="post",
904+
url="/responses",
905+
json_data={"model": "gpt-4o", "input": "hi"},
906+
)
907+
)
908+
# Should be /openai/v1/responses, NOT /openai/responses
909+
assert "/openai/v1/responses" in str(req.url)
910+
assert "/deployments/" not in str(req.url)

0 commit comments

Comments
 (0)