commit | 98445ad6a8a1413d7f29a8f5b041affd8437c699 | [log] [tgz] |
---|---|---|
author | Patrizio <patrizio.gelosi@amarulasolutions.com> | Mon Nov 13 11:51:46 2023 +0100 |
committer | Patrizio <patrizio.gelosi@amarulasolutions.com> | Fri Nov 17 11:33:27 2023 +0100 |
tree | 92997f85f6479d4d9d74d23771149b4d612b0c94 | |
parent | 66d68785ad4b2624729a31ec00c8f1b9c4c54a0a [diff] |
Support ChatGPT response to inline comments Added the capability to reply to multiple inline comments, minimizing the payload sent to ChatGPT. The prompt sent to ChatGPT is adapted so that each comment is converted into a tagged request. This process includes incorporating the selected code snippet in each request to enhance the insight quality of ChatGPT. Subsequently, the related responses from ChatGPT are extracted and submitted back to Gerrit, with each response linked to its corresponding request. NOTES: - Due to the absence of a specific Gerrit REST endpoint to fetch comments from a processed 'comment-added' event, the general GET comments endpoint (returning all comments in a patchset) is used instead. Comments are filtered to include only those made by the same author as the event's author, within a certain time period prior to the event. - State retention issues occurring after subsequent mixed patchset submissions and inline comment requests have been resolved using the `initialize` method of the `GerritClientBase` class. - The splitting of ChatGPT comments longer than a given number of lines into multiple comments is suppressed. Jira-Id: IT-103 Change-Id: I0d78e47fc5e3aad1ef3e6d449dcd1bded28c2abc Signed-off-by: Patrizio <patrizio.gelosi@amarulasolutions.com>
Build: Requires JDK 11 or higher, Maven 3.0 or higher.
mvn -U clean package
Alternatively, you can also download the pre-built packages directly from the ‘Releases’ page on our GitHub repository. On this page, you will find the released versions and can download the corresponding JAR files. Make sure to select the appropriate JAR file that corresponds to the desired version.
Install: Upload the compiled jar file to the $gerrit_site/plugins
directory.
Configure: Set up the basic parameters in your $gerrit_site/etc/gerrit.config
:
gptToken
: OpenAI GPT token.
gerritAuthBaseUrl
: The URL of your Gerrit instance. Similar to: https://gerrit.local.team/a
gerritUserName
: Gerrit username.
gerritPassword
: Gerrit password.
globalEnable
: Default value is false. The plugin will only review specified repositories. If set to true, the plugin will by default review all pull requests.
For enhanced security, consider storing sensitive information like gptToken and gerritPassword in a secure location or file. Detailed instructions on how to do this will be provided later in this document.
Verify: After restarting Gerrit, you can see the following information in Gerrit's logs:
INFO com.google.gerrit.server.plugins.PluginLoader : Loaded plugin chatgpt-code-review-gerrit-plugin, version 1.0.0
You can also check the status of the chatgpt-code-review-gerrit-plugin on Gerrit's plugin page as Enabled.
Consider the following code snippet:
public static int stringToInt(String bar) throws Exception { if (bar == null || bar.length() == 0) { throw new Exception("Invalid string input"); } int x = 0; boolean y = false; int z = 0; if (bar.charAt(bar.length() - 1) == '-') { y = true; } for (int i = z; i < bar.length(); i++) { char w = bar.charAt(i); if (w == ' ') { continue; } x = x * 10 + (w - '0'); } return -x; }
Upon review, here are some suggestions and potential issues for the given patch:
Overall, it's recommended that the exception handling for the string to int conversion could be improved and the code for negative numbers should be fixed.
@gpt Please review and optimize this code. I'd like to continue manually parsing the string
The existing code converts a string representing a number into its integer form. Nevertheless, it does not take into account certain circumstances such as input strings that contain characters aside from numbers, whitespaces, or a ‘-’ at the last place. A ‘-’ at the last place is not standard for indicating negative numbers; it should be at the first place. Furthermore, in its current state, the code always returns a negative number. Here is a revision of the code that optimizes logic and improves error handling.
public static int stringToInt(String inputString) throws IllegalArgumentException { if (inputString == null || inputString.trim().isEmpty()) { throw new IllegalArgumentException("Invalid string input"); } inputString = inputString.trim(); boolean isNegative = false; String numStr = inputString; if (inputString.charAt(0)=='-') { isNegative = true; numStr = inputString.substring(1); } int result = 0; for (int i = 0; i < numStr.length(); i++) { char c = numStr.charAt(i); if (!Character.isDigit(c)) { throw new IllegalArgumentException("Invalid string input: non-digit character encountered."); } result *= 10; result += c - '0'; } return isNegative ? -result : result; }
The above optimization validates that the string only contains valid characters. It throws an IllegalArgumentException in cases where the String is null, a string without characters, or a string containing non-digit characters. The exception in the event that it starts with ‘-’ (unlike the original code, where it only checks if it ends with ‘-’), the ‘inputString’ is trimmed prior to processing to eliminate leading and trailing whitespaces.
You have the option to establish global settings, or independently configure specific projects. If you choose independent configuration, the corresponding project settings will override the global parameters.
To configure these parameters, you need to modify your Gerrit configuration file (gerrit.config
). The file format is as follows:
[plugin "chatgpt-code-review-gerrit-plugin"] # Required parameters gptToken = {gptToken} gerritAuthBaseUrl = {gerritAuthBaseUrl} ... # Optional parameters gptModel = {gptModel} gptSystemPrompt = {gptSystemPrompt} ...
It is highly recommended to store sensitive information such as gptToken
and gerritPassword
in the secure.config
file. Please edit the file at $gerrit_site/etc/secure.config
and include the following details:
[plugin "chatgpt-code-review-gerrit-plugin"] gptToken = {gptToken} gerritPassword = {gerritPassword}
If you wish to encrypt the information within the secure.config
file, you can refer to: https://gerrit.googlesource.com/plugins/secure-config
To add the following content, please edit the project.config
file in refs/meta/config
:
[plugin "chatgpt-code-review-gerrit-plugin"] # Required parameters gerritUserName = {gerritUserName} gerritAuthBaseUrl = {gerritAuthBaseUrl} ... # Optional parameters gptModel = {gptModel} gptSystemPrompt = {gptSystemPrompt} ...
Please ensure strict control over the access permissions of refs/meta/config
since sensitive information such as gptToken
and gerritPassword
is configured in the project.config
file within refs/meta/config
.
gptModel
: The default model is gpt-3.5-turbo. You can also configure it to gpt-3.5-turbo-16k, gpt-4 or gpt-4-32k.gptSystemPrompt
: You can modify the default system prompt to your preferred prompt.gptTemperature
: The default value is 1. What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.gptReviewCommitMessages
: The default value is false. When enabled by setting to true, this option also verifies if the commit message matches with the content of the review.gptStreamOutput
: The default value is true. Whether the response is expected in stream output mode or not.patchSetReduction
: The default value is false. If set to true, the plugin will attempt to reduce patch content by compressing redundant blank lines, tabs, import statements, etc., in order to decrease the token count.maxReviewLines
: The default value is 1000. This sets a limit on the number of lines of code included in the review.enabledProjects (for global configuration only)
: The default value is an empty string. If globalEnable is set to false, the plugin will only run in the repositories specified here. The value should be a comma-separated list of repository names, for example: " project1,project2,project3".isEnabled (for project configuration only)
: The default is false. If set to true, the plugin will review the patchSet of this project.Apache License 2.0