fix(memory): trim persisted overlap from chat snapshot in MemoryUpdater

This commit is contained in:
2026-03-29 18:48:52 +08:00
parent 274d007ba1
commit d4a5c5a0ed
2 changed files with 95 additions and 4 deletions

View File

@@ -24,6 +24,14 @@ class MemoryUpdaterTest {
return (MemoryUnit) method.invoke(updater, chatMessages, summarizeResult);
}
@SuppressWarnings("unchecked")
private static List<Message> invokeResolveChatIncrement(MemoryUpdater updater,
List<Message> chatMessages) throws Exception {
Method method = MemoryUpdater.class.getDeclaredMethod("resolveChatIncrement", List.class);
method.setAccessible(true);
return (List<Message>) method.invoke(updater, chatMessages);
}
private static void setField(Object target, String fieldName, Object value) throws Exception {
Field field = target.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
@@ -107,6 +115,61 @@ class MemoryUpdaterTest {
assertEquals("fresh-summary", created.getSlices().getFirst().getSummary());
}
@Test
void shouldTrimPersistedOverlapFromCurrentSnapshot() throws Exception {
StubMemoryCapability memoryCapability = new StubMemoryCapability("session-3");
MemoryUpdater updater = new MemoryUpdater();
setField(updater, "memoryCapability", memoryCapability);
MemoryUnit existingUnit = new MemoryUnit();
existingUnit.setId("session-3");
existingUnit.setConversationMessages(new ArrayList<>(List.of(
message(Message.Character.USER, "m1"),
message(Message.Character.ASSISTANT, "m2"),
message(Message.Character.USER, "m3"),
message(Message.Character.ASSISTANT, "m4")
)));
memoryCapability.saveMemoryUnit(existingUnit);
List<Message> increment = invokeResolveChatIncrement(
updater,
List.of(
message(Message.Character.USER, "m3"),
message(Message.Character.ASSISTANT, "m4"),
message(Message.Character.USER, "m5"),
message(Message.Character.ASSISTANT, "m6")
)
);
assertEquals(List.of("m5", "m6"), increment.stream().map(Message::getContent).toList());
}
@Test
void shouldReturnEmptyIncrementWhenSnapshotIsFullyPersisted() throws Exception {
StubMemoryCapability memoryCapability = new StubMemoryCapability("session-4");
MemoryUpdater updater = new MemoryUpdater();
setField(updater, "memoryCapability", memoryCapability);
MemoryUnit existingUnit = new MemoryUnit();
existingUnit.setId("session-4");
existingUnit.setConversationMessages(new ArrayList<>(List.of(
message(Message.Character.USER, "m1"),
message(Message.Character.ASSISTANT, "m2"),
message(Message.Character.USER, "m3")
)));
memoryCapability.saveMemoryUnit(existingUnit);
List<Message> increment = invokeResolveChatIncrement(
updater,
List.of(
message(Message.Character.ASSISTANT, "m2"),
message(Message.Character.USER, "m3")
)
);
assertEquals(List.of(), increment);
}
private static final class StubMemoryCapability implements MemoryCapability {
private final String sessionId;
private final Map<String, MemoryUnit> units = new HashMap<>();