A CLI written in Go that writes git commit messages or provides a code review summary for you using ChatGPT AI (gpt-3.5-turbo, gpt-4 model) and automatically installs a git prepare-commit-msg hook.
- Supports Azure OpenAI Service, OpenAI API, Gemini, Ollama, Groq, and OpenRouter.
- Supports conventional commits specification.
- Supports Git prepare-commit-msg Hook, see the Git Hooks documentation.
- Supports customizing generated diffs with n lines of context, the default is three.
- Supports excluding files from the git diff command.
- Supports commit message translation into another language (supports
en
,zh-tw
, orzh-cn
). - Supports socks proxy or custom network HTTP proxy.
- Supports model lists like
gpt-4
,gpt-3.5-turbo
, etc. - Supports generating a brief code review.
Install from Homebrew on macOS
brew tap appleboy/tap
brew install codegpt
Install from Chocolatey on Windows
choco install codegpt
The pre-compiled binaries can be downloaded from release page. Change the binary permissions to 755
and copy the binary to the system bin directory. Use the codegpt
command as shown below.
$ codegpt version
version: v0.4.3 commit: xxxxxxx
Install from source code:
go install github.com/appleboy/CodeGPT/cmd/codegpt@latest
Please first create your OpenAI API Key. The OpenAI Platform allows you to generate a new API Key.
An environment variable is a variable that is set on your operating system, rather than within your application. It consists of a name and value. We recommend that you set the name of the variable to OPENAI_API_KEY
.
See the Best Practices for API Key Safety.
export OPENAI_API_KEY=sk-xxxxxxx
or store your API key in a custom config file.
codegpt config set openai.api_key sk-xxxxxxx
This will create a .codegpt.yaml
file in your home directory ($HOME/.config/codegpt/.codegpt.yaml). The following options are available.
- openai.base_url: replace the default base URL (
https://api.openai.com/v1
). - openai.api_key: generate API key from openai platform page.
- openai.org_id: Identifier for this organization sometimes used in API requests. see organization settings. only for
openai
service. - openai.model: default model is
gpt-3.5-turbo
, you can change togpt-4-turbo
or other custom model (Groq or OpenRouter provider). - openai.proxy: http/https client proxy.
- openai.socks: socks client proxy.
- openai.timeout: default http timeout is
10s
(ten seconds). - openai.max_tokens: default max tokens is
300
. see reference max_tokens. - openai.temperature: default temperature is
1
. see reference temperature. - git.diff_unified: generate diffs with
<n>
lines of context, default is3
. - git.exclude_list: exclude file from
git diff
command. - openai.provider: default service provider is
openai
, you can change toazure
. - output.lang: default language is
en
and available languageszh-tw
,zh-cn
,ja
. - openai.top_p: default top_p is
1.0
. see reference top_p. - openai.frequency_penalty: default frequency_penalty is
0.0
. see reference frequency_penalty. - openai.presence_penalty: default presence_penalty is
0.0
. see reference presence_penalty.
Please get the API key
, Endpoint
and Model deployments
list from Azure Resource Management Portal on left menu.
Update your config file.
codegpt config set openai.provider azure
codegpt config set openai.base_url https://xxxxxxxxx.openai.azure.com/
codegpt config set openai.api_key xxxxxxxxxxxxxxxx
codegpt config set openai.model xxxxx-gpt-35-turbo
Support Gemini API Service
Build with the Gemini API, you can see the Gemini API documentation. Update the provider
and api_key
in your config file. Please create an API key from the Gemini API page.
codegpt config set openai.provider gemini
codegpt config set openai.api_key xxxxxxx
codegpt config set openai.model gemini-1.5-flash-latest
How to change to Groq API Service
Please get the API key
from Groq API Service, please visit here. Update the base_url
and api_key
in your config file.
codegpt config set openai.provider openai
codegpt config set openai.base_url https://api.groq.com/openai/v1
codegpt config set openai.api_key gsk_xxxxxxxxxxxxxx
codegpt config set openai.model llama3-8b-8192
Support the following models:
llama-3.1-8b-instant
(Meta)llama-3.1-70b-versatile
(Meta)llama-3.1-405b-reasoning
(Meta)llama3-8b-8192
(Meta)llama3-70b-8192
(Meta)llama3-groq-8b-8192-tool-use-preview
llama3-groq-70b-8192-tool-use-preview
mixtral-8x7b-32768
(Mistral)gemma2-9b-it
(Google)gemma-7b-it
(Google)
We can use the Llama3 model from the ollama API Service, please visit here. Update the base_url
in your config file.
# pull llama3 8b model
ollama pull llama3
ollama cp llama3 gpt-3.5-turbo
Try to use the ollama
API Service.
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "Hello!"
}
]
}'
Update the base_url
in your config file. You don't need to set the api_key
in the config file.
codegpt config set openai.base_url http://localhost:11434/v1
How to change to OpenRouter API Service
You can see the supported models list, model usage can be paid by users, developers, or both, and may shift in availability. You can also fetch models, prices, and limits via API.
The following example use free model name: meta-llama/llama-3-8b-instruct:free
codegpt config set openai.provider openai
codegpt config set openai.base_url https://openrouter.ai/api/v1
codegpt config set openai.api_key sk-or-v1-xxxxxxxxxxxxxxxx
codegpt config set openai.model google/learnlm-1.5-pro-experimental:free
For including your app on openrouter.ai rankings and Shows in rankings on openrouter.ai, you can set the openai.headers
in your config file.
codegpt config set openai.headers "HTTP-Referer=https://github.com/appleboy/CodeGPT X-Title=CodeGPT"
- HTTP-Refer: Optional, for including your app on openrouter.ai rankings.
- X-Title: Optional, for Shows in rankings on openrouter.ai.
There are two methods for generating a commit message using the codegpt
command: CLI mode and Git Hook.
You can call codegpt
directly to generate a commit message for your staged changes:
git add <files...>
codegpt commit --preview
The commit message is shown below.
Summarize the commit message use gpt-3.5-turbo model
We are trying to summarize a git diff
We are trying to summarize a title for pull request
================Commit Summary====================
feat: Add preview flag and remove disableCommit flag in commit command and template file.
- Add a `preview` flag to the `commit` command
- Remove the `disbaleCommit` flag from the `prepare-commit-msg` template file
==================================================
Write the commit message to .git/COMMIT_EDITMSG file
or translate all git commit messages into a different language (Traditional Chinese
, Simplified Chinese
or Japanese
)
codegpt commit --lang zh-tw --preview
Consider the following outcome:
Summarize the commit message use gpt-3.5-turbo model
We are trying to summarize a git diff
We are trying to summarize a title for pull request
We are trying to translate a git commit message to Traditional Chinese language
================Commit Summary====================
功能:重構 codegpt commit 命令標記
- 將「codegpt commit」命令新增「預覽」標記
- 從「codegpt commit」命令中移除「--disableCommit」標記
==================================================
Write the commit message to .git/COMMIT_EDITMSG file
You can replace the tip of the current branch by creating a new commit. just use --amend
flag
codegpt commit --amend
Default commit message template as following:
{{ .summarize_prefix }}: {{ .summarize_title }}
{{ .summarize_message }}
change format with template string using --template_string
parameter:
codegpt commit --preview --template_string \
"[{{ .summarize_prefix }}]: {{ .summarize_title }}"
change format with template file using --template_file
parameter:
codegpt commit --preview --template_file your_file_path
Add custom variable to git commit message template:
{{ .summarize_prefix }}: {{ .summarize_title }}
{{ .summarize_message }}
{{ if .JIRA_URL }}{{ .JIRA_URL }}{{ end }}
Add custom variable to git commit message template using --template_vars
parameter:
codegpt commit --preview --template_file your_file_path --template_vars \
JIRA_URL=https://jira.example.com/ABC-123
Load custom variable from file using --template_vars_file
parameter:
codegpt commit --preview --template_file your_file_path --template_vars_file your_file_path
See the template_vars_file
format as following:
JIRA_URL=https://jira.example.com/ABC-123
You can also use the prepare-commit-msg hook to integrate codegpt
with Git. This allows you to use Git normally and edit the commit message before committing.
You want to install the hook in the Git repository:
codegpt hook install
You want to remove the hook from the Git repository:
codegpt hook uninstall
Stage your files and commit after installation:
git add <files...>
git commit
codegpt
will generate the commit message for you and pass it back to Git. Git will open it with the configured editor for you to review/edit it. Then, to commit, save and close the editor!
$ git commit
Summarize the commit message use gpt-3.5-turbo model
We are trying to summarize a git diff
We are trying to summarize a title for pull request
================Commit Summary====================
Improve user experience and documentation for OpenAI tools
- Add download links for pre-compiled binaries
- Include instructions for setting up OpenAI API key
- Add a CLI mode for generating commit messages
- Provide references for OpenAI Chat completions and ChatGPT/Whisper APIs
==================================================
Write the commit message to .git/COMMIT_EDITMSG file
[main 6a9e879] Improve user experience and documentation for OpenAI tools
1 file changed, 56 insertions(+)
You can use codegpt
to generate a code review message for your staged changes:
codegpt review
or translate all code review messages into a different language (Traditional Chinese
, Simplified Chinese
or Japanese
)
codegpt review --lang zh-tw
See the following result:
Code review your changes using gpt-3.5-turbo model
We are trying to review code changes
PromptTokens: 1021, CompletionTokens: 200, TotalTokens: 1221
We are trying to translate core review to Traditional Chinese language
PromptTokens: 287, CompletionTokens: 199, TotalTokens: 486
================Review Summary====================
總體而言,此程式碼修補似乎在增加 Review 指令的功能,允許指定輸出語言並在必要時進行翻譯。以下是需要考慮的潛在問題:
- 輸出語言沒有進行輸入驗證。如果指定了無效的語言代碼,程式可能會崩潰或產生意外結果。
- 此使用的翻譯 API 未指定,因此不清楚是否存在任何安全漏洞。
- 無法處理翻譯 API 調用的錯誤。如果翻譯服
==================================================
another php example code:
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
$html .= "<pre>{$cmd}</pre>";
}
?>
code review result:
================Review Summary====================
Code review:
1. Security: The code is vulnerable to command injection attacks as the user input is directly used in the shell_exec() function. An attacker can potentially execute malicious commands on the server by injecting them into the 'ip' parameter.
2. Error handling: There is no error handling in the code. If the ping command fails, the error message is not displayed to the user.
3. Input validation: There is no input validation for the 'ip' parameter. It should be validated to ensure that it is a valid IP address or domain name.
4. Cross-platform issues: The code assumes that the server is either running Windows or *nix operating systems. It may not work correctly on other platforms.
Suggestions for improvement:
1. Use escapeshellarg() function to sanitize the user input before passing it to shell_exec() function to prevent command injection.
2. Implement error handling to display error messages to the user if the ping command fails.
3. Use a regular expression to validate the 'ip' parameter to ensure that it is a valid IP address or domain name.
4. Use a more robust method to determine the operating system, such as the PHP_OS constant, which can detect a wider range of operating systems.
==================================================
Run the following command to test the code:
make test