mirror of
https://github.com/slhaf/Partner.git
synced 2026-05-12 16:53:04 +08:00
完善了框架层的完整执行流程,待进行demo测试并适配进Partner本体。
- 调整 runtime 目录结构, flow/ 归为 interaction/ 的子包 - 新增了 AgentGateway 以及 Gateway 对应的 Adapter 抽象类,下游必须实现这两者才能启动项目 - 调整 MetaModule 中的某些字段类别, 锁定为 AgentRunningModule 相关子类, 便于在执行流中执行模块 - 修复了 ModuleCheckFactory 中对于 @AgentModule 的错误检验逻辑 - 更新 Agent 启动器为step builder模式进行逐步构建,强制实现 AgentGateway 相关内容, 其余带有默认实现的部分也可自定义实现,只需实现对应的类或接口
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -50,3 +50,4 @@ build/
|
||||
/Partner-Core/src/main/java/src/main/resources/prompt/module/memory/topic_extractor.json.bak
|
||||
/backup/
|
||||
/Partner-Main/src/test/java/text/test.json
|
||||
/CLAUDE.md
|
||||
|
||||
@@ -1,77 +1,114 @@
|
||||
package work.slhaf.partner.api.agent;
|
||||
|
||||
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.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 work.slhaf.partner.api.agent.runtime.interaction.AgentGateway;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
/**
|
||||
* Agent启动类
|
||||
*/
|
||||
public class Agent {
|
||||
public final class Agent {
|
||||
|
||||
private final List<Runnable> runners = new ArrayList<>();
|
||||
private final Class<?> applicationClass;
|
||||
private final RunningFlowContext interactionContext;
|
||||
|
||||
private Agent(Class<?> clazz, RunningFlowContext interactionContext) {
|
||||
this.applicationClass = clazz;
|
||||
this.interactionContext = interactionContext;
|
||||
}
|
||||
|
||||
public static Agent newAgent(Class<?> clazz, RunningFlowContext interactionContext) {
|
||||
if (clazz == null || interactionContext == null) {
|
||||
public static AgentGatewayStep newAgent(Class<?> clazz) {
|
||||
if (clazz == null) {
|
||||
throw new AgentLaunchFailedException("Agent class 和 interaction flow context 不能为 null");
|
||||
}
|
||||
return new Agent(clazz, interactionContext);
|
||||
return new AgentApp(clazz);
|
||||
}
|
||||
|
||||
public void run() {
|
||||
List<MetaModule> moduleList = AgentRegisterFactory.launch(applicationClass.getPackage().getName());
|
||||
AgentRunningFlow.launch(moduleList, interactionContext);
|
||||
launchRunners();
|
||||
public interface AgentGatewayStep {
|
||||
AgentStep setGateway(AgentGateway gateway);
|
||||
}
|
||||
|
||||
public interface AgentStep {
|
||||
AgentStep addBeforeLaunchRunners(Runnable... runners);
|
||||
|
||||
AgentStep addAfterLaunchRunners(Runnable... runners);
|
||||
|
||||
AgentStep setAgentConfigManager(AgentConfigManager agentConfigManager);
|
||||
|
||||
AgentStep setAgentExceptionCallback(AgentExceptionCallback agentExceptionCallback);
|
||||
|
||||
AgentStep addScanPackage(String packageName);
|
||||
|
||||
AgentStep addScanDir(String externalPackagePath);
|
||||
|
||||
void launch();
|
||||
}
|
||||
|
||||
|
||||
private void launchRunners() {
|
||||
ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor();
|
||||
for (Runnable runner : runners) {
|
||||
executorService.execute(runner);
|
||||
public static class AgentApp implements AgentStep, AgentGatewayStep {
|
||||
|
||||
private final ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor();
|
||||
private final List<Runnable> beforeLaunchRunners = new ArrayList<>();
|
||||
private final List<Runnable> afterLaunchRunners = new ArrayList<>();
|
||||
private AgentGateway gateway;
|
||||
private final Class<?> applicationClass;
|
||||
|
||||
private AgentApp(Class<?> clazz) {
|
||||
this.applicationClass = clazz;
|
||||
}
|
||||
}
|
||||
|
||||
public Agent addRunners(Runnable... runnable) {
|
||||
runners.addAll(List.of(runnable));
|
||||
return this;
|
||||
}
|
||||
@Override
|
||||
public AgentStep setGateway(AgentGateway gateway) {
|
||||
this.gateway = gateway;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Agent setAgentConfigManager(AgentConfigManager agentConfigManager) {
|
||||
AgentConfigManager.setINSTANCE(agentConfigManager);
|
||||
return this;
|
||||
}
|
||||
@Override
|
||||
public AgentStep addBeforeLaunchRunners(Runnable... runners) {
|
||||
this.beforeLaunchRunners.addAll(List.of(runners));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Agent setAgentExceptionCallback(AgentExceptionCallback agentExceptionCallback){
|
||||
GlobalExceptionHandler.setExceptionCallback(agentExceptionCallback);
|
||||
return this;
|
||||
}
|
||||
@Override
|
||||
public AgentStep addAfterLaunchRunners(Runnable... runners) {
|
||||
this.afterLaunchRunners.addAll(List.of(runners));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Agent addScanPackage(String packageName) {
|
||||
AgentRegisterFactory.addScanPackage(packageName);
|
||||
return this;
|
||||
}
|
||||
@Override
|
||||
public AgentStep setAgentConfigManager(AgentConfigManager agentConfigManager) {
|
||||
AgentConfigManager.setINSTANCE(agentConfigManager);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Agent addScanDir(String externalPackagePath) {
|
||||
AgentRegisterFactory.addScanDir(externalPackagePath);
|
||||
return this;
|
||||
@Override
|
||||
public AgentStep setAgentExceptionCallback(AgentExceptionCallback agentExceptionCallback) {
|
||||
GlobalExceptionHandler.setExceptionCallback(agentExceptionCallback);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AgentStep addScanPackage(String packageName) {
|
||||
AgentRegisterFactory.addScanPackage(packageName);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AgentStep addScanDir(String externalPackagePath) {
|
||||
AgentRegisterFactory.addScanDir(externalPackagePath);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void launch() {
|
||||
launchRunners(beforeLaunchRunners);
|
||||
AgentRegisterFactory.launch(applicationClass.getPackageName());
|
||||
executorService.execute(() -> gateway.launch());
|
||||
launchRunners(afterLaunchRunners);
|
||||
}
|
||||
|
||||
private void launchRunners(List<Runnable> runners) {
|
||||
for (Runnable runner : runners) {
|
||||
executorService.execute(runner);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package work.slhaf.partner.api.agent.factory;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import org.reflections.util.ClasspathHelper;
|
||||
import work.slhaf.partner.api.agent.factory.capability.CapabilityCheckFactory;
|
||||
import work.slhaf.partner.api.agent.factory.capability.CapabilityInjectFactory;
|
||||
@@ -13,6 +14,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.data.AgentContext;
|
||||
import work.slhaf.partner.api.agent.runtime.config.AgentConfigManager;
|
||||
|
||||
import java.io.File;
|
||||
@@ -27,7 +29,7 @@ public class AgentRegisterFactory {
|
||||
private AgentRegisterFactory() {
|
||||
}
|
||||
|
||||
public static List<MetaModule> launch(String packageName) {
|
||||
public static void launch(String packageName) {
|
||||
urls.addAll(packageNameToURL(packageName));
|
||||
AgentRegisterContext registerContext = new AgentRegisterContext(urls);
|
||||
//流程
|
||||
@@ -47,7 +49,9 @@ public class AgentRegisterFactory {
|
||||
new ModuleInitHookExecuteFactory().execute(registerContext);
|
||||
|
||||
List<MetaModule> moduleList = registerContext.getModuleFactoryContext().getModuleList();
|
||||
return AgentConfigManager.INSTANCE.moduleEnabledStatusFilter(moduleList);
|
||||
AgentConfigManager.INSTANCE.moduleEnabledStatusFilterAndRecord(moduleList);
|
||||
|
||||
BeanUtil.copyProperties(registerContext, AgentContext.INSTANCE);
|
||||
}
|
||||
|
||||
|
||||
@@ -89,5 +93,4 @@ public class AgentRegisterFactory {
|
||||
return ClasspathHelper.forPackage(packageName).stream().toList();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package work.slhaf.partner.api.agent.factory.config;
|
||||
|
||||
import lombok.Setter;
|
||||
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;
|
||||
|
||||
@@ -9,10 +9,10 @@ import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule;
|
||||
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.AgentRunningModule;
|
||||
import work.slhaf.partner.api.agent.flow.abstracts.AgentRunningSubModule;
|
||||
import work.slhaf.partner.api.agent.runtime.config.AgentConfigManager;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.ActivateModel;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningModule;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningSubModule;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.HashSet;
|
||||
@@ -134,7 +134,7 @@ public class ModuleCheckFactory extends AgentBaseFactory {
|
||||
if (type.isAnnotation()) {
|
||||
continue;
|
||||
}
|
||||
if (type.isAssignableFrom(AgentRunningModule.class)) {
|
||||
if (AgentRunningModule.class.isAssignableFrom(type) && ClassUtil.isNormalClass(type)) {
|
||||
continue;
|
||||
}
|
||||
throw new ModuleCheckException("存在未继承AgentInteractionModule.class的AgentModule实现: " + type.getSimpleName());
|
||||
|
||||
@@ -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.AgentRunningModule;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningModule;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.Arrays;
|
||||
|
||||
@@ -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.AgentRunningModule;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningModule;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
@@ -57,8 +57,8 @@ public class ModuleProxyFactory extends AgentBaseFactory {
|
||||
|
||||
private void generateProxiedInstances(MethodsListRecord record, MetaModule metaModule) {
|
||||
try {
|
||||
Class<?> clazz = metaModule.getClazz();
|
||||
Class<?> proxyClass = new ByteBuddy()
|
||||
Class<? extends AgentRunningModule> clazz = metaModule.getClazz();
|
||||
Class<? extends AgentRunningModule> proxyClass = new ByteBuddy()
|
||||
.subclass(clazz)
|
||||
.method(ElementMatchers.isOverriddenFrom(AgentRunningModule.class))
|
||||
.intercept(MethodDelegation.to(new ModuleProxyInterceptor(record.post, record.pre)))
|
||||
@@ -137,8 +137,8 @@ public class ModuleProxyFactory extends AgentBaseFactory {
|
||||
private void generateInstances() {
|
||||
for (MetaModule metaModule : moduleList) {
|
||||
try {
|
||||
Class<?> clazz = metaModule.getClazz();
|
||||
Object instance = clazz.getConstructor().newInstance();
|
||||
Class<? extends AgentRunningModule> clazz = metaModule.getClazz();
|
||||
AgentRunningModule instance = clazz.getConstructor().newInstance();
|
||||
metaModule.setInstance(instance);
|
||||
} catch (Exception e) {
|
||||
throw new ModuleInstanceGenerateFailedException("模块实例构造失败:" + e.getMessage());
|
||||
@@ -148,17 +148,17 @@ public class ModuleProxyFactory extends AgentBaseFactory {
|
||||
|
||||
private record ModuleProxyInterceptor(List<MetaMethod> postHookMethods, List<MetaMethod> 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);
|
||||
}
|
||||
return res;
|
||||
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);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
record MethodsListRecord(List<MetaMethod> post, List<MetaMethod> pre) {
|
||||
public MethodsListRecord {
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
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.context.AgentRegisterContext;
|
||||
import work.slhaf.partner.api.agent.factory.context.ModuleFactoryContext;
|
||||
import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule;
|
||||
import work.slhaf.partner.api.agent.factory.module.pojo.MetaModule;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningModule;
|
||||
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
@@ -35,14 +37,17 @@ public class ModuleRegisterFactory extends AgentBaseFactory {
|
||||
//反射扫描获取@AgentModule所在类, 该部分为Agent流程执行模块
|
||||
Set<Class<?>> modules = reflections.getTypesAnnotatedWith(AgentModule.class);
|
||||
for (Class<?> module : modules) {
|
||||
AgentModule agentModule = module.getAnnotation(AgentModule.class);
|
||||
if (!ClassUtil.isNormalClass(module)) {
|
||||
continue;
|
||||
}
|
||||
Class<? extends AgentRunningModule> clazz = module.asSubclass(AgentRunningModule.class);
|
||||
AgentModule agentModule = clazz.getAnnotation(AgentModule.class);
|
||||
MetaModule metaModule = new MetaModule();
|
||||
metaModule.setName(agentModule.name());
|
||||
metaModule.setOrder(agentModule.order());
|
||||
metaModule.setClazz(module);
|
||||
metaModule.setClazz(clazz);
|
||||
moduleList.add(metaModule);
|
||||
}
|
||||
moduleList.sort(Comparator.comparing(MetaModule::getOrder));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
package work.slhaf.partner.api.agent.factory.module.pojo;
|
||||
|
||||
import lombok.Data;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningModule;
|
||||
|
||||
@Data
|
||||
public class MetaModule {
|
||||
private String name;
|
||||
private int order;
|
||||
private Class<?> clazz;
|
||||
private Object instance;
|
||||
private Class<? extends AgentRunningModule> clazz;
|
||||
private AgentRunningModule instance;
|
||||
private boolean enabled = true;
|
||||
}
|
||||
|
||||
@@ -1,23 +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.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<MetaModule> moduleList, RunningFlowContext interactionContext){
|
||||
try {
|
||||
//流程执行启动,需考虑模块热插拔,可结合http调整模块启用情况,并序列化至本地或数据库中
|
||||
}catch (Exception e){
|
||||
GlobalExceptionHandler.INSTANCE.handle(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
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);
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package work.slhaf.partner.api.agent.runtime.config;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Data;
|
||||
import lombok.Setter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import work.slhaf.partner.api.agent.factory.config.exception.ConfigNotExistException;
|
||||
@@ -16,21 +16,16 @@ import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@Slf4j
|
||||
@Data
|
||||
public abstract class AgentConfigManager {
|
||||
|
||||
@Setter
|
||||
public static AgentConfigManager INSTANCE;
|
||||
private static final String DEFAULT_KEY = "default";
|
||||
|
||||
@Getter
|
||||
protected HashMap<String, ModelConfig> modelConfigMap;
|
||||
@Getter
|
||||
protected HashMap<String, List<Message>> modelPromptMap;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
protected HashMap<String, Boolean> moduleEnabledStatus;
|
||||
|
||||
protected List<MetaModule> moduleList;
|
||||
|
||||
public void load() {
|
||||
@@ -48,7 +43,7 @@ public abstract class AgentConfigManager {
|
||||
|
||||
protected abstract HashMap<String, Boolean> loadModuleEnabledStatusMap();
|
||||
|
||||
public List<MetaModule> moduleEnabledStatusFilter(List<MetaModule> moduleList) {
|
||||
public void moduleEnabledStatusFilterAndRecord(List<MetaModule> moduleList) {
|
||||
this.moduleList = moduleList;
|
||||
this.moduleEnabledStatus = loadModuleEnabledStatusMap();
|
||||
|
||||
@@ -65,7 +60,6 @@ public abstract class AgentConfigManager {
|
||||
if (unmatch) {
|
||||
dumpModuleEnabledStatus();
|
||||
}
|
||||
return moduleList;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package work.slhaf.partner.api.agent.runtime;
|
||||
package work.slhaf.partner.api.agent.runtime.data;
|
||||
|
||||
import lombok.Data;
|
||||
import work.slhaf.partner.api.agent.factory.module.pojo.MetaModule;
|
||||
@@ -10,6 +10,9 @@ import java.util.function.Function;
|
||||
|
||||
@Data
|
||||
public class AgentContext {
|
||||
|
||||
public static AgentContext INSTANCE = new AgentContext();
|
||||
|
||||
private HashMap<String, Function<Object[], Object>> methodsRouterTable;
|
||||
private HashMap<String, Function<Object[], Object>> coordinatedMethodsRouterTable;
|
||||
private HashMap<Class<?>, Object> capabilityCoreInstances;
|
||||
@@ -0,0 +1,12 @@
|
||||
package work.slhaf.partner.api.agent.runtime.interaction;
|
||||
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.data.AgentInputData;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.data.AgentOutputData;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext;
|
||||
|
||||
public interface AgentGateway {
|
||||
|
||||
void launch();
|
||||
|
||||
<I extends AgentInputData, O extends AgentOutputData, C extends RunningFlowContext> AgentInteractionAdapter<I, O, C> adapter();
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package work.slhaf.partner.api.agent.runtime.interaction;
|
||||
|
||||
import work.slhaf.partner.api.agent.factory.module.pojo.MetaModule;
|
||||
import work.slhaf.partner.api.agent.runtime.config.AgentConfigManager;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.data.AgentInputData;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.data.AgentOutputData;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.AgentRunningFlow;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public abstract class AgentInteractionAdapter<I extends AgentInputData, O extends AgentOutputData, C extends RunningFlowContext> {
|
||||
|
||||
private static AgentInteractionAdapter<?,?,?> INSTANCE;
|
||||
|
||||
protected AgentRunningFlow<C> agentRunningFlow = new AgentRunningFlow<>();
|
||||
protected List<MetaModule> moduleList = AgentConfigManager.INSTANCE.getModuleList();
|
||||
|
||||
public void receive(I inputData) {
|
||||
C finalInputData = parseInputData(inputData);
|
||||
C outputContext = agentRunningFlow.launch(moduleList, finalInputData);
|
||||
O outputData = parseOutputData(outputContext);
|
||||
send(outputData);
|
||||
}
|
||||
|
||||
protected abstract O parseOutputData(C outputContext);
|
||||
|
||||
protected abstract C parseInputData(I inputData);
|
||||
|
||||
public abstract void send(O outputData);
|
||||
|
||||
public static <I extends AgentInputData, O extends AgentOutputData, C extends RunningFlowContext> AgentInteractionAdapter<I, O, C> getInstance() {
|
||||
@SuppressWarnings("unchecked")
|
||||
AgentInteractionAdapter<I, O, C> instance = (AgentInteractionAdapter<I, O, C>) INSTANCE;
|
||||
return instance;
|
||||
}
|
||||
|
||||
public static <I extends AgentInputData, O extends AgentOutputData, C extends RunningFlowContext> void setInstance(AgentInteractionAdapter<I, O, C> instance) {
|
||||
INSTANCE = instance;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package work.slhaf.partner.api.agent.runtime.interaction.data;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public abstract class AgentInputData extends InteractionData{
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package work.slhaf.partner.api.agent.runtime.interaction.data;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public abstract class AgentOutputData extends InteractionData{
|
||||
|
||||
private int code;
|
||||
|
||||
public static class StatusCode {
|
||||
public static final int SUCCESS = 1;
|
||||
public static final int FAILED = 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package work.slhaf.partner.api.agent.runtime.interaction.data;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public abstract class InteractionData {
|
||||
protected String userInfo;
|
||||
protected String content;
|
||||
protected LocalDateTime dateTime;
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package work.slhaf.partner.api.agent.runtime.interaction.flow;
|
||||
|
||||
import work.slhaf.partner.api.agent.factory.module.pojo.MetaModule;
|
||||
import work.slhaf.partner.api.agent.runtime.exception.GlobalExceptionHandler;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Agent执行流程
|
||||
*/
|
||||
public class AgentRunningFlow<C extends RunningFlowContext> {
|
||||
|
||||
public C launch(List<MetaModule> moduleList, C interactionContext){
|
||||
try {
|
||||
//流程执行启动
|
||||
for (MetaModule metaModule : moduleList) {
|
||||
metaModule.getInstance().execute(interactionContext);
|
||||
}
|
||||
}catch (Exception e){
|
||||
GlobalExceptionHandler.INSTANCE.handle(e);
|
||||
}
|
||||
return interactionContext;
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,10 @@
|
||||
package work.slhaf.partner.api.agent.flow.abstracts;
|
||||
package work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts;
|
||||
|
||||
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.agent.runtime.interaction.flow.entity.Model;
|
||||
import work.slhaf.partner.api.chat.ChatClient;
|
||||
import work.slhaf.partner.api.chat.constant.ChatConstant;
|
||||
import work.slhaf.partner.api.chat.pojo.ChatResponse;
|
||||
@@ -0,0 +1,10 @@
|
||||
package work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts;
|
||||
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext;
|
||||
|
||||
/**
|
||||
* 流程执行模块基类
|
||||
*/
|
||||
public abstract class AgentRunningModule extends Module {
|
||||
public abstract void execute(RunningFlowContext context);
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package work.slhaf.partner.api.agent.flow.abstracts;
|
||||
package work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts;
|
||||
|
||||
|
||||
/**
|
||||
@@ -1,9 +1,9 @@
|
||||
package work.slhaf.partner.api.agent.flow.abstracts;
|
||||
package work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityHolder;
|
||||
import work.slhaf.partner.api.agent.flow.entity.Model;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.Model;
|
||||
|
||||
/**
|
||||
* 模块基类
|
||||
@@ -1,4 +1,4 @@
|
||||
package work.slhaf.partner.api.agent.flow.entity;
|
||||
package work.slhaf.partner.api.agent.runtime.interaction.flow.entity;
|
||||
|
||||
import lombok.Data;
|
||||
import work.slhaf.partner.api.chat.ChatClient;
|
||||
@@ -1,4 +1,4 @@
|
||||
package work.slhaf.partner.api.agent.flow.entity;
|
||||
package work.slhaf.partner.api.agent.runtime.interaction.flow.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@@ -4,7 +4,7 @@ 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.AgentRunningModule;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningModule;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package module;
|
||||
|
||||
import work.slhaf.partner.api.agent.flow.abstracts.AgentRunningModule;
|
||||
import work.slhaf.partner.api.agent.flow.entity.RunningFlowContext;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningModule;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext;
|
||||
|
||||
public class MyAgentRunningModule extends AgentRunningModule {
|
||||
@Override
|
||||
|
||||
@@ -5,7 +5,7 @@ import lombok.Data;
|
||||
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.runtime.interaction.flow.abstracts.ActivateModel;
|
||||
import work.slhaf.partner.api.chat.constant.ChatConstant;
|
||||
import work.slhaf.partner.api.chat.pojo.ChatResponse;
|
||||
import work.slhaf.partner.api.chat.pojo.Message;
|
||||
|
||||
@@ -6,8 +6,8 @@ import com.alibaba.fastjson2.JSONObject;
|
||||
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.AgentRunningSubModule;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.ActivateModel;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.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;
|
||||
|
||||
@@ -6,8 +6,8 @@ import lombok.Data;
|
||||
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.AgentRunningSubModule;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.ActivateModel;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.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;
|
||||
|
||||
@@ -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.AgentRunningSubModule;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.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;
|
||||
|
||||
@@ -5,8 +5,8 @@ import com.alibaba.fastjson2.JSONObject;
|
||||
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.AgentRunningSubModule;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.ActivateModel;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.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;
|
||||
|
||||
@@ -4,8 +4,8 @@ import com.alibaba.fastjson2.JSONObject;
|
||||
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.AgentRunningSubModule;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.ActivateModel;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.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;
|
||||
|
||||
@@ -5,8 +5,8 @@ import com.alibaba.fastjson2.JSONObject;
|
||||
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.AgentRunningSubModule;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.ActivateModel;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningSubModule;
|
||||
import work.slhaf.partner.api.chat.pojo.ChatResponse;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
@@ -3,8 +3,8 @@ package work.slhaf.partner.module.modules.perceive.updater.relation_extractor;
|
||||
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.AgentRunningSubModule;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.ActivateModel;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.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;
|
||||
|
||||
@@ -5,8 +5,8 @@ import com.alibaba.fastjson2.JSONObject;
|
||||
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.AgentRunningSubModule;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.ActivateModel;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.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;
|
||||
|
||||
@@ -1,12 +1,25 @@
|
||||
package work.slhaf.demo;
|
||||
|
||||
|
||||
import work.slhaf.demo.flow.AgentDemoFlowContext;
|
||||
import work.slhaf.partner.api.agent.Agent;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.AgentGateway;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.AgentInteractionAdapter;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.data.AgentInputData;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.data.AgentOutputData;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext;
|
||||
|
||||
public class AgentDemoApplication {
|
||||
public static void main(String[] args) {
|
||||
Agent.newAgent(AgentDemoApplication.class, new AgentDemoFlowContext())
|
||||
.run();
|
||||
Agent.newAgent(AgentDemoApplication.class).setGateway(new AgentGateway() {
|
||||
@Override
|
||||
public void launch() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public <I extends AgentInputData, O extends AgentOutputData, C extends RunningFlowContext> AgentInteractionAdapter<I, O, C> adapter() {
|
||||
return null;
|
||||
}
|
||||
}).launch();
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package work.slhaf.demo.flow;
|
||||
|
||||
import work.slhaf.partner.api.agent.flow.entity.RunningFlowContext;
|
||||
import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext;
|
||||
|
||||
public class AgentDemoFlowContext extends RunningFlowContext {
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user