Skip to content

Conversation

@cmtoan
Copy link

@cmtoan cmtoan commented Jan 2, 2026

Description

Event consumer should stop on input_required task as fixed in the python version a2aproject/a2a-python#167

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @cmtoan, 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 addresses a critical issue in the event consumption mechanism where the system failed to halt event processing when a task entered an 'input required' state. By modifying the event consumer to recognize this state as a termination condition, the change ensures proper flow control and consistency with other language implementations, preventing unnecessary resource usage and potential logical errors.

Highlights

  • Event Consumer Logic Update: The EventConsumer now correctly stops processing events when it encounters a Task with a status of INPUT_REQUIRED, aligning its behavior with the Python implementation.
  • New Helper Method: A private helper method, isFinalOrInterruptedTask, has been introduced in EventConsumer.java to encapsulate the logic for determining if a task's state should terminate the event stream, including both final states and the new INPUT_REQUIRED state.
  • New Test Case: A dedicated test case, testConsumeTaskInputRequired, has been added to EventConsumerTest.java to verify that the event stream properly terminates upon receiving an INPUT_REQUIRED task.
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 correctly implements the requirement for the EventConsumer to stop processing events when a task with the INPUT_REQUIRED state is encountered. The change is isolated and a new helper method is introduced for the logic. A corresponding unit test has been added to verify the new behavior. My review includes suggestions to improve the clarity of the new method's name and to address code duplication in the test suite for better long-term maintainability.

isFinalEvent = true;
} else if (event instanceof Task task) {
isFinalEvent = task.status().state().isFinal();
isFinalEvent = isFinalOrInterruptedTask(task);
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 match the suggested rename of the helper method for clarity, this call should be updated.

Suggested change
isFinalEvent = isFinalOrInterruptedTask(task);
isFinalEvent = isStreamTerminatingTask(task);

Comment on lines 124 to 126
private boolean isFinalOrInterruptedTask(Task task) {
return task.status().state().isFinal() || task.status().state() == TaskState.INPUT_REQUIRED;
}
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 method name isFinalOrInterruptedTask can be misleading, as INPUT_REQUIRED is not a final state for a task, but rather a state that should terminate the event stream. A more descriptive name like isStreamTerminatingTask would improve clarity. For even better readability, you could also consider storing task.status().state() in a local variable.

Suggested change
private boolean isFinalOrInterruptedTask(Task task) {
return task.status().state().isFinal() || task.status().state() == TaskState.INPUT_REQUIRED;
}
private boolean isStreamTerminatingTask(Task task) {
return task.status().state().isFinal() || task.status().state() == TaskState.INPUT_REQUIRED;
}

Comment on lines 289 to 313
publisher.subscribe(new Flow.Subscriber<>() {
private Flow.Subscription subscription;

@Override
public void onSubscribe(Flow.Subscription subscription) {
this.subscription = subscription;
subscription.request(1);
}

@Override
public void onNext(EventQueueItem item) {
receivedEvents.add(item.getEvent());
subscription.request(1);
}

@Override
public void onError(Throwable throwable) {
error.set(throwable);
}

@Override
public void onComplete() {
subscription.cancel();
}
});
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

This subscriber implementation is duplicated across several tests in this file (e.g., testConsumeAllMultipleEvents, testConsumeMessageEvents). To improve maintainability and reduce boilerplate code, consider extracting this logic into a private helper method. The helper could take a Flow.Publisher and return the collected events, making each test more concise and focused on its specific assertions.

@cmtoan
Copy link
Author

cmtoan commented Jan 2, 2026

There are flaky tests in QuarkusA2ARestTest.

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.

1 participant