Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
171 commits
Select commit Hold shift + click to select a range
65d5649
update reader and search strategy
Oct 28, 2025
6cad866
set strategy reader and search config
Oct 29, 2025
f040110
fix all reader conflicts
Oct 29, 2025
c389367
fix install problem
Oct 29, 2025
499502d
fix
Oct 29, 2025
e1bb223
fix test
Oct 29, 2025
72b7466
Merge branch 'dev' into dev_test
CaralHsi Oct 29, 2025
74585e8
Merge branch 'dev' into dev_test
fridayL Oct 30, 2025
790e99f
turn off graph recall
Oct 30, 2025
15b63a7
Merge branch 'dev' into dev_test
Oct 30, 2025
390ba29
turn off graph recall
Oct 30, 2025
9615282
turn off graph recall
Oct 30, 2025
2fb8ce0
Merge branch 'dev' into dev_test
fridayL Oct 30, 2025
6035522
Merge branch 'dev' into dev_test
Oct 30, 2025
04f412b
fix Searcher input bug
Oct 30, 2025
9716274
fix Searcher
Oct 30, 2025
c455a4e
Merge branch 'dev_test' of github.com:whipser030/MemOS into dev_test
Oct 30, 2025
f8b9b4a
fix Search
Oct 30, 2025
c840ad4
Merge branch 'dev' into dev_test
Oct 30, 2025
b9dbecd
fix bug
Nov 4, 2025
1798f60
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Nov 4, 2025
6db95e7
Merge branch 'dev' into dev_test
Nov 4, 2025
1173c07
adjust strategy reader
Nov 4, 2025
7ab465b
Merge branch 'dev' into dev_test
Nov 4, 2025
744d227
adjust strategy reader
Nov 4, 2025
a9a98fa
adjust search config input
Nov 4, 2025
900f5e6
reformat code
Nov 4, 2025
ac7aff5
Merge branch 'dev' into dev_test
CaralHsi Nov 4, 2025
144c446
re pr
Nov 5, 2025
a2b55c7
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Nov 5, 2025
441c52b
Merge branch 'dev' into dev_test
Nov 5, 2025
6f272db
Merge branch 'dev_test' of github.com:whipser030/MemOS into dev_test
Nov 5, 2025
f506d3e
format repair
Nov 5, 2025
db9041c
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Nov 5, 2025
d921284
Merge branch 'dev' into dev_test
CaralHsi Nov 5, 2025
d036c53
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Nov 11, 2025
5a3f0db
Merge branch 'dev' into dev_test
Nov 11, 2025
dc67413
fix time issue
Nov 11, 2025
7699b9a
Merge branch 'dev_test' of github.com:whipser030/MemOS into dev_test
Nov 11, 2025
8bfbf94
develop feedback process
Nov 19, 2025
875c551
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Nov 19, 2025
7f20f8b
Resolve merge conflicts
Nov 19, 2025
4d712eb
feedback handler configuration
Nov 20, 2025
36b93eb
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Nov 25, 2025
adec73e
merged
Nov 25, 2025
aef3aad
upgrade feedback using
Nov 26, 2025
81ec520
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Nov 26, 2025
55c9d89
fix
Nov 26, 2025
b4fbfde
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Nov 27, 2025
ee64719
Merge branch 'dev' into dev_test
Nov 27, 2025
0fa9be7
add threshold
Nov 27, 2025
4a4746e
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Nov 27, 2025
16de8da
Merge branch 'dev' into dev_test
Nov 27, 2025
facb7b3
update prompt
Nov 27, 2025
eab5fe6
update prompt
Nov 27, 2025
7577aac
fix handler
Nov 27, 2025
cc4069d
add feedback scheduler
Nov 29, 2025
2529db2
add handler change node update
Dec 1, 2025
898ccac
add handler change node update
Dec 1, 2025
faec340
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 1, 2025
913c24d
add handler change node update
Dec 1, 2025
91d063d
add handler change node update
Dec 1, 2025
2a47880
add handler change node update
Dec 1, 2025
c5618c6
Merge branch 'dev' into dev_test
whipser030 Dec 2, 2025
b9737f1
Merge branch 'dev' into dev_test
CaralHsi Dec 2, 2025
ad9c2e7
fix interface input
Dec 2, 2025
c0c32b1
Merge branch 'dev_test' of github.com:whipser030/MemOS into dev_test
Dec 2, 2025
d906f0d
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 2, 2025
696708e
fix interface input
Dec 2, 2025
6ad8dae
add chunk and ratio filter
Dec 3, 2025
6298c64
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 3, 2025
47acd7a
Merge branch 'dev' into dev_test
Dec 3, 2025
0727c25
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 3, 2025
0b0342d
Merge branch 'dev' into dev_test
Dec 3, 2025
294c1e6
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 3, 2025
d9158e4
Merge branch 'dev' into dev_test
Dec 3, 2025
699cdf7
update stopwords
Dec 3, 2025
8ca03c0
Merge branch 'dev' into dev_test
fridayL Dec 3, 2025
6076935
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 4, 2025
b2b0f6e
Merge branch 'dev' into dev_test
Dec 4, 2025
343eeb3
fix messages queue
Dec 4, 2025
1bb9396
Merge branch 'dev_test' of github.com:whipser030/MemOS into dev_test
Dec 4, 2025
045196c
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 4, 2025
7131c35
Merge branch 'dev' into dev_test
Dec 4, 2025
d66e8ce
add seach_by_keywords_LIKE
Dec 7, 2025
d081aaa
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 7, 2025
405658f
Merge branch 'dev' into dev_test
Dec 7, 2025
ae60994
add doc filter
Dec 9, 2025
70efbf3
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 9, 2025
a613c7e
merge dev
Dec 9, 2025
7b0f2f4
add retrieve query
Dec 9, 2025
c6768b6
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 9, 2025
005a5bb
add retrieve queies
Dec 10, 2025
d69e7f4
patch info filter
Dec 10, 2025
d4f18e8
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 10, 2025
3c5199a
add strict info filter
Dec 11, 2025
365e0b6
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 12, 2025
9bc942d
Merge branch 'dev' into dev_test
Dec 12, 2025
eab3d80
add log and make embedding safety net
Dec 12, 2025
9519f5e
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 12, 2025
f21a885
Merge branch 'dev' into dev_test
Dec 12, 2025
7f146e1
add log and make embedding safety net
Dec 12, 2025
4cc4677
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 15, 2025
c01c900
Merge branch 'dev' into dev_test
Dec 15, 2025
4da6d31
deduplicate add objects
Dec 16, 2025
28934c8
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 16, 2025
d3f0a77
Merge branch 'dev' into dev_test
Dec 16, 2025
13e8d16
Merge branch 'dev' into dev_test
CaralHsi Dec 16, 2025
fd2816c
use _add_memories_parallel
Dec 17, 2025
dfe62dc
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 17, 2025
192d150
Merge branch 'dev' into dev_test
Dec 17, 2025
e6ce0ee
Merge branch 'dev_test' of github.com:whipser030/MemOS into dev_test
Dec 17, 2025
02585f2
Merge branch 'dev' into dev_test
fridayL Dec 17, 2025
39b0b20
delete Special characters
Dec 17, 2025
81fa434
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 17, 2025
0a10a52
Merge branch 'dev' into dev_test
Dec 17, 2025
991092e
Merge branch 'dev_test' of github.com:whipser030/MemOS into dev_test
Dec 17, 2025
b7b5003
delete Special characters
Dec 17, 2025
95bb061
delete Special characters
Dec 17, 2025
14d6732
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 17, 2025
c8ea8ae
Merge branch 'dev' into dev_test
Dec 17, 2025
a2fe6ed
delete Special characters
Dec 17, 2025
6274864
add source_doc_id
Dec 17, 2025
5f19846
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 17, 2025
a06e5f7
Merge branch 'dev' into dev_test
Dec 17, 2025
f2aec38
add source_doc_id
Dec 17, 2025
45f4957
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 18, 2025
bd612b9
Merge branch 'dev' into dev_test
Dec 18, 2025
d34812b
add reranker in init com..
Dec 18, 2025
5b681be
Merge branch 'dev' into dev_test
fridayL Dec 18, 2025
3919dcf
fix circle import
Dec 18, 2025
56df680
Merge branch 'dev_test' of github.com:whipser030/MemOS into dev_test
Dec 18, 2025
dd1aef9
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 18, 2025
777d6e0
Merge branch 'dev' into dev_test
Dec 18, 2025
353e417
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 22, 2025
bd8651c
Merge branch 'dev' into dev_test
Dec 22, 2025
73106ed
add feedback judgement
Dec 23, 2025
b7ffa5a
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 23, 2025
f37b15b
Merge branch 'dev' into dev_test
Dec 23, 2025
1b0e3af
add feedback judgement
Dec 23, 2025
f6d8f77
add pref feedback
Dec 24, 2025
9137781
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 24, 2025
ef36b5b
add pref feedback
Dec 24, 2025
ed34f0c
add pref feedback
Dec 24, 2025
fd50e90
Merge branch 'dev' into dev_test
fridayL Dec 25, 2025
653d900
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 29, 2025
827a503
patch: get_memory func filter user id and make page chunk
Dec 29, 2025
82ea9ee
Merge branch 'dev' into dev_test
Dec 29, 2025
8e28619
Merge branch 'dev_test' of github.com:whipser030/MemOS into dev_test
Dec 29, 2025
3dd09d5
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 29, 2025
a779823
Merge branch 'dev' into dev_test
Dec 29, 2025
4fab261
add total num
Dec 30, 2025
29f63c0
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 30, 2025
6aacaa7
Merge branch 'dev' into dev_test
Dec 30, 2025
b5f71a5
add total num
Dec 30, 2025
098a830
add milvus pagination
Dec 30, 2025
dd8cd80
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 30, 2025
9eca446
Merge branch 'dev' into dev_test
Dec 30, 2025
3fd1743
fix merge implicit explicit pref
Dec 30, 2025
963aa91
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Dec 30, 2025
031876c
fix merge implicit explicit pref
Dec 30, 2025
af610fe
fix merge implicit explicit pref
Dec 30, 2025
eab2303
fix merge implicit explicit pref
Dec 30, 2025
83061d1
fix json load bug
Jan 7, 2026
6707cc2
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Jan 7, 2026
a0989fd
Merge branch 'dev' into dev_test
Jan 7, 2026
48d4ff1
knowledge raw_text replace memory
Jan 8, 2026
f5b7547
Merge branch 'dev' of github.com:MemTensor/MemOS into dev
Jan 8, 2026
10d8b93
Merge branch 'dev' into dev_test
Jan 8, 2026
21c12cd
knowledge raw_text replace memory
Jan 8, 2026
7164b71
knowledge raw_text replace memory
Jan 8, 2026
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
104 changes: 102 additions & 2 deletions src/memos/api/handlers/formatters_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,13 @@

