Skip to content

Outbound A2A: consume streaming responses via SendStreamingMessageAsync#273

Merged
rockfordlhotka merged 3 commits intomainfrom
issue-270/outbound-a2a-streaming
Apr 14, 2026
Merged

Outbound A2A: consume streaming responses via SendStreamingMessageAsync#273
rockfordlhotka merged 3 commits intomainfrom
issue-270/outbound-a2a-streaming

Conversation

@rockfordlhotka
Copy link
Copy Markdown
Member

Summary

  • Add SupportsStreaming (bool?) to AgentCard for tracking remote agent streaming capability
  • Extract capabilities.streaming from v1 agent card JSON during protocol auto-detection in RegisterAgentExecutor
  • Add DispatchV1StreamingAsync to InvokeAgentExecutor — consumes IAsyncEnumerable<StreamResponse> via SSE, forwarding StatusUpdate events as real-time progress updates instead of polling with exponential backoff
  • Full InputRequired multi-turn support in streaming path (max rounds, repetition detection, trust-gated follow-ups)
  • Automatic fallback to polling if streaming throws a non-cancellation exception
  • Add StreamingEvents counter and transport tag to diagnostics for observability
  • Surface supportsStreaming in get_agent_details tool output

Test plan

  • All 40 A2A caller tests pass (7 new MapV1StatusUpdateEvent tests)
  • Full test suite passes (0 failures across all projects)
  • Manual verification with a streaming-capable A2A agent (gateway advertises capabilities.streaming: true)

Closes #270

🤖 Generated with Claude Code

rockfordlhotka and others added 3 commits April 13, 2026 21:14
When a remote A2A v1 agent advertises capabilities.streaming: true,
the outbound dispatcher now uses SendStreamingMessageAsync to consume
SSE events in real time instead of polling with GetTask + exponential
backoff. This eliminates polling latency and forwards intermediate
status updates to the user immediately.

- Add SupportsStreaming (bool?) to AgentCard
- Extract capabilities.streaming from v1 agent card during detection
- Add DispatchV1StreamingAsync with full InputRequired follow-up support
- Fall back to polling if streaming throws
- Add StreamingEvents counter and transport tags for observability
- Surface supportsStreaming in get_agent_details output
- 7 new unit tests for MapV1StatusUpdateEvent

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New scenario exercises the same streaming event processing path that
DispatchV1StreamingAsync uses: fetches the agent card to verify
capabilities.streaming is advertised, sends a streaming request,
classifies each SSE event by PayloadCase, verifies contextId
consistency across events, and validates the terminal event
contains text content.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove unused 'publisher' parameter from InputRequiredHandler
- Add null-conditional operators for PushNotificationConfig access
- Add null-forgiving operators after null assertions in integration tests
- Fix possible null dereference in RockBotTaskHandlerTests.ExtractText

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@rockfordlhotka rockfordlhotka merged commit ecf63e8 into main Apr 14, 2026
2 checks passed
@rockfordlhotka rockfordlhotka deleted the issue-270/outbound-a2a-streaming branch April 14, 2026 15:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Outbound A2A: consume streaming responses via SendStreamingMessageAsync

1 participant