Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
70373f9
fix playground bug, internet search judge
Dec 4, 2025
d181339
Merge branch 'dev' into feat/fix_palyground_bug
Dec 4, 2025
11cf00a
fix playground internet bug
Dec 4, 2025
6b10ce1
merge dev
Dec 4, 2025
c861f61
modify delete mem
Dec 4, 2025
e638039
modify tool resp bug in multi cube
Dec 4, 2025
dcd3d50
Merge branch 'dev' into feat/fix_palyground_bug
Dec 4, 2025
0c0eff8
Merge branch 'dev' into feat/fix_palyground_bug
Dec 5, 2025
8765dc4
fix bug in playground chat handle and search inter
Dec 5, 2025
1a335db
modify prompt
Dec 5, 2025
18320ff
fix bug in playground
Dec 6, 2025
666b897
fix bug playfround
Dec 6, 2025
275b9b6
Merge branch 'dev' into feat/fix_palyground_bug
Dec 7, 2025
0d22512
fix bug
Dec 7, 2025
d38f55f
Merge branch 'dev' into feat/fix_palyground_bug
Dec 7, 2025
a9eb1f6
fix code
Dec 7, 2025
94ad709
Merge branch 'dev' into feat/fix_palyground_bug
Dec 7, 2025
723a14f
fix model bug in playground
Dec 7, 2025
6f06a23
Merge branch 'dev' into feat/fix_palyground_bug
Dec 7, 2025
a300670
Merge branch 'dev' into feat/fix_palyground_bug
Dec 8, 2025
7ee13b1
Merge branch 'dev' into feat/fix_palyground_bug
Dec 8, 2025
5ab6e92
modify plan b
Dec 8, 2025
1bb0bcd
llm param modify
Dec 8, 2025
1b607e7
Merge branch 'dev' into feat/fix_palyground_bug
Dec 8, 2025
f5bc426
add logger in playground
Dec 8, 2025
a9fa309
modify code
Dec 9, 2025
d2efa24
Merge branch 'dev' into feat/fix_palyground_bug
Dec 9, 2025
9ebfbe1
Merge branch 'dev' into feat/fix_palyground_bug
fridayL Dec 9, 2025
4c055d0
fix bug
Dec 9, 2025
27b4fc4
modify code
Dec 9, 2025
cefeefb
modify code
Dec 9, 2025
7e05fa7
fix bug
Dec 9, 2025
a4f66b1
Merge branch 'dev' into feat/fix_palyground_bug
Dec 9, 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
37 changes: 22 additions & 15 deletions src/memos/api/handlers/chat_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -421,17 +421,21 @@ def generate_chat_response() -> Generator[str, None, None]:
query=chat_req.query,
user_id=chat_req.user_id,
readable_cube_ids=readable_cube_ids,
mode=chat_req.mode,
mode="fast",
internet_search=False,
top_k=chat_req.top_k,
top_k=5,
chat_history=chat_req.history,
session_id=chat_req.session_id,
include_preference=chat_req.include_preference,
include_preference=False,
pref_top_k=chat_req.pref_top_k,
filter=chat_req.filter,
search_tool_memory=False,
playground_search_goal_parser=False,
)
start_time = time.time()
search_response = self.search_handler.handle_search_memories(search_req)
end_time = time.time()
self.logger.info(f"first search time: {end_time - start_time}")

yield f"data: {json.dumps({'type': 'status', 'data': '1'})}\n\n"

Expand All @@ -447,18 +451,9 @@ def generate_chat_response() -> Generator[str, None, None]:

# Prepare reference data (first search)
reference = prepare_reference_data(filtered_memories)
# get preference string
pref_string = search_response.data.get("pref_string", "")

yield f"data: {json.dumps({'type': 'reference', 'data': reference})}\n\n"

# Prepare preference markdown string
if chat_req.include_preference:
pref_list = search_response.data.get("pref_mem") or []
pref_memories = pref_list[0].get("memories", []) if pref_list else []
pref_md_string = self._build_pref_md_string_for_playground(pref_memories)
yield f"data: {json.dumps({'type': 'pref_md_string', 'data': pref_md_string})}\n\n"

# parse goal for internet search
searcher = self.dependencies.searcher
parsed_goal = searcher.task_goal_parser.parse(
Expand Down Expand Up @@ -487,17 +482,22 @@ def generate_chat_response() -> Generator[str, None, None]:
or chat_req.query + (f"{parsed_goal.tags}" if parsed_goal.tags else ""),
user_id=chat_req.user_id,
readable_cube_ids=readable_cube_ids,
mode=chat_req.mode,
mode="fast",
internet_search=chat_req.internet_search,
top_k=chat_req.top_k,
chat_history=chat_req.history,
session_id=chat_req.session_id,
include_preference=False,
include_preference=chat_req.include_preference,
pref_top_k=chat_req.pref_top_k,
filter=chat_req.filter,
search_memory_type="All",
search_tool_memory=False,
playground_search_goal_parser=False,
)
start_time = time.time()
search_response = self.search_handler.handle_search_memories(search_req)
end_time = time.time()
self.logger.info(f"second search time: {end_time - start_time}")

