From 042676c982e34dfbc9ffcca6b514ce2761913e35 Mon Sep 17 00:00:00 2001 From: cr-sbarbouche Date: Tue, 18 Aug 2026 18:20:29 +0100 Subject: [PATCH 1/2] Python: always emit arguments field for tool calls in AgentEvalConverter FoundryEvals uploaded tool_call content items without an arguments field when a tool call had no model-supplied arguments. Foundry's tool-aware evaluators (task_adherence, tool_output_utilization, tool_call_accuracy) require the arguments field to always be present, so zero-argument tool calls caused evaluation to fail with FAILED_EXECUTION. Default to an empty object instead of omitting the field. --- .../core/agent_framework/_evaluation.py | 3 +-- .../foundry/tests/test_foundry_evals.py | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/python/packages/core/agent_framework/_evaluation.py b/python/packages/core/agent_framework/_evaluation.py index cac000ca0b2..765df15de2f 100644 --- a/python/packages/core/agent_framework/_evaluation.py +++ b/python/packages/core/agent_framework/_evaluation.py @@ -797,8 +797,7 @@ def convert_message(message: Message) -> list[dict[str, Any]]: "tool_call_id": c.call_id or "", "name": c.name or "", } - if args: - tc["arguments"] = args + tc["arguments"] = args if args else {} content_items.append(tc) elif c.type == "function_result": result_val = c.result diff --git a/python/packages/foundry/tests/test_foundry_evals.py b/python/packages/foundry/tests/test_foundry_evals.py index 575a5976bbf..f2b015e04c4 100644 --- a/python/packages/foundry/tests/test_foundry_evals.py +++ b/python/packages/foundry/tests/test_foundry_evals.py @@ -153,6 +153,23 @@ def test_assistant_with_tool_call(self) -> None: assert tc["name"] == "get_weather" assert tc["arguments"] == {"location": "Seattle"} + def test_assistant_with_zero_argument_tool_call(self) -> None: + msg = Message( + "assistant", + [ + Content.from_function_call( + call_id="call_3", + name="get_site_summary", + arguments=None, + ), + ], + ) + result = AgentEvalConverter.convert_message(msg) + tc = result[0]["content"][0] + assert tc["type"] == "tool_call" + assert "arguments" in tc + assert tc["arguments"] == {} + def test_assistant_text_and_tool_call(self) -> None: msg = Message( "assistant", From 103185927c4420b9dd53b49fbf5f413248615097 Mon Sep 17 00:00:00 2001 From: cr-sbarbouche Date: Tue, 18 Aug 2026 18:23:28 +0100 Subject: [PATCH 2/2] Python: only default arguments to {} when None, not on falsy values Addresses Copilot review feedback: a truthiness check would also overwrite valid but falsy parsed arguments (e.g. 0, "", False) with {}. Use an explicit None check so only missing arguments are defaulted. --- python/packages/core/agent_framework/_evaluation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/packages/core/agent_framework/_evaluation.py b/python/packages/core/agent_framework/_evaluation.py index 765df15de2f..ab71d84a15c 100644 --- a/python/packages/core/agent_framework/_evaluation.py +++ b/python/packages/core/agent_framework/_evaluation.py @@ -797,7 +797,7 @@ def convert_message(message: Message) -> list[dict[str, Any]]: "tool_call_id": c.call_id or "", "name": c.name or "", } - tc["arguments"] = args if args else {} + tc["arguments"] = args if args is not None else {} content_items.append(tc) elif c.type == "function_result": result_val = c.result