From d7863f5668eaa7ffd9feefdb81bf950966b46636 Mon Sep 17 00:00:00 2001 From: parshvadaftari Date: Tue, 19 Aug 2025 01:28:51 +0530 Subject: [PATCH 1/3] Fix dependency and tests and updated docstring --- mem0/client/main.py | 16 +++++++++++++--- mem0/memory/base.py | 4 ++-- mem0/memory/main.py | 25 +++++++++++++++++++++---- pyproject.toml | 5 +++-- server/main.py | 10 +++++++++- 5 files changed, 48 insertions(+), 12 deletions(-) diff --git a/mem0/client/main.py b/mem0/client/main.py index aba36dbd7c..19ff3722c5 100644 --- a/mem0/client/main.py +++ b/mem0/client/main.py @@ -265,12 +265,17 @@ def update( ) -> Dict[str, Any]: """ Update a memory by ID. + Args: memory_id (str): Memory ID. - text (str, optional): Data to update in the memory. + text (str, optional): New content to update the memory with. metadata (dict, optional): Metadata to update in the memory. + Returns: Dict[str, Any]: The response from the server. + + Example: + >>> client.update(memory_id="mem_123", text="Likes to play tennis on weekends") """ if text is None and metadata is None: raise ValueError("Either text or metadata must be provided for update.") @@ -1054,13 +1059,18 @@ async def update( self, memory_id: str, text: Optional[str] = None, metadata: Optional[Dict[str, Any]] = None ) -> Dict[str, Any]: """ - Update a memory by ID. + Update a memory by ID asynchronously. + Args: memory_id (str): Memory ID. - text (str, optional): Data to update in the memory. + text (str, optional): New content to update the memory with. metadata (dict, optional): Metadata to update in the memory. + Returns: Dict[str, Any]: The response from the server. + + Example: + >>> await client.update(memory_id="mem_123", text="Likes to play tennis on weekends") """ if text is None and metadata is None: raise ValueError("Either text or metadata must be provided for update.") diff --git a/mem0/memory/base.py b/mem0/memory/base.py index 2db4d8ec1f..054bf7199d 100644 --- a/mem0/memory/base.py +++ b/mem0/memory/base.py @@ -32,10 +32,10 @@ def update(self, memory_id, data): Args: memory_id (str): ID of the memory to update. - data (dict): Data to update the memory with. + data (str): New content to update the memory with. Returns: - dict: Updated memory. + dict: Success message indicating the memory was updated. """ pass diff --git a/mem0/memory/main.py b/mem0/memory/main.py index 71aa83d6ab..52acb6ce4b 100644 --- a/mem0/memory/main.py +++ b/mem0/memory/main.py @@ -730,10 +730,14 @@ def update(self, memory_id, data): Args: memory_id (str): ID of the memory to update. - data (dict): Data to update the memory with. + data (str): New content to update the memory with. Returns: - dict: Updated memory. + dict: Success message indicating the memory was updated. + + Example: + >>> m.update(memory_id="mem_123", data="Likes to play tennis on weekends") + {'message': 'Memory updated successfully!'} """ capture_event("mem0.update", self, {"memory_id": memory_id, "sync_type": "sync"}) @@ -994,6 +998,15 @@ def __init__(self, config: MemoryConfig = MemoryConfig()): else: self.graph = None + self.config.vector_store.config.collection_name = "mem0migrations" + if self.config.vector_store.provider in ["faiss", "qdrant"]: + provider_path = f"migrations_{self.config.vector_store.provider}" + self.config.vector_store.config.path = os.path.join(mem0_dir, provider_path) + os.makedirs(self.config.vector_store.config.path, exist_ok=True) + self._telemetry_vector_store = VectorStoreFactory.create( + self.config.vector_store.provider, self.config.vector_store.config + ) + capture_event("mem0.init", self, {"sync_type": "async"}) @classmethod @@ -1580,10 +1593,14 @@ async def update(self, memory_id, data): Args: memory_id (str): ID of the memory to update. - data (dict): Data to update the memory with. + data (str): New content to update the memory with. Returns: - dict: Updated memory. + dict: Success message indicating the memory was updated. + + Example: + >>> await m.update(memory_id="mem_123", data="Likes to play tennis on weekends") + {'message': 'Memory updated successfully!'} """ capture_event("mem0.update", self, {"memory_id": memory_id, "sync_type": "async"}) diff --git a/pyproject.toml b/pyproject.toml index 944f8a6826..2c26b4b417 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,7 @@ requires-python = ">=3.9,<4.0" dependencies = [ "qdrant-client>=1.9.1", "pydantic>=2.7.3", - "openai>=1.33.0", + "openai>=1.90.0", "posthog>=3.5.0", "pytz>=2024.1", "sqlalchemy>=2.0.31", @@ -46,7 +46,8 @@ vector_stores = [ llms = [ "groq>=0.3.0", "together>=0.2.10", - "litellm>=0.1.0", + "litellm>=1.74.0", + "openai>=1.90.0", "ollama>=0.1.0", "vertexai>=0.1.0", "google-generativeai>=0.3.0", diff --git a/server/main.py b/server/main.py index 150ae590b3..a9f4dfdc1e 100644 --- a/server/main.py +++ b/server/main.py @@ -151,7 +151,15 @@ def search_memories(search_req: SearchRequest): @app.put("/memories/{memory_id}", summary="Update a memory") def update_memory(memory_id: str, updated_memory: Dict[str, Any]): - """Update an existing memory.""" + """Update an existing memory with new content. + + Args: + memory_id (str): ID of the memory to update + updated_memory (str): New content to update the memory with + + Returns: + dict: Success message indicating the memory was updated + """ try: return MEMORY_INSTANCE.update(memory_id=memory_id, data=updated_memory) except Exception as e: From 15678af5931cd44f0d015b4881a29c09bff822e0 Mon Sep 17 00:00:00 2001 From: parshvadaftari Date: Tue, 19 Aug 2025 01:55:44 +0530 Subject: [PATCH 2/3] Removing manual user input --- mem0/proxy/main.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/mem0/proxy/main.py b/mem0/proxy/main.py index 7668bcea12..4baaf5ec2c 100644 --- a/mem0/proxy/main.py +++ b/mem0/proxy/main.py @@ -11,16 +11,11 @@ try: import litellm except ImportError: - user_input = input("The 'litellm' library is required. Install it now? [y/N]: ") - if user_input.lower() == "y": - try: - subprocess.check_call([sys.executable, "-m", "pip", "install", "litellm"]) - import litellm - except subprocess.CalledProcessError: - print("Failed to install 'litellm'. Please install it manually using 'pip install litellm'.") - sys.exit(1) - else: - raise ImportError("The required 'litellm' library is not installed.") + try: + subprocess.check_call([sys.executable, "-m", "pip", "install", "litellm"]) + import litellm + except subprocess.CalledProcessError: + print("Failed to install 'litellm'. Please install it manually using 'pip install litellm'.") sys.exit(1) from mem0 import Memory, MemoryClient From adcd3df1c81d1844830e4ea3ae355fb996a80d7d Mon Sep 17 00:00:00 2001 From: parshvadaftari Date: Tue, 19 Aug 2025 02:04:12 +0530 Subject: [PATCH 3/3] restrict openai version --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2c26b4b417..323ccc0d72 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,7 @@ requires-python = ">=3.9,<4.0" dependencies = [ "qdrant-client>=1.9.1", "pydantic>=2.7.3", - "openai>=1.90.0", + "openai>=1.90.0,<1.100.0", "posthog>=3.5.0", "pytz>=2024.1", "sqlalchemy>=2.0.31", @@ -47,7 +47,7 @@ llms = [ "groq>=0.3.0", "together>=0.2.10", "litellm>=1.74.0", - "openai>=1.90.0", + "openai>=1.90.0,<1.100.0", "ollama>=0.1.0", "vertexai>=0.1.0", "google-generativeai>=0.3.0",