From 1110a7fa189c8789c141150575e5c4d80c1e49e5 Mon Sep 17 00:00:00 2001 From: Manohar Paturi <186662190+ManoharPaturi@users.noreply.github.com> Date: Fri, 18 Sep 2026 17:49:35 +0530 Subject: [PATCH] Python: accept integer timeouts in A2AAgent A2AAgent._create_timeout_config only accepted float and httpx.Timeout, so A2AAgent(url=..., timeout=30) raised TypeError. Per PEP 484's numeric tower an int is a valid float, and httpx.Timeout itself accepts ints. Accept int (and float) while continuing to reject bool and other types. --- .../a2a/agent_framework_a2a/_agent.py | 4 +-- python/packages/a2a/tests/test_a2a_agent.py | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/python/packages/a2a/agent_framework_a2a/_agent.py b/python/packages/a2a/agent_framework_a2a/_agent.py index 5dca644f184..1cfe7c12443 100644 --- a/python/packages/a2a/agent_framework_a2a/_agent.py +++ b/python/packages/a2a/agent_framework_a2a/_agent.py @@ -355,8 +355,8 @@ def _create_timeout_config(self, timeout: float | httpx.Timeout | None) -> httpx write=10.0, # 10 seconds to send request pool=5.0, # 5 seconds to get connection from pool ) - if isinstance(timeout, float): - # Simple timeout + if isinstance(timeout, (int, float)) and not isinstance(timeout, bool): + # Simple timeout (ints are accepted per PEP 484's numeric tower) return httpx.Timeout(timeout) if isinstance(timeout, httpx.Timeout): # Full timeout configuration provided by user diff --git a/python/packages/a2a/tests/test_a2a_agent.py b/python/packages/a2a/tests/test_a2a_agent.py index b7bb617db90..0fc5b3007c9 100644 --- a/python/packages/a2a/tests/test_a2a_agent.py +++ b/python/packages/a2a/tests/test_a2a_agent.py @@ -754,6 +754,36 @@ def test_create_timeout_config_httpx_timeout() -> None: assert timeout_config.pool == 8.0 +def test_create_timeout_config_integer_timeout() -> None: + """Test _create_timeout_config accepts an int timeout (PEP 484 numeric tower).""" + agent = A2AAgent(name="Test Agent", client=cast(Any, MockA2AClient()), http_client=None) + + timeout_config = agent._create_timeout_config(30) + + assert isinstance(timeout_config, httpx.Timeout) + assert timeout_config.connect == 30.0 + assert timeout_config.read == 30.0 + assert timeout_config.write == 30.0 + assert timeout_config.pool == 30.0 + + +def test_a2a_agent_initialization_with_integer_timeout_parameter() -> None: + """Test A2AAgent initialization accepts an int timeout without raising TypeError.""" + with ( + patch("agent_framework_a2a._agent.httpx.AsyncClient") as mock_async_client, + patch("agent_framework_a2a._agent.ClientFactory") as mock_factory, + ): + mock_client_instance = MagicMock() + mock_factory.return_value.create.return_value = mock_client_instance + + A2AAgent(name="Test Agent", url="https://test-agent.example.com", timeout=120) + + mock_async_client.assert_called_once() + timeout_arg = mock_async_client.call_args.kwargs["timeout"] + assert isinstance(timeout_arg, httpx.Timeout) + assert timeout_arg.read == 120.0 + + def test_create_timeout_config_invalid_type() -> None: """Test _create_timeout_config with invalid type raises TypeError.""" agent = A2AAgent(name="Test Agent", client=cast(Any, MockA2AClient()), http_client=None)