from typing import Any

from memos.log import get_logger
from memos.templates.instruction_completion import instruct_completion


logger = get_logger(__name__)


def to_iter(running: Any) -> list[Any]:
"""
Normalize running tasks to a list of task objects.
Expand All @@ -29,7 +33,9 @@ def to_iter(running: Any) -> list[Any]:
return list(running) if running else []


def format_memory_item(memory_data: Any, include_embedding: bool = False) -> dict[str, Any]:
def format_memory_item(
memory_data: Any, include_embedding: bool = False, save_sources: bool = True
) -> dict[str, Any]:
"""
Format a single memory item for API response.

Expand All @@ -49,7 +55,8 @@ def format_memory_item(memory_data: Any, include_embedding: bool = False) -> dic
memory["ref_id"] = ref_id
if not include_embedding:
memory["metadata"]["embedding"] = []
memory["metadata"]["sources"] = []
if not save_sources:
memory["metadata"]["sources"] = []
memory["metadata"]["usage"] = []
memory["metadata"]["ref_id"] = ref_id
memory["metadata"]["id"] = memory_id
Expand Down Expand Up @@ -125,3 +132,96 @@ def post_process_textual_mem(
}
)
return memories_result


def separate_knowledge_and_conversation_mem(memories: list[dict[str, Any]]):
"""
Separate knowledge and conversation memories from retrieval results.
"""
knowledge_mem = []
conversation_mem = []
for item in memories:
sources = item["metadata"]["sources"]
if (
len(sources) > 0
and "type" in sources[0]
and sources[0]["type"] == "file"
and "content" in sources[0]
and sources[0]["content"] != ""
): # TODO change to memory_type
knowledge_mem.append(item)
else:
conversation_mem.append(item)

logger.info(
f"Retrieval results number of knowledge_mem: {len(knowledge_mem)}, conversation_mem: {len(conversation_mem)}"
)
return knowledge_mem, conversation_mem


def rerank_knowledge_mem(
reranker: Any,
query: str,
text_mem: list[dict[str, Any]],
top_k: int,
file_mem_proportion: float = 0.5,
) -> list[dict[str, Any]]:
"""
Rerank knowledge memories and keep conversation memories.
"""
memid2cubeid = {}
memories_list = []
for memory_group in text_mem:
cube_id = memory_group["cube_id"]
memories = memory_group["memories"]
memories_list.extend(memories)
for memory in memories:
memid2cubeid[memory["id"]] = cube_id

knowledge_mem, conversation_mem = separate_knowledge_and_conversation_mem(memories_list)
knowledge_mem_top_k = max(int(top_k * file_mem_proportion), int(top_k - len(conversation_mem)))
reranked_knowledge_mem = reranker.rerank(query, knowledge_mem, top_k=len(knowledge_mem))
reranked_knowledge_mem = [item[0] for item in reranked_knowledge_mem]

# TODO revoke sources replace memory value
for item in reranked_knowledge_mem:
item["memory"] = item["metadata"]["sources"][0]["content"]
item["metadata"]["sources"] = []

for item in conversation_mem:
item["metadata"]["sources"] = []

