diff --git a/frigate/api/event.py b/frigate/api/event.py index b8f0b7a2c..c287cbcc0 100644 --- a/frigate/api/event.py +++ b/frigate/api/event.py @@ -1230,7 +1230,7 @@ def regenerate_description( 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( (event.id, params.source, params.force), EventMetadataTypeEnum.regenerate_description.value, diff --git a/frigate/comms/dispatcher.py b/frigate/comms/dispatcher.py index 3706b6211..dfd85301a 100644 --- a/frigate/comms/dispatcher.py +++ b/frigate/comms/dispatcher.py @@ -209,7 +209,7 @@ class Dispatcher: ].onvif.autotracking.enabled, "alerts": self.config.cameras[camera].review.alerts.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)) diff --git a/frigate/comms/mqtt.py b/frigate/comms/mqtt.py index 6be475d15..6e8c79486 100644 --- a/frigate/comms/mqtt.py +++ b/frigate/comms/mqtt.py @@ -124,7 +124,7 @@ class MqttClient(Communicator): ) self.publish( 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, ) diff --git a/frigate/config/camera/objects.py b/frigate/config/camera/objects.py index 7b6317dd0..d66d910ec 100644 --- a/frigate/config/camera/objects.py +++ b/frigate/config/camera/objects.py @@ -61,7 +61,7 @@ class GenAIObjectTriggerConfig(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( default=False, title="Use snapshots for generating descriptions." ) diff --git a/frigate/config/camera/updater.py b/frigate/config/camera/updater.py index 3e8b7acb3..c2439040c 100644 --- a/frigate/config/camera/updater.py +++ b/frigate/config/camera/updater.py @@ -99,7 +99,7 @@ class CameraConfigUpdateSubscriber: elif update_type == CameraConfigUpdateEnum.enabled: config.enabled = updated_config elif update_type == CameraConfigUpdateEnum.genai: - config.genai = updated_config + config.objects.genai = updated_config elif update_type == CameraConfigUpdateEnum.motion: config.motion = updated_config elif update_type == CameraConfigUpdateEnum.notifications: diff --git a/frigate/genai/__init__.py b/frigate/genai/__init__.py index 28ea4af6e..331365fb6 100644 --- a/frigate/genai/__init__.py +++ b/frigate/genai/__init__.py @@ -40,9 +40,9 @@ class GenAIClient: event: Event, ) -> Optional[str]: """Generate a description for the frame.""" - prompt = camera_config.genai.object_prompts.get( + prompt = camera_config.objects.genai.object_prompts.get( event.label, - camera_config.genai.prompt, + camera_config.objects.genai.prompt, ).format(**model_to_dict(event)) logger.debug(f"Sending images to genai provider with prompt: {prompt}") return self._send(prompt, thumbnails) @@ -58,16 +58,10 @@ class GenAIClient: def get_genai_client(config: FrigateConfig) -> Optional[GenAIClient]: """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() - provider = PROVIDERS.get(genai_config.provider) - if provider: - return provider(genai_config) + load_providers() + provider = PROVIDERS.get(config.genai.provider) + if provider: + return provider(config.genai) return None diff --git a/web/src/components/overlay/detail/SearchDetailDialog.tsx b/web/src/components/overlay/detail/SearchDetailDialog.tsx index 5e7e8fca6..b7b495ef8 100644 --- a/web/src/components/overlay/detail/SearchDetailDialog.tsx +++ b/web/src/components/overlay/detail/SearchDetailDialog.tsx @@ -936,14 +936,17 @@ function ObjectDetailsTab({
- {config?.cameras[search.camera].genai.enabled && + {config?.cameras[search.camera].objects.genai.enabled && !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) => - 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].genai.objects.includes( + (config.cameras[search.camera].objects.genai.objects.length === 0 || + config.cameras[search.camera].objects.genai.objects.includes( search.label, )) ? ( <> @@ -972,47 +975,49 @@ function ObjectDetailsTab({ )}
- {config?.cameras[search.camera].genai.enabled && search.end_time && ( -
- - {search.has_snapshot && ( - - - - - - regenerateDescription("snapshot")} - > - {t("details.regenerateFromSnapshot")} - - regenerateDescription("thumbnails")} - > - {t("details.regenerateFromThumbnails")} - - - - )} -
- )} - {((config?.cameras[search.camera].genai.enabled && search.end_time) || - !config?.cameras[search.camera].genai.enabled) && ( + {config?.cameras[search.camera].objects.genai.enabled && + search.end_time && ( +
+ + {search.has_snapshot && ( + + + + + + regenerateDescription("snapshot")} + > + {t("details.regenerateFromSnapshot")} + + regenerateDescription("thumbnails")} + > + {t("details.regenerateFromThumbnails")} + + + + )} +
+ )} + {((config?.cameras[search.camera].objects.genai.enabled && + search.end_time) || + !config?.cameras[search.camera].objects.genai.enabled) && (