diff --git a/mem0/vector_stores/s3_vectors.py b/mem0/vector_stores/s3_vectors.py index c44ce15c8..1c56c7884 100644 --- a/mem0/vector_stores/s3_vectors.py +++ b/mem0/vector_stores/s3_vectors.py @@ -122,7 +122,37 @@ class S3Vectors(VectorStoreBase): ) def update(self, vector_id, vector=None, payload=None): - # S3 Vectors uses put_vectors for updates (overwrite) + # S3 Vectors uses put_vectors for updates (overwrite). + # When vector=None (e.g. metadata-only update triggered by event=NONE), + # fetch the existing vector data first to avoid passing None to boto3 + # which causes a parameter validation error: + # "Invalid type for parameter vectors[0].data.float32, value: None" + if vector is None: + existing = self.get(vector_id) + if existing is None: + logger.warning(f"update called with vector=None but {vector_id} not found; skipping") + return + try: + response = self.client.get_vectors( + vectorBucketName=self.vector_bucket_name, + indexName=self.collection_name, + keys=[vector_id], + returnData=True, + returnMetadata=True, + ) + vectors = response.get("vectors", []) + if not vectors: + logger.warning(f"update: no vector data found for {vector_id}; skipping") + return + vector = vectors[0].get("data", {}).get("float32") + if vector is None: + logger.warning(f"update: float32 data is None for {vector_id}; skipping") + return + if payload is None: + payload = existing.payload + except Exception as e: + logger.error(f"update: failed to fetch existing vector for {vector_id}: {e}") + return self.insert(vectors=[vector], payloads=[payload], ids=[vector_id]) def get(self, vector_id) -> Optional[OutputData]: