From ecedbc11d95f974787a824e8c3f684f01d709968 Mon Sep 17 00:00:00 2001 From: Himanshu <104683257+Himanshu-Sangshetti@users.noreply.github.com> Date: Mon, 23 Mar 2026 14:58:06 +0530 Subject: [PATCH] fix(qdrant): do not remove local path on init (#4473) (#4475) --- mem0/configs/vector_stores/qdrant.py | 2 +- mem0/vector_stores/qdrant.py | 8 ++------ tests/vector_stores/test_qdrant.py | 21 ++++++++++++++++++++- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/mem0/configs/vector_stores/qdrant.py b/mem0/configs/vector_stores/qdrant.py index 556b45ed0..a61088388 100644 --- a/mem0/configs/vector_stores/qdrant.py +++ b/mem0/configs/vector_stores/qdrant.py @@ -16,7 +16,7 @@ class QdrantConfig(BaseModel): path: Optional[str] = Field("/tmp/qdrant", description="Path for local Qdrant database") url: Optional[str] = Field(None, description="Full URL for Qdrant server") api_key: Optional[str] = Field(None, description="API key for Qdrant server") - on_disk: Optional[bool] = Field(False, description="Enables persistent storage") + on_disk: Optional[bool] = Field(False,description="Enables persistent storage. Vectors are kept on disk (True) or in memory (False). Does not delete the local database path.") @model_validator(mode="before") @classmethod diff --git a/mem0/vector_stores/qdrant.py b/mem0/vector_stores/qdrant.py index a2ee05645..c15e4caab 100644 --- a/mem0/vector_stores/qdrant.py +++ b/mem0/vector_stores/qdrant.py @@ -1,6 +1,4 @@ import logging -import os -import shutil from typing import Optional from qdrant_client import QdrantClient @@ -48,7 +46,8 @@ class Qdrant(VectorStoreBase): path (str, optional): Path for local Qdrant database. Defaults to None. url (str, optional): Full URL for Qdrant server. Defaults to None. api_key (str, optional): API key for Qdrant server. Defaults to None. - on_disk (bool, optional): Enables persistent storage. Defaults to False. + on_disk (bool, optional): Enables persistent storage. Vectors are stored on disk (True) or in memory (False). + Does not delete the local database path. Defaults to False. """ if client: self.client = client @@ -66,9 +65,6 @@ class Qdrant(VectorStoreBase): if not params: params["path"] = path self.is_local = True - if not on_disk: - if os.path.exists(path) and os.path.isdir(path): - shutil.rmtree(path) else: self.is_local = False diff --git a/tests/vector_stores/test_qdrant.py b/tests/vector_stores/test_qdrant.py index 8d9246a6e..59a1c3e24 100644 --- a/tests/vector_stores/test_qdrant.py +++ b/tests/vector_stores/test_qdrant.py @@ -1,6 +1,8 @@ +import os +import tempfile import unittest import uuid -from unittest.mock import MagicMock +from unittest.mock import MagicMock, patch from qdrant_client import QdrantClient from qdrant_client.models import ( @@ -31,6 +33,23 @@ class TestQdrant(unittest.TestCase): on_disk=True, ) + def test_local_path_on_disk_false_preserves_existing_directory(self): + """#4473: local path must not be removed when on_disk is False.""" + with tempfile.TemporaryDirectory() as tmp: + sentinel = os.path.join(tmp, "sentinel") + with open(sentinel, "w", encoding="utf-8") as f: + f.write("keep") + mock_client = MagicMock() + mock_client.get_collections.return_value = MagicMock(collections=[]) + with patch("mem0.vector_stores.qdrant.QdrantClient", return_value=mock_client): + Qdrant( + collection_name="c", + embedding_model_dims=128, + path=tmp, + on_disk=False, + ) + self.assertTrue(os.path.isfile(sentinel)) + def test_create_col(self): self.client_mock.get_collections.return_value = MagicMock(collections=[])