From 17473dddc067dd6728b4331f18a0f0cb83c3be9d Mon Sep 17 00:00:00 2001 From: Carlos Chinchilla Corbacho <188046461+cchinchilla-dev@users.noreply.github.com> Date: Fri, 20 Feb 2026 20:00:45 +0100 Subject: [PATCH 1/2] feat(client): expose close() and async context manager support on abstract Client --- src/a2a/client/client.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/a2a/client/client.py b/src/a2a/client/client.py index 286641a79..671c0fb74 100644 --- a/src/a2a/client/client.py +++ b/src/a2a/client/client.py @@ -3,8 +3,11 @@ from abc import ABC, abstractmethod from collections.abc import AsyncIterator, Callable, Coroutine +from types import TracebackType from typing import Any +from typing_extensions import Self + import httpx from a2a.client.middleware import ClientCallContext, ClientCallInterceptor @@ -107,6 +110,19 @@ def __init__( self._consumers = consumers self._middleware = middleware + async def __aenter__(self) -> Self: + """Enters the async context manager.""" + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + """Exits the async context manager and closes the client.""" + await self.close() + @abstractmethod async def send_message( self, @@ -209,3 +225,7 @@ async def consume( return for c in self._consumers: await c(event, card) + + @abstractmethod + async def close(self) -> None: + """Closes the client and releases any underlying resources.""" \ No newline at end of file From 5844216ebfd448c23f3c40cd83a60fc59c623b9e Mon Sep 17 00:00:00 2001 From: Carlos Chinchilla Corbacho <188046461+cchinchilla-dev@users.noreply.github.com> Date: Fri, 20 Feb 2026 20:06:49 +0100 Subject: [PATCH 2/2] feat(client): expose close() and async context manager support on abstract Client (lint) --- src/a2a/client/client.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/a2a/client/client.py b/src/a2a/client/client.py index 671c0fb74..c79f76d82 100644 --- a/src/a2a/client/client.py +++ b/src/a2a/client/client.py @@ -6,10 +6,10 @@ from types import TracebackType from typing import Any -from typing_extensions import Self - import httpx +from typing_extensions import Self + from a2a.client.middleware import ClientCallContext, ClientCallInterceptor from a2a.client.optionals import Channel from a2a.types import ( @@ -228,4 +228,4 @@ async def consume( @abstractmethod async def close(self) -> None: - """Closes the client and releases any underlying resources.""" \ No newline at end of file + """Closes the client and releases any underlying resources."""