进行 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

View File

@@ -1,14 +1,16 @@
package work.slhaf;
import work.slhaf.partner.Agent;
import java.io.IOException;
import java.util.Scanner;
import work.slhaf.partner.api.agent.Agent;
import work.slhaf.partner.common.config.PartnerAgentConfigManager;
import work.slhaf.partner.runtime.exception.PartnerExceptionCallback;
import work.slhaf.partner.runtime.interaction.WebSocketGateway;
public class Main {
public static void main(String[] args) throws IOException {
Agent.initialize();
Scanner scanner = new Scanner(System.in);
while (!scanner.nextLine().equals("exit")) ;
public static void main(String[] args) {
Agent.newAgent(Main.class)
.setGateway(WebSocketGateway.initialize())
.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;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSONArray;
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
@Slf4j
public class Config {
private static final String CONFIG_FILE_PATH = "./config/config.json";
private static final String LOG_FILE_PATH = "./data/log";
private static Config config;
private int port;
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 work.slhaf.partner.common.exception_handler.pojo.GlobalException;
import work.slhaf.partner.common.exception_handler.pojo.GlobalExceptionData;
import work.slhaf.partner.runtime.exception.pojo.GlobalException;
import work.slhaf.partner.runtime.exception.pojo.GlobalExceptionData;
import java.io.*;
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.extern.slf4j.Slf4j;
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.chat.constant.ChatConstant;
import work.slhaf.partner.common.exception_handler.GlobalExceptionHandler;
import work.slhaf.partner.common.exception_handler.pojo.GlobalException;
import work.slhaf.partner.core.cognation.cognation.CognationCore;
import work.slhaf.partner.core.cognation.common.pojo.MemoryResult;
import work.slhaf.partner.core.cognation.common.pojo.MemorySliceResult;
import work.slhaf.partner.core.cognation.submodule.cache.CacheCore;
import work.slhaf.partner.core.cognation.submodule.dispatch.DispatchCore;
import work.slhaf.partner.core.cognation.submodule.memory.MemoryCore;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.MemorySlice;
import work.slhaf.partner.core.cognation.submodule.perceive.PerceiveCore;
import work.slhaf.partner.common.exception.callback.GlobalExceptionHandler;
import work.slhaf.partner.runtime.exception.pojo.GlobalException;
import work.slhaf.partner.core.cognation.CognationCore;
import work.slhaf.partner.core.common.pojo.MemoryResult;
import work.slhaf.partner.core.common.pojo.MemorySliceResult;
import work.slhaf.partner.core.submodule.cache.CacheCore;
import work.slhaf.partner.core.submodule.dispatch.DispatchCore;
import work.slhaf.partner.core.submodule.memory.MemoryCore;
import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice;
import work.slhaf.partner.core.submodule.perceive.PerceiveCore;
import java.io.IOException;
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.CapabilityMethod;
import work.slhaf.partner.api.agent.factory.capability.annotation.ToCoordinated;
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.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.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.chat.pojo.Message;
import work.slhaf.partner.api.common.entity.PersistableObject;
import work.slhaf.partner.core.cognation.cognation.pojo.ActiveData;
import work.slhaf.partner.core.cognation.submodule.cache.CacheCore;
import work.slhaf.partner.core.cognation.submodule.memory.MemoryCore;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.EvaluatedSlice;
import work.slhaf.partner.core.cognation.submodule.perceive.PerceiveCore;
import work.slhaf.partner.core.cognation.pojo.ActiveData;
import work.slhaf.partner.core.submodule.cache.CacheCore;
import work.slhaf.partner.core.submodule.memory.MemoryCore;
import work.slhaf.partner.core.submodule.memory.pojo.EvaluatedSlice;
import work.slhaf.partner.core.submodule.perceive.PerceiveCore;
import java.io.*;
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 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 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.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.EqualsAndHashCode;
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.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 lombok.Data;
import lombok.EqualsAndHashCode;
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;

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;

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.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.CapabilityMethod;
import work.slhaf.partner.api.common.entity.PersistableObject;
import work.slhaf.partner.core.cognation.common.pojo.MemoryResult;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.MemorySlice;
import work.slhaf.partner.core.common.pojo.MemoryResult;
import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice;
import java.io.Serial;
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.core.cognation.submodule.dispatch.pojo.DispatchData;
import work.slhaf.partner.core.submodule.dispatch.pojo.DispatchData;
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;

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.ToCoordinated;
import work.slhaf.partner.core.cognation.common.pojo.MemoryResult;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.MemorySlice;
import work.slhaf.partner.core.common.pojo.MemoryResult;
import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice;
import java.io.IOException;
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.EqualsAndHashCode;
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.common.entity.PersistableObject;
import work.slhaf.partner.core.cognation.common.pojo.MemoryResult;
import work.slhaf.partner.core.cognation.common.pojo.MemorySliceResult;
import work.slhaf.partner.core.cognation.submodule.memory.exception.UnExistedDateIndexException;
import work.slhaf.partner.core.cognation.submodule.memory.exception.UnExistedTopicException;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.MemorySlice;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.node.MemoryNode;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.node.TopicNode;
import work.slhaf.partner.core.common.pojo.MemoryResult;
import work.slhaf.partner.core.common.pojo.MemorySliceResult;
import work.slhaf.partner.core.submodule.memory.exception.UnExistedDateIndexException;
import work.slhaf.partner.core.submodule.memory.exception.UnExistedTopicException;
import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice;
import work.slhaf.partner.core.submodule.memory.pojo.node.MemoryNode;
import work.slhaf.partner.core.submodule.memory.pojo.node.TopicNode;
import java.io.IOException;
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 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 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 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.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.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.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.api.common.entity.PersistableObject;
import work.slhaf.partner.core.cognation.submodule.memory.exception.NullSliceListException;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.MemorySlice;
import work.slhaf.partner.core.submodule.memory.exception.NullSliceListException;
import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice;
import java.io.*;
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.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.core.cognation.submodule.perceive.pojo.User;
import work.slhaf.partner.core.submodule.perceive.pojo.User;
@Capability(value = "perceive")
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.EqualsAndHashCode;
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.common.entity.PersistableObject;
import work.slhaf.partner.core.cognation.cognation.exception.UserNotExistsException;
import work.slhaf.partner.core.cognation.submodule.perceive.pojo.User;
import work.slhaf.partner.core.cognation.exception.UserNotExistsException;
import work.slhaf.partner.core.submodule.perceive.pojo.User;
import java.io.Serial;
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.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;
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 java.util.HashMap;
@@ -8,8 +9,8 @@ import java.util.HashMap;
/**
* 前置模块抽象类
*/
public abstract class PreModule extends InteractionModule {
protected void setAppendedPrompt(InteractionContext context) {
public abstract class PreRunningModule extends AgentRunningModule<PartnerRunningFlowContext> {
protected void setAppendedPrompt(PartnerRunningFlowContext context) {
AppendPromptData data = new AppendPromptData();
data.setModuleName(moduleName());
HashMap<String, String> map = getPromptDataMap(context.getUserId());
@@ -17,7 +18,7 @@ public abstract class PreModule extends InteractionModule {
context.getModuleContext().getAppendedPrompt().add(data);
}
protected void setActiveModule(InteractionContext context) {
protected void setActiveModule(PartnerRunningFlowContext context) {
context.getCoreContext().addActiveModule(moduleName());
}

View File

@@ -5,17 +5,19 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
import work.slhaf.partner.api.agent.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.chat.constant.ChatConstant;
import work.slhaf.partner.api.chat.pojo.ChatResponse;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.api.chat.pojo.MetaMessage;
import work.slhaf.partner.core.cognation.cognation.CognationCapability;
import work.slhaf.partner.core.interaction.data.context.InteractionContext;
import work.slhaf.partner.core.session.SessionManager;
import work.slhaf.partner.core.cognation.CognationCapability;
import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import work.slhaf.partner.runtime.session.SessionManager;
import work.slhaf.partner.module.common.entity.AppendPromptData;
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.time.LocalDateTime;
@@ -28,33 +30,21 @@ import static work.slhaf.partner.common.util.ExtractUtil.extractJson;
@EqualsAndHashCode(callSuper = true)
@Data
@Slf4j
public class CoreModel extends CoreModule implements ActivateModel {
private static volatile CoreModel coreModel;
@CoreModule
public class CoreModel extends CoreRunningModule implements ActivateModel {
@InjectCapability
private CognationCapability cognationCapability;
private SessionManager sessionManager;
private List<Message> appendedMessages;
private CoreModel() {
modelSettings();
}
public static CoreModel getInstance() throws IOException, ClassNotFoundException {
if (coreModel == null) {
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注册完毕...");
}
}
}
return coreModel;
@Init
public void init(){
List<Message> chatMessages = this.cognationCapability.getChatMessages();
this.getModel().setChatMessages(chatMessages);
this.appendedMessages = new ArrayList<>();
this.sessionManager = SessionManager.getInstance();
log.info("[CoreModel] CoreModel注册完毕...");
}
@Override
@@ -74,21 +64,34 @@ public class CoreModel extends CoreModule implements ActivateModel {
}
@Override
public void execute(InteractionContext interactionContext) {
String userId = interactionContext.getUserId();
public void execute(PartnerRunningFlowContext runningFlowContext) {
String userId = runningFlowContext.getUserId();
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);
if (appendedPromptSize > 0) {
setAppendedPromptMessage(appendedPrompt);
}
activateModule(interactionContext);
setMessageCount(interactionContext);
}
log.debug("[CoreModel] 当前消息列表大小: {}", chatMessages().size());
log.debug("[CoreModel] 当前核心prompt内容: {}", interactionContext.getCoreContext().toString());
setMessage(interactionContext.getCoreContext().toString());
private void executeChat(PartnerRunningFlowContext runningFlowContext) {
JSONObject response = new JSONObject();
int count = 0;
@@ -102,7 +105,7 @@ public class CoreModel extends CoreModule implements ActivateModel {
handleExceptionResponse(response, chatResponse.getMessage());
}
log.debug("[CoreModel] CoreModel 响应内容: {}", response);
updateModuleContextAndChatMessages(interactionContext, response.getString("text"), chatResponse);
updateModuleContextAndChatMessages(runningFlowContext, response.getString("text"), chatResponse);
break;
} catch (Exception e) {
count++;
@@ -113,12 +116,11 @@ public class CoreModel extends CoreModule implements ActivateModel {
break;
}
} finally {
updateCoreResponse(interactionContext, response);
updateCoreResponse(runningFlowContext, response);
resetAppendedMessages();
log.debug("[CoreModel] 消息列表更新大小: {}", chatMessages().size());
}
}
log.debug("[CoreModel] 主对话流程({})结束...", userId);
}
private int getAppendedPromptSize(List<AppendPromptData> appendedPrompt) {
@@ -129,15 +131,15 @@ public class CoreModel extends CoreModule implements ActivateModel {
return size;
}
private void activateModule(InteractionContext context) {
private void activateModule(PartnerRunningFlowContext context) {
for (AppendPromptData data : context.getModuleContext().getAppendedPrompt()) {
if (data.getAppendedPrompt().isEmpty()) continue;
context.getCoreContext().activateModule(data.getModuleName());
}
}
private void updateCoreResponse(InteractionContext interactionContext, JSONObject response) {
interactionContext.getCoreResponse().put("text", response.getString("text"));
private void updateCoreResponse(PartnerRunningFlowContext runningFlowContext, JSONObject response) {
runningFlowContext.getCoreResponse().put("text", response.getString("text"));
}
private void resetAppendedMessages() {
@@ -153,7 +155,7 @@ public class CoreModel extends CoreModule implements ActivateModel {
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();
chatMessages().removeIf(m -> {
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]"));
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);
Message assistantMessage = new Message(ChatConstant.Character.ASSISTANT, response);
chatMessages().add(assistantMessage);
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);
sessionManager.addMetaMessage(interactionContext.getUserId(), metaMessage);
sessionManager.addMetaMessage(runningFlowContext.getUserId(), metaMessage);
}
}
@@ -192,8 +194,8 @@ public class CoreModel extends CoreModule implements ActivateModel {
// interactionContext.setFinished(true);
}
private void setMessageCount(InteractionContext interactionContext) {
interactionContext.getModuleContext().getExtraContext().put("message_count", chatMessages().size());
private void setMessageCount(PartnerRunningFlowContext runningFlowContext) {
runningFlowContext.getModuleContext().getExtraContext().put("message_count", chatMessages().size());
}
private void setAppendedPromptMessage(List<AppendPromptData> appendPrompt) {

View File

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

View File

@@ -3,7 +3,7 @@ package work.slhaf.partner.module.modules.memory.selector.evaluator.data;
import lombok.Builder;
import lombok.Data;
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;

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.chat.pojo.Message;
import work.slhaf.partner.api.chat.pojo.MetaMessage;
import work.slhaf.partner.common.exception_handler.GlobalExceptionHandler;
import work.slhaf.partner.common.exception_handler.pojo.GlobalException;
import work.slhaf.partner.core.cognation.cognation.CognationCapability;
import work.slhaf.partner.core.cognation.submodule.memory.MemoryCapability;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.EvaluatedSlice;
import work.slhaf.partner.core.interaction.data.context.InteractionContext;
import work.slhaf.partner.core.session.SessionManager;
import work.slhaf.partner.common.exception.callback.GlobalExceptionHandler;
import work.slhaf.partner.runtime.exception.pojo.GlobalException;
import work.slhaf.partner.core.cognation.CognationCapability;
import work.slhaf.partner.core.submodule.memory.MemoryCapability;
import work.slhaf.partner.core.submodule.memory.pojo.EvaluatedSlice;
import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
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.ExtractorMatchData;
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)
@Data
@Slf4j
public class MemorySelectExtractor extends AgentRunningSubModule<InteractionContext, ExtractorResult> implements ActivateModel {
public class MemorySelectExtractor extends AgentRunningSubModule<PartnerRunningFlowContext, ExtractorResult> implements ActivateModel {
private static volatile MemorySelectExtractor memorySelectExtractor;
@@ -58,7 +58,7 @@ public class MemorySelectExtractor extends AgentRunningSubModule<InteractionCont
}
@Override
public ExtractorResult execute(InteractionContext context) {
public ExtractorResult execute(PartnerRunningFlowContext context) {
log.debug("[MemorySelectExtractor] 主题提取模块开始...");
//结构化为指定格式
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.Data;
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.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.pojo.Message;
import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor;
import work.slhaf.partner.core.cognation.cognation.CognationCapability;
import work.slhaf.partner.core.cognation.submodule.cache.CacheCapability;
import work.slhaf.partner.core.cognation.submodule.memory.MemoryCapability;
import work.slhaf.partner.core.cognation.submodule.memory.pojo.MemorySlice;
import work.slhaf.partner.core.cognation.submodule.perceive.PerceiveCapability;
import work.slhaf.partner.core.interaction.data.context.InteractionContext;
import work.slhaf.partner.core.session.SessionManager;
import work.slhaf.partner.module.common.module.PostModule;
import work.slhaf.partner.core.cognation.CognationCapability;
import work.slhaf.partner.core.submodule.cache.CacheCapability;
import work.slhaf.partner.core.submodule.memory.MemoryCapability;
import work.slhaf.partner.core.submodule.memory.pojo.MemorySlice;
import work.slhaf.partner.core.submodule.perceive.PerceiveCapability;
import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import work.slhaf.partner.runtime.session.SessionManager;
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.updater.summarizer.MemorySummarizer;
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)
@Data
@Slf4j
public class MemoryUpdater extends PostModule {
public class MemoryUpdater extends PostRunningModule {
private static volatile MemoryUpdater memoryUpdater;
@@ -100,7 +100,7 @@ public class MemoryUpdater extends PostModule {
}
@Override
public void execute(InteractionContext context) {
public void execute(PartnerRunningFlowContext context) {
if (context.isFinished()) {
log.warn("[MemoryUpdater] 流程强制结束, 不触发记忆被动更新机制");
return;

View File

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

View File

@@ -1,15 +1,13 @@
package work.slhaf.partner.module.modules.perceive.updater;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor;
import work.slhaf.partner.core.cognation.cognation.CognationCapability;
import work.slhaf.partner.core.cognation.submodule.perceive.PerceiveCapability;
import work.slhaf.partner.core.cognation.submodule.perceive.pojo.User;
import work.slhaf.partner.core.interaction.data.context.InteractionContext;
import work.slhaf.partner.module.common.module.PostModule;
import work.slhaf.partner.core.cognation.CognationCapability;
import work.slhaf.partner.core.submodule.perceive.PerceiveCapability;
import work.slhaf.partner.core.submodule.perceive.pojo.User;
import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
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.static_extractor.StaticMemoryExtractor;
@@ -24,10 +22,9 @@ import java.util.concurrent.locks.ReentrantLock;
/**
* 感知更新,异步
*/
@EqualsAndHashCode(callSuper = true)
@Slf4j
@Data
public class PerceiveUpdater extends PostModule {
public class PerceiveUpdater {
private static volatile PerceiveUpdater perceiveUpdater;
@@ -54,8 +51,7 @@ public class PerceiveUpdater extends PostModule {
return perceiveUpdater;
}
@Override
public void execute(InteractionContext context) throws IOException, ClassNotFoundException {
public void execute(PartnerRunningFlowContext context) throws IOException, ClassNotFoundException {
executor.execute(() -> {
boolean trigger = context.getModuleContext().getExtraContext().getBoolean("perceive_updater");
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);
userLock.lock();
user.setRelation(relationExtractResult.getRelation());
@@ -88,7 +84,7 @@ public class PerceiveUpdater extends PostModule {
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);
userLock.lock();
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.chat.pojo.ChatResponse;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.cognation.cognation.CognationCapability;
import work.slhaf.partner.core.cognation.submodule.perceive.PerceiveCapability;
import work.slhaf.partner.core.cognation.submodule.perceive.pojo.User;
import work.slhaf.partner.core.interaction.data.context.InteractionContext;
import work.slhaf.partner.core.cognation.CognationCapability;
import work.slhaf.partner.core.submodule.perceive.PerceiveCapability;
import work.slhaf.partner.core.submodule.perceive.pojo.User;
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.RelationExtractResult;
@@ -21,7 +21,7 @@ import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class RelationExtractor extends AgentRunningSubModule<InteractionContext, RelationExtractResult> implements ActivateModel {
public class RelationExtractor extends AgentRunningSubModule<PartnerRunningFlowContext, RelationExtractResult> implements ActivateModel {
private static volatile RelationExtractor relationExtractor;
@@ -45,7 +45,7 @@ public class RelationExtractor extends AgentRunningSubModule<InteractionContext,
}
@Override
public RelationExtractResult execute(InteractionContext context){
public RelationExtractResult execute(PartnerRunningFlowContext context){
tempMessages = new ArrayList<>(cognationCapability.getChatMessages());
String userId = context.getUserId();
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.setUuid(context.getUserId());
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.AgentRunningSubModule;
import work.slhaf.partner.api.chat.pojo.ChatResponse;
import work.slhaf.partner.core.cognation.cognation.CognationCapability;
import work.slhaf.partner.core.cognation.submodule.perceive.PerceiveCapability;
import work.slhaf.partner.core.interaction.data.context.InteractionContext;
import work.slhaf.partner.core.cognation.CognationCapability;
import work.slhaf.partner.core.submodule.perceive.PerceiveCapability;
import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import work.slhaf.partner.module.modules.perceive.updater.static_extractor.data.StaticMemoryExtractInput;
import java.io.IOException;
@@ -18,7 +18,7 @@ import java.util.HashMap;
@EqualsAndHashCode(callSuper = true)
@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;
@@ -43,7 +43,7 @@ public class StaticMemoryExtractor extends AgentRunningSubModule<InteractionCont
}
@Override
public HashMap<String, String> execute(InteractionContext context) {
public HashMap<String, String> execute(PartnerRunningFlowContext context) {
StaticMemoryExtractInput input = StaticMemoryExtractInput.builder()
.userId(context.getUserId())
.messages(cognationCapability.getChatMessages())

View File

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

View File

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

View File

@@ -2,8 +2,8 @@ package work.slhaf.partner.module.modules.task;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.core.interaction.data.context.InteractionContext;
import work.slhaf.partner.core.interaction.module.InteractionFlow;
import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import work.slhaf.partner.runtime.interaction.module.InteractionFlow;
@Data
@Slf4j
@@ -22,7 +22,7 @@ public class TaskScheduler implements InteractionFlow {
}
@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 com.alibaba.fastjson2.JSONObject;
@@ -8,31 +8,37 @@ import org.java_websocket.WebSocket;
import org.java_websocket.framing.Framedata;
import org.java_websocket.handshake.ClientHandshake;
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.core.interaction.agent_interface.InputReceiver;
import work.slhaf.partner.core.interaction.data.InteractionInputData;
import work.slhaf.partner.core.interaction.data.InteractionOutputData;
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;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.concurrent.ConcurrentHashMap;
@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;
@ToString.Exclude
private final InputReceiver receiver;
private final ConcurrentHashMap<String, WebSocket> userSessions = new ConcurrentHashMap<>();
private final InteractionThreadPoolExecutor executor;
// 记录最后一次收到Pong的时间
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));
this.receiver = receiver;
this.executor = InteractionThreadPoolExecutor.getInstance();
}
@@ -42,10 +48,26 @@ public class AgentWebSocketServer extends WebSocketServer implements MessageSend
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() {
executor.execute(() -> {
while (!Thread.interrupted()){
try{
while (!Thread.interrupted()) {
try {
Thread.sleep(HEARTBEAT_INTERVAL);
checkConnections();
} catch (InterruptedException e) {
@@ -105,13 +127,9 @@ public class AgentWebSocketServer extends WebSocketServer implements MessageSend
@Override
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); // 注册连接
try {
receiver.receiveInput(inputData);
} catch (IOException | ClassNotFoundException e) {
throw new RuntimeException(e);
}
receive(inputData);
}
@Override
@@ -124,13 +142,4 @@ public class AgentWebSocketServer extends WebSocketServer implements MessageSend
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 lombok.Data;
import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.common.entity.PersistableObject;
import work.slhaf.partner.core.interaction.data.context.subcontext.CoreContext;
import work.slhaf.partner.core.interaction.data.context.subcontext.ModuleContext;
import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext;
import work.slhaf.partner.runtime.interaction.data.context.subcontext.CoreContext;
import work.slhaf.partner.runtime.interaction.data.context.subcontext.ModuleContext;
import work.slhaf.partner.module.common.entity.AppendPromptData;
import java.io.Serial;
@@ -15,12 +15,12 @@ import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class InteractionContext extends PersistableObject {
public class PartnerRunningFlowContext extends RunningFlowContext {
@Serial
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 userNickname;
@@ -34,7 +34,7 @@ public class InteractionContext extends PersistableObject {
protected ModuleContext moduleContext = new ModuleContext();
protected JSONObject coreResponse = new JSONObject();
public InteractionContext() {
public PartnerRunningFlowContext() {
activeContext.put(userId, this);
}
@@ -51,7 +51,7 @@ public class InteractionContext extends PersistableObject {
appendPromptList.addFirst(appendedPrompt);
}
public static HashMap<String, InteractionContext> getInstance() {
public static HashMap<String, PartnerRunningFlowContext> getInstance() {
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 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 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 lombok.Data;
import lombok.EqualsAndHashCode;
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.MetaMessage;
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.nio.file.Files;
@@ -35,14 +37,17 @@ public class SessionManager extends PersistableObject {
private String currentMemoryId;
private long lastUpdatedTime;
public static SessionManager getInstance() throws IOException, ClassNotFoundException {
public static SessionManager getInstance() {
if (sessionManager == null) {
synchronized (SessionManager.class) {
if (sessionManager == null) {
String id = Config.getConfig().getAgentId();
String id = ((PartnerAgentConfigManager) AgentConfigManager.INSTANCE).getConfig().getAgentId();
Path filePath = Paths.get(STORAGE_DIR, id + ".session");
if (Files.exists(filePath)) {
sessionManager = deserialize(id);
if (sessionManager == null){
throw new ServiceLoadFailedException("SessionManager 加载失败");
}
} else {
sessionManager = new SessionManager();
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);
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath.toFile()))) {
SessionManager sessionManager = (SessionManager) ois.readObject();
log.info("[SessionManager] SessionManager 已从文件加载: {}", filePath);
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 work.slhaf.partner.core.cognation.common.pojo.MemoryResult;
import work.slhaf.partner.core.cognation.submodule.memory.MemoryCapability;
import work.slhaf.partner.core.common.pojo.MemoryResult;
import work.slhaf.partner.core.submodule.memory.MemoryCapability;
import java.lang.reflect.Proxy;
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.pojo.ChatResponse;
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.module.common.model.ModelConstant;
import work.slhaf.partner.module.modules.memory.selector.extractor.data.ExtractorInput;
@@ -67,10 +66,9 @@ public class SelfAwarenessTest {
private static ChatClient getChatClient(String modelKey) {
ModelConfig coreModel = ModelConfig.load(modelKey);
String model = coreModel.getModel();
String baseUrl = coreModel.getBaseUrl();
String apikey = coreModel.getApikey();
String model = "";
String baseUrl = "";
String apikey = "";
ChatClient chatClient = new ChatClient(baseUrl, apikey, model);
chatClient.setTop_p(0.7);
chatClient.setTemperature(0.35);