From b460ef170baf792ba8898796316b45f4a447fb42 Mon Sep 17 00:00:00 2001 From: Ranuga <79456372+Programmer-RD-AI@users.noreply.github.com> Date: Sat, 15 Feb 2025 14:48:10 +0530 Subject: [PATCH 1/6] fix(azure): require azure deployment and update query parameters --- src/openai/lib/azure.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/openai/lib/azure.py b/src/openai/lib/azure.py index f857d76e51..457240f6cb 100644 --- a/src/openai/lib/azure.py +++ b/src/openai/lib/azure.py @@ -208,6 +208,8 @@ def __init__( # define a sentinel value to avoid any typing issues api_key = API_KEY_SENTINEL + self._azure_deployment = azure_deployment + super().__init__( api_key=api_key, organization=organization, @@ -308,11 +310,14 @@ def _prepare_options(self, options: FinalRequestOptions) -> FinalRequestOptions: return options def _configure_realtime(self, model: str, extra_query: Query) -> tuple[Query, dict[str, str]]: + if not self._azure_deployment: + raise ValueError("Azure deployment is required for this API") auth_headers = {} query = { **extra_query, "api-version": self._api_version, - "deployment": model, + "model": model, + "deployment": self._azure_deployment, } if self.api_key != "": auth_headers = {"api-key": self.api_key} @@ -470,6 +475,8 @@ def __init__( # define a sentinel value to avoid any typing issues api_key = API_KEY_SENTINEL + self._azure_deployment = azure_deployment + super().__init__( api_key=api_key, organization=organization, @@ -572,11 +579,14 @@ async def _prepare_options(self, options: FinalRequestOptions) -> FinalRequestOp return options async def _configure_realtime(self, model: str, extra_query: Query) -> tuple[Query, dict[str, str]]: + if not self._azure_deployment: + raise ValueError("Azure deployment is required for this API") auth_headers = {} query = { **extra_query, "api-version": self._api_version, - "deployment": model, + "model": model, + "deployment": self._azure_deployment, } if self.api_key != "": auth_headers = {"api-key": self.api_key} From 0284201d5dc39a04f9e94e8dc456556076cbd0a4 Mon Sep 17 00:00:00 2001 From: Ranuga <79456372+Programmer-RD-AI@users.noreply.github.com> Date: Sat, 15 Feb 2025 15:14:29 +0530 Subject: [PATCH 2/6] refactor(azure): remove model parameter from _configure_realtime and enforce azure deployment requirement --- src/openai/lib/azure.py | 18 ++---------------- src/openai/resources/beta/realtime/realtime.py | 4 ++-- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/src/openai/lib/azure.py b/src/openai/lib/azure.py index 457240f6cb..e10a46ad35 100644 --- a/src/openai/lib/azure.py +++ b/src/openai/lib/azure.py @@ -208,8 +208,6 @@ def __init__( # define a sentinel value to avoid any typing issues api_key = API_KEY_SENTINEL - self._azure_deployment = azure_deployment - super().__init__( api_key=api_key, organization=organization, @@ -309,22 +307,17 @@ def _prepare_options(self, options: FinalRequestOptions) -> FinalRequestOptions: return options - def _configure_realtime(self, model: str, extra_query: Query) -> tuple[Query, dict[str, str]]: + def _configure_realtime(self, extra_query: Query) -> tuple[Query, dict[str, str]]: if not self._azure_deployment: raise ValueError("Azure deployment is required for this API") auth_headers = {} query = { **extra_query, "api-version": self._api_version, - "model": model, "deployment": self._azure_deployment, } if self.api_key != "": auth_headers = {"api-key": self.api_key} - else: - token = self._get_azure_ad_token() - if token: - auth_headers = {"Authorization": f"Bearer {token}"} return query, auth_headers @@ -475,8 +468,6 @@ def __init__( # define a sentinel value to avoid any typing issues api_key = API_KEY_SENTINEL - self._azure_deployment = azure_deployment - super().__init__( api_key=api_key, organization=organization, @@ -578,20 +569,15 @@ async def _prepare_options(self, options: FinalRequestOptions) -> FinalRequestOp return options - async def _configure_realtime(self, model: str, extra_query: Query) -> tuple[Query, dict[str, str]]: + async def _configure_realtime(self, extra_query: Query) -> tuple[Query, dict[str, str]]: if not self._azure_deployment: raise ValueError("Azure deployment is required for this API") auth_headers = {} query = { **extra_query, "api-version": self._api_version, - "model": model, "deployment": self._azure_deployment, } if self.api_key != "": auth_headers = {"api-key": self.api_key} - else: - token = await self._get_azure_ad_token() - if token: - auth_headers = {"Authorization": f"Bearer {token}"} return query, auth_headers diff --git a/src/openai/resources/beta/realtime/realtime.py b/src/openai/resources/beta/realtime/realtime.py index 235790a9f5..5a203a453a 100644 --- a/src/openai/resources/beta/realtime/realtime.py +++ b/src/openai/resources/beta/realtime/realtime.py @@ -324,7 +324,7 @@ async def __aenter__(self) -> AsyncRealtimeConnection: extra_query = self.__extra_query auth_headers = self.__client.auth_headers if is_async_azure_client(self.__client): - extra_query, auth_headers = await self.__client._configure_realtime(self.__model, extra_query) + extra_query, auth_headers = await self.__client._configure_realtime(extra_query) url = self._prepare_url().copy_with( params={ @@ -506,7 +506,7 @@ def __enter__(self) -> RealtimeConnection: extra_query = self.__extra_query auth_headers = self.__client.auth_headers if is_azure_client(self.__client): - extra_query, auth_headers = self.__client._configure_realtime(self.__model, extra_query) + extra_query, auth_headers = self.__client._configure_realtime(extra_query) url = self._prepare_url().copy_with( params={ From f7d5abc434e2979479141599c530e9ecf93d1499 Mon Sep 17 00:00:00 2001 From: Ranuga <79456372+Programmer-RD-AI@users.noreply.github.com> Date: Sat, 15 Feb 2025 15:16:49 +0530 Subject: [PATCH 3/6] fix(azure): add support for Azure AD token authentication in auth headers --- src/openai/lib/azure.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/openai/lib/azure.py b/src/openai/lib/azure.py index e10a46ad35..601a4d3edd 100644 --- a/src/openai/lib/azure.py +++ b/src/openai/lib/azure.py @@ -318,6 +318,10 @@ def _configure_realtime(self, extra_query: Query) -> tuple[Query, dict[str, str] } if self.api_key != "": auth_headers = {"api-key": self.api_key} + else: + token = self._get_azure_ad_token() + if token: + auth_headers = {"Authorization": f"Bearer {token}"} return query, auth_headers @@ -580,4 +584,8 @@ async def _configure_realtime(self, extra_query: Query) -> tuple[Query, dict[str } if self.api_key != "": auth_headers = {"api-key": self.api_key} + else: + token = await self._get_azure_ad_token() + if token: + auth_headers = {"Authorization": f"Bearer {token}"} return query, auth_headers From 4def580b6295682901dff3d4e95133aa5dc80f40 Mon Sep 17 00:00:00 2001 From: Ranuga <79456372+Programmer-RD-AI@users.noreply.github.com> Date: Tue, 18 Feb 2025 06:34:18 +0530 Subject: [PATCH 4/6] fix(azure): enforce azure deployment requirement in _configure_realtime method --- src/openai/lib/azure.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/openai/lib/azure.py b/src/openai/lib/azure.py index 601a4d3edd..f0af9bd80f 100644 --- a/src/openai/lib/azure.py +++ b/src/openai/lib/azure.py @@ -308,14 +308,14 @@ def _prepare_options(self, options: FinalRequestOptions) -> FinalRequestOptions: return options def _configure_realtime(self, extra_query: Query) -> tuple[Query, dict[str, str]]: - if not self._azure_deployment: - raise ValueError("Azure deployment is required for this API") auth_headers = {} query = { **extra_query, "api-version": self._api_version, - "deployment": self._azure_deployment, } + if self._azure_deployment: + query["deployment"] = self._azure_deployment + if self.api_key != "": auth_headers = {"api-key": self.api_key} else: From 117720c6019936d919c297fea7170acfde461499 Mon Sep 17 00:00:00 2001 From: Ranuga <79456372+Programmer-RD-AI@users.noreply.github.com> Date: Tue, 18 Feb 2025 09:06:07 +0530 Subject: [PATCH 5/6] fix(azure): streamline base_url assignment and ensure deployment is included in query parameters --- src/openai/lib/azure.py | 21 +++++++------------ .../resources/beta/realtime/realtime.py | 2 -- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/openai/lib/azure.py b/src/openai/lib/azure.py index f0af9bd80f..281daebc62 100644 --- a/src/openai/lib/azure.py +++ b/src/openai/lib/azure.py @@ -195,11 +195,7 @@ def __init__( raise ValueError( "Must provide one of the `base_url` or `azure_endpoint` arguments, or the `AZURE_OPENAI_ENDPOINT` environment variable" ) - - if azure_deployment is not None: - base_url = f"{azure_endpoint.rstrip('/')}/openai/deployments/{azure_deployment}" - else: - base_url = f"{azure_endpoint.rstrip('/')}/openai" + base_url = f"{azure_endpoint.rstrip('/')}/openai" else: if azure_endpoint is not None: raise ValueError("base_url and azure_endpoint are mutually exclusive") @@ -208,6 +204,7 @@ def __init__( # define a sentinel value to avoid any typing issues api_key = API_KEY_SENTINEL + self._azure_deployment = azure_deployment super().__init__( api_key=api_key, organization=organization, @@ -315,11 +312,10 @@ def _configure_realtime(self, extra_query: Query) -> tuple[Query, dict[str, str] } if self._azure_deployment: query["deployment"] = self._azure_deployment - if self.api_key != "": auth_headers = {"api-key": self.api_key} else: - token = self._get_azure_ad_token() + token = await self._get_azure_ad_token() if token: auth_headers = {"Authorization": f"Bearer {token}"} return query, auth_headers @@ -460,10 +456,7 @@ def __init__( "Must provide one of the `base_url` or `azure_endpoint` arguments, or the `AZURE_OPENAI_ENDPOINT` environment variable" ) - if azure_deployment is not None: - base_url = f"{azure_endpoint.rstrip('/')}/openai/deployments/{azure_deployment}" - else: - base_url = f"{azure_endpoint.rstrip('/')}/openai" + base_url = f"{azure_endpoint.rstrip('/')}/openai" else: if azure_endpoint is not None: raise ValueError("base_url and azure_endpoint are mutually exclusive") @@ -574,14 +567,14 @@ async def _prepare_options(self, options: FinalRequestOptions) -> FinalRequestOp return options async def _configure_realtime(self, extra_query: Query) -> tuple[Query, dict[str, str]]: - if not self._azure_deployment: - raise ValueError("Azure deployment is required for this API") auth_headers = {} query = { **extra_query, "api-version": self._api_version, - "deployment": self._azure_deployment, } + if self._azure_deployment: + query["deployment"] = self._azure_deployment + if self.api_key != "": auth_headers = {"api-key": self.api_key} else: diff --git a/src/openai/resources/beta/realtime/realtime.py b/src/openai/resources/beta/realtime/realtime.py index 5a203a453a..1e641c687c 100644 --- a/src/openai/resources/beta/realtime/realtime.py +++ b/src/openai/resources/beta/realtime/realtime.py @@ -328,7 +328,6 @@ async def __aenter__(self) -> AsyncRealtimeConnection: url = self._prepare_url().copy_with( params={ - **self.__client.base_url.params, "model": self.__model, **extra_query, }, @@ -510,7 +509,6 @@ def __enter__(self) -> RealtimeConnection: url = self._prepare_url().copy_with( params={ - **self.__client.base_url.params, "model": self.__model, **extra_query, }, From aa56dd88c87a1a863b20e9c8658304bc46068404 Mon Sep 17 00:00:00 2001 From: Ranuga <79456372+Programmer-RD-AI@users.noreply.github.com> Date: Tue, 18 Feb 2025 09:15:05 +0530 Subject: [PATCH 6/6] fix(azure): update _configure_realtime method to accept model parameter for deployment assignment --- src/openai/lib/azure.py | 9 ++++++--- src/openai/resources/beta/realtime/realtime.py | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/openai/lib/azure.py b/src/openai/lib/azure.py index 281daebc62..2d3663011e 100644 --- a/src/openai/lib/azure.py +++ b/src/openai/lib/azure.py @@ -304,7 +304,7 @@ def _prepare_options(self, options: FinalRequestOptions) -> FinalRequestOptions: return options - def _configure_realtime(self, extra_query: Query) -> tuple[Query, dict[str, str]]: + def _configure_realtime(self, model: str, extra_query: Query) -> tuple[Query, dict[str, str]]: auth_headers = {} query = { **extra_query, @@ -312,6 +312,8 @@ def _configure_realtime(self, extra_query: Query) -> tuple[Query, dict[str, str] } if self._azure_deployment: query["deployment"] = self._azure_deployment + else: + query["deployment"] = model if self.api_key != "": auth_headers = {"api-key": self.api_key} else: @@ -566,7 +568,7 @@ async def _prepare_options(self, options: FinalRequestOptions) -> FinalRequestOp return options - async def _configure_realtime(self, extra_query: Query) -> tuple[Query, dict[str, str]]: + async def _configure_realtime(self, model: str, extra_query: Query) -> tuple[Query, dict[str, str]]: auth_headers = {} query = { **extra_query, @@ -574,7 +576,8 @@ async def _configure_realtime(self, extra_query: Query) -> tuple[Query, dict[str } if self._azure_deployment: query["deployment"] = self._azure_deployment - + else: + query["deployment"] = model if self.api_key != "": auth_headers = {"api-key": self.api_key} else: diff --git a/src/openai/resources/beta/realtime/realtime.py b/src/openai/resources/beta/realtime/realtime.py index 1e641c687c..9643db79b9 100644 --- a/src/openai/resources/beta/realtime/realtime.py +++ b/src/openai/resources/beta/realtime/realtime.py @@ -324,7 +324,7 @@ async def __aenter__(self) -> AsyncRealtimeConnection: extra_query = self.__extra_query auth_headers = self.__client.auth_headers if is_async_azure_client(self.__client): - extra_query, auth_headers = await self.__client._configure_realtime(extra_query) + extra_query, auth_headers = await self.__client._configure_realtime(self.__model, extra_query) url = self._prepare_url().copy_with( params={ @@ -505,7 +505,7 @@ def __enter__(self) -> RealtimeConnection: extra_query = self.__extra_query auth_headers = self.__client.auth_headers if is_azure_client(self.__client): - extra_query, auth_headers = self.__client._configure_realtime(extra_query) + extra_query, auth_headers = self.__client._configure_realtime(self.__model, extra_query) url = self._prepare_url().copy_with( params={