Skip to content

Commit 42c3d9d

Browse files
authored
Hot func main/delete memory (#565)
## Description <!-- Please include a summary of the changes below; Fill in the issue number that this PR addresses (if applicable); Fill in the related MemOS-Docs repository issue or PR link (if applicable); Mention the person who will review this PR (if you know who it is); Replace (summary), (issue), (docs-issue-or-pr-link), and (reviewer) with the appropriate information. 请在下方填写更改的摘要; 填写此 PR 解决的问题编号(如果适用); 填写相关的 MemOS-Docs 仓库 issue 或 PR 链接(如果适用); 提及将审查此 PR 的人(如果您知道是谁); 替换 (summary)、(issue)、(docs-issue-or-pr-link) 和 (reviewer) 为适当的信息。 --> Summary: (summary) Fix: #(issue) Docs Issue/PR: (docs-issue-or-pr-link) Reviewer: @(reviewer) ## Checklist: - [ ] I have performed a self-review of my own code | 我已自行检查了自己的代码 - [ ] I have commented my code in hard-to-understand areas | 我已在难以理解的地方对代码进行了注释 - [ ] I have added tests that prove my fix is effective or that my feature works | 我已添加测试以证明我的修复有效或功能正常 - [ ] I have created related documentation issue/PR in [MemOS-Docs](https://github.com/MemTensor/MemOS-Docs) (if applicable) | 我已在 [MemOS-Docs](https://github.com/MemTensor/MemOS-Docs) 中创建了相关的文档 issue/PR(如果适用) - [ ] I have linked the issue to this PR (if applicable) | 我已将 issue 链接到此 PR(如果适用) - [ ] I have mentioned the person who will review this PR | 我已提及将审查此 PR 的人
2 parents 9d886fc + b97c52a commit 42c3d9d

File tree

4 files changed

+77
-3
lines changed

4 files changed

+77
-3
lines changed

src/memos/api/handlers/memory_handler.py

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66

77
from typing import Any, Literal
88

9-
from memos.api.product_models import MemoryResponse
9+
from memos.api.product_models import DeleteMemoryRequest, DeleteMemoryResponse, MemoryResponse
1010
from memos.log import get_logger
11+
from memos.mem_cube.navie import NaiveMemCube
1112
from memos.mem_os.utils.format_utils import (
1213
convert_graph_to_tree_forworkmem,
1314
ensure_unique_tree_ids,
@@ -149,3 +150,50 @@ def handle_get_subgraph(
149150
except Exception as e:
150151
logger.error(f"Failed to get subgraph: {e}", exc_info=True)
151152
raise
153+
154+
155+
def handle_delete_memories(delete_mem_req: DeleteMemoryRequest, naive_mem_cube: NaiveMemCube):
156+
# Validate that only one of memory_ids, file_ids, or filter is provided
157+
provided_params = [
158+
delete_mem_req.memory_ids is not None,
159+
delete_mem_req.file_ids is not None,
160+
delete_mem_req.filter is not None,
161+
]
162+
if sum(provided_params) != 1:
163+
return DeleteMemoryResponse(
164+
message="Exactly one of memory_ids, file_ids, or filter must be provided",
165+
data={"status": "failure"},
166+
)
167+
168+
try:
169+
if delete_mem_req.memory_ids is not None:
170+
for cube_id in delete_mem_req.writable_cube_ids:
171+
naive_mem_cube.text_mem.delete(delete_mem_req.memory_ids, user_name=cube_id)
172+
if naive_mem_cube.pref_mem is not None:
173+
naive_mem_cube.pref_mem.delete(delete_mem_req.memory_ids)
174+
elif delete_mem_req.file_ids is not None:
175+
# TODO: Implement deletion by file_ids
176+
# Need to find memory_ids associated with file_ids and delete them
177+
logger.warning("Deletion by file_ids not implemented yet")
178+
return DeleteMemoryResponse(
179+
message="Deletion by file_ids not implemented yet",
180+
data={"status": "failure"},
181+
)
182+
elif delete_mem_req.filter is not None:
183+
# TODO: Implement deletion by filter
184+
# Need to find memories matching filter and delete them
185+
logger.warning("Deletion by filter not implemented yet")
186+
return DeleteMemoryResponse(
187+
message="Deletion by filter not implemented yet",
188+
data={"status": "failure"},
189+
)
190+
except Exception as e:
191+
logger.error(f"Failed to delete memories: {e}", exc_info=True)
192+
return DeleteMemoryResponse(
193+
message="Failed to delete memories",
194+
data={"status": "failure"},
195+
)
196+
return DeleteMemoryResponse(
197+
message="Memories deleted successfully",
198+
data={"status": "success"},
199+
)

src/memos/api/product_models.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import os
22
import uuid
33

4-
from typing import Generic, Literal, TypeVar
4+
from typing import Any, Generic, Literal, TypeVar
55

66
from pydantic import BaseModel, Field
77

@@ -224,6 +224,15 @@ class APIChatCompleteRequest(BaseRequest):
224224
)
225225

226226

227+
class DeleteMemoryRequest(BaseRequest):
228+
"""Request model for deleting memories."""
229+
230+
writable_cube_ids: list[str] = Field(..., description="Writable cube IDs")
231+
memory_ids: list[str] | None = Field(None, description="Memory IDs")
232+
file_ids: list[str] | None = Field(None, description="File IDs")
233+
filter: dict[str, Any] | None = Field(None, description="Filter for the memory")
234+
235+
227236
class SuggestionRequest(BaseRequest):
228237
"""Request model for getting suggestion queries."""
229238

@@ -313,3 +322,7 @@ class MemOSAddResponse(BaseModel):
313322
def success(self) -> bool:
314323
"""Convenient access to success status."""
315324
return self.data.success
325+
326+
327+
class DeleteMemoryResponse(BaseResponse[dict]):
328+
"""Response model for deleting memories."""

src/memos/api/routers/server_router.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
APIChatCompleteRequest,
2828
APISearchRequest,
2929
ChatRequest,
30+
DeleteMemoryRequest,
31+
DeleteMemoryResponse,
3032
GetMemoryRequest,
3133
MemoryResponse,
3234
SearchResponse,
@@ -219,3 +221,12 @@ def get_all_memories(memory_req: GetMemoryRequest):
219221
memory_type=memory_req.memory_type or "text_mem",
220222
naive_mem_cube=naive_mem_cube,
221223
)
224+
225+
226+
@router.post(
227+
"/delete_memory", summary="Delete memories for user", response_model=DeleteMemoryResponse
228+
)
229+
def delete_memories(memory_req: DeleteMemoryRequest):
230+
return handlers.memory_handler.handle_delete_memories(
231+
delete_mem_req=memory_req, naive_mem_cube=naive_mem_cube
232+
)

src/memos/memories/textual/preference.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,9 @@ def delete(self, memory_ids: list[str]) -> None:
260260
Args:
261261
memory_ids (list[str]): List of memory IDs to delete.
262262
"""
263-
raise NotImplementedError
263+
collection_list = self.vector_db.config.collection_name
264+
for collection_name in collection_list:
265+
self.vector_db.delete(collection_name, memory_ids)
264266

265267
def delete_with_collection_name(self, collection_name: str, memory_ids: list[str]) -> None:
266268
"""Delete memories by their IDs and collection name.

0 commit comments

Comments
 (0)