Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
6dcb8d3
new type
Nov 14, 2025
79deea7
Merge branch 'dev' into feat/api_refactor
Nov 14, 2025
fbfc80d
Merge branch 'dev' into feat/api_refactor
Nov 15, 2025
56dc725
llm reconstruct and add search api modify
Nov 18, 2025
ddf3dd1
llm construction
Nov 18, 2025
3006812
add delete and get, modify chat
Nov 19, 2025
872013b
modify code
Nov 20, 2025
1d61e40
modify code
Nov 20, 2025
ee301b5
modify code
Nov 20, 2025
43a7903
coding chat
Nov 21, 2025
b4fe866
fix bug in get and delete
Nov 21, 2025
b1053c4
add internet reference in playground chat stream
Nov 21, 2025
fc78818
merge api refactor to dev
Nov 21, 2025
83702f0
remove moscube
Nov 21, 2025
aa73811
modify code
Nov 22, 2025
42f3403
fix pre_commit
Nov 22, 2025
86403dd
fix make test
Nov 22, 2025
7664ffe
merge dev
Nov 24, 2025
c86dbe3
finish info transfer
Nov 24, 2025
93f8bef
add info and custom tags
Nov 25, 2025
7f4e4f3
merge dev to api refactor
Nov 25, 2025
0d68e88
modify model product fileds
Nov 25, 2025
b32b7fa
Merge branch 'dev' into feat/merge_api_refactor_to_dev
Nov 25, 2025
4964d2b
fix get api bug
Nov 26, 2025
e4eb9db
fix bug
Nov 26, 2025
6d1030e
merge dev
Nov 26, 2025
6df9f4b
merge dev
Nov 27, 2025
b6d1127
Merge branch 'dev' into feat/merge_api_refactor_to_dev
Nov 27, 2025
c39fda4
fix bug in pref add info
Nov 27, 2025
341b606
Merge branch 'dev' into feat/merge_api_refactor_to_dev
CaralHsi Nov 27, 2025
5c40498
modify code
Nov 28, 2025
d8bcfbe
fix bug in get and delete
Nov 28, 2025
9316ed3
merge dev
Nov 28, 2025
4bb10ae
modify delete code
Nov 28, 2025
b664d55
new package
Nov 28, 2025
aa342b8
merge dev
Nov 29, 2025
9d83a8d
fix bug
Nov 29, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docker/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -159,3 +159,4 @@ websockets==15.0.1
xlrd==2.0.2
xlsxwriter==3.2.5
prometheus-client==0.23.1
pymilvus==2.5.12
4 changes: 2 additions & 2 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ mem-reader = [

# PreferenceTextMemory
pref-mem = [
"pymilvus (>=2.6.1,<3.0.0)", # Milvus Vector DB
"pymilvus (>=2.5.12,<3.0.0)", # Milvus Vector DB
"datasketch (>=1.6.5,<2.0.0)", # MinHash library
]

Expand Down
41 changes: 35 additions & 6 deletions src/memos/api/handlers/memory_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,22 +180,51 @@ def handle_get_memories(
return GetMemoryResponse(
message="Memories retrieved successfully",
data={
"text_mem": memories,
"pref_mem": preferences,
"text_mem": [{"cube_id": get_mem_req.mem_cube_id, "memories": memories}],
"pref_mem": [{"cube_id": get_mem_req.mem_cube_id, "memories": preferences}],
},
)


def handle_delete_memories(delete_mem_req: DeleteMemoryRequest, naive_mem_cube: NaiveMemCube):
# Validate that only one of memory_ids, file_ids, or filter is provided
provided_params = [
delete_mem_req.memory_ids is not None,
delete_mem_req.file_ids is not None,
delete_mem_req.filter is not None,
]
if sum(provided_params) != 1:
return DeleteMemoryResponse(
message="Exactly one of memory_ids, file_ids, or filter must be provided",
data={"status": "failure"},
)

try:
naive_mem_cube.text_mem.delete(delete_mem_req.memory_ids)
if naive_mem_cube.pref_mem is not None:
naive_mem_cube.pref_mem.delete(delete_mem_req.memory_ids)
if delete_mem_req.memory_ids is not None:
naive_mem_cube.text_mem.delete(delete_mem_req.memory_ids)
if naive_mem_cube.pref_mem is not None:
naive_mem_cube.pref_mem.delete(delete_mem_req.memory_ids)
elif delete_mem_req.file_ids is not None:
# TODO: Implement deletion by file_ids
# Need to find memory_ids associated with file_ids and delete them
logger.warning("Deletion by file_ids not implemented yet")
return DeleteMemoryResponse(
message="Deletion by file_ids not implemented yet",
data={"status": "failure"},
)
elif delete_mem_req.filter is not None:
# TODO: Implement deletion by filter
# Need to find memories matching filter and delete them
logger.warning("Deletion by filter not implemented yet")
return DeleteMemoryResponse(
message="Deletion by filter not implemented yet",
data={"status": "failure"},
)
except Exception as e:
logger.error(f"Failed to delete memories: {e}", exc_info=True)
return DeleteMemoryResponse(
message="Failed to delete memories",
data="failure",
data={"status": "failure"},
)
return DeleteMemoryResponse(
message="Memories deleted successfully",
Expand Down
4 changes: 3 additions & 1 deletion src/memos/api/product_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -690,7 +690,9 @@ class GetMemoryRequest(BaseRequest):
class DeleteMemoryRequest(BaseRequest):
"""Request model for deleting memories."""

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


class SuggestionRequest(BaseRequest):
Expand Down
14 changes: 9 additions & 5 deletions src/memos/memories/textual/prefer_text_memory/extractor.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@
from memos.context.context import ContextThreadPoolExecutor
from memos.log import get_logger
from memos.mem_reader.simple_struct import detect_lang
from memos.memories.textual.item import PreferenceTextualMemoryMetadata, TextualMemoryItem
from memos.memories.textual.item import (
PreferenceTextualMemoryMetadata,
TextualMemoryItem,
list_all_fields,
)
from memos.memories.textual.prefer_text_memory.spliter import Splitter
from memos.memories.textual.prefer_text_memory.utils import convert_messages_to_string
from memos.templates.prefer_complete_prompt import (
Expand Down Expand Up @@ -114,8 +118,8 @@ def _process_single_chunk_explicit(
vector_info = {
"embedding": self.embedder.embed([pref["context_summary"]])[0],
}

extract_info = {**basic_info, **pref, **vector_info, **info}
user_info = {k: v for k, v in info.items() if k not in list_all_fields()}
extract_info = {**basic_info, **pref, **vector_info, **info, "info": user_info}

metadata = PreferenceTextualMemoryMetadata(
type=msg_type, preference_type="explicit_preference", **extract_info
Expand Down Expand Up @@ -143,8 +147,8 @@ def _process_single_chunk_implicit(
vector_info = {
"embedding": self.embedder.embed([pref["context_summary"]])[0],
}

extract_info = {**basic_info, **pref, **vector_info, **info}
user_info = {k: v for k, v in info.items() if k not in list_all_fields()}
extract_info = {**basic_info, **pref, **vector_info, **info, "info": user_info}

metadata = PreferenceTextualMemoryMetadata(
type=msg_type, preference_type="implicit_preference", **extract_info
Expand Down
Loading