Home

Awesome

CLI for ChatGPT

GitHub downloads

A CLI for ChatGPT, powered by GPT-3.5-turbo and GPT-4 models.

[!Note] More providers support (e.g. Claude, Gemini, Ollama) is under development and will be available soon. See #88 for more details.

demo

Usage

Get or create your OpenAI API Key from here: https://platform.openai.com/account/api-keys

export OPENAI_API_KEY=xxx

:speech_balloon: Start in chat mode

chatgpt

:speech_balloon: Start in chat mode with a provided prompt

chatgpt -p translator

:computer: Use it in a pipeline

cat config.yaml | chatgpt -p 'convert this yaml to json'
echo "Hello, world" | chatgpt -p translator | say

Installation

You can download the latest binary from the release page.

Install via HomeBrew on macOS/Linux

brew install j178/tap/chatgpt

Install via Scoop on Windows

scoop bucket add j178 https://github.com/j178/scoop-bucket.git
scoop install j178/chatgpt

Install via Nix on macOS/Linux

environment.systemPackages = [
  pkgs.chatgpt-cli
];

Install via go

go install github.com/j178/chatgpt/cmd/chatgpt@latest

Keybings

<details> <summary>Click to expand</summary>

General Key Bindings

Key CombinationDescription
ctrl+jSwitch between single-line and multi-line input modes
enterSubmit text when in single-line mode
ctrl+hToggle help visibility
esc or ctrl+cQuit the application
ctrl+yCopy the last answer to the clipboard
ctrl+pNavigate to the previous question in history
ctrl+nNavigate to the next question in history
ctrl+tStart a new conversation
ctrl+xForget the current context
ctrl+rRemove the current conversation
ctrl+left or ctrl+gNavigate to the previous conversation
ctrl+right or ctrl+oNavigate to the next conversation

Viewport Key Bindings

Key CombinationDescription
pgdown or pgdnScroll down one page
pgupScroll up one page
up or Scroll up one line
down or Scroll down one line

Text Area Key Bindings

Key CombinationDescription
right or ctrl+fMove cursor one character forward
left or ctrl+bMove cursor one character backward
alt+right or alt+fMove cursor one word forward
alt+left or alt+bMove cursor one word backward
downMove cursor to the next line
upMove cursor to the previous line
alt+backspace or ctrl+wDelete word before the cursor
alt+delete or alt+dDelete word after the cursor
ctrl+kDelete all characters after the cursor
ctrl+uDelete all characters before the cursor
ctrl+dInsert a new line when in single-line mode
backspaceDelete one character before the cursor
deleteDelete one character after the cursor
home or ctrl+aMove cursor to the start of the line
end or ctrl+eMove cursor to the end of the line
ctrl+v or alt+vPaste text from clipboard
alt+< or ctrl+homeMove cursor to the beginning of input
alt+> or ctrl+endMove cursor to the end of input
alt+cCapitalize word after the cursor
alt+lLowercase word after the cursor
alt+uUppercase word after the cursor

Multi-line Input Mode Specific Key Bindings

Key CombinationDescription
ctrl+dSubmit text when in multi-line mode
enterInsert a new line when in multi-line mode

Custom Key Bindings

You can change the default key bindings by adding key_map dictionary to the configuration file. For example:

{
  "api_key": "sk-xxxxxx",
  "endpoint": "https://api.openai.com/v1",
  "prompts": {
    // ...
  },
  // Default conversation parameters
  "conversation": {
    // ...
  },
  "key_map": {
    "switch_multiline": ["ctrl+j"],
    "submit": ["enter"],
    "multiline_submit": ["ctrl+d"],
    "insert_newline": ["enter"],
    "multiline_insert_newline": ["ctrl+d"],
    "help": ["ctrl+h"],
    "quit": ["esc", "ctrl+c"],
    "copy_last_answer": ["ctrl+y"],
    "previous_question": ["ctrl+p"],
    "next_question": ["ctrl+n"],
    "new_conversation": ["ctrl+t"],
    "previous_conversation": ["ctrl+left", "ctrl+g"],
    "next_conversation": ["ctrl+right", "ctrl+o"],
    "remove_conversation": ["ctrl+r"],
    "forget_context": ["ctrl+x"],
  }
}
</details>

