Skip to content

Conversation

@fjuma
Copy link
Collaborator

@fjuma fjuma commented Aug 1, 2025

Description

This PR introduces some new spec classes and updates some existing ones based off the updates in the v0.3.0 spec.

Note that the TCK job will fail until the v0.3.0 TCK is available.

  • Follow the CONTRIBUTING Guide.
  • Make your Pull Request title in the https://www.conventionalcommits.org/ specification.
    • Important Prefixes for release-please:
      • fix: which represents bug fixes, and correlates to a SemVer patch.
      • feat: represents a new feature, and correlates to a SemVer minor.
      • feat!:, or fix!:, refactor!:, etc., which represent a breaking change (indicated by the !) and will result in a SemVer major.
  • Ensure the tests pass
  • Appropriate READMEs were updated (if necessary)

Fixes #209 🦕

Copy link
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.

Summary of Changes

Hello @fjuma, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request brings the A2A Java SDK into alignment with the recently released v0.3.0 specification. It introduces significant updates to the core data models, particularly enhancing the AgentCard structure with new fields like transport protocols and digital signatures. A key new feature is the implementation of the agent/getAuthenticatedExtendedCard API, enabling secure retrieval of extended agent metadata. Additionally, a new security scheme for mutual TLS is added, and various existing specification classes receive updated documentation and minor structural adjustments.

Highlights

  • Core Spec Alignment: Updates the SDK to conform with the v0.3.0 A2A specification, introducing new data models and modifying existing ones.
  • Authenticated Extended Agent Card API: Implements the new agent/getAuthenticatedExtendedCard JSON-RPC method, allowing clients to retrieve an authenticated extended agent card, along with corresponding request, response, and error classes.
  • Agent Card Structure Enhancements: Modifies the AgentCard to include preferredTransport, additionalInterfaces, and signatures, and renames the default agent card discovery path from /.well-known/agent.json to /.well-known/agent-card.json. New classes AgentCardSignature and TransportProtocol are introduced.
  • New Security Scheme: Introduces MutualTLSSecurityScheme to support mTLS authentication, expanding the available security options.
  • Project Version Update: Bumps the project's parent and dependency versions to 0.3.0.Beta1-SNAPSHOT across all modules.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in issue comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments or fill out our survey to provide feedback.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
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 implements the v0.3.0 spec for the A2A protocol, introducing new spec classes and updating existing ones. The changes include updates to client, server implementations, spec definitions, and examples. The implementation is well-executed with diligent updates to tests. Minor issues related to correctness and maintainability have been identified.

String httpResponseBody = sendPostRequest(request, authHeaders);
return unmarshalResponse(httpResponseBody, GET_AUTHENTICATED_AGENT_CARD_RESPONSE_REFERENCE);
} catch (IOException | InterruptedException e) {
throw new A2AServerException("Failed to get authenticated extended agent card: " + e, e.getCause());
Copy link
Contributor

Choose a reason for hiding this comment

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

high

The original exception e should be passed as the cause for the new A2AServerException, not e.getCause(). Using e.getCause() can lead to loss of important stack trace information if e itself is the root cause and has no further cause.

Suggested change
throw new A2AServerException("Failed to get authenticated extended agent card: " + e, e.getCause());
throw new A2AServerException("Failed to get authenticated extended agent card: " + e, e);

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Fixed

private static final TypeReference<SetTaskPushNotificationConfigResponse> SET_TASK_PUSH_NOTIFICATION_CONFIG_RESPONSE_REFERENCE = new TypeReference<>() {};
private static final TypeReference<ListTaskPushNotificationConfigResponse> LIST_TASK_PUSH_NOTIFICATION_CONFIG_RESPONSE_REFERENCE = new TypeReference<>() {};
private static final TypeReference<DeleteTaskPushNotificationConfigResponse> DELETE_TASK_PUSH_NOTIFICATION_CONFIG_RESPONSE_REFERENCE = new TypeReference<>() {};
private static final TypeReference<GetAuthenticatedExtendedCardResponse> GET_AUTHENTICATED_AGENT_CARD_RESPONSE_REFERENCE = new TypeReference<>() {};
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

The name of this constant, GET_AUTHENTICATED_AGENT_CARD_RESPONSE_REFERENCE, does not match its generic type GetAuthenticatedExtendedCardResponse. For consistency and to avoid confusion, it should be renamed to GET_AUTHENTICATED_EXTENDED_CARD_RESPONSE_REFERENCE.

Suggested change
private static final TypeReference<GetAuthenticatedExtendedCardResponse> GET_AUTHENTICATED_AGENT_CARD_RESPONSE_REFERENCE = new TypeReference<>() {};
private static final TypeReference<GetAuthenticatedExtendedCardResponse> GET_AUTHENTICATED_EXTENDED_CARD_RESPONSE_REFERENCE = new TypeReference<>() {};

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Fixed

Comment on lines 29 to 31
if (! method.equals(METHOD)) {
throw new IllegalArgumentException("Invalid GetTaskPushNotificationRequest method");
}
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

The exception message here is incorrect. It refers to GetTaskPushNotificationRequest but should refer to GetAuthenticatedExtendedCardRequest. This seems to be a copy-paste error.

Suggested change
if (! method.equals(METHOD)) {
throw new IllegalArgumentException("Invalid GetTaskPushNotificationRequest method");
}
if (! method.equals(METHOD)) {
throw new IllegalArgumentException("Invalid GetAuthenticatedExtendedCardRequest method");
}

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Fixed

@fjuma fjuma self-assigned this Aug 6, 2025
@fjuma fjuma force-pushed the v0.3.0 branch 6 times, most recently from 5a511ff to 1f2d12f Compare August 7, 2025 21:08
@fjuma fjuma marked this pull request as ready for review August 18, 2025 21:02
@fjuma
Copy link
Collaborator Author

fjuma commented Aug 18, 2025

@maeste @ehsavoie I've updated the TCK version here to 0.3.0.alpha and CI passed. Please review when you get a chance. Thanks!

@fjuma fjuma requested a review from maeste August 18, 2025 21:04
@fjuma fjuma merged commit 198504b into a2aproject:main Aug 19, 2025
3 checks passed
kabir pushed a commit to kabir/a2a-java that referenced this pull request Dec 23, 2025
# Description

This PR introduces some new spec classes and updates some existing ones
based off the updates in the [v0.3.0
spec](https://github.com/a2aproject/A2A/releases/tag/v0.3.0).

Note that the TCK job will fail until the v0.3.0 TCK is available.

- [X] Follow the [`CONTRIBUTING` Guide](../CONTRIBUTING.md).
- [X] Make your Pull Request title in the
<https://www.conventionalcommits.org/> specification.
- Important Prefixes for
[release-please](https://github.com/googleapis/release-please):
- `fix:` which represents bug fixes, and correlates to a
[SemVer](https://semver.org/) patch.
- `feat:` represents a new feature, and correlates to a SemVer minor.
- `feat!:`, or `fix!:`, `refactor!:`, etc., which represent a breaking
change (indicated by the `!`) and will result in a SemVer major.
- [X] Ensure the tests pass
- [X] Appropriate READMEs were updated (if necessary)

Fixes a2aproject#209 🦕
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.

[Feat]: Implement the spec updates for 0.3.0

2 participants