Skip to content

feat: Add GetExtendedAgentCard Support to RequestHandlers#919

Merged
sokoliva merged 33 commits intoa2aproject:1.0-devfrom
sokoliva:GetExtendedAgentCard
Apr 8, 2026
Merged

feat: Add GetExtendedAgentCard Support to RequestHandlers#919
sokoliva merged 33 commits intoa2aproject:1.0-devfrom
sokoliva:GetExtendedAgentCard

Conversation

@sokoliva
Copy link
Copy Markdown
Member

@sokoliva sokoliva commented Apr 1, 2026

Description

The GetExtendedAgentCard capability was defined in the spec but not implemented in the request_handler.py.

Changes

  • Added on_get_extended_agent_card to the base RequestHandler and its child class DefaultRequestHandler.
  • Removed GetExtendedAgentCard method implementations from the Transport layer and consequently moved AgentCard informations from the Transport layer to the RequestHandlers.
  • moved validate logic from the transport layer to the default request handler

Fixes #866 🦕

@sokoliva sokoliva requested a review from a team as a code owner April 1, 2026 10:11
@sokoliva sokoliva requested a review from guglielmo-san April 1, 2026 10:11
Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors the management of AgentCard and its modifiers by centralizing them within the RequestHandler architecture, removing the need to pass these objects individually to gRPC, REST, and JSON-RPC handlers. It also introduces centralized capability validation using an updated validate decorator and adds a specific error for missing push notification configurations. Feedback highlights a regression in the validate decorator which now fails to correctly wrap standard coroutine functions, as well as a violation of the style guide regarding the direct raising of exception classes.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 1, 2026

🧪 Code Coverage (vs 1.0-dev)

⬇️ Download Full Report

Base PR Delta
src/a2a/client/transports/http_helpers.py 94.44% 90.28% 🔴 -4.17%
src/a2a/compat/v0_3/grpc_handler.py 97.01% 98.44% 🟢 +1.42%
src/a2a/compat/v0_3/jsonrpc_adapter.py 67.16% 66.36% 🔴 -0.80%
src/a2a/compat/v0_3/request_handler.py 96.77% 96.97% 🟢 +0.20%
src/a2a/compat/v0_3/rest_adapter.py 51.43% 76.47% 🟢 +25.04%
src/a2a/compat/v0_3/rest_handler.py 96.67% 96.70% 🟢 +0.04%
src/a2a/server/request_handlers/default_request_handler.py 99.00% 97.82% 🔴 -1.18%
src/a2a/server/request_handlers/default_request_handler_v2.py 95.85% 92.05% 🔴 -3.80%
src/a2a/server/request_handlers/grpc_handler.py 94.64% 94.38% 🔴 -0.27%
src/a2a/server/request_handlers/request_handler.py 92.59% 81.94% 🔴 -10.65%
src/a2a/server/routes/jsonrpc_dispatcher.py 85.98% 86.53% 🟢 +0.55%
src/a2a/server/routes/jsonrpc_routes.py 66.67% 70.00% 🟢 +3.33%
src/a2a/server/routes/rest_dispatcher.py 92.43% 94.67% 🟢 +2.24%
src/a2a/utils/helpers.py 97.19% 96.71% 🔴 -0.48%
Total 92.33% 92.49% 🟢 +0.15%

Generated by coverage-comment.yml

@sokoliva sokoliva requested a review from guglielmo-san April 2, 2026 14:28
@sokoliva
Copy link
Copy Markdown
Member Author

sokoliva commented Apr 2, 2026

/gemini review

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors the handling of AgentCard and related modifiers by centralizing them within the DefaultRequestHandler. This simplifies the constructors of GrpcHandler, JSONRPC03Adapter, REST03Adapter, JsonRpcDispatcher, and RestDispatcher, which now receive the RequestHandler directly. The validate decorator was also improved to allow specifying custom exception types. The review highlights an issue where exception classes are instantiated before being raised, which violates a repository rule, and suggests raising the class directly. It also points out a code duplication opportunity in itk/main.py when instantiating DefaultRequestHandler and DefaultRequestHandler_extended, suggesting using a common arguments dictionary for better maintainability.

@guglielmo-san guglielmo-san self-requested a review April 3, 2026 07:49
@sokoliva sokoliva requested a review from guglielmo-san April 7, 2026 14:33
@sokoliva sokoliva merged commit 2159140 into a2aproject:1.0-dev Apr 8, 2026
15 checks passed
guglielmo-san pushed a commit that referenced this pull request Apr 10, 2026
🤖 I have created a release *beep* *boop*
---


##
[1.0.0-alpha.1](v1.0.0-alpha.0...v1.0.0-alpha.1)
(2026-04-10)


### ⚠ BREAKING CHANGES

