Skip to content

Commit b27bead

Browse files
authored
update scheduler and add operation for dehallucination (#769)
* fix bugs: try to fix bugs in _submit_web_logs * fix bugs: try to address bugs * fix bugs * refactor: modify examples * revise add operation and fix an unbelievable bug * address the bug issues * the doc file has a format problem which has been fixed in this commit * add a range of new feats for the add operation * address the incompatible issue of local scheduler * feat(scheduler): optimize redis queue consumer group management - Proactively ensure consumer groups exist in '_refresh_stream_keys' for newly discovered streams. - Remove redundant consumer group checks in '_read_new_messages_batch' to improve read performance. - Clean up 'seen_streams' cache when streams are deleted to ensure correct group recreation. - This change reduces unnecessary Redis calls during high-frequency polling. * fix(tests): resolve AttributeError in SimpleStructMemReader tests - Import 'parse_json_result' from 'memos.mem_reader.utils' instead of accessing it as an instance attribute. - Fixes 'AttributeError: 'SimpleStructMemReader' object has no attribute 'parse_json_result'' in 'test_parse_json_result_success' and 'test_parse_json_result_failure'. - Remove incorrect mock assignment of 'parse_json_result' in 'test_process_chat_data'. * fix(mem_reader): pass info dict to add_before_search for correct user_id usage - Update 'add_before_search' signature in 'SimpleStructMemReader' to accept 'info' dict. - Pass 'info' (containing 'user_id' and 'session_id') to 'self.searcher.search' instead of using empty strings. - Add 'test_add_before_search' to 'TestSimpleStructMemReader' to verify the fix and ensure 'searcher.search' receives the correct 'info'. - This ensures that memory searches are scoped to the correct user and session. * refactor add_before_search from mem_reader to SingleCubeView * address bugs
1 parent 11b748f commit b27bead

File tree

16 files changed

+713
-248
lines changed

16 files changed

+713
-248
lines changed

docs/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
All documentation has been moved to a separate repository: https://github.com/MemTensor/MemOS-Docs. Please edit documentation there.
22

3-
所有文档已迁移至独立仓库https://github.com/MemTensor/MemOS-Docs。请在该仓库中编辑文档。
3+
所有文档已迁移至独立仓库 https://github.com/MemTensor/MemOS-Docs 。请在该仓库中编辑文档。

examples/mem_scheduler/task_stop_rerun.py renamed to examples/mem_scheduler/scheduler_for_async_tasks.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def my_test_handler(messages: list[ScheduleMessageItem]):
2525
task_id = str(msg.item_id)
2626
file_path = tmp_dir / f"{task_id}.txt"
2727
try:
28-
sleep(1)
28+
sleep(5)
2929
file_path.write_text(f"Task {task_id} processed.\n")
3030
print(f"writing {file_path} done")
3131
except Exception as e:
@@ -58,7 +58,7 @@ def submit_tasks():
5858
mem_scheduler.register_handlers({TEST_HANDLER_LABEL: my_test_handler})
5959

6060
# 10s to restart
61-
mem_scheduler.orchestrator.tasks_min_idle_ms[TEST_HANDLER_LABEL] = 10_000
61+
mem_scheduler.orchestrator.tasks_min_idle_ms[TEST_HANDLER_LABEL] = 5_000
6262

6363
tmp_dir = Path("./tmp")
6464
tmp_dir.mkdir(exist_ok=True)
@@ -88,6 +88,6 @@ def submit_tasks():
8888
print(f"[Result] Final files in tmp: {len(list(tmp_dir.glob('*.txt')))})")
8989

9090
# 7. Stop the scheduler
91+
sleep(20)
9192
print("Stopping the scheduler...")
92-
sleep(5)
9393
mem_scheduler.stop()

src/memos/api/config.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,19 @@
77
import re
88
import time
99

10-
from typing import Any
10+
from typing import TYPE_CHECKING, Any
1111

1212
import requests
1313

1414
from dotenv import load_dotenv
1515

16-
from memos.configs.mem_cube import GeneralMemCubeConfig
17-
from memos.configs.mem_os import MOSConfig
1816
from memos.context.context import ContextThread
19-
from memos.mem_cube.general import GeneralMemCube
17+
18+
19+
if TYPE_CHECKING:
20+
from memos.configs.mem_cube import GeneralMemCubeConfig
21+
from memos.configs.mem_os import MOSConfig
22+
from memos.mem_cube.general import GeneralMemCube
2023

2124

2225
# Load environment variables
@@ -805,8 +808,12 @@ def get_start_default_config() -> dict[str, Any]:
805808
return config
806809

807810
@staticmethod
808-
def create_user_config(user_name: str, user_id: str) -> tuple[MOSConfig, GeneralMemCube]:
811+
def create_user_config(user_name: str, user_id: str) -> tuple["MOSConfig", "GeneralMemCube"]:
809812
"""Create configuration for a specific user."""
813+
from memos.configs.mem_cube import GeneralMemCubeConfig
814+
from memos.configs.mem_os import MOSConfig
815+
from memos.mem_cube.general import GeneralMemCube
816+
810817
openai_config = APIConfig.get_openai_config()
811818
qwen_config = APIConfig.qwen_config()
812819
vllm_config = APIConfig.vllm_config()
@@ -933,12 +940,14 @@ def create_user_config(user_name: str, user_id: str) -> tuple[MOSConfig, General
933940
return default_config, default_mem_cube
934941

935942
@staticmethod
936-
def get_default_cube_config() -> GeneralMemCubeConfig | None:
943+
def get_default_cube_config() -> "GeneralMemCubeConfig | None":
937944
"""Get default cube configuration for product initialization.
938945
939946
Returns:
940947
GeneralMemCubeConfig | None: Default cube configuration if enabled, None otherwise.
941948
"""
949+
from memos.configs.mem_cube import GeneralMemCubeConfig
950+
942951
if not APIConfig.is_default_cube_config_enabled():
943952
return None
944953

src/memos/llms/openai.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ def generate(self, messages: MessageList, **kwargs) -> str:
5959
if self.config.remove_think_prefix:
6060
return remove_thinking_tags(response_content)
6161
if reasoning_content:
62-
return reasoning_content + response_content
63-
return response_content
62+
return reasoning_content + (response_content or "")
63+
return response_content or ""
6464

6565
@timed_with_status(
6666
log_prefix="OpenAI LLM Stream",
@@ -151,7 +151,7 @@ def generate(self, messages: MessageList, **kwargs) -> str:
151151
if self.config.remove_think_prefix:
152152
return remove_thinking_tags(response_content)
153153
else:
154-
return response_content
154+
return response_content or ""
155155

156156
def generate_stream(self, messages: MessageList, **kwargs) -> Generator[str, None, None]:
157157
"""Stream response from Azure OpenAI LLM with optional reasoning support."""

0 commit comments

Comments
 (0)