From 0db022328b032f7bae4a907914f865140b9e2393 Mon Sep 17 00:00:00 2001 From: Bortlesboat Date: Thu, 9 Apr 2026 21:54:18 -0400 Subject: [PATCH 1/2] fix: apply function invocation config in as_agent --- python/packages/core/agent_framework/_clients.py | 12 +++++++++++- python/packages/core/tests/core/test_clients.py | 13 +++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/python/packages/core/agent_framework/_clients.py b/python/packages/core/agent_framework/_clients.py index ddd765e654..a9145c2e85 100644 --- a/python/packages/core/agent_framework/_clients.py +++ b/python/packages/core/agent_framework/_clients.py @@ -31,7 +31,9 @@ from ._serialization import SerializationMixin from ._tools import ( FunctionInvocationConfiguration, + FunctionInvocationLayer, ToolTypes, + normalize_function_invocation_configuration, ) from ._types import ( ChatResponse, @@ -647,7 +649,15 @@ def as_agent( "additional_properties": dict(additional_properties) if additional_properties is not None else None, } if function_invocation_configuration is not None: - agent_kwargs["function_invocation_configuration"] = function_invocation_configuration + if isinstance(self, FunctionInvocationLayer): + self.function_invocation_configuration = normalize_function_invocation_configuration( + function_invocation_configuration + ) + else: + logger.warning( + "function_invocation_configuration was provided, but the chat client does not support " + "function invoking." + ) return Agent(**agent_kwargs) diff --git a/python/packages/core/tests/core/test_clients.py b/python/packages/core/tests/core/test_clients.py index 7657993d56..b7248ef941 100644 --- a/python/packages/core/tests/core/test_clients.py +++ b/python/packages/core/tests/core/test_clients.py @@ -15,6 +15,7 @@ SlidingWindowStrategy, SupportsChatGetResponse, TruncationStrategy, + normalize_function_invocation_configuration, ) @@ -58,6 +59,18 @@ def test_base_client_as_agent_uses_explicit_additional_properties(chat_client_ba assert agent.additional_properties == {"team": "core"} +def test_base_client_as_agent_applies_function_invocation_configuration_to_client( + chat_client_base: SupportsChatGetResponse, +) -> None: + config = normalize_function_invocation_configuration({"max_iterations": 1, "include_detailed_errors": True}) + + agent = chat_client_base.as_agent(function_invocation_configuration=config) + + assert agent.client is chat_client_base + assert chat_client_base.function_invocation_configuration["max_iterations"] == 1 # type: ignore[attr-defined] + assert chat_client_base.function_invocation_configuration["include_detailed_errors"] is True # type: ignore[attr-defined] + + async def test_base_client_get_response_uses_explicit_client_kwargs(chat_client_base: SupportsChatGetResponse) -> None: async def fake_inner_get_response(**kwargs): assert kwargs["trace_id"] == "trace-123" From a7c94bffb98419d07785954e9fdd3f6fbbda17a7 Mon Sep 17 00:00:00 2001 From: Bortlesboat Date: Sat, 11 Apr 2026 17:52:27 -0400 Subject: [PATCH 2/2] fix(core): remove as_agent function invocation config --- python/packages/core/agent_framework/_clients.py | 15 --------------- python/packages/core/tests/core/test_clients.py | 14 ++++++-------- 2 files changed, 6 insertions(+), 23 deletions(-) diff --git a/python/packages/core/agent_framework/_clients.py b/python/packages/core/agent_framework/_clients.py index a9145c2e85..3caf69f98b 100644 --- a/python/packages/core/agent_framework/_clients.py +++ b/python/packages/core/agent_framework/_clients.py @@ -30,10 +30,7 @@ from ._docstrings import apply_layered_docstring from ._serialization import SerializationMixin from ._tools import ( - FunctionInvocationConfiguration, - FunctionInvocationLayer, ToolTypes, - normalize_function_invocation_configuration, ) from ._types import ( ChatResponse, @@ -575,7 +572,6 @@ def as_agent( context_providers: Sequence[Any] | None = None, middleware: Sequence[MiddlewareTypes] | None = None, require_per_service_call_history_persistence: bool = False, - function_invocation_configuration: FunctionInvocationConfiguration | None = None, compaction_strategy: CompactionStrategy | None = None, tokenizer: TokenizerProtocol | None = None, additional_properties: Mapping[str, Any] | None = None, @@ -603,7 +599,6 @@ def as_agent( chat history persistence. When enabled, history providers are invoked around each model call instead of once per ``run()`` when the service is not already storing history. - function_invocation_configuration: Optional function invocation configuration override. compaction_strategy: Optional agent-level compaction override. When omitted, client-level compaction defaults remain in effect for each call. tokenizer: Optional agent-level tokenizer override. When omitted, @@ -648,16 +643,6 @@ def as_agent( "tokenizer": tokenizer, "additional_properties": dict(additional_properties) if additional_properties is not None else None, } - if function_invocation_configuration is not None: - if isinstance(self, FunctionInvocationLayer): - self.function_invocation_configuration = normalize_function_invocation_configuration( - function_invocation_configuration - ) - else: - logger.warning( - "function_invocation_configuration was provided, but the chat client does not support " - "function invoking." - ) return Agent(**agent_kwargs) diff --git a/python/packages/core/tests/core/test_clients.py b/python/packages/core/tests/core/test_clients.py index b7248ef941..afe779fc0e 100644 --- a/python/packages/core/tests/core/test_clients.py +++ b/python/packages/core/tests/core/test_clients.py @@ -15,7 +15,6 @@ SlidingWindowStrategy, SupportsChatGetResponse, TruncationStrategy, - normalize_function_invocation_configuration, ) @@ -59,16 +58,15 @@ def test_base_client_as_agent_uses_explicit_additional_properties(chat_client_ba assert agent.additional_properties == {"team": "core"} -def test_base_client_as_agent_applies_function_invocation_configuration_to_client( +def test_base_client_as_agent_rejects_function_invocation_configuration( chat_client_base: SupportsChatGetResponse, ) -> None: - config = normalize_function_invocation_configuration({"max_iterations": 1, "include_detailed_errors": True}) + bad_kwargs: dict[str, Any] = { + "function_invocation_configuration": {"max_iterations": 1, "include_detailed_errors": True} + } - agent = chat_client_base.as_agent(function_invocation_configuration=config) - - assert agent.client is chat_client_base - assert chat_client_base.function_invocation_configuration["max_iterations"] == 1 # type: ignore[attr-defined] - assert chat_client_base.function_invocation_configuration["include_detailed_errors"] is True # type: ignore[attr-defined] + with pytest.raises(TypeError, match="function_invocation_configuration"): + chat_client_base.as_agent(**bad_kwargs) async def test_base_client_get_response_uses_explicit_client_kwargs(chat_client_base: SupportsChatGetResponse) -> None: