Select the first available model when none configured for Ollama (#13048)

Kyle Kelley created

Selects the first available model for Ollama if a model is not
configured.

Release Notes:

- N/A

Change summary

crates/assistant/src/completion_provider/ollama.rs | 24 ++++++++++++++-
1 file changed, 22 insertions(+), 2 deletions(-)

Detailed changes

crates/assistant/src/completion_provider/ollama.rs 🔗

@@ -40,7 +40,12 @@ impl OllamaCompletionProvider {
             let client = http_client.clone();
             let model = model.name.clone();
 
-            |_| async move { preload_model(client.as_ref(), &api_url, &model).await }
+            |_| async move {
+                if model.is_empty() {
+                    return Ok(());
+                }
+                preload_model(client.as_ref(), &api_url, &model).await
+            }
         })
         .detach_and_log_err(cx);
 
@@ -71,7 +76,12 @@ impl OllamaCompletionProvider {
         })
         .detach_and_log_err(cx);
 
-        self.model = model;
+        if model.name.is_empty() {
+            self.select_first_available_model()
+        } else {
+            self.model = model;
+        }
+
         self.api_url = api_url;
         self.low_speed_timeout = low_speed_timeout;
         self.settings_version = settings_version;
@@ -81,6 +91,12 @@ impl OllamaCompletionProvider {
         self.available_models.iter()
     }
 
+    pub fn select_first_available_model(&mut self) {
+        if let Some(model) = self.available_models.first() {
+            self.model = model.clone();
+        }
+    }
+
     pub fn settings_version(&self) -> usize {
         self.settings_version
     }
@@ -123,6 +139,10 @@ impl OllamaCompletionProvider {
             cx.update_global::<CompletionProvider, _>(|provider, _cx| {
                 if let CompletionProvider::Ollama(provider) = provider {
                     provider.available_models = models;
+
+                    if !provider.available_models.is_empty() && provider.model.name.is_empty() {
+                        provider.select_first_available_model()
+                    }
                 }
             })
         })