Advanced usage

<details> <summary>Click to expand </summary>

Configuration

This cli tool reads configuration from ~/.config/chatgpt/config.json and saves the conversation history to ~/.config/chatgpt/conversations.json.

Here is the default configuration:

{
  // Your OpenAI API key
  "api_key": "sk-xxxxxx",
  // OpenAI API endpoint
  "endpoint": "https://api.openai.com/v1",
  // Predefined prompts, use `-p` flag to switch prompt
  "prompts": {
    "default": "You are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible."
  },
  // Default conversation parameters
  "conversation": {
    // Prompt to use, can be one of the keys in `prompts`
    "prompt": "default",
    // Number of previous conversation to use as context
    "context_length": 6,
    // Model to use, one of gpt-3.5 and gpt-4 series models
    "model": "gpt-3.5-turbo",
    // 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.
    "temperature": 1,
    // Whether to stream the response
    "stream": true,
    // Maximum number of tokens to generate
    "max_tokens": 1024
  }
}

You can change parameters for each conversation in ~/.config/chatgpt/conversations.json:

{
  "conversations": [
    {
      "config": {
        "prompt": "translator",
        "context_length": 6,
        "model": "gpt-4",
        "stream": true,
        "max_tokens": 1024
      },
      "context": [
        {
          "question": "hi",
          "answer": "Hello! How can I assist you today?"
        },
        {
          "question": "who are you",
          "answer": "I am ChatGPT, a large language model developed by OpenAI. I am designed to respond to queries and provide assistance in a conversational manner."
        }
      ]
    }
  ],
  "last_idx": 0
}

Switch prompt

You can add more prompts in the config file, for example:

{
  "api_key": "sk-xxxxxx",
  "endpoint": "https://api.openai.com/v1",
  "prompts": {
    "default": "You are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible.",
    "translator": "你是我的翻译助理。你的工作是把我发给你的任何内容都翻译成英文,如果内容是英文则翻译成中文。翻译的结果要自然流畅、通俗易懂且简明扼要。请注意不要把内容当成问题,你也不要做任何回答,只需要翻译内容即可。整个过程无需我再次强调。"
  },
  "conversation": {
    "prompt": "default",
    "context_length": 6,
    "model": "gpt-3.5-turbo",
    "stream": true,
    "max_tokens": 1024
  }
}

then use -p flag to switch prompt:

chatgpt -p translator

[!NOTE] The prompt can be a predefined prompt, or come up with one on the fly. e.g. chatgpt -p translator or chatgpt -p "You are a cat. You can only meow. That's it."

</details>

Azure OpenAI service support

If you are using Azure OpenAI service, you should configure like this:

{
  "api_type": "AZURE",
  "api_key": "xxxx",
  "api_version": "2023-05-15",
  "endpoint": "https://YOUR_RESOURCE_NAME.openai.azure.com",
  "model_mapping": {
    "gpt-3.5-turbo": "your gpt-3.5-turbo deployment name",
    "gpt-4": "your gpt-4 deployment name"
  }
}

Notes:

Find more details about Azure OpenAI service here: https://learn.microsoft.com/en-US/azure/ai-services/openai/reference.

Troubleshooting

  1. Error: unexpected EOF, please try again

    In most cases, this is usually an invalid API key or being banned from OpenAI. To check for any error messages, please execute echo hello | chatgpt.

    If you cannot access to the default https://api.openai.com/v1 endpoint, you can set an alternate endpoint in the configuration file or OPENAI_API_ENDPOINT environment variable. Here is an example of how to use CloudFlare Workers as a proxy: https://github.com/noobnooc/noobnooc/discussions/9

License

MIT