# Extract memories from search results (second search)
memories_list = []
Expand All @@ -516,12 +516,19 @@ def generate_chat_response() -> Generator[str, None, None]:

# Prepare remain reference data (second search)
reference = prepare_reference_data(filtered_memories)
# get preference string
pref_string = search_response.data.get("pref_string", "")
# get internet reference
internet_reference = self._get_internet_reference(
search_response.data.get("text_mem")[0]["memories"]
)

yield f"data: {json.dumps({'type': 'reference', 'data': reference})}\n\n"
# Prepare preference markdown string
if chat_req.include_preference:
pref_list = search_response.data.get("pref_mem") or []
pref_memories = pref_list[0].get("memories", []) if pref_list else []
pref_md_string = self._build_pref_md_string_for_playground(pref_memories)
yield f"data: {json.dumps({'type': 'pref_md_string', 'data': pref_md_string})}\n\n"

# Step 2: Build system prompt with memories
system_prompt = self._build_enhance_system_prompt(
Expand Down
11 changes: 9 additions & 2 deletions src/memos/mem_reader/read_multi_modal/system_parser.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
"""Parser for system messages."""

import ast
import json
import re
import uuid
Expand Down Expand Up @@ -137,8 +138,14 @@ def parse_fine(
tool_schema = json.loads(content)
assert isinstance(tool_schema, list), "Tool schema must be a list[dict]"
except json.JSONDecodeError:
logger.warning(f"[SystemParser] Failed to parse tool schema: {content}")
return []
try:
tool_schema = ast.literal_eval(content)
assert isinstance(tool_schema, list), "Tool schema must be a list[dict]"
except (ValueError, SyntaxError, AssertionError):
logger.warning(
f"[SystemParser] Failed to parse tool schema with both JSON and ast.literal_eval: {content}"
)
return []
except AssertionError:
logger.warning(f"[SystemParser] Tool schema must be a list[dict]: {content}")
return []
Expand Down
11 changes: 11 additions & 0 deletions src/memos/memories/textual/tree.py
Original file line number Diff line number Diff line change
Expand Up @@ -343,6 +343,17 @@ def delete_all(self) -> None:
logger.error(f"An error occurred while deleting all memories: {e}")
raise

def delete_by_filter(
self,
writable_cube_ids: list[str],
file_ids: list[str] | None = None,
filter: dict | None = None,
) -> None:
"""Delete memories by filter."""
self.graph_store.delete_node_by_prams(
writable_cube_ids=writable_cube_ids, file_ids=file_ids, filter=filter
)

def load(self, dir: str) -> None:
try:
memory_file = os.path.join(dir, self.config.memory_filename)
Expand Down
30 changes: 25 additions & 5 deletions src/memos/memories/textual/tree_text_memory/retrieve/searcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -701,15 +701,35 @@ def _sort_and_trim(
"""Sort results by score and trim to top_k"""
final_items = []
if search_tool_memory:
tool_results = [
tool_schema_results = [
(item, score)
for item, score in results
if item.metadata.memory_type in ["ToolSchemaMemory", "ToolTrajectoryMemory"]
if item.metadata.memory_type == "ToolSchemaMemory"
]
sorted_tool_results = sorted(tool_results, key=lambda pair: pair[1], reverse=True)[
:tool_mem_top_k
sorted_tool_schema_results = sorted(
tool_schema_results, key=lambda pair: pair[1], reverse=True
)[:tool_mem_top_k]
for item, score in sorted_tool_schema_results:
if plugin and round(score, 2) == 0.00:
continue
meta_data = item.metadata.model_dump()
meta_data["relativity"] = score
final_items.append(
TextualMemoryItem(
id=item.id,
memory=item.memory,
metadata=SearchedTreeNodeTextualMemoryMetadata(**meta_data),
)
)
tool_trajectory_results = [
(item, score)
for item, score in results
if item.metadata.memory_type == "ToolTrajectoryMemory"
]
for item, score in sorted_tool_results:
sorted_tool_trajectory_results = sorted(
tool_trajectory_results, key=lambda pair: pair[1], reverse=True
)[:tool_mem_top_k]
for item, score in sorted_tool_trajectory_results:
if plugin and round(score, 2) == 0.00:
continue
meta_data = item.metadata.model_dump()
Expand Down
5 changes: 4 additions & 1 deletion src/memos/multi_mem_cube/single_cube.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
SearchMode,
UserContext,
)
from memos.utils import timed


logger = get_logger(__name__)
Expand Down Expand Up @@ -198,6 +199,7 @@ def _get_search_mode(self, mode: str) -> str:
"""
return mode

@timed
def _search_text(
self,
search_req: APISearchRequest,
Expand Down Expand Up @@ -363,6 +365,7 @@ def _fine_search(

return formatted_memories

@timed
def _search_pref(
self,
search_req: APISearchRequest,
Expand Down Expand Up @@ -429,7 +432,7 @@ def _fast_search(
top_k=search_req.top_k,
mode=SearchMode.FAST,
manual_close_internet=not search_req.internet_search,
momory_type=search_req.search_memory_type,
memory_type=search_req.search_memory_type,
search_filter=search_filter,
search_priority=search_priority,
info={
Expand Down