From 6b9b3778f50b06ac1974f88648ec796d57ed8575 Mon Sep 17 00:00:00 2001 From: wozz Date: Sat, 13 Dec 2025 09:12:09 -0500 Subject: [PATCH] =?UTF-8?q?fix:=20attribute=20error=20in=20embedding=20mai?= =?UTF-8?q?ntainer=20ini=E2=80=A6=20(#21252)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: Resolve deadlock and attribute error in embedding maintainer initialization Updates the trigger embedding calculation to call embedding methods directly instead of using ZMQ. This prevents a deadlock during initialization where the ZMQ responder is not yet polling for requests. Also updates sync_triggers to pass the camera name and trigger name to the calculation method, fixing an AttributeError where trigger.name was accessed on a TriggerConfig object. * mocked repro * Revert "mocked repro" This reverts commit dea5b5d4db21c17d89a963a227f5e83ce8474a55. * fix formatting * Update embeddings.py new line --- frigate/embeddings/embeddings.py | 37 ++++++++++++-------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/frigate/embeddings/embeddings.py b/frigate/embeddings/embeddings.py index 01d011ae2..1e25afce3 100644 --- a/frigate/embeddings/embeddings.py +++ b/frigate/embeddings/embeddings.py @@ -12,9 +12,6 @@ from peewee import DoesNotExist, IntegrityError from PIL import Image from playhouse.shortcuts import model_to_dict -from frigate.comms.embeddings_updater import ( - EmbeddingsRequestEnum, -) from frigate.comms.inter_process import InterProcessRequestor from frigate.config import FrigateConfig from frigate.config.classification import SemanticSearchModelEnum @@ -495,7 +492,7 @@ class Embeddings: or thumbnail_missing ): existing_trigger.embedding = self._calculate_trigger_embedding( - trigger + trigger, trigger_name, camera.name ) needs_embedding_update = True @@ -532,7 +529,9 @@ class Embeddings: ) # Calculate embedding for new trigger - embedding = self._calculate_trigger_embedding(trigger) + embedding = self._calculate_trigger_embedding( + trigger, trigger_name, camera.name + ) Trigger.create( camera=camera.name, @@ -588,14 +587,13 @@ class Embeddings: f"Failed to delete thumbnail for trigger with data {event_id} in {camera}: {e}" ) - def _calculate_trigger_embedding(self, trigger) -> bytes: + def _calculate_trigger_embedding( + self, trigger, trigger_name: str, camera_name: str + ) -> bytes: """Calculate embedding for a trigger based on its type and data.""" if trigger.type == "description": - logger.debug(f"Generating embedding for trigger description {trigger.name}") - embedding = self.requestor.send_data( - EmbeddingsRequestEnum.embed_description.value, - {"id": None, "description": trigger.data, "upsert": False}, - ) + logger.debug(f"Generating embedding for trigger description {trigger_name}") + embedding = self.embed_description(None, trigger.data, upsert=False) return embedding.astype(np.float32).tobytes() elif trigger.type == "thumbnail": @@ -615,28 +613,21 @@ class Embeddings: try: with open( - os.path.join( - TRIGGER_DIR, trigger.camera, f"{trigger.data}.webp" - ), + os.path.join(TRIGGER_DIR, camera_name, f"{trigger.data}.webp"), "rb", ) as f: thumbnail = f.read() except Exception as e: logger.error( - f"Failed to read thumbnail for trigger {trigger.name} with ID {trigger.data}: {e}" + f"Failed to read thumbnail for trigger {trigger_name} with ID {trigger.data}: {e}" ) return b"" logger.debug( - f"Generating embedding for trigger thumbnail {trigger.name} with ID {trigger.data}" + f"Generating embedding for trigger thumbnail {trigger_name} with ID {trigger.data}" ) - embedding = self.requestor.send_data( - EmbeddingsRequestEnum.embed_thumbnail.value, - { - "id": str(trigger.data), - "thumbnail": str(thumbnail), - "upsert": False, - }, + embedding = self.embed_thumbnail( + str(trigger.data), thumbnail, upsert=False ) return embedding.astype(np.float32).tobytes()