Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions llmware/resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,10 @@ def update_library_card(self, library_name, update_dict,lib_card, delete_record=
embedding_list.append(update_dict["embedding"])
embedding_update_dict = {"embedding": embedding_list}
else:
if not inserted_list:
inserted_list = [{"embedding_status": "no", "embedding_model": "none",
"embedding_db": "none", "embedded_blocks": 0,
"embedding_dims": 0, "time_stamp": "NA"}]
embedding_update_dict = {"embedding": inserted_list}

self.collection.update_one(f, {"$set": embedding_update_dict})
Expand Down Expand Up @@ -1840,6 +1844,10 @@ def _update_embedding_record_handler(self, embedding_list, new_value,delete_reco

output = embedding_list
else:
if not inserted_list:
inserted_list = [{"embedding_status": "no", "embedding_model": "none",
"embedding_db": "none", "embedded_blocks": 0,
"embedding_dims": 0, "time_stamp": "NA"}]
output = inserted_list

return output
Expand Down Expand Up @@ -2938,6 +2946,10 @@ def _update_embedding_record_handler(self, embedding_list, new_value, delete_rec

output = embedding_list
else:
if not inserted_list:
inserted_list = [{"embedding_status": "no", "embedding_model": "none",
"embedding_db": "none", "embedded_blocks": 0,
"embedding_dims": 0, "time_stamp": "NA"}]
output = inserted_list

return output
Expand Down
80 changes: 80 additions & 0 deletions tests/library/test_embedding_delete.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
"""Tests for delete_installed_embedding resetting to initial value.

Verifies fix for GitHub issue #1094:
When deleting the last embedding, the embedding field should reset to the initial
value rather than becoming an empty list.
"""

from llmware.resources import SQLiteWriter, PGWriter


class TestEmbeddingRecordHandler:
"""Test _update_embedding_record_handler behavior when deleting embeddings."""

def test_delete_last_embedding_resets_to_initial_value_sqlite(self):
"""Test that SQLiteWriter resets embedding to initial value after deleting last embedding."""
initial_embedding = [{"embedding_status": "yes", "embedding_model": "test-model",
"embedding_db": "chromadb", "embedded_blocks": 100,
"embedding_dims": 384, "time_stamp": "test"}]

delete_value = {"embedding_status": "delete", "embedding_model": "test-model",
"embedding_db": "chromadb", "embedded_blocks": 0,
"embedding_dims": 384, "time_stamp": "NA"}

writer = SQLiteWriter.__new__(SQLiteWriter)
result = writer._update_embedding_record_handler(
initial_embedding.copy(), delete_value, delete_record=True
)

assert len(result) == 1
assert result[0]["embedding_status"] == "no"
assert result[0]["embedding_model"] == "none"
assert result[0]["embedding_db"] == "none"
assert result[0]["embedded_blocks"] == 0
assert result[0]["embedding_dims"] == 0

def test_delete_last_embedding_resets_to_initial_value_postgres(self):
"""Test that PGWriter resets embedding to initial value after deleting last embedding."""
initial_embedding = [{"embedding_status": "yes", "embedding_model": "test-model",
"embedding_db": "chromadb", "embedded_blocks": 100,
"embedding_dims": 384, "time_stamp": "test"}]

delete_value = {"embedding_status": "delete", "embedding_model": "test-model",
"embedding_db": "chromadb", "embedded_blocks": 0,
"embedding_dims": 384, "time_stamp": "NA"}

writer = PGWriter.__new__(PGWriter)
result = writer._update_embedding_record_handler(
initial_embedding.copy(), delete_value, delete_record=True
)

assert len(result) == 1
assert result[0]["embedding_status"] == "no"
assert result[0]["embedding_model"] == "none"
assert result[0]["embedding_db"] == "none"
assert result[0]["embedded_blocks"] == 0
assert result[0]["embedding_dims"] == 0

def test_delete_one_of_multiple_embeddings_keeps_others(self):
"""Test that deleting one embedding from multiple keeps the others."""
initial_embeddings = [
{"embedding_status": "yes", "embedding_model": "model-a",
"embedding_db": "chromadb", "embedded_blocks": 100,
"embedding_dims": 384, "time_stamp": "test1"},
{"embedding_status": "yes", "embedding_model": "model-b",
"embedding_db": "chromadb", "embedded_blocks": 200,
"embedding_dims": 768, "time_stamp": "test2"}
]

delete_value = {"embedding_status": "delete", "embedding_model": "model-a",
"embedding_db": "chromadb", "embedded_blocks": 0,
"embedding_dims": 384, "time_stamp": "NA"}

writer = SQLiteWriter.__new__(SQLiteWriter)
result = writer._update_embedding_record_handler(
initial_embeddings.copy(), delete_value, delete_record=True
)

assert len(result) == 1
assert result[0]["embedding_model"] == "model-b"
assert result[0]["embedded_blocks"] == 200