What happened?
We run an A2A server on multiple replicas behind a load balancer. To make streaming work across replicas, we pass a custom QueueManager (Redis-backed) to DefaultRequestHandler that way a client can reconnect to a task's stream even if it lands on a different replica.
After upgrading the SDK, streaming across replicas stopped working, with no error or warning. The cause: since #933, DefaultRequestHandler points to DefaultRequestHandlerV2, which still accepts queue_manager in its constructor but never uses it:
queue_manager: Any | None = None, # Kept for backward compat in signature
Our queue manager's methods are simply never called anymore. Everything compiles and runs, and single-replica setups look fine, so this is very easy to miss.
What I expected
Either the parameter keeps working, or passing one raises / warns that it's no longer supported. Accepting it and dropping it silently is the worst case the code says the old wiring works when it doesn't.
How to reproduce
Pass any QueueManager subclass that records calls to DefaultRequestHandler, run a message/stream request, and check the recorder:
class SpyQueueManager(InMemoryQueueManager):
async def create_or_tap(self, task_id):
print("called!") # never prints on 1.0.x / 1.1.0
return await super().create_or_tap(task_id)
On LegacyRequestHandler the same spy is called as before. That's our current workaround: use LegacyRequestHandler and pin the SDK version.
Is there an intended replacement for this use case (sharing event queues across replicas) in the v2 design? Happy to provide more detail.
Code of Conduct
What happened?
We run an A2A server on multiple replicas behind a load balancer. To make streaming work across replicas, we pass a custom
QueueManager(Redis-backed) toDefaultRequestHandlerthat way a client can reconnect to a task's stream even if it lands on a different replica.After upgrading the SDK, streaming across replicas stopped working, with no error or warning. The cause: since #933,
DefaultRequestHandlerpoints toDefaultRequestHandlerV2, which still acceptsqueue_managerin its constructor but never uses it:Our queue manager's methods are simply never called anymore. Everything compiles and runs, and single-replica setups look fine, so this is very easy to miss.
What I expected
Either the parameter keeps working, or passing one raises / warns that it's no longer supported. Accepting it and dropping it silently is the worst case the code says the old wiring works when it doesn't.
How to reproduce
Pass any
QueueManagersubclass that records calls toDefaultRequestHandler, run amessage/streamrequest, and check the recorder:On
LegacyRequestHandlerthe same spy is called as before. That's our current workaround: useLegacyRequestHandlerand pin the SDK version.Is there an intended replacement for this use case (sharing event queues across replicas) in the v2 design? Happy to provide more detail.
Code of Conduct