Skip to content

Commit 2097eae

Browse files
committed
feat: finish a complete version of deep search
1 parent 0b02d3c commit 2097eae

File tree

10 files changed

+293
-112
lines changed

10 files changed

+293
-112
lines changed

src/memos/api/handlers/chat_handler.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,13 @@
3232
from memos.mem_scheduler.schemas.general_schemas import (
3333
ANSWER_LABEL,
3434
QUERY_LABEL,
35-
SearchMode,
3635
)
3736
from memos.mem_scheduler.schemas.message_schemas import ScheduleMessageItem
3837
from memos.templates.mos_prompts import (
3938
FURTHER_SUGGESTION_PROMPT,
4039
get_memos_prompt,
4140
)
42-
from memos.types import MessageList
41+
from memos.types import MessageList, SearchMode
4342

4443

4544
class ChatHandler(BaseHandler):

src/memos/api/handlers/component_init.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ def init_server() -> dict[str, Any]:
215215
searcher: Searcher = tree_mem.get_searcher(
216216
manual_close_internet=os.getenv("ENABLE_INTERNET", "true").lower() == "false",
217217
moscube=False,
218+
process_llm=mem_reader.llm,
218219
)
219220
logger.debug("Searcher created")
220221

@@ -236,6 +237,9 @@ def init_server() -> dict[str, Any]:
236237
# Initialize SchedulerAPIModule
237238
api_module = mem_scheduler.api_module
238239

240+
# TODO: must remove!
241+
mem_scheduler.memos_message_queue.debug_mode_on()
242+
239243
# Start scheduler if enabled
240244
if os.getenv("API_SCHEDULER_ON", "true").lower() == "true":
241245
mem_scheduler.start()

src/memos/api/handlers/search_handler.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,7 @@ def _fine_search(
251251
List of enhanced search results
252252
"""
253253
if FINE_STRATEGY == FineStrategy.DEEP_SEARCH:
254-
return self._deep_search(
255-
search_req=search_req, user_context=user_context, max_thinking_depth=3
256-
)
254+
return self._deep_search(search_req=search_req, user_context=user_context)
257255

258256
target_session_id = search_req.session_id or "default_session"
259257
search_filter = {"session_id": search_req.session_id} if search_req.session_id else None

src/memos/mem_scheduler/analyzer/api_analyzer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import requests
1515

1616
from memos.log import get_logger
17-
from memos.mem_scheduler.schemas.general_schemas import SearchMode
17+
from memos.types import SearchMode
1818

1919

2020
logger = get_logger(__name__)
@@ -681,7 +681,7 @@ def run_all_tests(self, mode=SearchMode.MIXTURE):
681681
print("Using direct test mode")
682682
try:
683683
direct_analyzer = DirectSearchMemoriesAnalyzer()
684-
direct_analyzer.run_all_tests(mode=SearchMode.MIXTURE)
684+
direct_analyzer.run_all_tests(mode=SearchMode.FINE)
685685
except Exception as e:
686686
print(f"Direct test mode failed: {e}")
687687
import traceback

src/memos/mem_scheduler/base_scheduler.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ def init_mem_cube(
155155
self.searcher: Searcher = self.text_mem.get_searcher(
156156
manual_close_internet=os.getenv("ENABLE_INTERNET", "true").lower() == "false",
157157
moscube=False,
158+
process_llm=self.process_llm,
158159
)
159160
else:
160161
self.searcher = searcher
@@ -303,6 +304,26 @@ def replace_working_memory(
303304
query_db_manager.sync_with_orm()
304305

305306
query_history = query_db_manager.obj.get_queries_with_timesort()
307+
308+
original_count = len(original_memory)
309+
# Filter out memories tagged with "mode:fast"
310+
filtered_original_memory = []
311+
for origin_mem in original_memory:
312+
if "mode:fast" not in origin_mem.metadata.tags:
313+
filtered_original_memory.append(origin_mem)
314+
else:
315+
logger.debug(
316+
f"Filtered out memory - ID: {getattr(origin_mem, 'id', 'unknown')}, Tags: {origin_mem.metadata.tags}"
317+
)
318+
# Calculate statistics
319+
filtered_count = original_count - len(filtered_original_memory)
320+
remaining_count = len(filtered_original_memory)
321+
322+
logger.info(
323+
f"Filtering complete. Removed {filtered_count} memories with tag 'mode:fast'. Remaining memories: {remaining_count}"
324+
)
325+
original_memory = filtered_original_memory
326+
306327
memories_with_new_order, rerank_success_flag = (
307328
self.retriever.process_and_rerank_memories(
308329
queries=query_history,

src/memos/mem_scheduler/monitors/dispatcher_monitor.py

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@ def _check_pools_health(self) -> None:
135135
pool_info=pool_info,
136136
stuck_max_interval=4,
137137
)
138-
logger.info(f"Pool '{name}'. is_healthy: {is_healthy}. pool_info: {pool_info}")
139138
with self._pool_lock:
140139
if is_healthy:
141140
pool_info["failure_count"] = 0
@@ -235,23 +234,6 @@ def _check_pool_health(
235234
# If we got here, pool appears healthy
236235
pool_info["last_active"] = get_utc_now()
237236

238-
# Log health status with comprehensive information
239-
if self.dispatcher:
240-
# Check thread activity
241-
active_threads = sum(
242-
1
243-
for t in threading.enumerate()
244-
if t.name.startswith(executor._thread_name_prefix) # pylint: disable=protected-access
245-
)
246-
247-
task_count = self.dispatcher.get_running_task_count()
248-
max_workers = pool_info.get("max_workers", 0)
249-
stuck_count = len(stuck_tasks)
250-
logger.info(
251-
f"Pool health check passed - {active_threads} active threads, "
252-
f"{task_count} running tasks, pool size: {max_workers}, stuck tasks: {stuck_count}"
253-
)
254-
255237
return True, ""
256238

257239
def _restart_pool(self, name: str, pool_info: dict) -> None:

src/memos/memories/textual/tree.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,7 @@ def get_current_memory_size(self, user_name: str | None = None) -> dict[str, int
129129
return self.memory_manager.get_current_memory_size(user_name=user_name)
130130

131131
def get_searcher(
132-
self,
133-
manual_close_internet: bool = False,
134-
moscube: bool = False,
132+
self, manual_close_internet: bool = False, moscube: bool = False, process_llm=None
135133
):
136134
if (self.internet_retriever is not None) and manual_close_internet:
137135
logger.warning(
@@ -144,6 +142,7 @@ def get_searcher(
144142
self.reranker,
145143
internet_retriever=None,
146144
moscube=moscube,
145+
process_llm=process_llm,
147146
)
148147
else:
149148
searcher = Searcher(
@@ -153,6 +152,7 @@ def get_searcher(
153152
self.reranker,
154153
internet_retriever=self.internet_retriever,
155154
moscube=moscube,
155+
process_llm=process_llm,
156156
)
157157
return searcher
158158

0 commit comments

Comments
 (0)