Nothing Special   »   [go: up one dir, main page]

Skip to content

Latest commit

 

History

History
474 lines (336 loc) · 16.4 KB

README.md

File metadata and controls

474 lines (336 loc) · 16.4 KB

CodeGPT

Lint and Testing codecov Go Report Card

cover

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.

flow

Features

code review

Installation

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

Setup

Please first create your OpenAI API Key. The OpenAI Platform allows you to generate a new API Key.

register

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 to gpt-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 is 3.
  • git.exclude_list: exclude file from git diff command.
  • openai.provider: default service provider is openai, you can change to azure.
  • output.lang: default language is en and available languages zh-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.

How to change to Azure OpenAI Service

Please get the API key, Endpoint and Model deployments list from Azure Resource Management Portal on left menu.

azure01

azure02

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:

  1. llama-3.1-8b-instant (Meta)
  2. llama-3.1-70b-versatile (Meta)
  3. llama-3.1-405b-reasoning (Meta)
  4. llama3-8b-8192 (Meta)
  5. llama3-70b-8192 (Meta)
  6. llama3-groq-8b-8192-tool-use-preview
  7. llama3-groq-70b-8192-tool-use-preview
  8. mixtral-8x7b-32768 (Mistral)
  9. gemma2-9b-it (Google)
  10. gemma-7b-it (Google)

How to change to ollama API Service

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.

Usage

There are two methods for generating a commit message using the codegpt command: CLI mode and Git Hook.

CLI Mode

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

Change commit message template

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

Git hook

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.

Install

You want to install the hook in the Git repository:

codegpt hook install

Uninstall

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(+)

Code Review

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.

==================================================

Testing

Run the following command to test the code:

make test

Star History

Star History Chart

Reference