1- use hashbrown:: HashMap ;
2-
31use anyhow:: Result ;
42
53use vtcode_core:: config:: constants:: ui;
@@ -10,7 +8,7 @@ use vtcode_core::ui::{InlineListItem, InlineListSearchConfig, InlineListSelectio
108use vtcode_core:: utils:: ansi:: { AnsiRenderer , MessageStyle } ;
119
1210use super :: dynamic_models:: DynamicModelRegistry ;
13- use super :: options:: { ModelOption , picker_provider_order} ;
11+ use super :: options:: { ModelOption , option_indexes_for_provider , picker_provider_order} ;
1412
1513mod prompts;
1614pub ( super ) use prompts:: {
@@ -236,20 +234,23 @@ pub(super) fn render_step_one_inline(
236234) -> Result < ( ) > {
237235 let mut items = Vec :: new ( ) ;
238236 for provider in picker_provider_order ( ) {
239- let provider_models: Vec < ( usize , & ModelOption ) > = options
240- . iter ( )
241- . enumerate ( )
242- . filter ( |( _, candidate) | candidate. provider == provider)
243- . collect ( ) ;
237+ let provider_model_indexes = option_indexes_for_provider ( provider) ;
244238 let dynamic_indexes = dynamic_models. indexes_for ( provider) ;
245239 let has_error = dynamic_models. error_for ( provider) . is_some ( ) ;
246240 let has_warning = dynamic_models. warning_for ( provider) . is_some ( ) ;
247241
248- if provider_models. is_empty ( ) && dynamic_indexes. is_empty ( ) && !has_error && !has_warning {
242+ if provider_model_indexes. is_empty ( )
243+ && dynamic_indexes. is_empty ( )
244+ && !has_error
245+ && !has_warning
246+ {
249247 continue ;
250248 }
251249
252- for ( idx, option) in & provider_models {
250+ for idx in provider_model_indexes {
251+ let Some ( option) = options. get ( * idx) else {
252+ continue ;
253+ } ;
253254 items. push ( InlineListItem {
254255 title : option. display . to_string ( ) ,
255256 subtitle : Some ( static_model_subtitle (
@@ -271,7 +272,7 @@ pub(super) fn render_step_one_inline(
271272 }
272273
273274 if provider. is_dynamic ( ) {
274- for entry_index in & dynamic_indexes {
275+ for entry_index in dynamic_indexes {
275276 if let Some ( detail) = dynamic_models. detail ( * entry_index) {
276277 let extra_terms = {
277278 let mut terms = Vec :: new ( ) ;
@@ -329,7 +330,7 @@ pub(super) fn render_step_one_inline(
329330 search_value : Some ( format ! ( "{} setup" , provider. label( ) . to_ascii_lowercase( ) ) ) ,
330331 } ) ;
331332 }
332- } else if provider == Provider :: HuggingFace && provider_models . is_empty ( ) {
333+ } else if provider == Provider :: HuggingFace && provider_model_indexes . is_empty ( ) {
333334 items. push ( InlineListItem {
334335 title : "Custom Hugging Face model" . to_string ( ) ,
335336 subtitle : Some (
@@ -399,28 +400,25 @@ pub(super) fn render_step_one_plain(
399400 "Type 'refresh' to re-query LM Studio and Ollama servers." ,
400401 ) ?;
401402
402- let mut grouped: HashMap < Provider , Vec < & ModelOption > > = HashMap :: new ( ) ;
403- for option in options {
404- grouped. entry ( option. provider ) . or_default ( ) . push ( option) ;
405- }
406-
407403 let mut first_section = true ;
408404 for provider in picker_provider_order ( ) {
405+ let provider_model_indexes = option_indexes_for_provider ( provider) ;
409406 if provider. is_local ( ) {
410407 if !first_section {
411408 renderer. line ( MessageStyle :: Info , & provider_group_divider_line ( ) ) ?;
412409 }
413410 first_section = false ;
414411 renderer. line ( MessageStyle :: Info , & format ! ( "[{}]" , provider. label( ) ) ) ?;
415- if let Some ( list) = grouped. get ( & provider) {
416- for option in list {
417- renderer. line ( MessageStyle :: Info , & format ! ( " {}" , option. display) ) ?;
418- renderer. line (
419- MessageStyle :: Info ,
420- & format ! ( " {}" , static_model_subtitle( option, "" , "" ) ) ,
421- ) ?;
422- renderer. line ( MessageStyle :: Info , & format ! ( " {}" , option. description) ) ?;
423- }
412+ for option_index in provider_model_indexes {
413+ let Some ( option) = options. get ( * option_index) else {
414+ continue ;
415+ } ;
416+ renderer. line ( MessageStyle :: Info , & format ! ( " {}" , option. display) ) ?;
417+ renderer. line (
418+ MessageStyle :: Info ,
419+ & format ! ( " {}" , static_model_subtitle( option, "" , "" ) ) ,
420+ ) ?;
421+ renderer. line ( MessageStyle :: Info , & format ! ( " {}" , option. description) ) ?;
424422 }
425423
426424 if let Some ( warning) = dynamic_models. warning_for ( provider) {
@@ -443,7 +441,7 @@ pub(super) fn render_step_one_plain(
443441 }
444442 } else {
445443 for entry_index in dynamic_indexes {
446- if let Some ( detail) = dynamic_models. detail ( entry_index) {
444+ if let Some ( detail) = dynamic_models. detail ( * entry_index) {
447445 renderer
448446 . line ( MessageStyle :: Info , & format ! ( " {}" , detail. model_display) ) ?;
449447 renderer. line (
@@ -476,26 +474,30 @@ pub(super) fn render_step_one_plain(
476474 MessageStyle :: Info ,
477475 " Docs: https://huggingface.co/docs/inference-providers" ,
478476 ) ?;
479- if let Some ( list) = grouped. get ( & provider) {
480- for option in list {
481- renderer. line ( MessageStyle :: Info , & format ! ( " {}" , option. display) ) ?;
482- renderer. line (
483- MessageStyle :: Info ,
484- & format ! ( " {}" , static_model_subtitle( option, "" , "" ) ) ,
485- ) ?;
486- renderer. line ( MessageStyle :: Info , & format ! ( " {}" , option. description) ) ?;
487- }
477+ for option_index in provider_model_indexes {
478+ let Some ( option) = options. get ( * option_index) else {
479+ continue ;
480+ } ;
481+ renderer. line ( MessageStyle :: Info , & format ! ( " {}" , option. display) ) ?;
482+ renderer. line (
483+ MessageStyle :: Info ,
484+ & format ! ( " {}" , static_model_subtitle( option, "" , "" ) ) ,
485+ ) ?;
486+ renderer. line ( MessageStyle :: Info , & format ! ( " {}" , option. description) ) ?;
488487 }
489488 } else {
490- let Some ( list ) = grouped . get ( & provider ) else {
489+ if provider_model_indexes . is_empty ( ) {
491490 continue ;
492- } ;
491+ }
493492 if !first_section {
494493 renderer. line ( MessageStyle :: Info , & provider_group_divider_line ( ) ) ?;
495494 }
496495 first_section = false ;
497496 renderer. line ( MessageStyle :: Info , & format ! ( "[{}]" , provider. label( ) ) ) ?;
498- for option in list {
497+ for option_index in provider_model_indexes {
498+ let Some ( option) = options. get ( * option_index) else {
499+ continue ;
500+ } ;
499501 renderer. line ( MessageStyle :: Info , & format ! ( " {}" , option. display) ) ?;
500502 renderer. line (
501503 MessageStyle :: Info ,
0 commit comments