2024-06-21 23:30:19 +02:00
|
|
|
"""Generative AI module for Frigate."""
|
|
|
|
|
|
|
|
import importlib
|
|
|
|
import os
|
|
|
|
from typing import Optional
|
|
|
|
|
2024-10-14 14:23:10 +02:00
|
|
|
from playhouse.shortcuts import model_to_dict
|
|
|
|
|
2024-11-09 14:48:53 +01:00
|
|
|
from frigate.config import CameraConfig, FrigateConfig, GenAIConfig, GenAIProviderEnum
|
2024-10-12 14:19:24 +02:00
|
|
|
from frigate.models import Event
|
2024-06-21 23:30:19 +02:00
|
|
|
|
|
|
|
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(
|
2024-09-16 16:46:11 +02:00
|
|
|
self,
|
|
|
|
camera_config: CameraConfig,
|
|
|
|
thumbnails: list[bytes],
|
2024-10-12 14:19:24 +02:00
|
|
|
event: Event,
|
2024-06-21 23:30:19 +02:00
|
|
|
) -> Optional[str]:
|
|
|
|
"""Generate a description for the frame."""
|
2024-09-16 16:46:11 +02:00
|
|
|
prompt = camera_config.genai.object_prompts.get(
|
2024-10-14 14:23:10 +02:00
|
|
|
event.label,
|
|
|
|
camera_config.genai.prompt,
|
|
|
|
).format(**model_to_dict(event))
|
2024-06-21 23:30:19 +02:00
|
|
|
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
|
|
|
|
|
|
|
|
|
2024-11-09 14:48:53 +01:00
|
|
|
def get_genai_client(config: FrigateConfig) -> Optional[GenAIClient]:
|
2024-06-21 23:30:19 +02:00
|
|
|
"""Get the GenAI client."""
|
2024-11-09 14:48:53 +01:00
|
|
|
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)
|
|
|
|
|
2024-06-21 23:30:19 +02:00
|
|
|
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)
|