Compare commits

...

3 Commits

Author SHA1 Message Date
Devin AI
ae5f4fb9cb Fix import sorting with ruff --fix
Co-Authored-By: Joe Moura <joao@crewai.com>
2025-03-25 14:00:12 +00:00
Devin AI
71ff89c8c7 Fix import sorting in knowledge storage test
Co-Authored-By: Joe Moura <joao@crewai.com>
2025-03-25 13:58:56 +00:00
Devin AI
74e018ae43 Fix #2464: Fix embedding dimension mismatch with reset-memories command
Co-Authored-By: Joe Moura <joao@crewai.com>
2025-03-25 13:57:20 +00:00
2 changed files with 78 additions and 6 deletions

View File

@@ -114,8 +114,20 @@ class KnowledgeStorage(BaseKnowledgeStorage):
settings=Settings(allow_reset=True),
)
self.app.reset()
shutil.rmtree(base_path)
# If a specific collection name is provided, try to delete just that collection
if self.collection_name:
try:
collection_name = f"knowledge_{self.collection_name}"
self.app.delete_collection(name=collection_name)
Logger(verbose=True).log("info", f"Collection '{collection_name}' has been reset.")
except Exception:
# If deletion of specific collection fails, fall back to resetting all
self.app.reset()
shutil.rmtree(base_path)
else:
self.app.reset()
shutil.rmtree(base_path)
self.app = None
self.collection = None
@@ -164,15 +176,19 @@ class KnowledgeStorage(BaseKnowledgeStorage):
ids=filtered_ids,
)
except chromadb.errors.InvalidDimensionException as e:
collection_reset_cmd = "`crewai reset-memories -a`"
if self.collection_name:
collection_reset_cmd = f"`crewai reset-memories --knowledge` (for collection: {self.collection_name})"
Logger(verbose=True).log(
"error",
"Embedding dimension mismatch. This usually happens when mixing different embedding models. Try resetting the collection using `crewai reset-memories -a`",
f"Embedding dimension mismatch. This usually happens when mixing different embedding models. Try resetting using {collection_reset_cmd}",
"red",
)
raise ValueError(
"Embedding dimension mismatch. Make sure you're using the same embedding model "
"across all operations with this collection."
"Try resetting the collection using `crewai reset-memories -a`"
f"Embedding dimension mismatch. Make sure you're using the same embedding model "
f"across all operations with this collection. "
f"Try resetting using {collection_reset_cmd}"
) from e
except Exception as e:
Logger(verbose=True).log("error", f"Failed to upsert documents: {e}", "red")

View File

@@ -0,0 +1,56 @@
import os
from unittest.mock import MagicMock, patch
import pytest
from crewai.knowledge.storage.knowledge_storage import KnowledgeStorage
class TestKnowledgeStorage:
@patch("crewai.knowledge.storage.knowledge_storage.chromadb")
@patch("crewai.knowledge.storage.knowledge_storage.shutil")
def test_reset_with_default_collection(self, mock_shutil, mock_chromadb):
# Setup
mock_app = MagicMock()
mock_chromadb.PersistentClient.return_value = mock_app
# Execute
storage = KnowledgeStorage()
storage.reset()
# Verify
mock_app.reset.assert_called_once()
mock_shutil.rmtree.assert_called_once()
@patch("crewai.knowledge.storage.knowledge_storage.chromadb")
@patch("crewai.knowledge.storage.knowledge_storage.shutil")
def test_reset_with_custom_collection(self, mock_shutil, mock_chromadb):
# Setup
mock_app = MagicMock()
mock_chromadb.PersistentClient.return_value = mock_app
# Execute
storage = KnowledgeStorage(collection_name="custom_collection")
storage.reset()
# Verify
mock_app.delete_collection.assert_called_once_with(name="knowledge_custom_collection")
mock_app.reset.assert_not_called()
mock_shutil.rmtree.assert_not_called()
@patch("crewai.knowledge.storage.knowledge_storage.chromadb")
@patch("crewai.knowledge.storage.knowledge_storage.shutil")
def test_reset_with_custom_collection_fallback(self, mock_shutil, mock_chromadb):
# Setup
mock_app = MagicMock()
mock_app.delete_collection.side_effect = Exception("Collection not found")
mock_chromadb.PersistentClient.return_value = mock_app
# Execute
storage = KnowledgeStorage(collection_name="custom_collection")
storage.reset()
# Verify
mock_app.delete_collection.assert_called_once_with(name="knowledge_custom_collection")
mock_app.reset.assert_called_once()
mock_shutil.rmtree.assert_called_once()