44from collections .abc import AsyncGenerator
55from typing import cast
66
7- from a2a .server .agent_execution import AgentExecutor , RequestContext
7+ from a2a .server .agent_execution import (
8+ AgentExecutor ,
9+ RequestContext ,
10+ RequestContextBuilder ,
11+ SimpleRequestContextBuilder ,
12+ )
813from a2a .server .events import (
914 Event ,
1015 EventConsumer ,
@@ -57,6 +62,7 @@ def __init__(
5762 task_store : TaskStore ,
5863 queue_manager : QueueManager | None = None ,
5964 push_notifier : PushNotifier | None = None ,
65+ request_context_builder : RequestContextBuilder | None = None ,
6066 ) -> None :
6167 """Initializes the DefaultRequestHandler.
6268
@@ -70,6 +76,12 @@ def __init__(
7076 self .task_store = task_store
7177 self ._queue_manager = queue_manager or InMemoryQueueManager ()
7278 self ._push_notifier = push_notifier
79+ self ._request_context_builder = (
80+ request_context_builder
81+ or SimpleRequestContextBuilder (
82+ should_populate_referred_tasks = False , task_store = self .task_store
83+ )
84+ )
7385 # TODO: Likely want an interface for managing this, like AgentExecutionManager.
7486 self ._running_agents = {}
7587 self ._running_agents_lock = asyncio .Lock ()
@@ -167,12 +179,13 @@ async def on_message_send(
167179 await self ._push_notifier .set_info (
168180 task .id , params .configuration .pushNotificationConfig
169181 )
170- request_context = RequestContext (
171- params ,
172- task .id if task else None ,
173- task . contextId if task else None ,
174- task ,
182+ request_context = await self . _request_context_builder . build (
183+ params = params ,
184+ task_id = task .id if task else None ,
185+ context_id = params . message . contextId ,
186+ task = task ,
175187 )
188+
176189 task_id = cast (str , request_context .task_id )
177190 # Always assign a task ID. We may not actually upgrade to a task, but
178191 # dictating the task ID at this layer is useful for tracking running
@@ -244,12 +257,13 @@ async def on_message_send_stream(
244257 else :
245258 queue = EventQueue ()
246259 result_aggregator = ResultAggregator (task_manager )
247- request_context = RequestContext (
248- params ,
249- task .id if task else None ,
250- task . contextId if task else None ,
251- task ,
260+ request_context = await self . _request_context_builder . build (
261+ params = params ,
262+ task_id = task .id if task else None ,
263+ context_id = params . message . contextId ,
264+ task = task ,
252265 )
266+
253267 task_id = cast (str , request_context .task_id )
254268 queue = await self ._queue_manager .create_or_tap (task_id )
255269 producer_task = asyncio .create_task (
0 commit comments