Skip to content

Conversation

@fjuma
Copy link
Collaborator

@fjuma fjuma commented Oct 29, 2025

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:

  • 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 #408 🦕

@gemini-code-assist
Copy link
Contributor

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 introduces a significant enhancement to the core Artifact and Message data structures by adding a new extensions field. This change allows for the inclusion of arbitrary string-based extensions, improving the extensibility and adaptability of these fundamental objects. The modifications span across the model definitions, their builders, and the utility layers responsible for their creation and serialization, ensuring seamless integration and proper handling of this new capability.

Highlights

  • Model Enhancement: The Artifact and Message data models have been extended to include a new extensions field, which is a list of strings, allowing for greater flexibility and custom data association.
  • Constructor and Builder Updates: Constructors and Builder patterns for both Artifact and Message classes have been updated to properly incorporate and manage the new extensions field.
  • gRPC Integration: The ProtoUtils class has been modified to correctly map the extensions list when converting between gRPC MessageOrBuilder/ArtifactOrBuilder and the internal Message/Artifact objects.
  • Utility and Test Adjustments: Related utility methods in ArtifactUtils and serialization tests in EventSerializationTest have been updated to align with the new Artifact constructor signature, ensuring compatibility and correct behavior.
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 by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

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 pull request 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. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

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 adds a missing extensions field to the Artifact and Message data models, propagating the change through constructors, builders, and serialization/deserialization logic in related test and utility classes. The changes are correct and follow the existing patterns. I've added a couple of suggestions to improve the immutability of the Artifact and Message classes by making defensive copies of the new extensions list, which is a good practice for data model objects, especially when using records or aiming for immutability.

Comment on lines 77 to 80
public Builder extensions(List<String> extensions) {
this.extensions = extensions;
return this;
}
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

To ensure the immutability of the Artifact record, it's a good practice to create a defensive copy of the extensions list. Assigning the list directly allows the Artifact's internal state to be modified from outside if a mutable list is passed to the builder. This would violate the immutability contract of a record.

I noticed that the parts(Part<?>... parts) method correctly uses List.of() to create an immutable list. This new extensions method should follow a similar robust pattern.

For consistency and robustness, you might also consider applying this to other collection-based builder methods like parts(List<Part<?>> parts) and metadata(Map<String, Object> metadata).

Suggested change
public Builder extensions(List<String> extensions) {
this.extensions = extensions;
return this;
}
public Builder extensions(List<String> extensions) {
this.extensions = (extensions == null) ? null : List.copyOf(extensions);
return this;
}

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

this.taskId = taskId;
this.referenceTaskIds = referenceTaskIds;
this.metadata = metadata;
this.extensions = extensions;
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 Message class appears to be designed as mostly immutable (with final fields), but assigning the extensions list directly can break this if a mutable list is provided. This would allow the internal state of the Message object to be changed after its construction. To ensure immutability for this field, you should create a defensive copy of the list.

For completeness, you might consider applying the same pattern to other collection fields like parts, referenceTaskIds, and metadata to make the class more robustly immutable (acknowledging that contextId and taskId are mutable by design).

Suggested change
this.extensions = extensions;
this.extensions = (extensions == null) ? null : List.copyOf(extensions);

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

@kabir kabir merged commit f9cfbdd into a2aproject:main Oct 29, 2025
10 checks passed
kabir pushed a commit that referenced this pull request Nov 3, 2025
@jmesnil jmesnil added this to the 1.0.0 milestone Dec 11, 2025
kabir pushed a commit to kabir/a2a-java that referenced this pull request Dec 23, 2025
# 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:

- [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#408 🦕
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.

Add missing extensions to Artifact and Message

3 participants