From 7e04224360e6c354c8254a09f6d534053aed15f9 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Thu, 26 Feb 2026 20:12:50 +0900 Subject: [PATCH 1/7] Fix walrus operator precedence for model_id in AzureOpenAIResponsesClient (#4299) Add parentheses around the walrus assignment so model_id receives the actual string value instead of the boolean result of `kwargs.pop(...) and not deployment_name`. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../core/agent_framework/azure/_responses_client.py | 2 +- .../core/tests/azure/test_azure_responses_client.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/python/packages/core/agent_framework/azure/_responses_client.py b/python/packages/core/agent_framework/azure/_responses_client.py index b5b0ca1b5e..2debbd7b21 100644 --- a/python/packages/core/agent_framework/azure/_responses_client.py +++ b/python/packages/core/agent_framework/azure/_responses_client.py @@ -180,7 +180,7 @@ class MyOptions(AzureOpenAIResponsesOptions, total=False): client: AzureOpenAIResponsesClient[MyOptions] = AzureOpenAIResponsesClient() response = await client.get_response("Hello", options={"my_custom_option": "value"}) """ - if model_id := kwargs.pop("model_id", None) and not deployment_name: + if (model_id := kwargs.pop("model_id", None)) and not deployment_name: deployment_name = str(model_id) # Project client path: create OpenAI client from an Azure AI Foundry project diff --git a/python/packages/core/tests/azure/test_azure_responses_client.py b/python/packages/core/tests/azure/test_azure_responses_client.py index 4e9b25ca6a..0b1e076d08 100644 --- a/python/packages/core/tests/azure/test_azure_responses_client.py +++ b/python/packages/core/tests/azure/test_azure_responses_client.py @@ -90,6 +90,14 @@ def test_init_model_id_constructor(azure_openai_unit_test_env: dict[str, str]) - assert isinstance(azure_responses_client, SupportsChatGetResponse) +def test_init_model_id_kwarg(azure_openai_unit_test_env: dict[str, str]) -> None: + """Test that model_id kwarg correctly sets the deployment name (issue #4299).""" + azure_responses_client = AzureOpenAIResponsesClient(model_id="gpt-4o") + + assert azure_responses_client.model_id == "gpt-4o" + assert isinstance(azure_responses_client, SupportsChatGetResponse) + + def test_init_with_default_header(azure_openai_unit_test_env: dict[str, str]) -> None: default_headers = {"X-Unit-Test": "test-guid"} From 9c3d8c795808dc4b992ecc7781b6859ad960e414 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Thu, 26 Feb 2026 20:18:19 +0900 Subject: [PATCH 2/7] Address review: replace walrus with explicit None check, add edge-case tests (#4299) - Replace walrus operator with explicit assignment and 'is not None' check to avoid boolean-coercion pitfalls (empty string now correctly surfaces as ValueError instead of silently falling back) - Add test: deployment_name takes precedence over model_id kwarg - Add test: model_id='' raises ValueError - Add test: model_id=None falls back to env var Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../azure/_responses_client.py | 3 ++- .../azure/test_azure_responses_client.py | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/python/packages/core/agent_framework/azure/_responses_client.py b/python/packages/core/agent_framework/azure/_responses_client.py index 2debbd7b21..a96d596176 100644 --- a/python/packages/core/agent_framework/azure/_responses_client.py +++ b/python/packages/core/agent_framework/azure/_responses_client.py @@ -180,7 +180,8 @@ class MyOptions(AzureOpenAIResponsesOptions, total=False): client: AzureOpenAIResponsesClient[MyOptions] = AzureOpenAIResponsesClient() response = await client.get_response("Hello", options={"my_custom_option": "value"}) """ - if (model_id := kwargs.pop("model_id", None)) and not deployment_name: + model_id = kwargs.pop("model_id", None) + if model_id is not None and deployment_name is None: deployment_name = str(model_id) # Project client path: create OpenAI client from an Azure AI Foundry project diff --git a/python/packages/core/tests/azure/test_azure_responses_client.py b/python/packages/core/tests/azure/test_azure_responses_client.py index 0b1e076d08..0bc043f4fe 100644 --- a/python/packages/core/tests/azure/test_azure_responses_client.py +++ b/python/packages/core/tests/azure/test_azure_responses_client.py @@ -98,6 +98,27 @@ def test_init_model_id_kwarg(azure_openai_unit_test_env: dict[str, str]) -> None assert isinstance(azure_responses_client, SupportsChatGetResponse) +def test_init_model_id_kwarg_does_not_override_deployment_name(azure_openai_unit_test_env: dict[str, str]) -> None: + """Test that deployment_name takes precedence over model_id kwarg (issue #4299).""" + azure_responses_client = AzureOpenAIResponsesClient(deployment_name="my-deployment", model_id="gpt-4o") + + assert azure_responses_client.model_id == "my-deployment" + assert isinstance(azure_responses_client, SupportsChatGetResponse) + + +def test_init_model_id_kwarg_empty_string(azure_openai_unit_test_env: dict[str, str]) -> None: + """Test that model_id="" surfaces as invalid rather than silently falling back.""" + with pytest.raises(ValueError): + AzureOpenAIResponsesClient(model_id="") + + +def test_init_model_id_kwarg_none(azure_openai_unit_test_env: dict[str, str]) -> None: + """Test that model_id=None does not override the env-var deployment name.""" + azure_responses_client = AzureOpenAIResponsesClient(model_id=None) + + assert azure_responses_client.model_id == azure_openai_unit_test_env["AZURE_OPENAI_RESPONSES_DEPLOYMENT_NAME"] + + def test_init_with_default_header(azure_openai_unit_test_env: dict[str, str]) -> None: default_headers = {"X-Unit-Test": "test-guid"} From c5dc3b98fd866b3cb6671cdbc8268c0330d56635 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Thu, 26 Feb 2026 20:20:02 +0900 Subject: [PATCH 3/7] Add explicit validation for empty model_id in AzureOpenAIResponsesClient Reject empty or whitespace-only model_id with ValueError instead of silently passing an empty deployment name downstream. This ensures the test_init_model_id_kwarg_empty_string test correctly validates behavior defined in production code rather than relying on downstream validation. Addresses PR review feedback for #4299. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- python/packages/core/agent_framework/azure/_responses_client.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/packages/core/agent_framework/azure/_responses_client.py b/python/packages/core/agent_framework/azure/_responses_client.py index a96d596176..a412adcaf0 100644 --- a/python/packages/core/agent_framework/azure/_responses_client.py +++ b/python/packages/core/agent_framework/azure/_responses_client.py @@ -181,6 +181,8 @@ class MyOptions(AzureOpenAIResponsesOptions, total=False): response = await client.get_response("Hello", options={"my_custom_option": "value"}) """ model_id = kwargs.pop("model_id", None) + if model_id is not None and not str(model_id).strip(): + raise ValueError("model_id must not be empty") if model_id is not None and deployment_name is None: deployment_name = str(model_id) From 5bed03ee4b17a29da4ab6bb3d7a9713cb9489b0d Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Fri, 27 Feb 2026 08:29:01 +0900 Subject: [PATCH 4/7] Simplify model_id handling using walrus operator Addresses review comment on PR #4310. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../packages/core/agent_framework/azure/_responses_client.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/python/packages/core/agent_framework/azure/_responses_client.py b/python/packages/core/agent_framework/azure/_responses_client.py index a412adcaf0..2debbd7b21 100644 --- a/python/packages/core/agent_framework/azure/_responses_client.py +++ b/python/packages/core/agent_framework/azure/_responses_client.py @@ -180,10 +180,7 @@ class MyOptions(AzureOpenAIResponsesOptions, total=False): client: AzureOpenAIResponsesClient[MyOptions] = AzureOpenAIResponsesClient() response = await client.get_response("Hello", options={"my_custom_option": "value"}) """ - model_id = kwargs.pop("model_id", None) - if model_id is not None and not str(model_id).strip(): - raise ValueError("model_id must not be empty") - if model_id is not None and deployment_name is None: + if (model_id := kwargs.pop("model_id", None)) and not deployment_name: deployment_name = str(model_id) # Project client path: create OpenAI client from an Azure AI Foundry project From 1d2965fff6575bccadc5150ab224d66f9676e3e1 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Fri, 27 Feb 2026 08:30:30 +0900 Subject: [PATCH 5/7] Restore explicit model_id validation to fix test failures (#4299) The walrus operator refactor silently dropped the empty-string validation, causing test_init_model_id_kwarg_empty_string to fail. Restore the explicit None check and ValueError raise for empty model_id. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../packages/core/agent_framework/azure/_responses_client.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python/packages/core/agent_framework/azure/_responses_client.py b/python/packages/core/agent_framework/azure/_responses_client.py index 2debbd7b21..a412adcaf0 100644 --- a/python/packages/core/agent_framework/azure/_responses_client.py +++ b/python/packages/core/agent_framework/azure/_responses_client.py @@ -180,7 +180,10 @@ class MyOptions(AzureOpenAIResponsesOptions, total=False): client: AzureOpenAIResponsesClient[MyOptions] = AzureOpenAIResponsesClient() response = await client.get_response("Hello", options={"my_custom_option": "value"}) """ - if (model_id := kwargs.pop("model_id", None)) and not deployment_name: + model_id = kwargs.pop("model_id", None) + if model_id is not None and not str(model_id).strip(): + raise ValueError("model_id must not be empty") + if model_id is not None and deployment_name is None: deployment_name = str(model_id) # Project client path: create OpenAI client from an Azure AI Foundry project From 6f2cafa93a9ad11a4f3c2e0e0f142087161162f2 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Fri, 27 Feb 2026 12:02:17 +0900 Subject: [PATCH 6/7] Revert "Restore explicit model_id validation to fix test failures (#4299)" This reverts commit 1d2965fff6575bccadc5150ab224d66f9676e3e1. --- .../packages/core/agent_framework/azure/_responses_client.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/python/packages/core/agent_framework/azure/_responses_client.py b/python/packages/core/agent_framework/azure/_responses_client.py index a412adcaf0..2debbd7b21 100644 --- a/python/packages/core/agent_framework/azure/_responses_client.py +++ b/python/packages/core/agent_framework/azure/_responses_client.py @@ -180,10 +180,7 @@ class MyOptions(AzureOpenAIResponsesOptions, total=False): client: AzureOpenAIResponsesClient[MyOptions] = AzureOpenAIResponsesClient() response = await client.get_response("Hello", options={"my_custom_option": "value"}) """ - model_id = kwargs.pop("model_id", None) - if model_id is not None and not str(model_id).strip(): - raise ValueError("model_id must not be empty") - if model_id is not None and deployment_name is None: + if (model_id := kwargs.pop("model_id", None)) and not deployment_name: deployment_name = str(model_id) # Project client path: create OpenAI client from an Azure AI Foundry project From 412b92bb188fbe002211c1f13d804c7e8c5a7a22 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Fri, 27 Feb 2026 12:03:46 +0900 Subject: [PATCH 7/7] Revert to walrus operator fix per review feedback --- .../core/tests/azure/test_azure_responses_client.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/python/packages/core/tests/azure/test_azure_responses_client.py b/python/packages/core/tests/azure/test_azure_responses_client.py index 0bc043f4fe..37efff16ca 100644 --- a/python/packages/core/tests/azure/test_azure_responses_client.py +++ b/python/packages/core/tests/azure/test_azure_responses_client.py @@ -106,12 +106,6 @@ def test_init_model_id_kwarg_does_not_override_deployment_name(azure_openai_unit assert isinstance(azure_responses_client, SupportsChatGetResponse) -def test_init_model_id_kwarg_empty_string(azure_openai_unit_test_env: dict[str, str]) -> None: - """Test that model_id="" surfaces as invalid rather than silently falling back.""" - with pytest.raises(ValueError): - AzureOpenAIResponsesClient(model_id="") - - def test_init_model_id_kwarg_none(azure_openai_unit_test_env: dict[str, str]) -> None: """Test that model_id=None does not override the env-var deployment name.""" azure_responses_client = AzureOpenAIResponsesClient(model_id=None)