@@ -288,25 +288,40 @@ impl ChatArgs {
288288 } ;
289289
290290 // If modelId is specified, verify it exists before starting the chat
291- let model_id : Option < String > = if let Some ( requested_model_id ) = self . model {
292- let requested_model_id_lower = requested_model_id . to_lowercase ( ) ;
293- let ( models , _ ) = os . client . list_available_models ( ) . await ? ;
294- match models . iter ( ) . find ( |opt| opt . model_id == requested_model_id_lower ) {
295- Some ( opt ) => Some ( opt . model_id . clone ( ) ) ,
296- None => {
297- let available_names : Vec < String > = models
298- . iter ( )
299- . map ( |opt| get_display_name ( opt . model_id ( ) ) . to_string ( ) )
300- . collect ( ) ;
301- bail ! (
302- "Model '{}' does not exist. Available models: {}" ,
303- requested_model_id ,
304- available_names . join ( ", " )
305- ) ;
306- } ,
291+ // Otherwise, CLI will use a default model when starting chat
292+ let ( models , default_model_opt ) = os . client . list_available_models ( ) . await ? ;
293+ let model_id : Option < String > = if let Some ( requested ) = self . model . as_ref ( ) {
294+ let requested_lower = requested . to_lowercase ( ) ;
295+ if let Some ( m ) = models
296+ . iter ( )
297+ . find ( |m| m . model_id . eq_ignore_ascii_case ( & requested_lower ) )
298+ {
299+ Some ( m . model_id . clone ( ) )
300+ } else {
301+ let available = models
302+ . iter ( )
303+ . map ( |m| get_display_name ( m . model_id ( ) ) . to_string ( ) )
304+ . collect :: < Vec < _ > > ( )
305+ . join ( ", " ) ;
306+ bail ! ( "Model '{}' does not exist. Available models: {}" , requested , available ) ;
307307 }
308+ } else if let Some ( saved) = os
309+ . database
310+ . settings
311+ . get_string ( Setting :: ChatDefaultModel )
312+ . and_then ( |name| {
313+ models
314+ . iter ( )
315+ . find ( |m| get_display_name ( m. model_id ( ) ) == name)
316+ . map ( |m| m. model_id . clone ( ) )
317+ } )
318+ {
319+ Some ( saved)
320+ } else if let Some ( default_model) = default_model_opt {
321+ Some ( default_model. model_id ( ) . to_owned ( ) )
308322 } else {
309- None
323+ // should not use this fallback method when service return a required default model in response
324+ Some ( default_model_id ( os) . await )
310325 } ;
311326
312327 let ( prompt_request_sender, prompt_request_receiver) = std:: sync:: mpsc:: channel :: < Option < String > > ( ) ;
@@ -556,29 +571,6 @@ impl ChatSession {
556571 tool_config : HashMap < String , ToolSpec > ,
557572 interactive : bool ,
558573 ) -> Result < Self > {
559- let ( models, _default_model) = os. client . list_available_models ( ) . await ?;
560-
561- let valid_model_id = match model_id {
562- Some ( id) => id,
563- None => {
564- let from_settings = os
565- . database
566- . settings
567- . get_string ( Setting :: ChatDefaultModel )
568- . and_then ( |model_id| {
569- models
570- . iter ( )
571- . find ( |opt| get_display_name ( opt. model_id ( ) ) == model_id)
572- . map ( |opt| opt. model_id . to_owned ( ) )
573- } ) ;
574-
575- match from_settings {
576- Some ( id) => id,
577- None => default_model_id ( os) . await . to_owned ( ) ,
578- }
579- } ,
580- } ;
581-
582574 // Reload prior conversation
583575 let mut existing_conversation = false ;
584576 let previous_conversation = std:: env:: current_dir ( )
@@ -617,9 +609,7 @@ impl ChatSession {
617609 cs. enforce_tool_use_history_invariants ( ) ;
618610 cs
619611 } ,
620- false => {
621- ConversationState :: new ( conversation_id, agents, tool_config, tool_manager, Some ( valid_model_id) ) . await
622- } ,
612+ false => ConversationState :: new ( conversation_id, agents, tool_config, tool_manager, model_id) . await ,
623613 } ;
624614
625615 // Spawn a task for listening and broadcasting sigints.
0 commit comments