From f4f58078ded72295c2bee20f8441c6c1357a6b5b Mon Sep 17 00:00:00 2001 From: Bryan Helmkamp Date: Mon, 23 Feb 2026 14:05:16 -0500 Subject: [PATCH] Update default Gemini model to gemini-3.1-pro-preview and print model name on startup Updates the default Gemini model from gemini-3-pro-preview to gemini-3.1-pro-preview across agent, attractor, and ullm CLIs. Adds "Using model:" output to stderr in both agent and ullm CLIs so users can see which model is being used. Co-Authored-By: Claude Opus 4.6 --- crates/agent/src/cli.rs | 12 ++++++++---- crates/attractor/src/cli/run.rs | 2 +- crates/attractor/src/cli/serve.rs | 2 +- crates/llm/src/bin/ullm.rs | 8 +++++--- crates/llm/src/catalog.json | 4 ++-- crates/llm/src/catalog.rs | 2 +- 6 files changed, 18 insertions(+), 12 deletions(-) diff --git a/crates/agent/src/cli.rs b/crates/agent/src/cli.rs index e053d0615..cf9010607 100644 --- a/crates/agent/src/cli.rs +++ b/crates/agent/src/cli.rs @@ -51,8 +51,8 @@ enum PermissionLevel { fn default_model(provider: &str) -> &'static str { match provider { - "openai" => "gpt-5.2", - "gemini" => "gemini-3-pro-preview", + "openai" => "gpt-5.2-codex", + "gemini" => "gemini-3.1-pro-preview", // anthropic and unknown providers _ => "claude-opus-4-6", } @@ -308,6 +308,10 @@ pub async fn run() -> anyhow::Result<()> { .model .as_deref() .unwrap_or_else(|| default_model(&cli.provider)); + eprintln!( + "{}Using model: {model}{}", + styles.dim, styles.reset, + ); let profile = build_profile(&cli.provider, model); // Build execution environment @@ -458,12 +462,12 @@ mod tests { #[test] fn default_model_openai() { - assert_eq!(default_model("openai"), "gpt-5.2"); + assert_eq!(default_model("openai"), "gpt-5.2-codex"); } #[test] fn default_model_gemini() { - assert_eq!(default_model("gemini"), "gemini-3-pro-preview"); + assert_eq!(default_model("gemini"), "gemini-3.1-pro-preview"); } // validate_api_key tests diff --git a/crates/attractor/src/cli/run.rs b/crates/attractor/src/cli/run.rs index ede22b010..87fde628c 100644 --- a/crates/attractor/src/cli/run.rs +++ b/crates/attractor/src/cli/run.rs @@ -119,7 +119,7 @@ pub async fn run_command(args: RunArgs, styles: &'static Styles) -> anyhow::Resu }) .unwrap_or_else(|| match provider.as_deref() { Some("openai") => "gpt-5.2".to_string(), - Some("gemini") => "gemini-3-pro-preview".to_string(), + Some("gemini") => "gemini-3.1-pro-preview".to_string(), _ => "claude-sonnet-4-5".to_string(), }); diff --git a/crates/attractor/src/cli/serve.rs b/crates/attractor/src/cli/serve.rs index 282d809b7..0adb509d9 100644 --- a/crates/attractor/src/cli/serve.rs +++ b/crates/attractor/src/cli/serve.rs @@ -43,7 +43,7 @@ pub async fn serve_command(args: ServeArgs, styles: &'static Styles) -> anyhow:: let provider = args.provider; let model = args.model.unwrap_or_else(|| match provider.as_deref() { Some("openai") => "gpt-5.2".to_string(), - Some("gemini") => "gemini-3-pro-preview".to_string(), + Some("gemini") => "gemini-3.1-pro-preview".to_string(), _ => "claude-sonnet-4-5".to_string(), }); diff --git a/crates/llm/src/bin/ullm.rs b/crates/llm/src/bin/ullm.rs index b3debcb1c..152d5a62a 100644 --- a/crates/llm/src/bin/ullm.rs +++ b/crates/llm/src/bin/ullm.rs @@ -180,6 +180,8 @@ async fn run_prompt(args: PromptArgs) -> Result<()> { let prompt_text = resolve_prompt(args.prompt, stdin_prompt)?; let (model_id, provider) = resolve_model(args.model); + eprintln!("Using model: {model_id}"); + let mut params = GenerateParams::new(&model_id).prompt(&prompt_text); if let Some(p) = provider { params = params.provider(&p); @@ -284,7 +286,7 @@ mod tests { .stdout(predicate::str::contains("claude-opus-4-6")) .stdout(predicate::str::contains("claude-sonnet-4-5")) .stdout(predicate::str::contains("gpt-5.2")) - .stdout(predicate::str::contains("gemini-3-pro-preview")) + .stdout(predicate::str::contains("gemini-3.1-pro-preview")) .stdout(predicate::str::contains("anthropic")) .stdout(predicate::str::contains("openai")) .stdout(predicate::str::contains("gemini")); @@ -303,7 +305,7 @@ mod tests { // Should NOT contain other providers assert .stdout(predicate::str::contains("gpt-5.2").not()) - .stdout(predicate::str::contains("gemini-3-pro-preview").not()); + .stdout(predicate::str::contains("gemini-3.1-pro-preview").not()); } // Step 3: models list --query does substring match on id/name/aliases @@ -344,7 +346,7 @@ mod tests { .success() .stdout(predicate::str::contains("claude-opus-4-6")) .stdout(predicate::str::contains("gpt-5.2")) - .stdout(predicate::str::contains("gemini-3-pro-preview")); + .stdout(predicate::str::contains("gemini-3.1-pro-preview")); } // Step 5: prompt requires prompt text (errors when no prompt and stdin is tty) diff --git a/crates/llm/src/catalog.json b/crates/llm/src/catalog.json index 381f4a820..a438a3605 100644 --- a/crates/llm/src/catalog.json +++ b/crates/llm/src/catalog.json @@ -65,9 +65,9 @@ "aliases": ["codex"] }, { - "id": "gemini-3-pro-preview", + "id": "gemini-3.1-pro-preview", "provider": "gemini", - "display_name": "Gemini 3 Pro (Preview)", + "display_name": "Gemini 3.1 Pro (Preview)", "context_window": 1048576, "max_output": 65536, "supports_tools": true, diff --git a/crates/llm/src/catalog.rs b/crates/llm/src/catalog.rs index 6be91d4c2..34d8316e6 100644 --- a/crates/llm/src/catalog.rs +++ b/crates/llm/src/catalog.rs @@ -103,7 +103,7 @@ mod tests { assert_eq!(model.id, "gpt-5.2"); let model = get_latest_model("gemini", None).unwrap(); - assert_eq!(model.id, "gemini-3-pro-preview"); + assert_eq!(model.id, "gemini-3.1-pro-preview"); } #[test]