blob: aaad1cdb308427bc84fdc1059f6549eea269cd54 [file] [log] [blame] [view]
# ChatGPT Code Review Gerrit Plugin
## Features
This plugin allows you to use ChatGPT for code review in Gerrit conveniently. After submitting a Patch Set, OpenAI will
provide review feedback in the form of comments and, optionally, a vote.
You can continue to ask ChatGPT by @{gerritUserName} or @{gerritEmailAddress} (provided that `gerritEmailAddress` is in
the form "gerritUserName@<any_email_domain>") in the comments to further guide it in generating more targeted review
comments.
Reviews can be also triggered by directing a comment with the `/review` command to ChatGPT.
## Getting Started
1. **Build:** Requires JDK 11 or higher, Maven 3.0 or higher.
```bash
mvn -U clean package
```
If the user needs to disable test just run
```bash
mvn -U -DskipTests=true clean package
```
2. **Install:** Upload the compiled jar file to the `$gerrit_site/plugins` directory.
3. **Configure:** First, you need to create a ChatGPT user in Gerrit.
Then, set up the basic parameters in your `$gerrit_site/etc/gerrit.config` file under the section
`[plugin "chatgpt-code-review-gerrit-plugin"]`:
- `gptToken`: OpenAI GPT token.
- `gerritUserName`: Gerrit username of ChatGPT user.
- `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 in a secure location
or file. Detailed instructions on how to do this will be provided later in this document.
4. **Verify:** After restarting Gerrit, you can see the following information in Gerrit's logs:
```bash
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.
## Usage Examples
### Auto review on Patch Set submission
In the following example, a Patch Set receives a score of "-1" indicating a recommendation.
![Example of Vote](images/chatgpt_vote.png?raw=true)
**NOTE**: Voting is disabled by default. To use this feature, it needs to be activated either across all projects or on
a per-project basis via the `enabledVoting` configuration option, as described below.
### ChatGPT Score Adjustment Following User Interaction
In the example below, ChatGPT initially posits a potential unintended behavior in the code, assigning a "-1" score.
Upon receiving clarification, it resets the score to "0".
![Example of Dialogue](images/chatgpt_changed_mind.png?raw=true)
More examples of ChatGPT's code reviews and inline discussions are available at
https://wiki.amarulasolutions.com/opensource/products/chatgpt-gerrit.html
## Configuration Parameters
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.
### Global Configuration
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}
...
# Optional parameters
gptModel = {gptModel}
gptSystemPrompt = {gptSystemPrompt}
...
```
#### Secure Configuration
It is highly recommended to store sensitive information such as `gptToken` 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}
```
If you wish to encrypt the information within the `secure.config` file, you can refer
to: https://gerrit.googlesource.com/plugins/secure-config
### Project Configuration
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}
...
# Optional parameters
gptModel = {gptModel}
gptSystemPrompt = {gptSystemPrompt}
...
```
#### Secure Configuration
Please ensure **strict control over the access permissions of `refs/meta/config`** since sensitive information such as
`gptToken` is configured in the `project.config` file within `refs/meta/config`.
### Optional Parameters
- `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.
- `gptDomain`: The default ChatGPT domain is `https://api.openai.com`.
- `gptSystemPrompt`: You can modify the default system prompt ("Act as a PatchSet Reviewer") to your preferred prompt.
- `gptReviewTemperature`: Specifies the temperature setting for ChatGPT when reviewing a Patch Set, with a default
setting of 0.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.
- `gptCommentTemperature`: Specifies the temperature setting for ChatGPT when replying to a comment, with a default
setting of 1.0.
- `gptReviewPatchSet`: Set to true by default. When switched to false, it disables the automatic review of Patch Sets as
they are created or updated.
- `gptReviewCommitMessages`: The default value is true. When enabled, this option also verifies if the commit message
matches with the content of the Change Set.
- `gptFullFileReview`: Enabled by default. Activating this option sends both unchanged lines and changes to ChatGPT for
review, offering additional context information. Deactivating it (set to false) results in only the changed lines
being submitted for review.
- `gptStreamOutput`: The default value is false. Whether the response is expected in stream output mode or not.
- `maxReviewLines`: The default value is 1000. This sets a limit on the number of lines of code included in the review.
- `maxReviewFileSize`: Set with a default value of 10000, this parameter establishes a cap on the file size that can be
included in reviews.
- `enabledUsers`: By default, every user is enabled to have their Patch Sets and comments reviewed. To limit review
capabilities to specific users, list their usernames in this setting, separated by commas.
- `disabledUsers`: Functions oppositely to enabledUsers.
- `enabledGroups`: By default, all groups are permitted to have their Patch Sets and comments reviewed. To restrict
review access to certain groups, specify their names in this setting, separating them with commas.
- `disabledGroups`: Operates in reverse to `enabledGroups`, excluding specified groups from reviews.
- `enabledTopicFilter`: Specifies a list of keywords that trigger ChatGPT reviews based on the topic of the Patch Set.
When this setting is active, only Patch Sets and their associated comments containing at least one of these keywords
in the topic are reviewed.
- `disabledTopicFilter`: Works in contrast to enabledTopicFilter, excluding Patch Sets and comments from review if their
topics contain specified keywords.
- `enabledFileExtensions`: This limits the reviewed files to the given types. Default file extensions are ".py, .java,
.js, .ts, .html, .css, .cs, .cpp, .c, .h, .php, .rb, .swift, .kt, .r, .jl, .go, .scala, .pl, .pm, .rs, .dart, .lua,
.sh, .vb, .bat".
- `enabledVoting`: Initially disabled (false). If set to true, allows ChatGPT to cast a vote on each reviewed Patch Set
by assigning a score.
- `filterNegativeComments`: Activated by default (true), ensuring only negative review comments (scored below the
`filterCommentsBelowScore` threshold outlined further) are displayed. Disabling this setting (false) will
also show positive and neutral comments.
- `filterCommentsBelowScore`: With `filterNegativeComments` active, review comments with a score at or above this
setting's value will not be shown (default is 0).
- `filterRelevantComments`: This setting is enabled by default (true) to display only those review comments considered
relevant by ChatGPT, which means they have a relevance index at or above the `filterCommentsRelevanceThreshold`
specified below. Turning off this option (false) allows the display of comments ChatGPT marks as irrelevant.
- `filterCommentsRelevanceThreshold`: When `filterRelevantComments` is enabled, any review comment assigned a relevance
score by ChatGPT below this threshold will not be shown. The default threshold is set at 0.6.
- `gptRelevanceRules`: This option allows customization of the rules ChatGPT uses to determine the relevance of a task.
- `patchSetCommentsAsResolved`: Initially set to false, this option leaves ChatGPT's Patch Set comments as unresolved,
inviting further discussion. If activated, it marks ChatGPT's Patch Set comments as resolved.
- `inlineCommentsAsResolved`: Initially set to false, this option leaves ChatGPT's inline comments as unresolved,
inviting further discussion. If activated, it marks ChatGPT's inline comments as resolved.
- `votingMinScore`: The lowest possible score that can be given to a Patch Set (Default value: -1).
- `votingMaxScore`: The highest possible score that can be given to a Patch Set (Default value: +1).
- `ignoreResolvedChatGptComments`: Determines if resolved comments from ChatGPT should be disregarded. The default
setting is true, which means resolved ChatGPT comments are not used for generating new comments or identifying
duplicate content. If set to false, resolved ChatGPT comments are factored into these processes.
- `ignoreOutdatedInlineComments`: Determines if inline comments made on non-latest Patch Sets should be disregarded. By
default, this is set to false, meaning all inline comments are used for generating new responses and identifying
repetitions. If enabled (true), inline comments from previous Patch Sets are excluded from these considerations.
- `enableMessageDebugging`: This setting controls the activation of debugging functionalities through messages (default
value is false). When set to true, it enables commands and options like `--debug` for users.
#### Optional Parameters for Global Configuration only
- `globalEnable`: Set to false by default, meaning the plugin will review only designated repositories. If enabled, the
plugin will automatically review all pull requests by default (not recommended in production environments).
- `enabledProjects`: 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".
#### Optional Parameters for Project Configuration only
- `isEnabled`: The default is false. If set to true, the plugin will review the Patch Set of this project.
## Commands
### Review Commands
Reviewing a Change Set or the last Patch Set can occur automatically upon submission or be manually triggered using the
commands outlined in this section.
#### Basic Syntax
- `/review`: when used in a comment directed at ChatGPT on any Change Set, triggers a review of the full Change Set. A
vote is cast on the Change Set if the voting feature is enabled and the ChatGPT Gerrit user is authorized to vote on
it.
- `/review_last`: when used in a comment directed at ChatGPT on any Change Set, triggers a review of the last Patch Set
of the Change Set. Unlike `/review`, this command does not result in casting or updating votes.
#### Command Options
- `--filter=[true/false]`: Controls the filtering of duplicate, conflicting and irrelevant comments, defaulting to
"true" to apply filters.
- `--debug`: When paired with `/review` or `/review_last` commands, this option displays useful debug information in
each ChatGPT reply, showing all replies as though the filter setting were disabled.
**NOTE**: The usage of `--debug` option is disabled by default. To enable it, `enableMessageDebugging` setting must be
set to true.
### Directives
Directives are mandatory instructions written in plain English that ChatGPT must adhere to during its reviews. They can
be specified using the following command.
#### Basic Syntax
`/directive <DIRECTIVE_CONTENT>`: This command, when included in a comment with a subsequent directive description
"<DIRECTIVE_CONTENT>", specifies a directive that ChatGPT must adhere to.
### Dynamic Configuration
You can now dynamically alter the plugin configuration via messages sent to the ChatGPT user, primarily for testing and
debugging purposes. This feature becomes available when the `enableMessageDebugging` configuration setting is enabled.
#### Basic Syntax
- `/configure` displays the current settings and their dynamically modified values in a response message.
- `/configure --<CONFIG_KEY_1>=<CONFIG_VALUE_1> [... --<CONFIG_KEY_N>=<CONFIG_VALUE_N>]` assigns new values to one or
more configuration keys.
**NOTE**: Values that include spaces, such as `gptSystemPrompt`, must be enclosed in double quotes.
#### Command Options
The `reset` option can be employed to restore modified settings to their original defaults. Its usage is detailed below:
- `/configure --reset` restores all modified settings to their default values.
- `/configure --reset --<CONFIG_KEY_1> [... --<CONFIG_KEY_N>]` specifically restores the indicated key(s) to their
default values.
## Testing
- You can run the unit tests in the project to familiarize yourself with the plugin's source code.
- If you want to individually test the Gerrit API or the ChatGPT API, you can refer to the test cases in
CodeReviewPluginIT.
## License
Apache License 2.0