refactor(framework): migrate AgentRegisterContext to Kotlin and store validated capability scan results in context

This commit is contained in:
2026-02-23 22:12:56 +08:00
parent f13e45327d
commit e0a62053b5
4 changed files with 67 additions and 52 deletions

View File

@@ -20,11 +20,13 @@ class CapabilityAnnotationValidatorFactory : AgentBaseFactory() {
val reflections = context.reflections val reflections = context.reflections
val cores = loadCores(reflections) val cores = loadCores(reflections)
val capabilities = loadCapabilities(reflections) val capabilities = loadCapabilities(reflections)
val methods = loadCapabilityMethods(reflections)
checkCapabilityUniqueByValue(capabilities) checkCapabilityUniqueByValue(capabilities)
checkCapabilityMethodLocation(reflections) checkCapabilityMethodLocation(methods)
checkCapabilityMethodsImplementedUniquely(cores, capabilities) checkCapabilityMethodsImplementedUniquely(cores, capabilities)
checkInjectCapability(reflections) checkInjectCapability(reflections)
storeValidatedScanResult(context, cores, capabilities, methods)
} }
private fun loadCores(reflections: Reflections): Set<Class<*>> { private fun loadCores(reflections: Reflections): Set<Class<*>> {
@@ -37,6 +39,10 @@ class CapabilityAnnotationValidatorFactory : AgentBaseFactory() {
return reflections.getTypesAnnotatedWith(Capability::class.java).toSet() return reflections.getTypesAnnotatedWith(Capability::class.java).toSet()
} }
private fun loadCapabilityMethods(reflections: Reflections): Set<java.lang.reflect.Method> {
return reflections.getMethodsAnnotatedWith(CapabilityMethod::class.java).toSet()
}
/** /**
* 规则1: @Capability 按 value 唯一 * 规则1: @Capability 按 value 唯一
*/ */
@@ -54,9 +60,8 @@ class CapabilityAnnotationValidatorFactory : AgentBaseFactory() {
/** /**
* 规则3.1: @CapabilityMethod 仅能用于 @CapabilityCore 类 * 规则3.1: @CapabilityMethod 仅能用于 @CapabilityCore 类
*/ */
private fun checkCapabilityMethodLocation(reflections: Reflections) { private fun checkCapabilityMethodLocation(methods: Set<java.lang.reflect.Method>) {
reflections.getMethodsAnnotatedWith(CapabilityMethod::class.java) methods.forEach { method ->
.forEach { method ->
val declaringClass = method.declaringClass val declaringClass = method.declaringClass
if (!declaringClass.isAnnotationPresent(CapabilityCore::class.java)) { if (!declaringClass.isAnnotationPresent(CapabilityCore::class.java)) {
throw UnMatchedCapabilityException( throw UnMatchedCapabilityException(
@@ -121,4 +126,19 @@ class CapabilityAnnotationValidatorFactory : AgentBaseFactory() {
} }
} }
} }
private fun storeValidatedScanResult(
context: AgentRegisterContext,
cores: Set<Class<*>>,
capabilities: Set<Class<*>>,
methods: Set<java.lang.reflect.Method>
) {
val capabilityFactoryContext = context.capabilityFactoryContext
capabilityFactoryContext.cores.clear()
capabilityFactoryContext.capabilities.clear()
capabilityFactoryContext.methods.clear()
capabilityFactoryContext.cores.addAll(cores)
capabilityFactoryContext.capabilities.addAll(capabilities)
capabilityFactoryContext.methods.addAll(methods)
}
} }

View File

@@ -1,27 +0,0 @@
package work.slhaf.partner.api.agent.factory.context;
import lombok.Data;
import org.reflections.Reflections;
import org.reflections.scanners.Scanners;
import org.reflections.util.ConfigurationBuilder;
import java.net.URL;
import java.util.List;
@Data
public class AgentRegisterContext {
private Reflections reflections;
private ConfigFactoryContext configFactoryContext = new ConfigFactoryContext();
private AgentContext agentContext = AgentContext.INSTANCE;
public AgentRegisterContext(List<URL> urls) {
reflections = new Reflections(new ConfigurationBuilder().setScanners(
Scanners.FieldsAnnotated,
Scanners.SubTypes,
Scanners.MethodsAnnotated,
Scanners.TypesAnnotated
)
.setUrls(urls)
);
}
}

View File

@@ -0,0 +1,36 @@
package work.slhaf.partner.api.agent.factory.context
import org.reflections.Reflections
import org.reflections.scanners.Scanners
import org.reflections.util.ConfigurationBuilder
import work.slhaf.partner.api.agent.factory.config.pojo.ModelConfig
import work.slhaf.partner.api.chat.pojo.Message
import java.lang.reflect.Method
import java.net.URL
class AgentRegisterContext(urls: List<URL>) {
val reflections: Reflections = Reflections(
ConfigurationBuilder().setScanners(
Scanners.FieldsAnnotated,
Scanners.SubTypes,
Scanners.MethodsAnnotated,
Scanners.TypesAnnotated
).setUrls(urls)
)
val configFactoryContext: ConfigFactoryContext = ConfigFactoryContext()
val capabilityFactoryContext: CapabilityFactoryContext = CapabilityFactoryContext()
val agentContext: AgentContext = AgentContext
}
class ConfigFactoryContext {
val modelPromptMap: HashMap<String, List<Message>> = HashMap()
val modelConfigMap: HashMap<String, ModelConfig> = HashMap()
}
class CapabilityFactoryContext {
val cores: MutableSet<Class<*>> = LinkedHashSet()
val capabilities: MutableSet<Class<*>> = LinkedHashSet()
val methods: MutableSet<Method> = LinkedHashSet()
}

View File

@@ -1,14 +0,0 @@
package work.slhaf.partner.api.agent.factory.context;
import lombok.Data;
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.List;
@Data
public class ConfigFactoryContext {
private HashMap<String, List<Message>> modelPromptMap = new HashMap<>();
private HashMap<String, ModelConfig> modelConfigMap = new HashMap<>();
}