feat(server): expose SendMessageRequest metadata to AgentExecutor via RequestContext - #564
Conversation
… RequestContext The A2A specification defines SendMessageRequest.metadata as 'a flexible key-value map for passing additional context or parameters', and the extension mechanism encourages carrying extension data in request metadata. DefaultRequestHandler previously dropped this field before invoking the AgentExecutor, leaving server-side agents no way to read it. RequestContext gains an optional readonly metadata property, threaded from params.metadata in both sendMessage and sendMessageStream. Existing RequestContext call sites are unaffected (new trailing optional parameter). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
🧪 Code Coverage
Generated by coverage-comment.yml |
There was a problem hiding this comment.
Code Review
This pull request introduces a request-level metadata field to RequestContext to allow metadata from SendMessageRequest to be threaded through to the agent executor. The DefaultRequestHandler has been updated to extract and pass this metadata, and corresponding unit tests have been added to verify the behavior. The reviewer recommends deep copying the metadata object using structuredClone in the RequestContext constructor to prevent external mutations from affecting the internal state.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
JakubWorek
left a comment
There was a problem hiding this comment.
Hi @boblangley, thank you for contribution into a2a
a92f54e
into
a2aproject:epic/1.0_breaking_changes
🤖 I have created a release *beep* *boop* --- ## [1.0.0](v1.0.0-beta.0...v1.0.0) (2026-07-22) `@a2a-js/sdk` is now generally available. This release promotes the v1.0 line to stable, implementing the full [A2A Protocol Specification v1.0](https://a2a-protocol.org/v1.0.0/specification/) across all three transports (JSON-RPC, HTTP+JSON/REST, gRPC), with opt-in v0.3 backward compatibility for staged migrations. Upgrading from `0.3.x`? See the [v0.3 → v1.0 migration guide](https://github.com/a2aproject/a2a-js/blob/v1.0.0/docs/migration-guide.md). Interoperating with peers still on v0.3? See the [end-user v0.3 compatibility guide](https://github.com/a2aproject/a2a-js/blob/v1.0.0/docs/compatibility-v0_3.md). ### ⚠ BREAKING CHANGES * unify A2AError hierarchy with transport specific subclasses ([#587](#587)) * **server:** replace individual properties with SendMessageRequest in RequestContext ([#581](#581)) ### Features * add state bag and ServerCallContextBuilder to ServerCallContext ([#364](#364)) ([477e394](477e394)) * export SSE wire-format helpers from public entry point ([#548](#548)) ([8bc21f5](8bc21f5)), closes [#547](#547) * **server:** expose SendMessageRequest metadata to AgentExecutor via RequestContext ([#564](#564)) ([a92f54e](a92f54e)) * **server:** replace individual properties with SendMessageRequest in RequestContext ([#581](#581)) ([7cd30de](7cd30de)) * unify A2AError hierarchy with transport specific subclasses ([#587](#587)) ([4806f8f](4806f8f)) ### Bug Fixes * **client:** bound SSE event size to prevent client-side memory exhaustion ([#582](#582)) ([e6e8ce9](e6e8ce9)) * **client:** cancel the SSE stream on teardown to avoid leaking connections ([#580](#580)) ([83269a5](83269a5)) * **grpc:** preserve null values in protobuf Struct ([#578](#578)) ([f447e4e](f447e4e)), closes [#576](#576) * resolve sdk compatibility bugs ([#568](#568)) ([b57f026](b57f026)) * **server:** await _handleProcessingError so blocking drains surface errors ([#579](#579)) ([5833652](5833652)) * support GET for resubscribe route ([#569](#569)) ([8dd43d1](8dd43d1)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Co-authored-by: JakubWorek <jakubworek@google.com>
Adds an optional readonly
metadata: Record<string, unknown>property toRequestContext, populated fromSendMessageRequest.metadatain bothsendMessageandsendMessageStream.existing
RequestContextconstruction sites are unaffected.undefinedwhen the request carries no metadata — no behavior changefor existing executors.
default_request_handler.spec.ts: request metadatareaches the executor on both the unary and streaming send paths (exercised
with the spec's own
a2a-service-parameterspattern), and the propertystays
undefinedwhen the request carries none.Description
Thank you for opening a Pull Request!
Before submitting your PR, there are a few things you can do to make sure it goes smoothly:
CONTRIBUTINGGuide.fix:which represents bug fixes, and correlates to a SemVer patch.feat:represents a new feature, and correlates to a SemVer minor.feat!:, orfix!:,refactor!:, etc., which represent a breaking change (indicated by the!) and will result in a SemVer major.Fixes #563 🦕