Skip to content

Commit 53b39fc

Browse files
committed
fix: keep fast memories when fine transfer fails
1 parent a4f1b5b commit 53b39fc

2 files changed

Lines changed: 46 additions & 1 deletion

File tree

src/memos/mem_scheduler/task_schedule_modules/handlers/mem_read_handler.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ def _process_memories_with_reader(
167167

168168
info = dict(info or {})
169169
is_upload_skill = info.pop("is_upload_skill", False)
170+
transfer_succeeded = False
170171

171172
try:
172173
processed_memories = mem_reader.fine_transfer_simple_mem(
@@ -178,6 +179,7 @@ def _process_memories_with_reader(
178179
user_context=user_context,
179180
is_upload_skill=is_upload_skill,
180181
)
182+
transfer_succeeded = True
181183
except Exception as e:
182184
logger.warning("%s: Fail to transfer mem: %s", e, memory_items)
183185
processed_memories = []
@@ -402,7 +404,7 @@ def _process_memories_with_reader(
402404
if bindings_to_delete:
403405
delete_ids.extend(list(bindings_to_delete))
404406
delete_ids = list(dict.fromkeys(delete_ids))
405-
if delete_ids:
407+
if delete_ids and transfer_succeeded:
406408
try:
407409
if getattr(mem_reader, "memory_version_switch", "off") != "on":
408410
text_mem.delete(delete_ids, user_name=user_name)
@@ -434,6 +436,11 @@ def _process_memories_with_reader(
434436
)
435437
except Exception as e:
436438
logger.warning("Failed to delete some mem_ids %s: %s", delete_ids, e)
439+
elif delete_ids:
440+
logger.info(
441+
"Skip deleting raw/working mem_ids after failed transfer: %s",
442+
delete_ids,
443+
)
437444
else:
438445
logger.info("No mem_ids to delete (nothing to cleanup)")
439446

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from types import SimpleNamespace
2+
from unittest.mock import MagicMock
3+
4+
from memos.mem_scheduler.task_schedule_modules.handlers.mem_read_handler import (
5+
MemReadMessageHandler,
6+
)
7+
8+
9+
def test_mem_read_handler_keeps_fast_memories_when_transfer_fails():
10+
mem_reader = MagicMock()
11+
mem_reader.fine_transfer_simple_mem.side_effect = RuntimeError("extract failed")
12+
mem_reader.memory_version_switch = "off"
13+
14+
raw_memory = SimpleNamespace(
15+
memory="raw user message",
16+
metadata=SimpleNamespace(background="", memory_type="LongTermMemory"),
17+
)
18+
19+
text_mem = MagicMock()
20+
text_mem.get.return_value = raw_memory
21+
text_mem.memory_manager = SimpleNamespace(
22+
remove_and_refresh_memory=MagicMock(),
23+
)
24+
25+
scheduler_context = MagicMock()
26+
scheduler_context.get_mem_reader.return_value = mem_reader
27+
28+
handler = MemReadMessageHandler(scheduler_context)
29+
handler._process_memories_with_reader(
30+
mem_ids=["fast-1"],
31+
user_id="user-1",
32+
mem_cube_id="cube-1",
33+
text_mem=text_mem,
34+
user_name="alice",
35+
)
36+
37+
text_mem.delete.assert_not_called()
38+
text_mem.soft_delete.assert_not_called()

0 commit comments

Comments
 (0)