mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-27 10:52:11 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			81 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""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)
 |