From 5513199b72bd5850cf2a5bd2d0dc70675faa480e Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Fri, 3 Apr 2026 17:03:48 -0600 Subject: [PATCH] Mypy --- .../data_processing/post/object_descriptions.py | 7 ++++++- .../data_processing/post/review_descriptions.py | 14 ++++++++++++-- frigate/genai/gemini.py | 2 +- frigate/genai/manager.py | 5 ++++- frigate/genai/ollama.py | 2 ++ 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/frigate/data_processing/post/object_descriptions.py b/frigate/data_processing/post/object_descriptions.py index d4c25ac9c7..babdb72521 100644 --- a/frigate/data_processing/post/object_descriptions.py +++ b/frigate/data_processing/post/object_descriptions.py @@ -332,7 +332,12 @@ class ObjectDescriptionProcessor(PostProcessorApi): """Embed the description for an event.""" start = datetime.datetime.now().timestamp() camera_config = self.config.cameras[str(event.camera)] - description = self.genai_manager.description_client.generate_object_description( + client = self.genai_manager.description_client + + if client is None: + return + + description = client.generate_object_description( camera_config, thumbnails, event ) diff --git a/frigate/data_processing/post/review_descriptions.py b/frigate/data_processing/post/review_descriptions.py index 3354991e1f..4bb2deac2b 100644 --- a/frigate/data_processing/post/review_descriptions.py +++ b/frigate/data_processing/post/review_descriptions.py @@ -64,7 +64,12 @@ class ReviewDescriptionProcessor(PostProcessorApi): Estimates ~1 token per 1250 pixels. Targets 98% context utilization with safety margin. Capped at 20 frames. """ - context_size = self.genai_manager.description_client.get_context_size() + client = self.genai_manager.description_client + + if client is None: + return 3 + + context_size = client.get_context_size() camera_config = self.config.cameras[camera] detect_width = camera_config.detect.width @@ -320,7 +325,12 @@ class ReviewDescriptionProcessor(PostProcessorApi): os.path.join(CLIPS_DIR, "genai-requests", f"{start_ts}-{end_ts}") ).mkdir(parents=True, exist_ok=True) - return self.genai_manager.description_client.generate_review_summary( + client = self.genai_manager.description_client + + if client is None: + return None + + return client.generate_review_summary( start_ts, end_ts, events_with_context, diff --git a/frigate/genai/gemini.py b/frigate/genai/gemini.py index b0e8eeb301..cfa9cb8029 100644 --- a/frigate/genai/gemini.py +++ b/frigate/genai/gemini.py @@ -90,7 +90,7 @@ class GeminiClient(GenAIClient): def list_models(self) -> list[str]: """Return available model names from Gemini.""" try: - return sorted(m.name for m in self.provider.models.list()) + return sorted(m.name or "" for m in self.provider.models.list()) except Exception as e: logger.warning("Failed to list Gemini models: %s", e) return [] diff --git a/frigate/genai/manager.py b/frigate/genai/manager.py index 6390c839a4..94719f4291 100644 --- a/frigate/genai/manager.py +++ b/frigate/genai/manager.py @@ -70,12 +70,15 @@ class GenAIClientManager: if not genai_cfg: return None + if not genai_cfg.provider: + return None + provider_cls = PROVIDERS.get(genai_cfg.provider) if not provider_cls: return None try: - client = provider_cls(genai_cfg) + client: "GenAIClient" = provider_cls(genai_cfg) except Exception as e: logger.exception( "Failed to create GenAI client for provider %s: %s", diff --git a/frigate/genai/ollama.py b/frigate/genai/ollama.py index 7d171e8bef..7315b6e39b 100644 --- a/frigate/genai/ollama.py +++ b/frigate/genai/ollama.py @@ -134,6 +134,8 @@ class OllamaClient(GenAIClient): def list_models(self) -> list[str]: """Return available model names from the Ollama server.""" + if self.provider is None: + return [] try: response = self.provider.list() return sorted(