From ffa444399fc6699aaf7e0a19086411a7010d9392 Mon Sep 17 00:00:00 2001 From: sigoden Date: Mon, 6 Mar 2023 10:33:13 +0800 Subject: chore: release v0.4.0 --- Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 188 +++++++++++++++++++++++++++++++++++++++++++++------------- src/cli.rs | 2 +- src/config.rs | 2 +- 5 files changed, 150 insertions(+), 46 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a9a83af..977e882 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,7 +19,7 @@ dependencies = [ [[package]] name = "aichat" -version = "0.3.0" +version = "0.4.0" dependencies = [ "anyhow", "atty", diff --git a/Cargo.toml b/Cargo.toml index b6275de..638702b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aichat" -version = "0.3.0" +version = "0.4.0" edition = "2021" authors = ["sigoden "] description = "A powerful chatgpt cli." diff --git a/README.md b/README.md index b33ce1d..c5640b6 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,10 @@ [![CI](https://github.com/sigoden/aichat/actions/workflows/ci.yaml/badge.svg)](https://github.com/sigoden/aichat/actions/workflows/ci.yaml) [![Crates](https://img.shields.io/crates/v/aichat.svg)](https://crates.io/crates/aichat) -Chat with ChatGPT-3.5 in the terminal. +A powerful chatgpt cli. + +![demo](https://user-images.githubusercontent.com/4012553/223005945-3450cbde-b383-434b-9049-d61877f76a4f.gif) -![demo](https://user-images.githubusercontent.com/4012553/222935716-33dc37df-f58d-4a66-8917-f741fd69682d.gif) ## Install @@ -21,12 +22,14 @@ Download from [Github Releases](https://github.com/sigoden/aichat/releases), unz ## Features -- Compared to the browser, the terminal starts faster and needs less resources. -- Highlight chat message and stream. -- Define roles and let AI play them. -- Save chat messages. -- Support proxy. -- Written in rust, single executable file, cross-platform. +- [x] Powerful REPL +- [x] Predefine AI roles +- [x] Add GPT prompt +- [x] Markdown highlight +- [x] Stream output +- [x] Multiline input +- [x] Proxy support +- [x] Save chat messages ## Config @@ -43,83 +46,184 @@ On first launch, aichat will guide you through configuration. After setting, it will automatically create the configuration file. Of course, you can also manually set the configuration file. ```yaml -api_key: "" # Request via https://platform.openai.com/account/api-keys -temperature: 1.0 # optional, see https://platform.openai.com/docs/api-reference/chat/create#chat/create-temperature -save: true # optional, If set to true, aichat will save chat messages to message.md -no_highlight: false # optional, Whether to disable highlight -proxy: "socks5://127.0.0.1:1080" # optional, set proxy server. e.g. http://127.0.0.1:8080 or socks5://127.0.0.1:1080 +api_key: "" # Request via https://platform.openai.com/account/api-keys +temperature: 1.0 # optional, see https://platform.openai.com/docs/api-reference/chat/create#chat/create-temperature +save: true # optional, If set to true, aichat will save chat messages to message.md +highlight: true # optional, Set false to turn highlight +proxy: "socks5://127.0.0.1:1080" # optional, set proxy server. e.g. http://127.0.0.1:8080 or socks5://127.0.0.1:1080 ``` -Use `.info` command to view the configuration file path. +Use the `.info` command to get current configuration information. + ``` 〉.info -config file /home/alice/.config/aichat/config.yaml -roles file /home/alice/.config/aichat/roles.yaml -messages file /home/alice/.config/aichat/messages.md -current role -proxy -save messages true +config_file /home/alice/.config/aichat/config.yaml +roles_file /home/alice/.config/aichat/roles.yaml +messages_file /home/alice/.config/aichat/messages.md +role - +api_key sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +temperature - +save true highlight true +proxy - +dry_run false ``` ### Roles -We can let ChatGPT play a certain role through `prompt` to make it better generate what we want. See [awesome-chatgpt-prompts](https://github.com/f/awesome-chatgpt-prompts) for details. +We can let ChatGPT play a certain role through `prompt` to make it better generate what we want. + +We can predefine a batch of roles in `roles.yaml`. -We can predefine a batch of roles in `roles.yaml`. For example, we define a emoji translator as follows. +For example, we define a role. ```yaml -- name: emoji +- name: shell prompt: > - I want you to translate the sentences I wrote into emojis. I will write the sentence, and you will express it with emojis. - I just want you to express it with emojis. I don't want you to reply with anything but emoji. - When I need to tell you something in English, I will do it by wrapping it in curly brackets like {like this}. + I want you to act as a linux shell expert. + I want you to answer only with bash code. + Do not write explanations. ``` -Let ChatGPT answer questions in the role of a emoji translator +Let ChatGPT answer questions in the role of a linux shell expert. ``` -〉.role emoji +〉.role shell -〉I am very angry -πŸ˜ πŸ’’πŸ‘Ώ +〉resize app.png to 256x256 +convert app.png -resize 256x256 app.png + +〉 extract password protected app.zip to /tmp/app +unzip -P password app.zip -d /tmp/app ``` ## CLI ``` -Chat with OpenAI GPT-3.5 in the terminal. +A powerful chatgpt cli. Usage: aichat [OPTIONS] [TEXT]... Arguments: - [TEXT]... Input text, if no input text, enter interactive mode + [TEXT]... Input text Options: - -L, --list-roles List all roles - -r, --role Specify the role that the AI will play - -h, --help Print help - -V, --version Print version + -H, --no-highlight Turn off highlight + -L, --list-roles List all roles + -r, --role Select a role + -h, --help Print help + -V, --version Print version ``` -Interactive chat if no text input: +```sh +aichat calculate 25.6 + 32.5 +``` + +```sh +aichat -r bash flip the image horizontally +``` + +Enter Chat REPL if no text input. ``` $ aichat -Welcome to aichat x.x.x +Welcome to aichat 0.4.0 Type ".help" for more information. 〉 ``` -Imperative request data: +aichat can accept pipe. +```sh +# convert toml to json +cat Cargo.toml | aichat -H turn toml below to json +``` + +## Chat REPL + +aichat has a powerful Chat REPL. + +Tle Chat REPL supports: +- emacs keybinding +- command autocompletion +- history search +- fish-style history autosuggestion hints +- mulitline input +- undo support +- clipboard integration + +Chat REPL also provide many commands. + +``` +Welcome to aichat 0.4.0 +Type ".help" for more information. +〉.help +.info Print the information +.set Modify the configuration temporarily +.role Select a role +.clear role Clear the currently selected role +.prompt Add prompt, aka create a temporary role +.history Print the history +.clear history Clear the history +.clear screen Clear the screen +.multiline Enter multiline editor mode +.copy Copy last reply message +.help Print this help message +.exit Exit the REPL + +Press Ctrl+C to abort session, Ctrl+D to exit the REPL +``` + +- Modify the configuration temporarily + ``` -aichat --role emoji I am very angry +〉.set highlight false +〉.set save false +〉.set temperature 1.2 ``` -Accept pipe: +- Input multiline text + ``` -cat text | aichat +〉.multiline {convert json below to toml +::: { +::: "an": [ +::: "arbitrarily", +::: "nested" +::: ], +::: "data": "structure" +::: } +::: } ``` +- Use GPT Prompt + +When you set up a prompt, every message sent later will carry the prompt. + +``` +〉.prompt { +::: I want you to translate the sentences I wrote into emojis. +::: I will write the sentence, and you will express it with emojis. +::: I don't want you to reply with anything but emoji. +::: } +Done + +〉You are a genius +πŸ‘‰πŸ§ πŸ’‘πŸ‘¨β€πŸŽ“ + +〉I'm embarrassed +πŸ™ˆπŸ˜³ +``` + +`.prompt` actually creates a temporary role called `%TEMP%` internally, so you run `.clear role` to clear the prompt. + +When you are satisfied with the prompt, add it to `roles.yaml` for later use. + +- Copy last reply message + +The message may be highlighted, and when copied, you will find that they are different from the original Markdown text. + +At this point you need to use `.copy` to copy the original text to the clipboard. + + ## License Copyright (c) 2023 aichat-developers. diff --git a/src/cli.rs b/src/cli.rs index 8e50161..3d60c9c 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -12,7 +12,7 @@ pub struct Cli { /// Select a role #[clap(short, long)] pub role: Option, - /// Input text + /// Input text text: Vec, } diff --git a/src/config.rs b/src/config.rs index c3d338c..d841fba 100644 --- a/src/config.rs +++ b/src/config.rs @@ -267,7 +267,7 @@ impl Config { match key { "api_key" => { if unset { - return Ok("Not allowd".into()); + return Ok("Not allowed".into()); } else { self.api_key = value.to_string(); } -- cgit v1.2.3