Skip to main content

codetether_agent/tui/app/state/
model_picker.rs

1//! Async model list refresh from the provider registry.
2
3use std::sync::Arc;
4
5use crate::provider::ProviderRegistry;
6
7impl super::AppState {
8    /// Refresh the available models list from the provider registry.
9    ///
10    /// # Errors
11    ///
12    /// Returns an error if any provider call fails critically.
13    pub async fn refresh_available_models(
14        &mut self,
15        registry: Option<&Arc<ProviderRegistry>>,
16    ) -> anyhow::Result<()> {
17        let mut models = Vec::new();
18        let Some(registry) = registry else {
19            self.available_models.clear();
20            return Ok(());
21        };
22
23        for provider_name in registry.list() {
24            if let Some(provider) = registry.get(provider_name)
25                && let Ok(provider_models) = provider.list_models().await
26            {
27                models.extend(provider_models.into_iter().map(|model| {
28                    if model.id.contains('/') {
29                        model.id
30                    } else {
31                        format!("{provider_name}/{}", model.id)
32                    }
33                }));
34            }
35        }
36
37        models.sort();
38        models.dedup();
39        self.set_available_models(models);
40        Ok(())
41    }
42}