Skip to content
/ chatgpt Public

An elegant interactive CLI for ChatGPT

Notifications You must be signed in to change notification settings

j178/chatgpt

Repository files navigation

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

💬 Start in chat mode

chatgpt

💬 Start in chat mode with a provided prompt

chatgpt -p translator

💻 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

Click to expand

General Key Bindings

Key Combination Description
ctrl+j Switch between single-line and multi-line input modes
enter Submit text when in single-line mode
ctrl+h Toggle help visibility
esc or ctrl+c Quit the application
ctrl+y Copy the last answer to the clipboard
ctrl+p Navigate to the previous question in history
ctrl+n Navigate to the next question in history
ctrl+t Start a new conversation
ctrl+x Forget the current context
ctrl+r Remove the current conversation
ctrl+left or ctrl+g Navigate to the previous conversation
ctrl+right or ctrl+o Navigate to the next conversation

Viewport Key Bindings

Key Combination Description
pgdown or pgdn Scroll down one page
pgup Scroll up one page
up or Scroll up one line
down or Scroll down one line

Text Area Key Bindings

Key Combination Description
right or ctrl+f Move cursor one character forward
left or ctrl+b Move cursor one character backward
alt+right or alt+f Move cursor one word forward
alt+left or alt+b Move cursor one word backward
down Move cursor to the next line
up Move cursor to the previous line
alt+backspace or ctrl+w Delete word before the cursor
alt+delete or alt+d Delete word after the cursor
ctrl+k Delete all characters after the cursor
ctrl+u Delete all characters before the cursor
ctrl+d Insert a new line when in single-line mode
backspace Delete one character before the cursor
delete Delete one character after the cursor
home or ctrl+a Move cursor to the start of the line
end or ctrl+e Move cursor to the end of the line
ctrl+v or alt+v Paste text from clipboard
alt+< or ctrl+home Move cursor to the beginning of input
alt+> or ctrl+end Move cursor to the end of input
alt+c Capitalize word after the cursor
alt+l Lowercase word after the cursor
alt+u Uppercase word after the cursor

Multi-line Input Mode Specific Key Bindings

Key Combination Description
ctrl+d Submit text when in multi-line mode
enter Insert 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"],
  }
}

Advanced usage

Click to expand

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."

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:

  • api_type should be "AZURE" or "AZURE_AD".
  • api_version defaults to "2023-05-15" if not specified.
  • Configure model_mapping to map model names to your deployment names. The key must be a valid OpenAI model name. If not specified, the model name will be used as the deployment name with . or : removed (e.g. "gpt-3.5-turbo" -> "gpt-35-turbo").

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: noobnooc/noobnooc#9

License

MIT