mirror of
https://github.com/slhaf/Partner.git
synced 2026-05-12 16:53:04 +08:00
进行 Partner 本体对于框架的适配,以及框架层的部分调整
框架: - 调整 ActivateModel 中模型初始化设置的 initHook 权重为-1(最优先) - 为 AgentGateway 中 receive 操作提供模板方法,子类需实现发送逻辑并提供适配器 - 取消了 AgentInteractionAdapter 的单例配置 - 调整 RunningFlow 的异常处理,并在RunningFlowContext中提供错误码进行判断 - 调整模块基类 - 本体: - 新增配置加载异常,继承自Agent启动异常 - 修改 GlobalExceptionData 获取逻辑 - 移除 MessageSender 等交互接口,适配框架的交互逻辑 - 异常处理已适配 - 配置加载逻辑已适配 - Gateway 已适配 - CoreModel 已适配
This commit is contained in:
11
.idea/misc.xml
generated
11
.idea/misc.xml
generated
@@ -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" />
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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) {
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package work.slhaf.partner.api.agent.runtime.interaction.flow.abstracts;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 流程子模块基类
|
* 流程子模块基类
|
||||||
|
*
|
||||||
* @param <I> 输入类型
|
* @param <I> 输入类型
|
||||||
* @param <O> 输出类型
|
* @param <O> 输出类型
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
package work.slhaf.partner.common.config;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
public class WebSocketConfig {
|
|
||||||
private Integer port;
|
|
||||||
}
|
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
@@ -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] 捕获异常, 获取数据失败");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
@@ -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;
|
||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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) {
|
||||||
@@ -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;
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
package work.slhaf.partner.core.cognation.submodule.dispatch;
|
|
||||||
|
|
||||||
public interface DispatchCapability {
|
|
||||||
}
|
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
package work.slhaf.partner.core.interaction.agent_interface;
|
|
||||||
|
|
||||||
public interface TaskCallback {
|
|
||||||
void onTaskFinished(String userInfo,String output);
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -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;
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
package work.slhaf.partner.core.submodule.dispatch;
|
||||||
|
|
||||||
|
public interface DispatchCapability {
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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) {
|
||||||
@@ -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) {
|
||||||
@@ -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) {
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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 {
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
package work.slhaf.partner.gateway;
|
|
||||||
|
|
||||||
import work.slhaf.partner.core.interaction.data.InteractionOutputData;
|
|
||||||
|
|
||||||
public interface MessageSender {
|
|
||||||
void sendMessage(InteractionOutputData outputData);
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
package work.slhaf.partner.module.common.module;
|
|
||||||
|
|
||||||
public abstract class CoreModule extends InteractionModule {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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> {
|
||||||
|
}
|
||||||
@@ -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 {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
package work.slhaf.partner.module.common.module;
|
|
||||||
|
|
||||||
public abstract class PostModule extends InteractionModule{
|
|
||||||
}
|
|
||||||
@@ -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> {
|
||||||
|
}
|
||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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<>();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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] 捕获异常, 获取数据失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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 {
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
9
Partner-Test-Demo/src/test/java/TestA.java
Normal file
9
Partner-Test-Demo/src/test/java/TestA.java
Normal 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");
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user