mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-03-26 10:08:22 +03:00
47 lines
1.9 KiB
Python
47 lines
1.9 KiB
Python
|
|
"""JSON schema utilities for Frigate."""
|
||
|
|
|
||
|
|
from typing import Any, Dict, Type
|
||
|
|
|
||
|
|
from pydantic import BaseModel, TypeAdapter
|
||
|
|
|
||
|
|
|
||
|
|
def get_config_schema(config_class: Type[BaseModel]) -> Dict[str, Any]:
|
||
|
|
"""
|
||
|
|
Returns the JSON schema for FrigateConfig with polymorphic detectors.
|
||
|
|
|
||
|
|
This utility patches the FrigateConfig schema to include the full polymorphic
|
||
|
|
definitions for detectors. By default, Pydantic's schema for Dict[str, BaseDetectorConfig]
|
||
|
|
only includes the base class fields. This function replaces it with a reference
|
||
|
|
to the DetectorConfig union, which includes all available detector subclasses.
|
||
|
|
"""
|
||
|
|
# Import here to ensure all detector plugins are loaded through the detectors module
|
||
|
|
from frigate.detectors import DetectorConfig
|
||
|
|
|
||
|
|
# Get the base schema for FrigateConfig
|
||
|
|
schema = config_class.model_json_schema()
|
||
|
|
|
||
|
|
# Get the schema for the polymorphic DetectorConfig union
|
||
|
|
detector_adapter: TypeAdapter = TypeAdapter(DetectorConfig)
|
||
|
|
detector_schema = detector_adapter.json_schema()
|
||
|
|
|
||
|
|
# Ensure $defs exists in FrigateConfig schema
|
||
|
|
if "$defs" not in schema:
|
||
|
|
schema["$defs"] = {}
|
||
|
|
|
||
|
|
# Merge $defs from DetectorConfig into FrigateConfig schema
|
||
|
|
# This includes the specific schemas for each detector plugin (OvDetectorConfig, etc.)
|
||
|
|
if "$defs" in detector_schema:
|
||
|
|
schema["$defs"].update(detector_schema["$defs"])
|
||
|
|
|
||
|
|
# Extract the union schema (oneOf/discriminator) and add it as a definition
|
||
|
|
detector_union_schema = {k: v for k, v in detector_schema.items() if k != "$defs"}
|
||
|
|
schema["$defs"]["DetectorConfig"] = detector_union_schema
|
||
|
|
|
||
|
|
# Update the 'detectors' property to use the polymorphic DetectorConfig definition
|
||
|
|
if "detectors" in schema.get("properties", {}):
|
||
|
|
schema["properties"]["detectors"]["additionalProperties"] = {
|
||
|
|
"$ref": "#/$defs/DetectorConfig"
|
||
|
|
}
|
||
|
|
|
||
|
|
return schema
|