进行 Partner 本体对于框架的适配,以及框架层的部分调整

框架:

- 调整 ActivateModel 中模型初始化设置的 initHook 权重为-1(最优先)
- 为 AgentGateway 中 receive 操作提供模板方法,子类需实现发送逻辑并提供适配器
- 取消了 AgentInteractionAdapter 的单例配置
- 调整 RunningFlow 的异常处理,并在RunningFlowContext中提供错误码进行判断
- 调整模块基类
-

本体:
- 新增配置加载异常,继承自Agent启动异常
- 修改 GlobalExceptionData 获取逻辑
- 移除 MessageSender 等交互接口,适配框架的交互逻辑
- 异常处理已适配
- 配置加载逻辑已适配
- Gateway 已适配
- CoreModel 已适配
This commit is contained in:
2025-09-09 20:42:28 +08:00
parent 10fb689c83
commit 47684c78e0
94 changed files with 591 additions and 869 deletions

11
.idea/misc.xml generated
View File

@@ -1,13 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="EntryPointsManager"> <component name="EntryPointsManager">
<list size="6"> <list size="9">
<item index="0" class="java.lang.String" itemvalue="work.slhaf.partner.api.agent.factory.capability.annotation.Capability" /> <item index="0" class="java.lang.String" itemvalue="work.slhaf.partner.api.agent.factory.capability.annotation.Capability" />
<item index="1" class="java.lang.String" itemvalue="work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityCore" /> <item index="1" class="java.lang.String" itemvalue="work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityCore" />
<item index="2" class="java.lang.String" itemvalue="work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityMethod" /> <item index="2" class="java.lang.String" itemvalue="work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityMethod" />
<item index="3" class="java.lang.String" itemvalue="work.slhaf.partner.api.capability.annotation.CapabilityMethod" /> <item index="3" class="java.lang.String" itemvalue="work.slhaf.partner.api.agent.factory.capability.annotation.CoordinateManager" />
<item index="4" class="java.lang.String" itemvalue="work.slhaf.partner.api.capability.annotation.CoordinateManager" /> <item index="4" class="java.lang.String" itemvalue="work.slhaf.partner.api.agent.factory.capability.annotation.Coordinated" />
<item index="5" class="java.lang.String" itemvalue="work.slhaf.partner.api.register.capability.annotation.Capability" /> <item index="5" class="java.lang.String" itemvalue="work.slhaf.partner.api.agent.factory.module.annotation.Init" />
<item index="6" class="java.lang.String" itemvalue="work.slhaf.partner.api.capability.annotation.CapabilityMethod" />
<item index="7" class="java.lang.String" itemvalue="work.slhaf.partner.api.capability.annotation.CoordinateManager" />
<item index="8" class="java.lang.String" itemvalue="work.slhaf.partner.api.register.capability.annotation.Capability" />
</list> </list>
</component> </component>
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />

View File

