From d1ba6cd5ff1c79f0a43a350962a8a1feb48bf906 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=BB=91=E5=B8=83=E6=9E=97?=
<11641432+heiheiyouyou@user.noreply.gitee.com>
Date: Fri, 6 Mar 2026 11:35:13 +0800
Subject: [PATCH 1/4] add log
---
src/memos/graph_dbs/polardb.py | 2 +-
.../textual/tree_text_memory/retrieve/recall.py | 2 ++
.../textual/tree_text_memory/retrieve/searcher.py | 11 +++++++++--
3 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/src/memos/graph_dbs/polardb.py b/src/memos/graph_dbs/polardb.py
index 8332efbc1..c8ed0a97f 100644
--- a/src/memos/graph_dbs/polardb.py
+++ b/src/memos/graph_dbs/polardb.py
@@ -1919,7 +1919,7 @@ def search_by_embedding(
else:
pass
- logger.info(" search_by_embedding query: %s", query)
+ logger.info(" search_by_embedding query: %s user_name: %s", query, user_name)
with self._get_connection() as conn, conn.cursor() as cursor:
if params:
diff --git a/src/memos/memories/textual/tree_text_memory/retrieve/recall.py b/src/memos/memories/textual/tree_text_memory/retrieve/recall.py
index dd90b8932..241825e8d 100644
--- a/src/memos/memories/textual/tree_text_memory/retrieve/recall.py
+++ b/src/memos/memories/textual/tree_text_memory/retrieve/recall.py
@@ -61,6 +61,7 @@ def retrieve(
Returns:
list: Combined memory items.
"""
+ logger.info(f"[0306 recall retrieve] query: {query}, user_name: {user_name}")
if memory_scope not in [
"WorkingMemory",
"LongTermMemory",
@@ -341,6 +342,7 @@ def _vector_recall(
return []
def search_single(vec, search_priority=None, search_filter=None):
+ logger.info(f"[0306 recall _vector_recall search_single] user_name: {user_name}")
return (
self.graph_store.search_by_embedding(
vector=vec,
diff --git a/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py b/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py
index b4994671f..faa83ffa5 100644
--- a/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py
+++ b/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py
@@ -92,7 +92,7 @@ def retrieve(
**kwargs,
) -> list[tuple[TextualMemoryItem, float]]:
logger.info(
- f"[RECALL] Start query='{query}', top_k={top_k}, mode={mode}, memory_type={memory_type}"
+ f"[RECALL] Start query='{query}', top_k={top_k}, mode={mode}, memory_type={memory_type}, user_name={user_name}"
)
parsed_goal, query_embedding, _context, query = self._parse_task(
query,
@@ -203,6 +203,7 @@ def search(
else:
logger.debug(f"[SEARCH] Received info dict: {info}")
+ logger.info(f"[0306 searcher searcher.search] query: {query}, user_name: {user_name}")
if kwargs.get("plugin", False):
logger.info(f"[SEARCH] Retrieve from plugin: {query}")
retrieved_results = self._retrieve_simple(
@@ -353,6 +354,7 @@ def _retrieve_paths(
"session_id": info.get("session_id", None),
}
id_filter = {k: v for k, v in id_filter.items() if v is not None}
+ logger.info(f"[0306 searcher _retrieve_paths] query: {query}, user_name: {user_name}")
with ContextThreadPoolExecutor(max_workers=5) as executor:
tasks.append(
@@ -629,7 +631,9 @@ def _retrieve_from_long_term_and_user(
cot_embeddings.extend(query_embedding)
else:
cot_embeddings = query_embedding
-
+ logger.info(
+ f"[0306 searcher _retrieve_from_long_term_and_user] query: {query}, user_name: {user_name}"
+ )
with ContextThreadPoolExecutor(max_workers=3) as executor:
if memory_type in ["All", "AllSummaryMemory", "LongTermMemory"]:
tasks.append(
@@ -859,6 +863,9 @@ def _retrieve_from_skill_memory(
mode: str = "fast",
):
"""Retrieve and rerank from SkillMemory"""
+ logger.info(
+ f"[0306 searcher _retrieve_from_skill_memory] query: {query}, user_name: {user_name}"
+ )
if memory_type not in ["All", "SkillMemory"]:
logger.info(f"[PATH-E] '{query}' Skipped (memory_type does not match)")
return []
From 500ff88ce49aea0a514610950f6146ea3e4b6521 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=BB=91=E5=B8=83=E6=9E=97?=
<11641432+heiheiyouyou@user.noreply.gitee.com>
Date: Fri, 6 Mar 2026 11:38:15 +0800
Subject: [PATCH 2/4] add log
---
README.md | 34 +++++++++----------
docker/Dockerfile.krolik | 2 +-
.../data/mem_cube_tree/textual_memory.json | 2 +-
src/memos/mem_os/utils/default_config.py | 2 ++
4 files changed, 21 insertions(+), 19 deletions(-)
diff --git a/README.md b/README.md
index 45a372ed1..834e53021 100644
--- a/README.md
+++ b/README.md
@@ -42,7 +42,7 @@
-
+
@@ -55,7 +55,7 @@
-
+
Get Free API: [Try API](https://memos-dashboard.openmem.net/quickstart/?source=github)
@@ -68,11 +68,11 @@ Get Free API: [Try API](https://memos-dashboard.openmem.net/quickstart/?source=g

- [**72% lower token usage**](https://x.com/MemOS_dev/status/2020854044583924111) โ intelligent memory retrieval instead of loading full chat history
-- [**Multi-agent memory sharing**](https://x.com/MemOS_dev/status/2020538135487062094) โ multi-instance agents share memory via same user_id. Automatic context handoff.
+- [**Multi-agent memory sharing**](https://x.com/MemOS_dev/status/2020538135487062094) โ multi-instance agents share memory via same user_id. Automatic context handoff.
๐ฆ Your lobster now has a working memory system.
-Get your API key: [MemOS Dashboard](https://memos-dashboard.openmem.net/cn/login/)
+Get your API key: [MemOS Dashboard](https://memos-dashboard.openmem.net/cn/login/)
Try it: Full tutorial โ [MemOS-Cloud-OpenClaw-Plugin](https://github.com/MemTensor/MemOS-Cloud-OpenClaw-Plugin)
## ๐ MemOS: Memory Operating System for AI Agents
@@ -92,7 +92,7 @@ Try it: Full tutorial โ [MemOS-Cloud-OpenClaw-Plugin](https://github.com/MemTe
### News
-- **2025-12-24** ยท ๐ **MemOS v2.0: Stardust (ๆๅฐ) Release**
+- **2025-12-24** ยท ๐ **MemOS v2.0: Stardust (ๆๅฐ) Release**
Comprehensive KB (doc/URL parsing + cross-project sharing), memory feedback & precise deletion, multi-modal memory (images/charts), tool memory for agent planning, Redis Streams scheduling + DB optimizations, streaming/non-streaming chat, MCP upgrade, and lightweight quick/full deployment.
โจ New Features
@@ -139,7 +139,7 @@ Try it: Full tutorial โ [MemOS-Cloud-OpenClaw-Plugin](https://github.com/MemTe
-- **2025-08-07** ยท ๐ **MemOS v1.0.0 (MemCube) Release**
+- **2025-08-07** ยท ๐ **MemOS v1.0.0 (MemCube) Release**
First MemCube release with a word-game demo, LongMemEval evaluation, BochaAISearchRetriever integration, NebulaGraph support, improved search capabilities, and the official Playground launch.
@@ -177,11 +177,11 @@ Try it: Full tutorial โ [MemOS-Cloud-OpenClaw-Plugin](https://github.com/MemTe
-- **2025-07-07** ยท ๐ **MemOS v1.0: Stellar (ๆๆฒณ) Preview Release**
+- **2025-07-07** ยท ๐ **MemOS v1.0: Stellar (ๆๆฒณ) Preview Release**
A SOTA Memory OS for LLMs is now open-sourced.
-- **2025-07-04** ยท ๐ **MemOS Paper Release**
+- **2025-07-04** ยท ๐ **MemOS Paper Release**
[MemOS: A Memory OS for AI System](https://arxiv.org/abs/2507.03724) is available on arXiv.
-- **2024-07-04** ยท ๐ **Memory3 Model Release at WAIC 2024**
+- **2024-07-04** ยท ๐ **Memory3 Model Release at WAIC 2024**
The Memory3 model, featuring a memory-layered architecture, was unveiled at the 2024 World Artificial Intelligence Conference.
@@ -194,9 +194,9 @@ Try it: Full tutorial โ [MemOS-Cloud-OpenClaw-Plugin](https://github.com/MemTe
- Go to **API Keys** and copy your key
#### Next Steps
-- [MemOS Cloud Getting Started](https://memos-docs.openmem.net/memos_cloud/quick_start/)
+- [MemOS Cloud Getting Started](https://memos-docs.openmem.net/memos_cloud/quick_start/)
Connect to MemOS Cloud and enable memory in minutes.
-- [MemOS Cloud Platform](https://memos.openmem.net/?from=/quickstart/)
+- [MemOS Cloud Platform](https://memos.openmem.net/?from=/quickstart/)
Explore the Cloud dashboard, features, and workflows.
### ๐ฅ๏ธ 2ใSelf-Hosted (Local/Private)
@@ -234,7 +234,7 @@ Try it: Full tutorial โ [MemOS-Cloud-OpenClaw-Plugin](https://github.com/MemTe
```python
import requests
import json
-
+
data = {
"user_id": "8736b16e-1d20-4163-980b-a5063c3facdc",
"mem_cube_id": "b32d0977-435d-4828-a86f-4f47f8b55bca",
@@ -250,7 +250,7 @@ Try it: Full tutorial โ [MemOS-Cloud-OpenClaw-Plugin](https://github.com/MemTe
"Content-Type": "application/json"
}
url = "http://localhost:8000/product/add"
-
+
res = requests.post(url=url, headers=headers, data=json.dumps(data))
print(f"result: {res.json()}")
```
@@ -258,7 +258,7 @@ Try it: Full tutorial โ [MemOS-Cloud-OpenClaw-Plugin](https://github.com/MemTe
```python
import requests
import json
-
+
data = {
"query": "What do I like",
"user_id": "8736b16e-1d20-4163-980b-a5063c3facdc",
@@ -268,7 +268,7 @@ Try it: Full tutorial โ [MemOS-Cloud-OpenClaw-Plugin](https://github.com/MemTe
"Content-Type": "application/json"
}
url = "http://localhost:8000/product/search"
-
+
res = requests.post(url=url, headers=headers, data=json.dumps(data))
print(f"result: {res.json()}")
```
@@ -277,8 +277,8 @@ Try it: Full tutorial โ [MemOS-Cloud-OpenClaw-Plugin](https://github.com/MemTe
## ๐ Resources
-- **Awesome-AI-Memory**
- This is a curated repository dedicated to resources on memory and memory systems for large language models. It systematically collects relevant research papers, frameworks, tools, and practical insights. The repository aims to organize and present the rapidly evolving research landscape of LLM memory, bridging multiple research directions including natural language processing, information retrieval, agentic systems, and cognitive science.
+- **Awesome-AI-Memory**
+ This is a curated repository dedicated to resources on memory and memory systems for large language models. It systematically collects relevant research papers, frameworks, tools, and practical insights. The repository aims to organize and present the rapidly evolving research landscape of LLM memory, bridging multiple research directions including natural language processing, information retrieval, agentic systems, and cognitive science.
- **Get started** ๐ [IAAR-Shanghai/Awesome-AI-Memory](https://github.com/IAAR-Shanghai/Awesome-AI-Memory)
- **MemOS Cloud OpenClaw Plugin**
Official OpenClaw lifecycle plugin for MemOS Cloud. It automatically recalls context from MemOS before the agent starts and saves the conversation back to MemOS after the agent finishes.
diff --git a/docker/Dockerfile.krolik b/docker/Dockerfile.krolik
index c475a6d30..dcae7e0d9 100644
--- a/docker/Dockerfile.krolik
+++ b/docker/Dockerfile.krolik
@@ -1,5 +1,5 @@
# MemOS with Krolik Security Extensions
-#
+#
# This Dockerfile builds MemOS with authentication, rate limiting, and admin API.
# It uses the overlay pattern to keep customizations separate from base code.
diff --git a/examples/data/mem_cube_tree/textual_memory.json b/examples/data/mem_cube_tree/textual_memory.json
index 91f426ca2..97a2b1dd0 100644
--- a/examples/data/mem_cube_tree/textual_memory.json
+++ b/examples/data/mem_cube_tree/textual_memory.json
@@ -4216,4 +4216,4 @@
"edges": [],
"total_nodes": 4,
"total_edges": 0
-}
\ No newline at end of file
+}
diff --git a/src/memos/mem_os/utils/default_config.py b/src/memos/mem_os/utils/default_config.py
index 9898cbe8c..de79d535d 100644
--- a/src/memos/mem_os/utils/default_config.py
+++ b/src/memos/mem_os/utils/default_config.py
@@ -4,12 +4,14 @@
"""
import logging
+
from typing import Literal
from memos.configs.mem_cube import GeneralMemCubeConfig
from memos.configs.mem_os import MOSConfig
from memos.mem_cube.general import GeneralMemCube
+
logger = logging.getLogger(__name__)
From d77082747c8ef9f846bb3845e3d0247bf469253d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=BB=91=E5=B8=83=E6=9E=97?=
<11641432+heiheiyouyou@user.noreply.gitee.com>
Date: Fri, 6 Mar 2026 13:11:26 +0800
Subject: [PATCH 3/4] add log
---
src/memos/mem_feedback/feedback.py | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/src/memos/mem_feedback/feedback.py b/src/memos/mem_feedback/feedback.py
index 18045af2c..a9d2dda7e 100644
--- a/src/memos/mem_feedback/feedback.py
+++ b/src/memos/mem_feedback/feedback.py
@@ -363,6 +363,7 @@ def semantics_feedback(
# retrieve
last_user_index = max(i for i, d in enumerate(chat_history_list) if d["role"] == "user")
last_qa = " ".join([item["content"] for item in chat_history_list[last_user_index:]])
+ logger.info(f"[0306 feedback semantics_feedback] user_name: {user_name}")
supplementary_retrieved = self._retrieve(last_qa, info=info, user_name=user_name)
feedback_retrieved = self._retrieve(memory_item.memory, info=info, user_name=user_name)
@@ -504,6 +505,7 @@ def _feedback_memory(
if "mode:fast" not in item["metadata"]["tags"]
]
+ logger.info(f"[0306 feedback _feedback_memory] user_name: {user_name}")
with ContextThreadPoolExecutor(max_workers=3) as ex:
futures = {
ex.submit(
@@ -559,23 +561,25 @@ def check_has_edges(mem_item: TextualMemoryItem) -> tuple[TextualMemoryItem, boo
edges = self.searcher.graph_store.get_edges(mem_item.id, user_name=user_name)
return (mem_item, len(edges) == 0)
+ logger.info(f"[0306 feedback _retrieve] user_name: {user_name}")
text_mems = self.searcher.search(
- query,
+ query=query,
+ top_k=top_k,
info=info,
memory_type="AllSummaryMemory",
user_name=user_name,
- top_k=top_k,
full_recall=True,
)
text_mems = [item[0] for item in text_mems if float(item[1]) > 0.01]
if self.pref_feedback:
+ logger.info(f"[0306 feedback _retrieve pref_feedback] user_name: {user_name}")
pref_mems = self.searcher.search(
- query,
+ query=query,
+ top_k=top_k,
info=info,
memory_type="PreferenceMemory",
user_name=user_name,
- top_k=top_k,
include_preference_memory=True,
full_recall=True,
)
From 9e50e99bd9c51e9a95bc6cddea84875ffc9a8549 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=BB=91=E5=B8=83=E6=9E=97?=
<11641432+heiheiyouyou@user.noreply.gitee.com>
Date: Fri, 6 Mar 2026 13:28:13 +0800
Subject: [PATCH 4/4] hot fix
---
src/memos/mem_feedback/feedback.py | 5 +----
.../textual/tree_text_memory/retrieve/recall.py | 2 --
.../textual/tree_text_memory/retrieve/searcher.py | 10 ++--------
3 files changed, 3 insertions(+), 14 deletions(-)
diff --git a/src/memos/mem_feedback/feedback.py b/src/memos/mem_feedback/feedback.py
index a9d2dda7e..b8019004d 100644
--- a/src/memos/mem_feedback/feedback.py
+++ b/src/memos/mem_feedback/feedback.py
@@ -363,7 +363,6 @@ def semantics_feedback(
# retrieve
last_user_index = max(i for i, d in enumerate(chat_history_list) if d["role"] == "user")
last_qa = " ".join([item["content"] for item in chat_history_list[last_user_index:]])
- logger.info(f"[0306 feedback semantics_feedback] user_name: {user_name}")
supplementary_retrieved = self._retrieve(last_qa, info=info, user_name=user_name)
feedback_retrieved = self._retrieve(memory_item.memory, info=info, user_name=user_name)
@@ -505,7 +504,6 @@ def _feedback_memory(
if "mode:fast" not in item["metadata"]["tags"]
]
- logger.info(f"[0306 feedback _feedback_memory] user_name: {user_name}")
with ContextThreadPoolExecutor(max_workers=3) as ex:
futures = {
ex.submit(
@@ -561,7 +559,7 @@ def check_has_edges(mem_item: TextualMemoryItem) -> tuple[TextualMemoryItem, boo
edges = self.searcher.graph_store.get_edges(mem_item.id, user_name=user_name)
return (mem_item, len(edges) == 0)
- logger.info(f"[0306 feedback _retrieve] user_name: {user_name}")
+ logger.info(f"[feedback _retrieve] query: {query}, user_name: {user_name}")
text_mems = self.searcher.search(
query=query,
top_k=top_k,
@@ -573,7 +571,6 @@ def check_has_edges(mem_item: TextualMemoryItem) -> tuple[TextualMemoryItem, boo
text_mems = [item[0] for item in text_mems if float(item[1]) > 0.01]
if self.pref_feedback:
- logger.info(f"[0306 feedback _retrieve pref_feedback] user_name: {user_name}")
pref_mems = self.searcher.search(
query=query,
top_k=top_k,
diff --git a/src/memos/memories/textual/tree_text_memory/retrieve/recall.py b/src/memos/memories/textual/tree_text_memory/retrieve/recall.py
index 241825e8d..dd90b8932 100644
--- a/src/memos/memories/textual/tree_text_memory/retrieve/recall.py
+++ b/src/memos/memories/textual/tree_text_memory/retrieve/recall.py
@@ -61,7 +61,6 @@ def retrieve(
Returns:
list: Combined memory items.
"""
- logger.info(f"[0306 recall retrieve] query: {query}, user_name: {user_name}")
if memory_scope not in [
"WorkingMemory",
"LongTermMemory",
@@ -342,7 +341,6 @@ def _vector_recall(
return []
def search_single(vec, search_priority=None, search_filter=None):
- logger.info(f"[0306 recall _vector_recall search_single] user_name: {user_name}")
return (
self.graph_store.search_by_embedding(
vector=vec,
diff --git a/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py b/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py
index faa83ffa5..eb15b48ed 100644
--- a/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py
+++ b/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py
@@ -203,7 +203,6 @@ def search(
else:
logger.debug(f"[SEARCH] Received info dict: {info}")
- logger.info(f"[0306 searcher searcher.search] query: {query}, user_name: {user_name}")
if kwargs.get("plugin", False):
logger.info(f"[SEARCH] Retrieve from plugin: {query}")
retrieved_results = self._retrieve_simple(
@@ -354,7 +353,6 @@ def _retrieve_paths(
"session_id": info.get("session_id", None),
}
id_filter = {k: v for k, v in id_filter.items() if v is not None}
- logger.info(f"[0306 searcher _retrieve_paths] query: {query}, user_name: {user_name}")
with ContextThreadPoolExecutor(max_workers=5) as executor:
tasks.append(
@@ -631,9 +629,7 @@ def _retrieve_from_long_term_and_user(
cot_embeddings.extend(query_embedding)
else:
cot_embeddings = query_embedding
- logger.info(
- f"[0306 searcher _retrieve_from_long_term_and_user] query: {query}, user_name: {user_name}"
- )
+
with ContextThreadPoolExecutor(max_workers=3) as executor:
if memory_type in ["All", "AllSummaryMemory", "LongTermMemory"]:
tasks.append(
@@ -863,9 +859,7 @@ def _retrieve_from_skill_memory(
mode: str = "fast",
):
"""Retrieve and rerank from SkillMemory"""
- logger.info(
- f"[0306 searcher _retrieve_from_skill_memory] query: {query}, user_name: {user_name}"
- )
+
if memory_type not in ["All", "SkillMemory"]:
logger.info(f"[PATH-E] '{query}' Skipped (memory_type does not match)")
return []