mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-04-29 01:57:41 +03:00
Move genAI object to objects section
This commit is contained in:
parent
6d078e565a
commit
27372ffbcd
@ -1,12 +1,12 @@
|
|||||||
from enum import Enum
|
from enum import Enum
|
||||||
from typing import Optional, Union
|
from typing import Optional
|
||||||
|
|
||||||
from pydantic import BaseModel, Field, field_validator
|
from pydantic import Field
|
||||||
|
|
||||||
from ..base import FrigateBaseModel
|
from ..base import FrigateBaseModel
|
||||||
from ..env import EnvString
|
from ..env import EnvString
|
||||||
|
|
||||||
__all__ = ["GenAIConfig", "GenAICameraConfig", "GenAIProviderEnum"]
|
__all__ = ["GenAIConfig", "GenAIProviderEnum"]
|
||||||
|
|
||||||
|
|
||||||
class GenAIProviderEnum(str, Enum):
|
class GenAIProviderEnum(str, Enum):
|
||||||
@ -16,71 +16,10 @@ class GenAIProviderEnum(str, Enum):
|
|||||||
ollama = "ollama"
|
ollama = "ollama"
|
||||||
|
|
||||||
|
|
||||||
class GenAISendTriggersConfig(BaseModel):
|
|
||||||
tracked_object_end: bool = Field(
|
|
||||||
default=True, title="Send once the object is no longer tracked."
|
|
||||||
)
|
|
||||||
after_significant_updates: Optional[int] = Field(
|
|
||||||
default=None,
|
|
||||||
title="Send an early request to generative AI when X frames accumulated.",
|
|
||||||
ge=1,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# uses BaseModel because some global attributes are not available at the camera level
|
|
||||||
class GenAICameraConfig(BaseModel):
|
|
||||||
enabled: bool = Field(default=False, title="Enable GenAI for camera.")
|
|
||||||
use_snapshot: bool = Field(
|
|
||||||
default=False, title="Use snapshots for generating descriptions."
|
|
||||||
)
|
|
||||||
prompt: str = Field(
|
|
||||||
default="Analyze the sequence of images containing the {label}. Focus on the likely intent or behavior of the {label} based on its actions and movement, rather than describing its appearance or the surroundings. Consider what the {label} is doing, why, and what it might do next.",
|
|
||||||
title="Default caption prompt.",
|
|
||||||
)
|
|
||||||
object_prompts: dict[str, str] = Field(
|
|
||||||
default_factory=dict, title="Object specific prompts."
|
|
||||||
)
|
|
||||||
|
|
||||||
objects: Union[str, list[str]] = Field(
|
|
||||||
default_factory=list,
|
|
||||||
title="List of objects to run generative AI for.",
|
|
||||||
)
|
|
||||||
required_zones: Union[str, list[str]] = Field(
|
|
||||||
default_factory=list,
|
|
||||||
title="List of required zones to be entered in order to run generative AI.",
|
|
||||||
)
|
|
||||||
debug_save_thumbnails: bool = Field(
|
|
||||||
default=False,
|
|
||||||
title="Save thumbnails sent to generative AI for debugging purposes.",
|
|
||||||
)
|
|
||||||
send_triggers: GenAISendTriggersConfig = Field(
|
|
||||||
default_factory=GenAISendTriggersConfig,
|
|
||||||
title="What triggers to use to send frames to generative AI for a tracked object.",
|
|
||||||
)
|
|
||||||
|
|
||||||
enabled_in_config: Optional[bool] = Field(
|
|
||||||
default=None, title="Keep track of original state of generative AI."
|
|
||||||
)
|
|
||||||
|
|
||||||
@field_validator("required_zones", mode="before")
|
|
||||||
@classmethod
|
|
||||||
def validate_required_zones(cls, v):
|
|
||||||
if isinstance(v, str) and "," not in v:
|
|
||||||
return [v]
|
|
||||||
|
|
||||||
return v
|
|
||||||
|
|
||||||
|
|
||||||
class GenAIConfig(FrigateBaseModel):
|
class GenAIConfig(FrigateBaseModel):
|
||||||
enabled: bool = Field(default=False, title="Enable GenAI.")
|
"""Primary GenAI Config to define GenAI Provider."""
|
||||||
prompt: str = Field(
|
|
||||||
default="Analyze the sequence of images containing the {label}. Focus on the likely intent or behavior of the {label} based on its actions and movement, rather than describing its appearance or the surroundings. Consider what the {label} is doing, why, and what it might do next.",
|
|
||||||
title="Default caption prompt.",
|
|
||||||
)
|
|
||||||
object_prompts: dict[str, str] = Field(
|
|
||||||
default_factory=dict, title="Object specific prompts."
|
|
||||||
)
|
|
||||||
|
|
||||||
|
enabled: bool = Field(default=False, title="Enable GenAI.")
|
||||||
api_key: Optional[EnvString] = Field(default=None, title="Provider API key.")
|
api_key: Optional[EnvString] = Field(default=None, title="Provider API key.")
|
||||||
base_url: Optional[str] = Field(default=None, title="Provider base url.")
|
base_url: Optional[str] = Field(default=None, title="Provider base url.")
|
||||||
model: str = Field(default="gpt-4o", title="GenAI model.")
|
model: str = Field(default="gpt-4o", title="GenAI model.")
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
from typing import Any, Optional, Union
|
from typing import Any, Optional, Union
|
||||||
|
|
||||||
from pydantic import Field, PrivateAttr, field_serializer
|
from pydantic import Field, PrivateAttr, field_serializer, field_validator
|
||||||
|
|
||||||
from ..base import FrigateBaseModel
|
from ..base import FrigateBaseModel
|
||||||
|
|
||||||
@ -49,6 +49,59 @@ class FilterConfig(FrigateBaseModel):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
class GenAIObjectTriggerConfig(FrigateBaseModel):
|
||||||
|
tracked_object_end: bool = Field(
|
||||||
|
default=True, title="Send once the object is no longer tracked."
|
||||||
|
)
|
||||||
|
after_significant_updates: Optional[int] = Field(
|
||||||
|
default=None,
|
||||||
|
title="Send an early request to generative AI when X frames accumulated.",
|
||||||
|
ge=1,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class GenAIObjectConfig(FrigateBaseModel):
|
||||||
|
enabled: bool = Field(default=False, title="Enable GenAI for camera.")
|
||||||
|
use_snapshot: bool = Field(
|
||||||
|
default=False, title="Use snapshots for generating descriptions."
|
||||||
|
)
|
||||||
|
prompt: str = Field(
|
||||||
|
default="Analyze the sequence of images containing the {label}. Focus on the likely intent or behavior of the {label} based on its actions and movement, rather than describing its appearance or the surroundings. Consider what the {label} is doing, why, and what it might do next.",
|
||||||
|
title="Default caption prompt.",
|
||||||
|
)
|
||||||
|
object_prompts: dict[str, str] = Field(
|
||||||
|
default_factory=dict, title="Object specific prompts."
|
||||||
|
)
|
||||||
|
|
||||||
|
objects: Union[str, list[str]] = Field(
|
||||||
|
default_factory=list,
|
||||||
|
title="List of objects to run generative AI for.",
|
||||||
|
)
|
||||||
|
required_zones: Union[str, list[str]] = Field(
|
||||||
|
default_factory=list,
|
||||||
|
title="List of required zones to be entered in order to run generative AI.",
|
||||||
|
)
|
||||||
|
debug_save_thumbnails: bool = Field(
|
||||||
|
default=False,
|
||||||
|
title="Save thumbnails sent to generative AI for debugging purposes.",
|
||||||
|
)
|
||||||
|
send_triggers: GenAIObjectTriggerConfig = Field(
|
||||||
|
default_factory=GenAIObjectTriggerConfig,
|
||||||
|
title="What triggers to use to send frames to generative AI for a tracked object.",
|
||||||
|
)
|
||||||
|
enabled_in_config: Optional[bool] = Field(
|
||||||
|
default=None, title="Keep track of original state of generative AI."
|
||||||
|
)
|
||||||
|
|
||||||
|
@field_validator("required_zones", mode="before")
|
||||||
|
@classmethod
|
||||||
|
def validate_required_zones(cls, v):
|
||||||
|
if isinstance(v, str) and "," not in v:
|
||||||
|
return [v]
|
||||||
|
|
||||||
|
return v
|
||||||
|
|
||||||
|
|
||||||
class ObjectConfig(FrigateBaseModel):
|
class ObjectConfig(FrigateBaseModel):
|
||||||
track: list[str] = Field(default=DEFAULT_TRACKED_OBJECTS, title="Objects to track.")
|
track: list[str] = Field(default=DEFAULT_TRACKED_OBJECTS, title="Objects to track.")
|
||||||
filters: dict[str, FilterConfig] = Field(
|
filters: dict[str, FilterConfig] = Field(
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user