@@ -400,7 +400,7 @@ pub fn resolve_ai_availability(config: &AiConfig, env: &AiEnvironment) -> AiAvai
400400 . copied ( )
401401 . map ( |provider| AiAvailability :: Ready {
402402 provider,
403- model : config. model . clone ( ) ,
403+ model : effective_model_for_provider ( provider , & config. model ) ,
404404 } )
405405 . unwrap_or_else ( || AiAvailability :: Unavailable {
406406 reason : format ! (
@@ -413,28 +413,31 @@ pub fn resolve_ai_availability(config: &AiConfig, env: &AiEnvironment) -> AiAvai
413413 detected,
414414 } ,
415415 AiProviderConfig :: Anthropic => {
416- resolve_explicit_provider ( AiProvider :: Anthropic , config. model . clone ( ) , env, detected)
416+ resolve_explicit_provider ( AiProvider :: Anthropic , & config. model , env, detected)
417417 }
418418 AiProviderConfig :: OpenAi => {
419- resolve_explicit_provider ( AiProvider :: OpenAi , config. model . clone ( ) , env, detected)
419+ resolve_explicit_provider ( AiProvider :: OpenAi , & config. model , env, detected)
420420 }
421421 AiProviderConfig :: ClaudeCli => {
422- resolve_explicit_provider ( AiProvider :: ClaudeCli , config. model . clone ( ) , env, detected)
422+ resolve_explicit_provider ( AiProvider :: ClaudeCli , & config. model , env, detected)
423423 }
424424 AiProviderConfig :: CodexCli => {
425- resolve_explicit_provider ( AiProvider :: CodexCli , config. model . clone ( ) , env, detected)
425+ resolve_explicit_provider ( AiProvider :: CodexCli , & config. model , env, detected)
426426 }
427427 }
428428}
429429
430430fn resolve_explicit_provider (
431431 provider : AiProvider ,
432- model : String ,
432+ configured_model : & str ,
433433 env : & AiEnvironment ,
434434 detected : Vec < AiProvider > ,
435435) -> AiAvailability {
436436 if env. has_provider ( provider) {
437- AiAvailability :: Ready { provider, model }
437+ AiAvailability :: Ready {
438+ provider,
439+ model : effective_model_for_provider ( provider, configured_model) ,
440+ }
438441 } else {
439442 AiAvailability :: Unavailable {
440443 reason : format ! ( "{} credentials or executable not found" , provider. label( ) ) ,
@@ -443,6 +446,20 @@ fn resolve_explicit_provider(
443446 }
444447}
445448
449+ pub fn effective_model_for_provider ( provider : AiProvider , configured_model : & str ) -> String {
450+ if configured_model != "auto" {
451+ return configured_model. to_string ( ) ;
452+ }
453+ fast_default_model_for_provider ( provider) . to_string ( )
454+ }
455+
456+ pub fn fast_default_model_for_provider ( provider : AiProvider ) -> & ' static str {
457+ match provider {
458+ AiProvider :: Anthropic | AiProvider :: ClaudeCli => "claude-3-5-haiku-latest" ,
459+ AiProvider :: OpenAi | AiProvider :: CodexCli => "gpt-5-mini" ,
460+ }
461+ }
462+
446463fn provider_list ( providers : & [ AiProvider ] ) -> String {
447464 providers
448465 . iter ( )
@@ -642,6 +659,22 @@ mod tests {
642659 ) ;
643660 }
644661
662+ #[ test]
663+ fn effective_model_uses_fast_provider_default_for_auto_model ( ) {
664+ assert_eq ! (
665+ effective_model_for_provider( AiProvider :: CodexCli , "auto" ) ,
666+ "gpt-5-mini"
667+ ) ;
668+ assert_eq ! (
669+ effective_model_for_provider( AiProvider :: ClaudeCli , "auto" ) ,
670+ "claude-3-5-haiku-latest"
671+ ) ;
672+ assert_eq ! (
673+ effective_model_for_provider( AiProvider :: CodexCli , "gpt-4.1-mini" ) ,
674+ "gpt-4.1-mini"
675+ ) ;
676+ }
677+
645678 #[ test]
646679 fn detection_prefers_api_keys_before_cli_tools ( ) {
647680 let env = AiEnvironment :: for_tests ( true , true , [ "claude" , "codex" ] ) ;
@@ -677,10 +710,13 @@ mod tests {
677710 availability,
678711 AiAvailability :: Ready {
679712 provider: AiProvider :: OpenAi ,
680- model: "auto " . to_string( ) ,
713+ model: "gpt-5-mini " . to_string( ) ,
681714 }
682715 ) ;
683- assert_eq ! ( availability. modeline_text( ) , "AI: ready (OpenAI)" ) ;
716+ assert_eq ! (
717+ availability. modeline_text( ) ,
718+ "AI: ready (OpenAI / gpt-5-mini)"
719+ ) ;
684720 }
685721
686722 #[ test]
0 commit comments