From 3fcd5a90b3f8f632f4e2e967e4f0effabaaf19b1 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Sun, 5 Apr 2026 11:33:49 -0500 Subject: [PATCH] decouple list_models from provider init switching providers in the UI left an invalid model in the config, then _init_provider would fail and list_models would return an empty list, making it impossible to select a valid model --- frigate/genai/llama_cpp.py | 9 +++++++-- frigate/genai/ollama.py | 16 +++++++++++++--- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/frigate/genai/llama_cpp.py b/frigate/genai/llama_cpp.py index 51e8d160d2..e5e9883b8f 100644 --- a/frigate/genai/llama_cpp.py +++ b/frigate/genai/llama_cpp.py @@ -238,10 +238,15 @@ class LlamaCppClient(GenAIClient): def list_models(self) -> list[str]: """Return available model IDs from the llama.cpp server.""" - if self.provider is None: + base_url = self.provider or ( + self.genai_config.base_url.rstrip("/") + if self.genai_config.base_url + else None + ) + if base_url is None: return [] try: - response = requests.get(f"{self.provider}/v1/models", timeout=10) + response = requests.get(f"{base_url}/v1/models", timeout=10) response.raise_for_status() models = [] for m in response.json().get("data", []): diff --git a/frigate/genai/ollama.py b/frigate/genai/ollama.py index 7315b6e39b..7524d54e38 100644 --- a/frigate/genai/ollama.py +++ b/frigate/genai/ollama.py @@ -134,10 +134,20 @@ class OllamaClient(GenAIClient): def list_models(self) -> list[str]: """Return available model names from the Ollama server.""" - if self.provider is None: - return [] + client = self.provider + if client is None: + # Provider init may have failed due to invalid model, but we can + # still list available models with a fresh client. + if not self.genai_config.base_url: + return [] + try: + client = ApiClient( + host=self.genai_config.base_url, timeout=self.timeout + ) + except Exception: + return [] try: - response = self.provider.list() + response = client.list() return sorted( m.get("name", m.get("model", "")) for m in response.get("models", []) )