From 89e19c8b5c744ffd39c3d58a54eb68c1d978564f Mon Sep 17 00:00:00 2001 From: chenzhiyi021 Date: Mon, 11 May 2026 23:52:31 +0800 Subject: [PATCH 1/3] test: add test for ZeroDivisionError --- examples/tir/tests/test_tir.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/examples/tir/tests/test_tir.py b/examples/tir/tests/test_tir.py index d9365240a2..54ebf25c1e 100644 --- a/examples/tir/tests/test_tir.py +++ b/examples/tir/tests/test_tir.py @@ -54,11 +54,43 @@ async def test_tool_manager(): ) assert empty_status == ToolCallStatus.ERROR assert "Error" in empty_result + + # Test Python execution of code that raises an error. + zero_result, zero_status = await python_manager.aexecute_tool_call( + "```python\n1 / 0\n```" + ) + print(f"Zero division result: {zero_result}, status: {zero_status}") + assert zero_status == ToolCallStatus.ERROR + assert ( + "ZeroDivisionError" in zero_result + or "division by zero" in zero_result.lower() + ) finally: await python_manager.acleanup() await calc_manager.acleanup() +@pytest.mark.asyncio +async def test_tool_manager_error_handling(): + """Test tool manager error handling with real execution""" + python_manager = ToolManager(timeout=10, enabled_tools="python", debug_mode=False) + + try: + # Test ZeroDivisionError + zero_result, zero_status = await python_manager.aexecute_tool_call( + "```python\n1 / 0\n```" + ) + print(f"Zero division result: {zero_result}, status: {zero_status}") + assert zero_status == ToolCallStatus.ERROR + assert ( + "division by zero" in zero_result.lower() + or "zerodivisionerror" in zero_result.lower() + ) + + finally: + await python_manager.acleanup() + + @pytest.mark.asyncio async def test_tir_workflow(): """Test TIR workflow initialization.""" From 5842652beec7e885d0cbd955d48907f3476c0d30 Mon Sep 17 00:00:00 2001 From: chenzhiyi021 Date: Tue, 12 May 2026 00:28:23 +0800 Subject: [PATCH 2/3] fix: add error detection in PythonTool's execute method --- examples/tir/tests/test_tir.py | 11 ----------- examples/tir/tools/python_tool.py | 11 ++++++++--- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/examples/tir/tests/test_tir.py b/examples/tir/tests/test_tir.py index 54ebf25c1e..d6c7492afa 100644 --- a/examples/tir/tests/test_tir.py +++ b/examples/tir/tests/test_tir.py @@ -54,17 +54,6 @@ async def test_tool_manager(): ) assert empty_status == ToolCallStatus.ERROR assert "Error" in empty_result - - # Test Python execution of code that raises an error. - zero_result, zero_status = await python_manager.aexecute_tool_call( - "```python\n1 / 0\n```" - ) - print(f"Zero division result: {zero_result}, status: {zero_status}") - assert zero_status == ToolCallStatus.ERROR - assert ( - "ZeroDivisionError" in zero_result - or "division by zero" in zero_result.lower() - ) finally: await python_manager.acleanup() await calc_manager.acleanup() diff --git a/examples/tir/tools/python_tool.py b/examples/tir/tools/python_tool.py index 1847ad9dbd..7852ab14ae 100644 --- a/examples/tir/tools/python_tool.py +++ b/examples/tir/tools/python_tool.py @@ -256,9 +256,14 @@ def execute(self, parameters: dict[str, Any]) -> tuple[str, ToolCallStatus]: try: # Directly call apply to avoid using ProcessPool in async environment - result = self.python_executor.apply(code) - logger.debug(f"Python execution completed: {str(result)[:100]}...") - return str(result), ToolCallStatus.SUCCESS + res, report = self.python_executor.apply(code) + + if report != "Done": + logger.error(f"Error in Python execution: {report}") + return f"Error: {report}", ToolCallStatus.ERROR + + logger.debug(f"Python execution completed: {str(res)[:100]}...") + return str(res), ToolCallStatus.SUCCESS except Exception as e: logger.error(f"Python execution error: {e}") return f"Error: {str(e)}", ToolCallStatus.ERROR From f3da540f7874dc75b2d8ea6c6b97db8ca6833125 Mon Sep 17 00:00:00 2001 From: chenzhiyi021 Date: Tue, 12 May 2026 18:33:06 +0800 Subject: [PATCH 3/3] fix: fix pre-commit format --- areal/experimental/openai/proxy/proxy_rollout_server.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/areal/experimental/openai/proxy/proxy_rollout_server.py b/areal/experimental/openai/proxy/proxy_rollout_server.py index 2eb11591f8..98fe756ad6 100644 --- a/areal/experimental/openai/proxy/proxy_rollout_server.py +++ b/areal/experimental/openai/proxy/proxy_rollout_server.py @@ -283,9 +283,7 @@ def _setup_openai_client(): # any attacker who can reach this port can call admin endpoints # (grant_capacity, start_session, export_trajectories, ...). loopback_hosts = {"127.0.0.1", "::1", "localhost"} - allow_override = ( - os.environ.get("AREAL_ALLOW_DEFAULT_ADMIN_KEY", "0") == "1" - ) + allow_override = os.environ.get("AREAL_ALLOW_DEFAULT_ADMIN_KEY", "0") == "1" if _server_host in loopback_hosts or allow_override: logger.warning( "Using default admin API key. Change 'admin_api_key' in "