3535from a2a .client .middleware import ClientCallContext
3636from a2a .types import AgentCard
3737from a2a .types import Message as A2AMessage
38+ from a2a .types import MessageSendConfiguration
3839from a2a .types import Part as A2APart
3940from a2a .types import Role
4041from a2a .types import TaskArtifactUpdateEvent as A2ATaskArtifactUpdateEvent
4344from a2a .types import TransportProtocol as A2ATransport
4445from google .genai import types as genai_types
4546import httpx
47+ from pydantic import BaseModel
4648
4749try :
4850 from a2a .utils .constants import AGENT_CARD_WELL_KNOWN_PATH
4951except ImportError :
5052 # Fallback for older versions of a2a-sdk.
5153 AGENT_CARD_WELL_KNOWN_PATH = "/.well-known/agent.json"
5254
55+ from ..a2a .agent .config import A2aRemoteAgentConfig
56+ from ..a2a .agent .utils import execute_after_request_interceptors
57+ from ..a2a .agent .utils import execute_before_request_interceptors
5358from ..a2a .converters .event_converter import convert_a2a_message_to_event
5459from ..a2a .converters .event_converter import convert_a2a_task_to_event
5560from ..a2a .converters .event_converter import convert_event_to_a2a_message
@@ -127,6 +132,7 @@ def __init__(
127132 Callable [[InvocationContext , A2AMessage ], dict [str , Any ]]
128133 ] = None ,
129134 full_history_when_stateless : bool = False ,
135+ config : Optional [A2aRemoteAgentConfig ] = None ,
130136 ** kwargs : Any ,
131137 ) -> None :
132138 """Initialize RemoteA2aAgent.
@@ -147,6 +153,7 @@ def __init__(
147153 return Tasks or context IDs) will receive all session events on every
148154 request. If False, the default behavior of sending only events since the
149155 last reply from the agent will be used.
156+ config: Optional configuration object.
150157 **kwargs: Additional arguments passed to BaseAgent
151158
152159 Raises:
@@ -174,6 +181,7 @@ def __init__(
174181 self ._a2a_client_factory : Optional [A2AClientFactory ] = a2a_client_factory
175182 self ._a2a_request_meta_provider = a2a_request_meta_provider
176183 self ._full_history_when_stateless = full_history_when_stateless
184+ self ._config = config or A2aRemoteAgentConfig ()
177185
178186 # Validate and store agent card reference
179187 if isinstance (agent_card , AgentCard ):
@@ -558,21 +566,39 @@ async def _run_async_impl(
558566 logger .debug (build_a2a_request_log (a2a_request ))
559567
560568 try :
561- request_metadata = None
569+ a2a_request , parameters = await execute_before_request_interceptors (
570+ self ._config .request_interceptors , ctx , a2a_request
571+ )
572+
573+ if isinstance (a2a_request , Event ):
574+ yield a2a_request
575+ return
576+
577+ # Backward compatibility
562578 if self ._a2a_request_meta_provider :
563- request_metadata = self ._a2a_request_meta_provider (ctx , a2a_request )
579+ parameters .request_metadata = self ._a2a_request_meta_provider (
580+ ctx , a2a_request
581+ )
564582
583+ # TODO: Add support for requested_extension and
584+ # message_send_configuration once they are supported by the A2A client.
565585 async for a2a_response in self ._a2a_client .send_message (
566586 request = a2a_request ,
567- request_metadata = request_metadata ,
568- context = ClientCallContext ( state = ctx . session . state ) ,
587+ request_metadata = parameters . request_metadata ,
588+ context = parameters . client_call_context ,
569589 ):
570590 logger .debug (build_a2a_response_log (a2a_response ))
571591
572592 event = await self ._handle_a2a_response (a2a_response , ctx )
573593 if not event :
574594 continue
575595
596+ event = await execute_after_request_interceptors (
597+ self ._config .request_interceptors , ctx , a2a_response , event
598+ )
599+ if not event :
600+ continue
601+
576602 # Add metadata about the request and response
577603 event .custom_metadata = event .custom_metadata or {}
578604 event .custom_metadata [A2A_METADATA_PREFIX + "request" ] = (
0 commit comments