# deduplicate: remove items with duplicate memory content
original_count = len(reranked_knowledge_mem)
seen_memories = set[Any]()
deduplicated_knowledge_mem = []
for item in reranked_knowledge_mem:
memory_content = item.get("memory", "")
if memory_content and memory_content not in seen_memories:
seen_memories.add(memory_content)
deduplicated_knowledge_mem.append(item)
deduplicated_count = len(deduplicated_knowledge_mem)
logger.info(
f"After filtering duplicate knowledge base text from sources, count changed from {original_count} to {deduplicated_count}"
)

reranked_knowledge_mem = deduplicated_knowledge_mem[:knowledge_mem_top_k]
conversation_mem_top_k = top_k - len(reranked_knowledge_mem)
cubeid2memories = {}
text_mem_res = []

for memory in reranked_knowledge_mem + conversation_mem[:conversation_mem_top_k]:
cube_id = memid2cubeid[memory["id"]]
if cube_id not in cubeid2memories:
cubeid2memories[cube_id] = []
cubeid2memories[cube_id].append(memory)

for cube_id, memories in cubeid2memories.items():
text_mem_res.append(
{
"cube_id": cube_id,
"memories": memories,
}
)

return text_mem_res
2 changes: 1 addition & 1 deletion src/memos/api/handlers/memory_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ def handle_get_memories(
preferences, total_pref = naive_mem_cube.pref_mem.get_memory_by_filter(
filter_params, page=get_mem_req.page, page_size=get_mem_req.page_size
)
format_preferences = [format_memory_item(item) for item in preferences]
format_preferences = [format_memory_item(item, save_sources=False) for item in preferences]

return GetMemoryResponse(
message="Memories retrieved successfully",
Expand Down
15 changes: 15 additions & 0 deletions src/memos/api/handlers/search_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@
using dependency injection for better modularity and testability.
"""

import time

from typing import Any

from memos.api.handlers.base_handler import BaseHandler, HandlerDependencies
from memos.api.handlers.formatters_handler import rerank_knowledge_mem
from memos.api.product_models import APISearchRequest, SearchResponse
from memos.log import get_logger
from memos.memories.textual.tree_text_memory.retrieve.retrieve_utils import (
Expand Down Expand Up @@ -69,6 +72,18 @@ def handle_search_memories(self, search_req: APISearchRequest) -> SearchResponse
# Restore original top_k for downstream logic or response metadata
search_req.top_k = original_top_k

start_time = time.time()
text_mem = results["text_mem"]
results["text_mem"] = rerank_knowledge_mem(
self.reranker,
query=search_req.query,
text_mem=text_mem,
top_k=original_top_k,
file_mem_proportion=0.5,
)
rerank_time = time.time() - start_time
self.logger.info(f"[Knowledge_replace_memory_time] Rerank time: {rerank_time} seconds")

self.logger.info(
f"[SearchHandler] Final search results: count={len(results)} results={results}"
)
Expand Down
12 changes: 10 additions & 2 deletions src/memos/reranker/concat.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,18 @@ def concat_original_source(
merge_field = ["sources"] if rerank_source is None else rerank_source.split(",")
documents = []
for item in graph_results:
memory = _TAG1.sub("", m) if isinstance((m := getattr(item, "memory", None)), str) else m
m = item.get("memory") if isinstance(item, dict) else getattr(item, "memory", None)

memory = _TAG1.sub("", m) if isinstance(m, str) else m

sources = []
for field in merge_field:
source = getattr(item.metadata, field, None)
if isinstance(item, dict):
metadata = item.get("metadata", {})
source = metadata.get(field) if isinstance(metadata, dict) else None
else:
source = getattr(item.metadata, field, None) if hasattr(item, "metadata") else None

if source is None:
continue
sources.append((memory, source))
Expand Down
16 changes: 10 additions & 6 deletions src/memos/reranker/http_bge.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ def __init__(
def rerank(
self,
query: str,
graph_results: list[TextualMemoryItem],
graph_results: list[TextualMemoryItem] | list[dict[str, Any]],
top_k: int,
search_priority: dict | None = None,
**kwargs,
Expand Down Expand Up @@ -164,11 +164,15 @@ def rerank(
if self.rerank_source:
documents = concat_original_source(graph_results, self.rerank_source)
else:
documents = [
(_TAG1.sub("", m) if isinstance((m := getattr(item, "memory", None)), str) else m)
for item in graph_results
]
documents = [d for d in documents if isinstance(d, str) and d]
documents = []
filtered_graph_results = []
for item in graph_results:
m = item.get("memory") if isinstance(item, dict) else getattr(item, "memory", None)

if isinstance(m, str) and m:
documents.append(_TAG1.sub("", m))
filtered_graph_results.append(item)
graph_results = filtered_graph_results

logger.info(f"[HTTPBGERerankerSample] query: {query} , documents: {documents[:5]}...")

Expand Down