refactor(dialog): remove legacy data class

This commit is contained in:
2026-04-15 17:24:22 +08:00
parent f510dc5a42
commit 999a6a8d7e
8 changed files with 55 additions and 163 deletions

View File

@@ -26,18 +26,14 @@ import work.slhaf.partner.framework.agent.factory.component.annotation.InjectMod
import work.slhaf.partner.framework.agent.model.pojo.Message; import work.slhaf.partner.framework.agent.model.pojo.Message;
import work.slhaf.partner.framework.agent.support.Result; import work.slhaf.partner.framework.agent.support.Result;
import work.slhaf.partner.module.action.scheduler.ActionScheduler; import work.slhaf.partner.module.action.scheduler.ActionScheduler;
import work.slhaf.partner.module.memory.runtime.MemoryRuntime; import work.slhaf.partner.module.communication.summarizer.MultiSummarizer;
import work.slhaf.partner.module.memory.updater.summarizer.MultiSummarizer; import work.slhaf.partner.module.communication.summarizer.SingleSummarizer;
import work.slhaf.partner.module.memory.updater.summarizer.SingleSummarizer;
import work.slhaf.partner.module.memory.updater.summarizer.entity.SummarizeInput;
import work.slhaf.partner.module.memory.updater.summarizer.entity.SummarizeResult;
import work.slhaf.partner.runtime.PartnerRunningFlowContext; import work.slhaf.partner.runtime.PartnerRunningFlowContext;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@@ -47,8 +43,10 @@ public class DialogRolling extends AbstractAgentModule.Running<PartnerRunningFlo
private static final String AUTO_UPDATE_CRON = "0/10 * * * * ?"; private static final String AUTO_UPDATE_CRON = "0/10 * * * * ?";
private static final long UPDATE_TRIGGER_INTERVAL = 60 * 60 * 1000; private static final long UPDATE_TRIGGER_INTERVAL = 60 * 60 * 1000;
private static final int CONTEXT_RETAIN_DIVISOR = 6; private static final int CONTEXT_RETAIN_DIVISOR = 6;
private static final int MEMORY_UPDATE_TRIGGER_ROLL_LIMIT = 36; private static final int DIALOG_ROLLING_TRIGGER_LIMIT = 36;
private final AtomicBoolean rolling = new AtomicBoolean(false); private final AtomicBoolean rolling = new AtomicBoolean(false);
@InjectCapability @InjectCapability
private CognitionCapability cognitionCapability; private CognitionCapability cognitionCapability;
@InjectCapability @InjectCapability
@@ -57,8 +55,7 @@ public class DialogRolling extends AbstractAgentModule.Running<PartnerRunningFlo
private PerceiveCapability perceiveCapability; private PerceiveCapability perceiveCapability;
@InjectCapability @InjectCapability
private ActionCapability actionCapability; private ActionCapability actionCapability;
@InjectModule
private MemoryRuntime memoryRuntime;
@InjectModule @InjectModule
private MultiSummarizer multiSummarizer; private MultiSummarizer multiSummarizer;
@InjectModule @InjectModule
@@ -67,11 +64,9 @@ public class DialogRolling extends AbstractAgentModule.Running<PartnerRunningFlo
private ActionScheduler actionScheduler; private ActionScheduler actionScheduler;
@InjectModule @InjectModule
private AfterRollingRegistry afterRollingRegistry; private AfterRollingRegistry afterRollingRegistry;
private ExecutorService executor;
@Init @Init
public void init() { public void init() {
executor = actionCapability.getExecutor(ActionCore.ExecutorType.VIRTUAL);
registerScheduledUpdater(); registerScheduledUpdater();
} }
@@ -93,10 +88,10 @@ public class DialogRolling extends AbstractAgentModule.Running<PartnerRunningFlo
@Override @Override
protected void doExecute(@NotNull PartnerRunningFlowContext context) { protected void doExecute(@NotNull PartnerRunningFlowContext context) {
if (cognitionCapability.getChatMessages().size() < MEMORY_UPDATE_TRIGGER_ROLL_LIMIT) { if (cognitionCapability.getChatMessages().size() < DIALOG_ROLLING_TRIGGER_LIMIT) {
return; return;
} }
executor.execute(() -> triggerRolling(false)); actionCapability.getExecutor(ActionCore.ExecutorType.VIRTUAL).execute(() -> triggerRolling(false));
} }
private void tryAutoRolling() { private void tryAutoRolling() {
@@ -163,11 +158,10 @@ public class DialogRolling extends AbstractAgentModule.Running<PartnerRunningFlo
@NotNull @NotNull
RollingResult buildRollingResult(List<Message> chatSnapshot, int rollingSize, int retainDivisor) { RollingResult buildRollingResult(List<Message> chatSnapshot, int rollingSize, int retainDivisor) {
SummarizeInput summarizeInput = new SummarizeInput(chatSnapshot, memoryRuntime.getTopicTree()); singleSummarizer.execute(chatSnapshot);
singleSummarizer.execute(summarizeInput.getChatMessages()); Result<String> summaryResult = multiSummarizer.execute(chatSnapshot);
Result<SummarizeResult> summarizeResult = multiSummarizer.execute(summarizeInput); String summary = summaryResult.fold(
String summary = summarizeResult.fold( value -> value,
SummarizeResult::getSummary,
exp -> "no summary, due to exception" exp -> "no summary, due to exception"
); );
if (summary.isBlank()) { if (summary.isBlank()) {

View File

@@ -0,0 +1,35 @@
package work.slhaf.partner.module.communication.summarizer;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.jetbrains.annotations.NotNull;
import work.slhaf.partner.framework.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.framework.agent.factory.component.annotation.InjectModule;
import work.slhaf.partner.framework.agent.model.ActivateModel;
import work.slhaf.partner.framework.agent.model.pojo.Message;
import work.slhaf.partner.framework.agent.support.Result;
import work.slhaf.partner.module.memory.runtime.MemoryRuntime;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class MultiSummarizer extends AbstractAgentModule.Sub<List<Message>, Result<String>> implements ActivateModel {
@InjectModule
private MemoryRuntime memoryRuntime;
@Override
protected @NotNull Result<String> doExecute(List<Message> messages) {
return chat(
List.of(new Message(Message.Character.USER, JSONUtil.toJsonPrettyStr(messages)))
);
}
@NotNull
@Override
public String modelKey() {
return "multi_summarizer";
}
}

View File

@@ -1,7 +1,8 @@
package work.slhaf.partner.module.memory.updater.summarizer; package work.slhaf.partner.module.communication.summarizer;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.jetbrains.annotations.NotNull;
import work.slhaf.partner.core.action.ActionCapability; import work.slhaf.partner.core.action.ActionCapability;
import work.slhaf.partner.core.action.ActionCore; import work.slhaf.partner.core.action.ActionCore;
import work.slhaf.partner.framework.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.framework.agent.factory.capability.annotation.InjectCapability;
@@ -30,7 +31,6 @@ public class SingleSummarizer extends AbstractAgentModule.Sub<List<Message>, Voi
@Override @Override
protected Void doExecute(List<Message> chatMessages) { protected Void doExecute(List<Message> chatMessages) {
log.debug("[MemorySummarizer] 长文本摘要开始...");
CountDownLatch latch = new CountDownLatch(chatMessages.size()); CountDownLatch latch = new CountDownLatch(chatMessages.size());
for (int i = 0; i < chatMessages.size(); i++) { for (int i = 0; i < chatMessages.size(); i++) {
Message chatMessage = chatMessages.get(i); Message chatMessage = chatMessages.get(i);
@@ -56,14 +56,10 @@ public class SingleSummarizer extends AbstractAgentModule.Sub<List<Message>, Voi
latch.await(); latch.await();
} catch (InterruptedException ignored) { } catch (InterruptedException ignored) {
} }
log.debug("[MemorySummarizer] 长文本摘要结束");
return null; return null;
} }
private String singleExecute(String primaryContent) { @NotNull
return chat(List.of(new Message(Message.Character.USER, primaryContent))).getOrThrow();
}
@Override @Override
public String modelKey() { public String modelKey() {
return "single_summarizer"; return "single_summarizer";

View File

@@ -1,52 +0,0 @@
package work.slhaf.partner.module.memory.updater.summarizer;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.jetbrains.annotations.NotNull;
import work.slhaf.partner.framework.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.framework.agent.factory.component.annotation.InjectModule;
import work.slhaf.partner.framework.agent.model.ActivateModel;
import work.slhaf.partner.framework.agent.model.pojo.Message;
import work.slhaf.partner.framework.agent.support.Result;
import work.slhaf.partner.module.memory.runtime.MemoryRuntime;
import work.slhaf.partner.module.memory.updater.summarizer.entity.SummarizeInput;
import work.slhaf.partner.module.memory.updater.summarizer.entity.SummarizeResult;
import java.util.ArrayList;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class MultiSummarizer extends AbstractAgentModule.Sub<SummarizeInput, Result<SummarizeResult>> implements ActivateModel {
@InjectModule
private MemoryRuntime memoryRuntime;
@Override
protected @NotNull Result<SummarizeResult> doExecute(SummarizeInput input) {
return formattedChat(
List.of(new Message(Message.Character.USER, JSONUtil.toJsonPrettyStr(input))),
SummarizeResult.class
).onSuccess(this::fix);
}
private void fix(SummarizeResult result) {
if (result == null || result.getTopicPath() == null || result.getTopicPath().isEmpty()) {
return;
}
String topicPath = memoryRuntime.fixTopicPath(result.getTopicPath());
List<String> relatedTopicPath = new ArrayList<>();
for (String s : result.getRelatedTopicPath()) {
relatedTopicPath.add(memoryRuntime.fixTopicPath(s));
}
result.setTopicPath(topicPath);
result.setRelatedTopicPath(relatedTopicPath);
}
@NotNull
@Override
public String modelKey() {
return "multi_summarizer";
}
}

View File

@@ -1,32 +0,0 @@
package work.slhaf.partner.module.memory.updater.summarizer;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;
import work.slhaf.partner.framework.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.framework.agent.model.ActivateModel;
import work.slhaf.partner.framework.agent.model.pojo.Message;
import java.util.HashMap;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class TotalSummarizer extends AbstractAgentModule.Sub<HashMap<String, String>, String> implements ActivateModel {
protected String doExecute(HashMap<String, String> singleMemorySummary) {
return formattedChat(
List.of(new Message(Message.Character.USER, JSONUtil.toJsonPrettyStr(singleMemorySummary))),
SummaryContent.class
).getOrThrow().getContent();
}
@Override
public String modelKey() {
return "total_summarizer";
}
@lombok.Data
private static class SummaryContent {
private String content;
}
}

View File

@@ -1,14 +0,0 @@
package work.slhaf.partner.module.memory.updater.summarizer.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import work.slhaf.partner.framework.agent.model.pojo.Message;
import java.util.List;
@AllArgsConstructor
@Data
public class SummarizeInput {
private List<Message> chatMessages;
private String topicTree;
}

View File

@@ -1,12 +0,0 @@
package work.slhaf.partner.module.memory.updater.summarizer.entity;
import lombok.Data;
import java.util.List;
@Data
public class SummarizeResult {
private String summary;
private String topicPath;
private List<String> relatedTopicPath;
}

View File

@@ -9,10 +9,8 @@ import work.slhaf.partner.core.memory.pojo.MemorySlice;
import work.slhaf.partner.core.memory.pojo.MemoryUnit; import work.slhaf.partner.core.memory.pojo.MemoryUnit;
import work.slhaf.partner.framework.agent.model.pojo.Message; import work.slhaf.partner.framework.agent.model.pojo.Message;
import work.slhaf.partner.framework.agent.support.Result; import work.slhaf.partner.framework.agent.support.Result;
import work.slhaf.partner.module.memory.runtime.MemoryRuntime; import work.slhaf.partner.module.communication.summarizer.MultiSummarizer;
import work.slhaf.partner.module.memory.updater.summarizer.MultiSummarizer; import work.slhaf.partner.module.communication.summarizer.SingleSummarizer;
import work.slhaf.partner.module.memory.updater.summarizer.SingleSummarizer;
import work.slhaf.partner.module.memory.updater.summarizer.entity.SummarizeResult;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.nio.file.Path; import java.nio.file.Path;
@@ -39,31 +37,18 @@ class DialogRollingTest {
return new Message(role, content); return new Message(role, content);
} }
private static SummarizeResult summarizeResult(String summary, String topicPath, List<String> relatedTopicPath) {
SummarizeResult result = new SummarizeResult();
result.setSummary(summary);
result.setTopicPath(topicPath);
result.setRelatedTopicPath(relatedTopicPath);
return result;
}
@Test @Test
void shouldDelegateMemoryUpdateToCapability() throws Exception { void shouldDelegateMemoryUpdateToCapability() throws Exception {
String sessionId = "dialog-rolling-" + UUID.randomUUID(); String sessionId = "dialog-rolling-" + UUID.randomUUID();
StubMemoryCapability memoryCapability = new StubMemoryCapability(sessionId); StubMemoryCapability memoryCapability = new StubMemoryCapability(sessionId);
DialogRolling dialogRolling = new DialogRolling(); DialogRolling dialogRolling = new DialogRolling();
MemoryRuntime memoryRuntime = Mockito.mock(MemoryRuntime.class);
MultiSummarizer multiSummarizer = Mockito.mock(MultiSummarizer.class); MultiSummarizer multiSummarizer = Mockito.mock(MultiSummarizer.class);
SingleSummarizer singleSummarizer = Mockito.mock(SingleSummarizer.class); SingleSummarizer singleSummarizer = Mockito.mock(SingleSummarizer.class);
setField(dialogRolling, "memoryCapability", memoryCapability); setField(dialogRolling, "memoryCapability", memoryCapability);
setField(dialogRolling, "memoryRuntime", memoryRuntime);
setField(dialogRolling, "multiSummarizer", multiSummarizer); setField(dialogRolling, "multiSummarizer", multiSummarizer);
setField(dialogRolling, "singleSummarizer", singleSummarizer); setField(dialogRolling, "singleSummarizer", singleSummarizer);
when(memoryRuntime.getTopicTree()).thenReturn("topic-tree"); when(multiSummarizer.execute(Mockito.any())).thenReturn(Result.success("new-summary"));
when(multiSummarizer.execute(Mockito.any())).thenReturn(Result.success(
summarizeResult("new-summary", "topic/main", List.of("topic/related"))
));
MemoryUnit existingUnit = new MemoryUnit(sessionId); MemoryUnit existingUnit = new MemoryUnit(sessionId);
existingUnit.getConversationMessages().addAll(List.of( existingUnit.getConversationMessages().addAll(List.of(
@@ -98,18 +83,13 @@ class DialogRollingTest {
String sessionId = "dialog-rolling-" + UUID.randomUUID(); String sessionId = "dialog-rolling-" + UUID.randomUUID();
StubMemoryCapability memoryCapability = new StubMemoryCapability(sessionId); StubMemoryCapability memoryCapability = new StubMemoryCapability(sessionId);
DialogRolling dialogRolling = new DialogRolling(); DialogRolling dialogRolling = new DialogRolling();
MemoryRuntime memoryRuntime = Mockito.mock(MemoryRuntime.class);
MultiSummarizer multiSummarizer = Mockito.mock(MultiSummarizer.class); MultiSummarizer multiSummarizer = Mockito.mock(MultiSummarizer.class);
SingleSummarizer singleSummarizer = Mockito.mock(SingleSummarizer.class); SingleSummarizer singleSummarizer = Mockito.mock(SingleSummarizer.class);
setField(dialogRolling, "memoryCapability", memoryCapability); setField(dialogRolling, "memoryCapability", memoryCapability);
setField(dialogRolling, "memoryRuntime", memoryRuntime);
setField(dialogRolling, "multiSummarizer", multiSummarizer); setField(dialogRolling, "multiSummarizer", multiSummarizer);
setField(dialogRolling, "singleSummarizer", singleSummarizer); setField(dialogRolling, "singleSummarizer", singleSummarizer);
when(memoryRuntime.getTopicTree()).thenReturn("topic-tree"); when(multiSummarizer.execute(Mockito.any())).thenReturn(Result.success("fresh-summary"));
when(multiSummarizer.execute(Mockito.any())).thenReturn(Result.success(
summarizeResult("fresh-summary", "topic/root", List.of())
));
RollingResult rollingResult = dialogRolling.buildRollingResult(List.of( RollingResult rollingResult = dialogRolling.buildRollingResult(List.of(
message(Message.Character.USER, "first"), message(Message.Character.USER, "first"),
@@ -158,16 +138,13 @@ class DialogRollingTest {
String sessionId = "dialog-rolling-" + UUID.randomUUID(); String sessionId = "dialog-rolling-" + UUID.randomUUID();
StubMemoryCapability memoryCapability = new StubMemoryCapability(sessionId); StubMemoryCapability memoryCapability = new StubMemoryCapability(sessionId);
DialogRolling dialogRolling = new DialogRolling(); DialogRolling dialogRolling = new DialogRolling();
MemoryRuntime memoryRuntime = Mockito.mock(MemoryRuntime.class);
MultiSummarizer multiSummarizer = Mockito.mock(MultiSummarizer.class); MultiSummarizer multiSummarizer = Mockito.mock(MultiSummarizer.class);
SingleSummarizer singleSummarizer = Mockito.mock(SingleSummarizer.class); SingleSummarizer singleSummarizer = Mockito.mock(SingleSummarizer.class);
setField(dialogRolling, "memoryCapability", memoryCapability); setField(dialogRolling, "memoryCapability", memoryCapability);
setField(dialogRolling, "memoryRuntime", memoryRuntime);
setField(dialogRolling, "multiSummarizer", multiSummarizer); setField(dialogRolling, "multiSummarizer", multiSummarizer);
setField(dialogRolling, "singleSummarizer", singleSummarizer); setField(dialogRolling, "singleSummarizer", singleSummarizer);
when(memoryRuntime.getTopicTree()).thenReturn("topic-tree"); when(multiSummarizer.execute(Mockito.any())).thenReturn(Result.success(" "));
when(multiSummarizer.execute(Mockito.any())).thenReturn(Result.success(summarizeResult(" ", "topic/root", List.of())));
RollingResult rollingResult = dialogRolling.buildRollingResult(List.of( RollingResult rollingResult = dialogRolling.buildRollingResult(List.of(
message(Message.Character.USER, "u1"), message(Message.Character.USER, "u1"),