Skip to content

Commit 73a2dcf

Browse files
authored
chore: incorporate latest proto changes (blocking -> return_immediately) (#810)
Original spec PR: a2aproject/A2A#1507. Required a bunch of inversions including compat conversion updates. The gotcha here is that 0.3 SDK **already** uses blocking mode by default (although it's not according to the spec), so this spec change is about applying a de-facto standard.
1 parent 08794f7 commit 73a2dcf

12 files changed

Lines changed: 134 additions & 147 deletions

File tree

buf.gen.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
version: v2
33
inputs:
44
- git_repo: https://github.com/a2aproject/A2A.git
5-
ref: aca981cee3e7a3f22a4df8fb8a5302406f7a1cf5
5+
ref: main
66
subdir: specification
77
managed:
88
enabled: true

src/a2a/client/base_client.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,7 @@ async def send_message(
9494
yield client_event
9595

9696
def _apply_client_config(self, request: SendMessageRequest) -> None:
97-
if not request.configuration.blocking and self._config.polling:
98-
request.configuration.blocking = not self._config.polling
97+
request.configuration.return_immediately |= self._config.polling
9998
if (
10099
not request.configuration.HasField('task_push_notification_config')
101100
and self._config.push_notification_configs

src/a2a/compat/v0_3/conversions.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -304,9 +304,7 @@ def to_core_send_message_configuration(
304304
) -> pb2_v10.SendMessageConfiguration:
305305
"""Convert send message configuration to v1.0 core type."""
306306
core_config = pb2_v10.SendMessageConfiguration()
307-
core_config.blocking = (
308-
True # Default to True as per A2A spec for SendMessage
309-
)
307+
# Result will be blocking by default (return_immediately=False)
310308
if compat_config.accepted_output_modes:
311309
core_config.accepted_output_modes.extend(
312310
compat_config.accepted_output_modes
@@ -320,7 +318,7 @@ def to_core_send_message_configuration(
320318
if compat_config.history_length is not None:
321319
core_config.history_length = compat_config.history_length
322320
if compat_config.blocking is not None:
323-
core_config.blocking = compat_config.blocking
321+
core_config.return_immediately = not compat_config.blocking
324322
return core_config
325323

326324

@@ -340,7 +338,7 @@ def to_compat_send_message_configuration(
340338
history_length=core_config.history_length
341339
if core_config.HasField('history_length')
342340
else None,
343-
blocking=core_config.blocking,
341+
blocking=not core_config.return_immediately,
344342
)
345343

346344

@@ -1039,8 +1037,6 @@ def to_core_send_message_request(
10391037
core_req.configuration.CopyFrom(
10401038
to_core_send_message_configuration(compat_req.params.configuration)
10411039
)
1042-
else:
1043-
core_req.configuration.blocking = True # Default for A2A
10441040
if compat_req.params.metadata:
10451041
ParseDict(compat_req.params.metadata, core_req.metadata)
10461042
return core_req

src/a2a/server/request_handlers/default_request_handler.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -340,9 +340,7 @@ async def on_message_send(
340340
consumer = EventConsumer(queue)
341341
producer_task.add_done_callback(consumer.agent_task_callback)
342342

343-
blocking = True # Default to blocking behavior
344-
if params.configuration and params.configuration.blocking is False:
345-
blocking = False
343+
blocking = not params.configuration.return_immediately
346344

347345
interrupted_or_non_blocking = False
348346
try:

src/a2a/types/a2a_pb2.py

Lines changed: 108 additions & 108 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/a2a/types/a2a_pb2.pyi

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,16 @@ ROLE_USER: Role
4646
ROLE_AGENT: Role
4747

4848
class SendMessageConfiguration(_message.Message):
49-
__slots__ = ("accepted_output_modes", "task_push_notification_config", "history_length", "blocking")
49+
__slots__ = ("accepted_output_modes", "task_push_notification_config", "history_length", "return_immediately")
5050
ACCEPTED_OUTPUT_MODES_FIELD_NUMBER: _ClassVar[int]
5151
TASK_PUSH_NOTIFICATION_CONFIG_FIELD_NUMBER: _ClassVar[int]
5252
HISTORY_LENGTH_FIELD_NUMBER: _ClassVar[int]
53-
BLOCKING_FIELD_NUMBER: _ClassVar[int]
53+
RETURN_IMMEDIATELY_FIELD_NUMBER: _ClassVar[int]
5454
accepted_output_modes: _containers.RepeatedScalarFieldContainer[str]
5555
task_push_notification_config: TaskPushNotificationConfig
5656
history_length: int
57-
blocking: bool
58-
def __init__(self, accepted_output_modes: _Optional[_Iterable[str]] = ..., task_push_notification_config: _Optional[_Union[TaskPushNotificationConfig, _Mapping]] = ..., history_length: _Optional[int] = ..., blocking: _Optional[bool] = ...) -> None: ...
57+
return_immediately: bool
58+
def __init__(self, accepted_output_modes: _Optional[_Iterable[str]] = ..., task_push_notification_config: _Optional[_Union[TaskPushNotificationConfig, _Mapping]] = ..., history_length: _Optional[int] = ..., return_immediately: _Optional[bool] = ...) -> None: ...
5959

6060
class Task(_message.Message):
6161
__slots__ = ("id", "context_id", "status", "artifacts", "history", "metadata")

tests/client/test_base_client.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ async def test_send_message_callsite_config_overrides_non_streaming(
235235

236236
cfg = SendMessageConfiguration(
237237
history_length=2,
238-
blocking=False,
238+
return_immediately=True,
239239
accepted_output_modes=['application/json'],
240240
)
241241
request = SendMessageRequest(message=sample_message, configuration=cfg)
@@ -249,7 +249,7 @@ async def test_send_message_callsite_config_overrides_non_streaming(
249249

250250
params = mock_transport.send_message.call_args[0][0]
251251
assert params.configuration.history_length == 2
252-
assert params.configuration.blocking is False
252+
assert params.configuration.return_immediately is True
253253
assert params.configuration.accepted_output_modes == [
254254
'application/json'
255255
]
@@ -278,7 +278,6 @@ async def create_stream(*args, **kwargs):
278278

279279
cfg = SendMessageConfiguration(
280280
history_length=0,
281-
blocking=True,
282281
accepted_output_modes=['text/plain'],
283282
)
284283
request = SendMessageRequest(message=sample_message, configuration=cfg)
@@ -292,5 +291,5 @@ async def create_stream(*args, **kwargs):
292291

293292
params = mock_transport.send_message_streaming.call_args[0][0]
294293
assert params.configuration.history_length == 0
295-
assert params.configuration.blocking is True
294+
assert params.configuration.return_immediately is False
296295
assert params.configuration.accepted_output_modes == ['text/plain']

tests/compat/v0_3/test_conversions.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,6 @@ def test_send_message_configuration_conversion():
427427
v10_expected = pb2_v10.SendMessageConfiguration(
428428
accepted_output_modes=['text/plain', 'application/json'],
429429
history_length=10,
430-
blocking=True,
431430
task_push_notification_config=pb2_v10.TaskPushNotificationConfig(
432431
url='http://test',
433432
authentication=pb2_v10.AuthenticationInfo(scheme='Basic'),
@@ -443,7 +442,7 @@ def test_send_message_configuration_conversion():
443442

444443
def test_send_message_configuration_conversion_minimal():
445444
v03_config = types_v03.MessageSendConfiguration()
446-
v10_expected = pb2_v10.SendMessageConfiguration(blocking=True)
445+
v10_expected = pb2_v10.SendMessageConfiguration()
447446

448447
v10_config = to_core_send_message_configuration(v03_config)
449448
assert v10_config == v10_expected
@@ -1306,9 +1305,7 @@ def test_send_message_request_conversion():
13061305
role=pb2_v10.Role.ROLE_USER,
13071306
parts=[pb2_v10.Part(text='Hi')],
13081307
),
1309-
configuration=pb2_v10.SendMessageConfiguration(
1310-
history_length=5, blocking=True
1311-
),
1308+
configuration=pb2_v10.SendMessageConfiguration(history_length=5),
13121309
)
13131310
ParseDict({'k': 'v'}, v10_expected.metadata)
13141311

@@ -1767,8 +1764,8 @@ def test_to_core_send_message_request_no_configuration():
17671764
),
17681765
)
17691766
core_req = to_core_send_message_request(v03_req)
1770-
# Default is True if configuration is absent
1771-
assert core_req.configuration.blocking is True
1767+
# Blocking by default (return_immediately=False)
1768+
assert core_req.configuration.return_immediately is False
17721769
assert not core_req.HasField('message')
17731770

17741771

tests/compat/v0_3/test_grpc_handler.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ async def test_send_message_success_task(
6868
message_id='msg-1', role=a2a_pb2.Role.ROLE_USER
6969
),
7070
configuration=a2a_pb2.SendMessageConfiguration(
71-
history_length=0, blocking=False
71+
history_length=0, return_immediately=True
7272
),
7373
)
7474
mock_request_handler.on_message_send.assert_called_once_with(
@@ -105,7 +105,7 @@ async def test_send_message_success_message(
105105
message_id='msg-1', role=a2a_pb2.Role.ROLE_USER
106106
),
107107
configuration=a2a_pb2.SendMessageConfiguration(
108-
history_length=0, blocking=False
108+
history_length=0, return_immediately=True
109109
),
110110
)
111111
mock_request_handler.on_message_send.assert_called_once_with(
@@ -158,7 +158,7 @@ async def mock_stream(*args, **kwargs):
158158
message_id='msg-1', role=a2a_pb2.Role.ROLE_USER
159159
),
160160
configuration=a2a_pb2.SendMessageConfiguration(
161-
history_length=0, blocking=False
161+
history_length=0, return_immediately=True
162162
),
163163
)
164164
mock_request_handler.on_message_send_stream.assert_called_once_with(

tests/e2e/push_notifications/test_default_push_notification_support.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ async def test_notification_triggering_after_config_change_e2e(
184184
parts=[Part(text='How are you?')],
185185
role=Role.ROLE_USER,
186186
),
187-
configuration=SendMessageConfiguration(blocking=True),
187+
configuration=SendMessageConfiguration(),
188188
)
189189
)
190190
]
@@ -225,7 +225,7 @@ async def test_notification_triggering_after_config_change_e2e(
225225
parts=[Part(text='Good')],
226226
role=Role.ROLE_USER,
227227
),
228-
configuration=SendMessageConfiguration(blocking=True),
228+
configuration=SendMessageConfiguration(),
229229
)
230230
)
231231
]

0 commit comments

Comments
 (0)