mirror of
https://github.com/slhaf/Partner.git
synced 2026-05-12 08:43:02 +08:00
refactor(dialog): remove legacy data class
This commit is contained in:
@@ -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.support.Result;
|
||||
import work.slhaf.partner.module.action.scheduler.ActionScheduler;
|
||||
import work.slhaf.partner.module.memory.runtime.MemoryRuntime;
|
||||
import work.slhaf.partner.module.memory.updater.summarizer.MultiSummarizer;
|
||||
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.module.communication.summarizer.MultiSummarizer;
|
||||
import work.slhaf.partner.module.communication.summarizer.SingleSummarizer;
|
||||
import work.slhaf.partner.runtime.PartnerRunningFlowContext;
|
||||
|
||||
import java.time.ZonedDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
@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 long UPDATE_TRIGGER_INTERVAL = 60 * 60 * 1000;
|
||||
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);
|
||||
|
||||
@InjectCapability
|
||||
private CognitionCapability cognitionCapability;
|
||||
@InjectCapability
|
||||
@@ -57,8 +55,7 @@ public class DialogRolling extends AbstractAgentModule.Running<PartnerRunningFlo
|
||||
private PerceiveCapability perceiveCapability;
|
||||
@InjectCapability
|
||||
private ActionCapability actionCapability;
|
||||
@InjectModule
|
||||
private MemoryRuntime memoryRuntime;
|
||||
|
||||
@InjectModule
|
||||
private MultiSummarizer multiSummarizer;
|
||||
@InjectModule
|
||||
@@ -67,11 +64,9 @@ public class DialogRolling extends AbstractAgentModule.Running<PartnerRunningFlo
|
||||
private ActionScheduler actionScheduler;
|
||||
@InjectModule
|
||||
private AfterRollingRegistry afterRollingRegistry;
|
||||
private ExecutorService executor;
|
||||
|
||||
@Init
|
||||
public void init() {
|
||||
executor = actionCapability.getExecutor(ActionCore.ExecutorType.VIRTUAL);
|
||||
registerScheduledUpdater();
|
||||
}
|
||||
|
||||
@@ -93,10 +88,10 @@ public class DialogRolling extends AbstractAgentModule.Running<PartnerRunningFlo
|
||||
|
||||
@Override
|
||||
protected void doExecute(@NotNull PartnerRunningFlowContext context) {
|
||||
if (cognitionCapability.getChatMessages().size() < MEMORY_UPDATE_TRIGGER_ROLL_LIMIT) {
|
||||
if (cognitionCapability.getChatMessages().size() < DIALOG_ROLLING_TRIGGER_LIMIT) {
|
||||
return;
|
||||
}
|
||||
executor.execute(() -> triggerRolling(false));
|
||||
actionCapability.getExecutor(ActionCore.ExecutorType.VIRTUAL).execute(() -> triggerRolling(false));
|
||||
}
|
||||
|
||||
private void tryAutoRolling() {
|
||||
@@ -163,11 +158,10 @@ public class DialogRolling extends AbstractAgentModule.Running<PartnerRunningFlo
|
||||
|
||||
@NotNull
|
||||
RollingResult buildRollingResult(List<Message> chatSnapshot, int rollingSize, int retainDivisor) {
|
||||
SummarizeInput summarizeInput = new SummarizeInput(chatSnapshot, memoryRuntime.getTopicTree());
|
||||
singleSummarizer.execute(summarizeInput.getChatMessages());
|
||||
Result<SummarizeResult> summarizeResult = multiSummarizer.execute(summarizeInput);
|
||||
String summary = summarizeResult.fold(
|
||||
SummarizeResult::getSummary,
|
||||
singleSummarizer.execute(chatSnapshot);
|
||||
Result<String> summaryResult = multiSummarizer.execute(chatSnapshot);
|
||||
String summary = summaryResult.fold(
|
||||
value -> value,
|
||||
exp -> "no summary, due to exception"
|
||||
);
|
||||
if (summary.isBlank()) {
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,8 @@
|
||||
package work.slhaf.partner.module.memory.updater.summarizer;
|
||||
package work.slhaf.partner.module.communication.summarizer;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import work.slhaf.partner.core.action.ActionCapability;
|
||||
import work.slhaf.partner.core.action.ActionCore;
|
||||
import work.slhaf.partner.framework.agent.factory.capability.annotation.InjectCapability;
|
||||
@@ -30,7 +31,6 @@ public class SingleSummarizer extends AbstractAgentModule.Sub<List<Message>, Voi
|
||||
|
||||
@Override
|
||||
protected Void doExecute(List<Message> chatMessages) {
|
||||
log.debug("[MemorySummarizer] 长文本摘要开始...");
|
||||
CountDownLatch latch = new CountDownLatch(chatMessages.size());
|
||||
for (int i = 0; i < chatMessages.size(); i++) {
|
||||
Message chatMessage = chatMessages.get(i);
|
||||
@@ -56,14 +56,10 @@ public class SingleSummarizer extends AbstractAgentModule.Sub<List<Message>, Voi
|
||||
latch.await();
|
||||
} catch (InterruptedException ignored) {
|
||||
}
|
||||
log.debug("[MemorySummarizer] 长文本摘要结束");
|
||||
return null;
|
||||
}
|
||||
|
||||
private String singleExecute(String primaryContent) {
|
||||
return chat(List.of(new Message(Message.Character.USER, primaryContent))).getOrThrow();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String modelKey() {
|
||||
return "single_summarizer";
|
||||
@@ -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";
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -9,10 +9,8 @@ import work.slhaf.partner.core.memory.pojo.MemorySlice;
|
||||
import work.slhaf.partner.core.memory.pojo.MemoryUnit;
|
||||
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.MultiSummarizer;
|
||||
import work.slhaf.partner.module.memory.updater.summarizer.SingleSummarizer;
|
||||
import work.slhaf.partner.module.memory.updater.summarizer.entity.SummarizeResult;
|
||||
import work.slhaf.partner.module.communication.summarizer.MultiSummarizer;
|
||||
import work.slhaf.partner.module.communication.summarizer.SingleSummarizer;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.nio.file.Path;
|
||||
@@ -39,31 +37,18 @@ class DialogRollingTest {
|
||||
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
|
||||
void shouldDelegateMemoryUpdateToCapability() throws Exception {
|
||||
String sessionId = "dialog-rolling-" + UUID.randomUUID();
|
||||
StubMemoryCapability memoryCapability = new StubMemoryCapability(sessionId);
|
||||
DialogRolling dialogRolling = new DialogRolling();
|
||||
MemoryRuntime memoryRuntime = Mockito.mock(MemoryRuntime.class);
|
||||
MultiSummarizer multiSummarizer = Mockito.mock(MultiSummarizer.class);
|
||||
SingleSummarizer singleSummarizer = Mockito.mock(SingleSummarizer.class);
|
||||
setField(dialogRolling, "memoryCapability", memoryCapability);
|
||||
setField(dialogRolling, "memoryRuntime", memoryRuntime);
|
||||
setField(dialogRolling, "multiSummarizer", multiSummarizer);
|
||||
setField(dialogRolling, "singleSummarizer", singleSummarizer);
|
||||
|
||||
when(memoryRuntime.getTopicTree()).thenReturn("topic-tree");
|
||||
when(multiSummarizer.execute(Mockito.any())).thenReturn(Result.success(
|
||||
summarizeResult("new-summary", "topic/main", List.of("topic/related"))
|
||||
));
|
||||
when(multiSummarizer.execute(Mockito.any())).thenReturn(Result.success("new-summary"));
|
||||
|
||||
MemoryUnit existingUnit = new MemoryUnit(sessionId);
|
||||
existingUnit.getConversationMessages().addAll(List.of(
|
||||
@@ -98,18 +83,13 @@ class DialogRollingTest {
|
||||
String sessionId = "dialog-rolling-" + UUID.randomUUID();
|
||||
StubMemoryCapability memoryCapability = new StubMemoryCapability(sessionId);
|
||||
DialogRolling dialogRolling = new DialogRolling();
|
||||
MemoryRuntime memoryRuntime = Mockito.mock(MemoryRuntime.class);
|
||||
MultiSummarizer multiSummarizer = Mockito.mock(MultiSummarizer.class);
|
||||
SingleSummarizer singleSummarizer = Mockito.mock(SingleSummarizer.class);
|
||||
setField(dialogRolling, "memoryCapability", memoryCapability);
|
||||
setField(dialogRolling, "memoryRuntime", memoryRuntime);
|
||||
setField(dialogRolling, "multiSummarizer", multiSummarizer);
|
||||
setField(dialogRolling, "singleSummarizer", singleSummarizer);
|
||||
|
||||
when(memoryRuntime.getTopicTree()).thenReturn("topic-tree");
|
||||
when(multiSummarizer.execute(Mockito.any())).thenReturn(Result.success(
|
||||
summarizeResult("fresh-summary", "topic/root", List.of())
|
||||
));
|
||||
when(multiSummarizer.execute(Mockito.any())).thenReturn(Result.success("fresh-summary"));
|
||||
|
||||
RollingResult rollingResult = dialogRolling.buildRollingResult(List.of(
|
||||
message(Message.Character.USER, "first"),
|
||||
@@ -158,16 +138,13 @@ class DialogRollingTest {
|
||||
String sessionId = "dialog-rolling-" + UUID.randomUUID();
|
||||
StubMemoryCapability memoryCapability = new StubMemoryCapability(sessionId);
|
||||
DialogRolling dialogRolling = new DialogRolling();
|
||||
MemoryRuntime memoryRuntime = Mockito.mock(MemoryRuntime.class);
|
||||
MultiSummarizer multiSummarizer = Mockito.mock(MultiSummarizer.class);
|
||||
SingleSummarizer singleSummarizer = Mockito.mock(SingleSummarizer.class);
|
||||
setField(dialogRolling, "memoryCapability", memoryCapability);
|
||||
setField(dialogRolling, "memoryRuntime", memoryRuntime);
|
||||
setField(dialogRolling, "multiSummarizer", multiSummarizer);
|
||||
setField(dialogRolling, "singleSummarizer", singleSummarizer);
|
||||
|
||||
when(memoryRuntime.getTopicTree()).thenReturn("topic-tree");
|
||||
when(multiSummarizer.execute(Mockito.any())).thenReturn(Result.success(summarizeResult(" ", "topic/root", List.of())));
|
||||
when(multiSummarizer.execute(Mockito.any())).thenReturn(Result.success(" "));
|
||||
|
||||
RollingResult rollingResult = dialogRolling.buildRollingResult(List.of(
|
||||
message(Message.Character.USER, "u1"),
|
||||
|
||||
Reference in New Issue
Block a user