Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 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
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
99 changes: 97 additions & 2 deletions src/memos/graph_dbs/polardb.py
Original file line number Diff line number Diff line change
Expand Up @@ -1528,7 +1528,97 @@ def get_context_chain(self, id: str, type: str = "FOLLOWS") -> list[str]:
raise NotImplementedError

@timed
def seach_by_keywords(
def seach_by_keywords_like(
self,
query_word: str,
scope: str | None = None,
status: str | None = None,
search_filter: dict | None = None,
user_name: str | None = None,
filter: dict | None = None,
knowledgebase_ids: list[str] | None = None,
**kwargs,
) -> list[dict]:
where_clauses = []

if scope:
where_clauses.append(
f"ag_catalog.agtype_access_operator(properties, '\"memory_type\"'::agtype) = '\"{scope}\"'::agtype"
)
if status:
where_clauses.append(
f"ag_catalog.agtype_access_operator(properties, '\"status\"'::agtype) = '\"{status}\"'::agtype"
)
else:
where_clauses.append(
"ag_catalog.agtype_access_operator(properties, '\"status\"'::agtype) = '\"activated\"'::agtype"
)

# Build user_name filter with knowledgebase_ids support (OR relationship) using common method
user_name_conditions = self._build_user_name_and_kb_ids_conditions_sql(
user_name=user_name,
knowledgebase_ids=knowledgebase_ids,
default_user_name=self.config.user_name,
)

# Add OR condition if we have any user_name conditions
if user_name_conditions:
if len(user_name_conditions) == 1:
where_clauses.append(user_name_conditions[0])
else:
where_clauses.append(f"({' OR '.join(user_name_conditions)})")

# Add search_filter conditions
if search_filter:
for key, value in search_filter.items():
if isinstance(value, str):
where_clauses.append(
f"ag_catalog.agtype_access_operator(properties, '\"{key}\"'::agtype) = '\"{value}\"'::agtype"
)
else:
where_clauses.append(
f"ag_catalog.agtype_access_operator(properties, '\"{key}\"'::agtype) = {value}::agtype"
)

# Build filter conditions using common method
filter_conditions = self._build_filter_conditions_sql(filter)
where_clauses.extend(filter_conditions)

# Build key
where_clauses.append("""(properties -> '"memory"')::text LIKE %s""")
where_clause = f"WHERE {' AND '.join(where_clauses)}" if where_clauses else ""

query = f"""
SELECT
ag_catalog.agtype_access_operator(properties, '"id"'::agtype) AS old_id,
agtype_object_field_text(properties, 'memory') as memory_text
FROM "{self.db_name}_graph"."Memory"
{where_clause}
"""

params = (query_word,)
logger.info(
f"[seach_by_keywords_LIKE start:] user_name: {user_name}, query: {query}, params: {params}"
)
conn = self._get_connection()
try:
with conn.cursor() as cursor:
cursor.execute(query, params)
results = cursor.fetchall()
output = []
for row in results:
oldid = row[0]
id_val = str(oldid)
output.append({"id": id_val})
logger.info(
f"[seach_by_keywords_LIKE end:] user_name: {user_name}, query: {query}, params: {params} recalled: {output}"
)
return output
finally:
self._return_connection(conn)

@timed
def seach_by_keywords_tfidf(
self,
query_words: list[str],
scope: str | None = None,
Expand Down Expand Up @@ -1603,7 +1693,9 @@ def seach_by_keywords(
"""

params = (tsquery_string,)
logger.info(f"[search_by_fulltext] query: {query}, params: {params}")
logger.info(
f"[seach_by_keywords_TFIDF start:] user_name: {user_name}, query: {query}, params: {params}"
)
conn = self._get_connection()
try:
with conn.cursor() as cursor:
Expand All @@ -1615,6 +1707,9 @@ def seach_by_keywords(
id_val = str(oldid)
output.append({"id": id_val})

logger.info(
f"[seach_by_keywords_TFIDF end:] user_name: {user_name}, query: {query}, params: {params} recalled: {output}"
)
return output
finally:
self._return_connection(conn)
Expand Down
26 changes: 18 additions & 8 deletions src/memos/mem_feedback/feedback.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ def __init__(self, config: MemFeedbackConfig):
is_reorganize=self.is_reorganize,
)
self.searcher: Searcher = self.memory_manager.searcher
self.DB_IDX_READY = False

def _batch_embed(self, texts: list[str], embed_bs: int = 5):
embed_bs = 5
Expand Down Expand Up @@ -569,15 +570,24 @@ def process_keyword_replace(self, user_id: str, user_name: str, kwp_judge: dict
original_word = kwp_judge.get("original")
target_word = kwp_judge.get("target")

# retrieve
lang = detect_lang(original_word)
queries = self._tokenize_chinese(original_word) if lang == "zh" else original_word.split()
if self.DB_IDX_READY:
# retrieve
lang = detect_lang(original_word)
queries = (
self._tokenize_chinese(original_word) if lang == "zh" else original_word.split()
)

must_part = f"{' & '.join(queries)}" if len(queries) > 1 else queries[0]
retrieved_ids = self.graph_store.seach_by_keywords([must_part], user_name=user_name)
if len(retrieved_ids) < 1:
retrieved_ids = self.graph_store.search_by_fulltext(
queries, top_k=100, user_name=user_name
must_part = f"{' & '.join(queries)}" if len(queries) > 1 else queries[0]
retrieved_ids = self.graph_store.seach_by_keywords_tfidf(
[must_part], user_name=user_name
)
if len(retrieved_ids) < 1:
retrieved_ids = self.graph_store.search_by_fulltext(
queries, top_k=100, user_name=user_name
)
else:
retrieved_ids = self.graph_store.seach_by_keywords_like(
f"%{original_word}%", user_name=user_name
)

# filter by doc scope
Expand Down
1 change: 1 addition & 0 deletions src/memos/mem_feedback/simple_feedback.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,4 @@ def __init__(
self.mem_reader = mem_reader
self.searcher = searcher
self.stopword_manager = StopwordManager
self.DB_IDX_READY = False
Loading