mirror of
https://github.com/slhaf/Partner.git
synced 2026-05-12 08:43:02 +08:00
refactor(framework): migrate ConfigLoaderFactory to Kotlin and simplify loader metadata registration
This commit is contained in:
@@ -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 org.slf4j.LoggerFactory
|
||||||
import work.slhaf.partner.api.agent.factory.AgentBaseFactory;
|
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.ConfigNotExistException
|
||||||
import work.slhaf.partner.api.agent.factory.config.exception.PromptNotExistException;
|
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.AgentRegisterContext;
|
import work.slhaf.partner.api.agent.runtime.config.AgentConfigLoader
|
||||||
import work.slhaf.partner.api.agent.factory.context.ConfigFactoryContext;
|
import work.slhaf.partner.api.agent.runtime.config.FileAgentConfigLoader
|
||||||
import work.slhaf.partner.api.agent.factory.module.ModuleCheckFactory;
|
import java.lang.reflect.Modifier
|
||||||
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;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <h2>Agent启动流程 0</h2>
|
* <h2>Agent启动流程 0</h2>
|
||||||
* <p>
|
|
||||||
* 通过指定的 {@link AgentConfigManager} 或者默认的 {@link FileAgentConfigManager} 加载配置文件
|
|
||||||
* <p/>
|
|
||||||
*
|
*
|
||||||
* <p>下一步流程请参阅{@link ModuleCheckFactory}</p>
|
* 通过指定的 [AgentConfigLoader] 或默认的 [FileAgentConfigLoader] 加载配置文件。
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
class ConfigLoaderFactory : AgentBaseFactory() {
|
||||||
public class ConfigLoaderFactory extends AgentBaseFactory {
|
|
||||||
|
|
||||||
private AgentConfigManager agentConfigManager;
|
companion object {
|
||||||
private HashMap<String, ModelConfig> modelConfigMap;
|
private val log = LoggerFactory.getLogger(ConfigLoaderFactory::class.java)
|
||||||
private HashMap<String, List<Message>> 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;
|
override fun execute(context: AgentRegisterContext) {
|
||||||
|
val agentConfigLoader = AgentConfigLoader.INSTANCE ?: FileAgentConfigLoader().also {
|
||||||
|
AgentConfigLoader.INSTANCE = it
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
agentConfigLoader.load()
|
||||||
protected void run() {
|
|
||||||
agentConfigManager.load();
|
val configFactoryContext = context.configFactoryContext
|
||||||
modelConfigMap.putAll(agentConfigManager.getModelConfigMap());
|
configFactoryContext.modelConfigMap.putAll(agentConfigLoader.modelConfigMap)
|
||||||
modelPromptMap.putAll(agentConfigManager.getModelPromptMap());
|
configFactoryContext.modelPromptMap.putAll(agentConfigLoader.modelPromptMap)
|
||||||
check();
|
|
||||||
|
check(configFactoryContext.modelConfigMap.keys, configFactoryContext.modelPromptMap.keys)
|
||||||
|
collectLoaderMetadata(context, agentConfigLoader)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
private fun check(configKeys: Set<String>, promptKeys: Set<String>) {
|
||||||
* 对模型Config与Prompt分别进行检验,除了都必须包含default外,还需要确保数量、key一致,毕竟是模型配置与提示词
|
log.info("执行config与prompt检测...")
|
||||||
*/
|
if (!configKeys.contains("default")) {
|
||||||
private void check() {
|
throw ConfigNotExistException("缺少默认配置! 需确保存在一个模型配置的key为`default`")
|
||||||
log.info("执行config与prompt检测...");
|
|
||||||
if (!modelConfigMap.containsKey("default")) {
|
|
||||||
throw new ConfigNotExistException("缺少默认配置! 需确保存在一个模型配置的key为`default`");
|
|
||||||
}
|
}
|
||||||
if (!modelPromptMap.containsKey("basic")) {
|
if (!promptKeys.contains("basic")) {
|
||||||
throw new PromptNotExistException("缺少基础Prompt! 需要确保存在key为basic的Prompt文件,它将与其他Prompt共同作用于模块节点。");
|
throw PromptNotExistException("缺少基础Prompt! 需要确保存在key为basic的Prompt文件,它将与其他Prompt共同作用于模块节点。")
|
||||||
}
|
}
|
||||||
Set<String> configKeySet = new HashSet<>(modelConfigMap.keySet());
|
|
||||||
configKeySet.remove("default");
|
val configKeySet = configKeys.toMutableSet().apply { remove("default") }
|
||||||
Set<String> promptKeySet = new HashSet<>(modelPromptMap.keySet());
|
val promptKeySet = promptKeys.toMutableSet().apply { remove("basic") }
|
||||||
promptKeySet.remove("basic");
|
|
||||||
if (!promptKeySet.containsAll(configKeySet)) {
|
if (!promptKeySet.containsAll(configKeySet)) {
|
||||||
log.warn("存在未被提示词包含的模型配置,该配置将无法生效!");
|
log.warn("存在未被提示词包含的模型配置,该配置将无法生效!")
|
||||||
|
}
|
||||||
|
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)
|
||||||
}
|
}
|
||||||
//检查提示词数量与`ActivateModel`的实现数量是否一致
|
|
||||||
log.info("检测完毕.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,8 +49,8 @@ object AgentContext {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T> addMetadata(name: String, type: Class<T>, value: T) {
|
fun addMetadata(name: String, value: Any) {
|
||||||
val content = MetaDataContent(type, JSONObject.toJSONString(value))
|
val content = MetaDataContent(value::class.java, JSONObject.toJSONString(value))
|
||||||
_metadata[name] = content
|
_metadata[name] = content
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user