diff --git a/frigate/config/camera/detect.py b/frigate/config/camera/detect.py index 35c337bc8..71dbc3292 100644 --- a/frigate/config/camera/detect.py +++ b/frigate/config/camera/detect.py @@ -1,6 +1,6 @@ from typing import Optional -from pydantic import Field +from pydantic import Field, model_validator from ..base import FrigateBaseModel @@ -88,3 +88,11 @@ class DetectConfig(FrigateBaseModel): title="Annotation offset", description="Milliseconds to shift detect annotations to better align timeline bounding boxes with recordings; can be positive or negative.", ) + + @model_validator(mode="after") + def validate_dimensions(self) -> "DetectConfig": + if (self.width is None) != (self.height is None): + raise ValueError( + "detect -> both width and height must be specified together, or both omitted" + ) + return self diff --git a/frigate/config/classification.py b/frigate/config/classification.py index e507a7817..05d6edc76 100644 --- a/frigate/config/classification.py +++ b/frigate/config/classification.py @@ -1,7 +1,7 @@ from enum import Enum from typing import Dict, List, Optional, Union -from pydantic import ConfigDict, Field +from pydantic import ConfigDict, Field, field_validator from .base import FrigateBaseModel @@ -178,6 +178,17 @@ class SemanticSearchConfig(FrigateBaseModel): title="Semantic search model or GenAI provider name", description="The embeddings model to use for semantic search (for example 'jinav1'), or the name of a GenAI provider with the embeddings role.", ) + + @field_validator("model", mode="before") + @classmethod + def coerce_model_enum(cls, v): + if isinstance(v, str): + try: + return SemanticSearchModelEnum(v) + except ValueError: + return v + return v + model_size: str = Field( default="small", title="Model size", diff --git a/frigate/test/test_config.py b/frigate/test/test_config.py index 132be131f..e82b688c6 100644 --- a/frigate/test/test_config.py +++ b/frigate/test/test_config.py @@ -1188,7 +1188,7 @@ class TestConfig(unittest.TestCase): def test_global_detect_merge(self): config = { "mqtt": {"host": "mqtt"}, - "detect": {"max_disappeared": 1, "height": 720}, + "detect": {"max_disappeared": 1, "height": 720, "width": 1280}, "cameras": { "back": { "ffmpeg": {