* **client:** make ClientConfig.push_notification_config singular
([#955](#955))
* **client:** reorganize ClientFactory API
([#947](#947))
* **server:** add build_user function to DefaultContextBuilder to allow
A2A user creation customization
([#925](#925))
* **client:** remove `ClientTaskManager` and `Consumers` from client
([#916](#916))
* **server:** migrate from Application wrappers to Starlette route-based
endpoints for rest
([#892](#892))
* **server:** migrate from Application wrappers to Starlette route-based
endpoints for jsonrpc
([#873](#873))

### Features

* A2A Version Header validation on server side.
([#865](#865))
([b261ceb](b261ceb))
* Add GetExtendedAgentCard Support to RequestHandlers
([#919](#919))
([2159140](2159140))
* Add support for more Task Message and Artifact fields in the Vertex
Task Store ([#936](#936))
([605fa49](605fa49))
* Create EventQueue interface and make tap() async.
([#914](#914))
([9ccf99c](9ccf99c)),
closes [#869](#869)
* EventQueue - unify implementation between python versions
([#877](#877))
([7437b88](7437b88)),
closes [#869](#869)
* EventQueue is now a simple interface with single enqueue_event method.
([#944](#944))
([f0e1d74](f0e1d74))
* Implementation of DefaultRequestHandlerV2
([#933](#933))
([462eb3c](462eb3c)),
closes [#869](#869)
* InMemoryTaskStore creates a copy of Task by default to make it
consistent with database task stores
([#887](#887))
([8c65e84](8c65e84)),
closes [#869](#869)
* merge metadata of new and old artifact when append=True
([#945](#945))
([cc094aa](cc094aa))
* **server:** add async context manager support to EventQueue
([#743](#743))
([f68b22f](f68b22f))
* **server:** validate presence according to `google.api.field_behavior`
annotations
([#870](#870))
([4586c3e](4586c3e))
* Simplify ActiveTask.subscribe()
([#958](#958))
([62e5e59](62e5e59))
* Support AgentExectuor enqueue of a Task object.
([#960](#960))
([12ce017](12ce017))
* Support Message-only simplified execution without creating Task
([#956](#956))
([354fdfb](354fdfb))
* Unhandled exception in AgentExecutor marks task as failed
([#943](#943))
([4fc6b54](4fc6b54))


### Bug Fixes

* Add `packaging` to base dependencies
([#897](#897))
([7a9aec7](7a9aec7))
* **client:** do not mutate SendMessageRequest in
BaseClient.send_message
([#949](#949))
([94537c3](94537c3))
* fix `athrow()` RuntimeError on streaming responses
([#912](#912))
([ca7edc3](ca7edc3))
* fix docstrings related to `CallContextBuilder` args in constructors
and make ServerCallContext mandatory in `compat` folder
([#907](#907))
([9cade9b](9cade9b))
* fix error handling for gRPC and SSE streaming
([#879](#879))
([2b323d0](2b323d0))
* fix JSONRPC error handling
([#957](#957))
([6c807d5](6c807d5))
* fix REST error handling
([#893](#893))
([405be3f](405be3f))
* handle SSE errors occurred after stream started
([#894](#894))
([3a68d8f](3a68d8f))
* remove the use of deprecated types from VertexTaskStore
([#889](#889))
([6d49122](6d49122))
* Remove unconditional SQLAlchemy dependency from SDK core
([#898](#898))
([ab762f0](ab762f0)),
closes [#883](#883)
* remove unused import and request for FastAPI in pyproject
([#934](#934))
([fe5de77](fe5de77))
* replace stale entry in a2a.types.__all__ with actual import name
([#902](#902))
([05cd5e9](05cd5e9))
* wrong method name for ExtendedAgentCard endpoint in JsonRpc compat
version ([#931](#931))
([5d22186](5d22186))


### Documentation

* add Database Migration Documentation
([#864](#864))
([fd12dff](fd12dff))


### Miscellaneous Chores

* release 1.0.0-alpha.1
([a61f6d4](a61f6d4))


### Code Refactoring

* **client:** make ClientConfig.push_notification_config singular
([#955](#955))
([be4c5ff](be4c5ff))
* **client:** remove `ClientTaskManager` and `Consumers` from client
([#916](#916))
([97058bb](97058bb)),
closes [#734](#734)
* **client:** reorganize ClientFactory API
([#947](#947))
([01b3b2c](01b3b2c))
* **server:** add build_user function to DefaultContextBuilder to allow
A2A user creation customization
([#925](#925))
([2648c5e](2648c5e))
* **server:** migrate from Application wrappers to Starlette route-based
endpoints for jsonrpc
([#873](#873))
([734d062](734d062))
* **server:** migrate from Application wrappers to Starlette route-based
endpoints for rest
([#892](#892))
([4be2064](4be2064))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
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.

2 participants