diff --git a/frigate/config/classification.py b/frigate/config/classification.py index fb8e3de29..7dba854ca 100644 --- a/frigate/config/classification.py +++ b/frigate/config/classification.py @@ -1,5 +1,5 @@ from enum import Enum -from typing import Dict, List, Optional +from typing import Dict, List, Optional, Union from pydantic import ConfigDict, Field @@ -128,9 +128,10 @@ class SemanticSearchConfig(FrigateBaseModel): reindex: Optional[bool] = Field( default=False, title="Reindex all tracked objects on startup." ) - model: Optional[SemanticSearchModelEnum] = Field( + model: Optional[Union[SemanticSearchModelEnum, str]] = Field( default=SemanticSearchModelEnum.jinav1, - title="The CLIP model to use for semantic search.", + title="The CLIP model or GenAI provider name for semantic search.", + description="Use 'jinav1', 'jinav2' for ONNX models, or a GenAI config key (e.g. 'default') when that provider has the embeddings role.", ) model_size: str = Field( default="small", title="The size of the embeddings model used." diff --git a/frigate/config/config.py b/frigate/config/config.py index e31e3d8c8..b741d6ae2 100644 --- a/frigate/config/config.py +++ b/frigate/config/config.py @@ -443,6 +443,22 @@ class FrigateConfig(FrigateBaseModel): ) role_to_name[role] = name + # validate semantic_search.model when it is a GenAI provider name + if self.semantic_search.enabled and isinstance( + self.semantic_search.model, str + ): + if self.semantic_search.model not in self.genai: + raise ValueError( + f"semantic_search.model '{self.semantic_search.model}' is not a " + "valid GenAI config key. Must match a key in genai config." + ) + genai_cfg = self.genai[self.semantic_search.model] + if GenAIRoleEnum.embeddings not in genai_cfg.roles: + raise ValueError( + f"GenAI provider '{self.semantic_search.model}' must have " + "'embeddings' in its roles for semantic search." + ) + # set default min_score for object attributes for attribute in self.model.all_attributes: if not self.objects.filters.get(attribute):