Skip to content

Commit d3e5d3b

Browse files
authored
fix bugs: fix bugs in the example of memos_w_scheduler and fix bugs o… (#147)
* fix bugs: fix bugs in the example of memos_w_scheduler and fix bugs of log submittion in MOS * fix bugs: modify mos product, and add more exception catch code
1 parent e385ce0 commit d3e5d3b

File tree

12 files changed

+179
-150
lines changed

12 files changed

+179
-150
lines changed

examples/data/config/mem_scheduler/memos_config_w_scheduler_and_openai.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ mem_scheduler:
4141
thread_pool_max_workers: 10
4242
consume_interval_seconds: 1
4343
enable_parallel_dispatch: true
44+
enable_act_memory_update: false
4445
max_turns_window: 20
4546
top_k: 5
4647
enable_textual_memory: true
Lines changed: 18 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,17 @@
11
import shutil
22
import sys
33

4-
from datetime import datetime
54
from pathlib import Path
65
from queue import Queue
76
from typing import TYPE_CHECKING
87

98
from memos.configs.mem_cube import GeneralMemCubeConfig
109
from memos.configs.mem_os import MOSConfig
11-
from memos.configs.mem_scheduler import AuthConfig, SchedulerConfigFactory
10+
from memos.configs.mem_scheduler import AuthConfig
1211
from memos.log import get_logger
1312
from memos.mem_cube.general import GeneralMemCube
1413
from memos.mem_os.main import MOS
1514
from memos.mem_scheduler.general_scheduler import GeneralScheduler
16-
from memos.mem_scheduler.scheduler_factory import SchedulerFactory
17-
from memos.mem_scheduler.schemas.general_schemas import (
18-
ANSWER_LABEL,
19-
QUERY_LABEL,
20-
)
21-
from memos.mem_scheduler.schemas.message_schemas import ScheduleMessageItem
22-
from memos.mem_scheduler.utils.misc_utils import parse_yaml
2315

2416

2517
if TYPE_CHECKING:
@@ -78,122 +70,56 @@ def init_task():
7870
return conversations, questions
7971

8072

81-
def run_with_automatic_scheduler_init():
73+
def run_with_scheduler_init():
8274
print("==== run_with_automatic_scheduler_init ====")
8375
conversations, questions = init_task()
8476

85-
config = parse_yaml(
86-
f"{BASE_DIR}/examples/data/config/mem_scheduler/memos_config_w_scheduler.yaml"
77+
# set configs
78+
mos_config = MOSConfig.from_yaml_file(
79+
f"{BASE_DIR}/examples/data/config/mem_scheduler/memos_config_w_scheduler_and_openai.yaml"
8780
)
8881

89-
mos_config = MOSConfig(**config)
90-
mos = MOS(mos_config)
91-
92-
user_id = "user_1"
93-
mos.create_user(user_id)
94-
95-
config = GeneralMemCubeConfig.from_yaml_file(
82+
mem_cube_config = GeneralMemCubeConfig.from_yaml_file(
9683
f"{BASE_DIR}/examples/data/config/mem_scheduler/mem_cube_config.yaml"
9784
)
98-
mem_cube_id = "mem_cube_5"
99-
mem_cube_name_or_path = f"{BASE_DIR}/outputs/mem_scheduler/{user_id}/{mem_cube_id}"
100-
if Path(mem_cube_name_or_path).exists():
101-
shutil.rmtree(mem_cube_name_or_path)
102-
print(f"{mem_cube_name_or_path} is not empty, and has been removed.")
10385

10486
# default local graphdb uri
10587
if AuthConfig.default_config_exists():
10688
auth_config = AuthConfig.from_local_yaml()
107-
config.text_mem.config.graph_db.config.uri = auth_config.graph_db.uri
10889

109-
mem_cube = GeneralMemCube(config)
110-
mem_cube.dump(mem_cube_name_or_path)
111-
mos.register_mem_cube(
112-
mem_cube_name_or_path=mem_cube_name_or_path, mem_cube_id=mem_cube_id, user_id=user_id
113-
)
114-
mos.add(conversations, user_id=user_id, mem_cube_id=mem_cube_id)
90+
mos_config.mem_reader.config.llm.config.api_key = auth_config.openai.api_key
91+
mos_config.mem_reader.config.llm.config.api_base = auth_config.openai.base_url
11592

116-
for item in questions:
117-
query = item["question"]
118-
response = mos.chat(query, user_id=user_id)
119-
print(f"Query:\n {query}\n\nAnswer:\n {response}")
93+
mem_cube_config.text_mem.config.graph_db.config.uri = auth_config.graph_db.uri
12094

121-
show_web_logs(mem_scheduler=mos.mem_scheduler)
122-
123-
mos.mem_scheduler.stop()
124-
125-
126-
def run_with_manual_scheduler_init():
127-
print("==== run_with_manual_scheduler_init ====")
128-
conversations, questions = init_task()
129-
130-
config = parse_yaml(
131-
f"{BASE_DIR}/examples/data/config/mem_scheduler/memos_config_wo_scheduler.yaml"
132-
)
133-
134-
mos_config = MOSConfig(**config)
95+
# Initialization
13596
mos = MOS(mos_config)
13697

13798
user_id = "user_1"
13899
mos.create_user(user_id)
139100

140-
config = GeneralMemCubeConfig.from_yaml_file(
141-
f"{BASE_DIR}/examples/data/config/mem_scheduler/mem_cube_config.yaml"
142-
)
143101
mem_cube_id = "mem_cube_5"
144102
mem_cube_name_or_path = f"{BASE_DIR}/outputs/mem_scheduler/{user_id}/{mem_cube_id}"
103+
145104
if Path(mem_cube_name_or_path).exists():
146105
shutil.rmtree(mem_cube_name_or_path)
147106
print(f"{mem_cube_name_or_path} is not empty, and has been removed.")
148107

149-
# default local graphdb uri
150-
if AuthConfig.default_config_exists():
151-
auth_config = AuthConfig.from_local_yaml()
152-
config.text_mem.config.graph_db.config.uri = auth_config.graph_db.uri
153-
154-
mem_cube = GeneralMemCube(config)
108+
mem_cube = GeneralMemCube(mem_cube_config)
155109
mem_cube.dump(mem_cube_name_or_path)
156110
mos.register_mem_cube(
157111
mem_cube_name_or_path=mem_cube_name_or_path, mem_cube_id=mem_cube_id, user_id=user_id
158112
)
159113

160-
example_scheduler_config_path = (
161-
f"{BASE_DIR}/examples/data/config/mem_scheduler/general_scheduler_config.yaml"
162-
)
163-
scheduler_config = SchedulerConfigFactory.from_yaml_file(
164-
yaml_path=example_scheduler_config_path
165-
)
166-
mem_scheduler = SchedulerFactory.from_config(scheduler_config)
167-
mem_scheduler.initialize_modules(chat_llm=mos.chat_llm)
168-
169-
mos.mem_scheduler = mem_scheduler
170-
171-
mos.mem_scheduler.start()
172-
173114
mos.add(conversations, user_id=user_id, mem_cube_id=mem_cube_id)
174115

175116
for item in questions:
117+
print("===== Chat Start =====")
176118
query = item["question"]
177-
message_item = ScheduleMessageItem(
178-
user_id=user_id,
179-
mem_cube_id=mem_cube_id,
180-
label=QUERY_LABEL,
181-
mem_cube=mos.mem_cubes[mem_cube_id],
182-
content=query,
183-
timestamp=datetime.now(),
184-
)
185-
mos.mem_scheduler.submit_messages(messages=message_item)
186-
response = mos.chat(query, user_id=user_id)
187-
message_item = ScheduleMessageItem(
188-
user_id=user_id,
189-
mem_cube_id=mem_cube_id,
190-
label=ANSWER_LABEL,
191-
mem_cube=mos.mem_cubes[mem_cube_id],
192-
content=response,
193-
timestamp=datetime.now(),
194-
)
195-
mos.mem_scheduler.submit_messages(messages=message_item)
196-
print(f"Query:\n {query}\n\nAnswer:\n {response}")
119+
print(f"Query:\n {query}\n")
120+
response = mos.chat(query=query, user_id=user_id)
121+
print(f"Answer:\n {response}")
122+
print("===== Chat End =====")
197123

198124
show_web_logs(mem_scheduler=mos.mem_scheduler)
199125

@@ -236,6 +162,4 @@ def show_web_logs(mem_scheduler: GeneralScheduler):
236162

237163

238164
if __name__ == "__main__":
239-
run_with_automatic_scheduler_init()
240-
241-
run_with_manual_scheduler_init()
165+
run_with_scheduler_init()

src/memos/mem_os/core.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from memos.mem_scheduler.schemas.general_schemas import (
1818
ADD_LABEL,
1919
ANSWER_LABEL,
20+
QUERY_LABEL,
2021
)
2122
from memos.mem_scheduler.schemas.message_schemas import ScheduleMessageItem
2223
from memos.mem_user.user_manager import UserManager, UserRole
@@ -267,7 +268,7 @@ def chat(self, query: str, user_id: str | None = None, base_prompt: str | None =
267268
user_id=target_user_id,
268269
mem_cube_id=mem_cube_id,
269270
mem_cube=mem_cube,
270-
label=ADD_LABEL,
271+
label=QUERY_LABEL,
271272
content=query,
272273
timestamp=datetime.now(),
273274
)

src/memos/mem_os/product.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -704,7 +704,9 @@ def chat_with_references(
704704
"""
705705

706706
self._load_user_cubes(user_id, self.default_cube_config)
707-
707+
self._send_message_to_scheduler(
708+
user_id=user_id, mem_cube_id=cube_id, query=query, label=QUERY_LABEL
709+
)
708710
time_start = time.time()
709711
memories_list = []
710712
memories_result = super().search(
@@ -808,9 +810,6 @@ def chat_with_references(
808810
yield f"data: {json.dumps({'type': 'reference', 'data': reference})}\n\n"
809811
total_time = round(float(time_end - time_start), 1)
810812
yield f"data: {json.dumps({'type': 'time', 'data': {'total_time': total_time, 'speed_improvement': '23%'}})}\n\n"
811-
self._send_message_to_scheduler(
812-
user_id=user_id, mem_cube_id=cube_id, query=query, label=QUERY_LABEL
813-
)
814813
self._send_message_to_scheduler(
815814
user_id=user_id, mem_cube_id=cube_id, query=full_response, label=ANSWER_LABEL
816815
)

src/memos/mem_scheduler/base_scheduler.py

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
DEFAULT_ACT_MEM_DUMP_PATH,
2121
DEFAULT_CONSUME_INTERVAL_SECONDS,
2222
DEFAULT_THREAD__POOL_MAX_WORKERS,
23+
MemCubeID,
2324
TreeTextMemory_SEARCH_METHOD,
25+
UserID,
2426
)
2527
from memos.mem_scheduler.schemas.message_schemas import (
2628
ScheduleLogForWebItem,
@@ -81,7 +83,7 @@ def __init__(self, config: BaseSchedulerConfig):
8183

8284
# other attributes
8385
self._context_lock = threading.Lock()
84-
self._current_user_id: str | None = None
86+
self.current_user_id: UserID | str | None = None
8587
self.auth_config_path: str | Path | None = self.config.get("auth_config_path", None)
8688
self.auth_config = None
8789
self.rabbitmq_config = None
@@ -113,20 +115,20 @@ def initialize_modules(self, chat_llm: BaseLLM, process_llm: BaseLLM | None = No
113115
@property
114116
def mem_cube(self) -> GeneralMemCube:
115117
"""The memory cube associated with this MemChat."""
116-
return self._current_mem_cube
118+
return self.current_mem_cube
117119

118120
@mem_cube.setter
119121
def mem_cube(self, value: GeneralMemCube) -> None:
120122
"""The memory cube associated with this MemChat."""
121-
self._current_mem_cube = value
123+
self.current_mem_cube = value
122124
self.retriever.mem_cube = value
123125

124126
def _set_current_context_from_message(self, msg: ScheduleMessageItem) -> None:
125127
"""Update current user/cube context from the incoming message (thread-safe)."""
126128
with self._context_lock:
127-
self._current_user_id = msg.user_id
128-
self._current_mem_cube_id = msg.mem_cube_id
129-
self._current_mem_cube = msg.mem_cube
129+
self.current_user_id = msg.user_id
130+
self.current_mem_cube_id = msg.mem_cube_id
131+
self.current_mem_cube = msg.mem_cube
130132

131133
def transform_memories_to_monitors(
132134
self, memories: list[TextualMemoryItem]
@@ -181,9 +183,8 @@ def transform_memories_to_monitors(
181183

182184
def replace_working_memory(
183185
self,
184-
queries: list[str],
185-
user_id: str,
186-
mem_cube_id: str,
186+
user_id: UserID | str,
187+
mem_cube_id: MemCubeID | str,
187188
mem_cube: GeneralMemCube,
188189
original_memory: list[TextualMemoryItem],
189190
new_memory: list[TextualMemoryItem],
@@ -246,8 +247,8 @@ def replace_working_memory(
246247

247248
def initialize_working_memory_monitors(
248249
self,
249-
user_id: str,
250-
mem_cube_id: str,
250+
user_id: UserID | str,
251+
mem_cube_id: MemCubeID | str,
251252
mem_cube: GeneralMemCube,
252253
):
253254
text_mem_base: TreeTextMemory = mem_cube.text_mem
@@ -267,8 +268,8 @@ def update_activation_memory(
267268
self,
268269
new_memories: list[str | TextualMemoryItem],
269270
label: str,
270-
user_id: str,
271-
mem_cube_id: str,
271+
user_id: UserID | str,
272+
mem_cube_id: MemCubeID | str,
272273
mem_cube: GeneralMemCube,
273274
) -> None:
274275
"""
@@ -344,16 +345,17 @@ def update_activation_memory_periodically(
344345
self,
345346
interval_seconds: int,
346347
label: str,
347-
user_id: str,
348-
mem_cube_id: str,
348+
user_id: UserID | str,
349+
mem_cube_id: MemCubeID | str,
349350
mem_cube: GeneralMemCube,
350351
):
351-
new_activation_memories = []
352-
353352
try:
354-
if self.monitor.timed_trigger(
355-
last_time=self.monitor.last_activation_mem_update_time,
356-
interval_seconds=interval_seconds,
353+
if (
354+
self.monitor.last_activation_mem_update_time == datetime.min
355+
or self.monitor.timed_trigger(
356+
last_time=self.monitor.last_activation_mem_update_time,
357+
interval_seconds=interval_seconds,
358+
)
357359
):
358360
logger.info(
359361
f"Updating activation memory for user {user_id} and mem_cube {mem_cube_id}"

0 commit comments

Comments
 (0)