fuyufjh / heygpt

A simple command-line interface for ChatGPT API written in Rust ⚡️
MIT License
165 stars 10 forks source link

Default for `model` not applied to command line #16

Open MalteT opened 11 months ago

MalteT commented 11 months ago

When omitting --model from the command line (I have no config file), I get the following error:

error: the following required arguments were not provided:
  --model <MODEL>

Usage: heygpt --model <MODEL> --api-key <API_KEY> --api-base-url <API_BASE_URL> [PROMPT]...

For more information, try '--help'.

despite these https://github.com/fuyufjh/heygpt/blob/3be31cb78971380de02f8f370658be931f1c645c/src/main.rs#L33-L35

I've never worked with ClapSerde, and it looks like an issue on their part, but the following dublication fixes it for me.

diff --git a/src/main.rs b/src/main.rs
index 7263c4c..f0ba36d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -31,7 +31,7 @@ struct Options {

     /// The model to query (default: gpt-3.5-turbo)
     #[default(String::from("gpt-3.5-turbo"))]
-    #[arg(long)]
+    #[arg(long, default_value = "gpt-3.5-turbo")]
     pub model: String,

     /// OpenAI API key

Thanks for your work!

fuyufjh commented 8 months ago

Right. It's the problem of upstream ClapSerde. However, the changes proposed above may cause another problem - the value of "model" in config file (if exists) will always be overridden by "gpt-3.5-turbo".

To work around the problem, the only solution I can think of is to write lots of boilerplate code to manually parse arguments, such as

let opts_from_file = { ...read opts... }
...
clap::Arg::new("model")
    .long("model")
    .default_value(opts_from_file.model)

That means we can't use the macro to derive clap args anymore.

Even worse, we need to maintain 2 copies of arguments: one as the code above, and one as a struct for serde. It's a bit too heavy just for argument parsing...