diff --git a/.idea/.gitignore b/.idea/.gitignore
index 35410cac..78b605e0 100644
--- a/.idea/.gitignore
+++ b/.idea/.gitignore
@@ -6,3 +6,4 @@
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
+/inspectionProfiles/Project_Default.xml
diff --git a/.xcodemap/config/xcodemap-class-filter.yaml b/.xcodemap/config/xcodemap-class-filter.yaml
index 598c4a62..dd20cb7d 100644
--- a/.xcodemap/config/xcodemap-class-filter.yaml
+++ b/.xcodemap/config/xcodemap-class-filter.yaml
@@ -1,4 +1,5 @@
autoDetectedPackages:
+- module
- work.slhaf
enableAutoDetect: true
entryDisplayConfig:
diff --git a/Partner-Api/pom.xml b/Partner-Api/pom.xml
index 15b6ee64..1e162230 100644
--- a/Partner-Api/pom.xml
+++ b/Partner-Api/pom.xml
@@ -26,7 +26,6 @@
org.projectlombok
lombok
1.18.36
- provided
junit
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/Agent.java b/Partner-Api/src/main/java/work/slhaf/partner/api/Agent.java
index 11a1a5e4..b80dfcb8 100644
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/Agent.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/Agent.java
@@ -1,8 +1,10 @@
package work.slhaf.partner.api;
-import work.slhaf.partner.api.entity.AgentContext;
+import work.slhaf.partner.api.exception.AgentLaunchFailedException;
import work.slhaf.partner.api.factory.AgentRegisterFactory;
+import work.slhaf.partner.api.factory.module.pojo.MetaModule;
import work.slhaf.partner.api.flow.AgentInteraction;
+import work.slhaf.partner.api.flow.entity.InteractionFlowContext;
import java.util.ArrayList;
import java.util.List;
@@ -14,23 +16,38 @@ import java.util.concurrent.Executors;
*/
public class Agent {
- private static final List runners = new ArrayList<>();
+ private final List runners = new ArrayList<>();
+ private final Class> applicationClass;
+ private final InteractionFlowContext interactionContext;
- public static void run(Class> clazz) {
- AgentContext context = AgentRegisterFactory.launch(clazz.getPackage().getName());
- AgentInteraction.launch(context);
+ private Agent(Class> clazz, InteractionFlowContext interactionContext) {
+ this.applicationClass = clazz;
+ this.interactionContext = interactionContext;
+ }
+
+ public static Agent newAgent(Class> clazz, InteractionFlowContext interactionContext) {
+ if (clazz == null || interactionContext == null) {
+ throw new AgentLaunchFailedException("Agent class 和 interaction flow context 不能为 null");
+ }
+ return new Agent(clazz, interactionContext);
+ }
+
+ public void run() {
+ List moduleList = AgentRegisterFactory.launch(applicationClass.getPackage().getName());
+ AgentInteraction.launch(moduleList, interactionContext);
launchRunners();
}
- private static void launchRunners() {
+
+ private void launchRunners() {
ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor();
for (Runnable runner : runners) {
executorService.execute(runner);
}
- executorService.close();
}
- public static void addRunner(Runnable runnable) {
- runners.add(runnable);
+ public Agent addRunners(Runnable... runnable) {
+ runners.addAll(List.of(runnable));
+ return this;
}
}
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/entity/AgentContext.java b/Partner-Api/src/main/java/work/slhaf/partner/api/entity/AgentContext.java
index 0a1b2012..c8c5dfc2 100644
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/entity/AgentContext.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/entity/AgentContext.java
@@ -1,8 +1,10 @@
package work.slhaf.partner.api.entity;
import lombok.Data;
+import work.slhaf.partner.api.factory.module.pojo.MetaModule;
import java.util.HashMap;
+import java.util.List;
import java.util.Set;
import java.util.function.Function;
@@ -14,4 +16,5 @@ public class AgentContext {
private HashMap, Object> capabilityHolderInstances;
private Set> cores;
private Set> capabilities;
+ private List moduleList;
}
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/exception/AgentLaunchFailedException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/exception/AgentLaunchFailedException.java
new file mode 100644
index 00000000..77b41aff
--- /dev/null
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/exception/AgentLaunchFailedException.java
@@ -0,0 +1,11 @@
+package work.slhaf.partner.api.exception;
+
+public class AgentLaunchFailedException extends RuntimeException {
+ public AgentLaunchFailedException(String message, Throwable cause) {
+ super("Agent 启动失败: " + message, cause);
+ }
+
+ public AgentLaunchFailedException(String message) {
+ super("Agent 启动失败: " + message);
+ }
+}
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/AgentRegisterFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/AgentRegisterFactory.java
index 20f50211..c53c762a 100644
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/AgentRegisterFactory.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/AgentRegisterFactory.java
@@ -1,8 +1,6 @@
package work.slhaf.partner.api.factory;
-import cn.hutool.core.bean.BeanUtil;
import org.reflections.util.ClasspathHelper;
-import work.slhaf.partner.api.entity.AgentContext;
import work.slhaf.partner.api.factory.capability.CapabilityCheckFactory;
import work.slhaf.partner.api.factory.capability.CapabilityInjectFactory;
import work.slhaf.partner.api.factory.capability.CapabilityRegisterFactory;
@@ -14,6 +12,7 @@ import work.slhaf.partner.api.factory.module.ModuleCheckFactory;
import work.slhaf.partner.api.factory.module.ModulePreHookExecuteFactory;
import work.slhaf.partner.api.factory.module.ModuleProxyFactory;
import work.slhaf.partner.api.factory.module.ModuleRegisterFactory;
+import work.slhaf.partner.api.factory.module.pojo.MetaModule;
import java.io.File;
import java.net.URL;
@@ -27,7 +26,7 @@ public class AgentRegisterFactory {
private AgentRegisterFactory() {
}
- public static AgentContext launch(String packageName) {
+ public static List launch(String packageName) {
urls.addAll(packageNameToURL(packageName));
AgentRegisterContext registerContext = new AgentRegisterContext(urls);
//流程
@@ -46,11 +45,10 @@ public class AgentRegisterFactory {
//. 执行模块PreHook逻辑
new ModulePreHookExecuteFactory().execute(registerContext);
- AgentContext agentContext = new AgentContext();
- BeanUtil.copyProperties(registerContext, agentContext);
- return agentContext;
+ return registerContext.getModuleFactoryContext().getModuleList();
}
+
/**
* 添加可扫描包
* @param packageName 指定的包名
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/context/ModuleFactoryContext.java b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/context/ModuleFactoryContext.java
index 7496e766..12730d3b 100644
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/context/ModuleFactoryContext.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/context/ModuleFactoryContext.java
@@ -14,4 +14,5 @@ public class ModuleFactoryContext {
private List moduleList = new ArrayList<>();
private HashMap,Set> preHookMethods = new HashMap<>();
private HashMap,Set> postHookMethods = new HashMap<>();
+ private HashMap,Set> initHookMethods = new HashMap<>();
}
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleCheckFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleCheckFactory.java
index 338a193a..3fe5eecc 100644
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleCheckFactory.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleCheckFactory.java
@@ -1,12 +1,14 @@
package work.slhaf.partner.api.factory.module;
+import cn.hutool.core.util.ClassUtil;
import org.reflections.Reflections;
import work.slhaf.partner.api.factory.AgentBaseFactory;
import work.slhaf.partner.api.factory.config.ModelConfigManager;
import work.slhaf.partner.api.factory.context.AgentRegisterContext;
-import work.slhaf.partner.api.factory.module.annotation.After;
+import work.slhaf.partner.api.factory.module.annotation.AfterExecute;
import work.slhaf.partner.api.factory.module.annotation.AgentModule;
-import work.slhaf.partner.api.factory.module.annotation.Before;
+import work.slhaf.partner.api.factory.module.annotation.BeforeExecute;
+import work.slhaf.partner.api.factory.module.annotation.Init;
import work.slhaf.partner.api.factory.module.exception.ModuleCheckException;
import work.slhaf.partner.api.flow.abstracts.ActivateModel;
import work.slhaf.partner.api.flow.abstracts.AgentInteractionModule;
@@ -68,14 +70,35 @@ public class ModuleCheckFactory extends AgentBaseFactory {
}
private void hookLocationCheck() {
- //检查@After注解
+ //检查@AfterExecute注解
postHookLocationCheck();
- //检查@Before注解
+ //检查@BeforeExecute注解
preHookLocationCheck();
+ //检查@Init注解
+ initHookLocationCheck();
+ //检查@AgentModule注解是否只位于普通类上
+ agentModuleLocationCheck();
+ }
+
+ private void agentModuleLocationCheck() {
+ Set> types = reflections.getTypesAnnotatedWith(AgentModule.class);
+ for (Class> type : types) {
+ if (!ClassUtil.isNormalClass(type)) {
+ throw new ModuleCheckException("AgentModule 注解仅能位于普通类上! 异常类信息: " + type.getSimpleName());
+ }
+ }
+ }
+
+ private void initHookLocationCheck() {
+ Set methods = reflections.getMethodsAnnotatedWith(Init.class);
+ Set> types = methods.stream()
+ .map(Method::getDeclaringClass)
+ .collect(Collectors.toSet());
+ checkLocation(types);
}
private void preHookLocationCheck() {
- Set methods = reflections.getMethodsAnnotatedWith(Before.class);
+ Set methods = reflections.getMethodsAnnotatedWith(BeforeExecute.class);
Set> types = methods.stream()
.map(Method::getDeclaringClass)
.collect(Collectors.toSet());
@@ -84,7 +107,7 @@ public class ModuleCheckFactory extends AgentBaseFactory {
private void postHookLocationCheck() {
- Set methods = reflections.getMethodsAnnotatedWith(After.class);
+ Set methods = reflections.getMethodsAnnotatedWith(AfterExecute.class);
Set> types = methods.stream()
.map(Method::getDeclaringClass)
.collect(Collectors.toSet());
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleProxyFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleProxyFactory.java
index 62053cdd..5ecbb590 100644
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleProxyFactory.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleProxyFactory.java
@@ -1,9 +1,6 @@
package work.slhaf.partner.api.factory.module;
-import net.bytebuddy.ByteBuddy;
-import net.bytebuddy.implementation.MethodDelegation;
import net.bytebuddy.implementation.bind.annotation.*;
-import net.bytebuddy.matcher.ElementMatchers;
import work.slhaf.partner.api.factory.AgentBaseFactory;
import work.slhaf.partner.api.factory.context.AgentRegisterContext;
import work.slhaf.partner.api.factory.context.ModuleFactoryContext;
@@ -11,59 +8,81 @@ import work.slhaf.partner.api.factory.module.exception.ModuleInstanceGenerateFai
import work.slhaf.partner.api.factory.module.exception.ModuleProxyGenerateFailedException;
import work.slhaf.partner.api.factory.module.pojo.MetaMethod;
import work.slhaf.partner.api.factory.module.pojo.MetaModule;
-import work.slhaf.partner.api.flow.abstracts.AgentInteractionModule;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
-import java.util.Comparator;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Callable;
/**
- * 通过扫描注解@Before,获取到各个模块的后hook逻辑并通过动态代理添加到执行逻辑之后
+ * 通过扫描注解@BeforeExecute,获取到各个模块的后hook逻辑并通过动态代理添加到执行逻辑之后
*/
public class ModuleProxyFactory extends AgentBaseFactory {
private List moduleList;
private HashMap, Set> postHookMethods;
+ private HashMap, Set> preHookMethods;
@Override
protected void setVariables(AgentRegisterContext context) {
ModuleFactoryContext factoryContext = context.getModuleFactoryContext();
moduleList = factoryContext.getModuleList();
postHookMethods = factoryContext.getPostHookMethods();
+ preHookMethods = factoryContext.getPreHookMethods();
}
@Override
protected void run() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
- //TODO 生成实例、并通过动态代理添加PostHook逻辑
+ //TODO 填充具体逻辑
generateInstances();
- setPostHookProxy();
+ setHookProxy();
}
- private void setPostHookProxy() {
+ private void setHookProxy() {
for (MetaModule module : moduleList) {
Class> clazz = module.getClazz();
try {
- Class> proxyClass = new ByteBuddy()
- .subclass(clazz)
- .method(ElementMatchers.isOverriddenFrom(AgentInteractionModule.class))
- .intercept(MethodDelegation.to(new ModuleProxyInterceptor(postHookMethods.get(clazz).stream().sorted(Comparator.comparing(MetaMethod::getOrder)).toList())))
- .make()
- .load(ModuleProxyFactory.class.getClassLoader())
- .getLoaded();
-
- AgentInteractionModule interactionModule = (AgentInteractionModule) proxyClass.getConstructor().newInstance();
- //TODO 检测代理写法是否正确
- //TODO 添加ModuleManager,负责统一管理Module的加载、卸载
+ MethodsListRecord record = getHookMethodsList(clazz);
+ //生成实例,
+ generateProxiedInstances(record);
} catch (Exception e) {
throw new ModuleProxyGenerateFailedException("创建代理对象失败: " + clazz.getSimpleName(), e);
}
}
}
+ private void generateProxiedInstances(MethodsListRecord record) {
+
+ }
+
+ private MethodsListRecord getHookMethodsList(Class> clazz) {
+ List post = new ArrayList<>();
+ List pre = new ArrayList<>();
+ //获取该类本身的hook逻辑
+ getHookMethodsList(post, pre, clazz);
+ //获取它所继承、实现的抽象类或接口, 以AgentInteractionModule、ActiveModel为终点
+ List> classes = getExtendedClasses(clazz);
+ //获取这些类中的hook逻辑
+ getHookMethodsList(post, pre, classes);
+ return new MethodsListRecord(post, pre);
+ }
+
+ private void getHookMethodsList(List post, List pre, List> classes) {
+
+ }
+
+ private List> getExtendedClasses(Class> clazz) {
+
+ return null;
+ }
+
+ private void getHookMethodsList(List post, List pre, Class> clazz) {
+
+ }
+
private void generateInstances() {
for (MetaModule metaModule : moduleList) {
try {
@@ -78,19 +97,27 @@ public class ModuleProxyFactory extends AgentBaseFactory {
private static class ModuleProxyInterceptor {
- private List postHookMethods;
+ private final List postHookMethods;
+ private final List preHookMethods;
- private ModuleProxyInterceptor(List postHookMethods) {
+ private ModuleProxyInterceptor(List postHookMethods, List preHookMethods) {
this.postHookMethods = postHookMethods;
+ this.preHookMethods = preHookMethods;
}
@RuntimeType
public Object intercept(@Origin Method method, @AllArguments Object[] allArguments, @SuperCall Callable> zuper, @This Object proxy) throws Exception {
+ for (MetaMethod metaMethod : preHookMethods) {
+ metaMethod.getMethod().invoke(proxy);
+ }
Object res = zuper.call();
for (MetaMethod metaMethod : postHookMethods) {
- metaMethod.getMethod().invoke(proxy, allArguments);
+ metaMethod.getMethod().invoke(proxy);
}
return res;
}
}
+
+ record MethodsListRecord(List post, List pre) {
+ }
}
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleRegisterFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleRegisterFactory.java
index 8358b180..ad80d456 100644
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleRegisterFactory.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleRegisterFactory.java
@@ -4,9 +4,10 @@ import org.reflections.Reflections;
import work.slhaf.partner.api.factory.AgentBaseFactory;
import work.slhaf.partner.api.factory.context.AgentRegisterContext;
import work.slhaf.partner.api.factory.context.ModuleFactoryContext;
-import work.slhaf.partner.api.factory.module.annotation.After;
+import work.slhaf.partner.api.factory.module.annotation.AfterExecute;
import work.slhaf.partner.api.factory.module.annotation.AgentModule;
-import work.slhaf.partner.api.factory.module.annotation.Before;
+import work.slhaf.partner.api.factory.module.annotation.BeforeExecute;
+import work.slhaf.partner.api.factory.module.annotation.Init;
import work.slhaf.partner.api.factory.module.pojo.MetaMethod;
import work.slhaf.partner.api.factory.module.pojo.MetaModule;
@@ -22,6 +23,7 @@ public class ModuleRegisterFactory extends AgentBaseFactory {
private List moduleList;
private HashMap, Set> postHookMethods;
private HashMap, Set> preHookMethods;
+ private HashMap, Set> initHookMethods;
@Override
protected void setVariables(AgentRegisterContext context) {
@@ -30,6 +32,7 @@ public class ModuleRegisterFactory extends AgentBaseFactory {
moduleList = factoryContext.getModuleList();
postHookMethods = factoryContext.getPostHookMethods();
preHookMethods = factoryContext.getPreHookMethods();
+ initHookMethods = factoryContext.getInitHookMethods();
}
@Override
@@ -41,25 +44,37 @@ public class ModuleRegisterFactory extends AgentBaseFactory {
private void registerHookSet() {
setPostHookMethods();
setPreHookMethods();
+ setInitMethods();
}
- private void setPreHookMethods() {
- Set methods = reflections.getMethodsAnnotatedWith(After.class);
+ private void setInitMethods() {
+ Set methods = reflections.getMethodsAnnotatedWith(Init.class);
for (Method method : methods) {
MetaMethod metaMethod = new MetaMethod();
metaMethod.setMethod(method);
- metaMethod.setOrder(method.getAnnotation(After.class).order());
+ metaMethod.setOrder(method.getAnnotation(Init.class).order());
+
+ addMetaMethod(method, metaMethod, initHookMethods);
+ }
+ }
+
+ private void setPreHookMethods() {
+ Set methods = reflections.getMethodsAnnotatedWith(AfterExecute.class);
+ for (Method method : methods) {
+ MetaMethod metaMethod = new MetaMethod();
+ metaMethod.setMethod(method);
+ metaMethod.setOrder(method.getAnnotation(AfterExecute.class).order());
addMetaMethod(method, metaMethod, postHookMethods);
}
}
private void setPostHookMethods() {
- Set methods = reflections.getMethodsAnnotatedWith(Before.class);
+ Set methods = reflections.getMethodsAnnotatedWith(BeforeExecute.class);
for (Method method : methods) {
MetaMethod metaMethod = new MetaMethod();
metaMethod.setMethod(method);
- metaMethod.setOrder(method.getAnnotation(Before.class).order());
+ metaMethod.setOrder(method.getAnnotation(BeforeExecute.class).order());
addMetaMethod(method, metaMethod, preHookMethods);
}
@@ -69,7 +84,7 @@ public class ModuleRegisterFactory extends AgentBaseFactory {
Class> clazz = method.getDeclaringClass();
if (preHookMethods.containsKey(clazz)) {
preHookMethods.get(clazz).add(metaMethod);
- }else {
+ } else {
HashSet metaMethods = new HashSet<>();
metaMethods.add(metaMethod);
preHookMethods.put(clazz, metaMethods);
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/After.java b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/AfterExecute.java
similarity index 94%
rename from Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/After.java
rename to Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/AfterExecute.java
index 0a0195b3..2ee78d7e 100644
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/After.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/AfterExecute.java
@@ -15,6 +15,6 @@ import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
-public @interface After {
+public @interface AfterExecute {
int order() default 0;
}
\ No newline at end of file
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/Before.java b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/BeforeExecute.java
similarity index 94%
rename from Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/Before.java
rename to Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/BeforeExecute.java
index c10079a9..54102223 100644
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/Before.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/BeforeExecute.java
@@ -13,6 +13,6 @@ import java.lang.annotation.Target;
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
-public @interface Before {
+public @interface BeforeExecute {
int order() default 0;
}
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/Init.java b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/Init.java
new file mode 100644
index 00000000..8ecee244
--- /dev/null
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/Init.java
@@ -0,0 +1,12 @@
+package work.slhaf.partner.api.factory.module.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface Init {
+ int order() default 0;
+}
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/flow/AgentInteraction.java b/Partner-Api/src/main/java/work/slhaf/partner/api/flow/AgentInteraction.java
index 016f023e..8e190be1 100644
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/flow/AgentInteraction.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/flow/AgentInteraction.java
@@ -1,6 +1,9 @@
package work.slhaf.partner.api.flow;
-import work.slhaf.partner.api.entity.AgentContext;
+import work.slhaf.partner.api.factory.module.pojo.MetaModule;
+import work.slhaf.partner.api.flow.entity.InteractionFlowContext;
+
+import java.util.List;
/**
* Agent执行流程
@@ -9,7 +12,7 @@ public class AgentInteraction {
private AgentInteraction(){}
- public static void launch(AgentContext context){
+ public static void launch(List moduleList, InteractionFlowContext interactionContext){
//流程执行启动,需考虑模块热插拔,可结合http调整模块启用情况,并序列化至本地或数据库中
}
}
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/flow/abstracts/ActivateModel.java b/Partner-Api/src/main/java/work/slhaf/partner/api/flow/abstracts/ActivateModel.java
index abf04980..dfd805ee 100644
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/flow/abstracts/ActivateModel.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/flow/abstracts/ActivateModel.java
@@ -7,14 +7,14 @@ import work.slhaf.partner.api.common.chat.pojo.ChatResponse;
import work.slhaf.partner.api.common.chat.pojo.Message;
import work.slhaf.partner.api.factory.config.ModelConfigManager;
import work.slhaf.partner.api.factory.config.pojo.ModelConfig;
-import work.slhaf.partner.api.factory.module.annotation.Before;
+import work.slhaf.partner.api.factory.module.annotation.BeforeExecute;
import java.util.ArrayList;
import java.util.List;
public interface ActivateModel {
- @Before
+ @BeforeExecute
default void modelSettings() {
Model model = new Model();
ModelConfig modelConfig = ModelConfigManager.INSTANCE.loadModelConfig(modelKey());
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/flow/entity/InteractionFlowContext.java b/Partner-Api/src/main/java/work/slhaf/partner/api/flow/entity/InteractionFlowContext.java
index 950c1890..5e10cba4 100644
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/flow/entity/InteractionFlowContext.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/flow/entity/InteractionFlowContext.java
@@ -6,5 +6,6 @@ import lombok.Data;
* 流程上下文
*/
@Data
-public class InteractionFlowContext {
+public abstract class InteractionFlowContext {
+
}
diff --git a/Partner-Api/src/test/java/TestApplication.java b/Partner-Api/src/test/java/TestApplication.java
new file mode 100644
index 00000000..efd75139
--- /dev/null
+++ b/Partner-Api/src/test/java/TestApplication.java
@@ -0,0 +1,7 @@
+import work.slhaf.partner.api.Agent;
+
+public class TestApplication {
+ public static void main(String[] args) {
+ Agent.newAgent(TestApplication.class,null).run();
+ }
+}
diff --git a/Partner-Api/src/test/java/module/ModuleProxyTest.java b/Partner-Api/src/test/java/module/ModuleProxyTest.java
new file mode 100644
index 00000000..2dc3a0fd
--- /dev/null
+++ b/Partner-Api/src/test/java/module/ModuleProxyTest.java
@@ -0,0 +1,24 @@
+package module;
+
+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.flow.abstracts.AgentInteractionModule;
+
+import java.lang.reflect.InvocationTargetException;
+
+public class ModuleProxyTest {
+ @Test
+ public void test() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
+ Class extends AgentInteractionModule> clazz = new ByteBuddy().subclass(MyAgentInteractionModule.class)
+ .method(ElementMatchers.isOverriddenFrom(AgentInteractionModule.class))
+ .intercept(MethodDelegation.to(
+ new MyModuleProxyInterceptor()
+ ))
+ .make()
+ .load(ModuleProxyTest.class.getClassLoader())
+ .getLoaded();
+ clazz.getConstructor().newInstance().execute(null);
+ }
+}
diff --git a/Partner-Api/src/test/java/module/MyAgentInteractionModule.java b/Partner-Api/src/test/java/module/MyAgentInteractionModule.java
new file mode 100644
index 00000000..f911fce5
--- /dev/null
+++ b/Partner-Api/src/test/java/module/MyAgentInteractionModule.java
@@ -0,0 +1,11 @@
+package module;
+
+import work.slhaf.partner.api.flow.abstracts.AgentInteractionModule;
+import work.slhaf.partner.api.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/MyModuleProxyInterceptor.java b/Partner-Api/src/test/java/module/MyModuleProxyInterceptor.java
new file mode 100644
index 00000000..72405548
--- /dev/null
+++ b/Partner-Api/src/test/java/module/MyModuleProxyInterceptor.java
@@ -0,0 +1,18 @@
+package module;
+
+import net.bytebuddy.implementation.bind.annotation.*;
+
+import java.lang.reflect.Method;
+import java.util.concurrent.Callable;
+
+public class MyModuleProxyInterceptor {
+ public MyModuleProxyInterceptor() {}
+
+ @RuntimeType
+ public Object intercept(@Origin Method method, @AllArguments Object[] allArguments, @SuperCall Callable> zuper, @This Object proxy) throws Exception {
+ System.out.println("22222");
+ Object res = zuper.call();
+ System.out.println("11111");
+ return res;
+ }
+}