diff --git a/frigate/config/config.py b/frigate/config/config.py index 34a233c6c..36e319410 100644 --- a/frigate/config/config.py +++ b/frigate/config/config.py @@ -610,6 +610,10 @@ class FrigateConfig(FrigateBaseModel): camera_config.objects.genai.enabled_in_config = ( camera_config.objects.genai.enabled ) + camera_config.review.genai.enabled_in_config = ( + camera_config.review.genai.alerts + or camera_config.review.genai.detections + ) # Add default filters object_keys = camera_config.objects.track diff --git a/frigate/data_processing/post/review_descriptions.py b/frigate/data_processing/post/review_descriptions.py index 30194729d..5de09a4af 100644 --- a/frigate/data_processing/post/review_descriptions.py +++ b/frigate/data_processing/post/review_descriptions.py @@ -7,8 +7,7 @@ import cv2 from frigate.config import FrigateConfig from frigate.data_processing.types import PostProcessDataEnum -from frigate.genai import GenAIConfig -from frigate.genai.ollama import OllamaClient +from frigate.genai import GenAIClient from ..post.api import PostProcessorApi @@ -16,14 +15,10 @@ logger = logging.getLogger(__name__) class ReviewDescriptionProcessor(PostProcessorApi): - def __init__(self, config: FrigateConfig, metrics): + def __init__(self, config: FrigateConfig, metrics, client: GenAIClient): super().__init__(config, metrics, None) self.tracked_review_items: dict[str, list[tuple[int, bytes]]] = {} - self.genai_client = OllamaClient( - GenAIConfig( - enabled=True, model="qwen2.5vl:3b", base_url="http://192.168.50.107:11434" - ) - ) + self.genai_client = client def process_data(self, data, data_type): if data_type != PostProcessDataEnum.review: @@ -63,10 +58,16 @@ class ReviewDescriptionProcessor(PostProcessorApi): final_data = data["after"] camera = final_data["camera"] - if data["type"] == "alert" and not self.config.cameras[camera].review.genai.alerts: + if ( + data["type"] == "alert" + and not self.config.cameras[camera].review.genai.alerts + ): self.tracked_review_items.pop(id) return - elif data["type"] == "detection" and not self.config.cameras[camera].review.detections: + elif ( + data["type"] == "detection" + and not self.config.cameras[camera].review.detections + ): self.tracked_review_items.pop(id) return diff --git a/frigate/embeddings/maintainer.py b/frigate/embeddings/maintainer.py index da31dbd5f..39d2e9466 100644 --- a/frigate/embeddings/maintainer.py +++ b/frigate/embeddings/maintainer.py @@ -151,6 +151,7 @@ class EmbeddingMaintainer(threading.Thread): self.frame_manager = SharedMemoryFrameManager() self.detected_license_plates: dict[str, dict[str, Any]] = {} + self.genai_client = get_genai_client(config) # model runners to share between realtime and post processors if self.config.lpr.enabled: @@ -206,9 +207,10 @@ class EmbeddingMaintainer(threading.Thread): # post processors self.post_processors: list[PostProcessorApi] = [] - self.post_processors.append( - ReviewDescriptionProcessor(self.config, self.metrics) - ) + if any(c.review.genai.enabled_in_config for c in self.config.cameras.values()): + self.post_processors.append( + ReviewDescriptionProcessor(self.config, self.metrics, self.genai_client) + ) if self.config.lpr.enabled: self.post_processors.append( @@ -244,7 +246,6 @@ class EmbeddingMaintainer(threading.Thread): self.stop_event = stop_event self.tracked_events: dict[str, list[Any]] = {} self.early_request_sent: dict[str, bool] = {} - self.genai_client = get_genai_client(config) # recordings data self.recordings_available_through: dict[str, float] = {} diff --git a/frigate/genai/__init__.py b/frigate/genai/__init__.py index 45e8776e2..13f8cfb3f 100644 --- a/frigate/genai/__init__.py +++ b/frigate/genai/__init__.py @@ -1,7 +1,6 @@ """Generative AI module for Frigate.""" import importlib -import json import logging import os from typing import Any, Optional