diff --git a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/config/ConfigLoaderFactory.kt b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/config/ConfigLoaderFactory.kt
index 16d56984..df0a0bf3 100644
--- a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/config/ConfigLoaderFactory.kt
+++ b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/config/ConfigLoaderFactory.kt
@@ -1,77 +1,75 @@
-package work.slhaf.partner.api.agent.factory.config;
+package work.slhaf.partner.api.agent.factory.config
-import lombok.extern.slf4j.Slf4j;
-import work.slhaf.partner.api.agent.factory.AgentBaseFactory;
-import work.slhaf.partner.api.agent.factory.config.exception.ConfigNotExistException;
-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.context.AgentRegisterContext;
-import work.slhaf.partner.api.agent.factory.context.ConfigFactoryContext;
-import work.slhaf.partner.api.agent.factory.module.ModuleCheckFactory;
-import work.slhaf.partner.api.agent.runtime.config.AgentConfigManager;
-import work.slhaf.partner.api.agent.runtime.config.FileAgentConfigManager;
-import work.slhaf.partner.api.chat.pojo.Message;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import org.slf4j.LoggerFactory
+import work.slhaf.partner.api.agent.factory.AgentBaseFactory
+import work.slhaf.partner.api.agent.factory.config.exception.ConfigNotExistException
+import work.slhaf.partner.api.agent.factory.config.exception.PromptNotExistException
+import work.slhaf.partner.api.agent.factory.context.AgentRegisterContext
+import work.slhaf.partner.api.agent.runtime.config.AgentConfigLoader
+import work.slhaf.partner.api.agent.runtime.config.FileAgentConfigLoader
+import java.lang.reflect.Modifier
/**
*
Agent启动流程 0
- *
- * 通过指定的 {@link AgentConfigManager} 或者默认的 {@link FileAgentConfigManager} 加载配置文件
- *
*
- * 下一步流程请参阅{@link ModuleCheckFactory}
+ * 通过指定的 [AgentConfigLoader] 或默认的 [FileAgentConfigLoader] 加载配置文件。
*/
-@Slf4j
-public class ConfigLoaderFactory extends AgentBaseFactory {
+class ConfigLoaderFactory : AgentBaseFactory() {
- private AgentConfigManager agentConfigManager;
- private HashMap modelConfigMap;
- private HashMap> modelPromptMap;
-
- @Override
- protected void setVariables(AgentRegisterContext context) {
- ConfigFactoryContext factoryContext = context.getConfigFactoryContext();
- modelConfigMap = factoryContext.getModelConfigMap();
- modelPromptMap = factoryContext.getModelPromptMap();
-
- if (AgentConfigManager.INSTANCE == null) {
- AgentConfigManager.setINSTANCE(new FileAgentConfigManager());
- }
-
- agentConfigManager = AgentConfigManager.INSTANCE;
+ companion object {
+ private val log = LoggerFactory.getLogger(ConfigLoaderFactory::class.java)
}
- @Override
- protected void run() {
- agentConfigManager.load();
- modelConfigMap.putAll(agentConfigManager.getModelConfigMap());
- modelPromptMap.putAll(agentConfigManager.getModelPromptMap());
- check();
+ override fun execute(context: AgentRegisterContext) {
+ val agentConfigLoader = AgentConfigLoader.INSTANCE ?: FileAgentConfigLoader().also {
+ AgentConfigLoader.INSTANCE = it
+ }
+
+ agentConfigLoader.load()
+
+ val configFactoryContext = context.configFactoryContext
+ configFactoryContext.modelConfigMap.putAll(agentConfigLoader.modelConfigMap)
+ configFactoryContext.modelPromptMap.putAll(agentConfigLoader.modelPromptMap)
+
+ check(configFactoryContext.modelConfigMap.keys, configFactoryContext.modelPromptMap.keys)
+ collectLoaderMetadata(context, agentConfigLoader)
}
- /**
- * 对模型Config与Prompt分别进行检验,除了都必须包含default外,还需要确保数量、key一致,毕竟是模型配置与提示词
- */
- private void check() {
- log.info("执行config与prompt检测...");
- if (!modelConfigMap.containsKey("default")) {
- throw new ConfigNotExistException("缺少默认配置! 需确保存在一个模型配置的key为`default`");
+ private fun check(configKeys: Set, promptKeys: Set) {
+ log.info("执行config与prompt检测...")
+ if (!configKeys.contains("default")) {
+ throw ConfigNotExistException("缺少默认配置! 需确保存在一个模型配置的key为`default`")
}
- if (!modelPromptMap.containsKey("basic")) {
- throw new PromptNotExistException("缺少基础Prompt! 需要确保存在key为basic的Prompt文件,它将与其他Prompt共同作用于模块节点。");
+ if (!promptKeys.contains("basic")) {
+ throw PromptNotExistException("缺少基础Prompt! 需要确保存在key为basic的Prompt文件,它将与其他Prompt共同作用于模块节点。")
}
- Set configKeySet = new HashSet<>(modelConfigMap.keySet());
- configKeySet.remove("default");
- Set promptKeySet = new HashSet<>(modelPromptMap.keySet());
- promptKeySet.remove("basic");
+
+ val configKeySet = configKeys.toMutableSet().apply { remove("default") }
+ val promptKeySet = promptKeys.toMutableSet().apply { remove("basic") }
if (!promptKeySet.containsAll(configKeySet)) {
- log.warn("存在未被提示词包含的模型配置,该配置将无法生效!");
+ log.warn("存在未被提示词包含的模型配置,该配置将无法生效!")
}
- //检查提示词数量与`ActivateModel`的实现数量是否一致
- log.info("检测完毕.");
+ log.info("检测完毕.")
+ }
+
+ private fun collectLoaderMetadata(context: AgentRegisterContext, loader: AgentConfigLoader) {
+ val fieldNamesInBaseType = AgentConfigLoader::class.java.declaredFields
+ .asSequence()
+ .filterNot { it.isSynthetic }
+ .map { it.name }
+ .toSet()
+
+ val implementationType = loader::class.java
+ implementationType.declaredFields
+ .asSequence()
+ .filterNot { it.isSynthetic }
+ .filterNot { fieldNamesInBaseType.contains(it.name) }
+ .filterNot { !Modifier.isStatic(it.modifiers) }
+ .forEach { field ->
+ field.isAccessible = true
+ val value = field.get(loader)
+ context.agentContext.addMetadata(field.name, value)
+ }
}
}
+
diff --git a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/context/AgentContext.kt b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/context/AgentContext.kt
index e5e4bfce..6e896b88 100644
--- a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/context/AgentContext.kt
+++ b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/context/AgentContext.kt
@@ -49,8 +49,8 @@ object AgentContext {
return true
}
- fun addMetadata(name: String, type: Class, value: T) {
- val content = MetaDataContent(type, JSONObject.toJSONString(value))
+ fun addMetadata(name: String, value: Any) {
+ val content = MetaDataContent(value::class.java, JSONObject.toJSONString(value))
_metadata[name] = content
}