diff --git a/crates/cli/src/lib.rs b/crates/cli/src/lib.rs index a84498407..623ec3c71 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -505,6 +505,10 @@ enum ModelCommand { #[arg(long, value_enum)] provider: Option, }, + /// Set the default model (e.g. "pro", "flash", "deepseek-v4-pro"). + Set { + model: String, + }, } #[derive(Debug, Args)] @@ -754,7 +758,7 @@ fn run() -> Result<()> { Some(Commands::Auth(args)) => run_auth_command(&mut store, args.command), Some(Commands::McpServer) => run_mcp_server_command(&mut store), Some(Commands::Config(args)) => run_config_command(&mut store, args.command), - Some(Commands::Model(args)) => run_model_command(args.command, runtime_overrides.provider), + Some(Commands::Model(args)) => run_model_command(&mut store, args.command, runtime_overrides.provider), Some(Commands::Thread(args)) => run_thread_command(args.command), Some(Commands::Sandbox(args)) => run_sandbox_command(args.command), Some(Commands::AppServer(args)) => { @@ -1495,6 +1499,7 @@ fn model_command_provider_hint( } fn run_model_command( + store: &mut ConfigStore, command: ModelCommand, top_level_provider: Option, ) -> Result<()> { @@ -1519,6 +1524,21 @@ fn run_model_command( println!("used_fallback: {}", resolved.used_fallback); Ok(()) } + ModelCommand::Set { model } => { + let trimmed = model.trim(); + if trimmed.is_empty() { + bail!("Model name cannot be empty"); + } + let canonical = match trimmed.to_ascii_lowercase().as_str() { + "pro" | "deepseek-v4-pro" | "deepseek-v4pro" => "deepseek-v4-pro", + "flash" | "deepseek-v4-flash" | "deepseek-v4flash" => "deepseek-v4-flash", + _ => trimmed, + }; + store.config.default_text_model = Some(canonical.to_string()); + store.save()?; + println!("Default model set to '{canonical}'"); + Ok(()) + } } } diff --git a/crates/tui/src/config.rs b/crates/tui/src/config.rs index 179f8a8e1..ffdd8fe63 100644 --- a/crates/tui/src/config.rs +++ b/crates/tui/src/config.rs @@ -616,8 +616,8 @@ fn deepseek_alias_deprecation(model_lower: &str) -> Option Option<&'static str> { match model.trim().to_ascii_lowercase().as_str() { - "deepseek-v4pro" => Some("deepseek-v4-pro"), - "deepseek-v4flash" => Some("deepseek-v4-flash"), + "pro" | "deepseek-v4-pro" | "deepseek-v4pro" => Some("deepseek-v4-pro"), + "flash" | "deepseek-v4-flash" | "deepseek-v4flash" => Some("deepseek-v4-flash"), _ => None, } }