From 86548903a0a5fc72c92f13413ba2f1cb48dec5d2 Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Mon, 11 Aug 2025 00:19:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=85=8D=E7=BD=AE=E5=B7=A5?= =?UTF-8?q?=E5=8E=82=E9=81=97=E7=95=99=E9=97=AE=E9=A2=98;=20=E5=88=9D?= =?UTF-8?q?=E6=AD=A5=E5=AE=8C=E5=96=84=20AgentRunningFlow=20=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E7=9B=B8=E5=85=B3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复了 ActivateModel 中 model 实例化后却未赋值的问题 - 调整 Api 包下目录结构, 新增 runtime 包用于存放运行时相关类 - 完善 AgentConfigManager 基类以及对应的默认实现类中的加载、序列化以及更新逻辑 - 将异常类型分类为‘启动时异常’与‘运行时异常’,前者将直接导致启动停止,后者可通过异常回调实现进行处理 - 新增全局异常处理类以及默认的异常回调实现 - 新增几个异常类 - 完善 Agent 链式构建流程, 实际上只是做了一些方法转发,但毕竟那些可提供自定义实现的,不管是factory还是manager、handler, 它们都过于分散了。 --- .gitignore | 1 + .xcodemap/config/xcodemap-class-filter.yaml | 1 + .../work/slhaf/partner/api/agent/Agent.java | 38 +++++- .../agent/factory/AgentRegisterFactory.java | 12 +- .../CapabilityCheckFailedException.java | 4 +- ...pabilityFactoryExecuteFailedException.java | 4 +- .../factory/config/ConfigLoaderFactory.java | 19 ++- .../config/DefaultModelConfigManager.java | 70 ---------- .../factory/config/ModelConfigManager.java | 81 ------------ .../exception/ConfigDirNotExistException.java | 11 ++ .../ConfigFactoryInitFailedException.java | 13 ++ .../ConfigFactoryRuntimeException.java | 13 ++ .../ConfigGenerateFailedException.java | 11 ++ .../exception/ConfigNotExistException.java | 11 ++ .../ConfigUpdateFailedException.java | 11 ++ .../ModelConfigDirNotExistException.java | 11 -- .../ModelConfigFactoryFailedException.java | 11 -- .../ModelConfigNotExistException.java | 11 -- .../ModelPromptDirNotExistException.java | 11 -- .../ModelPromptNotExistException.java | 11 -- .../exception/PromptDirNotExistException.java | 11 ++ .../exception/PromptNotExistException.java | 11 ++ .../factory/module/ModuleCheckFactory.java | 14 +- .../module/ModuleInitHookExecuteFactory.java | 4 +- .../factory/module/ModuleProxyFactory.java | 6 +- .../module/annotation/AfterExecute.java | 2 +- .../module/annotation/BeforeExecute.java | 2 +- .../exception/ModuleCheckException.java | 2 +- .../ModuleFactoryFailedException.java | 11 -- .../ModuleFactoryInitFailedException.java | 11 ++ .../ModuleInitHookExecuteFailedException.java | 2 +- ...ModuleInstanceGenerateFailedException.java | 2 +- .../ModuleProxyGenerateFailedException.java | 2 +- .../agent/factory/module/pojo/MetaModule.java | 1 + .../api/agent/flow/AgentInteraction.java | 18 --- .../api/agent/flow/AgentRunningFlow.java | 23 ++++ .../agent/flow/abstracts/ActivateModel.java | 18 ++- .../abstracts/AgentInteractionModule.java | 10 -- .../flow/abstracts/AgentRunningModule.java | 10 ++ ...Module.java => AgentRunningSubModule.java} | 2 +- ...owContext.java => RunningFlowContext.java} | 2 +- .../{entity => runtime}/AgentContext.java | 2 +- .../runtime/config/AgentConfigManager.java | 125 ++++++++++++++++++ .../config/DefaultAgentConfigManager.java | 122 +++++++++++++++++ .../exception/AgentExceptionCallback.java | 6 + .../exception/AgentLaunchFailedException.java | 6 +- .../exception/AgentRuntimeException.java | 11 ++ .../DefaultAgentExceptionCallback.java | 17 +++ .../exception/GlobalExceptionHandler.java | 26 ++++ .../src/test/java/module/ModuleProxyTest.java | 6 +- .../java/module/MyAgentInteractionModule.java | 11 -- .../java/module/MyAgentRunningModule.java | 11 ++ .../evaluator/SliceSelectEvaluator.java | 4 +- .../extractor/MemorySelectExtractor.java | 4 +- .../updater/summarizer/MemorySummarizer.java | 4 +- .../updater/summarizer/MultiSummarizer.java | 4 +- .../updater/summarizer/SingleSummarizer.java | 4 +- .../updater/summarizer/TotalSummarizer.java | 4 +- .../relation_extractor/RelationExtractor.java | 4 +- .../StaticMemoryExtractor.java | 4 +- .../slhaf/demo/flow/AgentDemoFlowContext.java | 4 +- 61 files changed, 574 insertions(+), 324 deletions(-) delete mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/DefaultModelConfigManager.java delete mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/ModelConfigManager.java create mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigDirNotExistException.java create mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigFactoryInitFailedException.java create mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigFactoryRuntimeException.java create mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigGenerateFailedException.java create mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigNotExistException.java create mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigUpdateFailedException.java delete mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelConfigDirNotExistException.java delete mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelConfigFactoryFailedException.java delete mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelConfigNotExistException.java delete mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelPromptDirNotExistException.java delete mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelPromptNotExistException.java create mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/PromptDirNotExistException.java create mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/PromptNotExistException.java delete mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleFactoryFailedException.java create mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleFactoryInitFailedException.java delete mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/AgentInteraction.java create mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/AgentRunningFlow.java delete mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/AgentInteractionModule.java create mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/AgentRunningModule.java rename Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/{AgentInteractionSubModule.java => AgentRunningSubModule.java} (72%) rename Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/entity/{InteractionFlowContext.java => RunningFlowContext.java} (69%) rename Partner-Api/src/main/java/work/slhaf/partner/api/agent/{entity => runtime}/AgentContext.java (93%) create mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/config/AgentConfigManager.java create mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/config/DefaultAgentConfigManager.java create mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/AgentExceptionCallback.java rename Partner-Api/src/main/java/work/slhaf/partner/api/agent/{ => runtime}/exception/AgentLaunchFailedException.java (57%) create mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/AgentRuntimeException.java create mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/DefaultAgentExceptionCallback.java create mode 100644 Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/GlobalExceptionHandler.java delete mode 100644 Partner-Api/src/test/java/module/MyAgentInteractionModule.java create mode 100644 Partner-Api/src/test/java/module/MyAgentRunningModule.java diff --git a/.gitignore b/.gitignore index 390845c6..cdaaab3c 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,4 @@ build/ /Partner-Core/src/main/java/src/test/java/memory/result/primary_input.json /Partner-Core/src/main/java/src/main/resources/prompt/module/memory/topic_extractor.json.bak /backup/ +/Partner-Main/src/test/java/text/test.json diff --git a/.xcodemap/config/xcodemap-class-filter.yaml b/.xcodemap/config/xcodemap-class-filter.yaml index 1090bb64..facd0fd9 100644 --- a/.xcodemap/config/xcodemap-class-filter.yaml +++ b/.xcodemap/config/xcodemap-class-filter.yaml @@ -26,6 +26,7 @@ maxNumHashImportant: 256 maxObjectDepth: 4 maxStrSize: 4096 name: xcodemap-filter +openMainWindow: true recordMode: manual sourceDisplayConfig: color: blue diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/Agent.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/Agent.java index 9808742b..d09d2f22 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/Agent.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/Agent.java @@ -1,10 +1,13 @@ package work.slhaf.partner.api.agent; -import work.slhaf.partner.api.agent.exception.AgentLaunchFailedException; import work.slhaf.partner.api.agent.factory.AgentRegisterFactory; import work.slhaf.partner.api.agent.factory.module.pojo.MetaModule; -import work.slhaf.partner.api.agent.flow.AgentInteraction; -import work.slhaf.partner.api.agent.flow.entity.InteractionFlowContext; +import work.slhaf.partner.api.agent.flow.AgentRunningFlow; +import work.slhaf.partner.api.agent.flow.entity.RunningFlowContext; +import work.slhaf.partner.api.agent.runtime.config.AgentConfigManager; +import work.slhaf.partner.api.agent.runtime.exception.AgentExceptionCallback; +import work.slhaf.partner.api.agent.runtime.exception.AgentLaunchFailedException; +import work.slhaf.partner.api.agent.runtime.exception.GlobalExceptionHandler; import java.util.ArrayList; import java.util.List; @@ -18,14 +21,14 @@ public class Agent { private final List runners = new ArrayList<>(); private final Class applicationClass; - private final InteractionFlowContext interactionContext; + private final RunningFlowContext interactionContext; - private Agent(Class clazz, InteractionFlowContext interactionContext) { + private Agent(Class clazz, RunningFlowContext interactionContext) { this.applicationClass = clazz; this.interactionContext = interactionContext; } - public static Agent newAgent(Class clazz, InteractionFlowContext interactionContext) { + public static Agent newAgent(Class clazz, RunningFlowContext interactionContext) { if (clazz == null || interactionContext == null) { throw new AgentLaunchFailedException("Agent class 和 interaction flow context 不能为 null"); } @@ -34,7 +37,7 @@ public class Agent { public void run() { List moduleList = AgentRegisterFactory.launch(applicationClass.getPackage().getName()); - AgentInteraction.launch(moduleList, interactionContext); + AgentRunningFlow.launch(moduleList, interactionContext); launchRunners(); } @@ -50,4 +53,25 @@ public class Agent { runners.addAll(List.of(runnable)); return this; } + + public Agent setAgentConfigManager(AgentConfigManager agentConfigManager) { + AgentConfigManager.setINSTANCE(agentConfigManager); + return this; + } + + public Agent setAgentExceptionCallback(AgentExceptionCallback agentExceptionCallback){ + GlobalExceptionHandler.setExceptionCallback(agentExceptionCallback); + return this; + } + + public Agent addScanPackage(String packageName) { + AgentRegisterFactory.addScanPackage(packageName); + return this; + } + + public Agent addScanDir(String externalPackagePath) { + AgentRegisterFactory.addScanDir(externalPackagePath); + return this; + } + } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/AgentRegisterFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/AgentRegisterFactory.java index 14ba808f..9f41a67a 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/AgentRegisterFactory.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/AgentRegisterFactory.java @@ -13,6 +13,7 @@ import work.slhaf.partner.api.agent.factory.module.ModuleInitHookExecuteFactory; import work.slhaf.partner.api.agent.factory.module.ModuleProxyFactory; import work.slhaf.partner.api.agent.factory.module.ModuleRegisterFactory; import work.slhaf.partner.api.agent.factory.module.pojo.MetaModule; +import work.slhaf.partner.api.agent.runtime.config.AgentConfigManager; import java.io.File; import java.net.URL; @@ -45,12 +46,14 @@ public class AgentRegisterFactory { //. 执行模块PreHook逻辑 new ModuleInitHookExecuteFactory().execute(registerContext); - return registerContext.getModuleFactoryContext().getModuleList(); + List moduleList = registerContext.getModuleFactoryContext().getModuleList(); + return AgentConfigManager.INSTANCE.moduleEnabledStatusFilter(moduleList); } /** * 添加可扫描包 + * * @param packageName 指定的包名 */ public static void addScanPackage(String packageName) { @@ -59,6 +62,7 @@ public class AgentRegisterFactory { /** * 添加外部模块目录 + * * @param externalPackagePath 指定的外部模块目录路径 */ public static void addScanDir(String externalPackagePath) { @@ -67,7 +71,11 @@ public class AgentRegisterFactory { throw new ExternalModulePathNotExistException("不存在的外部模块目录: " + externalPackagePath); } try { - for (File f : file.listFiles()) { + File[] files = file.listFiles(); + if (files == null || files.length == 0) { + throw new ExternalModulePathNotExistException("外部模块目录为空: " + externalPackagePath); + } + for (File f : files) { if (f.getName().endsWith(".jar")) { urls.add(f.toURI().toURL()); } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/exception/CapabilityCheckFailedException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/exception/CapabilityCheckFailedException.java index 7647f3be..8049ca75 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/exception/CapabilityCheckFailedException.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/exception/CapabilityCheckFailedException.java @@ -1,6 +1,8 @@ package work.slhaf.partner.api.agent.factory.capability.exception; -public class CapabilityCheckFailedException extends RuntimeException { +import work.slhaf.partner.api.agent.runtime.exception.AgentLaunchFailedException; + +public class CapabilityCheckFailedException extends AgentLaunchFailedException { public CapabilityCheckFailedException(String message) { super("Capability注册失败: " + message); } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/exception/CapabilityFactoryExecuteFailedException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/exception/CapabilityFactoryExecuteFailedException.java index d233d471..60f18666 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/exception/CapabilityFactoryExecuteFailedException.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/exception/CapabilityFactoryExecuteFailedException.java @@ -1,6 +1,8 @@ package work.slhaf.partner.api.agent.factory.capability.exception; -public class CapabilityFactoryExecuteFailedException extends RuntimeException { +import work.slhaf.partner.api.agent.runtime.exception.AgentLaunchFailedException; + +public class CapabilityFactoryExecuteFailedException extends AgentLaunchFailedException { public CapabilityFactoryExecuteFailedException(String message) { super("CapabilityRegisterFactory 执行失败: " + message); } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/ConfigLoaderFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/ConfigLoaderFactory.java index f35736ac..deeb419c 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/ConfigLoaderFactory.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/ConfigLoaderFactory.java @@ -5,6 +5,8 @@ import work.slhaf.partner.api.agent.factory.AgentBaseFactory; import work.slhaf.partner.api.agent.factory.config.pojo.ModelConfig; import work.slhaf.partner.api.agent.factory.context.AgentRegisterContext; import work.slhaf.partner.api.agent.factory.context.ConfigFactoryContext; +import work.slhaf.partner.api.agent.runtime.config.AgentConfigManager; +import work.slhaf.partner.api.agent.runtime.config.DefaultAgentConfigManager; import work.slhaf.partner.api.chat.pojo.Message; import java.util.HashMap; @@ -12,8 +14,7 @@ import java.util.List; public class ConfigLoaderFactory extends AgentBaseFactory { - @Setter - private static ModelConfigManager modelConfigManager = new DefaultModelConfigManager(); + private AgentConfigManager agentConfigManager; private HashMap modelConfigMap; private HashMap> modelPromptMap; @@ -22,14 +23,20 @@ public class ConfigLoaderFactory extends AgentBaseFactory { ConfigFactoryContext factoryContext = context.getConfigFactoryContext(); modelConfigMap = factoryContext.getModelConfigMap(); modelPromptMap = factoryContext.getModelPromptMap(); + + if (AgentConfigManager.INSTANCE == null){ + AgentConfigManager.setINSTANCE(new DefaultAgentConfigManager()); + } + + agentConfigManager = AgentConfigManager.INSTANCE; } @Override protected void run() { - modelConfigManager.load(); - modelConfigManager.check(); - modelConfigMap.putAll(modelConfigManager.getModelConfigMap()); - modelPromptMap.putAll(modelConfigManager.getModelPromptMap()); + agentConfigManager.load(); + agentConfigManager.check(); + modelConfigMap.putAll(agentConfigManager.getModelConfigMap()); + modelPromptMap.putAll(agentConfigManager.getModelPromptMap()); } } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/DefaultModelConfigManager.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/DefaultModelConfigManager.java deleted file mode 100644 index 27b57a02..00000000 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/DefaultModelConfigManager.java +++ /dev/null @@ -1,70 +0,0 @@ -package work.slhaf.partner.api.agent.factory.config; - -import cn.hutool.json.JSONUtil; -import work.slhaf.partner.api.agent.factory.config.exception.ModelConfigDirNotExistException; -import work.slhaf.partner.api.agent.factory.config.exception.ModelConfigNotExistException; -import work.slhaf.partner.api.agent.factory.config.exception.ModelPromptDirNotExistException; -import work.slhaf.partner.api.agent.factory.config.exception.ModelPromptNotExistException; -import work.slhaf.partner.api.agent.factory.config.pojo.ModelConfig; -import work.slhaf.partner.api.agent.factory.config.pojo.PrimaryModelConfig; -import work.slhaf.partner.api.agent.factory.config.pojo.PrimaryModelPrompt; -import work.slhaf.partner.api.chat.pojo.Message; - -import java.io.File; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.List; - -/** - * 默认配置工厂 - * 将从当前运行目录的config文件夹下创建并读取配置 - */ -public class DefaultModelConfigManager extends ModelConfigManager { - - private static final String MODEL_CONFIG_DIR = "./config/model/"; - private static final String PROMPT_CONFIG_DIR = "./config/prompt/"; - - - @Override - protected HashMap> loadPrompt() { - File file = new File(PROMPT_CONFIG_DIR); - if (!file.exists() && !file.isDirectory()) { - throw new ModelPromptDirNotExistException("未找到提示词目录: " + PROMPT_CONFIG_DIR + " 请手动创建!"); - } - File[] files = file.listFiles(); - if (files == null || files.length == 0) { - throw new ModelPromptNotExistException("在目录 " + PROMPT_CONFIG_DIR + " 中未找到提示词配置!"); - } - HashMap> promptMap = new HashMap<>(); - for (File f : files) { - if (f.isDirectory()) { - continue; - } - PrimaryModelPrompt primaryModelPrompt = JSONUtil.readJSONObject(f, StandardCharsets.UTF_8).toBean(PrimaryModelPrompt.class); - promptMap.put(primaryModelPrompt.getKey(), primaryModelPrompt.getMessages()); - } - return promptMap; - } - - @Override - protected HashMap loadConfig() { - File file = new File(MODEL_CONFIG_DIR); - if (!file.exists() || !file.isDirectory()) { - throw new ModelConfigDirNotExistException("未找到配置目录: " + MODEL_CONFIG_DIR + " 请手动创建!"); - } - File[] files = file.listFiles(); - if (files == null || files.length == 0) { - throw new ModelConfigNotExistException("在目录" + MODEL_CONFIG_DIR + "中未找到配置文件!"); - } - //遍历文件获取所有配置文件并返回 - HashMap configMap = new HashMap<>(); - for (File f : files) { - if (f.isDirectory()) { - continue; - } - PrimaryModelConfig primaryModelConfig = JSONUtil.readJSONObject(f, StandardCharsets.UTF_8).toBean(PrimaryModelConfig.class); - configMap.put(primaryModelConfig.getKey(), primaryModelConfig.getModelConfig()); - } - return configMap; - } -} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/ModelConfigManager.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/ModelConfigManager.java deleted file mode 100644 index 2072d22b..00000000 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/ModelConfigManager.java +++ /dev/null @@ -1,81 +0,0 @@ -package work.slhaf.partner.api.agent.factory.config; - -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import work.slhaf.partner.api.agent.factory.config.exception.ModelConfigNotExistException; -import work.slhaf.partner.api.agent.factory.config.exception.ModelPromptNotExistException; -import work.slhaf.partner.api.agent.factory.config.pojo.ModelConfig; -import work.slhaf.partner.api.chat.pojo.Message; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -@Slf4j -public abstract class ModelConfigManager { - - public static ModelConfigManager INSTANCE; - @Getter - protected HashMap modelConfigMap; - @Getter - protected HashMap> modelPromptMap; - - protected ModelConfigManager() { - INSTANCE = this; - } - - public void load() { - modelConfigMap = loadConfig(); - modelPromptMap = loadPrompt(); - } - - protected abstract HashMap> loadPrompt(); - - protected abstract HashMap loadConfig(); - - /** - * 对模型Config与Prompt分别进行检验,除了都必须包含default外,还需要确保数量、key一致,毕竟是模型配置与提示词 - */ - public void check(){ - log.info("[ModelConfigManager]: 执行config与prompt检测..."); - if (!modelConfigMap.containsKey("default")){ - throw new ModelConfigNotExistException("缺少默认配置! 需确保存在一个模型配置的key为`default`"); - } - if (!modelPromptMap.containsKey("basic")){ - throw new ModelPromptNotExistException("缺少基础Prompt! 需要确保存在key为basic的Prompt文件,它将与其他Prompt共同作用于模块节点。"); - } - Set configKeySet = new HashSet<>(modelConfigMap.keySet()); - configKeySet.remove("default"); - Set promptKeySet = new HashSet<>(modelPromptMap.keySet()); - promptKeySet.remove("basic"); - if (!promptKeySet.containsAll(configKeySet)){ - log.warn("存在未被提示词包含的模型配置,该配置将无法生效!"); - } - log.info("[ModelConfigManager]: 检测完毕."); - } - - - public List loadModelPrompt(String modelKey){ - if (!modelPromptMap.containsKey(modelKey)){ - throw new ModelPromptNotExistException("不存在的modelPrompt: "+modelKey); - } - return modelPromptMap.get(modelKey); - } - - public ModelConfig loadModelConfig(String modelKey) { - if (!modelConfigMap.containsKey(modelKey)) { - throw new ModelConfigNotExistException("不存在的modelKey: " + modelKey); - } - return modelConfigMap.get(modelKey); - } - - public void updateModelConfig(String modelKey, ModelConfig config) { - if (!modelConfigMap.containsKey(modelKey)) { - throw new ModelConfigNotExistException("不存在的modelKey: " + modelKey); - } - modelConfigMap.get(modelKey).setModel(config.getModel()); - modelConfigMap.get(modelKey).setBaseUrl(config.getBaseUrl()); - modelConfigMap.get(modelKey).setApikey(config.getApikey()); - } -} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigDirNotExistException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigDirNotExistException.java new file mode 100644 index 00000000..277f40ff --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigDirNotExistException.java @@ -0,0 +1,11 @@ +package work.slhaf.partner.api.agent.factory.config.exception; + +public class ConfigDirNotExistException extends ConfigFactoryInitFailedException { + public ConfigDirNotExistException(String message, Throwable cause) { + super(message, cause); + } + + public ConfigDirNotExistException(String message) { + super(message); + } +} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigFactoryInitFailedException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigFactoryInitFailedException.java new file mode 100644 index 00000000..7f39dfcc --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigFactoryInitFailedException.java @@ -0,0 +1,13 @@ +package work.slhaf.partner.api.agent.factory.config.exception; + +import work.slhaf.partner.api.agent.runtime.exception.AgentLaunchFailedException; + +public class ConfigFactoryInitFailedException extends AgentLaunchFailedException { + public ConfigFactoryInitFailedException(String message, Throwable cause) { + super("AgentConfigManager 执行失败: " + message, cause); + } + + public ConfigFactoryInitFailedException(String message) { + super("AgentConfigManager 执行失败: " + message); + } +} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigFactoryRuntimeException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigFactoryRuntimeException.java new file mode 100644 index 00000000..88a8d220 --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigFactoryRuntimeException.java @@ -0,0 +1,13 @@ +package work.slhaf.partner.api.agent.factory.config.exception; + +import work.slhaf.partner.api.agent.runtime.exception.AgentRuntimeException; + +public class ConfigFactoryRuntimeException extends AgentRuntimeException { + public ConfigFactoryRuntimeException(String message, Throwable cause) { + super("ConfigFactory 运行出错: " + message, cause); + } + + public ConfigFactoryRuntimeException(String message) { + super("ConfigFactory 运行出错: " + message); + } +} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigGenerateFailedException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigGenerateFailedException.java new file mode 100644 index 00000000..cd4c16df --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigGenerateFailedException.java @@ -0,0 +1,11 @@ +package work.slhaf.partner.api.agent.factory.config.exception; + +public class ConfigGenerateFailedException extends ConfigFactoryInitFailedException { + public ConfigGenerateFailedException(String message, Throwable cause) { + super(message, cause); + } + + public ConfigGenerateFailedException(String message) { + super(message); + } +} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigNotExistException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigNotExistException.java new file mode 100644 index 00000000..7643bd41 --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigNotExistException.java @@ -0,0 +1,11 @@ +package work.slhaf.partner.api.agent.factory.config.exception; + +public class ConfigNotExistException extends ConfigFactoryInitFailedException { + public ConfigNotExistException(String message, Throwable e) { + super(message, e); + } + + public ConfigNotExistException(String message) { + super(message); + } +} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigUpdateFailedException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigUpdateFailedException.java new file mode 100644 index 00000000..18515976 --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ConfigUpdateFailedException.java @@ -0,0 +1,11 @@ +package work.slhaf.partner.api.agent.factory.config.exception; + +public class ConfigUpdateFailedException extends ConfigFactoryRuntimeException{ + public ConfigUpdateFailedException(String message, Throwable cause) { + super(message, cause); + } + + public ConfigUpdateFailedException(String message) { + super(message); + } +} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelConfigDirNotExistException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelConfigDirNotExistException.java deleted file mode 100644 index cc3cf903..00000000 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelConfigDirNotExistException.java +++ /dev/null @@ -1,11 +0,0 @@ -package work.slhaf.partner.api.agent.factory.config.exception; - -public class ModelConfigDirNotExistException extends ModelConfigFactoryFailedException{ - public ModelConfigDirNotExistException(String message, Throwable cause) { - super(message, cause); - } - - public ModelConfigDirNotExistException(String message) { - super(message); - } -} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelConfigFactoryFailedException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelConfigFactoryFailedException.java deleted file mode 100644 index 1d6a5a10..00000000 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelConfigFactoryFailedException.java +++ /dev/null @@ -1,11 +0,0 @@ -package work.slhaf.partner.api.agent.factory.config.exception; - -public class ModelConfigFactoryFailedException extends RuntimeException { - public ModelConfigFactoryFailedException(String message, Throwable cause) { - super("ModelConfigManager 执行失败: " + message, cause); - } - - public ModelConfigFactoryFailedException(String message) { - super("ModelConfigManager 执行失败: " + message); - } -} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelConfigNotExistException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelConfigNotExistException.java deleted file mode 100644 index 0ad1c1ad..00000000 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelConfigNotExistException.java +++ /dev/null @@ -1,11 +0,0 @@ -package work.slhaf.partner.api.agent.factory.config.exception; - -public class ModelConfigNotExistException extends ModelConfigFactoryFailedException { - public ModelConfigNotExistException(String message, Throwable e) { - super(message, e); - } - - public ModelConfigNotExistException(String message) { - super(message); - } -} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelPromptDirNotExistException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelPromptDirNotExistException.java deleted file mode 100644 index bd6aaee3..00000000 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelPromptDirNotExistException.java +++ /dev/null @@ -1,11 +0,0 @@ -package work.slhaf.partner.api.agent.factory.config.exception; - -public class ModelPromptDirNotExistException extends ModelConfigFactoryFailedException{ - public ModelPromptDirNotExistException(String message, Throwable cause) { - super(message, cause); - } - - public ModelPromptDirNotExistException(String message) { - super(message); - } -} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelPromptNotExistException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelPromptNotExistException.java deleted file mode 100644 index c76693be..00000000 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/ModelPromptNotExistException.java +++ /dev/null @@ -1,11 +0,0 @@ -package work.slhaf.partner.api.agent.factory.config.exception; - -public class ModelPromptNotExistException extends ModelConfigFactoryFailedException{ - public ModelPromptNotExistException(String message) { - super(message); - } - - public ModelPromptNotExistException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/PromptDirNotExistException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/PromptDirNotExistException.java new file mode 100644 index 00000000..3bf8d417 --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/PromptDirNotExistException.java @@ -0,0 +1,11 @@ +package work.slhaf.partner.api.agent.factory.config.exception; + +public class PromptDirNotExistException extends ConfigFactoryInitFailedException { + public PromptDirNotExistException(String message, Throwable cause) { + super(message, cause); + } + + public PromptDirNotExistException(String message) { + super(message); + } +} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/PromptNotExistException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/PromptNotExistException.java new file mode 100644 index 00000000..a4edb2f4 --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/config/exception/PromptNotExistException.java @@ -0,0 +1,11 @@ +package work.slhaf.partner.api.agent.factory.config.exception; + +public class PromptNotExistException extends ConfigFactoryInitFailedException { + public PromptNotExistException(String message) { + super(message); + } + + public PromptNotExistException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleCheckFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleCheckFactory.java index d423d7af..61695d3c 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleCheckFactory.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleCheckFactory.java @@ -3,7 +3,6 @@ package work.slhaf.partner.api.agent.factory.module; import cn.hutool.core.util.ClassUtil; import org.reflections.Reflections; import work.slhaf.partner.api.agent.factory.AgentBaseFactory; -import work.slhaf.partner.api.agent.factory.config.ModelConfigManager; import work.slhaf.partner.api.agent.factory.context.AgentRegisterContext; import work.slhaf.partner.api.agent.factory.module.annotation.AfterExecute; import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule; @@ -11,8 +10,9 @@ import work.slhaf.partner.api.agent.factory.module.annotation.BeforeExecute; import work.slhaf.partner.api.agent.factory.module.annotation.Init; import work.slhaf.partner.api.agent.factory.module.exception.ModuleCheckException; import work.slhaf.partner.api.agent.flow.abstracts.ActivateModel; -import work.slhaf.partner.api.agent.flow.abstracts.AgentInteractionModule; -import work.slhaf.partner.api.agent.flow.abstracts.AgentInteractionSubModule; +import work.slhaf.partner.api.agent.flow.abstracts.AgentRunningModule; +import work.slhaf.partner.api.agent.flow.abstracts.AgentRunningSubModule; +import work.slhaf.partner.api.agent.runtime.config.AgentConfigManager; import java.lang.reflect.Method; import java.util.HashSet; @@ -59,7 +59,7 @@ public class ModuleCheckFactory extends AgentBaseFactory { ActivateModel instance = type.getConstructor().newInstance(); modelKeySet.add(instance.modelKey()); } - Set promptKeySet = ModelConfigManager.INSTANCE.getModelPromptMap().keySet(); + Set promptKeySet = AgentConfigManager.INSTANCE.getModelPromptMap().keySet(); if (!promptKeySet.containsAll(modelKeySet)) { modelKeySet.removeAll(promptKeySet); throw new ModuleCheckException("存在未配置Prompt的ActivateModel实现! 缺少Prompt的ModelKey列表: " + modelKeySet); @@ -116,10 +116,10 @@ public class ModuleCheckFactory extends AgentBaseFactory { private void checkLocation(Set> types) { for (Class type : types) { - if (AgentInteractionModule.class.isAssignableFrom(type)) { + if (AgentRunningModule.class.isAssignableFrom(type)) { continue; } - if (AgentInteractionSubModule.class.isAssignableFrom(type)) { + if (AgentRunningSubModule.class.isAssignableFrom(type)) { continue; } if (ActivateModel.class.isAssignableFrom(type)) { @@ -134,7 +134,7 @@ public class ModuleCheckFactory extends AgentBaseFactory { if (type.isAnnotation()) { continue; } - if (type.isAssignableFrom(AgentInteractionModule.class)) { + if (type.isAssignableFrom(AgentRunningModule.class)) { continue; } throw new ModuleCheckException("存在未继承AgentInteractionModule.class的AgentModule实现: " + type.getSimpleName()); diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleInitHookExecuteFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleInitHookExecuteFactory.java index 157104fa..7108641c 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleInitHookExecuteFactory.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleInitHookExecuteFactory.java @@ -7,7 +7,7 @@ import work.slhaf.partner.api.agent.factory.module.annotation.Init; import work.slhaf.partner.api.agent.factory.module.exception.ModuleInitHookExecuteFailedException; import work.slhaf.partner.api.agent.factory.module.pojo.MetaMethod; import work.slhaf.partner.api.agent.factory.module.pojo.MetaModule; -import work.slhaf.partner.api.agent.flow.abstracts.AgentInteractionModule; +import work.slhaf.partner.api.agent.flow.abstracts.AgentRunningModule; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; @@ -52,7 +52,7 @@ public class ModuleInitHookExecuteFactory extends AgentBaseFactory { } private List collectInitHookMethods(Class clazz) { - Set> classes = collectExtendedClasses(clazz, AgentInteractionModule.class); + Set> classes = collectExtendedClasses(clazz, AgentRunningModule.class); return classes.stream() .map(Class::getDeclaredMethods) .flatMap(Arrays::stream) diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleProxyFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleProxyFactory.java index a38adcb8..7f9732c1 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleProxyFactory.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleProxyFactory.java @@ -13,7 +13,7 @@ import work.slhaf.partner.api.agent.factory.module.exception.ModuleInstanceGener import work.slhaf.partner.api.agent.factory.module.exception.ModuleProxyGenerateFailedException; import work.slhaf.partner.api.agent.factory.module.pojo.MetaMethod; import work.slhaf.partner.api.agent.factory.module.pojo.MetaModule; -import work.slhaf.partner.api.agent.flow.abstracts.AgentInteractionModule; +import work.slhaf.partner.api.agent.flow.abstracts.AgentRunningModule; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -60,7 +60,7 @@ public class ModuleProxyFactory extends AgentBaseFactory { Class clazz = metaModule.getClazz(); Class proxyClass = new ByteBuddy() .subclass(clazz) - .method(ElementMatchers.isOverriddenFrom(AgentInteractionModule.class)) + .method(ElementMatchers.isOverriddenFrom(AgentRunningModule.class)) .intercept(MethodDelegation.to(new ModuleProxyInterceptor(record.post, record.pre))) .make() .load(ModuleProxyFactory.class.getClassLoader()) @@ -77,7 +77,7 @@ public class ModuleProxyFactory extends AgentBaseFactory { //获取该类本身的hook逻辑 collectHookMethods(post, pre, clazz); //获取它所继承、实现的抽象类或接口, 以AgentInteractionModule、ActiveModel为终点 - Set> classes = collectExtendedClasses(clazz, AgentInteractionModule.class); + Set> classes = collectExtendedClasses(clazz, AgentRunningModule.class); //获取这些类中的hook逻辑 collectHookMethods(post, pre, classes); return new MethodsListRecord(post, pre); diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/annotation/AfterExecute.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/annotation/AfterExecute.java index fc461e5c..64afd2c7 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/annotation/AfterExecute.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/annotation/AfterExecute.java @@ -10,7 +10,7 @@ import java.lang.annotation.Target; * 仅适用于以下类中的方法: * 1. @AgentModule注解所在类 * 2. ActivateModel子类 - * 3. AgentInteractionModule或者AgentInteractionSubModule子类 + * 3. AgentRunningModule或者AgentRunningSubModule子类 */ @Target(ElementType.METHOD) diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/annotation/BeforeExecute.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/annotation/BeforeExecute.java index 977c95fb..20ccc788 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/annotation/BeforeExecute.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/annotation/BeforeExecute.java @@ -9,7 +9,7 @@ import java.lang.annotation.Target; * 仅适用于以下类中的方法: * 1. @AgentModule注解所在类 * 2. ActivateModel子类 - * 3. AgentInteractionModule或者AgentInteractionSubModule子类 + * 3. AgentRunningModule或者AgentRunningSubModule子类 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleCheckException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleCheckException.java index aa101bbc..bd21c514 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleCheckException.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleCheckException.java @@ -1,6 +1,6 @@ package work.slhaf.partner.api.agent.factory.module.exception; -public class ModuleCheckException extends ModuleFactoryFailedException{ +public class ModuleCheckException extends ModuleFactoryInitFailedException { public ModuleCheckException(String message) { super(message); } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleFactoryFailedException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleFactoryFailedException.java deleted file mode 100644 index e58200b1..00000000 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleFactoryFailedException.java +++ /dev/null @@ -1,11 +0,0 @@ -package work.slhaf.partner.api.agent.factory.module.exception; - -public class ModuleFactoryFailedException extends RuntimeException { - public ModuleFactoryFailedException(String message) { - super("ModuleFactory 执行失败: "+message); - } - - public ModuleFactoryFailedException(String message, Throwable cause) { - super("ModuleFactory 执行失败: "+message, cause); - } -} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleFactoryInitFailedException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleFactoryInitFailedException.java new file mode 100644 index 00000000..1f2adce9 --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleFactoryInitFailedException.java @@ -0,0 +1,11 @@ +package work.slhaf.partner.api.agent.factory.module.exception; + +public class ModuleFactoryInitFailedException extends RuntimeException { + public ModuleFactoryInitFailedException(String message) { + super("ModuleFactory 执行失败: "+message); + } + + public ModuleFactoryInitFailedException(String message, Throwable cause) { + super("ModuleFactory 执行失败: "+message, cause); + } +} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleInitHookExecuteFailedException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleInitHookExecuteFailedException.java index 7f5b7f81..1b6ed315 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleInitHookExecuteFailedException.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleInitHookExecuteFailedException.java @@ -1,6 +1,6 @@ package work.slhaf.partner.api.agent.factory.module.exception; -public class ModuleInitHookExecuteFailedException extends ModuleFactoryFailedException{ +public class ModuleInitHookExecuteFailedException extends ModuleFactoryInitFailedException { public ModuleInitHookExecuteFailedException(String message) { super(message); } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleInstanceGenerateFailedException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleInstanceGenerateFailedException.java index ebb97545..6a24ebdf 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleInstanceGenerateFailedException.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleInstanceGenerateFailedException.java @@ -1,6 +1,6 @@ package work.slhaf.partner.api.agent.factory.module.exception; -public class ModuleInstanceGenerateFailedException extends ModuleFactoryFailedException{ +public class ModuleInstanceGenerateFailedException extends ModuleFactoryInitFailedException { public ModuleInstanceGenerateFailedException(String message) { super(message); } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleProxyGenerateFailedException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleProxyGenerateFailedException.java index 2b97d48e..9bf79b4b 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleProxyGenerateFailedException.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/exception/ModuleProxyGenerateFailedException.java @@ -1,6 +1,6 @@ package work.slhaf.partner.api.agent.factory.module.exception; -public class ModuleProxyGenerateFailedException extends ModuleFactoryFailedException{ +public class ModuleProxyGenerateFailedException extends ModuleFactoryInitFailedException { public ModuleProxyGenerateFailedException(String message) { super(message); } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/pojo/MetaModule.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/pojo/MetaModule.java index ed0ed46a..58f3494c 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/pojo/MetaModule.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/module/pojo/MetaModule.java @@ -8,4 +8,5 @@ public class MetaModule { private int order; private Class clazz; private Object instance; + private boolean enabled = true; } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/AgentInteraction.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/AgentInteraction.java deleted file mode 100644 index db17268d..00000000 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/AgentInteraction.java +++ /dev/null @@ -1,18 +0,0 @@ -package work.slhaf.partner.api.agent.flow; - -import work.slhaf.partner.api.agent.factory.module.pojo.MetaModule; -import work.slhaf.partner.api.agent.flow.entity.InteractionFlowContext; - -import java.util.List; - -/** - * Agent执行流程 - */ -public class AgentInteraction { - - private AgentInteraction(){} - - public static void launch(List moduleList, InteractionFlowContext interactionContext){ - //流程执行启动,需考虑模块热插拔,可结合http调整模块启用情况,并序列化至本地或数据库中 - } -} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/AgentRunningFlow.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/AgentRunningFlow.java new file mode 100644 index 00000000..2083fcb2 --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/AgentRunningFlow.java @@ -0,0 +1,23 @@ +package work.slhaf.partner.api.agent.flow; + +import work.slhaf.partner.api.agent.factory.module.pojo.MetaModule; +import work.slhaf.partner.api.agent.flow.entity.RunningFlowContext; +import work.slhaf.partner.api.agent.runtime.exception.GlobalExceptionHandler; + +import java.util.List; + +/** + * Agent执行流程 + */ +public class AgentRunningFlow { + + private AgentRunningFlow(){} + + public static void launch(List moduleList, RunningFlowContext interactionContext){ + try { + //流程执行启动,需考虑模块热插拔,可结合http调整模块启用情况,并序列化至本地或数据库中 + }catch (Exception e){ + GlobalExceptionHandler.INSTANCE.handle(e); + } + } +} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/ActivateModel.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/ActivateModel.java index 9c46c9ae..5c2bd467 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/ActivateModel.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/ActivateModel.java @@ -1,9 +1,10 @@ package work.slhaf.partner.api.agent.flow.abstracts; -import work.slhaf.partner.api.agent.factory.config.ModelConfigManager; +import cn.hutool.core.bean.BeanUtil; import work.slhaf.partner.api.agent.factory.config.pojo.ModelConfig; import work.slhaf.partner.api.agent.factory.module.annotation.Init; import work.slhaf.partner.api.agent.flow.entity.Model; +import work.slhaf.partner.api.agent.runtime.config.AgentConfigManager; import work.slhaf.partner.api.chat.ChatClient; import work.slhaf.partner.api.chat.constant.ChatConstant; import work.slhaf.partner.api.chat.pojo.ChatResponse; @@ -14,24 +15,29 @@ import java.util.List; public interface ActivateModel { - ModelConfigManager modelConfigManager = ModelConfigManager.INSTANCE; + AgentConfigManager AGENT_CONFIG_MANAGER = AgentConfigManager.INSTANCE; @Init default void modelSettings() { Model model = new Model(); - ModelConfig modelConfig = ModelConfigManager.INSTANCE.loadModelConfig(modelKey()); + ModelConfig modelConfig = AgentConfigManager.INSTANCE.loadModelConfig(modelKey()); model.setBaseMessages(withBasicPrompt() ? loadSpecificPromptAndBasicPrompt(modelKey()) : loadSpecificPrompt(modelKey())); model.setChatClient(new ChatClient(modelConfig.getBaseUrl(), modelConfig.getApikey(), modelConfig.getModel())); + ((Module) this).setModel(model); + } + + default void updateModelSettings(ChatClient newChatClient) { + BeanUtil.copyProperties(newChatClient, chatClient()); } private List loadSpecificPrompt(String modelKey) { - return modelConfigManager.loadModelPrompt(modelKey); + return AGENT_CONFIG_MANAGER.loadModelPrompt(modelKey); } private List loadSpecificPromptAndBasicPrompt(String modelKey) { List messages = new ArrayList<>(); - messages.addAll(modelConfigManager.loadModelPrompt("basic")); - messages.addAll(modelConfigManager.loadModelPrompt(modelKey)); + messages.addAll(AGENT_CONFIG_MANAGER.loadModelPrompt("basic")); + messages.addAll(AGENT_CONFIG_MANAGER.loadModelPrompt(modelKey)); return messages; } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/AgentInteractionModule.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/AgentInteractionModule.java deleted file mode 100644 index 5c5baf96..00000000 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/AgentInteractionModule.java +++ /dev/null @@ -1,10 +0,0 @@ -package work.slhaf.partner.api.agent.flow.abstracts; - -import work.slhaf.partner.api.agent.flow.entity.InteractionFlowContext; - -/** - * 流程执行模块基类 - */ -public abstract class AgentInteractionModule extends Module { - public abstract void execute(InteractionFlowContext context); -} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/AgentRunningModule.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/AgentRunningModule.java new file mode 100644 index 00000000..f0bef0bf --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/AgentRunningModule.java @@ -0,0 +1,10 @@ +package work.slhaf.partner.api.agent.flow.abstracts; + +import work.slhaf.partner.api.agent.flow.entity.RunningFlowContext; + +/** + * 流程执行模块基类 + */ +public abstract class AgentRunningModule extends Module { + public abstract void execute(RunningFlowContext context); +} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/AgentInteractionSubModule.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/AgentRunningSubModule.java similarity index 72% rename from Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/AgentInteractionSubModule.java rename to Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/AgentRunningSubModule.java index 61800030..0ea53a1a 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/AgentInteractionSubModule.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/abstracts/AgentRunningSubModule.java @@ -6,7 +6,7 @@ package work.slhaf.partner.api.agent.flow.abstracts; * @param 输入类型 * @param 输出类型 */ -public abstract class AgentInteractionSubModule extends Module { +public abstract class AgentRunningSubModule extends Module { public abstract O execute(I data); diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/entity/InteractionFlowContext.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/entity/RunningFlowContext.java similarity index 69% rename from Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/entity/InteractionFlowContext.java rename to Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/entity/RunningFlowContext.java index ab0bb1f1..ba676eab 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/entity/InteractionFlowContext.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/flow/entity/RunningFlowContext.java @@ -6,6 +6,6 @@ import lombok.Data; * 流程上下文 */ @Data -public abstract class InteractionFlowContext { +public abstract class RunningFlowContext { } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/entity/AgentContext.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/AgentContext.java similarity index 93% rename from Partner-Api/src/main/java/work/slhaf/partner/api/agent/entity/AgentContext.java rename to Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/AgentContext.java index 332045c5..0ee45ec0 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/entity/AgentContext.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/AgentContext.java @@ -1,4 +1,4 @@ -package work.slhaf.partner.api.agent.entity; +package work.slhaf.partner.api.agent.runtime; import lombok.Data; import work.slhaf.partner.api.agent.factory.module.pojo.MetaModule; 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 new file mode 100644 index 00000000..f238e302 --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/config/AgentConfigManager.java @@ -0,0 +1,125 @@ +package work.slhaf.partner.api.agent.runtime.config; + +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import work.slhaf.partner.api.agent.factory.config.exception.ConfigNotExistException; +import work.slhaf.partner.api.agent.factory.config.exception.ConfigUpdateFailedException; +import work.slhaf.partner.api.agent.factory.config.exception.PromptNotExistException; +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.HashSet; +import java.util.List; +import java.util.Set; + +@Slf4j +public abstract class AgentConfigManager { + + @Setter + public static AgentConfigManager INSTANCE; + private static final String DEFAULT_KEY = "default"; + + @Getter + protected HashMap modelConfigMap; + @Getter + protected HashMap> modelPromptMap; + + @Getter + @Setter + protected HashMap moduleEnabledStatus; + + protected List moduleList; + + public void load() { + modelConfigMap = loadModelConfig(); + modelPromptMap = loadModelPrompt(); + } + + protected abstract HashMap> loadModelPrompt(); + + protected abstract HashMap loadModelConfig(); + + public abstract void dumpModelConfig(String key); + + protected abstract void dumpModuleEnabledStatus(); + + protected abstract HashMap loadModuleEnabledStatusMap(); + + public List moduleEnabledStatusFilter(List moduleList) { + this.moduleList = moduleList; + this.moduleEnabledStatus = loadModuleEnabledStatusMap(); + + boolean unmatch = false; + for (MetaModule metaModule : moduleList) { + String moduleName = metaModule.getName(); + if (moduleEnabledStatus.containsKey(moduleName)) { + metaModule.setEnabled(moduleEnabledStatus.get(moduleName)); + } else { + log.warn("缺少Module {} 启用配置! 将触发更新操作!", moduleName); + unmatch = true; + } + } + if (unmatch) { + dumpModuleEnabledStatus(); + } + return moduleList; + } + + /** + * 对模型Config与Prompt分别进行检验,除了都必须包含default外,还需要确保数量、key一致,毕竟是模型配置与提示词 + */ + public void check() { + log.info("[AgentConfigManager]: 执行config与prompt检测..."); + if (!modelConfigMap.containsKey("default")) { + throw new ConfigNotExistException("缺少默认配置! 需确保存在一个模型配置的key为`default`"); + } + if (!modelPromptMap.containsKey("basic")) { + throw new PromptNotExistException("缺少基础Prompt! 需要确保存在key为basic的Prompt文件,它将与其他Prompt共同作用于模块节点。"); + } + Set configKeySet = new HashSet<>(modelConfigMap.keySet()); + configKeySet.remove("default"); + Set promptKeySet = new HashSet<>(modelPromptMap.keySet()); + promptKeySet.remove("basic"); + if (!promptKeySet.containsAll(configKeySet)) { + log.warn("存在未被提示词包含的模型配置,该配置将无法生效!"); + } + log.info("[AgentConfigManager]: 检测完毕."); + } + + public List loadModelPrompt(String modelKey) { + if (!modelPromptMap.containsKey(modelKey)) { + throw new PromptNotExistException("不存在的modelPrompt: " + modelKey); + } + return modelPromptMap.get(modelKey); + } + + public ModelConfig loadModelConfig(String modelKey) { + if (!modelConfigMap.containsKey(modelKey)) { + return modelConfigMap.get(DEFAULT_KEY); + } + return modelConfigMap.get(modelKey); + } + + public void updateModelConfig(String modelKey, ModelConfig config) { + modelConfigMap.put(modelKey, config); + dumpModelConfig(modelKey); + } + + public void updateModuleEnabledStatus(String key, boolean status) { + if (!moduleEnabledStatus.containsKey(key)) { + throw new ConfigUpdateFailedException("模块状态更新失败! 不存在的ModuleKey: " + key); + } + moduleEnabledStatus.put(key, status); + dumpModuleEnabledStatus(); + for (MetaModule metaModule : moduleList) { + if (metaModule.getName().equals(key)) { + metaModule.setEnabled(status); + break; + } + } + } + +} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/config/DefaultAgentConfigManager.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/config/DefaultAgentConfigManager.java new file mode 100644 index 00000000..5f0bfe58 --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/config/DefaultAgentConfigManager.java @@ -0,0 +1,122 @@ +package work.slhaf.partner.api.agent.runtime.config; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FileUtils; +import work.slhaf.partner.api.agent.factory.config.exception.*; +import work.slhaf.partner.api.agent.factory.config.pojo.ModelConfig; +import work.slhaf.partner.api.agent.factory.config.pojo.PrimaryModelConfig; +import work.slhaf.partner.api.agent.factory.config.pojo.PrimaryModelPrompt; +import work.slhaf.partner.api.agent.factory.module.pojo.MetaModule; +import work.slhaf.partner.api.chat.pojo.Message; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; + +/** + * 默认配置工厂 + * 将从当前运行目录的config文件夹下创建并读取配置 + */ +@Slf4j +public class DefaultAgentConfigManager extends AgentConfigManager { + + private static final String CONFIG_DIR = "./config/"; + private static final String MODEL_CONFIG_DIR = "./config/model/"; + private static final String PROMPT_CONFIG_DIR = "./config/prompt/"; + private static final String MODULE_ENABLED_STATUS_CONFIG_FILE = CONFIG_DIR + "module_enabled_status.json"; + + + @Override + protected HashMap> loadModelPrompt() { + File file = new File(PROMPT_CONFIG_DIR); + if (!file.exists() && !file.isDirectory()) { + throw new PromptDirNotExistException("未找到提示词目录: " + PROMPT_CONFIG_DIR + " 请手动创建!"); + } + File[] files = file.listFiles(); + if (files == null || files.length == 0) { + throw new PromptNotExistException("在目录 " + PROMPT_CONFIG_DIR + " 中未找到提示词配置!"); + } + HashMap> promptMap = new HashMap<>(); + for (File f : files) { + if (f.isDirectory()) { + continue; + } + PrimaryModelPrompt primaryModelPrompt = JSONUtil.readJSONObject(f, StandardCharsets.UTF_8).toBean(PrimaryModelPrompt.class); + promptMap.put(primaryModelPrompt.getKey(), primaryModelPrompt.getMessages()); + } + return promptMap; + } + + @Override + protected HashMap loadModelConfig() { + File file = new File(MODEL_CONFIG_DIR); + if (!file.exists() || !file.isDirectory()) { + throw new ConfigDirNotExistException("未找到配置目录: " + MODEL_CONFIG_DIR + " 请手动创建!"); + } + File[] files = file.listFiles(); + if (files == null || files.length == 0) { + throw new ConfigNotExistException("在目录" + MODEL_CONFIG_DIR + "中未找到配置文件!"); + } + //遍历文件获取所有配置文件并返回 + HashMap configMap = new HashMap<>(); + for (File f : files) { + if (f.isDirectory()) { + continue; + } + PrimaryModelConfig primaryModelConfig = JSONUtil.readJSONObject(f, StandardCharsets.UTF_8).toBean(PrimaryModelConfig.class); + configMap.put(primaryModelConfig.getKey(), primaryModelConfig.getModelConfig()); + } + return configMap; + } + + @Override + protected HashMap loadModuleEnabledStatusMap() { + File file = new File(MODULE_ENABLED_STATUS_CONFIG_FILE); + try { + HashMap moduleEnabledStatus = new HashMap<>(); + if (!file.exists()) { + file.createNewFile(); + for (MetaModule module : moduleList) { + moduleEnabledStatus.put(module.getName(), module.isEnabled()); + } + dumpModuleEnabledStatus(); + } else { + JSONObject obj = JSONUtil.readJSONObject(file, StandardCharsets.UTF_8); + for (String s : obj.keySet()) { + moduleEnabledStatus.put(s, obj.getBool(s)); + } + log.info("ModuleEnabledStatusConfig 配置文件已成功读取!"); + } + return moduleEnabledStatus; + } catch (Exception e) { + throw new ConfigGenerateFailedException("ModuleEnabledStatusConfig 配置文件创建失败!", e); + } + } + + @Override + public void dumpModelConfig(String key) { + try { + File file = new File(MODEL_CONFIG_DIR + key + ".json"); + if (!file.exists()) { + file.createNewFile(); + } + FileUtils.writeStringToFile(file, JSONUtil.toJsonPrettyStr(modelConfigMap.get(key)), StandardCharsets.UTF_8, false); + } catch (Exception e) { + throw new ConfigUpdateFailedException("ModelConfig 配置文件更新失败!"); + } + } + + @Override + protected void dumpModuleEnabledStatus() { + try { + File file = new File(MODULE_ENABLED_STATUS_CONFIG_FILE); + FileUtils.writeStringToFile(file, JSONUtil.toJsonPrettyStr(moduleEnabledStatus), StandardCharsets.UTF_8, false); + } catch (IOException e) { + throw new ConfigGenerateFailedException("ModuleEnabledStatus 配置文件更新失败!"); + } + } +} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/AgentExceptionCallback.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/AgentExceptionCallback.java new file mode 100644 index 00000000..3f72c9de --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/AgentExceptionCallback.java @@ -0,0 +1,6 @@ +package work.slhaf.partner.api.agent.runtime.exception; + +public interface AgentExceptionCallback { + void onRuntimeException(AgentRuntimeException e); + void onFailedException(AgentLaunchFailedException e); +} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/exception/AgentLaunchFailedException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/AgentLaunchFailedException.java similarity index 57% rename from Partner-Api/src/main/java/work/slhaf/partner/api/agent/exception/AgentLaunchFailedException.java rename to Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/AgentLaunchFailedException.java index f3ac30f5..744483eb 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/exception/AgentLaunchFailedException.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/AgentLaunchFailedException.java @@ -1,11 +1,11 @@ -package work.slhaf.partner.api.agent.exception; +package work.slhaf.partner.api.agent.runtime.exception; public class AgentLaunchFailedException extends RuntimeException { public AgentLaunchFailedException(String message, Throwable cause) { - super("Agent 启动失败: " + message, cause); + super("Agent 启动失败 " + message, cause); } public AgentLaunchFailedException(String message) { - super("Agent 启动失败: " + message); + super("Agent 启动失败 " + message); } } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/AgentRuntimeException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/AgentRuntimeException.java new file mode 100644 index 00000000..89d60fc9 --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/AgentRuntimeException.java @@ -0,0 +1,11 @@ +package work.slhaf.partner.api.agent.runtime.exception; + +public class AgentRuntimeException extends RuntimeException { + public AgentRuntimeException(String message) { + super("Agent 执行出错 " + message); + } + + public AgentRuntimeException(String message, Throwable cause) { + super("Agent 执行出错 " + message, cause); + } +} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/DefaultAgentExceptionCallback.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/DefaultAgentExceptionCallback.java new file mode 100644 index 00000000..e76d3164 --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/DefaultAgentExceptionCallback.java @@ -0,0 +1,17 @@ +package work.slhaf.partner.api.agent.runtime.exception; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class DefaultAgentExceptionCallback implements AgentExceptionCallback { + + @Override + public void onRuntimeException(AgentRuntimeException e) { + log.error("Agent 运行异常: ", e); + } + + @Override + public void onFailedException(AgentLaunchFailedException e) { + throw e; + } +} 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 new file mode 100644 index 00000000..73e83c24 --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/runtime/exception/GlobalExceptionHandler.java @@ -0,0 +1,26 @@ +package work.slhaf.partner.api.agent.runtime.exception; + +public class GlobalExceptionHandler { + + public static GlobalExceptionHandler INSTANCE = new GlobalExceptionHandler(); + + private AgentExceptionCallback exceptionCallback = new DefaultAgentExceptionCallback(); + + public void handle(Throwable e) { + + switch (e.getClass().getSimpleName()) { + case "AgentRuntimeException": + exceptionCallback.onRuntimeException((AgentRuntimeException) e); + break; + case "AgentLaunchFailedException": + exceptionCallback.onFailedException((AgentLaunchFailedException) e); + break; + default: + throw new RuntimeException("未经处理的异常!", e); + } + } + + public static void setExceptionCallback(AgentExceptionCallback callback) { + INSTANCE.exceptionCallback = callback; + } +} diff --git a/Partner-Api/src/test/java/module/ModuleProxyTest.java b/Partner-Api/src/test/java/module/ModuleProxyTest.java index fe1a1fc8..f35d58e3 100644 --- a/Partner-Api/src/test/java/module/ModuleProxyTest.java +++ b/Partner-Api/src/test/java/module/ModuleProxyTest.java @@ -4,15 +4,15 @@ import net.bytebuddy.ByteBuddy; import net.bytebuddy.implementation.MethodDelegation; import net.bytebuddy.matcher.ElementMatchers; import org.junit.jupiter.api.Test; -import work.slhaf.partner.api.agent.flow.abstracts.AgentInteractionModule; +import work.slhaf.partner.api.agent.flow.abstracts.AgentRunningModule; import java.lang.reflect.InvocationTargetException; public class ModuleProxyTest { @Test public void test() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { - Class clazz = new ByteBuddy().subclass(MyAgentInteractionModule.class) - .method(ElementMatchers.isOverriddenFrom(AgentInteractionModule.class)) + Class clazz = new ByteBuddy().subclass(MyAgentRunningModule.class) + .method(ElementMatchers.isOverriddenFrom(AgentRunningModule.class)) .intercept(MethodDelegation.to( new MyModuleProxyInterceptor() )) diff --git a/Partner-Api/src/test/java/module/MyAgentInteractionModule.java b/Partner-Api/src/test/java/module/MyAgentInteractionModule.java deleted file mode 100644 index effa6251..00000000 --- a/Partner-Api/src/test/java/module/MyAgentInteractionModule.java +++ /dev/null @@ -1,11 +0,0 @@ -package module; - -import work.slhaf.partner.api.agent.flow.abstracts.AgentInteractionModule; -import work.slhaf.partner.api.agent.flow.entity.InteractionFlowContext; - -public class MyAgentInteractionModule extends AgentInteractionModule { - @Override - public void execute(InteractionFlowContext context) { - System.out.println("MyAgentInteractionModule"); - } -} diff --git a/Partner-Api/src/test/java/module/MyAgentRunningModule.java b/Partner-Api/src/test/java/module/MyAgentRunningModule.java new file mode 100644 index 00000000..777f56f2 --- /dev/null +++ b/Partner-Api/src/test/java/module/MyAgentRunningModule.java @@ -0,0 +1,11 @@ +package module; + +import work.slhaf.partner.api.agent.flow.abstracts.AgentRunningModule; +import work.slhaf.partner.api.agent.flow.entity.RunningFlowContext; + +public class MyAgentRunningModule extends AgentRunningModule { + @Override + public void execute(RunningFlowContext context) { + System.out.println("MyAgentRunningModule"); + } +} 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 1aeb9bec..4c3a24f5 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 @@ -7,7 +7,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; import work.slhaf.partner.api.agent.flow.abstracts.ActivateModel; -import work.slhaf.partner.api.agent.flow.abstracts.AgentInteractionSubModule; +import work.slhaf.partner.api.agent.flow.abstracts.AgentRunningSubModule; import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor; import work.slhaf.partner.core.cognation.common.pojo.MemoryResult; import work.slhaf.partner.core.cognation.common.pojo.MemorySliceResult; @@ -30,7 +30,7 @@ import static work.slhaf.partner.common.util.ExtractUtil.extractJson; @EqualsAndHashCode(callSuper = true) @Data @Slf4j -public class SliceSelectEvaluator extends AgentInteractionSubModule> implements ActivateModel { +public class SliceSelectEvaluator extends AgentRunningSubModule> implements ActivateModel { private static volatile SliceSelectEvaluator sliceSelectEvaluator; private InteractionThreadPoolExecutor executor; 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 73835e08..22259c6e 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,7 +7,7 @@ import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.api.agent.flow.abstracts.ActivateModel; -import work.slhaf.partner.api.agent.flow.abstracts.AgentInteractionSubModule; +import work.slhaf.partner.api.agent.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_handler.GlobalExceptionHandler; @@ -31,7 +31,7 @@ import static work.slhaf.partner.common.util.ExtractUtil.fixTopicPath; @EqualsAndHashCode(callSuper = true) @Data @Slf4j -public class MemorySelectExtractor extends AgentInteractionSubModule implements ActivateModel { +public class MemorySelectExtractor extends AgentRunningSubModule implements ActivateModel { private static volatile MemorySelectExtractor memorySelectExtractor; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/MemorySummarizer.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/MemorySummarizer.java index 632816ad..35e0f083 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/MemorySummarizer.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/MemorySummarizer.java @@ -3,7 +3,7 @@ package work.slhaf.partner.module.modules.memory.updater.summarizer; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; -import work.slhaf.partner.api.agent.flow.abstracts.AgentInteractionSubModule; +import work.slhaf.partner.api.agent.flow.abstracts.AgentRunningSubModule; import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor; import work.slhaf.partner.module.modules.memory.updater.summarizer.data.SummarizeInput; import work.slhaf.partner.module.modules.memory.updater.summarizer.data.SummarizeResult; @@ -13,7 +13,7 @@ import java.util.HashMap; @EqualsAndHashCode(callSuper = true) @Data @Slf4j -public class MemorySummarizer extends AgentInteractionSubModule { +public class MemorySummarizer extends AgentRunningSubModule { private static volatile MemorySummarizer memorySummarizer; public static final String MODEL_KEY = "memory_summarizer"; 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 702d5ff4..0d1b37fe 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 @@ -6,7 +6,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; import work.slhaf.partner.api.agent.flow.abstracts.ActivateModel; -import work.slhaf.partner.api.agent.flow.abstracts.AgentInteractionSubModule; +import work.slhaf.partner.api.agent.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; @@ -20,7 +20,7 @@ import static work.slhaf.partner.common.util.ExtractUtil.fixTopicPath; @EqualsAndHashCode(callSuper = true) @Data @Slf4j -public class MultiSummarizer extends AgentInteractionSubModule implements ActivateModel { +public class MultiSummarizer extends AgentRunningSubModule implements ActivateModel { private static volatile MultiSummarizer multiSummarizer; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/SingleSummarizer.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/SingleSummarizer.java index c0f5ab9b..40f8c0cc 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/SingleSummarizer.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/SingleSummarizer.java @@ -5,7 +5,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; import work.slhaf.partner.api.agent.flow.abstracts.ActivateModel; -import work.slhaf.partner.api.agent.flow.abstracts.AgentInteractionSubModule; +import work.slhaf.partner.api.agent.flow.abstracts.AgentRunningSubModule; import work.slhaf.partner.api.chat.constant.ChatConstant; import work.slhaf.partner.api.chat.pojo.ChatResponse; import work.slhaf.partner.api.chat.pojo.Message; @@ -20,7 +20,7 @@ import java.util.concurrent.atomic.AtomicInteger; @EqualsAndHashCode(callSuper = true) @Slf4j @Data -public class SingleSummarizer extends AgentInteractionSubModule,Void> implements ActivateModel { +public class SingleSummarizer extends AgentRunningSubModule,Void> implements ActivateModel { private static volatile SingleSummarizer singleSummarizer; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/TotalSummarizer.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/TotalSummarizer.java index 286176e9..aa714c9e 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/TotalSummarizer.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/memory/updater/summarizer/TotalSummarizer.java @@ -6,7 +6,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; import work.slhaf.partner.api.agent.flow.abstracts.ActivateModel; -import work.slhaf.partner.api.agent.flow.abstracts.AgentInteractionSubModule; +import work.slhaf.partner.api.agent.flow.abstracts.AgentRunningSubModule; import work.slhaf.partner.api.chat.pojo.ChatResponse; import java.util.HashMap; @@ -16,7 +16,7 @@ import static work.slhaf.partner.common.util.ExtractUtil.extractJson; @EqualsAndHashCode(callSuper = true) @Data @Slf4j -public class TotalSummarizer extends AgentInteractionSubModule, String> implements ActivateModel { +public class TotalSummarizer extends AgentRunningSubModule, String> implements ActivateModel { private static volatile TotalSummarizer totalSummarizer; 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 6ed4f681..615e9d83 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 @@ -4,7 +4,7 @@ import com.alibaba.fastjson2.JSONObject; import lombok.Data; import lombok.EqualsAndHashCode; import work.slhaf.partner.api.agent.flow.abstracts.ActivateModel; -import work.slhaf.partner.api.agent.flow.abstracts.AgentInteractionSubModule; +import work.slhaf.partner.api.agent.flow.abstracts.AgentRunningSubModule; import work.slhaf.partner.api.chat.pojo.ChatResponse; import work.slhaf.partner.api.chat.pojo.Message; import work.slhaf.partner.core.cognation.cognation.CognationCapability; @@ -21,7 +21,7 @@ import java.util.List; @EqualsAndHashCode(callSuper = true) @Data -public class RelationExtractor extends AgentInteractionSubModule implements ActivateModel { +public class RelationExtractor extends AgentRunningSubModule implements ActivateModel { private static volatile RelationExtractor relationExtractor; 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 128edf8d..6d5786ff 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 @@ -6,7 +6,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.api.agent.flow.abstracts.ActivateModel; -import work.slhaf.partner.api.agent.flow.abstracts.AgentInteractionSubModule; +import work.slhaf.partner.api.agent.flow.abstracts.AgentRunningSubModule; import work.slhaf.partner.api.chat.pojo.ChatResponse; import work.slhaf.partner.core.cognation.cognation.CognationCapability; import work.slhaf.partner.core.cognation.submodule.perceive.PerceiveCapability; @@ -18,7 +18,7 @@ import java.util.HashMap; @EqualsAndHashCode(callSuper = true) @Data -public class StaticMemoryExtractor extends AgentInteractionSubModule> implements ActivateModel { +public class StaticMemoryExtractor extends AgentRunningSubModule> implements ActivateModel { private static volatile StaticMemoryExtractor staticMemoryExtractor; diff --git a/Partner-Test-Demo/src/main/java/work/slhaf/demo/flow/AgentDemoFlowContext.java b/Partner-Test-Demo/src/main/java/work/slhaf/demo/flow/AgentDemoFlowContext.java index 0cabc5cd..7e979814 100644 --- a/Partner-Test-Demo/src/main/java/work/slhaf/demo/flow/AgentDemoFlowContext.java +++ b/Partner-Test-Demo/src/main/java/work/slhaf/demo/flow/AgentDemoFlowContext.java @@ -1,6 +1,6 @@ package work.slhaf.demo.flow; -import work.slhaf.partner.api.agent.flow.entity.InteractionFlowContext; +import work.slhaf.partner.api.agent.flow.entity.RunningFlowContext; -public class AgentDemoFlowContext extends InteractionFlowContext { +public class AgentDemoFlowContext extends RunningFlowContext { }