Context
After the A2A v1.0 protocol work merges (PR for feat/a2a-v1-protocol-compat), A2AClient defaults to protocol_version="1.0" and A2AServer advertises protocolVersion + supportedInterfaces on the Agent Card. Notebook 28 was updated to walk through every v1.0 method (SendMessage, GetTask, ListTasks, CancelTask, SendStreamingMessage).
The workbench's A2A mesh demo project (examples/projects/a2a-mesh/) still uses the legacy backwards-compat surface:
examples/projects/a2a-mesh/src/a2a_mesh/orchestrator.py:76 — A2AClient(url).invoke(prompt) hits /a2a/invoke (flat string-in/string-out, not JSON-RPC).
examples/projects/a2a-mesh/src/a2a_mesh/orchestrator.py:84 — http.stream("POST", f"{url}/a2a/stream", ...) hits the legacy SSE endpoint, not SendStreamingMessage.
The demo still works (those endpoints are preserved on purpose for pre-v1.0 peers), but it no longer reflects the recommended path for new code.
Proposal
Update examples/projects/a2a-mesh/src/a2a_mesh/orchestrator.py to:
- Use
A2AClient.send_message(Message(...)) for the non-streaming path and surface task.artifacts[-1].parts[0].text to the user.
- Use
A2AClient.send_message_streaming(Message(...)) for the --stream path and render task / status-update / artifact-update events instead of decoding /a2a/stream SSE by hand.
- Optionally show
card.protocolVersion / card.supportedInterfaces during discovery so the workbench surfaces the same v1.0 metadata the notebook does.
Leave the legacy invoke / /a2a/stream paths reachable via a flag (or a second sample) so the demo still proves backwards-compat works.
Out of scope
- The
workbench/ UI, BFF, and runner — they don't reference protocol method names directly.
A2AServer (a2a_mesh.research, a2a_mesh.finance) — already serves both v1.0 and legacy.
Context
After the A2A v1.0 protocol work merges (PR for
feat/a2a-v1-protocol-compat),A2AClientdefaults toprotocol_version="1.0"andA2AServeradvertisesprotocolVersion+supportedInterfaceson the Agent Card. Notebook 28 was updated to walk through every v1.0 method (SendMessage,GetTask,ListTasks,CancelTask,SendStreamingMessage).The workbench's A2A mesh demo project (
examples/projects/a2a-mesh/) still uses the legacy backwards-compat surface:examples/projects/a2a-mesh/src/a2a_mesh/orchestrator.py:76—A2AClient(url).invoke(prompt)hits/a2a/invoke(flat string-in/string-out, not JSON-RPC).examples/projects/a2a-mesh/src/a2a_mesh/orchestrator.py:84—http.stream("POST", f"{url}/a2a/stream", ...)hits the legacy SSE endpoint, notSendStreamingMessage.The demo still works (those endpoints are preserved on purpose for pre-v1.0 peers), but it no longer reflects the recommended path for new code.
Proposal
Update
examples/projects/a2a-mesh/src/a2a_mesh/orchestrator.pyto:A2AClient.send_message(Message(...))for the non-streaming path and surfacetask.artifacts[-1].parts[0].textto the user.A2AClient.send_message_streaming(Message(...))for the--streampath and rendertask/status-update/artifact-updateevents instead of decoding/a2a/streamSSE by hand.card.protocolVersion/card.supportedInterfacesduring discovery so the workbench surfaces the same v1.0 metadata the notebook does.Leave the legacy
invoke//a2a/streampaths reachable via a flag (or a second sample) so the demo still proves backwards-compat works.Out of scope
workbench/UI, BFF, and runner — they don't reference protocol method names directly.A2AServer(a2a_mesh.research,a2a_mesh.finance) — already serves both v1.0 and legacy.