"""Generative AI module for Frigate.""" import importlib import logging import os from typing import Optional from playhouse.shortcuts import model_to_dict from frigate.config import CameraConfig, FrigateConfig, GenAIConfig, GenAIProviderEnum from frigate.models import Event logger = logging.getLogger(__name__) PROVIDERS = {} def register_genai_provider(key: GenAIProviderEnum): """Register a GenAI provider.""" def decorator(cls): PROVIDERS[key] = cls return cls return decorator class GenAIClient: """Generative AI client for Frigate.""" def __init__(self, genai_config: GenAIConfig, timeout: int = 60) -> None: self.genai_config: GenAIConfig = genai_config self.timeout = timeout self.provider = self._init_provider() def generate_description( self, camera_config: CameraConfig, thumbnails: list[bytes], event: Event, ) -> Optional[str]: """Generate a description for the frame.""" prompt = camera_config.genai.object_prompts.get( event.label, camera_config.genai.prompt, ).format(**model_to_dict(event)) logger.debug(f"Sending images to genai provider with prompt: {prompt}") return self._send(prompt, thumbnails) def _init_provider(self): """Initialize the client.""" return None def _send(self, prompt: str, images: list[bytes]) -> Optional[str]: """Submit a request to the provider.""" return None def get_genai_client(config: FrigateConfig) -> Optional[GenAIClient]: """Get the GenAI client.""" genai_config = config.genai genai_cameras = [ c for c in config.cameras.values() if c.enabled and c.genai.enabled ] if genai_cameras: load_providers() provider = PROVIDERS.get(genai_config.provider) if provider: return provider(genai_config) return None def load_providers(): package_dir = os.path.dirname(__file__) for filename in os.listdir(package_dir): if filename.endswith(".py") and filename != "__init__.py": module_name = f"frigate.genai.{filename[:-3]}" importlib.import_module(module_name)