From a10a149edbf130759de5be4f477e1183b5d05f31 Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Sun, 12 Oct 2025 16:23:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E5=A7=8B=E6=8E=A8=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E5=8A=A8=E6=A8=A1=E5=9D=97(ActionModule);=20=E9=92=88=E5=AF=B9?= =?UTF-8?q?=E6=A1=86=E6=9E=B6=E4=B8=8E=E6=9C=AC=E4=BD=93=E5=88=86=E5=88=AB?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E4=BA=86=E4=B8=80=E7=B3=BB=E5=88=97=E6=9E=B6?= =?UTF-8?q?=E6=9E=84=E4=BC=98=E5=8C=96=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 框架: - 调整模块注册以及AgentRunningFlow的相关逻辑,以支持同组模块并发执行,将以@AgentModule注解中的order属性区分组间顺序先后及是否同组 - 针对@CoordinateManager注解新增了Core的自动注入处理,以便更好的协调不同Core的逻辑 本体: - 开始推进行动模块。将采取类似记忆模块的分层思路,分为ActionPlanner与ActionDispatcher两个主要模块,再各自细分子模块划分 - 将CognationCore从核心统筹的身份下降至与其他核心平级,同时将其中的序列化逻辑抽取至统一的PartnerCore父类,所有核心都将继承该类以获得序列化能力,不同core的内容将序列化至各自的memory文件 - 将SessionManager移除,相关逻辑迁移至CognationCore,统一序列化逻辑的同时又保证语义正确 - 将CognationCore中的某些缓存性质逻辑移动至CacheCore,确保语义正确 - 调整了目录结构以适应优化过的架构 --- .idea/kotlinc.xml | 6 + .idea/vcs.xml | 1 + Partner-Api/dependency-reduced-pom.xml | 29 +++ .../capability/CapabilityRegisterFactory.java | 14 +- .../annotation/CoordinateManager.java | 3 + .../runtime/config/AgentConfigManager.java | 32 ++- .../config/FileAgentConfigManager.java | 2 +- .../AgentRunningFailedException.java | 11 + .../exception/GlobalExceptionHandler.java | 32 ++- .../interaction/AgentInteractionAdapter.java | 5 +- .../interaction/flow/AgentRunningFlow.java | 39 +++- .../flow/abstracts/ActivateModel.java | 3 + .../flow/entity/RunningFlowContext.java | 5 +- .../src/test/java/module/ModuleProxyTest.java | 3 +- Partner-Main/dependency-reduced-pom.xml | 43 ++++ Partner-Main/pom.xml | 37 +++ .../java/work/slhaf/{ => partner}/Main.java | 2 +- .../callback/GlobalExceptionHandler.java | 43 ---- .../partner/core/CoordinatedManager.java | 41 +--- .../work/slhaf/partner/core/PartnerCore.java | 93 ++++++++ .../core/action/entity/ActionData.java | 11 + .../core/action/entity/ActionStatus.java | 5 + .../core/action/entity/ActionType.java | 5 + .../core/action/entity/MetaActionInfo.java | 13 ++ .../cache/CacheCapability.java | 11 +- .../core/{submodule => }/cache/CacheCore.java | 64 +++++- .../core/cognation/CognationCapability.java | 16 +- .../partner/core/cognation/CognationCore.java | 211 ++++++------------ .../core/cognation/pojo/ActiveData.java | 2 +- .../memory/MemoryCapability.java | 6 +- .../{submodule => }/memory/MemoryCore.java | 40 ++-- .../exception/NullSliceListException.java | 2 +- .../UnExistedDateIndexException.java | 2 +- .../exception/UnExistedTopicException.java | 2 +- .../memory/pojo/EvaluatedSlice.java | 2 +- .../memory/pojo/MemoryResult.java | 2 +- .../memory/pojo/MemorySlice.java | 2 +- .../memory/pojo/MemorySliceResult.java | 2 +- .../memory/pojo/node/MemoryNode.java | 6 +- .../memory/pojo/node/TopicNode.java | 2 +- .../perceive/PerceiveCapability.java | 4 +- .../perceive/PerceiveCore.java | 28 +-- .../{submodule => }/perceive/pojo/User.java | 2 +- .../dispatch/DispatchCapability.java | 4 - .../core/submodule/dispatch/DispatchCore.java | 32 --- .../submodule/dispatch/pojo/DispatchData.java | 15 -- .../common/module/PostRunningModule.java | 4 +- .../common/module/PreRunningModule.java | 7 +- .../modules/action/planner/ActionPlanner.java | 46 ++++ .../planner/evaluator/ActionEvaluator.java | 27 +++ .../evaluator/entity/EvaluatorInput.java | 11 + .../evaluator/entity/EvaluatorResult.java | 13 ++ .../planner/extractor/ActionExtractor.java | 27 +++ .../extractor/entity/ExtractorInput.java | 12 + .../extractor/entity/ExtractorResult.java | 9 + .../action/scheduler/ActionDispatcher.java | 4 + .../action/scheduler/TaskScheduler.java | 7 + .../module/modules/core/CoreModel.java | 5 +- .../memory/selector/MemorySelector.java | 32 +-- .../evaluator/SliceSelectEvaluator.java | 16 +- .../{data => entity}/EvaluatorBatchInput.java | 2 +- .../{data => entity}/EvaluatorInput.java | 4 +- .../{data => entity}/EvaluatorResult.java | 2 +- .../{data => entity}/SliceSummary.java | 2 +- .../extractor/MemorySelectExtractor.java | 30 +-- .../{data => entity}/ExtractorInput.java | 4 +- .../{data => entity}/ExtractorMatchData.java | 2 +- .../{data => entity}/ExtractorResult.java | 2 +- .../modules/memory/updater/MemoryUpdater.java | 27 +-- .../updater/summarizer/MultiSummarizer.java | 4 +- .../{data => entity}/SummarizeInput.java | 2 +- .../{data => entity}/SummarizeResult.java | 2 +- .../perceive/selector/PerceiveSelector.java | 4 +- .../perceive/updater/PerceiveUpdater.java | 8 +- .../relation_extractor/RelationExtractor.java | 8 +- .../RelationExtractInput.java | 2 +- .../RelationExtractResult.java | 2 +- .../StaticMemoryExtractor.java | 4 +- .../StaticMemoryExtractInput.java | 2 +- .../modules/process/PreprocessExecutor.java | 16 +- .../module/modules/task/TaskEvaluator.java | 21 -- .../module/modules/task/TaskExecutor.java | 20 -- .../module/modules/task/TaskScheduler.java | 27 --- .../module/modules/task/data/TaskData.java | 31 --- .../exception/pojo/GlobalExceptionData.java | 4 - .../PartnerInteractionAdapter.java | 10 +- .../runtime/session/SessionManager.java | 138 ------------ .../src/test/java/ReflectionTest.java | 9 +- Partner-Main/src/test/java/RegexTest.kt | 61 +++-- .../src/test/java/SelfAwarenessTest.java | 2 +- .../src/test/java/timewheel/TimeWheelTest.kt | 20 ++ Partner-Test-Demo/dependency-reduced-pom.xml | 55 +++++ Partner-Test-Demo/pom.xml | 45 ++++ pom.xml | 87 +++++--- 94 files changed, 1021 insertions(+), 793 deletions(-) create mode 100644 .idea/kotlinc.xml create mode 100644 Partner-Api/dependency-reduced-pom.xml create mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/AgentRunningFailedException.java create mode 100644 Partner-Main/dependency-reduced-pom.xml rename Partner-Main/src/main/java/work/slhaf/{ => partner}/Main.java (95%) delete mode 100644 Partner-Main/src/main/java/work/slhaf/partner/common/exception/callback/GlobalExceptionHandler.java create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/core/PartnerCore.java create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionData.java create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionStatus.java create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionType.java create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/MetaActionInfo.java rename Partner-Main/src/main/java/work/slhaf/partner/core/{submodule => }/cache/CacheCapability.java (50%) rename Partner-Main/src/main/java/work/slhaf/partner/core/{submodule => }/cache/CacheCore.java (76%) rename Partner-Main/src/main/java/work/slhaf/partner/core/{submodule => }/memory/MemoryCapability.java (77%) rename Partner-Main/src/main/java/work/slhaf/partner/core/{submodule => }/memory/MemoryCore.java (93%) rename Partner-Main/src/main/java/work/slhaf/partner/core/{submodule => }/memory/exception/NullSliceListException.java (71%) rename Partner-Main/src/main/java/work/slhaf/partner/core/{submodule => }/memory/exception/UnExistedDateIndexException.java (72%) rename Partner-Main/src/main/java/work/slhaf/partner/core/{submodule => }/memory/exception/UnExistedTopicException.java (71%) rename Partner-Main/src/main/java/work/slhaf/partner/core/{submodule => }/memory/pojo/EvaluatedSlice.java (89%) rename Partner-Main/src/main/java/work/slhaf/partner/core/{submodule => }/memory/pojo/MemoryResult.java (93%) rename Partner-Main/src/main/java/work/slhaf/partner/core/{submodule => }/memory/pojo/MemorySlice.java (97%) rename Partner-Main/src/main/java/work/slhaf/partner/core/{submodule => }/memory/pojo/MemorySliceResult.java (90%) rename Partner-Main/src/main/java/work/slhaf/partner/core/{submodule => }/memory/pojo/node/MemoryNode.java (92%) rename Partner-Main/src/main/java/work/slhaf/partner/core/{submodule => }/memory/pojo/node/TopicNode.java (90%) rename Partner-Main/src/main/java/work/slhaf/partner/core/{submodule => }/perceive/PerceiveCapability.java (74%) rename Partner-Main/src/main/java/work/slhaf/partner/core/{submodule => }/perceive/PerceiveCore.java (84%) rename Partner-Main/src/main/java/work/slhaf/partner/core/{submodule => }/perceive/pojo/User.java (96%) delete mode 100644 Partner-Main/src/main/java/work/slhaf/partner/core/submodule/dispatch/DispatchCapability.java delete mode 100644 Partner-Main/src/main/java/work/slhaf/partner/core/submodule/dispatch/DispatchCore.java delete mode 100644 Partner-Main/src/main/java/work/slhaf/partner/core/submodule/dispatch/pojo/DispatchData.java create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/ActionPlanner.java create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/ActionEvaluator.java create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/entity/EvaluatorInput.java create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/entity/EvaluatorResult.java create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/ActionExtractor.java create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/entity/ExtractorInput.java create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/entity/ExtractorResult.java create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/scheduler/ActionDispatcher.java create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/scheduler/TaskScheduler.java rename Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/{data => entity}/EvaluatorBatchInput.java (96%) rename Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/{data => entity}/EvaluatorInput.java (81%) rename Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/{data => entity}/EvaluatorResult.java (93%) rename Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/{data => entity}/SliceSummary.java (95%) rename Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/extractor/{data => entity}/ExtractorInput.java (84%) rename Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/extractor/{data => entity}/ExtractorMatchData.java (96%) rename Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/extractor/{data => entity}/ExtractorResult.java (94%) rename Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/{data => entity}/SummarizeInput.java (96%) rename Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/{data => entity}/SummarizeResult.java (95%) rename Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/{pojo => entity}/RelationExtractInput.java (93%) rename Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/{pojo => entity}/RelationExtractResult.java (93%) rename Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/static_extractor/{data => entity}/StaticMemoryExtractInput.java (94%) delete mode 100644 Partner-Main/src/main/java/work/slhaf/partner/module/modules/task/TaskEvaluator.java delete mode 100644 Partner-Main/src/main/java/work/slhaf/partner/module/modules/task/TaskExecutor.java delete mode 100644 Partner-Main/src/main/java/work/slhaf/partner/module/modules/task/TaskScheduler.java delete mode 100644 Partner-Main/src/main/java/work/slhaf/partner/module/modules/task/data/TaskData.java delete mode 100644 Partner-Main/src/main/java/work/slhaf/partner/runtime/session/SessionManager.java create mode 100644 Partner-Main/src/test/java/timewheel/TimeWheelTest.kt create mode 100644 Partner-Test-Demo/dependency-reduced-pom.xml diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 00000000..03fcfb7b --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 94a25f7f..be11f249 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,5 +2,6 @@ + \ No newline at end of file diff --git a/Partner-Api/dependency-reduced-pom.xml b/Partner-Api/dependency-reduced-pom.xml new file mode 100644 index 00000000..a2bbbe00 --- /dev/null +++ b/Partner-Api/dependency-reduced-pom.xml @@ -0,0 +1,29 @@ + + + + Partner + work.slhaf + 0.5.0 + + 4.0.0 + Partner-Api + + + junit + junit + 4.13.2 + test + + + hamcrest-core + org.hamcrest + + + + + + 21 + 21 + UTF-8 + + diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/CapabilityRegisterFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/CapabilityRegisterFactory.java index 75e28ecf..0bab4feb 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/CapabilityRegisterFactory.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/CapabilityRegisterFactory.java @@ -13,6 +13,7 @@ import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule; import work.slhaf.partner.api.agent.factory.module.annotation.AgentSubModule; import java.lang.reflect.Constructor; +import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays; @@ -99,7 +100,7 @@ public class CapabilityRegisterFactory extends AgentBaseFactory { } Object o = constructor.newInstance(); capabilityHolderInstances.put(clazz, o); - }catch (Exception e){ + } catch (Exception e) { throw new CapabilityFactoryExecuteFailedException("创建代理对象失败: " + clazz, e); } } @@ -149,7 +150,7 @@ public class CapabilityRegisterFactory extends AgentBaseFactory { for (Class c : reflections.getTypesAnnotatedWith(CoordinateManager.class)) { Constructor constructor = c.getDeclaredConstructor(); Object instance = constructor.newInstance(); - + setCores(instance, c); Arrays.stream(c.getMethods()) .filter(method -> method.isAnnotationPresent(Coordinated.class)) .forEach(method -> { @@ -160,6 +161,15 @@ public class CapabilityRegisterFactory extends AgentBaseFactory { return map; } + private void setCores(Object cmInstance, Class cmClazz) throws IllegalAccessException { + for (Field field : cmClazz.getFields()) { + if (field.getType().isAnnotationPresent(CapabilityCore.class)) { + field.setAccessible(true); + field.set(cmInstance, coreInstances.get(field.getType())); + } + } + } + /** * 扫描`@Capability`与`@CapabilityMethod`注解的类与方法 * 将`capabilityValue.methodSignature`作为key,函数对象为通过反射拿到的core实例对应的方法 diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/annotation/CoordinateManager.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/annotation/CoordinateManager.java index 9d9c673c..875e01b5 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/annotation/CoordinateManager.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/annotation/CoordinateManager.java @@ -5,6 +5,9 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +/** + * Core的协调类,该注解的实现类中如果存在任何{@link CapabilityCore}实例的引用,都将被自动注入 + */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface CoordinateManager { diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/config/AgentConfigManager.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/config/AgentConfigManager.java index 291936dc..123d729d 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/config/AgentConfigManager.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/config/AgentConfigManager.java @@ -9,8 +9,7 @@ import work.slhaf.partner.api.agent.factory.config.pojo.ModelConfig; import work.slhaf.partner.api.agent.factory.module.pojo.MetaModule; import work.slhaf.partner.api.chat.pojo.Message; -import java.util.HashMap; -import java.util.List; +import java.util.*; @Slf4j @Data @@ -23,7 +22,8 @@ public abstract class AgentConfigManager { protected HashMap modelConfigMap; protected HashMap> modelPromptMap; protected HashMap moduleEnabledStatus; - protected List moduleList; + protected Map> moduleOrderedMap = new LinkedHashMap<>(); + protected Map moduleMap = new HashMap<>(); public void load() { modelConfigMap = loadModelConfig(); @@ -38,11 +38,24 @@ public abstract class AgentConfigManager { protected abstract void dumpModuleEnabledStatus(); - protected abstract HashMap loadModuleEnabledStatusMap(); + protected abstract HashMap loadModuleEnabledStatusMap(List moduleList); public void moduleEnabledStatusFilterAndRecord(List moduleList) { - this.moduleList = moduleList; - this.moduleEnabledStatus = loadModuleEnabledStatusMap(); + updateModuleMap(moduleList); + updateModuleEnabledStatus(moduleList); + } + + private void updateModuleMap(List moduleList) { + //在ModuleRegisterFactory已进行过排序操作 + for (MetaModule module : moduleList) { + int k = module.getOrder(); + moduleOrderedMap.computeIfAbsent(k, order -> new ArrayList<>()).add(module); + moduleMap.put(module.getName(), module); + } + } + + private void updateModuleEnabledStatus(List moduleList) { + this.moduleEnabledStatus = loadModuleEnabledStatusMap(moduleList); boolean unmatch = false; for (MetaModule metaModule : moduleList) { @@ -84,12 +97,7 @@ public abstract class AgentConfigManager { } moduleEnabledStatus.put(key, status); dumpModuleEnabledStatus(); - for (MetaModule metaModule : moduleList) { - if (metaModule.getName().equals(key)) { - metaModule.setEnabled(status); - break; - } - } + moduleMap.get(key).setEnabled(status); } } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/config/FileAgentConfigManager.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/config/FileAgentConfigManager.java index 011ac781..301a0a97 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/config/FileAgentConfigManager.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/config/FileAgentConfigManager.java @@ -74,7 +74,7 @@ public class FileAgentConfigManager extends AgentConfigManager { } @Override - protected HashMap loadModuleEnabledStatusMap() { + protected HashMap loadModuleEnabledStatusMap(List moduleList) { File file = new File(MODULE_ENABLED_STATUS_CONFIG_FILE); try { moduleEnabledStatus = new HashMap<>(); diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/AgentRunningFailedException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/AgentRunningFailedException.java new file mode 100644 index 00000000..edf8e007 --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/AgentRunningFailedException.java @@ -0,0 +1,11 @@ +package work.slhaf.partner.api.agent.runtime.exception; + +public class AgentRunningFailedException extends AgentRuntimeException{ + public AgentRunningFailedException(String message) { + super(message); + } + + public AgentRunningFailedException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/GlobalExceptionHandler.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/GlobalExceptionHandler.java index ce373d28..9d0de831 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/GlobalExceptionHandler.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/GlobalExceptionHandler.java @@ -9,18 +9,28 @@ public class GlobalExceptionHandler { private AgentExceptionCallback exceptionCallback = new LogAgentExceptionCallback(); - public void handle(Throwable e) { - - switch (e.getClass().getSimpleName()) { - case "AgentRuntimeException": - exceptionCallback.onRuntimeException((AgentRuntimeException) e); - break; - case "AgentLaunchFailedException": - exceptionCallback.onFailedException((AgentLaunchFailedException) e); - break; - default: - log.error("未知异常: ", e); + public boolean handle(Throwable e) { + boolean exit; + Throwable cause = e.getCause(); + switch (cause) { + case AgentRunningFailedException arfe -> { + exit = true; + exceptionCallback.onRuntimeException((AgentRuntimeException) cause); + } + case AgentRuntimeException are -> { + exit = false; + exceptionCallback.onRuntimeException((AgentRuntimeException) cause); + } + case AgentLaunchFailedException alfe -> { + exit = true; + exceptionCallback.onFailedException((AgentLaunchFailedException) cause); + } + default -> { + exit = true; + log.error("意外异常: ", cause); + } } + return exit; } public static void setExceptionCallback(AgentExceptionCallback callback) { diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/AgentInteractionAdapter.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/AgentInteractionAdapter.java index 52bf595c..1a4b7705 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/AgentInteractionAdapter.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/AgentInteractionAdapter.java @@ -8,14 +8,15 @@ import work.slhaf.partner.api.agent.runtime.interaction.flow.AgentRunningFlow; import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext; import java.util.List; +import java.util.Map; public abstract class AgentInteractionAdapter { protected AgentRunningFlow agentRunningFlow = new AgentRunningFlow<>(); - protected List moduleList = AgentConfigManager.INSTANCE.getModuleList(); + protected Map> moduleOrderedMap = AgentConfigManager.INSTANCE.getModuleOrderedMap(); public C call(C finalInputData){ - return agentRunningFlow.launch(moduleList, finalInputData); + return agentRunningFlow.launch(moduleOrderedMap, finalInputData); } protected abstract O parseOutputData(C outputContext); diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/flow/AgentRunningFlow.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/flow/AgentRunningFlow.java index 0bee1fd3..531cdc88 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/flow/AgentRunningFlow.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/flow/AgentRunningFlow.java @@ -1,27 +1,52 @@ package work.slhaf.partner.api.agent.runtime.interaction.flow; import work.slhaf.partner.api.agent.factory.module.pojo.MetaModule; +import work.slhaf.partner.api.agent.runtime.exception.AgentRuntimeException; import work.slhaf.partner.api.agent.runtime.exception.GlobalExceptionHandler; import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext; +import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; /** * Agent执行流程 */ public class AgentRunningFlow { - public C launch(List moduleList, C interactionContext){ - try { + public C launch(Map> modules, C interactionContext) { + try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) { //流程执行启动 - for (MetaModule metaModule : moduleList) { - metaModule.getInstance().execute(interactionContext); + for (Map.Entry> entry : modules.entrySet()) { + List> futures = new ArrayList<>(); + List moduleList = entry.getValue(); + for (MetaModule module : moduleList) { + Future future = executor.submit(() -> { + try { + module.getInstance().execute(interactionContext); + } catch (Exception e) { + throw new AgentRuntimeException("模块执行出错: " + module.getName(), e); + } + }); + futures.add(future); + } + for (Future future : futures) { + try { + future.get(); + } catch (Exception e) { + boolean exit = GlobalExceptionHandler.INSTANCE.handle(e); + if (exit) throw new AgentRuntimeException("Agent执行出错!", e); + interactionContext.getErrMsg().add(e.getLocalizedMessage()); + } + } } interactionContext.setOk(1); - }catch (Exception e){ - GlobalExceptionHandler.INSTANCE.handle(e); + } catch (Exception e) { interactionContext.setOk(0); - interactionContext.setErrMsg(e.getMessage()); + interactionContext.getErrMsg().add(e.getLocalizedMessage()); } return interactionContext; } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/flow/abstracts/ActivateModel.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/flow/abstracts/ActivateModel.java index 1c61d561..2b8a222d 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/flow/abstracts/ActivateModel.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/flow/abstracts/ActivateModel.java @@ -87,6 +87,9 @@ public interface ActivateModel { ((Module) this).setModel(model); } + /** + * 对应调用的模型配置名称 + */ String modelKey(); boolean withBasicPrompt(); diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/flow/entity/RunningFlowContext.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/flow/entity/RunningFlowContext.java index 0e47e639..b05cd63a 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/flow/entity/RunningFlowContext.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/flow/entity/RunningFlowContext.java @@ -4,6 +4,9 @@ import lombok.Data; import lombok.EqualsAndHashCode; import work.slhaf.partner.api.common.entity.PersistableObject; +import java.util.ArrayList; +import java.util.List; + /** * 流程上下文 */ @@ -11,5 +14,5 @@ import work.slhaf.partner.api.common.entity.PersistableObject; @Data public abstract class RunningFlowContext extends PersistableObject { protected int ok; - protected String errMsg; + protected List errMsg = new ArrayList<>(); } diff --git a/Partner-Api/src/test/java/module/ModuleProxyTest.java b/Partner-Api/src/test/java/module/ModuleProxyTest.java index b5c67a24..e39cbc4a 100644 --- a/Partner-Api/src/test/java/module/ModuleProxyTest.java +++ b/Partner-Api/src/test/java/module/ModuleProxyTest.java @@ -6,11 +6,12 @@ import net.bytebuddy.matcher.ElementMatchers; import org.junit.jupiter.api.Test; import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningModule; +import java.io.IOException; import java.lang.reflect.InvocationTargetException; public class ModuleProxyTest { @Test - public void test() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { + public void test() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, IOException, ClassNotFoundException { Class clazz = new ByteBuddy().subclass(MyAgentRunningModule.class) .method(ElementMatchers.isOverriddenFrom(AgentRunningModule.class)) .intercept(MethodDelegation.to( diff --git a/Partner-Main/dependency-reduced-pom.xml b/Partner-Main/dependency-reduced-pom.xml new file mode 100644 index 00000000..a04bb1c9 --- /dev/null +++ b/Partner-Main/dependency-reduced-pom.xml @@ -0,0 +1,43 @@ + + + + Partner + work.slhaf + 0.5.0 + + 4.0.0 + Partner-Main + + + + maven-shade-plugin + + + package + + shade + + + + + work.slhaf.partner.Main + + + + + + + + maven-surefire-plugin + + true + + + + + + 21 + 21 + UTF-8 + + diff --git a/Partner-Main/pom.xml b/Partner-Main/pom.xml index 6abb0aa0..cb06e7da 100644 --- a/Partner-Main/pom.xml +++ b/Partner-Main/pom.xml @@ -22,6 +22,12 @@ Partner-Api 0.5.0 + + org.jetbrains.kotlinx + kotlinx-coroutines-core + 1.10.2 + test + @@ -30,4 +36,35 @@ UTF-8 + + + + org.apache.maven.plugins + maven-shade-plugin + + + package + + shade + + + + + work.slhaf.partner.Main + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + + \ No newline at end of file diff --git a/Partner-Main/src/main/java/work/slhaf/Main.java b/Partner-Main/src/main/java/work/slhaf/partner/Main.java similarity index 95% rename from Partner-Main/src/main/java/work/slhaf/Main.java rename to Partner-Main/src/main/java/work/slhaf/partner/Main.java index a366defd..14dc1c1d 100644 --- a/Partner-Main/src/main/java/work/slhaf/Main.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/Main.java @@ -1,4 +1,4 @@ -package work.slhaf; +package work.slhaf.partner; import work.slhaf.partner.api.agent.Agent; import work.slhaf.partner.common.config.PartnerAgentConfigManager; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/common/exception/callback/GlobalExceptionHandler.java b/Partner-Main/src/main/java/work/slhaf/partner/common/exception/callback/GlobalExceptionHandler.java deleted file mode 100644 index 6e57a644..00000000 --- a/Partner-Main/src/main/java/work/slhaf/partner/common/exception/callback/GlobalExceptionHandler.java +++ /dev/null @@ -1,43 +0,0 @@ -package work.slhaf.partner.common.exception.callback; - -import lombok.extern.slf4j.Slf4j; -import work.slhaf.partner.runtime.exception.pojo.GlobalException; -import work.slhaf.partner.runtime.exception.pojo.GlobalExceptionData; - -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - -@Slf4j -public class GlobalExceptionHandler { - - private static final String EXCEPTION_STATIC_PATH = "./data/exception_snapshot/"; - - public static void writeExceptionState(GlobalException exception) { - GlobalExceptionData exceptionData = exception.getData(); - Path filePath = Paths.get(EXCEPTION_STATIC_PATH, exceptionData.getExceptionTime() + ".dat"); - try { - Files.createDirectories(Path.of(EXCEPTION_STATIC_PATH)); - ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath.toFile())); - oos.writeObject(exceptionData); - oos.close(); - log.warn("[GlobalExceptionHandler] 捕获异常, 已保存到: {}", filePath); - } catch (IOException e) { - log.error("[GlobalExceptionHandler] 捕获异常, 保存失败: ", e); - } - } - - public static GlobalExceptionData readExceptionState(String filePath) { - try { - ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath)); - GlobalExceptionData exceptionData = (GlobalExceptionData) ois.readObject(); - ois.close(); - log.info("[GlobalExceptionHandler] 已从: {} 读取异常快照", filePath); - return exceptionData; - } catch (IOException | ClassNotFoundException e) { - log.error("[GlobalExceptionHandler] 读取异常, 读取失败: ", e); - return null; - } - } -} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/CoordinatedManager.java b/Partner-Main/src/main/java/work/slhaf/partner/core/CoordinatedManager.java index 7fbd27f5..27686167 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/CoordinatedManager.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/CoordinatedManager.java @@ -5,16 +5,13 @@ import lombok.extern.slf4j.Slf4j; import work.slhaf.partner.api.agent.factory.capability.annotation.CoordinateManager; import work.slhaf.partner.api.agent.factory.capability.annotation.Coordinated; import work.slhaf.partner.api.chat.constant.ChatConstant; -import work.slhaf.partner.common.exception.callback.GlobalExceptionHandler; +import work.slhaf.partner.core.cache.CacheCore; import work.slhaf.partner.core.cognation.CognationCore; -import work.slhaf.partner.core.submodule.cache.CacheCore; -import work.slhaf.partner.core.submodule.dispatch.DispatchCore; -import work.slhaf.partner.core.submodule.memory.MemoryCore; -import work.slhaf.partner.core.submodule.memory.pojo.MemoryResult; -import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice; -import work.slhaf.partner.core.submodule.memory.pojo.MemorySliceResult; -import work.slhaf.partner.core.submodule.perceive.PerceiveCore; -import work.slhaf.partner.runtime.exception.pojo.GlobalException; +import work.slhaf.partner.core.memory.MemoryCore; +import work.slhaf.partner.core.memory.pojo.MemoryResult; +import work.slhaf.partner.core.memory.pojo.MemorySlice; +import work.slhaf.partner.core.memory.pojo.MemorySliceResult; +import work.slhaf.partner.core.perceive.PerceiveCore; import java.io.IOException; import java.io.Serial; @@ -35,35 +32,13 @@ public class CoordinatedManager implements Serializable { @Serial private static final long serialVersionUID = 1L; - private static volatile CoordinatedManager coordinatedManager; private final Lock sliceInsertLock = new ReentrantLock(); + //在框架将自动注入core,详见CapabilityRegistryFactory private CognationCore cognationCore; private CacheCore cacheCore; private MemoryCore memoryCore; private PerceiveCore perceiveCore; - private DispatchCore dispatchCore; - - public static CoordinatedManager getInstance() throws IOException, ClassNotFoundException { - if (coordinatedManager == null) { - synchronized (CoordinatedManager.class) { - if (coordinatedManager == null) { - coordinatedManager = new CoordinatedManager(); - coordinatedManager.setCognationCore(CognationCore.getInstance()); - coordinatedManager.setCores(); - log.info("[CoordinatedManager] MemoryManager注册完毕..."); - } - } - } - return coordinatedManager; - } - - private void setCores() { - this.setCacheCore(this.getCognationCore().getCacheCore()); - this.setMemoryCore(this.getCognationCore().getMemoryCore()); - this.setPerceiveCore(this.getCognationCore().getPerceiveCore()); - } - @Coordinated(capability = "memory") public MemoryResult selectMemory(String topicPathStr) { @@ -89,7 +64,6 @@ public class CoordinatedManager implements Serializable { memoryResult = new MemoryResult(); memoryResult.setRelatedMemorySliceResult(new ArrayList<>()); memoryResult.setMemorySliceResult(new CopyOnWriteArrayList<>()); - GlobalExceptionHandler.writeExceptionState(new GlobalException(e.getLocalizedMessage())); } return cacheFilter(memoryResult); } @@ -127,7 +101,6 @@ public class CoordinatedManager implements Serializable { } } catch (Exception e) { log.error("[CoordinatedManager] 插入记忆时出错: ", e); - GlobalExceptionHandler.writeExceptionState(new GlobalException("插入记忆时出错: " + e.getLocalizedMessage())); } log.debug("[CoordinatedManager] 插入切片: {}, 路径: {}", memorySlice, topicPath); sliceInsertLock.unlock(); diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/PartnerCore.java b/Partner-Main/src/main/java/work/slhaf/partner/core/PartnerCore.java new file mode 100644 index 00000000..eee0652c --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/PartnerCore.java @@ -0,0 +1,93 @@ +package work.slhaf.partner.core; + +import cn.hutool.core.bean.BeanUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FileUtils; +import work.slhaf.partner.api.agent.runtime.config.AgentConfigManager; +import work.slhaf.partner.api.common.entity.PersistableObject; +import work.slhaf.partner.common.config.PartnerAgentConfigManager; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; + +@Slf4j +public abstract class PartnerCore> extends PersistableObject { + + private static final String STORAGE_DIR = "./data/memory/"; + private final String id = ((PartnerAgentConfigManager) AgentConfigManager.INSTANCE).getConfig().getAgentId(); + + public PartnerCore() throws IOException, ClassNotFoundException { + createStorageDirectory(); + Path filePath = getFilePath(id); + if (Files.exists(filePath)) { + T deserialize = deserialize(); + setupData(deserialize, (T) this); + } else { + FileUtils.createParentDirectories(filePath.toFile().getParentFile()); + this.serialize(); + } + setupHook(this); + log.info("[{}] 注册完毕", getCoreKey()); + + } + + private void setupHook(PartnerCore temp) { + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + temp.serialize(); + log.info("[{}] 已保存", getCoreKey()); + } catch (IOException e) { + log.error("[{}] 保存失败: ", getCoreKey(), e); + } + })); + + } + + private void setupData(T source, T current) { + BeanUtil.copyProperties(source, current); + } + + public void serialize() throws IOException { + //先写入到临时文件,如果正常写入则覆盖原文件 + Path filePath = getFilePath(id + "-temp"); + Files.createDirectories(Path.of(STORAGE_DIR)); + try { + ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath.toFile())); + oos.writeObject(this); + oos.close(); + Path path = getFilePath(id); + Files.move(filePath, path, StandardCopyOption.REPLACE_EXISTING); + log.info("[{}] 已保存到: {}", getCoreKey(), path); + } catch (IOException e) { + Files.delete(filePath); + log.error("[{}] 序列化保存失败: {}", getCoreKey(), e.getMessage()); + } + } + + private T deserialize() throws IOException, ClassNotFoundException { + Path filePath = getFilePath(id); + try (ObjectInputStream ois = new ObjectInputStream( + new FileInputStream(filePath.toFile()))) { + T graph = (T) ois.readObject(); + log.info("[{}] 已从文件加载: {}", getCoreKey(), filePath); + return graph; + } + } + + private Path getFilePath(String s) { + return Paths.get(STORAGE_DIR, s + "-" + getCoreKey() + ".memory"); + } + + private void createStorageDirectory() { + try { + Files.createDirectories(Paths.get(STORAGE_DIR)); + } catch (IOException e) { + log.error("[{}]创建存储目录失败: {}", getCoreKey(), e.getMessage()); + } + } + + protected abstract String getCoreKey(); +} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionData.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionData.java new file mode 100644 index 00000000..4fed2443 --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionData.java @@ -0,0 +1,11 @@ +package work.slhaf.partner.core.action.entity; + +import lombok.Data; + +@Data +public class ActionData { + private String key; + private String[] array; + private String reason; + private String description; +} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionStatus.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionStatus.java new file mode 100644 index 00000000..1bb77215 --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionStatus.java @@ -0,0 +1,5 @@ +package work.slhaf.partner.core.action.entity; + +public enum ActionStatus { + SUCCESS, FAILED, EXECUTING, WAITING +} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionType.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionType.java new file mode 100644 index 00000000..2354929e --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionType.java @@ -0,0 +1,5 @@ +package work.slhaf.partner.core.action.entity; + +public enum ActionType { + IMMEDIATE, PLANNING +} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/MetaActionInfo.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/MetaActionInfo.java new file mode 100644 index 00000000..7cf97bf3 --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/MetaActionInfo.java @@ -0,0 +1,13 @@ +package work.slhaf.partner.core.action.entity; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class MetaActionInfo { + private ActionData actionData; + private ActionStatus status; + private String Result; + private LocalDateTime dateTime; +} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/cache/CacheCapability.java b/Partner-Main/src/main/java/work/slhaf/partner/core/cache/CacheCapability.java similarity index 50% rename from Partner-Main/src/main/java/work/slhaf/partner/core/submodule/cache/CacheCapability.java rename to Partner-Main/src/main/java/work/slhaf/partner/core/cache/CacheCapability.java index 36422753..43da5c81 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/cache/CacheCapability.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/cache/CacheCapability.java @@ -1,9 +1,11 @@ -package work.slhaf.partner.core.submodule.cache; +package work.slhaf.partner.core.cache; import work.slhaf.partner.api.agent.factory.capability.annotation.Capability; +import work.slhaf.partner.core.memory.pojo.EvaluatedSlice; import java.time.LocalDateTime; import java.util.HashMap; +import java.util.List; import java.util.concurrent.ConcurrentHashMap; @Capability(value = "cache") @@ -13,4 +15,11 @@ public interface CacheCapability { void updateDialogMap(LocalDateTime dateTime, String newDialogCache); String getDialogMapStr(); String getUserDialogMapStr(String userId); + void updateActivatedSlices(String userId, List memorySlices); + String getActivatedSlicesStr(String userId); + HashMap> getActivatedSlices(); + void clearActivatedSlices(String userId); + boolean hasActivatedSlices(String userId); + int getActivatedSlicesSize(String userId); + List getActivatedSlices(String userId); } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/cache/CacheCore.java b/Partner-Main/src/main/java/work/slhaf/partner/core/cache/CacheCore.java similarity index 76% rename from Partner-Main/src/main/java/work/slhaf/partner/core/submodule/cache/CacheCore.java rename to Partner-Main/src/main/java/work/slhaf/partner/core/cache/CacheCore.java index 2dc96f33..f1a316e4 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/cache/CacheCore.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/cache/CacheCore.java @@ -1,14 +1,18 @@ -package work.slhaf.partner.core.submodule.cache; +package work.slhaf.partner.core.cache; import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityCore; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityMethod; -import work.slhaf.partner.api.common.entity.PersistableObject; -import work.slhaf.partner.core.submodule.memory.pojo.MemoryResult; -import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice; +import work.slhaf.partner.core.PartnerCore; +import work.slhaf.partner.core.cognation.pojo.ActiveData; +import work.slhaf.partner.core.memory.pojo.EvaluatedSlice; +import work.slhaf.partner.core.memory.pojo.MemoryResult; +import work.slhaf.partner.core.memory.pojo.MemorySlice; +import java.io.IOException; import java.io.Serial; import java.time.LocalDate; import java.time.LocalDateTime; @@ -19,11 +23,11 @@ import java.util.concurrent.ConcurrentHashMap; @Slf4j @CapabilityCore(value = "cache") @Getter -public class CacheCore extends PersistableObject { +@Setter +public class CacheCore extends PartnerCore { @Serial private static final long serialVersionUID = 1L; - public static volatile CacheCore cacheCore; /** * 近两日的对话总结缓存, 用于为大模型提供必要的记忆补充, hashmap以切片的存储时间为键,总结为值 @@ -58,13 +62,11 @@ public class CacheCore extends PersistableObject { */ private Set selectedSlices = new HashSet<>(); - public CacheCore() { - cacheCore = this; + private ActiveData activeData = new ActiveData(); + + public CacheCore() throws IOException, ClassNotFoundException { } - public static CacheCore getInstance(){ - return cacheCore; - } @CapabilityMethod public void updateDialogMap(LocalDateTime dateTime, String newDialogCache) { @@ -179,4 +181,44 @@ public class CacheCore extends PersistableObject { return null; } + @CapabilityMethod + public void updateActivatedSlices(String userId, List memorySlices) { + activeData.updateActivatedSlices(userId, memorySlices); + log.debug("[CoordinatedManager] 已更新激活切片, userId: {}", userId); + } + + @CapabilityMethod + public String getActivatedSlicesStr(String userId) { + return activeData.getActivatedSlicesStr(userId); + } + + @CapabilityMethod + public HashMap> getActivatedSlices() { + return activeData.getActivatedSlices(); + } + + @CapabilityMethod + public void clearActivatedSlices(String userId) { + activeData.clearActivatedSlices(userId); + } + + @CapabilityMethod + public boolean hasActivatedSlices(String userId) { + return activeData.hasActivatedSlices(userId); + } + + @CapabilityMethod + public int getActivatedSlicesSize(String userId) { + return activeData.getActivatedSlices().get(userId).size(); + } + + @CapabilityMethod + public List getActivatedSlices(String userId) { + return activeData.getActivatedSlices().get(userId); + } + + @Override + protected String getCoreKey() { + return "cache-core"; + } } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/cognation/CognationCapability.java b/Partner-Main/src/main/java/work/slhaf/partner/core/cognation/CognationCapability.java index 3a0b8c3e..81c4b290 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/cognation/CognationCapability.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/cognation/CognationCapability.java @@ -3,7 +3,7 @@ package work.slhaf.partner.core.cognation; import work.slhaf.partner.api.agent.factory.capability.annotation.Capability; import work.slhaf.partner.api.agent.factory.capability.annotation.ToCoordinated; import work.slhaf.partner.api.chat.pojo.Message; -import work.slhaf.partner.core.submodule.memory.pojo.EvaluatedSlice; +import work.slhaf.partner.api.chat.pojo.MetaMessage; import java.util.HashMap; import java.util.List; @@ -15,14 +15,14 @@ public interface CognationCapability { List getChatMessages(); void setChatMessages(List chatMessages); void cleanMessage(List messages); - void updateActivatedSlices(String userId, List memorySlices); - String getActivatedSlicesStr(String userId); - HashMap> getActivatedSlices(); - void clearActivatedSlices(String userId); - boolean hasActivatedSlices(String userId); - int getActivatedSlicesSize(String userId); - List getActivatedSlices(String userId); Lock getMessageLock(); + void addMetaMessage(String userId, MetaMessage metaMessage); + List unpackAndClear(String userId); + void refreshMemoryId(); + void resetLastUpdatedTime(); + long getLastUpdatedTime(); + HashMap> getSingleMetaMessageMap(); + String getCurrentMemoryId(); @ToCoordinated boolean isSingleUser(); diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/cognation/CognationCore.java b/Partner-Main/src/main/java/work/slhaf/partner/core/cognation/CognationCore.java index 3e416460..2c4587d6 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/cognation/CognationCore.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/cognation/CognationCore.java @@ -1,72 +1,46 @@ package work.slhaf.partner.core.cognation; -import lombok.Data; +import com.alibaba.fastjson2.JSONObject; import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.FileUtils; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityCore; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityMethod; import work.slhaf.partner.api.chat.pojo.Message; -import work.slhaf.partner.api.common.entity.PersistableObject; -import work.slhaf.partner.core.cognation.pojo.ActiveData; -import work.slhaf.partner.core.submodule.cache.CacheCore; -import work.slhaf.partner.core.submodule.memory.MemoryCore; -import work.slhaf.partner.core.submodule.memory.pojo.EvaluatedSlice; -import work.slhaf.partner.core.submodule.perceive.PerceiveCore; +import work.slhaf.partner.api.chat.pojo.MetaMessage; +import work.slhaf.partner.core.PartnerCore; -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; +import java.io.IOException; +import java.io.Serial; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.UUID; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @EqualsAndHashCode(callSuper = true) -@Data @Slf4j @CapabilityCore(value = "cognation") -public class CognationCore extends PersistableObject { +@Getter +@Setter +public class CognationCore extends PartnerCore { @Serial private static final long serialVersionUID = 1L; - private static final String STORAGE_DIR = "./data/memory/"; - private static volatile CognationCore cognationCore; - - private MemoryCore memoryCore = new MemoryCore(); - private CacheCore cacheCore = new CacheCore(); - private PerceiveCore perceiveCore = new PerceiveCore(); - private ReentrantLock messageLock = new ReentrantLock(); - private ActiveData activeData; + private final ReentrantLock messageLock = new ReentrantLock(); /** * 主模型的聊天记录 */ private List chatMessages = new ArrayList<>(); + private HashMap> singleMetaMessageMap = new HashMap<>(); + private String currentMemoryId; + private long lastUpdatedTime; public CognationCore() throws IOException, ClassNotFoundException { - createStorageDirectory(); - Path filePath = getFilePath("partner"); - if (Files.exists(filePath)) { - setupData(this); - } else { - FileUtils.createParentDirectories(filePath.toFile().getParentFile()); - connectCores(this); - this.activeData = new ActiveData(); - this.serialize(); - } - setupHook(this); - log.info("CognationCore注册完毕..."); - } - - private void connectCores(CognationCore temp) { - temp.setCacheCore(CacheCore.getInstance()); - temp.setMemoryCore(MemoryCore.getInstance()); - temp.setPerceiveCore(PerceiveCore.getInstance()); } @CapabilityMethod @@ -74,76 +48,26 @@ public class CognationCore extends PersistableObject { return chatMessages; } + @CapabilityMethod + public long getLastUpdatedTime(){ + return lastUpdatedTime; + } + + @CapabilityMethod + public HashMap> getSingleMetaMessageMap(){ + return singleMetaMessageMap; + } + + @CapabilityMethod + public String getCurrentMemoryId(){ + return currentMemoryId; + } + @CapabilityMethod public void setChatMessages(List chatMessages) { this.chatMessages = chatMessages; } - private void setupHook(CognationCore temp) { - Runtime.getRuntime().addShutdownHook(new Thread(() -> { - try { - temp.serialize(); - log.info("[CognationCore] CognationCore已保存"); - } catch (IOException e) { - log.error("[CognationCore] CognationCore保存失败: ", e); - } - })); - - } - - private void setupData(CognationCore temp) throws IOException, ClassNotFoundException { - CognationCore deserialize = deserialize(); - temp.activeData = deserialize.activeData; - temp.memoryCore = deserialize.memoryCore; - temp.cacheCore = deserialize.cacheCore; - temp.perceiveCore = deserialize.perceiveCore; - temp.chatMessages = deserialize.chatMessages; - } - - - public static CognationCore getInstance() { - return cognationCore; - } - - public void serialize() throws IOException { - //先写入到临时文件,如果正常写入则覆盖原文件 - Path filePath = getFilePath("partner-temp"); - Files.createDirectories(Path.of(STORAGE_DIR)); - try { - ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath.toFile())); - oos.writeObject(this); - oos.close(); - Path path = getFilePath("partner"); - Files.move(filePath, path, StandardCopyOption.REPLACE_EXISTING); - log.info("CognationCore 已保存到: {}", path); - } catch (IOException e) { - Files.delete(filePath); - log.error("序列化保存失败: {}", e.getMessage()); - } - } - - private static CognationCore deserialize() throws IOException, ClassNotFoundException { - Path filePath = getFilePath("partner"); - try (ObjectInputStream ois = new ObjectInputStream( - new FileInputStream(filePath.toFile()))) { - CognationCore graph = (CognationCore) ois.readObject(); - log.info("CognationCore 已从文件加载: {}", filePath); - return graph; - } - } - - private static Path getFilePath(String s) { - return Paths.get(STORAGE_DIR, s + ".memory"); - } - - private static void createStorageDirectory() { - try { - Files.createDirectories(Paths.get(STORAGE_DIR)); - } catch (IOException e) { - System.err.println("创建存储目录失败: " + e.getMessage()); - } - } - @CapabilityMethod public void cleanMessage(List messages) { messageLock.lock(); @@ -152,45 +76,46 @@ public class CognationCore extends PersistableObject { } - @CapabilityMethod - public void updateActivatedSlices(String userId, List memorySlices) { - activeData.updateActivatedSlices(userId, memorySlices); - log.debug("[CoordinatedManager] 已更新激活切片, userId: {}", userId); - } - - @CapabilityMethod - public String getActivatedSlicesStr(String userId) { - return activeData.getActivatedSlicesStr(userId); - } - - @CapabilityMethod - public HashMap> getActivatedSlices() { - return activeData.getActivatedSlices(); - } - - @CapabilityMethod - public void clearActivatedSlices(String userId) { - activeData.clearActivatedSlices(userId); - } - - @CapabilityMethod - public boolean hasActivatedSlices(String userId) { - return activeData.hasActivatedSlices(userId); - } - - @CapabilityMethod - public int getActivatedSlicesSize(String userId) { - return activeData.getActivatedSlices().get(userId).size(); - } - - @CapabilityMethod - public List getActivatedSlices(String userId) { - return activeData.getActivatedSlices().get(userId); - } - @CapabilityMethod public Lock getMessageLock() { return messageLock; } -} + @CapabilityMethod + public void addMetaMessage(String userId, MetaMessage metaMessage) { + log.debug("[{}] 当前会话历史: {}", JSONObject.toJSONString(singleMetaMessageMap)); + if (singleMetaMessageMap.containsKey(userId)) { + singleMetaMessageMap.get(userId).add(metaMessage); + } else { + singleMetaMessageMap.put(userId, new java.util.ArrayList<>()); + singleMetaMessageMap.get(userId).add(metaMessage); + } + log.debug("[SessionManager] 会话历史更新: {}", JSONObject.toJSONString(singleMetaMessageMap)); + } + + @CapabilityMethod + public List unpackAndClear(String userId) { + List messages = new ArrayList<>(); + for (MetaMessage metaMessage : singleMetaMessageMap.get(userId)) { + messages.add(metaMessage.getUserMessage()); + messages.add(metaMessage.getAssistantMessage()); + } + singleMetaMessageMap.remove(userId); + return messages; + } + + @CapabilityMethod + public void refreshMemoryId() { + currentMemoryId = UUID.randomUUID().toString(); + } + + @CapabilityMethod + public void resetLastUpdatedTime() { + lastUpdatedTime = System.currentTimeMillis(); + } + + @Override + protected String getCoreKey() { + return "cognation-core"; + } +} \ No newline at end of file diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/cognation/pojo/ActiveData.java b/Partner-Main/src/main/java/work/slhaf/partner/core/cognation/pojo/ActiveData.java index a6826748..2bffa94b 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/cognation/pojo/ActiveData.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/cognation/pojo/ActiveData.java @@ -3,7 +3,7 @@ package work.slhaf.partner.core.cognation.pojo; import lombok.Data; import lombok.EqualsAndHashCode; import work.slhaf.partner.api.common.entity.PersistableObject; -import work.slhaf.partner.core.submodule.memory.pojo.EvaluatedSlice; +import work.slhaf.partner.core.memory.pojo.EvaluatedSlice; import java.io.Serial; import java.util.HashMap; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/MemoryCapability.java b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/MemoryCapability.java similarity index 77% rename from Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/MemoryCapability.java rename to Partner-Main/src/main/java/work/slhaf/partner/core/memory/MemoryCapability.java index 35b639c4..57381567 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/MemoryCapability.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/MemoryCapability.java @@ -1,9 +1,9 @@ -package work.slhaf.partner.core.submodule.memory; +package work.slhaf.partner.core.memory; import work.slhaf.partner.api.agent.factory.capability.annotation.Capability; import work.slhaf.partner.api.agent.factory.capability.annotation.ToCoordinated; -import work.slhaf.partner.core.submodule.memory.pojo.MemoryResult; -import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice; +import work.slhaf.partner.core.memory.pojo.MemoryResult; +import work.slhaf.partner.core.memory.pojo.MemorySlice; import java.io.IOException; import java.time.LocalDate; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/MemoryCore.java b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/MemoryCore.java similarity index 93% rename from Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/MemoryCore.java rename to Partner-Main/src/main/java/work/slhaf/partner/core/memory/MemoryCore.java index 902176f4..beb70878 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/MemoryCore.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/MemoryCore.java @@ -1,17 +1,18 @@ -package work.slhaf.partner.core.submodule.memory; +package work.slhaf.partner.core.memory; -import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityCore; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityMethod; -import work.slhaf.partner.api.common.entity.PersistableObject; -import work.slhaf.partner.core.submodule.memory.exception.UnExistedDateIndexException; -import work.slhaf.partner.core.submodule.memory.exception.UnExistedTopicException; -import work.slhaf.partner.core.submodule.memory.pojo.MemoryResult; -import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice; -import work.slhaf.partner.core.submodule.memory.pojo.MemorySliceResult; -import work.slhaf.partner.core.submodule.memory.pojo.node.MemoryNode; -import work.slhaf.partner.core.submodule.memory.pojo.node.TopicNode; +import work.slhaf.partner.core.PartnerCore; +import work.slhaf.partner.core.memory.exception.UnExistedDateIndexException; +import work.slhaf.partner.core.memory.exception.UnExistedTopicException; +import work.slhaf.partner.core.memory.pojo.MemoryResult; +import work.slhaf.partner.core.memory.pojo.MemorySlice; +import work.slhaf.partner.core.memory.pojo.MemorySliceResult; +import work.slhaf.partner.core.memory.pojo.node.MemoryNode; +import work.slhaf.partner.core.memory.pojo.node.TopicNode; import java.io.IOException; import java.io.Serial; @@ -21,13 +22,13 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; @EqualsAndHashCode(callSuper = true) -@Data @CapabilityCore(value = "memory") -public class MemoryCore extends PersistableObject { +@Getter +@Setter +public class MemoryCore extends PartnerCore { @Serial private static final long serialVersionUID = 1L; - public static MemoryCore memoryCore; /** * key: 根主题名称 value: 根主题节点 @@ -57,13 +58,9 @@ public class MemoryCore extends PersistableObject { private HashMap> userIndex = new HashMap<>(); - public MemoryCore(){ - memoryCore = this; + public MemoryCore() throws IOException, ClassNotFoundException { } - public static MemoryCore getInstance() { - return memoryCore; - } public MemoryResult selectMemory(LocalDate date) throws IOException, ClassNotFoundException { MemoryResult memoryResult = new MemoryResult(); @@ -328,6 +325,11 @@ public class MemoryCore extends PersistableObject { @CapabilityMethod public void cleanSelectedSliceFilter() { - this.getSelectedSlices().clear(); + this.selectedSlices.clear(); + } + + @Override + protected String getCoreKey() { + return "memory-core"; } } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/exception/NullSliceListException.java b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/exception/NullSliceListException.java similarity index 71% rename from Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/exception/NullSliceListException.java rename to Partner-Main/src/main/java/work/slhaf/partner/core/memory/exception/NullSliceListException.java index cdf03e1e..3884da49 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/exception/NullSliceListException.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/exception/NullSliceListException.java @@ -1,4 +1,4 @@ -package work.slhaf.partner.core.submodule.memory.exception; +package work.slhaf.partner.core.memory.exception; public class NullSliceListException extends RuntimeException { public NullSliceListException(String message) { diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/exception/UnExistedDateIndexException.java b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/exception/UnExistedDateIndexException.java similarity index 72% rename from Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/exception/UnExistedDateIndexException.java rename to Partner-Main/src/main/java/work/slhaf/partner/core/memory/exception/UnExistedDateIndexException.java index 241ee983..4c45070b 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/exception/UnExistedDateIndexException.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/exception/UnExistedDateIndexException.java @@ -1,4 +1,4 @@ -package work.slhaf.partner.core.submodule.memory.exception; +package work.slhaf.partner.core.memory.exception; public class UnExistedDateIndexException extends RuntimeException { public UnExistedDateIndexException(String message) { diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/exception/UnExistedTopicException.java b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/exception/UnExistedTopicException.java similarity index 71% rename from Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/exception/UnExistedTopicException.java rename to Partner-Main/src/main/java/work/slhaf/partner/core/memory/exception/UnExistedTopicException.java index 42218a53..57700c9b 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/exception/UnExistedTopicException.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/exception/UnExistedTopicException.java @@ -1,4 +1,4 @@ -package work.slhaf.partner.core.submodule.memory.exception; +package work.slhaf.partner.core.memory.exception; public class UnExistedTopicException extends RuntimeException { public UnExistedTopicException(String message) { diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/pojo/EvaluatedSlice.java b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/pojo/EvaluatedSlice.java similarity index 89% rename from Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/pojo/EvaluatedSlice.java rename to Partner-Main/src/main/java/work/slhaf/partner/core/memory/pojo/EvaluatedSlice.java index 50a0affb..a7ac48f4 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/pojo/EvaluatedSlice.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/pojo/EvaluatedSlice.java @@ -1,4 +1,4 @@ -package work.slhaf.partner.core.submodule.memory.pojo; +package work.slhaf.partner.core.memory.pojo; import lombok.Builder; import lombok.Data; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/pojo/MemoryResult.java b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/pojo/MemoryResult.java similarity index 93% rename from Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/pojo/MemoryResult.java rename to Partner-Main/src/main/java/work/slhaf/partner/core/memory/pojo/MemoryResult.java index 3f9f5ad2..39b33bec 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/pojo/MemoryResult.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/pojo/MemoryResult.java @@ -1,4 +1,4 @@ -package work.slhaf.partner.core.submodule.memory.pojo; +package work.slhaf.partner.core.memory.pojo; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/pojo/MemorySlice.java b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/pojo/MemorySlice.java similarity index 97% rename from Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/pojo/MemorySlice.java rename to Partner-Main/src/main/java/work/slhaf/partner/core/memory/pojo/MemorySlice.java index 51f771b6..84f9f899 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/pojo/MemorySlice.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/pojo/MemorySlice.java @@ -1,4 +1,4 @@ -package work.slhaf.partner.core.submodule.memory.pojo; +package work.slhaf.partner.core.memory.pojo; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/pojo/MemorySliceResult.java b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/pojo/MemorySliceResult.java similarity index 90% rename from Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/pojo/MemorySliceResult.java rename to Partner-Main/src/main/java/work/slhaf/partner/core/memory/pojo/MemorySliceResult.java index edb79efa..06e3f8d6 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/pojo/MemorySliceResult.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/pojo/MemorySliceResult.java @@ -1,4 +1,4 @@ -package work.slhaf.partner.core.submodule.memory.pojo; +package work.slhaf.partner.core.memory.pojo; import com.alibaba.fastjson2.annotation.JSONField; import lombok.Data; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/pojo/node/MemoryNode.java b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/pojo/node/MemoryNode.java similarity index 92% rename from Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/pojo/node/MemoryNode.java rename to Partner-Main/src/main/java/work/slhaf/partner/core/memory/pojo/node/MemoryNode.java index 0c3b4c8d..f2e5dec2 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/pojo/node/MemoryNode.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/pojo/node/MemoryNode.java @@ -1,11 +1,11 @@ -package work.slhaf.partner.core.submodule.memory.pojo.node; +package work.slhaf.partner.core.memory.pojo.node; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; import work.slhaf.partner.api.common.entity.PersistableObject; -import work.slhaf.partner.core.submodule.memory.exception.NullSliceListException; -import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice; +import work.slhaf.partner.core.memory.exception.NullSliceListException; +import work.slhaf.partner.core.memory.pojo.MemorySlice; import java.io.*; import java.nio.file.Files; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/pojo/node/TopicNode.java b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/pojo/node/TopicNode.java similarity index 90% rename from Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/pojo/node/TopicNode.java rename to Partner-Main/src/main/java/work/slhaf/partner/core/memory/pojo/node/TopicNode.java index 9f0638ee..93d06a6f 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/memory/pojo/node/TopicNode.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/memory/pojo/node/TopicNode.java @@ -1,4 +1,4 @@ -package work.slhaf.partner.core.submodule.memory.pojo.node; +package work.slhaf.partner.core.memory.pojo.node; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/perceive/PerceiveCapability.java b/Partner-Main/src/main/java/work/slhaf/partner/core/perceive/PerceiveCapability.java similarity index 74% rename from Partner-Main/src/main/java/work/slhaf/partner/core/submodule/perceive/PerceiveCapability.java rename to Partner-Main/src/main/java/work/slhaf/partner/core/perceive/PerceiveCapability.java index 1602585d..502283c2 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/perceive/PerceiveCapability.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/perceive/PerceiveCapability.java @@ -1,7 +1,7 @@ -package work.slhaf.partner.core.submodule.perceive; +package work.slhaf.partner.core.perceive; import work.slhaf.partner.api.agent.factory.capability.annotation.Capability; -import work.slhaf.partner.core.submodule.perceive.pojo.User; +import work.slhaf.partner.core.perceive.pojo.User; @Capability(value = "perceive") public interface PerceiveCapability { diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/perceive/PerceiveCore.java b/Partner-Main/src/main/java/work/slhaf/partner/core/perceive/PerceiveCore.java similarity index 84% rename from Partner-Main/src/main/java/work/slhaf/partner/core/submodule/perceive/PerceiveCore.java rename to Partner-Main/src/main/java/work/slhaf/partner/core/perceive/PerceiveCore.java index eea1a495..b4895952 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/perceive/PerceiveCore.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/perceive/PerceiveCore.java @@ -1,13 +1,15 @@ -package work.slhaf.partner.core.submodule.perceive; +package work.slhaf.partner.core.perceive; -import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityCore; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityMethod; -import work.slhaf.partner.api.common.entity.PersistableObject; +import work.slhaf.partner.core.PartnerCore; import work.slhaf.partner.core.cognation.exception.UserNotExistsException; -import work.slhaf.partner.core.submodule.perceive.pojo.User; +import work.slhaf.partner.core.perceive.pojo.User; +import java.io.IOException; import java.io.Serial; import java.util.ArrayList; import java.util.HashMap; @@ -16,13 +18,13 @@ import java.util.UUID; import java.util.concurrent.locks.ReentrantLock; @EqualsAndHashCode(callSuper = true) -@Data @CapabilityCore(value = "perceive") -public class PerceiveCore extends PersistableObject { +@Getter +@Setter +public class PerceiveCore extends PartnerCore { @Serial private static final long serialVersionUID = 1L; - private static volatile PerceiveCore perceiveCore; private static final ReentrantLock usersLock = new ReentrantLock(); /** @@ -30,12 +32,7 @@ public class PerceiveCore extends PersistableObject { */ private List users = new ArrayList<>(); - public PerceiveCore() { - perceiveCore = this; - } - - public static PerceiveCore getInstance() { - return perceiveCore; + public PerceiveCore() throws IOException, ClassNotFoundException { } @CapabilityMethod @@ -94,4 +91,9 @@ public class PerceiveCore extends PersistableObject { user.updateRelationChange(user.getRelationChange()); usersLock.unlock(); } + + @Override + protected String getCoreKey() { + return "perceive-core"; + } } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/perceive/pojo/User.java b/Partner-Main/src/main/java/work/slhaf/partner/core/perceive/pojo/User.java similarity index 96% rename from Partner-Main/src/main/java/work/slhaf/partner/core/submodule/perceive/pojo/User.java rename to Partner-Main/src/main/java/work/slhaf/partner/core/perceive/pojo/User.java index c6251634..5f970d10 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/perceive/pojo/User.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/perceive/pojo/User.java @@ -1,4 +1,4 @@ -package work.slhaf.partner.core.submodule.perceive.pojo; +package work.slhaf.partner.core.perceive.pojo; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/dispatch/DispatchCapability.java b/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/dispatch/DispatchCapability.java deleted file mode 100644 index e1a0d05b..00000000 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/dispatch/DispatchCapability.java +++ /dev/null @@ -1,4 +0,0 @@ -package work.slhaf.partner.core.submodule.dispatch; - -public interface DispatchCapability { -} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/dispatch/DispatchCore.java b/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/dispatch/DispatchCore.java deleted file mode 100644 index 73ad8eb3..00000000 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/dispatch/DispatchCore.java +++ /dev/null @@ -1,32 +0,0 @@ -package work.slhaf.partner.core.submodule.dispatch; - -import work.slhaf.partner.api.common.entity.PersistableObject; -import work.slhaf.partner.core.submodule.dispatch.pojo.DispatchData; - -import java.io.Serial; - -public class DispatchCore extends PersistableObject { - - @Serial - private static final long serialVersionUID = 1L; - public static volatile DispatchCore dispatchCore; - - public static DispatchCore getInstance() { - if (dispatchCore == null) { - synchronized (DispatchCore.class) { - if (dispatchCore == null) { - dispatchCore = new DispatchCore(); - } - } - } - return dispatchCore; - } - - public void dispatch(DispatchData dispatchData){ - - } - - public void listDispatchData(){ - - } -} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/dispatch/pojo/DispatchData.java b/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/dispatch/pojo/DispatchData.java deleted file mode 100644 index 36a26247..00000000 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/submodule/dispatch/pojo/DispatchData.java +++ /dev/null @@ -1,15 +0,0 @@ -package work.slhaf.partner.core.submodule.dispatch.pojo; - -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -public class DispatchData { - private LocalDateTime dateTime; - private String userId; - private String comment; - - //TODO 替换为<执行器>或者<插件> - private String executor; -} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/common/module/PostRunningModule.java b/Partner-Main/src/main/java/work/slhaf/partner/module/common/module/PostRunningModule.java index 4b05fdb0..9bfc1277 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/common/module/PostRunningModule.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/common/module/PostRunningModule.java @@ -10,12 +10,12 @@ public abstract class PostRunningModule extends AgentRunningModule { - private void setAppendedPrompt(PartnerRunningFlowContext context) { + private synchronized void setAppendedPrompt(PartnerRunningFlowContext context) { AppendPromptData data = new AppendPromptData(); data.setModuleName(moduleName()); HashMap map = getPromptDataMap(context.getUserId()); @@ -21,12 +21,15 @@ public abstract class PreRunningModule extends AgentRunningModule getPromptDataMap(String userId); + /** + * 用于在CoreModule接收到的模块Prompt中标识模块名称 + */ protected abstract String moduleName(); @Override diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/ActionPlanner.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/ActionPlanner.java new file mode 100644 index 00000000..fabbb404 --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/ActionPlanner.java @@ -0,0 +1,46 @@ +package work.slhaf.partner.module.modules.action.planner; + +import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule; +import work.slhaf.partner.api.agent.factory.module.annotation.InjectModule; +import work.slhaf.partner.module.common.module.PreRunningModule; +import work.slhaf.partner.module.modules.action.planner.evaluator.ActionEvaluator; +import work.slhaf.partner.module.modules.action.planner.extractor.ActionExtractor; +import work.slhaf.partner.module.modules.action.planner.extractor.entity.ExtractorInput; +import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext; + +import java.io.IOException; +import java.util.HashMap; + +/** + * 负责针对本次输入生成基础的行动建议,是否执行由主模型判断。 + */ +@AgentModule(name = "task_planner",order = 2) +public class ActionPlanner extends PreRunningModule { + + @InjectModule + private ActionEvaluator actionEvaluator; + @InjectModule + private ActionExtractor actionExtractor; + + @Override + protected void doExecute(PartnerRunningFlowContext context) throws IOException, ClassNotFoundException { + ExtractorInput extractorInput = getExtractorInput(context); + } + + private ExtractorInput getExtractorInput(PartnerRunningFlowContext context) { + ExtractorInput input = new ExtractorInput(); + input.setInput(context.getInput()); + input.setRecentMessages(); + return input; + } + + @Override + protected HashMap getPromptDataMap(String userId) { + return null; + } + + @Override + protected String moduleName() { + return "task_planner"; + } +} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/ActionEvaluator.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/ActionEvaluator.java new file mode 100644 index 00000000..299b3259 --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/ActionEvaluator.java @@ -0,0 +1,27 @@ +package work.slhaf.partner.module.modules.action.planner.evaluator; + +import work.slhaf.partner.api.agent.factory.module.annotation.AgentSubModule; +import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.ActivateModel; +import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningSubModule; +import work.slhaf.partner.module.modules.action.planner.evaluator.entity.EvaluatorInput; +import work.slhaf.partner.module.modules.action.planner.evaluator.entity.EvaluatorResult; + +@AgentSubModule +public class ActionEvaluator extends AgentRunningSubModule implements ActivateModel { + + @Override + public EvaluatorResult execute(EvaluatorInput data) { + + return null; + } + + @Override + public String modelKey() { + return "action_evaluator"; + } + + @Override + public boolean withBasicPrompt() { + return true; + } +} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/entity/EvaluatorInput.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/entity/EvaluatorInput.java new file mode 100644 index 00000000..f933e97d --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/entity/EvaluatorInput.java @@ -0,0 +1,11 @@ +package work.slhaf.partner.module.modules.action.planner.evaluator.entity; + +import lombok.Data; + +import java.util.List; + +@Data +public class EvaluatorInput { + private List recentMessages; + private String tendency; +} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/entity/EvaluatorResult.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/entity/EvaluatorResult.java new file mode 100644 index 00000000..84302d18 --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/entity/EvaluatorResult.java @@ -0,0 +1,13 @@ +package work.slhaf.partner.module.modules.action.planner.evaluator.entity; + +import lombok.Data; +import work.slhaf.partner.core.action.entity.ActionData; +import work.slhaf.partner.core.action.entity.ActionType; + +@Data +public class EvaluatorResult { + private boolean ok; + private ActionType type; + private String typeInfo; + private ActionData actionData; +} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/ActionExtractor.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/ActionExtractor.java new file mode 100644 index 00000000..2e66d1dd --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/ActionExtractor.java @@ -0,0 +1,27 @@ +package work.slhaf.partner.module.modules.action.planner.extractor; + +import work.slhaf.partner.api.agent.factory.module.annotation.AgentSubModule; +import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.ActivateModel; +import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningSubModule; +import work.slhaf.partner.module.modules.action.planner.extractor.entity.ExtractorInput; +import work.slhaf.partner.module.modules.action.planner.extractor.entity.ExtractorResult; + +@AgentSubModule +public class ActionExtractor extends AgentRunningSubModule implements ActivateModel { + + @Override + public ExtractorResult execute(ExtractorInput data) { + + return null; + } + + @Override + public String modelKey() { + return "action_extractor"; + } + + @Override + public boolean withBasicPrompt() { + return false; + } +} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/entity/ExtractorInput.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/entity/ExtractorInput.java new file mode 100644 index 00000000..bd42536c --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/entity/ExtractorInput.java @@ -0,0 +1,12 @@ +package work.slhaf.partner.module.modules.action.planner.extractor.entity; + +import lombok.Data; +import work.slhaf.partner.api.chat.pojo.Message; + +import java.util.List; + +@Data +public class ExtractorInput { + private String input; + private List recentMessages; +} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/entity/ExtractorResult.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/entity/ExtractorResult.java new file mode 100644 index 00000000..7afc9301 --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/entity/ExtractorResult.java @@ -0,0 +1,9 @@ +package work.slhaf.partner.module.modules.action.planner.extractor.entity; + +import lombok.Data; + +@Data +public class ExtractorResult { + private boolean action; + private String tendency; +} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/scheduler/ActionDispatcher.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/scheduler/ActionDispatcher.java new file mode 100644 index 00000000..7b2c8805 --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/scheduler/ActionDispatcher.java @@ -0,0 +1,4 @@ +package work.slhaf.partner.module.modules.action.scheduler; + +public class ActionDispatcher { +} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/scheduler/TaskScheduler.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/scheduler/TaskScheduler.java new file mode 100644 index 00000000..72e88c4c --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/scheduler/TaskScheduler.java @@ -0,0 +1,7 @@ +package work.slhaf.partner.module.modules.action.scheduler; + +/** + * 负责综合前置模块 + */ +public class TaskScheduler { +} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/core/CoreModel.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/core/CoreModel.java index 1de74159..7f07ad00 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/core/CoreModel.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/core/CoreModel.java @@ -17,7 +17,6 @@ import work.slhaf.partner.core.cognation.CognationCapability; import work.slhaf.partner.module.common.entity.AppendPromptData; import work.slhaf.partner.module.common.model.ModelConstant; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext; -import work.slhaf.partner.runtime.session.SessionManager; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -34,7 +33,6 @@ public class CoreModel extends AgentRunningModule imp @InjectCapability private CognationCapability cognationCapability; - private SessionManager sessionManager; private List appendedMessages; @Init @@ -42,7 +40,6 @@ public class CoreModel extends AgentRunningModule imp List chatMessages = this.cognationCapability.getChatMessages(); this.getModel().setChatMessages(chatMessages); this.appendedMessages = new ArrayList<>(); - this.sessionManager = SessionManager.getInstance(); updateChatClientSettings(); log.info("[CoreModel] CoreModel注册完毕..."); @@ -181,7 +178,7 @@ public class CoreModel extends AgentRunningModule imp //区分单人聊天场景 if (runningFlowContext.isSingle()) { MetaMessage metaMessage = new MetaMessage(primaryUserMessage, assistantMessage); - sessionManager.addMetaMessage(runningFlowContext.getUserId(), metaMessage); + cognationCapability.addMetaMessage(runningFlowContext.getUserId(), metaMessage); } } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/MemorySelector.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/MemorySelector.java index 127647f9..3295814a 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/MemorySelector.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/MemorySelector.java @@ -7,20 +7,20 @@ import lombok.extern.slf4j.Slf4j; import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule; import work.slhaf.partner.api.agent.factory.module.annotation.InjectModule; +import work.slhaf.partner.core.cache.CacheCapability; import work.slhaf.partner.core.cognation.CognationCapability; -import work.slhaf.partner.core.submodule.cache.CacheCapability; -import work.slhaf.partner.core.submodule.memory.MemoryCapability; -import work.slhaf.partner.core.submodule.memory.exception.UnExistedDateIndexException; -import work.slhaf.partner.core.submodule.memory.exception.UnExistedTopicException; -import work.slhaf.partner.core.submodule.memory.pojo.EvaluatedSlice; -import work.slhaf.partner.core.submodule.memory.pojo.MemoryResult; -import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice; +import work.slhaf.partner.core.memory.MemoryCapability; +import work.slhaf.partner.core.memory.exception.UnExistedDateIndexException; +import work.slhaf.partner.core.memory.exception.UnExistedTopicException; +import work.slhaf.partner.core.memory.pojo.EvaluatedSlice; +import work.slhaf.partner.core.memory.pojo.MemoryResult; +import work.slhaf.partner.core.memory.pojo.MemorySlice; import work.slhaf.partner.module.common.module.PreRunningModule; import work.slhaf.partner.module.modules.memory.selector.evaluator.SliceSelectEvaluator; -import work.slhaf.partner.module.modules.memory.selector.evaluator.data.EvaluatorInput; +import work.slhaf.partner.module.modules.memory.selector.evaluator.entity.EvaluatorInput; import work.slhaf.partner.module.modules.memory.selector.extractor.MemorySelectExtractor; -import work.slhaf.partner.module.modules.memory.selector.extractor.data.ExtractorMatchData; -import work.slhaf.partner.module.modules.memory.selector.extractor.data.ExtractorResult; +import work.slhaf.partner.module.modules.memory.selector.extractor.entity.ExtractorMatchData; +import work.slhaf.partner.module.modules.memory.selector.extractor.entity.ExtractorResult; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext; import java.io.IOException; @@ -33,7 +33,7 @@ import java.util.List; @EqualsAndHashCode(callSuper = true) @Data @Slf4j -@AgentModule(name="memory_selector",order=1) +@AgentModule(name="memory_selector",order=2) public class MemorySelector extends PreRunningModule { @InjectCapability @@ -54,9 +54,9 @@ public class MemorySelector extends PreRunningModule { //获取主题路径 ExtractorResult extractorResult = memorySelectExtractor.execute(runningFlowContext); if (extractorResult.isRecall() || !extractorResult.getMatches().isEmpty()) { - cognationCapability.clearActivatedSlices(userId); + cacheCapability.clearActivatedSlices(userId); List evaluatedSlices = selectAndEvaluateMemory(runningFlowContext, extractorResult); - cognationCapability.updateActivatedSlices(userId, evaluatedSlices); + cacheCapability.updateActivatedSlices(userId, evaluatedSlices); } setModuleContextRecall(runningFlowContext); } @@ -81,10 +81,10 @@ public class MemorySelector extends PreRunningModule { private void setModuleContextRecall(PartnerRunningFlowContext runningFlowContext) { String userId = runningFlowContext.getUserId(); - boolean recall = cognationCapability.hasActivatedSlices(userId); + boolean recall = cacheCapability.hasActivatedSlices(userId); runningFlowContext.getModuleContext().getExtraContext().put("recall", recall); if (recall) { - runningFlowContext.getModuleContext().getExtraContext().put("recall_count", cognationCapability.getActivatedSlicesSize(userId)); + runningFlowContext.getModuleContext().getExtraContext().put("recall_count", cacheCapability.getActivatedSlicesSize(userId)); } } @@ -148,7 +148,7 @@ public class MemorySelector extends PreRunningModule { map.put("[用户记忆缓存] <与最新一条消息的发送者的近两天对话记忆印象, 可能与[记忆缓存]稍有重复>", userDialogMapStr); } - String sliceStr = cognationCapability.getActivatedSlicesStr(userId); + String sliceStr = cacheCapability.getActivatedSlicesStr(userId); if (sliceStr != null && !sliceStr.isEmpty()) { map.put("[记忆切片] <你与最新一条消息的发送者的相关回忆, 不会与[记忆缓存]重复, 如果有重复你也可以指出来()>", sliceStr); } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/SliceSelectEvaluator.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/SliceSelectEvaluator.java index 66e2c751..0165b87d 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/SliceSelectEvaluator.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/SliceSelectEvaluator.java @@ -11,14 +11,14 @@ import work.slhaf.partner.api.agent.factory.module.annotation.Init; import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.ActivateModel; import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningSubModule; import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor; -import work.slhaf.partner.core.submodule.memory.pojo.EvaluatedSlice; -import work.slhaf.partner.core.submodule.memory.pojo.MemoryResult; -import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice; -import work.slhaf.partner.core.submodule.memory.pojo.MemorySliceResult; -import work.slhaf.partner.module.modules.memory.selector.evaluator.data.EvaluatorBatchInput; -import work.slhaf.partner.module.modules.memory.selector.evaluator.data.EvaluatorInput; -import work.slhaf.partner.module.modules.memory.selector.evaluator.data.EvaluatorResult; -import work.slhaf.partner.module.modules.memory.selector.evaluator.data.SliceSummary; +import work.slhaf.partner.core.memory.pojo.EvaluatedSlice; +import work.slhaf.partner.core.memory.pojo.MemoryResult; +import work.slhaf.partner.core.memory.pojo.MemorySlice; +import work.slhaf.partner.core.memory.pojo.MemorySliceResult; +import work.slhaf.partner.module.modules.memory.selector.evaluator.entity.EvaluatorBatchInput; +import work.slhaf.partner.module.modules.memory.selector.evaluator.entity.EvaluatorInput; +import work.slhaf.partner.module.modules.memory.selector.evaluator.entity.EvaluatorResult; +import work.slhaf.partner.module.modules.memory.selector.evaluator.entity.SliceSummary; import java.util.*; import java.util.concurrent.Callable; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/data/EvaluatorBatchInput.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/entity/EvaluatorBatchInput.java similarity index 96% rename from Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/data/EvaluatorBatchInput.java rename to Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/entity/EvaluatorBatchInput.java index 2395be66..d38427a1 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/data/EvaluatorBatchInput.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/entity/EvaluatorBatchInput.java @@ -1,4 +1,4 @@ -package work.slhaf.partner.module.modules.memory.selector.evaluator.data; +package work.slhaf.partner.module.modules.memory.selector.evaluator.entity; import lombok.Builder; import lombok.Data; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/data/EvaluatorInput.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/entity/EvaluatorInput.java similarity index 81% rename from Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/data/EvaluatorInput.java rename to Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/entity/EvaluatorInput.java index 89b01f11..29ff6a96 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/data/EvaluatorInput.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/entity/EvaluatorInput.java @@ -1,9 +1,9 @@ -package work.slhaf.partner.module.modules.memory.selector.evaluator.data; +package work.slhaf.partner.module.modules.memory.selector.evaluator.entity; import lombok.Builder; import lombok.Data; import work.slhaf.partner.api.chat.pojo.Message; -import work.slhaf.partner.core.submodule.memory.pojo.MemoryResult; +import work.slhaf.partner.core.memory.pojo.MemoryResult; import java.util.List; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/data/EvaluatorResult.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/entity/EvaluatorResult.java similarity index 93% rename from Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/data/EvaluatorResult.java rename to Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/entity/EvaluatorResult.java index 426ebb31..d7ab99ee 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/data/EvaluatorResult.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/entity/EvaluatorResult.java @@ -1,4 +1,4 @@ -package work.slhaf.partner.module.modules.memory.selector.evaluator.data; +package work.slhaf.partner.module.modules.memory.selector.evaluator.entity; import lombok.Data; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/data/SliceSummary.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/entity/SliceSummary.java similarity index 95% rename from Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/data/SliceSummary.java rename to Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/entity/SliceSummary.java index 6335149d..92e36f2e 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/data/SliceSummary.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/evaluator/entity/SliceSummary.java @@ -1,4 +1,4 @@ -package work.slhaf.partner.module.modules.memory.selector.evaluator.data; +package work.slhaf.partner.module.modules.memory.selector.evaluator.entity; import lombok.Data; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/extractor/MemorySelectExtractor.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/extractor/MemorySelectExtractor.java index f4350063..43a33185 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/extractor/MemorySelectExtractor.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/selector/extractor/MemorySelectExtractor.java @@ -7,21 +7,18 @@ import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.api.agent.factory.module.annotation.AgentSubModule; -import work.slhaf.partner.api.agent.factory.module.annotation.Init; import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.ActivateModel; import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningSubModule; import work.slhaf.partner.api.chat.pojo.Message; import work.slhaf.partner.api.chat.pojo.MetaMessage; -import work.slhaf.partner.common.exception.callback.GlobalExceptionHandler; +import work.slhaf.partner.core.cache.CacheCapability; import work.slhaf.partner.core.cognation.CognationCapability; -import work.slhaf.partner.core.submodule.memory.MemoryCapability; -import work.slhaf.partner.core.submodule.memory.pojo.EvaluatedSlice; -import work.slhaf.partner.module.modules.memory.selector.extractor.data.ExtractorInput; -import work.slhaf.partner.module.modules.memory.selector.extractor.data.ExtractorMatchData; -import work.slhaf.partner.module.modules.memory.selector.extractor.data.ExtractorResult; -import work.slhaf.partner.runtime.exception.pojo.GlobalException; +import work.slhaf.partner.core.memory.MemoryCapability; +import work.slhaf.partner.core.memory.pojo.EvaluatedSlice; +import work.slhaf.partner.module.modules.memory.selector.extractor.entity.ExtractorInput; +import work.slhaf.partner.module.modules.memory.selector.extractor.entity.ExtractorMatchData; +import work.slhaf.partner.module.modules.memory.selector.extractor.entity.ExtractorResult; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext; -import work.slhaf.partner.runtime.session.SessionManager; import java.util.ArrayList; import java.util.List; @@ -40,22 +37,18 @@ public class MemorySelectExtractor extends AgentRunningSubModule chatMessages = new ArrayList<>(); - List metaMessages = sessionManager.getSingleMetaMessageMap().get(context.getUserId()); + List metaMessages = cognationCapability.getSingleMetaMessageMap().get(context.getUserId()); if (metaMessages == null) { - sessionManager.getSingleMetaMessageMap().put(context.getUserId(), new ArrayList<>()); + cognationCapability.getSingleMetaMessageMap().put(context.getUserId(), new ArrayList<>()); } else { for (MetaMessage metaMessage : metaMessages) { chatMessages.add(metaMessage.getUserMessage()); @@ -65,7 +58,7 @@ public class MemorySelectExtractor extends AgentRunningSubModule activatedMemorySlices = cognationCapability.getActivatedSlices(context.getUserId()); + List activatedMemorySlices = cacheCapability.getActivatedSlices(context.getUserId()); ExtractorInput extractorInput = ExtractorInput.builder() .text(context.getInput()) .date(context.getDateTime().toLocalDate()) @@ -79,7 +72,6 @@ public class MemorySelectExtractor extends AgentRunningSubModule UPDATE_TRIGGER_INTERVAL && chatCount > 1) { updateMemory(); cognationCapability.getChatMessages().clear(); // 重置MemoryId - sessionManager.refreshMemoryId(); + cognationCapability.refreshMemoryId(); log.info("[MemoryUpdater] 记忆更新: 自动触发"); } Thread.sleep(SCHEDULED_UPDATE_INTERVAL); @@ -133,7 +130,7 @@ public class MemoryUpdater extends PostRunningModule { updateSingleChatSlices(singleMemorySummary); // 更新多人场景下的记忆及相关的确定性记忆 updateMultiChatSlices(singleMemorySummary); - sessionManager.resetLastUpdatedTime(); + cognationCapability.resetLastUpdatedTime(); log.debug("[MemoryUpdater] 记忆更新流程结束..."); } @@ -219,12 +216,12 @@ public class MemoryUpdater extends PostRunningModule { private void updateSingleChatSlices(HashMap singleMemorySummary) { log.debug("[MemoryUpdater] 单聊记忆更新流程开始..."); // 更新单聊记忆,同时从chatMessages中去掉单聊记忆 - Set userIdSet = new HashSet<>(sessionManager.getSingleMetaMessageMap().keySet()); + Set userIdSet = new HashSet<>(cognationCapability.getSingleMetaMessageMap().keySet()); List> tasks = new ArrayList<>(); // 多人聊天? AtomicInteger count = new AtomicInteger(0); for (String id : userIdSet) { - List messages = sessionManager.unpackAndClear(id); + List messages = cognationCapability.unpackAndClear(id); tasks.add(() -> { int thisCount = count.incrementAndGet(); log.debug("[MemoryUpdater] 单聊记忆[{}]更新: {}", thisCount, id); @@ -262,7 +259,7 @@ public class MemoryUpdater extends PostRunningModule { private MemorySlice getMemorySlice(String userId, SummarizeResult summarizeResult, List chatMessages) { MemorySlice memorySlice = new MemorySlice(); // 设置 memoryId,timestamp - memorySlice.setMemoryId(sessionManager.getCurrentMemoryId()); + memorySlice.setMemoryId(cognationCapability.getCurrentMemoryId()); memorySlice.setTimestamp(System.currentTimeMillis()); // 补充信息 diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/MultiSummarizer.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/MultiSummarizer.java index 989d3bdf..e075fbd1 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/MultiSummarizer.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/MultiSummarizer.java @@ -10,8 +10,8 @@ import work.slhaf.partner.api.agent.factory.module.annotation.Init; import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.ActivateModel; import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningSubModule; import work.slhaf.partner.api.chat.pojo.ChatResponse; -import work.slhaf.partner.module.modules.memory.updater.summarizer.data.SummarizeInput; -import work.slhaf.partner.module.modules.memory.updater.summarizer.data.SummarizeResult; +import work.slhaf.partner.module.modules.memory.updater.summarizer.entity.SummarizeInput; +import work.slhaf.partner.module.modules.memory.updater.summarizer.entity.SummarizeResult; import java.util.ArrayList; import java.util.List; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/data/SummarizeInput.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/entity/SummarizeInput.java similarity index 96% rename from Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/data/SummarizeInput.java rename to Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/entity/SummarizeInput.java index 1c1d3d08..6fddd484 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/data/SummarizeInput.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/entity/SummarizeInput.java @@ -1,4 +1,4 @@ -package work.slhaf.partner.module.modules.memory.updater.summarizer.data; +package work.slhaf.partner.module.modules.memory.updater.summarizer.entity; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/data/SummarizeResult.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/entity/SummarizeResult.java similarity index 95% rename from Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/data/SummarizeResult.java rename to Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/entity/SummarizeResult.java index f3eae4db..5485149f 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/data/SummarizeResult.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/entity/SummarizeResult.java @@ -1,4 +1,4 @@ -package work.slhaf.partner.module.modules.memory.updater.summarizer.data; +package work.slhaf.partner.module.modules.memory.updater.summarizer.entity; import lombok.Data; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/selector/PerceiveSelector.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/selector/PerceiveSelector.java index 92ba1028..3d9f70ef 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/selector/PerceiveSelector.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/selector/PerceiveSelector.java @@ -4,8 +4,8 @@ import lombok.Setter; import lombok.extern.slf4j.Slf4j; import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule; -import work.slhaf.partner.core.submodule.perceive.PerceiveCapability; -import work.slhaf.partner.core.submodule.perceive.pojo.User; +import work.slhaf.partner.core.perceive.PerceiveCapability; +import work.slhaf.partner.core.perceive.pojo.User; import work.slhaf.partner.module.common.module.PreRunningModule; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/PerceiveUpdater.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/PerceiveUpdater.java index 3dfc4bf3..65d4f08c 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/PerceiveUpdater.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/PerceiveUpdater.java @@ -9,11 +9,11 @@ import work.slhaf.partner.api.agent.factory.module.annotation.Init; import work.slhaf.partner.api.agent.factory.module.annotation.InjectModule; import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor; import work.slhaf.partner.core.cognation.CognationCapability; -import work.slhaf.partner.core.submodule.perceive.PerceiveCapability; -import work.slhaf.partner.core.submodule.perceive.pojo.User; +import work.slhaf.partner.core.perceive.PerceiveCapability; +import work.slhaf.partner.core.perceive.pojo.User; import work.slhaf.partner.module.common.module.PostRunningModule; import work.slhaf.partner.module.modules.perceive.updater.relation_extractor.RelationExtractor; -import work.slhaf.partner.module.modules.perceive.updater.relation_extractor.pojo.RelationExtractResult; +import work.slhaf.partner.module.modules.perceive.updater.relation_extractor.entity.RelationExtractResult; import work.slhaf.partner.module.modules.perceive.updater.static_extractor.StaticMemoryExtractor; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext; @@ -29,7 +29,7 @@ import java.util.concurrent.locks.ReentrantLock; @EqualsAndHashCode(callSuper = true) @Slf4j @Data -@AgentModule(name = "perceive_updater", order = 8) +@AgentModule(name = "perceive_updater", order = 7) public class PerceiveUpdater extends PostRunningModule { private static volatile PerceiveUpdater perceiveUpdater; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/RelationExtractor.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/RelationExtractor.java index 2cc4f187..91284b98 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/RelationExtractor.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/RelationExtractor.java @@ -10,10 +10,10 @@ import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunn import work.slhaf.partner.api.chat.pojo.ChatResponse; import work.slhaf.partner.api.chat.pojo.Message; import work.slhaf.partner.core.cognation.CognationCapability; -import work.slhaf.partner.core.submodule.perceive.PerceiveCapability; -import work.slhaf.partner.core.submodule.perceive.pojo.User; -import work.slhaf.partner.module.modules.perceive.updater.relation_extractor.pojo.RelationExtractInput; -import work.slhaf.partner.module.modules.perceive.updater.relation_extractor.pojo.RelationExtractResult; +import work.slhaf.partner.core.perceive.PerceiveCapability; +import work.slhaf.partner.core.perceive.pojo.User; +import work.slhaf.partner.module.modules.perceive.updater.relation_extractor.entity.RelationExtractInput; +import work.slhaf.partner.module.modules.perceive.updater.relation_extractor.entity.RelationExtractResult; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext; import java.util.ArrayList; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/pojo/RelationExtractInput.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/entity/RelationExtractInput.java similarity index 93% rename from Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/pojo/RelationExtractInput.java rename to Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/entity/RelationExtractInput.java index fef6b732..81f77c0c 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/pojo/RelationExtractInput.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/entity/RelationExtractInput.java @@ -1,4 +1,4 @@ -package work.slhaf.partner.module.modules.perceive.updater.relation_extractor.pojo; +package work.slhaf.partner.module.modules.perceive.updater.relation_extractor.entity; import lombok.Data; import work.slhaf.partner.api.chat.pojo.Message; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/pojo/RelationExtractResult.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/entity/RelationExtractResult.java similarity index 93% rename from Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/pojo/RelationExtractResult.java rename to Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/entity/RelationExtractResult.java index e25695dc..286820ba 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/pojo/RelationExtractResult.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/entity/RelationExtractResult.java @@ -1,4 +1,4 @@ -package work.slhaf.partner.module.modules.perceive.updater.relation_extractor.pojo; +package work.slhaf.partner.module.modules.perceive.updater.relation_extractor.entity; import lombok.Data; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/static_extractor/StaticMemoryExtractor.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/static_extractor/StaticMemoryExtractor.java index d0eaa684..2e01ba9f 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/static_extractor/StaticMemoryExtractor.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/static_extractor/StaticMemoryExtractor.java @@ -10,8 +10,8 @@ import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.ActivateM import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningSubModule; import work.slhaf.partner.api.chat.pojo.ChatResponse; import work.slhaf.partner.core.cognation.CognationCapability; -import work.slhaf.partner.core.submodule.perceive.PerceiveCapability; -import work.slhaf.partner.module.modules.perceive.updater.static_extractor.data.StaticMemoryExtractInput; +import work.slhaf.partner.core.perceive.PerceiveCapability; +import work.slhaf.partner.module.modules.perceive.updater.static_extractor.entity.StaticMemoryExtractInput; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext; import java.util.HashMap; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/static_extractor/data/StaticMemoryExtractInput.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/static_extractor/entity/StaticMemoryExtractInput.java similarity index 94% rename from Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/static_extractor/data/StaticMemoryExtractInput.java rename to Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/static_extractor/entity/StaticMemoryExtractInput.java index 5fd6fde3..a35ca889 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/static_extractor/data/StaticMemoryExtractInput.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/perceive/updater/static_extractor/entity/StaticMemoryExtractInput.java @@ -1,4 +1,4 @@ -package work.slhaf.partner.module.modules.perceive.updater.static_extractor.data; +package work.slhaf.partner.module.modules.perceive.updater.static_extractor.entity; import lombok.Builder; import lombok.Data; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/process/PreprocessExecutor.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/process/PreprocessExecutor.java index e90a5b05..83fa6a67 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/process/PreprocessExecutor.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/process/PreprocessExecutor.java @@ -5,14 +5,12 @@ import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule; -import work.slhaf.partner.api.agent.factory.module.annotation.Init; import work.slhaf.partner.core.cognation.CognationCapability; -import work.slhaf.partner.core.submodule.perceive.PerceiveCapability; -import work.slhaf.partner.core.submodule.perceive.pojo.User; +import work.slhaf.partner.core.perceive.PerceiveCapability; +import work.slhaf.partner.core.perceive.pojo.User; import work.slhaf.partner.module.common.module.PreRunningModule; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext; import work.slhaf.partner.runtime.interaction.data.context.subcontext.CoreContext; -import work.slhaf.partner.runtime.session.SessionManager; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -30,12 +28,6 @@ public class PreprocessExecutor extends PreRunningModule { private CognationCapability cognationCapability; @InjectCapability private PerceiveCapability perceiveCapability; - private SessionManager sessionManager; - - @Init - public void init() { - this.sessionManager = SessionManager.getInstance(); - } @Override public void doExecute(PartnerRunningFlowContext context) { @@ -44,9 +36,9 @@ public class PreprocessExecutor extends PreRunningModule { } private void checkAndSetMemoryId() { - String currentMemoryId = sessionManager.getCurrentMemoryId(); + String currentMemoryId = cognationCapability.getCurrentMemoryId(); if (currentMemoryId == null || cognationCapability.getChatMessages().isEmpty()) { - sessionManager.refreshMemoryId(); + cognationCapability.refreshMemoryId(); } } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/task/TaskEvaluator.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/task/TaskEvaluator.java deleted file mode 100644 index cf7d4521..00000000 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/task/TaskEvaluator.java +++ /dev/null @@ -1,21 +0,0 @@ -package work.slhaf.partner.module.modules.task; - -import lombok.Data; - -@Data -public class TaskEvaluator { - private static TaskEvaluator taskEvaluator; - - private TaskEvaluator (){} - - public static TaskEvaluator getInstance() { - if (taskEvaluator == null) { - taskEvaluator = new TaskEvaluator(); - } - return taskEvaluator; - } - - protected String modelKey() { - return "task_evaluator"; - } -} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/task/TaskExecutor.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/task/TaskExecutor.java deleted file mode 100644 index 2ba09776..00000000 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/task/TaskExecutor.java +++ /dev/null @@ -1,20 +0,0 @@ -package work.slhaf.partner.module.modules.task; - -import lombok.Data; -import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor; - -@Data -public class TaskExecutor { - - private static TaskExecutor taskExecutor; - private InteractionThreadPoolExecutor executor; - private TaskExecutor(){} - - public static TaskExecutor getInstance(){ - if (taskExecutor == null){ - taskExecutor = new TaskExecutor(); - taskExecutor.setExecutor(InteractionThreadPoolExecutor.getInstance()); - } - return taskExecutor; - } -} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/task/TaskScheduler.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/task/TaskScheduler.java deleted file mode 100644 index c3c70166..00000000 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/task/TaskScheduler.java +++ /dev/null @@ -1,27 +0,0 @@ -package work.slhaf.partner.module.modules.task; - -import lombok.Data; -import lombok.extern.slf4j.Slf4j; -import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext; - -@Data -@Slf4j -public class TaskScheduler { - private static TaskScheduler taskScheduler; - - private TaskScheduler() { - } - - public static TaskScheduler getInstance() { - if (taskScheduler == null) { - taskScheduler = new TaskScheduler(); - log.info("TaskScheduler注册完毕..."); - } - - return taskScheduler; - } - - public void execute(PartnerRunningFlowContext runningFlowContext) { - - } -} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/task/data/TaskData.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/task/data/TaskData.java deleted file mode 100644 index ff24197f..00000000 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/task/data/TaskData.java +++ /dev/null @@ -1,31 +0,0 @@ -package work.slhaf.partner.module.modules.task.data; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -@Data -public class TaskData implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - private String id; - - /** - * 执行类别: 即时任务/定时任务 - */ - private String executeType; - - /** - * cron表达式,仅定时任务需要填写 - */ - private String cronStr; - private String comment; - - public static class Constant { - public static final String CURRENT = "current"; - public static final String SCHEDULE = "schedule"; - } -} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/runtime/exception/pojo/GlobalExceptionData.java b/Partner-Main/src/main/java/work/slhaf/partner/runtime/exception/pojo/GlobalExceptionData.java index eb7db433..b50527a9 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/runtime/exception/pojo/GlobalExceptionData.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/runtime/exception/pojo/GlobalExceptionData.java @@ -3,9 +3,7 @@ package work.slhaf.partner.runtime.exception.pojo; import lombok.Data; import lombok.EqualsAndHashCode; import work.slhaf.partner.api.common.entity.PersistableObject; -import work.slhaf.partner.core.cognation.CognationCore; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext; -import work.slhaf.partner.runtime.session.SessionManager; import java.io.Serial; import java.util.HashMap; @@ -20,7 +18,5 @@ public class GlobalExceptionData extends PersistableObject { private String exceptionMessage; protected HashMap context = PartnerRunningFlowContext.getInstance(); - protected SessionManager sessionManager = SessionManager.getInstance(); - protected CognationCore cognationCore = CognationCore.getInstance(); protected Long exceptionTime = System.currentTimeMillis(); } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/runtime/interaction/PartnerInteractionAdapter.java b/Partner-Main/src/main/java/work/slhaf/partner/runtime/interaction/PartnerInteractionAdapter.java index 2d6f28b0..a2223701 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/runtime/interaction/PartnerInteractionAdapter.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/runtime/interaction/PartnerInteractionAdapter.java @@ -10,12 +10,20 @@ public class PartnerInteractionAdapter extends AgentInteractionAdapter> singleMetaMessageMap; - private String currentMemoryId; - private long lastUpdatedTime; - - public static SessionManager getInstance() { - if (sessionManager == null) { - synchronized (SessionManager.class) { - if (sessionManager == null) { - String id = ((PartnerAgentConfigManager) AgentConfigManager.INSTANCE).getConfig().getAgentId(); - Path filePath = Paths.get(STORAGE_DIR, id + ".session"); - if (Files.exists(filePath)) { - sessionManager = deserialize(id); - if (sessionManager == null){ - throw new ServiceLoadFailedException("SessionManager 加载失败"); - } - } else { - sessionManager = new SessionManager(); - sessionManager.setSingleMetaMessageMap(new HashMap<>()); - sessionManager.id = id; - sessionManager.setShutdownHook(); - sessionManager.lastUpdatedTime = 0; - } - } - } - } - return sessionManager; - } - - private void setShutdownHook() { - Runtime.getRuntime().addShutdownHook(new Thread(() -> { - try { - sessionManager.serialize(); - log.info("[SessionManager] SessionManager 已保存"); - } catch (IOException e) { - log.error("[SessionManager] 保存 SessionManager 失败: ", e); - } - })); - } - - public void addMetaMessage(String userId, MetaMessage metaMessage) { - log.debug("[SessionManager] 当前会话历史: {}", JSONObject.toJSONString(singleMetaMessageMap)); - if (singleMetaMessageMap.containsKey(userId)) { - singleMetaMessageMap.get(userId).add(metaMessage); - } else { - singleMetaMessageMap.put(userId, new java.util.ArrayList<>()); - singleMetaMessageMap.get(userId).add(metaMessage); - } - log.debug("[SessionManager] 会话历史更新: {}", JSONObject.toJSONString(singleMetaMessageMap)); - } - - public List unpackAndClear(String userId) { - List messages = new ArrayList<>(); - for (MetaMessage metaMessage : singleMetaMessageMap.get(userId)) { - messages.add(metaMessage.getUserMessage()); - messages.add(metaMessage.getAssistantMessage()); - } - singleMetaMessageMap.remove(userId); - return messages; - } - - public void refreshMemoryId() { - currentMemoryId = UUID.randomUUID().toString(); - } - - public void serialize() throws IOException { - //先写入到临时文件,如果正常写入,则覆盖正式文件;否则删除临时文件 - Path filePath = getFilePath(this.id + "-temp"); - Files.createDirectories(Path.of(STORAGE_DIR)); - try { - ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath.toFile())); - oos.writeObject(this); - oos.close(); - Path path = getFilePath(this.id); - Files.move(filePath, path, StandardCopyOption.REPLACE_EXISTING); - log.info("[SessionManager] SessionManager 已保存到: {}", path); - } catch (IOException e) { - Files.delete(filePath); - log.error("[SessionManager] 序列化保存失败: {}", e.getMessage()); - } - } - - private static SessionManager deserialize(String id) { - Path filePath = getFilePath(id); - try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath.toFile()))) { - SessionManager sessionManager = (SessionManager) ois.readObject(); - log.info("[SessionManager] SessionManager 已从文件加载: {}", filePath); - return sessionManager; - }catch (IOException | ClassNotFoundException e) { - log.error("[SessionManager] 读取异常, 读取失败: ", e); - return null; - } - } - - public void resetLastUpdatedTime() { - lastUpdatedTime = System.currentTimeMillis(); - } - - private static Path getFilePath(String id) { - return Paths.get(STORAGE_DIR, id + ".session"); - } -} - - diff --git a/Partner-Main/src/test/java/ReflectionTest.java b/Partner-Main/src/test/java/ReflectionTest.java index c4a10305..d316e96d 100644 --- a/Partner-Main/src/test/java/ReflectionTest.java +++ b/Partner-Main/src/test/java/ReflectionTest.java @@ -1,9 +1,8 @@ import org.junit.jupiter.api.Test; -import work.slhaf.partner.core.submodule.memory.MemoryCapability; -import work.slhaf.partner.core.submodule.memory.pojo.MemoryResult; +import work.slhaf.partner.core.memory.MemoryCapability; +import work.slhaf.partner.core.memory.pojo.MemoryResult; import java.lang.reflect.Proxy; -import java.util.function.Function; public class ReflectionTest { @@ -21,9 +20,5 @@ public class ReflectionTest { return null; }); memory.selectMemory("111"); - - Function function = s -> { - return s.length(); - }; } } diff --git a/Partner-Main/src/test/java/RegexTest.kt b/Partner-Main/src/test/java/RegexTest.kt index 5c7171e3..bc97f9c2 100644 --- a/Partner-Main/src/test/java/RegexTest.kt +++ b/Partner-Main/src/test/java/RegexTest.kt @@ -1,53 +1,48 @@ -import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Test +import java.lang.String.join +import java.util.regex.Pattern -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +class RegexTest { + @Test + fun regexTest() { + val examples = arrayListOf( + "[小明(abc)] 我在开会] (te[]st)", + "[用户(昵)称(userId)] 你好[呀]", + "[测试账号(userId)] 这是一个(test(123))消息" + ) -public class RegexTest { + val pattern = Pattern.compile("\\[.*?\\(([^)]+)\\)\\]") -// @Test - public void regexTest(){ - String[] examples = { - "[小明(abc)] 我在开会] (te[]st)", - "[用户(昵)称(userId)] 你好[呀]", - "[测试账号(userId)] 这是一个(test(123))消息" - }; - - Pattern pattern = Pattern.compile("\\[.*?\\(([^)]+)\\)\\]"); - - for (String example : examples) { - Matcher matcher = pattern.matcher(example); + for (example in examples) { + val matcher = pattern.matcher(example) if (matcher.find()) { - System.out.println("在 '" + example + "' 中找到 userId: " + matcher.group(1)); - System.out.println(); + println("在 '$example' 中找到 userId: ${matcher.group(1)}") + println() } else { - System.out.println("在 '" + example + "' 中未找到 userId"); + println("在 '$example' 中未找到 userId") } } - } @Test - public void topicPathFixTest(){ - String a = "xxxxx[awdohno][awdsjo]"; - a = fix(a); - System.out.println(a); + fun topicPathFixTest() { + var a = "xxxxx[awdohno][awdsjo]" + a = fix(a) + println(a) } - private String fix(String topicPath) { - String[] parts = topicPath.split("->"); - List cleanedParts = new ArrayList<>(); + private fun fix(topicPath: String): String { + val parts = topicPath.split("->".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() + val cleanedParts: MutableList = ArrayList() - for (String part : parts) { + for (part in parts) { // 修正正则表达式,正确移除 [xxx] 部分 - String cleaned = part.replaceAll("\\[[^\\]]*\\]", "").trim(); + val cleaned = part.replace("\\[[^\\]]*\\]".toRegex(), "").trim { it <= ' ' } if (!cleaned.isEmpty()) { // 忽略空字符串 - cleanedParts.add(cleaned); + cleanedParts.add(cleaned) } } - return String.join("->", cleanedParts); + return join("->", cleanedParts) } } diff --git a/Partner-Main/src/test/java/SelfAwarenessTest.java b/Partner-Main/src/test/java/SelfAwarenessTest.java index b03aaab0..be2cc518 100644 --- a/Partner-Main/src/test/java/SelfAwarenessTest.java +++ b/Partner-Main/src/test/java/SelfAwarenessTest.java @@ -6,7 +6,7 @@ import work.slhaf.partner.api.chat.pojo.ChatResponse; import work.slhaf.partner.api.chat.pojo.Message; import work.slhaf.partner.common.util.ResourcesUtil; import work.slhaf.partner.module.common.model.ModelConstant; -import work.slhaf.partner.module.modules.memory.selector.extractor.data.ExtractorInput; +import work.slhaf.partner.module.modules.memory.selector.extractor.entity.ExtractorInput; import java.time.LocalDate; import java.util.ArrayList; diff --git a/Partner-Main/src/test/java/timewheel/TimeWheelTest.kt b/Partner-Main/src/test/java/timewheel/TimeWheelTest.kt new file mode 100644 index 00000000..6a76f691 --- /dev/null +++ b/Partner-Main/src/test/java/timewheel/TimeWheelTest.kt @@ -0,0 +1,20 @@ +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking + +fun main(): Unit = runBlocking { + launch { + delay(1000) + println(11) + } + launch { + delay(1000) + println(22) + } + launch { + delay(1000) + println(33) + } + launch { + } +} diff --git a/Partner-Test-Demo/dependency-reduced-pom.xml b/Partner-Test-Demo/dependency-reduced-pom.xml new file mode 100644 index 00000000..ccbb65ef --- /dev/null +++ b/Partner-Test-Demo/dependency-reduced-pom.xml @@ -0,0 +1,55 @@ + + + + Partner + work.slhaf + 0.5.0 + + 4.0.0 + Partner-Test-Demo + + + + maven-jar-plugin + 3.2.0 + + + + work.slhaf.demo.AgentDemoApplication + + + + + + maven-shade-plugin + 3.4.1 + + + package + + shade + + + + + work.slhaf.demo.AgentDemoApplication + + + + + + + + maven-surefire-plugin + + true + + + + + + 21 + 21 + UTF-8 + + diff --git a/Partner-Test-Demo/pom.xml b/Partner-Test-Demo/pom.xml index 691c3e20..de2f801e 100644 --- a/Partner-Test-Demo/pom.xml +++ b/Partner-Test-Demo/pom.xml @@ -25,4 +25,49 @@ UTF-8 + + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.0 + + + + work.slhaf.demo.AgentDemoApplication + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.4.1 + + + package + + shade + + + + + work.slhaf.demo.AgentDemoApplication + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 3245d701..a8783473 100644 --- a/pom.xml +++ b/pom.xml @@ -18,42 +18,79 @@ 21 21 UTF-8 + 2.2.0 + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-test + ${kotlin.version} + test + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.4.1 + + + package + + shade + + + + + work.slhaf.demo.AgentDemoApplication + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + - org.apache.maven.plugins - maven-jar-plugin - 3.2.0 - - - - work.slhaf.demo.AgentDemoApplication - - - - - - - org.apache.maven.plugins - maven-shade-plugin - 3.4.1 + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} - package + compile + compile - shade + compile + + + + test-compile + test-compile + + test-compile - - - - work.slhaf.demo.AgentDemoApplication - - - + + ${maven.compiler.target} +