@@ -5,7 +5,7 @@ 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.factory.context.ConfigFactoryContext; import work.slhaf.partner.api.agent.factory.context.ConfigFactoryContext;
import work.slhaf.partner.api.agent.runtime.config.AgentConfigManager; import work.slhaf.partner.api.agent.runtime.config.AgentConfigManager;
import work.slhaf.partner.api.agent.runtime.config.DefaultAgentConfigManager; import work.slhaf.partner.api.agent.runtime.config.FileAgentConfigManager;
import work.slhaf.partner.api.chat.pojo.Message; import work.slhaf.partner.api.chat.pojo.Message;
import java.util.HashMap; import java.util.HashMap;
@@ -24,7 +24,7 @@ public class ConfigLoaderFactory extends AgentBaseFactory {
modelPromptMap = factoryContext.getModelPromptMap(); modelPromptMap = factoryContext.getModelPromptMap();
if (AgentConfigManager.INSTANCE == null){ if (AgentConfigManager.INSTANCE == null){
AgentConfigManager.setINSTANCE(new DefaultAgentConfigManager()); AgentConfigManager.setINSTANCE(new FileAgentConfigManager());
} }
agentConfigManager = AgentConfigManager.INSTANCE; agentConfigManager = AgentConfigManager.INSTANCE;

View File

@@ -22,12 +22,12 @@ import java.util.List;
* 将从当前运行目录的config文件夹下创建并读取配置 * 将从当前运行目录的config文件夹下创建并读取配置
*/ */
@Slf4j @Slf4j
public class DefaultAgentConfigManager extends AgentConfigManager { public class FileAgentConfigManager extends AgentConfigManager {
private static final String CONFIG_DIR = "./config/"; protected static final String CONFIG_DIR = "./config/";
private static final String MODEL_CONFIG_DIR = "./config/model/"; protected static final String MODEL_CONFIG_DIR = "./config/model/";
private static final String PROMPT_CONFIG_DIR = "./config/prompt/"; protected static final String PROMPT_CONFIG_DIR = "./config/prompt/";
private static final String MODULE_ENABLED_STATUS_CONFIG_FILE = CONFIG_DIR + "module_enabled_status.json"; protected static final String MODULE_ENABLED_STATUS_CONFIG_FILE = CONFIG_DIR + "module_enabled_status.json";
@Override @Override

View File

@@ -4,7 +4,7 @@ public class GlobalExceptionHandler {
public static GlobalExceptionHandler INSTANCE = new GlobalExceptionHandler(); public static GlobalExceptionHandler INSTANCE = new GlobalExceptionHandler();
private AgentExceptionCallback exceptionCallback = new DefaultAgentExceptionCallback(); private AgentExceptionCallback exceptionCallback = new LogAgentExceptionCallback();
public void handle(Throwable e) { public void handle(Throwable e) {

View File

@@ -3,7 +3,7 @@ package work.slhaf.partner.api.agent.runtime.exception;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@Slf4j @Slf4j
public class DefaultAgentExceptionCallback implements AgentExceptionCallback { public class LogAgentExceptionCallback implements AgentExceptionCallback {
@Override @Override
public void onRuntimeException(AgentRuntimeException e) { public void onRuntimeException(AgentRuntimeException e) {

View File

@@ -4,9 +4,23 @@ 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.data.AgentOutputData;
import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext; import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext;
public interface AgentGateway { public interface AgentGateway <I extends AgentInputData, O extends AgentOutputData, C extends RunningFlowContext>{
void launch(); void launch();
<I extends AgentInputData, O extends AgentOutputData, C extends RunningFlowContext> AgentInteractionAdapter<I, O, C> adapter(); default void receive(I inputData){
C finalInputData = adapter().parseInputData(inputData);
C outputContext = adapter().call(finalInputData);
O outputData = adapter().parseOutputData(outputContext);
send(outputData);
}
void send(O outputData);
/**
* 通过adapter提供的receive、send方法进行与客户端的交互行为
*
* @return adapter实例
*/
AgentInteractionAdapter<I, O, C> adapter();
} }

View File

@@ -11,31 +11,15 @@ import java.util.List;
public abstract class AgentInteractionAdapter<I extends AgentInputData, O extends AgentOutputData, C extends RunningFlowContext> { public abstract class AgentInteractionAdapter<I extends AgentInputData, O extends AgentOutputData, C extends RunningFlowContext> {
private static AgentInteractionAdapter<?,?,?> INSTANCE;
protected AgentRunningFlow<C> agentRunningFlow = new AgentRunningFlow<>(); protected AgentRunningFlow<C> agentRunningFlow = new AgentRunningFlow<>();
protected List<MetaModule> moduleList = AgentConfigManager.INSTANCE.getModuleList(); protected List<MetaModule> moduleList = AgentConfigManager.INSTANCE.getModuleList();
public void receive(I inputData) { public C call(C finalInputData){
C finalInputData = parseInputData(inputData); return agentRunningFlow.launch(moduleList, finalInputData);
C outputContext = agentRunningFlow.launch(moduleList, finalInputData);
O outputData = parseOutputData(outputContext);
send(outputData);
} }
protected abstract O parseOutputData(C outputContext); protected abstract O parseOutputData(C outputContext);
protected abstract C parseInputData(I inputData); 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;
}
} }

View File

@@ -7,7 +7,7 @@ import lombok.EqualsAndHashCode;
@Data @Data
public abstract class AgentOutputData extends InteractionData{ public abstract class AgentOutputData extends InteractionData{
private int code; protected int code;
public static class StatusCode { public static class StatusCode {
public static final int SUCCESS = 1; public static final int SUCCESS = 1;

View File

@@ -17,8 +17,11 @@ public class AgentRunningFlow<C extends RunningFlowContext> {
for (MetaModule metaModule : moduleList) { for (MetaModule metaModule : moduleList) {
metaModule.getInstance().execute(interactionContext); metaModule.getInstance().execute(interactionContext);
} }
interactionContext.setOk(1);
}catch (Exception e){ }catch (Exception e){
GlobalExceptionHandler.INSTANCE.handle(e); GlobalExceptionHandler.INSTANCE.handle(e);
interactionContext.setOk(0);
interactionContext.setErrMsg(e.getMessage());
} }
return interactionContext; return interactionContext;
} }

View File

@@ -17,7 +17,7 @@ public interface ActivateModel {
AgentConfigManager AGENT_CONFIG_MANAGER = AgentConfigManager.INSTANCE; AgentConfigManager AGENT_CONFIG_MANAGER = AgentConfigManager.INSTANCE;
@Init @Init(order = -1)
default void modelSettings() { default void modelSettings() {
Model model = new Model(); Model model = new Model();
ModelConfig modelConfig = AgentConfigManager.INSTANCE.loadModelConfig(modelKey()); ModelConfig modelConfig = AgentConfigManager.INSTANCE.loadModelConfig(modelKey());

View File

@@ -2,9 +2,11 @@ package work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts;
import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext; import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext;
import java.io.IOException;
/** /**
* 流程执行模块基类 * 流程执行模块基类
*/ */
public abstract class AgentRunningModule extends Module { public abstract class AgentRunningModule<C extends RunningFlowContext> extends Module {
public abstract void execute(RunningFlowContext context); public abstract void execute(C context) throws IOException, ClassNotFoundException;
} }

View File

@@ -3,6 +3,7 @@ package work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts;
/** /**
* 流程子模块基类 * 流程子模块基类
*
* @param <I> 输入类型 * @param <I> 输入类型
* @param <O> 输出类型 * @param <O> 输出类型
*/ */

View File

@@ -1,11 +1,15 @@
package work.slhaf.partner.api.agent.runtime.interaction.flow.entity; package work.slhaf.partner.api.agent.runtime.interaction.flow.entity;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.common.entity.PersistableObject;
/** /**
* 流程上下文 * 流程上下文
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
public abstract class RunningFlowContext { public abstract class RunningFlowContext extends PersistableObject {
protected int ok;
protected String errMsg;
} }

View File

@@ -1,14 +1,16 @@
package work.slhaf; package work.slhaf;
import work.slhaf.partner.Agent; import work.slhaf.partner.api.agent.Agent;
import work.slhaf.partner.common.config.PartnerAgentConfigManager;
import java.io.IOException; import work.slhaf.partner.runtime.exception.PartnerExceptionCallback;
import java.util.Scanner; import work.slhaf.partner.runtime.interaction.WebSocketGateway;
public class Main { public class Main {
public static void main(String[] args) throws IOException { public static void main(String[] args) {
Agent.initialize(); Agent.newAgent(Main.class)
Scanner scanner = new Scanner(System.in); .setGateway(WebSocketGateway.initialize())
while (!scanner.nextLine().equals("exit")) ; .setAgentConfigManager(new PartnerAgentConfigManager())
.setAgentExceptionCallback(new PartnerExceptionCallback())
.launch();
} }
} }

View File

@@ -1,75 +0,0 @@
package work.slhaf.partner;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.common.config.Config;
import work.slhaf.partner.common.monitor.DebugMonitor;
import work.slhaf.partner.core.InteractionHub;
import work.slhaf.partner.core.interaction.agent_interface.InputReceiver;
import work.slhaf.partner.core.interaction.agent_interface.TaskCallback;
import work.slhaf.partner.core.interaction.data.InteractionInputData;
import work.slhaf.partner.core.interaction.data.InteractionOutputData;
import work.slhaf.partner.gateway.AgentWebSocketServer;
import work.slhaf.partner.gateway.MessageSender;
import java.io.IOException;
import java.time.LocalDateTime;
@Data
@Slf4j
public class Agent implements TaskCallback, InputReceiver {
private static volatile Agent agent;
private InteractionHub interactionHub;
private MessageSender messageSender;
public static void initialize() throws IOException {
if (agent == null) {
synchronized (Agent.class) {
if (agent == null) {
//加载配置
Config config = Config.getConfig();
agent = new Agent();
agent.setInteractionHub(InteractionHub.initialize());
agent.registerTaskCallback();
AgentWebSocketServer server = new AgentWebSocketServer(config.getWebSocketConfig().getPort(), agent);
server.launch();
agent.setMessageSender(server);
log.info("Agent 加载完毕..");
//启动监测线程
DebugMonitor.initialize();
}
}
}
}
public static Agent getInstance() throws IOException {
initialize();
return agent;
}
/**
* 接收用户输入,包装为标准输入数据类
*/
public void receiveInput(InteractionInputData inputData) throws IOException, ClassNotFoundException {
inputData.setLocalDateTime(LocalDateTime.now());
interactionHub.call(inputData);
}
/**
* 向用户返回输出内容
*/
public void sendToUser(String userInfo, String output) {
messageSender.sendMessage(new InteractionOutputData(output, userInfo));
}
@Override
public void onTaskFinished(String userInfo, String output) {
sendToUser(userInfo, output);
}
private void registerTaskCallback() {
interactionHub.setCallback(this);
}
}

View File

@@ -1,138 +1,9 @@
package work.slhaf.partner.common.config; package work.slhaf.partner.common.config;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSONArray;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import work.slhaf.partner.module.modules.core.CoreModel;
import work.slhaf.partner.module.modules.memory.selector.MemorySelector;
import work.slhaf.partner.module.modules.memory.updater.MemoryUpdater;
import work.slhaf.partner.module.modules.process.PostprocessExecutor;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Scanner;
@Data @Data
@Slf4j
public class Config { public class Config {
private int port;
private static final String CONFIG_FILE_PATH = "./config/config.json";
private static final String LOG_FILE_PATH = "./data/log";
private static Config config;
private String agentId; private String agentId;
// private String basicCharacter;
private WebSocketConfig webSocketConfig;
private List<ModuleConfig> moduleConfigList;
private Config() {
}
public static Config getConfig() throws IOException {
if (config == null) {
File file = new File(CONFIG_FILE_PATH);
if (file.exists()) {
config = JSONUtil.readJSONObject(file, StandardCharsets.UTF_8).toBean(Config.class);
} else {
config = new Config();
Scanner scanner = new Scanner(System.in);
System.out.print("输入智能体名称: ");
config.setAgentId(scanner.nextLine());
System.out.println("(注意! 设定角色之后修改主配置文件将不会影响现有记忆除非同时更换agentId)");
System.out.println("\r\n--------模型配置--------\r\n");
generateModelConfig(scanner);
System.out.println("\r\n--------服务配置--------\r\n");
generateWsSocketConfig(scanner);
System.out.println("\r\n--------模块链配置--------\r\n");
generatePipelineConfig();
boolean launchOrNot = getLaunchOrNot(scanner);
//保存配置文件
String str = JSONUtil.toJsonPrettyStr(config);
FileUtils.writeStringToFile(file, str, StandardCharsets.UTF_8);
log.info("配置已保存");
if (!launchOrNot) {
System.exit(0);
}
}
config.generateCommonDirs();
}
return config;
}
private void generateCommonDirs() throws IOException {
Files.createDirectories(Paths.get(LOG_FILE_PATH));
}
private static boolean getLaunchOrNot(Scanner scanner) {
System.out.print("是否直接启动Partner?(y/n): ");
String input;
while (true) {
input = scanner.nextLine();
if (input.equals("y")) {
return true;
} else if (input.equals("n")) {
return false;
} else {
System.out.println("请输入y或n");
}
}
}
private static void generatePipelineConfig() {
List<ModuleConfig> moduleConfigList = List.of(
new ModuleConfig(MemorySelector.class.getName(), ModuleConfig.Constant.INTERNAL, null),
new ModuleConfig(CoreModel.class.getName(), ModuleConfig.Constant.INTERNAL, null),
new ModuleConfig(PostprocessExecutor.class.getName(),ModuleConfig.Constant.INTERNAL,null),
new ModuleConfig(MemoryUpdater.class.getName(), ModuleConfig.Constant.INTERNAL, null)
);
config.setModuleConfigList(moduleConfigList);
}
private static void generateWsSocketConfig(Scanner scanner) {
System.out.print("WebSocket port: ");
WebSocketConfig wsConfig = new WebSocketConfig();
wsConfig.setPort(scanner.nextInt());
config.setWebSocketConfig(wsConfig);
}
private static void generateModelConfig(Scanner scanner) throws IOException {
System.out.println("配置LLM APi:");
System.out.println("经测试, 目前只建议选择Qwen3: qwen-plus-latest或qwen-max-latest");
System.out.print("base_url: ");
String baseUrl = scanner.nextLine();
System.out.print("apikey: ");
String apikey = scanner.nextLine();
System.out.print("model: ");
String model = scanner.nextLine();
ModelConfig modelConfig = new ModelConfig();
modelConfig.setBaseUrl(baseUrl);
modelConfig.setApikey(apikey);
modelConfig.setModel(model);
InputStream stream = Config.class.getClassLoader().getResourceAsStream("modules/default_activated_model.json");
String content = new String(stream.readAllBytes(), StandardCharsets.UTF_8);
stream.close();
for (String s : JSONArray.parseArray(content, String.class)) {
modelConfig.generateConfig(s);
}
}
} }

View File

@@ -1,40 +0,0 @@
package work.slhaf.partner.common.config;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
@Data
public class ModelConfig {
private static final String MODEL_CONFIG_DIR_PATH = "./config/model/";
private static final HashMap<String, ModelConfig> modelConfigMap = new HashMap<>();
private String apikey;
private String baseUrl;
private String model;
public void generateConfig(String filename) throws IOException {
String str = JSONUtil.toJsonPrettyStr(this);
File file = new File(MODEL_CONFIG_DIR_PATH + filename + ".json");
FileUtils.writeStringToFile(file, str, StandardCharsets.UTF_8);
}
public static ModelConfig load(String modelKey) {
if (!modelConfigMap.containsKey(modelKey)) {
modelConfigMap.put(modelKey,loadConfig(modelKey));
}
return modelConfigMap.get(modelKey);
}
private static ModelConfig loadConfig(String modelKey) {
File file = new File(MODEL_CONFIG_DIR_PATH+modelKey+".json");
return JSONUtil.readJSONObject(file,StandardCharsets.UTF_8).toBean(ModelConfig.class);
}
}

View File

@@ -1,17 +0,0 @@
package work.slhaf.partner.common.config;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class ModuleConfig {
private String className;
private String type;
private String path;
public static class Constant {
public static final String INTERNAL = "internal";
public static final String EXTERNAL = "external";
}
}

View File

@@ -0,0 +1,40 @@
package work.slhaf.partner.common.config;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.agent.factory.config.exception.ConfigNotExistException;
import work.slhaf.partner.api.agent.runtime.config.FileAgentConfigManager;
import work.slhaf.partner.common.exception.ConfigLoadFailedException;
import java.io.File;
import java.nio.charset.StandardCharsets;
@EqualsAndHashCode(callSuper = true)
@Data
public final class PartnerAgentConfigManager extends FileAgentConfigManager {
private static final String COMMON_CONFIG_FILE = CONFIG_DIR + "common_config.json";
private Config config;
@Override
public void load() {
loadWebSocketConfig();
super.load();
}
private void loadWebSocketConfig() {
File file = new File(COMMON_CONFIG_FILE);
if (!file.exists()) {
throw new ConfigNotExistException("Partner Config Not Exist: " + COMMON_CONFIG_FILE);
}
config = JSONUtil.readJSONObject(file, StandardCharsets.UTF_8).toBean(Config.class);
if (config == null || config.getAgentId() == null) {
throw new ConfigLoadFailedException("Partner Config Load Failed: " + COMMON_CONFIG_FILE);
}
if (config.getPort() <= 0 || config.getPort() > 65535) {
throw new ConfigLoadFailedException("Invalid Websocket port: " + config.getPort());
}
}
}

View File

@@ -1,8 +0,0 @@
package work.slhaf.partner.common.config;
import lombok.Data;
@Data
public class WebSocketConfig {
private Integer port;
}

View File

@@ -0,0 +1,13 @@
package work.slhaf.partner.common.exception;
import work.slhaf.partner.api.agent.factory.config.exception.ConfigFactoryInitFailedException;
public class ConfigLoadFailedException extends ConfigFactoryInitFailedException {
public ConfigLoadFailedException(String message, Throwable cause) {
super(message, cause);
}
public ConfigLoadFailedException(String message) {
super(message);
}
}

View File

@@ -0,0 +1,13 @@
package work.slhaf.partner.common.exception;
import work.slhaf.partner.api.agent.runtime.exception.AgentLaunchFailedException;
public class ServiceLoadFailedException extends AgentLaunchFailedException {
public ServiceLoadFailedException(String message, Throwable cause) {
super(message, cause);
}
public ServiceLoadFailedException(String message) {
super(message);
}
}

View File

@@ -1,8 +1,8 @@
package work.slhaf.partner.common.exception_handler; package work.slhaf.partner.common.exception.callback;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.common.exception_handler.pojo.GlobalException; import work.slhaf.partner.runtime.exception.pojo.GlobalException;
import work.slhaf.partner.common.exception_handler.pojo.GlobalExceptionData; import work.slhaf.partner.runtime.exception.pojo.GlobalExceptionData;
import java.io.*; import java.io.*;
import java.nio.file.Files; import java.nio.file.Files;

View File

@@ -1,30 +0,0 @@
package work.slhaf.partner.common.exception_handler.pojo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.core.cognation.cognation.CognationCore;
import work.slhaf.partner.core.interaction.data.context.InteractionContext;
import work.slhaf.partner.core.session.SessionManager;
@EqualsAndHashCode(callSuper = true)
@Slf4j
@Data
public class GlobalException extends RuntimeException {
private GlobalExceptionData data;
public GlobalException(String message) {
super(message);
try {
this.data = new GlobalExceptionData();
this.data.setExceptionTime(System.currentTimeMillis());
this.data.setSessionManager(SessionManager.getInstance());
this.data.setCognationCore(CognationCore.getInstance());
this.data.setContext(InteractionContext.getInstance());
} catch (Exception e) {
log.error("[GlobalException] 捕获异常, 获取数据失败");
}
}
}

View File

@@ -1,26 +0,0 @@
package work.slhaf.partner.common.exception_handler.pojo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.common.entity.PersistableObject;
import work.slhaf.partner.core.cognation.cognation.CognationCore;
import work.slhaf.partner.core.interaction.data.context.InteractionContext;
import work.slhaf.partner.core.session.SessionManager;
import java.io.Serial;
import java.util.HashMap;
@EqualsAndHashCode(callSuper = true)
@Data
public class GlobalExceptionData extends PersistableObject {
@Serial
private static final long serialVersionUID = 1L;
private String exceptionMessage;
protected HashMap<String, InteractionContext> context;
protected SessionManager sessionManager;
protected CognationCore cognationCore;
protected Long exceptionTime;
}

View File

@@ -1,20 +1,20 @@
package work.slhaf.partner.core.cognation; package work.slhaf.partner.core;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.api.agent.factory.capability.annotation.CoordinateManager; import work.slhaf.partner.api.agent.factory.capability.annotation.CoordinateManager;
import work.slhaf.partner.api.agent.factory.capability.annotation.Coordinated; import work.slhaf.partner.api.agent.factory.capability.annotation.Coordinated;
import work.slhaf.partner.api.chat.constant.ChatConstant; import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.common.exception_handler.GlobalExceptionHandler; import work.slhaf.partner.common.exception.callback.GlobalExceptionHandler;
import work.slhaf.partner.common.exception_handler.pojo.GlobalException; import work.slhaf.partner.runtime.exception.pojo.GlobalException;
import work.slhaf.partner.core.cognation.cognation.CognationCore; import work.slhaf.partner.core.cognation.CognationCore;
import work.slhaf.partner.core.cognation.common.pojo.MemoryResult; import work.slhaf.partner.core.common.pojo.MemoryResult;
import work.slhaf.partner.core.cognation.common.pojo.MemorySliceResult; import work.slhaf.partner.core.common.pojo.MemorySliceResult;
import work.slhaf.partner.core.cognation.submodule.cache.CacheCore; import work.slhaf.partner.core.submodule.cache.CacheCore;
import work.slhaf.partner.core.cognation.submodule.dispatch.DispatchCore; import work.slhaf.partner.core.submodule.dispatch.DispatchCore;
import work.slhaf.partner.core.cognation.submodule.memory.MemoryCore; import work.slhaf.partner.core.submodule.memory.MemoryCore;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.MemorySlice; import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice;
import work.slhaf.partner.core.cognation.submodule.perceive.PerceiveCore; import work.slhaf.partner.core.submodule.perceive.PerceiveCore;
import java.io.IOException; import java.io.IOException;
import java.io.Serial; import java.io.Serial;

View File

@@ -1,56 +0,0 @@
package work.slhaf.partner.core;
import lombok.Data;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.common.exception_handler.GlobalExceptionHandler;
import work.slhaf.partner.common.exception_handler.pojo.GlobalException;
import work.slhaf.partner.core.interaction.agent_interface.TaskCallback;
import work.slhaf.partner.core.interaction.data.InteractionInputData;
import work.slhaf.partner.core.interaction.data.context.InteractionContext;
import work.slhaf.partner.core.interaction.module.InteractionFlow;
import work.slhaf.partner.core.interaction.module.InteractionModulesLoader;
import work.slhaf.partner.module.modules.process.PreprocessExecutor;
import java.io.IOException;
import java.util.List;
@Data
@Slf4j
public class InteractionHub {
private static volatile InteractionHub interactionHub;
@ToString.Exclude
private TaskCallback callback;
private List<InteractionFlow> interactionModules;
public static InteractionHub initialize() throws IOException {
if (interactionHub == null) {
synchronized (InteractionHub.class) {
if (interactionHub == null) {
interactionHub = new InteractionHub();
//加载模块
interactionHub.setInteractionModules(InteractionModulesLoader.getInstance().registerInteractionModules());
log.info("InteractionHub注册完毕...");
}
}
}
return interactionHub;
}
public void call(InteractionInputData inputData) throws IOException, ClassNotFoundException {
InteractionContext interactionContext = PreprocessExecutor.getInstance().execute(inputData);
try {
for (InteractionFlow interactionModule : interactionModules) {
interactionModule.execute(interactionContext);
}
} catch (GlobalException e) {
GlobalExceptionHandler.writeExceptionState(e);
interactionContext.getCoreResponse().put("text", "[ERROR] " + e.getMessage());
} finally {
callback.onTaskFinished(interactionContext.getUserInfo(), interactionContext.getCoreResponse().getString("text"));
interactionContext.clearUp();
}
}
}

View File

@@ -1,10 +1,10 @@
package work.slhaf.partner.core.cognation.cognation; package work.slhaf.partner.core.cognation;
import work.slhaf.partner.api.agent.factory.capability.annotation.Capability; import work.slhaf.partner.api.agent.factory.capability.annotation.Capability;
import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityMethod; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityMethod;
import work.slhaf.partner.api.agent.factory.capability.annotation.ToCoordinated; import work.slhaf.partner.api.agent.factory.capability.annotation.ToCoordinated;
import work.slhaf.partner.api.chat.pojo.Message; import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.EvaluatedSlice; import work.slhaf.partner.core.submodule.memory.pojo.EvaluatedSlice;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;

View File

@@ -1,4 +1,4 @@
package work.slhaf.partner.core.cognation.cognation; package work.slhaf.partner.core.cognation;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -7,11 +7,11 @@ import org.apache.commons.io.FileUtils;
import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityCore; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityCore;
import work.slhaf.partner.api.chat.pojo.Message; import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.api.common.entity.PersistableObject; import work.slhaf.partner.api.common.entity.PersistableObject;
import work.slhaf.partner.core.cognation.cognation.pojo.ActiveData; import work.slhaf.partner.core.cognation.pojo.ActiveData;
import work.slhaf.partner.core.cognation.submodule.cache.CacheCore; import work.slhaf.partner.core.submodule.cache.CacheCore;
import work.slhaf.partner.core.cognation.submodule.memory.MemoryCore; import work.slhaf.partner.core.submodule.memory.MemoryCore;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.EvaluatedSlice; import work.slhaf.partner.core.submodule.memory.pojo.EvaluatedSlice;
import work.slhaf.partner.core.cognation.submodule.perceive.PerceiveCore; import work.slhaf.partner.core.submodule.perceive.PerceiveCore;
import java.io.*; import java.io.*;
import java.nio.file.Files; import java.nio.file.Files;

View File

@@ -1,4 +1,4 @@
package work.slhaf.partner.core.cognation.cognation.exception; package work.slhaf.partner.core.cognation.exception;
public class UserNotExistsException extends RuntimeException { public class UserNotExistsException extends RuntimeException {
public UserNotExistsException(String message) { public UserNotExistsException(String message) {

View File

@@ -1,7 +1,7 @@
package work.slhaf.partner.core.cognation.cognation.pojo; package work.slhaf.partner.core.cognation.pojo;
import lombok.Data; import lombok.Data;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.EvaluatedSlice; import work.slhaf.partner.core.submodule.memory.pojo.EvaluatedSlice;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;

View File

@@ -1,4 +0,0 @@
package work.slhaf.partner.core.cognation.submodule.dispatch;
public interface DispatchCapability {
}

View File

@@ -1,9 +1,9 @@
package work.slhaf.partner.core.cognation.common.pojo; package work.slhaf.partner.core.common.pojo;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.common.entity.PersistableObject; import work.slhaf.partner.api.common.entity.PersistableObject;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.MemorySlice; import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice;
import java.io.Serial; import java.io.Serial;
import java.util.List; import java.util.List;

View File

@@ -1,10 +1,10 @@
package work.slhaf.partner.core.cognation.common.pojo; package work.slhaf.partner.core.common.pojo;
import com.alibaba.fastjson2.annotation.JSONField; import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.common.entity.PersistableObject; import work.slhaf.partner.api.common.entity.PersistableObject;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.MemorySlice; import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice;
import java.io.Serial; import java.io.Serial;

View File

@@ -1,11 +0,0 @@
package work.slhaf.partner.core.interaction.agent_interface;
import work.slhaf.partner.core.interaction.data.InteractionInputData;
import java.io.IOException;
public interface InputReceiver {
void receiveInput(InteractionInputData inputData) throws IOException, ClassNotFoundException;
}

View File

@@ -1,5 +0,0 @@
package work.slhaf.partner.core.interaction.agent_interface;
public interface TaskCallback {
void onTaskFinished(String userInfo,String output);
}

View File

@@ -1,15 +0,0 @@
package work.slhaf.partner.core.interaction.data;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class InteractionInputData {
private String userInfo;
private String userNickName;
private String content;
private LocalDateTime localDateTime;
private String platform;
private boolean single;
}

View File

@@ -1,11 +0,0 @@
package work.slhaf.partner.core.interaction.data;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class InteractionOutputData {
private String content;
private String userInfo;
}

View File

@@ -1,9 +0,0 @@
package work.slhaf.partner.core.interaction.module;
import work.slhaf.partner.core.interaction.data.context.InteractionContext;
import java.io.IOException;
public interface InteractionFlow {
void execute(InteractionContext context) throws IOException, ClassNotFoundException;
}

View File

@@ -1,60 +0,0 @@
package work.slhaf.partner.core.interaction.module;
import work.slhaf.partner.common.config.Config;
import work.slhaf.partner.common.config.ModuleConfig;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
public class InteractionModulesLoader {
private static InteractionModulesLoader interactionModulesLoader;
public static InteractionModulesLoader getInstance(){
if (interactionModulesLoader == null) {
interactionModulesLoader = new InteractionModulesLoader();
}
return interactionModulesLoader;
}
public List<InteractionFlow> registerInteractionModules() throws IOException {
List<InteractionFlow> moduleList = new ArrayList<>();
List<ModuleConfig> moduleConfigList = Config.getConfig().getModuleConfigList();
for (ModuleConfig moduleConfig : moduleConfigList) {
if (ModuleConfig.Constant.INTERNAL.equals(moduleConfig.getType())) {
moduleList.add(loadInternalModule(moduleConfig.getClassName()));
} else if (ModuleConfig.Constant.EXTERNAL.equals(moduleConfig.getType())) {
moduleList.add(loadExternalModule(moduleConfig.getClassName(),moduleConfig.getPath()));
}
}
return moduleList;
}
private InteractionFlow loadExternalModule(String className, String path) {
try {
URL jarUrl = new File(path).toURI().toURL();
URLClassLoader loader = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader());
Class<?> clazz = loader.loadClass(className);
loader.close();
return (InteractionFlow) clazz.getMethod("getInstance").invoke(null);
} catch (ClassNotFoundException | InvocationTargetException | IllegalAccessException |
NoSuchMethodException | IOException e) {
throw new RuntimeException("Fail to load internal module: " + className ,e);
}
}
private static InteractionFlow loadInternalModule(String className) {
try {
Class<?> clazz = Class.forName(className);
return (InteractionFlow) clazz.getMethod("getInstance").invoke(null);
} catch (ClassNotFoundException | InvocationTargetException | IllegalAccessException | NoSuchMethodException e) {
throw new RuntimeException("Fail to load internal module: " + className,e);
}
}
}

View File

@@ -1,4 +1,4 @@
package work.slhaf.partner.core.cognation.submodule.cache; package work.slhaf.partner.core.submodule.cache;
import work.slhaf.partner.api.agent.factory.capability.annotation.Capability; import work.slhaf.partner.api.agent.factory.capability.annotation.Capability;

View File

@@ -1,4 +1,4 @@
package work.slhaf.partner.core.cognation.submodule.cache; package work.slhaf.partner.core.submodule.cache;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
@@ -6,8 +6,8 @@ import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityCore; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityCore;
import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityMethod; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityMethod;
import work.slhaf.partner.api.common.entity.PersistableObject; import work.slhaf.partner.api.common.entity.PersistableObject;
import work.slhaf.partner.core.cognation.common.pojo.MemoryResult; import work.slhaf.partner.core.common.pojo.MemoryResult;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.MemorySlice; import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice;
import java.io.Serial; import java.io.Serial;
import java.time.LocalDate; import java.time.LocalDate;

View File

@@ -0,0 +1,4 @@
package work.slhaf.partner.core.submodule.dispatch;
public interface DispatchCapability {
}

View File

@@ -1,7 +1,7 @@
package work.slhaf.partner.core.cognation.submodule.dispatch; package work.slhaf.partner.core.submodule.dispatch;
import work.slhaf.partner.api.common.entity.PersistableObject; import work.slhaf.partner.api.common.entity.PersistableObject;
import work.slhaf.partner.core.cognation.submodule.dispatch.pojo.DispatchData; import work.slhaf.partner.core.submodule.dispatch.pojo.DispatchData;
import java.io.Serial; import java.io.Serial;

View File

@@ -1,4 +1,4 @@
package work.slhaf.partner.core.cognation.submodule.dispatch.pojo; package work.slhaf.partner.core.submodule.dispatch.pojo;
import lombok.Data; import lombok.Data;

View File

@@ -1,9 +1,9 @@
package work.slhaf.partner.core.cognation.submodule.memory; package work.slhaf.partner.core.submodule.memory;
import work.slhaf.partner.api.agent.factory.capability.annotation.Capability; import work.slhaf.partner.api.agent.factory.capability.annotation.Capability;
import work.slhaf.partner.api.agent.factory.capability.annotation.ToCoordinated; import work.slhaf.partner.api.agent.factory.capability.annotation.ToCoordinated;
import work.slhaf.partner.core.cognation.common.pojo.MemoryResult; import work.slhaf.partner.core.common.pojo.MemoryResult;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.MemorySlice; import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice;
import java.io.IOException; import java.io.IOException;
import java.time.LocalDate; import java.time.LocalDate;

View File

@@ -1,17 +1,17 @@
package work.slhaf.partner.core.cognation.submodule.memory; package work.slhaf.partner.core.submodule.memory;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityCore; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityCore;
import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityMethod; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityMethod;
import work.slhaf.partner.api.common.entity.PersistableObject; import work.slhaf.partner.api.common.entity.PersistableObject;
import work.slhaf.partner.core.cognation.common.pojo.MemoryResult; import work.slhaf.partner.core.common.pojo.MemoryResult;
import work.slhaf.partner.core.cognation.common.pojo.MemorySliceResult; import work.slhaf.partner.core.common.pojo.MemorySliceResult;
import work.slhaf.partner.core.cognation.submodule.memory.exception.UnExistedDateIndexException; import work.slhaf.partner.core.submodule.memory.exception.UnExistedDateIndexException;
import work.slhaf.partner.core.cognation.submodule.memory.exception.UnExistedTopicException; import work.slhaf.partner.core.submodule.memory.exception.UnExistedTopicException;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.MemorySlice; import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.node.MemoryNode; import work.slhaf.partner.core.submodule.memory.pojo.node.MemoryNode;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.node.TopicNode; import work.slhaf.partner.core.submodule.memory.pojo.node.TopicNode;
import java.io.IOException; import java.io.IOException;
import java.io.Serial; import java.io.Serial;

View File

@@ -1,4 +1,4 @@
package work.slhaf.partner.core.cognation.submodule.memory.exception; package work.slhaf.partner.core.submodule.memory.exception;
public class NullSliceListException extends RuntimeException { public class NullSliceListException extends RuntimeException {
public NullSliceListException(String message) { public NullSliceListException(String message) {

View File

@@ -1,4 +1,4 @@
package work.slhaf.partner.core.cognation.submodule.memory.exception; package work.slhaf.partner.core.submodule.memory.exception;
public class UnExistedDateIndexException extends RuntimeException { public class UnExistedDateIndexException extends RuntimeException {
public UnExistedDateIndexException(String message) { public UnExistedDateIndexException(String message) {

View File

@@ -1,4 +1,4 @@
package work.slhaf.partner.core.cognation.submodule.memory.exception; package work.slhaf.partner.core.submodule.memory.exception;
public class UnExistedTopicException extends RuntimeException { public class UnExistedTopicException extends RuntimeException {
public UnExistedTopicException(String message) { public UnExistedTopicException(String message) {

View File

@@ -1,4 +1,4 @@
package work.slhaf.partner.core.cognation.submodule.memory.pojo; package work.slhaf.partner.core.submodule.memory.pojo;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;

View File

@@ -1,4 +1,4 @@
package work.slhaf.partner.core.cognation.submodule.memory.pojo; package work.slhaf.partner.core.submodule.memory.pojo;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;

View File

@@ -1,11 +1,11 @@
package work.slhaf.partner.core.cognation.submodule.memory.pojo.node; package work.slhaf.partner.core.submodule.memory.pojo.node;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.api.common.entity.PersistableObject; import work.slhaf.partner.api.common.entity.PersistableObject;
import work.slhaf.partner.core.cognation.submodule.memory.exception.NullSliceListException; import work.slhaf.partner.core.submodule.memory.exception.NullSliceListException;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.MemorySlice; import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice;
import java.io.*; import java.io.*;
import java.nio.file.Files; import java.nio.file.Files;

View File

@@ -1,4 +1,4 @@
package work.slhaf.partner.core.cognation.submodule.memory.pojo.node; package work.slhaf.partner.core.submodule.memory.pojo.node;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;

View File

@@ -1,7 +1,7 @@
package work.slhaf.partner.core.cognation.submodule.perceive; package work.slhaf.partner.core.submodule.perceive;
import work.slhaf.partner.api.agent.factory.capability.annotation.Capability; import work.slhaf.partner.api.agent.factory.capability.annotation.Capability;
import work.slhaf.partner.core.cognation.submodule.perceive.pojo.User; import work.slhaf.partner.core.submodule.perceive.pojo.User;
@Capability(value = "perceive") @Capability(value = "perceive")
public interface PerceiveCapability { public interface PerceiveCapability {

View File

@@ -1,12 +1,12 @@
package work.slhaf.partner.core.cognation.submodule.perceive; package work.slhaf.partner.core.submodule.perceive;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityCore; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityCore;
import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityMethod; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityMethod;
import work.slhaf.partner.api.common.entity.PersistableObject; import work.slhaf.partner.api.common.entity.PersistableObject;
import work.slhaf.partner.core.cognation.cognation.exception.UserNotExistsException; import work.slhaf.partner.core.cognation.exception.UserNotExistsException;
import work.slhaf.partner.core.cognation.submodule.perceive.pojo.User; import work.slhaf.partner.core.submodule.perceive.pojo.User;
import java.io.Serial; import java.io.Serial;
import java.util.ArrayList; import java.util.ArrayList;

View File

@@ -1,4 +1,4 @@
package work.slhaf.partner.core.cognation.submodule.perceive.pojo; package work.slhaf.partner.core.submodule.perceive.pojo;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;

View File

@@ -1,7 +0,0 @@
package work.slhaf.partner.gateway;
import work.slhaf.partner.core.interaction.data.InteractionOutputData;
public interface MessageSender {
void sendMessage(InteractionOutputData outputData);
}

View File

@@ -1,5 +0,0 @@
package work.slhaf.partner.module.common.module;
public abstract class CoreModule extends InteractionModule {
}

View File

@@ -0,0 +1,7 @@
package work.slhaf.partner.module.common.module;
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningModule;
import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
public abstract class CoreRunningModule extends AgentRunningModule<PartnerRunningFlowContext> {
}

View File

@@ -1,7 +0,0 @@
package work.slhaf.partner.module.common.module;
import work.slhaf.partner.core.interaction.module.InteractionFlow;
public abstract class InteractionModule/* extends Module*/ implements InteractionFlow {
}

View File

@@ -1,4 +0,0 @@
package work.slhaf.partner.module.common.module;
public abstract class PostModule extends InteractionModule{
}

View File

@@ -0,0 +1,7 @@
package work.slhaf.partner.module.common.module;
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningModule;
import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
public abstract class PostRunningModule extends AgentRunningModule<PartnerRunningFlowContext> {
}

View File

@@ -1,6 +1,7 @@
package work.slhaf.partner.module.common.module; package work.slhaf.partner.module.common.module;
import work.slhaf.partner.core.interaction.data.context.InteractionContext; import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningModule;
import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import work.slhaf.partner.module.common.entity.AppendPromptData; import work.slhaf.partner.module.common.entity.AppendPromptData;
import java.util.HashMap; import java.util.HashMap;
@@ -8,8 +9,8 @@ import java.util.HashMap;
/** /**
* 前置模块抽象类 * 前置模块抽象类
*/ */
public abstract class PreModule extends InteractionModule { public abstract class PreRunningModule extends AgentRunningModule<PartnerRunningFlowContext> {
protected void setAppendedPrompt(InteractionContext context) { protected void setAppendedPrompt(PartnerRunningFlowContext context) {
AppendPromptData data = new AppendPromptData(); AppendPromptData data = new AppendPromptData();
data.setModuleName(moduleName()); data.setModuleName(moduleName());
HashMap<String, String> map = getPromptDataMap(context.getUserId()); HashMap<String, String> map = getPromptDataMap(context.getUserId());
@@ -17,7 +18,7 @@ public abstract class PreModule extends InteractionModule {
context.getModuleContext().getAppendedPrompt().add(data); context.getModuleContext().getAppendedPrompt().add(data);
} }
protected void setActiveModule(InteractionContext context) { protected void setActiveModule(PartnerRunningFlowContext context) {
context.getCoreContext().addActiveModule(moduleName()); context.getCoreContext().addActiveModule(moduleName());
} }

View File

@@ -5,17 +5,19 @@ import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
import work.slhaf.partner.api.agent.factory.module.annotation.CoreModule;
import work.slhaf.partner.api.agent.factory.module.annotation.Init;
import work.slhaf.partner.api.agent.runtime.interaction.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.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.ChatResponse; import work.slhaf.partner.api.chat.pojo.ChatResponse;
import work.slhaf.partner.api.chat.pojo.Message; import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.api.chat.pojo.MetaMessage; import work.slhaf.partner.api.chat.pojo.MetaMessage;
import work.slhaf.partner.core.cognation.cognation.CognationCapability; import work.slhaf.partner.core.cognation.CognationCapability;
import work.slhaf.partner.core.interaction.data.context.InteractionContext; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import work.slhaf.partner.core.session.SessionManager; import work.slhaf.partner.runtime.session.SessionManager;
import work.slhaf.partner.module.common.entity.AppendPromptData; import work.slhaf.partner.module.common.entity.AppendPromptData;
import work.slhaf.partner.module.common.model.ModelConstant; import work.slhaf.partner.module.common.model.ModelConstant;
import work.slhaf.partner.module.common.module.CoreModule; import work.slhaf.partner.module.common.module.CoreRunningModule;
import java.io.IOException; import java.io.IOException;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@@ -28,34 +30,22 @@ import static work.slhaf.partner.common.util.ExtractUtil.extractJson;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
@Slf4j @Slf4j
public class CoreModel extends CoreModule implements ActivateModel { @CoreModule
public class CoreModel extends CoreRunningModule implements ActivateModel {
private static volatile CoreModel coreModel;
@InjectCapability @InjectCapability
private CognationCapability cognationCapability; private CognationCapability cognationCapability;
private SessionManager sessionManager; private SessionManager sessionManager;
private List<Message> appendedMessages; private List<Message> appendedMessages;
private CoreModel() { @Init
modelSettings(); public void init(){
} List<Message> chatMessages = this.cognationCapability.getChatMessages();
this.getModel().setChatMessages(chatMessages);
public static CoreModel getInstance() throws IOException, ClassNotFoundException { this.appendedMessages = new ArrayList<>();
if (coreModel == null) { this.sessionManager = SessionManager.getInstance();
synchronized (CoreModel.class) {
if (coreModel == null) {
coreModel = new CoreModel();
coreModel.getModel().setChatMessages(coreModel.cognationCapability.getChatMessages());
coreModel.appendedMessages = new ArrayList<>();
coreModel.sessionManager = SessionManager.getInstance();
coreModel.updateChatClientSettings();
log.info("[CoreModel] CoreModel注册完毕..."); log.info("[CoreModel] CoreModel注册完毕...");
} }
}
}
return coreModel;
}
@Override @Override
public void updateChatClientSettings() { public void updateChatClientSettings() {
@@ -74,21 +64,34 @@ public class CoreModel extends CoreModule implements ActivateModel {
} }
@Override @Override
public void execute(InteractionContext interactionContext) { public void execute(PartnerRunningFlowContext runningFlowContext) {
String userId = interactionContext.getUserId(); String userId = runningFlowContext.getUserId();
log.debug("[CoreModel] 主对话流程开始: {}", userId); log.debug("[CoreModel] 主对话流程开始: {}", userId);
List<AppendPromptData> appendedPrompt = interactionContext.getModuleContext().getAppendedPrompt(); beforeChat(runningFlowContext);
executeChat(runningFlowContext);
log.debug("[CoreModel] 主对话流程({})结束...", userId);
}
private void beforeChat(PartnerRunningFlowContext runningFlowContext) {
setAppendedPromptMessage(runningFlowContext);
activateModule(runningFlowContext);
setMessageCount(runningFlowContext);
log.debug("[CoreModel] 当前消息列表大小: {}", chatMessages().size());
log.debug("[CoreModel] 当前核心prompt内容: {}", runningFlowContext.getCoreContext().toString());
setMessage(runningFlowContext.getCoreContext().toString());
}
private void setAppendedPromptMessage(PartnerRunningFlowContext runningFlowContext) {
List<AppendPromptData> appendedPrompt = runningFlowContext.getModuleContext().getAppendedPrompt();
int appendedPromptSize = getAppendedPromptSize(appendedPrompt); int appendedPromptSize = getAppendedPromptSize(appendedPrompt);
if (appendedPromptSize > 0) { if (appendedPromptSize > 0) {
setAppendedPromptMessage(appendedPrompt); setAppendedPromptMessage(appendedPrompt);
} }
activateModule(interactionContext); }
setMessageCount(interactionContext);
log.debug("[CoreModel] 当前消息列表大小: {}", chatMessages().size()); private void executeChat(PartnerRunningFlowContext runningFlowContext) {
log.debug("[CoreModel] 当前核心prompt内容: {}", interactionContext.getCoreContext().toString());
setMessage(interactionContext.getCoreContext().toString());
JSONObject response = new JSONObject(); JSONObject response = new JSONObject();
int count = 0; int count = 0;
@@ -102,7 +105,7 @@ public class CoreModel extends CoreModule implements ActivateModel {
handleExceptionResponse(response, chatResponse.getMessage()); handleExceptionResponse(response, chatResponse.getMessage());
} }
log.debug("[CoreModel] CoreModel 响应内容: {}", response); log.debug("[CoreModel] CoreModel 响应内容: {}", response);
updateModuleContextAndChatMessages(interactionContext, response.getString("text"), chatResponse); updateModuleContextAndChatMessages(runningFlowContext, response.getString("text"), chatResponse);
break; break;
} catch (Exception e) { } catch (Exception e) {
count++; count++;
@@ -113,12 +116,11 @@ public class CoreModel extends CoreModule implements ActivateModel {
break; break;
} }
} finally { } finally {
updateCoreResponse(interactionContext, response); updateCoreResponse(runningFlowContext, response);
resetAppendedMessages(); resetAppendedMessages();
log.debug("[CoreModel] 消息列表更新大小: {}", chatMessages().size()); log.debug("[CoreModel] 消息列表更新大小: {}", chatMessages().size());
} }
} }
log.debug("[CoreModel] 主对话流程({})结束...", userId);
} }
private int getAppendedPromptSize(List<AppendPromptData> appendedPrompt) { private int getAppendedPromptSize(List<AppendPromptData> appendedPrompt) {
@@ -129,15 +131,15 @@ public class CoreModel extends CoreModule implements ActivateModel {
return size; return size;
} }
private void activateModule(InteractionContext context) { private void activateModule(PartnerRunningFlowContext context) {
for (AppendPromptData data : context.getModuleContext().getAppendedPrompt()) { for (AppendPromptData data : context.getModuleContext().getAppendedPrompt()) {
if (data.getAppendedPrompt().isEmpty()) continue; if (data.getAppendedPrompt().isEmpty()) continue;
context.getCoreContext().activateModule(data.getModuleName()); context.getCoreContext().activateModule(data.getModuleName());
} }
} }
private void updateCoreResponse(InteractionContext interactionContext, JSONObject response) { private void updateCoreResponse(PartnerRunningFlowContext runningFlowContext, JSONObject response) {
interactionContext.getCoreResponse().put("text", response.getString("text")); runningFlowContext.getCoreResponse().put("text", response.getString("text"));
} }
private void resetAppendedMessages() { private void resetAppendedMessages() {
@@ -153,7 +155,7 @@ public class CoreModel extends CoreModule implements ActivateModel {
return chatClient().runChat(temp); return chatClient().runChat(temp);
} }
private void updateModuleContextAndChatMessages(InteractionContext interactionContext, String response, ChatResponse chatResponse) { private void updateModuleContextAndChatMessages(PartnerRunningFlowContext runningFlowContext, String response, ChatResponse chatResponse) {
cognationCapability.getMessageLock().lock(); cognationCapability.getMessageLock().lock();
chatMessages().removeIf(m -> { chatMessages().removeIf(m -> {
if (m.getRole().equals(ChatConstant.Character.ASSISTANT)) { if (m.getRole().equals(ChatConstant.Character.ASSISTANT)) {
@@ -168,17 +170,17 @@ public class CoreModel extends CoreModule implements ActivateModel {
}); });
//添加时间标志 //添加时间标志
String dateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("\r\n**[yyyy-MM-dd HH:mm:ss]")); String dateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("\r\n**[yyyy-MM-dd HH:mm:ss]"));
Message primaryUserMessage = new Message(ChatConstant.Character.USER, interactionContext.getCoreContext().getText() + dateTime); Message primaryUserMessage = new Message(ChatConstant.Character.USER, runningFlowContext.getCoreContext().getText() + dateTime);
chatMessages().add(primaryUserMessage); chatMessages().add(primaryUserMessage);
Message assistantMessage = new Message(ChatConstant.Character.ASSISTANT, response); Message assistantMessage = new Message(ChatConstant.Character.ASSISTANT, response);
chatMessages().add(assistantMessage); chatMessages().add(assistantMessage);
cognationCapability.getMessageLock().unlock(); cognationCapability.getMessageLock().unlock();
//设置上下文 //设置上下文
interactionContext.getModuleContext().getExtraContext().put("total_token", chatResponse.getUsageBean().getTotal_tokens()); runningFlowContext.getModuleContext().getExtraContext().put("total_token", chatResponse.getUsageBean().getTotal_tokens());
//区分单人聊天场景 //区分单人聊天场景
if (interactionContext.isSingle()) { if (runningFlowContext.isSingle()) {
MetaMessage metaMessage = new MetaMessage(primaryUserMessage, assistantMessage); MetaMessage metaMessage = new MetaMessage(primaryUserMessage, assistantMessage);
sessionManager.addMetaMessage(interactionContext.getUserId(), metaMessage); sessionManager.addMetaMessage(runningFlowContext.getUserId(), metaMessage);
} }
} }
@@ -192,8 +194,8 @@ public class CoreModel extends CoreModule implements ActivateModel {
// interactionContext.setFinished(true); // interactionContext.setFinished(true);
} }
private void setMessageCount(InteractionContext interactionContext) { private void setMessageCount(PartnerRunningFlowContext runningFlowContext) {
interactionContext.getModuleContext().getExtraContext().put("message_count", chatMessages().size()); runningFlowContext.getModuleContext().getExtraContext().put("message_count", chatMessages().size());
} }
private void setAppendedPromptMessage(List<AppendPromptData> appendPrompt) { private void setAppendedPromptMessage(List<AppendPromptData> appendPrompt) {

View File

@@ -5,17 +5,18 @@ import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
import work.slhaf.partner.core.cognation.cognation.CognationCapability; import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule;
import work.slhaf.partner.core.cognation.common.pojo.MemoryResult; import work.slhaf.partner.core.cognation.CognationCapability;
import work.slhaf.partner.core.cognation.submodule.cache.CacheCapability; import work.slhaf.partner.core.common.pojo.MemoryResult;
import work.slhaf.partner.core.cognation.submodule.memory.MemoryCapability; import work.slhaf.partner.core.submodule.cache.CacheCapability;
import work.slhaf.partner.core.cognation.submodule.memory.exception.UnExistedDateIndexException; import work.slhaf.partner.core.submodule.memory.MemoryCapability;
import work.slhaf.partner.core.cognation.submodule.memory.exception.UnExistedTopicException; import work.slhaf.partner.core.submodule.memory.exception.UnExistedDateIndexException;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.EvaluatedSlice; import work.slhaf.partner.core.submodule.memory.exception.UnExistedTopicException;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.MemorySlice; import work.slhaf.partner.core.submodule.memory.pojo.EvaluatedSlice;
import work.slhaf.partner.core.interaction.data.context.InteractionContext; import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice;
import work.slhaf.partner.core.session.SessionManager; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import work.slhaf.partner.module.common.module.PreModule; import work.slhaf.partner.runtime.session.SessionManager;
import work.slhaf.partner.module.common.module.PreRunningModule;
import work.slhaf.partner.module.modules.memory.selector.evaluator.SliceSelectEvaluator; import work.slhaf.partner.module.modules.memory.selector.evaluator.SliceSelectEvaluator;
import work.slhaf.partner.module.modules.memory.selector.evaluator.data.EvaluatorInput; import work.slhaf.partner.module.modules.memory.selector.evaluator.data.EvaluatorInput;
import work.slhaf.partner.module.modules.memory.selector.extractor.MemorySelectExtractor; import work.slhaf.partner.module.modules.memory.selector.extractor.MemorySelectExtractor;
@@ -32,7 +33,8 @@ import java.util.List;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
@Slf4j @Slf4j
public class MemorySelector extends PreModule { @AgentModule(name="memory_selector",order=1)
public class MemorySelector extends PreRunningModule {
private static volatile MemorySelector memorySelector; private static volatile MemorySelector memorySelector;
@@ -65,32 +67,32 @@ public class MemorySelector extends PreModule {
} }
@Override @Override
public void execute(InteractionContext interactionContext) throws IOException, ClassNotFoundException { public void execute(PartnerRunningFlowContext runningFlowContext) throws IOException, ClassNotFoundException {
log.debug("[MemorySelector] 记忆回溯流程开始..."); log.debug("[MemorySelector] 记忆回溯流程开始...");
String userId = interactionContext.getUserId(); String userId = runningFlowContext.getUserId();
//获取主题路径 //获取主题路径
ExtractorResult extractorResult = memorySelectExtractor.execute(interactionContext); ExtractorResult extractorResult = memorySelectExtractor.execute(runningFlowContext);
if (extractorResult.isRecall() || !extractorResult.getMatches().isEmpty()) { if (extractorResult.isRecall() || !extractorResult.getMatches().isEmpty()) {
cognationCapability.clearActivatedSlices(userId); cognationCapability.clearActivatedSlices(userId);
List<EvaluatedSlice> evaluatedSlices = selectAndEvaluateMemory(interactionContext, extractorResult); List<EvaluatedSlice> evaluatedSlices = selectAndEvaluateMemory(runningFlowContext, extractorResult);
cognationCapability.updateActivatedSlices(userId, evaluatedSlices); cognationCapability.updateActivatedSlices(userId, evaluatedSlices);
} }
//设置追加提示词 //设置追加提示词
setAppendedPrompt(interactionContext); setAppendedPrompt(runningFlowContext);
setModuleContextRecall(interactionContext); setModuleContextRecall(runningFlowContext);
setActiveModule(interactionContext); setActiveModule(runningFlowContext);
log.debug("[MemorySelector] 记忆回溯完成..."); log.debug("[MemorySelector] 记忆回溯完成...");
} }
private List<EvaluatedSlice> selectAndEvaluateMemory(InteractionContext interactionContext, ExtractorResult extractorResult) throws IOException, ClassNotFoundException { private List<EvaluatedSlice> selectAndEvaluateMemory(PartnerRunningFlowContext runningFlowContext, ExtractorResult extractorResult) throws IOException, ClassNotFoundException {
log.debug("[MemorySelector] 触发记忆回溯..."); log.debug("[MemorySelector] 触发记忆回溯...");
//查找切片 //查找切片
String userId = interactionContext.getUserId(); String userId = runningFlowContext.getUserId();
List<MemoryResult> memoryResultList = new ArrayList<>(); List<MemoryResult> memoryResultList = new ArrayList<>();
setMemoryResultList(memoryResultList, extractorResult.getMatches(), userId); setMemoryResultList(memoryResultList, extractorResult.getMatches(), userId);
//评估切片 //评估切片
EvaluatorInput evaluatorInput = EvaluatorInput.builder() EvaluatorInput evaluatorInput = EvaluatorInput.builder()
.input(interactionContext.getInput()) .input(runningFlowContext.getInput())
.memoryResults(memoryResultList) .memoryResults(memoryResultList)
.messages(cognationCapability.getChatMessages()) .messages(cognationCapability.getChatMessages())
.build(); .build();
@@ -100,12 +102,12 @@ public class MemorySelector extends PreModule {
return memorySlices; return memorySlices;
} }
private void setModuleContextRecall(InteractionContext interactionContext) { private void setModuleContextRecall(PartnerRunningFlowContext runningFlowContext) {
String userId = interactionContext.getUserId(); String userId = runningFlowContext.getUserId();
boolean recall = cognationCapability.hasActivatedSlices(userId); boolean recall = cognationCapability.hasActivatedSlices(userId);
interactionContext.getModuleContext().getExtraContext().put("recall", recall); runningFlowContext.getModuleContext().getExtraContext().put("recall", recall);
if (recall) { if (recall) {
interactionContext.getModuleContext().getExtraContext().put("recall_count", cognationCapability.getActivatedSlicesSize(userId)); runningFlowContext.getModuleContext().getExtraContext().put("recall_count", cognationCapability.getActivatedSlicesSize(userId));
} }
} }

View File

@@ -9,10 +9,10 @@ import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.ActivateModel; 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.agent.runtime.interaction.flow.abstracts.AgentRunningSubModule;
import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor; import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor;
import work.slhaf.partner.core.cognation.common.pojo.MemoryResult; import work.slhaf.partner.core.common.pojo.MemoryResult;
import work.slhaf.partner.core.cognation.common.pojo.MemorySliceResult; import work.slhaf.partner.core.common.pojo.MemorySliceResult;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.EvaluatedSlice; import work.slhaf.partner.core.submodule.memory.pojo.EvaluatedSlice;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.MemorySlice; import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice;
import work.slhaf.partner.module.modules.memory.selector.evaluator.data.EvaluatorBatchInput; import work.slhaf.partner.module.modules.memory.selector.evaluator.data.EvaluatorBatchInput;
import work.slhaf.partner.module.modules.memory.selector.evaluator.data.EvaluatorInput; import work.slhaf.partner.module.modules.memory.selector.evaluator.data.EvaluatorInput;
import work.slhaf.partner.module.modules.memory.selector.evaluator.data.EvaluatorResult; import work.slhaf.partner.module.modules.memory.selector.evaluator.data.EvaluatorResult;
@@ -34,10 +34,6 @@ public class SliceSelectEvaluator extends AgentRunningSubModule<EvaluatorInput,
private static volatile SliceSelectEvaluator sliceSelectEvaluator; private static volatile SliceSelectEvaluator sliceSelectEvaluator;
private InteractionThreadPoolExecutor executor; private InteractionThreadPoolExecutor executor;
private SliceSelectEvaluator() {
modelSettings();
}
public static SliceSelectEvaluator getInstance() throws IOException, ClassNotFoundException { public static SliceSelectEvaluator getInstance() throws IOException, ClassNotFoundException {
if (sliceSelectEvaluator == null) { if (sliceSelectEvaluator == null) {
synchronized (SliceSelectEvaluator.class) { synchronized (SliceSelectEvaluator.class) {

View File

@@ -3,7 +3,7 @@ package work.slhaf.partner.module.modules.memory.selector.evaluator.data;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import work.slhaf.partner.api.chat.pojo.Message; import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.cognation.common.pojo.MemoryResult; import work.slhaf.partner.core.common.pojo.MemoryResult;
import java.util.List; import java.util.List;

View File

@@ -10,13 +10,13 @@ import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.ActivateM
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningSubModule; 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.Message;
import work.slhaf.partner.api.chat.pojo.MetaMessage; import work.slhaf.partner.api.chat.pojo.MetaMessage;
import work.slhaf.partner.common.exception_handler.GlobalExceptionHandler; import work.slhaf.partner.common.exception.callback.GlobalExceptionHandler;
import work.slhaf.partner.common.exception_handler.pojo.GlobalException; import work.slhaf.partner.runtime.exception.pojo.GlobalException;
import work.slhaf.partner.core.cognation.cognation.CognationCapability; import work.slhaf.partner.core.cognation.CognationCapability;
import work.slhaf.partner.core.cognation.submodule.memory.MemoryCapability; import work.slhaf.partner.core.submodule.memory.MemoryCapability;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.EvaluatedSlice; import work.slhaf.partner.core.submodule.memory.pojo.EvaluatedSlice;
import work.slhaf.partner.core.interaction.data.context.InteractionContext; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import work.slhaf.partner.core.session.SessionManager; import work.slhaf.partner.runtime.session.SessionManager;
import work.slhaf.partner.module.modules.memory.selector.extractor.data.ExtractorInput; import work.slhaf.partner.module.modules.memory.selector.extractor.data.ExtractorInput;
import work.slhaf.partner.module.modules.memory.selector.extractor.data.ExtractorMatchData; import work.slhaf.partner.module.modules.memory.selector.extractor.data.ExtractorMatchData;
import work.slhaf.partner.module.modules.memory.selector.extractor.data.ExtractorResult; import work.slhaf.partner.module.modules.memory.selector.extractor.data.ExtractorResult;
@@ -31,7 +31,7 @@ import static work.slhaf.partner.common.util.ExtractUtil.fixTopicPath;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
@Slf4j @Slf4j
public class MemorySelectExtractor extends AgentRunningSubModule<InteractionContext, ExtractorResult> implements ActivateModel { public class MemorySelectExtractor extends AgentRunningSubModule<PartnerRunningFlowContext, ExtractorResult> implements ActivateModel {
private static volatile MemorySelectExtractor memorySelectExtractor; private static volatile MemorySelectExtractor memorySelectExtractor;
@@ -58,7 +58,7 @@ public class MemorySelectExtractor extends AgentRunningSubModule<InteractionCont
} }
@Override @Override
public ExtractorResult execute(InteractionContext context) { public ExtractorResult execute(PartnerRunningFlowContext context) {
log.debug("[MemorySelectExtractor] 主题提取模块开始..."); log.debug("[MemorySelectExtractor] 主题提取模块开始...");
//结构化为指定格式 //结构化为指定格式
List<Message> chatMessages = new ArrayList<>(); List<Message> chatMessages = new ArrayList<>();

View File

@@ -3,7 +3,7 @@ package work.slhaf.partner.module.modules.memory.selector.extractor.data;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import work.slhaf.partner.api.chat.pojo.Message; import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.EvaluatedSlice; import work.slhaf.partner.core.submodule.memory.pojo.EvaluatedSlice;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.List; import java.util.List;

View File

@@ -8,14 +8,14 @@ import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapabili
import work.slhaf.partner.api.chat.constant.ChatConstant; import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.Message; import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor; import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor;
import work.slhaf.partner.core.cognation.cognation.CognationCapability; import work.slhaf.partner.core.cognation.CognationCapability;
import work.slhaf.partner.core.cognation.submodule.cache.CacheCapability; import work.slhaf.partner.core.submodule.cache.CacheCapability;
import work.slhaf.partner.core.cognation.submodule.memory.MemoryCapability; import work.slhaf.partner.core.submodule.memory.MemoryCapability;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.MemorySlice; import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice;
import work.slhaf.partner.core.cognation.submodule.perceive.PerceiveCapability; import work.slhaf.partner.core.submodule.perceive.PerceiveCapability;
import work.slhaf.partner.core.interaction.data.context.InteractionContext; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import work.slhaf.partner.core.session.SessionManager; import work.slhaf.partner.runtime.session.SessionManager;
import work.slhaf.partner.module.common.module.PostModule; import work.slhaf.partner.module.common.module.PostRunningModule;
import work.slhaf.partner.module.modules.memory.selector.extractor.MemorySelectExtractor; import work.slhaf.partner.module.modules.memory.selector.extractor.MemorySelectExtractor;
import work.slhaf.partner.module.modules.memory.updater.summarizer.MemorySummarizer; import work.slhaf.partner.module.modules.memory.updater.summarizer.MemorySummarizer;
import work.slhaf.partner.module.modules.memory.updater.summarizer.data.SummarizeInput; import work.slhaf.partner.module.modules.memory.updater.summarizer.data.SummarizeInput;
@@ -32,7 +32,7 @@ import static work.slhaf.partner.common.util.ExtractUtil.extractUserId;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
@Slf4j @Slf4j
public class MemoryUpdater extends PostModule { public class MemoryUpdater extends PostRunningModule {
private static volatile MemoryUpdater memoryUpdater; private static volatile MemoryUpdater memoryUpdater;
@@ -100,7 +100,7 @@ public class MemoryUpdater extends PostModule {
} }
@Override @Override
public void execute(InteractionContext context) { public void execute(PartnerRunningFlowContext context) {
if (context.isFinished()) { if (context.isFinished()) {
log.warn("[MemoryUpdater] 流程强制结束, 不触发记忆被动更新机制"); log.warn("[MemoryUpdater] 流程强制结束, 不触发记忆被动更新机制");
return; return;

View File

@@ -3,17 +3,17 @@ package work.slhaf.partner.module.modules.perceive.selector;
import lombok.Setter; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
import work.slhaf.partner.core.cognation.submodule.perceive.PerceiveCapability; import work.slhaf.partner.core.submodule.perceive.PerceiveCapability;
import work.slhaf.partner.core.cognation.submodule.perceive.pojo.User; import work.slhaf.partner.core.submodule.perceive.pojo.User;
import work.slhaf.partner.core.interaction.data.context.InteractionContext; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import work.slhaf.partner.module.common.module.PreModule; import work.slhaf.partner.module.common.module.PreRunningModule;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
@Slf4j @Slf4j
@Setter @Setter
public class PerceiveSelector extends PreModule { public class PerceiveSelector extends PreRunningModule {
private static volatile PerceiveSelector perceiveSelector; private static volatile PerceiveSelector perceiveSelector;
@@ -32,7 +32,7 @@ public class PerceiveSelector extends PreModule {
} }
@Override @Override
public void execute(InteractionContext context) throws IOException, ClassNotFoundException { public void execute(PartnerRunningFlowContext context) throws IOException, ClassNotFoundException {
log.debug("[PerceiveSelector] 感知模块处理流程开始..."); log.debug("[PerceiveSelector] 感知模块处理流程开始...");
//处理思路: 根据用户id,查询用户相关身份感知数据直接添加到appendPrompt中这直接执行appendPrompt方法应该可以 //处理思路: 根据用户id,查询用户相关身份感知数据直接添加到appendPrompt中这直接执行appendPrompt方法应该可以
setAppendedPrompt(context); setAppendedPrompt(context);

View File

@@ -1,15 +1,13 @@
package work.slhaf.partner.module.modules.perceive.updater; package work.slhaf.partner.module.modules.perceive.updater;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor; import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor;
import work.slhaf.partner.core.cognation.cognation.CognationCapability; import work.slhaf.partner.core.cognation.CognationCapability;
import work.slhaf.partner.core.cognation.submodule.perceive.PerceiveCapability; import work.slhaf.partner.core.submodule.perceive.PerceiveCapability;
import work.slhaf.partner.core.cognation.submodule.perceive.pojo.User; import work.slhaf.partner.core.submodule.perceive.pojo.User;
import work.slhaf.partner.core.interaction.data.context.InteractionContext; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import work.slhaf.partner.module.common.module.PostModule;
import work.slhaf.partner.module.modules.perceive.updater.relation_extractor.RelationExtractor; import work.slhaf.partner.module.modules.perceive.updater.relation_extractor.RelationExtractor;
import work.slhaf.partner.module.modules.perceive.updater.relation_extractor.pojo.RelationExtractResult; import work.slhaf.partner.module.modules.perceive.updater.relation_extractor.pojo.RelationExtractResult;
import work.slhaf.partner.module.modules.perceive.updater.static_extractor.StaticMemoryExtractor; import work.slhaf.partner.module.modules.perceive.updater.static_extractor.StaticMemoryExtractor;
@@ -24,10 +22,9 @@ import java.util.concurrent.locks.ReentrantLock;
/** /**
* 感知更新,异步 * 感知更新,异步
*/ */
@EqualsAndHashCode(callSuper = true)
@Slf4j @Slf4j
@Data @Data
public class PerceiveUpdater extends PostModule { public class PerceiveUpdater {
private static volatile PerceiveUpdater perceiveUpdater; private static volatile PerceiveUpdater perceiveUpdater;
@@ -54,8 +51,7 @@ public class PerceiveUpdater extends PostModule {
return perceiveUpdater; return perceiveUpdater;
} }
@Override public void execute(PartnerRunningFlowContext context) throws IOException, ClassNotFoundException {
public void execute(InteractionContext context) throws IOException, ClassNotFoundException {
executor.execute(() -> { executor.execute(() -> {
boolean trigger = context.getModuleContext().getExtraContext().getBoolean("perceive_updater"); boolean trigger = context.getModuleContext().getExtraContext().getBoolean("perceive_updater");
if (!trigger){ if (!trigger){
@@ -78,7 +74,7 @@ public class PerceiveUpdater extends PostModule {
}); });
} }
private void runRelationExtractorAction(InteractionContext context, ReentrantLock userLock, User user) { private void runRelationExtractorAction(PartnerRunningFlowContext context, ReentrantLock userLock, User user) {
RelationExtractResult relationExtractResult = relationExtractor.execute(context); RelationExtractResult relationExtractResult = relationExtractor.execute(context);
userLock.lock(); userLock.lock();
user.setRelation(relationExtractResult.getRelation()); user.setRelation(relationExtractResult.getRelation());
@@ -88,7 +84,7 @@ public class PerceiveUpdater extends PostModule {
userLock.unlock(); userLock.unlock();
} }
private void runStaticExtractorAction(InteractionContext context, ReentrantLock userLock, User user) { private void runStaticExtractorAction(PartnerRunningFlowContext context, ReentrantLock userLock, User user) {
HashMap<String, String> newStaticMemory = staticMemoryExtractor.execute(context); HashMap<String, String> newStaticMemory = staticMemoryExtractor.execute(context);
userLock.lock(); userLock.lock();
user.setStaticMemory(newStaticMemory); user.setStaticMemory(newStaticMemory);

View File

@@ -7,10 +7,10 @@ import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.ActivateM
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.AgentRunningSubModule; 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.ChatResponse;
import work.slhaf.partner.api.chat.pojo.Message; import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.cognation.cognation.CognationCapability; import work.slhaf.partner.core.cognation.CognationCapability;
import work.slhaf.partner.core.cognation.submodule.perceive.PerceiveCapability; import work.slhaf.partner.core.submodule.perceive.PerceiveCapability;
import work.slhaf.partner.core.cognation.submodule.perceive.pojo.User; import work.slhaf.partner.core.submodule.perceive.pojo.User;
import work.slhaf.partner.core.interaction.data.context.InteractionContext; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import work.slhaf.partner.module.modules.perceive.updater.relation_extractor.pojo.RelationExtractInput; import work.slhaf.partner.module.modules.perceive.updater.relation_extractor.pojo.RelationExtractInput;
import work.slhaf.partner.module.modules.perceive.updater.relation_extractor.pojo.RelationExtractResult; import work.slhaf.partner.module.modules.perceive.updater.relation_extractor.pojo.RelationExtractResult;
@@ -21,7 +21,7 @@ import java.util.List;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
public class RelationExtractor extends AgentRunningSubModule<InteractionContext, RelationExtractResult> implements ActivateModel { public class RelationExtractor extends AgentRunningSubModule<PartnerRunningFlowContext, RelationExtractResult> implements ActivateModel {
private static volatile RelationExtractor relationExtractor; private static volatile RelationExtractor relationExtractor;
@@ -45,7 +45,7 @@ public class RelationExtractor extends AgentRunningSubModule<InteractionContext,
} }
@Override @Override
public RelationExtractResult execute(InteractionContext context){ public RelationExtractResult execute(PartnerRunningFlowContext context){
tempMessages = new ArrayList<>(cognationCapability.getChatMessages()); tempMessages = new ArrayList<>(cognationCapability.getChatMessages());
String userId = context.getUserId(); String userId = context.getUserId();
RelationExtractInput input = getRelationInput(userId); RelationExtractInput input = getRelationInput(userId);
@@ -56,7 +56,7 @@ public class RelationExtractor extends AgentRunningSubModule<InteractionContext,
} }
private User getTempUser(InteractionContext context, RelationExtractResult relationExtractResult) { private User getTempUser(PartnerRunningFlowContext context, RelationExtractResult relationExtractResult) {
User user = new User(); User user = new User();
user.setUuid(context.getUserId()); user.setUuid(context.getUserId());
user.setRelation(relationExtractResult.getRelation()); user.setRelation(relationExtractResult.getRelation());

View File

@@ -8,9 +8,9 @@ import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapabili
import work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts.ActivateModel; 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.agent.runtime.interaction.flow.abstracts.AgentRunningSubModule;
import work.slhaf.partner.api.chat.pojo.ChatResponse; import work.slhaf.partner.api.chat.pojo.ChatResponse;
import work.slhaf.partner.core.cognation.cognation.CognationCapability; import work.slhaf.partner.core.cognation.CognationCapability;
import work.slhaf.partner.core.cognation.submodule.perceive.PerceiveCapability; import work.slhaf.partner.core.submodule.perceive.PerceiveCapability;
import work.slhaf.partner.core.interaction.data.context.InteractionContext; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import work.slhaf.partner.module.modules.perceive.updater.static_extractor.data.StaticMemoryExtractInput; import work.slhaf.partner.module.modules.perceive.updater.static_extractor.data.StaticMemoryExtractInput;
import java.io.IOException; import java.io.IOException;
@@ -18,7 +18,7 @@ import java.util.HashMap;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
public class StaticMemoryExtractor extends AgentRunningSubModule<InteractionContext, HashMap<String, String>> implements ActivateModel { public class StaticMemoryExtractor extends AgentRunningSubModule<PartnerRunningFlowContext, HashMap<String, String>> implements ActivateModel {
private static volatile StaticMemoryExtractor staticMemoryExtractor; private static volatile StaticMemoryExtractor staticMemoryExtractor;
@@ -43,7 +43,7 @@ public class StaticMemoryExtractor extends AgentRunningSubModule<InteractionCont
} }
@Override @Override
public HashMap<String, String> execute(InteractionContext context) { public HashMap<String, String> execute(PartnerRunningFlowContext context) {
StaticMemoryExtractInput input = StaticMemoryExtractInput.builder() StaticMemoryExtractInput input = StaticMemoryExtractInput.builder()
.userId(context.getUserId()) .userId(context.getUserId())
.messages(cognationCapability.getChatMessages()) .messages(cognationCapability.getChatMessages())

View File

@@ -4,16 +4,16 @@ import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
import work.slhaf.partner.core.cognation.cognation.CognationCapability; import work.slhaf.partner.core.cognation.CognationCapability;
import work.slhaf.partner.core.interaction.data.context.InteractionContext; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import work.slhaf.partner.module.common.module.PostModule; import work.slhaf.partner.module.common.module.PostRunningModule;
import java.io.IOException; import java.io.IOException;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Slf4j @Slf4j
@Data @Data
public class PostprocessExecutor extends PostModule { public class PostprocessExecutor extends PostRunningModule {
private static volatile PostprocessExecutor postprocessExecutor; private static volatile PostprocessExecutor postprocessExecutor;
private static final int POST_PROCESS_TRIGGER_ROLL_LIMIT = 36; private static final int POST_PROCESS_TRIGGER_ROLL_LIMIT = 36;
@@ -33,7 +33,7 @@ public class PostprocessExecutor extends PostModule {
} }
@Override @Override
public void execute(InteractionContext context) throws IOException, ClassNotFoundException { public void execute(PartnerRunningFlowContext context) throws IOException, ClassNotFoundException {
boolean trigger = cognationCapability.getChatMessages().size() >= POST_PROCESS_TRIGGER_ROLL_LIMIT; boolean trigger = cognationCapability.getChatMessages().size() >= POST_PROCESS_TRIGGER_ROLL_LIMIT;
context.getModuleContext().getExtraContext().put("post_process_trigger", trigger); context.getModuleContext().getExtraContext().put("post_process_trigger", trigger);
log.debug("[PostprocessExecutor] 是否执行后处理: {}", trigger); log.debug("[PostprocessExecutor] 是否执行后处理: {}", trigger);

View File

@@ -4,12 +4,12 @@ import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityHolder; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityHolder;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
import work.slhaf.partner.core.cognation.cognation.CognationCapability; import work.slhaf.partner.core.cognation.CognationCapability;
import work.slhaf.partner.core.cognation.submodule.perceive.PerceiveCapability; import work.slhaf.partner.core.submodule.perceive.PerceiveCapability;
import work.slhaf.partner.core.cognation.submodule.perceive.pojo.User; import work.slhaf.partner.core.submodule.perceive.pojo.User;
import work.slhaf.partner.core.interaction.data.InteractionInputData; import work.slhaf.partner.runtime.interaction.data.PartnerInputData;
import work.slhaf.partner.core.interaction.data.context.InteractionContext; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import work.slhaf.partner.core.session.SessionManager; import work.slhaf.partner.runtime.session.SessionManager;
import work.slhaf.partner.module.common.entity.AppendPromptData; import work.slhaf.partner.module.common.entity.AppendPromptData;
import java.io.IOException; import java.io.IOException;
@@ -45,7 +45,7 @@ public class PreprocessExecutor {
return preprocessExecutor; return preprocessExecutor;
} }
public InteractionContext execute(InteractionInputData inputData) { public PartnerRunningFlowContext execute(PartnerInputData inputData) {
checkAndSetMemoryId(); checkAndSetMemoryId();
return getInteractionContext(inputData); return getInteractionContext(inputData);
} }
@@ -57,9 +57,9 @@ public class PreprocessExecutor {
} }
} }
private InteractionContext getInteractionContext(InteractionInputData inputData) { private PartnerRunningFlowContext getInteractionContext(PartnerInputData inputData) {
log.debug("[PreprocessExecutor] 预处理原始输入: {}", inputData); log.debug("[PreprocessExecutor] 预处理原始输入: {}", inputData);
InteractionContext context = new InteractionContext(); PartnerRunningFlowContext context = new PartnerRunningFlowContext();
User user = perceiveCapability.getUser(inputData.getUserInfo(), inputData.getPlatform()); User user = perceiveCapability.getUser(inputData.getUserInfo(), inputData.getPlatform());
if (user == null) { if (user == null) {
@@ -67,10 +67,6 @@ public class PreprocessExecutor {
} }
String userId = user.getUuid(); String userId = user.getUuid();
context.setUserId(userId); context.setUserId(userId);
context.setUserNickname(inputData.getUserNickName());
context.setUserInfo(inputData.getUserInfo());
context.setDateTime(inputData.getLocalDateTime());
context.setSingle(inputData.isSingle());
String userStr = "[" + inputData.getUserNickName() + "(" + userId + ")]"; String userStr = "[" + inputData.getUserNickName() + "(" + userId + ")]";
String input = userStr + " " + inputData.getContent(); String input = userStr + " " + inputData.getContent();
@@ -83,7 +79,7 @@ public class PreprocessExecutor {
return context; return context;
} }
private void setAppendedPrompt(InteractionContext context) { private void setAppendedPrompt(PartnerRunningFlowContext context) {
HashMap<String, String> map = new HashMap<>(); HashMap<String, String> map = new HashMap<>();
map.put("text", "这部分才是真正的用户输入内容, 就像你之前收到过的输入一样。但...不会是'同一个人'。"); map.put("text", "这部分才是真正的用户输入内容, 就像你之前收到过的输入一样。但...不会是'同一个人'。");
map.put("datetime", "本次用户输入对应的当前时间"); map.put("datetime", "本次用户输入对应的当前时间");
@@ -97,7 +93,7 @@ public class PreprocessExecutor {
context.setAppendedPrompt(data); context.setAppendedPrompt(data);
} }
private void setCoreContext(InteractionInputData inputData, InteractionContext context, String input, String userId) { private void setCoreContext(PartnerInputData inputData, PartnerRunningFlowContext context, String input, String userId) {
context.getCoreContext().setText(input); context.getCoreContext().setText(input);
context.getCoreContext().setDateTime(LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); context.getCoreContext().setDateTime(LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
context.getCoreContext().setUserNick(inputData.getUserNickName()); context.getCoreContext().setUserNick(inputData.getUserNickName());

View File

@@ -2,8 +2,8 @@ package work.slhaf.partner.module.modules.task;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.core.interaction.data.context.InteractionContext; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import work.slhaf.partner.core.interaction.module.InteractionFlow; import work.slhaf.partner.runtime.interaction.module.InteractionFlow;
@Data @Data
@Slf4j @Slf4j
@@ -22,7 +22,7 @@ public class TaskScheduler implements InteractionFlow {
} }
@Override @Override
public void execute(InteractionContext interactionContext) { public void execute(PartnerRunningFlowContext runningFlowContext) {
} }
} }

View File

@@ -0,0 +1,54 @@
package work.slhaf.partner.runtime.exception;
import lombok.extern.slf4j.Slf4j;
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.AgentRuntimeException;
import work.slhaf.partner.runtime.exception.pojo.GlobalExceptionData;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@Slf4j
public class PartnerExceptionCallback implements AgentExceptionCallback {
private static final String EXCEPTION_SNAPSHOTS_PATH = "./data/exception/snapshots/";
private static final String EXCEPTION_LOG_PATH = "./data/exception/log/";
@Override
public void onRuntimeException(AgentRuntimeException exception) {
GlobalExceptionData exceptionData = new GlobalExceptionData();
Path filePath = Paths.get(EXCEPTION_SNAPSHOTS_PATH, exceptionData.getExceptionTime() + ".dat");
try {
Files.createDirectories(Path.of(EXCEPTION_SNAPSHOTS_PATH));
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath.toFile()));
oos.writeObject(exceptionData);
oos.close();
BufferedWriter logWriter = new BufferedWriter(new FileWriter(EXCEPTION_LOG_PATH + exceptionData.getExceptionTime() + ".log"));
logWriter.write(exception.getMessage());
logWriter.close();
log.warn("[GlobalExceptionHandler] 捕获异常, 状态快照已保存到: {}", filePath);
log.warn("[GlobalExceptionHandler] 捕获异常, 异常日志已保存到: {}", EXCEPTION_LOG_PATH + exceptionData.getExceptionTime() + ".log");
} catch (IOException e) {
log.error("[GlobalExceptionHandler] 捕获异常, 保存失败: ", e);
}
}
@Override
public void onFailedException(AgentLaunchFailedException exception) {
Path filepath = Paths.get(EXCEPTION_LOG_PATH, System.currentTimeMillis() + ".log");
try {
Files.createDirectories(Path.of(EXCEPTION_LOG_PATH));
BufferedWriter logWriter = new BufferedWriter(new FileWriter(EXCEPTION_LOG_PATH + System.currentTimeMillis() + ".log"));
logWriter.write(exception.getMessage());
logWriter.close();
log.warn("[GlobalExceptionHandler] 捕获启动失败异常, 异常日志已保存到: {}", filepath);
} catch (IOException ex) {
log.error("[GlobalExceptionHandler] 捕获启动失败异常, 保存失败: ", ex);
}
}
}

View File

@@ -0,0 +1,26 @@
package work.slhaf.partner.runtime.exception.pojo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.core.cognation.CognationCore;
import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import work.slhaf.partner.runtime.session.SessionManager;
@EqualsAndHashCode(callSuper = true)
@Slf4j
@Data
public class GlobalException extends RuntimeException {
private GlobalExceptionData data;
public GlobalException(String message) {
super(message);
try {
this.data = new GlobalExceptionData();
} catch (Exception e) {
log.error("[GlobalException] 捕获异常, 获取数据失败");
}
}
}

View File

@@ -0,0 +1,26 @@
package work.slhaf.partner.runtime.exception.pojo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.common.entity.PersistableObject;
import work.slhaf.partner.core.cognation.CognationCore;
import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import work.slhaf.partner.runtime.session.SessionManager;
import java.io.Serial;
import java.util.HashMap;
@EqualsAndHashCode(callSuper = true)
@Data
public class GlobalExceptionData extends PersistableObject {
@Serial
private static final long serialVersionUID = 1L;
private String exceptionMessage;
protected HashMap<String, PartnerRunningFlowContext> context = PartnerRunningFlowContext.getInstance();
protected SessionManager sessionManager = SessionManager.getInstance();
protected CognationCore cognationCore = CognationCore.getInstance();
protected Long exceptionTime = System.currentTimeMillis();
}

View File

@@ -0,0 +1,28 @@
package work.slhaf.partner.runtime.interaction;
import work.slhaf.partner.api.agent.runtime.interaction.AgentInteractionAdapter;
import work.slhaf.partner.runtime.interaction.data.PartnerInputData;
import work.slhaf.partner.runtime.interaction.data.PartnerOutputData;
import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
public class PartnerInteractionAdapter extends AgentInteractionAdapter<PartnerInputData, PartnerOutputData, PartnerRunningFlowContext> {
@Override
protected PartnerOutputData parseOutputData(PartnerRunningFlowContext outputContext) {
PartnerOutputData outputData = new PartnerOutputData();
outputData.setCode(outputContext.getOk());
outputData.setContent(outputContext.getCoreResponse().getString("text"));
outputData.setUserInfo(outputContext.getUserInfo());
outputData.setDateTime(outputContext.getDateTime());
return outputData;
}
@Override
protected PartnerRunningFlowContext parseInputData(PartnerInputData inputData) {
PartnerRunningFlowContext context = new PartnerRunningFlowContext();
context.setUserNickname(inputData.getUserNickName());
context.setUserInfo(inputData.getUserInfo());
context.setDateTime(inputData.getDateTime());
context.setSingle(inputData.isSingle());
return context;
}
}

View File

@@ -1,4 +1,4 @@
package work.slhaf.partner.gateway; package work.slhaf.partner.runtime.interaction;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
@@ -8,31 +8,37 @@ import org.java_websocket.WebSocket;
import org.java_websocket.framing.Framedata; import org.java_websocket.framing.Framedata;
import org.java_websocket.handshake.ClientHandshake; import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer; import org.java_websocket.server.WebSocketServer;
import work.slhaf.partner.api.agent.runtime.config.AgentConfigManager;
import work.slhaf.partner.api.agent.runtime.interaction.AgentGateway;
import work.slhaf.partner.api.agent.runtime.interaction.AgentInteractionAdapter;
import work.slhaf.partner.common.config.PartnerAgentConfigManager;
import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor; import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor;
import work.slhaf.partner.core.interaction.agent_interface.InputReceiver; import work.slhaf.partner.runtime.interaction.data.PartnerInputData;
import work.slhaf.partner.core.interaction.data.InteractionInputData; import work.slhaf.partner.runtime.interaction.data.PartnerOutputData;
import work.slhaf.partner.core.interaction.data.InteractionOutputData; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import java.io.IOException;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@Slf4j @Slf4j
public class AgentWebSocketServer extends WebSocketServer implements MessageSender { public class WebSocketGateway extends WebSocketServer implements AgentGateway<PartnerInputData, PartnerOutputData, PartnerRunningFlowContext> {
private static final long HEARTBEAT_INTERVAL = 10_000; private static final long HEARTBEAT_INTERVAL = 10_000;
@ToString.Exclude @ToString.Exclude
private final InputReceiver receiver;
private final ConcurrentHashMap<String, WebSocket> userSessions = new ConcurrentHashMap<>(); private final ConcurrentHashMap<String, WebSocket> userSessions = new ConcurrentHashMap<>();
private final InteractionThreadPoolExecutor executor; private final InteractionThreadPoolExecutor executor;
// 记录最后一次收到Pong的时间 // 记录最后一次收到Pong的时间
private final ConcurrentHashMap<WebSocket, Long> lastPongTimes = new ConcurrentHashMap<>(); private final ConcurrentHashMap<WebSocket, Long> lastPongTimes = new ConcurrentHashMap<>();
public AgentWebSocketServer(int port, InputReceiver receiver) { public static WebSocketGateway initialize() {
PartnerAgentConfigManager configManager = (PartnerAgentConfigManager) AgentConfigManager.INSTANCE;
return new WebSocketGateway(configManager.getConfig().getPort());
}
private WebSocketGateway(int port) {
super(new InetSocketAddress(port)); super(new InetSocketAddress(port));
this.receiver = receiver;
this.executor = InteractionThreadPoolExecutor.getInstance(); this.executor = InteractionThreadPoolExecutor.getInstance();
} }
@@ -42,10 +48,26 @@ public class AgentWebSocketServer extends WebSocketServer implements MessageSend
startHeartbeatThread(); startHeartbeatThread();
} }
@Override
public void send(PartnerOutputData outputData) {
userSessions.forEach((userInfo, webSocket) -> {
if (webSocket.isOpen()) {
webSocket.send(JSONUtil.toJsonStr(outputData));
} else {
log.warn("用户不在线: {}", userInfo);
}
});
}
@Override
public AgentInteractionAdapter<PartnerInputData, PartnerOutputData, PartnerRunningFlowContext> adapter() {
return new PartnerInteractionAdapter();
}
private void startHeartbeatThread() { private void startHeartbeatThread() {
executor.execute(() -> { executor.execute(() -> {
while (!Thread.interrupted()){ while (!Thread.interrupted()) {
try{ try {
Thread.sleep(HEARTBEAT_INTERVAL); Thread.sleep(HEARTBEAT_INTERVAL);
checkConnections(); checkConnections();
} catch (InterruptedException e) { } catch (InterruptedException e) {
@@ -105,13 +127,9 @@ public class AgentWebSocketServer extends WebSocketServer implements MessageSend
@Override @Override
public void onMessage(WebSocket webSocket, String s) { public void onMessage(WebSocket webSocket, String s) {
InteractionInputData inputData = JSONObject.parseObject(s, InteractionInputData.class); PartnerInputData inputData = JSONObject.parseObject(s, PartnerInputData.class);
userSessions.put(inputData.getUserInfo(), webSocket); // 注册连接 userSessions.put(inputData.getUserInfo(), webSocket); // 注册连接
try { receive(inputData);
receiver.receiveInput(inputData);
} catch (IOException | ClassNotFoundException e) {
throw new RuntimeException(e);
}
} }
@Override @Override
@@ -124,13 +142,4 @@ public class AgentWebSocketServer extends WebSocketServer implements MessageSend
log.info("WebSocketServer 已启动..."); log.info("WebSocketServer 已启动...");
} }
@Override
public void sendMessage(InteractionOutputData outputData) {
WebSocket webSocket = userSessions.get(outputData.getUserInfo());
if (webSocket != null && webSocket.isOpen()) {
webSocket.send(JSONUtil.toJsonStr(outputData));
} else {
log.warn("用户不在线: {}", outputData.getUserInfo());
}
}
} }

View File

@@ -0,0 +1,13 @@
package work.slhaf.partner.runtime.interaction.data;
import lombok.Data;
import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.agent.runtime.interaction.data.AgentInputData;
@EqualsAndHashCode(callSuper = true)
@Data
public class PartnerInputData extends AgentInputData {
private String userNickName;
private String platform;
private boolean single;
}

View File

@@ -0,0 +1,12 @@
package work.slhaf.partner.runtime.interaction.data;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.agent.runtime.interaction.data.AgentOutputData;
@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
public class PartnerOutputData extends AgentOutputData {
}

View File

@@ -1,11 +1,11 @@
package work.slhaf.partner.core.interaction.data.context; package work.slhaf.partner.runtime.interaction.data.context;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.common.entity.PersistableObject; import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext;
import work.slhaf.partner.core.interaction.data.context.subcontext.CoreContext; import work.slhaf.partner.runtime.interaction.data.context.subcontext.CoreContext;
import work.slhaf.partner.core.interaction.data.context.subcontext.ModuleContext; import work.slhaf.partner.runtime.interaction.data.context.subcontext.ModuleContext;
import work.slhaf.partner.module.common.entity.AppendPromptData; import work.slhaf.partner.module.common.entity.AppendPromptData;
import java.io.Serial; import java.io.Serial;
@@ -15,12 +15,12 @@ import java.util.List;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
public class InteractionContext extends PersistableObject { public class PartnerRunningFlowContext extends RunningFlowContext {
@Serial @Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static HashMap<String, InteractionContext> activeContext = new HashMap<>(); private static HashMap<String, PartnerRunningFlowContext> activeContext = new HashMap<>();
protected String userId; protected String userId;
protected String userNickname; protected String userNickname;
@@ -34,7 +34,7 @@ public class InteractionContext extends PersistableObject {
protected ModuleContext moduleContext = new ModuleContext(); protected ModuleContext moduleContext = new ModuleContext();
protected JSONObject coreResponse = new JSONObject(); protected JSONObject coreResponse = new JSONObject();
public InteractionContext() { public PartnerRunningFlowContext() {
activeContext.put(userId, this); activeContext.put(userId, this);
} }
@@ -51,7 +51,7 @@ public class InteractionContext extends PersistableObject {
appendPromptList.addFirst(appendedPrompt); appendPromptList.addFirst(appendedPrompt);
} }
public static HashMap<String, InteractionContext> getInstance() { public static HashMap<String, PartnerRunningFlowContext> getInstance() {
return activeContext; return activeContext;
} }

View File

@@ -1,4 +1,4 @@
package work.slhaf.partner.core.interaction.data.context.subcontext; package work.slhaf.partner.runtime.interaction.data.context.subcontext;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import lombok.Data; import lombok.Data;

View File

@@ -1,4 +1,4 @@
package work.slhaf.partner.core.interaction.data.context.subcontext; package work.slhaf.partner.runtime.interaction.data.context.subcontext;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import lombok.Data; import lombok.Data;

View File

@@ -1,13 +1,15 @@
package work.slhaf.partner.core.session; package work.slhaf.partner.runtime.session;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.api.agent.runtime.config.AgentConfigManager;
import work.slhaf.partner.api.chat.pojo.Message; import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.api.chat.pojo.MetaMessage; import work.slhaf.partner.api.chat.pojo.MetaMessage;
import work.slhaf.partner.api.common.entity.PersistableObject; import work.slhaf.partner.api.common.entity.PersistableObject;
import work.slhaf.partner.common.config.Config; import work.slhaf.partner.common.config.PartnerAgentConfigManager;
import work.slhaf.partner.common.exception.ServiceLoadFailedException;
import java.io.*; import java.io.*;
import java.nio.file.Files; import java.nio.file.Files;
@@ -35,14 +37,17 @@ public class SessionManager extends PersistableObject {
private String currentMemoryId; private String currentMemoryId;
private long lastUpdatedTime; private long lastUpdatedTime;
public static SessionManager getInstance() throws IOException, ClassNotFoundException { public static SessionManager getInstance() {
if (sessionManager == null) { if (sessionManager == null) {
synchronized (SessionManager.class) { synchronized (SessionManager.class) {
if (sessionManager == null) { if (sessionManager == null) {
String id = Config.getConfig().getAgentId(); String id = ((PartnerAgentConfigManager) AgentConfigManager.INSTANCE).getConfig().getAgentId();
Path filePath = Paths.get(STORAGE_DIR, id + ".session"); Path filePath = Paths.get(STORAGE_DIR, id + ".session");
if (Files.exists(filePath)) { if (Files.exists(filePath)) {
sessionManager = deserialize(id); sessionManager = deserialize(id);
if (sessionManager == null){
throw new ServiceLoadFailedException("SessionManager 加载失败");
}
} else { } else {
sessionManager = new SessionManager(); sessionManager = new SessionManager();
sessionManager.setSingleMetaMessageMap(new HashMap<>()); sessionManager.setSingleMetaMessageMap(new HashMap<>());
@@ -109,12 +114,15 @@ public class SessionManager extends PersistableObject {
} }
} }
private static SessionManager deserialize(String id) throws IOException, ClassNotFoundException { private static SessionManager deserialize(String id) {
Path filePath = getFilePath(id); Path filePath = getFilePath(id);
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath.toFile()))) { try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath.toFile()))) {
SessionManager sessionManager = (SessionManager) ois.readObject(); SessionManager sessionManager = (SessionManager) ois.readObject();
log.info("[SessionManager] SessionManager 已从文件加载: {}", filePath); log.info("[SessionManager] SessionManager 已从文件加载: {}", filePath);
return sessionManager; return sessionManager;
}catch (IOException | ClassNotFoundException e) {
log.error("[SessionManager] 读取异常, 读取失败: ", e);
return null;
} }
} }

View File

@@ -1,6 +1,6 @@
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import work.slhaf.partner.core.cognation.common.pojo.MemoryResult; import work.slhaf.partner.core.common.pojo.MemoryResult;
import work.slhaf.partner.core.cognation.submodule.memory.MemoryCapability; import work.slhaf.partner.core.submodule.memory.MemoryCapability;
import java.lang.reflect.Proxy; import java.lang.reflect.Proxy;
import java.util.function.Function; import java.util.function.Function;

View File

@@ -4,7 +4,6 @@ import work.slhaf.partner.api.chat.ChatClient;
import work.slhaf.partner.api.chat.constant.ChatConstant; import work.slhaf.partner.api.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.ChatResponse; import work.slhaf.partner.api.chat.pojo.ChatResponse;
import work.slhaf.partner.api.chat.pojo.Message; import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.common.config.ModelConfig;
import work.slhaf.partner.common.util.ResourcesUtil; import work.slhaf.partner.common.util.ResourcesUtil;
import work.slhaf.partner.module.common.model.ModelConstant; import work.slhaf.partner.module.common.model.ModelConstant;
import work.slhaf.partner.module.modules.memory.selector.extractor.data.ExtractorInput; import work.slhaf.partner.module.modules.memory.selector.extractor.data.ExtractorInput;
@@ -67,10 +66,9 @@ public class SelfAwarenessTest {
private static ChatClient getChatClient(String modelKey) { private static ChatClient getChatClient(String modelKey) {
ModelConfig coreModel = ModelConfig.load(modelKey); String model = "";
String model = coreModel.getModel(); String baseUrl = "";
String baseUrl = coreModel.getBaseUrl(); String apikey = "";
String apikey = coreModel.getApikey();
ChatClient chatClient = new ChatClient(baseUrl, apikey, model); ChatClient chatClient = new ChatClient(baseUrl, apikey, model);
chatClient.setTop_p(0.7); chatClient.setTop_p(0.7);
chatClient.setTemperature(0.35); chatClient.setTemperature(0.35);

View File

@@ -1,25 +1,8 @@
package work.slhaf.demo; package work.slhaf.demo;
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 class AgentDemoApplication {
public static void main(String[] args) { public static void main(String[] args) {
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();
}
} }

View File

@@ -1,15 +0,0 @@
import org.junit.jupiter.api.Test;
import work.slhaf.demo.ability.CacheCapability;
import work.slhaf.demo.capability.annotation.InjectCapability;
public class FunctionRouterTest {
@InjectCapability
private CacheCapability cache;
@Test
public void test(){
cache.getUserDialogMapStr("123",111);
}
}

View File

@@ -0,0 +1,9 @@
public class TestA {
public static void main(String[] args) {
try {
int a = 1 / 0;
}catch (Exception ignore) {
}
System.out.println("111");
}
}