Skip to content

Conversation

@kabir
Copy link
Collaborator

@kabir kabir commented Jul 28, 2025

Port the ServerCallContext from Python

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 @kabir, 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 the ServerCallContext object, a crucial component for encapsulating and propagating request-specific contextual information throughout the server's call stack. By porting this concept from a Python implementation, the change aims to standardize how server-side operations access details like user identity and request headers, making the system more robust and extensible for future authentication and authorization features.

Highlights

  • New ServerCallContext: Introduced a new ServerCallContext class to encapsulate request-specific data, including user information and request headers, providing a standardized way to access this context throughout the server.
  • Context Propagation: Modified the server's request handling flow (A2AServerRoutes, JSONRPCHandler, RequestHandler, DefaultRequestHandler, RequestContext) to create and propagate the ServerCallContext through method signatures.
  • Extensible Context Creation: Added a CallContextFactory interface, allowing for custom injection and creation of ServerCallContext instances, enhancing flexibility for different authentication and context-gathering strategies.
  • User Authentication Foundation: Integrated a User interface and UnauthenticatedUser singleton within ServerCallContext, laying the groundwork for robust user authentication and authorization features.
  • Python Port: This implementation ports the ServerCallContext concept from a Python codebase, aiming for architectural consistency across different language implementations.
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 introduces the ServerCallContext to propagate request-scoped data, such as user information and headers, through the request handling pipeline. The implementation involves plumbing the new context object through various layers of the application. The changes are logical and well-contained.

Comment on lines +269 to +271
// TODO Python's impl has
// state['auth'] = request.auth
// in jsonrpc_app.py. Figure out what this maps to in what Vert.X gives us
Copy link
Contributor

Choose a reason for hiding this comment

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

high

There's a TODO comment here about mapping request.auth from the Python implementation. It's important to investigate what this maps to in Vert.x to ensure the authentication information is correctly propagated. Neglecting this could lead to security issues or incorrect user context.

Comment on lines +14 to +17
public ServerCallContext(User user, Map<String, Object> state) {
this.user = user;
this.state = state;
}
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 state map is stored directly from the constructor argument, and the getter returns the same instance. This allows external code to modify the internal state of ServerCallContext, breaking encapsulation. To make the context immutable, you should store an unmodifiable copy of the map. This will prevent unintended side effects and ensure the context remains consistent throughout the request lifecycle.

Suggested change
public ServerCallContext(User user, Map<String, Object> state) {
this.user = user;
this.state = state;
}
public ServerCallContext(User user, Map<String, Object> state) {
this.user = user;
this.state = state != null ? Map.copyOf(state) : Map.of();
}

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I am not sure at this point whether the intent for this state map is to be mutable or not.

this.contextId = contextId;
this.task = task;
this.relatedTasks = relatedTasks == null ? new ArrayList<>() : relatedTasks;
this.callContext = callContext;
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 callContext field is declared as final, ensuring immutability after construction. This is good for preventing unintended modifications to the context within the RequestContext.

@kabir kabir merged commit ea56419 into a2aproject:main Jul 28, 2025
3 checks passed
kabir added a commit to kabir/a2a-java-sdk-server-jakarta that referenced this pull request Jul 29, 2025
kabir added a commit to kabir/a2a-java that referenced this pull request Dec 23, 2025
Port the ServerCallContext from Python
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