Config fixes

This commit is contained in:
Nicolas Mowen 2025-08-08 13:26:19 -06:00
parent 4658d7ac2a
commit a998d75824
8 changed files with 69 additions and 75 deletions

View File

@ -1230,7 +1230,7 @@ def regenerate_description(
camera_config = request.app.frigate_config.cameras[event.camera] camera_config = request.app.frigate_config.cameras[event.camera]
if camera_config.genai.enabled or params.force: if camera_config.objects.genai.enabled or params.force:
request.app.event_metadata_updater.publish( request.app.event_metadata_updater.publish(
(event.id, params.source, params.force), (event.id, params.source, params.force),
EventMetadataTypeEnum.regenerate_description.value, EventMetadataTypeEnum.regenerate_description.value,

View File

@ -209,7 +209,7 @@ class Dispatcher:
].onvif.autotracking.enabled, ].onvif.autotracking.enabled,
"alerts": self.config.cameras[camera].review.alerts.enabled, "alerts": self.config.cameras[camera].review.alerts.enabled,
"detections": self.config.cameras[camera].review.detections.enabled, "detections": self.config.cameras[camera].review.detections.enabled,
"genai": self.config.cameras[camera].genai.enabled, "genai": self.config.cameras[camera].objects.genai.enabled,
} }
self.publish("camera_activity", json.dumps(camera_status)) self.publish("camera_activity", json.dumps(camera_status))

View File

@ -124,7 +124,7 @@ class MqttClient(Communicator):
) )
self.publish( self.publish(
f"{camera_name}/genai/state", f"{camera_name}/genai/state",
"ON" if camera.genai.enabled_in_config else "OFF", "ON" if camera.objects.genai.enabled_in_config else "OFF",
retain=True, retain=True,
) )

View File

@ -61,7 +61,7 @@ class GenAIObjectTriggerConfig(FrigateBaseModel):
class GenAIObjectConfig(FrigateBaseModel): class GenAIObjectConfig(FrigateBaseModel):
enabled: bool = Field(default=False, title="Enable GenAI for camera.") enabled: bool = Field(default=True, title="Enable GenAI for camera.")
use_snapshot: bool = Field( use_snapshot: bool = Field(
default=False, title="Use snapshots for generating descriptions." default=False, title="Use snapshots for generating descriptions."
) )

View File

@ -99,7 +99,7 @@ class CameraConfigUpdateSubscriber:
elif update_type == CameraConfigUpdateEnum.enabled: elif update_type == CameraConfigUpdateEnum.enabled:
config.enabled = updated_config config.enabled = updated_config
elif update_type == CameraConfigUpdateEnum.genai: elif update_type == CameraConfigUpdateEnum.genai:
config.genai = updated_config config.objects.genai = updated_config
elif update_type == CameraConfigUpdateEnum.motion: elif update_type == CameraConfigUpdateEnum.motion:
config.motion = updated_config config.motion = updated_config
elif update_type == CameraConfigUpdateEnum.notifications: elif update_type == CameraConfigUpdateEnum.notifications:

View File

@ -40,9 +40,9 @@ class GenAIClient:
event: Event, event: Event,
) -> Optional[str]: ) -> Optional[str]:
"""Generate a description for the frame.""" """Generate a description for the frame."""
prompt = camera_config.genai.object_prompts.get( prompt = camera_config.objects.genai.object_prompts.get(
event.label, event.label,
camera_config.genai.prompt, camera_config.objects.genai.prompt,
).format(**model_to_dict(event)) ).format(**model_to_dict(event))
logger.debug(f"Sending images to genai provider with prompt: {prompt}") logger.debug(f"Sending images to genai provider with prompt: {prompt}")
return self._send(prompt, thumbnails) return self._send(prompt, thumbnails)
@ -58,16 +58,10 @@ class GenAIClient:
def get_genai_client(config: FrigateConfig) -> Optional[GenAIClient]: def get_genai_client(config: FrigateConfig) -> Optional[GenAIClient]:
"""Get the GenAI client.""" """Get the GenAI client."""
genai_config = config.genai
genai_cameras = [
c for c in config.cameras.values() if c.enabled and c.genai.enabled
]
if genai_cameras or genai_config.enabled:
load_providers() load_providers()
provider = PROVIDERS.get(genai_config.provider) provider = PROVIDERS.get(config.genai.provider)
if provider: if provider:
return provider(genai_config) return provider(config.genai)
return None return None

View File

@ -936,14 +936,17 @@ function ObjectDetailsTab({
</div> </div>
</div> </div>
<div className="flex flex-col gap-1.5"> <div className="flex flex-col gap-1.5">
{config?.cameras[search.camera].genai.enabled && {config?.cameras[search.camera].objects.genai.enabled &&
!search.end_time && !search.end_time &&
(config.cameras[search.camera].genai.required_zones.length === 0 || (config.cameras[search.camera].objects.genai.required_zones.length ===
0 ||
search.zones.some((zone) => search.zones.some((zone) =>
config.cameras[search.camera].genai.required_zones.includes(zone), config.cameras[search.camera].objects.genai.required_zones.includes(
zone,
),
)) && )) &&
(config.cameras[search.camera].genai.objects.length === 0 || (config.cameras[search.camera].objects.genai.objects.length === 0 ||
config.cameras[search.camera].genai.objects.includes( config.cameras[search.camera].objects.genai.objects.includes(
search.label, search.label,
)) ? ( )) ? (
<> <>
@ -972,7 +975,8 @@ function ObjectDetailsTab({
)} )}
<div className="flex w-full flex-row justify-end gap-2"> <div className="flex w-full flex-row justify-end gap-2">
{config?.cameras[search.camera].genai.enabled && search.end_time && ( {config?.cameras[search.camera].objects.genai.enabled &&
search.end_time && (
<div className="flex items-start"> <div className="flex items-start">
<Button <Button
className="rounded-r-none border-r-0" className="rounded-r-none border-r-0"
@ -1011,8 +1015,9 @@ function ObjectDetailsTab({
)} )}
</div> </div>
)} )}
{((config?.cameras[search.camera].genai.enabled && search.end_time) || {((config?.cameras[search.camera].objects.genai.enabled &&
!config?.cameras[search.camera].genai.enabled) && ( search.end_time) ||
!config?.cameras[search.camera].objects.genai.enabled) && (
<Button <Button
variant="select" variant="select"
aria-label={t("button.save", { ns: "common" })} aria-label={t("button.save", { ns: "common" })}

View File

@ -94,13 +94,6 @@ export interface CameraConfig {
cmd: string; cmd: string;
roles: string[]; roles: string[];
}[]; }[];
genai: {
enabled: string;
prompt: string;
object_prompts: { [key: string]: string };
required_zones: string[];
objects: string[];
};
live: { live: {
height: number; height: number;
quality: number; quality: number;
@ -146,6 +139,13 @@ export interface CameraConfig {
}; };
mask: string; mask: string;
track: string[]; track: string[];
genai: {
enabled: string;
prompt: string;
object_prompts: { [key: string]: string };
required_zones: string[];
objects: string[];
};
}; };
onvif: { onvif: {
autotracking: { autotracking: {
@ -406,15 +406,10 @@ export interface FrigateConfig {
}; };
genai: { genai: {
enabled: boolean;
provider: string; provider: string;
base_url?: string; base_url?: string;
api_key?: string; api_key?: string;
model: string; model: string;
prompt: string;
object_prompts: { [key: string]: string };
required_zones: string[];
objects: string[];
}; };
go2rtc: { go2rtc: {