Skip to content

Commit 1e01164

Browse files
Wang-Daojiyuan.wangCaralHsi
authored
Feat/merge api refactor to dev (#556)
* new type * llm reconstruct and add search api modify * llm construction * add delete and get, modify chat * modify code * modify code * modify code * coding chat * fix bug in get and delete * add internet reference in playground chat stream * remove moscube * modify code * fix pre_commit * fix make test * finish info transfer * add info and custom tags * modify model product fileds * fix get api bug * fix bug * fix bug in pref add info * modify code * fix bug in get and delete * modify delete code * new package * fix bug --------- Co-authored-by: yuan.wang <yuan.wang@yuanwangdebijibendiannao.local> Co-authored-by: CaralHsi <caralhsi@gmail.com>
1 parent 150202b commit 1e01164

File tree

6 files changed

+51
-15
lines changed

6 files changed

+51
-15
lines changed

docker/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,3 +159,4 @@ websockets==15.0.1
159159
xlrd==2.0.2
160160
xlsxwriter==3.2.5
161161
prometheus-client==0.23.1
162+
pymilvus==2.5.12

poetry.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ mem-reader = [
9191

9292
# PreferenceTextMemory
9393
pref-mem = [
94-
"pymilvus (>=2.6.1,<3.0.0)", # Milvus Vector DB
94+
"pymilvus (>=2.5.12,<3.0.0)", # Milvus Vector DB
9595
"datasketch (>=1.6.5,<2.0.0)", # MinHash library
9696
]
9797

src/memos/api/handlers/memory_handler.py

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -180,22 +180,51 @@ def handle_get_memories(
180180
return GetMemoryResponse(
181181
message="Memories retrieved successfully",
182182
data={
183-
"text_mem": memories,
184-
"pref_mem": preferences,
183+
"text_mem": [{"cube_id": get_mem_req.mem_cube_id, "memories": memories}],
184+
"pref_mem": [{"cube_id": get_mem_req.mem_cube_id, "memories": preferences}],
185185
},
186186
)
187187

188188

189189
def handle_delete_memories(delete_mem_req: DeleteMemoryRequest, naive_mem_cube: NaiveMemCube):
190+
# Validate that only one of memory_ids, file_ids, or filter is provided
191+
provided_params = [
192+
delete_mem_req.memory_ids is not None,
193+
delete_mem_req.file_ids is not None,
194+
delete_mem_req.filter is not None,
195+
]
196+
if sum(provided_params) != 1:
197+
return DeleteMemoryResponse(
198+
message="Exactly one of memory_ids, file_ids, or filter must be provided",
199+
data={"status": "failure"},
200+
)
201+
190202
try:
191-
naive_mem_cube.text_mem.delete(delete_mem_req.memory_ids)
192-
if naive_mem_cube.pref_mem is not None:
193-
naive_mem_cube.pref_mem.delete(delete_mem_req.memory_ids)
203+
if delete_mem_req.memory_ids is not None:
204+
naive_mem_cube.text_mem.delete(delete_mem_req.memory_ids)
205+
if naive_mem_cube.pref_mem is not None:
206+
naive_mem_cube.pref_mem.delete(delete_mem_req.memory_ids)
207+
elif delete_mem_req.file_ids is not None:
208+
# TODO: Implement deletion by file_ids
209+
# Need to find memory_ids associated with file_ids and delete them
210+
logger.warning("Deletion by file_ids not implemented yet")
211+
return DeleteMemoryResponse(
212+
message="Deletion by file_ids not implemented yet",
213+
data={"status": "failure"},
214+
)
215+
elif delete_mem_req.filter is not None:
216+
# TODO: Implement deletion by filter
217+
# Need to find memories matching filter and delete them
218+
logger.warning("Deletion by filter not implemented yet")
219+
return DeleteMemoryResponse(
220+
message="Deletion by filter not implemented yet",
221+
data={"status": "failure"},
222+
)
194223
except Exception as e:
195224
logger.error(f"Failed to delete memories: {e}", exc_info=True)
196225
return DeleteMemoryResponse(
197226
message="Failed to delete memories",
198-
data="failure",
227+
data={"status": "failure"},
199228
)
200229
return DeleteMemoryResponse(
201230
message="Memories deleted successfully",

src/memos/api/product_models.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -690,7 +690,9 @@ class GetMemoryRequest(BaseRequest):
690690
class DeleteMemoryRequest(BaseRequest):
691691
"""Request model for deleting memories."""
692692

693-
memory_ids: list[str] = Field(..., description="Memory IDs")
693+
memory_ids: list[str] | None = Field(None, description="Memory IDs")
694+
file_ids: list[str] | None = Field(None, description="File IDs")
695+
filter: dict[str, Any] | None = Field(None, description="Filter for the memory")
694696

695697

696698
class SuggestionRequest(BaseRequest):

src/memos/memories/textual/prefer_text_memory/extractor.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@
99
from memos.context.context import ContextThreadPoolExecutor
1010
from memos.log import get_logger
1111
from memos.mem_reader.simple_struct import detect_lang
12-
from memos.memories.textual.item import PreferenceTextualMemoryMetadata, TextualMemoryItem
12+
from memos.memories.textual.item import (
13+
PreferenceTextualMemoryMetadata,
14+
TextualMemoryItem,
15+
list_all_fields,
16+
)
1317
from memos.memories.textual.prefer_text_memory.spliter import Splitter
1418
from memos.memories.textual.prefer_text_memory.utils import convert_messages_to_string
1519
from memos.templates.prefer_complete_prompt import (
@@ -114,8 +118,8 @@ def _process_single_chunk_explicit(
114118
vector_info = {
115119
"embedding": self.embedder.embed([pref["context_summary"]])[0],
116120
}
117-
118-
extract_info = {**basic_info, **pref, **vector_info, **info}
121+
user_info = {k: v for k, v in info.items() if k not in list_all_fields()}
122+
extract_info = {**basic_info, **pref, **vector_info, **info, "info": user_info}
119123

120124
metadata = PreferenceTextualMemoryMetadata(
121125
type=msg_type, preference_type="explicit_preference", **extract_info
@@ -143,8 +147,8 @@ def _process_single_chunk_implicit(
143147
vector_info = {
144148
"embedding": self.embedder.embed([pref["context_summary"]])[0],
145149
}
146-
147-
extract_info = {**basic_info, **pref, **vector_info, **info}
150+
user_info = {k: v for k, v in info.items() if k not in list_all_fields()}
151+
extract_info = {**basic_info, **pref, **vector_info, **info, "info": user_info}
148152

149153
metadata = PreferenceTextualMemoryMetadata(
150154
type=msg_type, preference_type="implicit_preference", **extract_info

0 commit comments

Comments
 (0)