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 <noreply@anthropic.com>
This commit is contained in:
Bryan Helmkamp 2026-02-23 14:05:16 -05:00
parent 366643d6ef
commit f4f58078de
6 changed files with 18 additions and 12 deletions

View file

@ -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

View file

@ -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(),
});

View file

@ -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(),
});

View file

@ -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)

View file

@ -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,

View file

@ -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]