diff --git a/pom.xml b/pom.xml index 568bfbcc..151ea062 100644 --- a/pom.xml +++ b/pom.xml @@ -30,6 +30,11 @@ commons-io 2.18.0 + + org.java-websocket + Java-WebSocket + 1.6.0 + junit junit diff --git a/src/main/java/work/slhaf/Main.java b/src/main/java/work/slhaf/Main.java index a274b0e2..50ac87b3 100644 --- a/src/main/java/work/slhaf/Main.java +++ b/src/main/java/work/slhaf/Main.java @@ -1,10 +1,12 @@ package work.slhaf; -import work.slhaf.agent.core.memory.MemoryGraph; +import work.slhaf.agent.Agent; +import work.slhaf.agent.modules.memory.MemoryGraph; + +import java.io.IOException; public class Main { - public static void main(String[] args) { - MemoryGraph graph = MemoryGraph.initialize("test"); - + public static void main(String[] args) throws IOException { + Agent agent = Agent.initialize(); } } \ No newline at end of file diff --git a/src/main/java/work/slhaf/agent/Agent.java b/src/main/java/work/slhaf/agent/Agent.java index f646b972..f5dc45b8 100644 --- a/src/main/java/work/slhaf/agent/Agent.java +++ b/src/main/java/work/slhaf/agent/Agent.java @@ -1,4 +1,67 @@ package work.slhaf.agent; -public class Agent { +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import work.slhaf.agent.common.config.Config; +import work.slhaf.agent.core.InteractionHub; +import work.slhaf.agent.core.interation.TaskCallback; +import work.slhaf.agent.core.interation.data.InteractionInputData; +import work.slhaf.agent.gateway.AgentWebSocketServer; +import work.slhaf.agent.gateway.MessageSender; + +import java.io.IOException; +import java.time.LocalDateTime; + +@Data +@Slf4j +public class Agent implements TaskCallback { + + private static Agent agent; + private InteractionHub interactionHub; + private MessageSender messageSender; + + public static Agent initialize() throws IOException { + if (agent == null) { + //加载配置 + Config config = Config.load(); + agent = new Agent(); + agent.setInteractionHub(InteractionHub.initialize(config)); + agent.registerTaskCallback(); + agent.setMessageSender(new AgentWebSocketServer(config.getWebSocketConfig().getPort(),agent)); + log.info("Agent 加载完毕.."); + } + return agent; + } + + /** + * 接收用户输入,包装为标准输入数据类 + * @param input + */ + public void receiveUserInput(String userNickName,String userInfo,String input){ + InteractionInputData inputData = new InteractionInputData(); + inputData.setContent(input); + inputData.setUserInfo(userInfo); + inputData.setUserNickName(userNickName); + inputData.setLocalDateTime(LocalDateTime.now()); + interactionHub.call(inputData); + } + + + /** + * 向用户返回输出内容 + * @param output + */ + public void sendToUser(String userInfo,String output){ + System.out.println(output); + messageSender.sendMessage(userInfo,output); + } + + @Override + public void onTaskFinished(String userInfo, String output) { + sendToUser(userInfo,output); + } + + private void registerTaskCallback(){ + interactionHub.setCallback(this); + } } diff --git a/src/main/java/work/slhaf/agent/core/chat/ChatClient.java b/src/main/java/work/slhaf/agent/common/chat/ChatClient.java similarity index 85% rename from src/main/java/work/slhaf/agent/core/chat/ChatClient.java rename to src/main/java/work/slhaf/agent/common/chat/ChatClient.java index cfff970e..8a33f9ab 100644 --- a/src/main/java/work/slhaf/agent/core/chat/ChatClient.java +++ b/src/main/java/work/slhaf/agent/common/chat/ChatClient.java @@ -1,15 +1,15 @@ -package work.slhaf.agent.core.chat; +package work.slhaf.agent.common.chat; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.json.JSONUtil; import lombok.Data; import lombok.NoArgsConstructor; -import work.slhaf.agent.core.chat.constant.Constant; -import work.slhaf.agent.core.chat.pojo.ChatBody; -import work.slhaf.agent.core.chat.pojo.ChatResponse; -import work.slhaf.agent.core.chat.pojo.Message; -import work.slhaf.agent.core.chat.pojo.PrimaryChatResponse; +import work.slhaf.agent.common.chat.constant.Constant; +import work.slhaf.agent.common.chat.pojo.ChatBody; +import work.slhaf.agent.common.chat.pojo.ChatResponse; +import work.slhaf.agent.common.chat.pojo.Message; +import work.slhaf.agent.common.chat.pojo.PrimaryChatResponse; import java.util.List; diff --git a/src/main/java/work/slhaf/agent/core/chat/constant/Constant.java b/src/main/java/work/slhaf/agent/common/chat/constant/Constant.java similarity index 93% rename from src/main/java/work/slhaf/agent/core/chat/constant/Constant.java rename to src/main/java/work/slhaf/agent/common/chat/constant/Constant.java index babe5f93..89e48c91 100644 --- a/src/main/java/work/slhaf/agent/core/chat/constant/Constant.java +++ b/src/main/java/work/slhaf/agent/common/chat/constant/Constant.java @@ -1,4 +1,4 @@ -package work.slhaf.agent.core.chat.constant; +package work.slhaf.agent.common.chat.constant; public class Constant { diff --git a/src/main/java/work/slhaf/agent/core/chat/pojo/ChatBody.java b/src/main/java/work/slhaf/agent/common/chat/pojo/ChatBody.java similarity index 91% rename from src/main/java/work/slhaf/agent/core/chat/pojo/ChatBody.java rename to src/main/java/work/slhaf/agent/common/chat/pojo/ChatBody.java index 03544b1f..f94bf136 100644 --- a/src/main/java/work/slhaf/agent/core/chat/pojo/ChatBody.java +++ b/src/main/java/work/slhaf/agent/common/chat/pojo/ChatBody.java @@ -1,4 +1,4 @@ -package work.slhaf.agent.core.chat.pojo; +package work.slhaf.agent.common.chat.pojo; import lombok.*; diff --git a/src/main/java/work/slhaf/agent/core/chat/pojo/ChatResponse.java b/src/main/java/work/slhaf/agent/common/chat/pojo/ChatResponse.java similarity index 87% rename from src/main/java/work/slhaf/agent/core/chat/pojo/ChatResponse.java rename to src/main/java/work/slhaf/agent/common/chat/pojo/ChatResponse.java index 01ebc699..07e1a30a 100644 --- a/src/main/java/work/slhaf/agent/core/chat/pojo/ChatResponse.java +++ b/src/main/java/work/slhaf/agent/common/chat/pojo/ChatResponse.java @@ -1,4 +1,4 @@ -package work.slhaf.agent.core.chat.pojo; +package work.slhaf.agent.common.chat.pojo; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/work/slhaf/agent/core/chat/pojo/Message.java b/src/main/java/work/slhaf/agent/common/chat/pojo/Message.java similarity index 80% rename from src/main/java/work/slhaf/agent/core/chat/pojo/Message.java rename to src/main/java/work/slhaf/agent/common/chat/pojo/Message.java index 938a5204..6e490761 100644 --- a/src/main/java/work/slhaf/agent/core/chat/pojo/Message.java +++ b/src/main/java/work/slhaf/agent/common/chat/pojo/Message.java @@ -1,4 +1,4 @@ -package work.slhaf.agent.core.chat.pojo; +package work.slhaf.agent.common.chat.pojo; import lombok.*; diff --git a/src/main/java/work/slhaf/agent/core/chat/pojo/PrimaryChatResponse.java b/src/main/java/work/slhaf/agent/common/chat/pojo/PrimaryChatResponse.java similarity index 98% rename from src/main/java/work/slhaf/agent/core/chat/pojo/PrimaryChatResponse.java rename to src/main/java/work/slhaf/agent/common/chat/pojo/PrimaryChatResponse.java index 4ef35093..29769e65 100644 --- a/src/main/java/work/slhaf/agent/core/chat/pojo/PrimaryChatResponse.java +++ b/src/main/java/work/slhaf/agent/common/chat/pojo/PrimaryChatResponse.java @@ -1,4 +1,4 @@ -package work.slhaf.agent.core.chat.pojo; +package work.slhaf.agent.common.chat.pojo; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/work/slhaf/agent/core/config/Config.java b/src/main/java/work/slhaf/agent/common/config/Config.java similarity index 91% rename from src/main/java/work/slhaf/agent/core/config/Config.java rename to src/main/java/work/slhaf/agent/common/config/Config.java index 7caf4f2f..9350f30e 100644 --- a/src/main/java/work/slhaf/agent/core/config/Config.java +++ b/src/main/java/work/slhaf/agent/common/config/Config.java @@ -1,13 +1,13 @@ -package work.slhaf.agent.core.config; +package work.slhaf.agent.common.config; import cn.hutool.json.JSONUtil; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; -import work.slhaf.agent.core.models.core.CoreModel; -import work.slhaf.agent.core.models.slice.SliceEvaluator; -import work.slhaf.agent.core.models.task.TaskTrigger; -import work.slhaf.agent.core.models.topic.TopicExtractor; +import work.slhaf.agent.core.model.CoreModel; +import work.slhaf.agent.modules.memory.SliceEvaluator; +import work.slhaf.agent.modules.task.TaskScheduler; +import work.slhaf.agent.modules.topic.TopicExtractor; import java.io.File; import java.io.IOException; @@ -54,7 +54,7 @@ public class Config { } case 2 -> { System.out.println("TaskTrigger:"); - yield TaskTrigger.MODEL_KEY; + yield TaskScheduler.MODEL_KEY; } case 3 -> { System.out.println("TopicExtractor:"); diff --git a/src/main/java/work/slhaf/agent/core/config/ModelConfig.java b/src/main/java/work/slhaf/agent/common/config/ModelConfig.java similarity index 77% rename from src/main/java/work/slhaf/agent/core/config/ModelConfig.java rename to src/main/java/work/slhaf/agent/common/config/ModelConfig.java index 3ae849e3..d6b77358 100644 --- a/src/main/java/work/slhaf/agent/core/config/ModelConfig.java +++ b/src/main/java/work/slhaf/agent/common/config/ModelConfig.java @@ -1,4 +1,4 @@ -package work.slhaf.agent.core.config; +package work.slhaf.agent.common.config; import lombok.Data; diff --git a/src/main/java/work/slhaf/agent/core/config/WebSocketConfig.java b/src/main/java/work/slhaf/agent/common/config/WebSocketConfig.java similarity index 68% rename from src/main/java/work/slhaf/agent/core/config/WebSocketConfig.java rename to src/main/java/work/slhaf/agent/common/config/WebSocketConfig.java index 2414b941..c82dc430 100644 --- a/src/main/java/work/slhaf/agent/core/config/WebSocketConfig.java +++ b/src/main/java/work/slhaf/agent/common/config/WebSocketConfig.java @@ -1,4 +1,4 @@ -package work.slhaf.agent.core.config; +package work.slhaf.agent.common.config; import lombok.Data; diff --git a/src/main/java/work/slhaf/agent/core/models/common/Model.java b/src/main/java/work/slhaf/agent/common/model/Model.java similarity index 78% rename from src/main/java/work/slhaf/agent/core/models/common/Model.java rename to src/main/java/work/slhaf/agent/common/model/Model.java index 9b44c524..4ca6c983 100644 --- a/src/main/java/work/slhaf/agent/core/models/common/Model.java +++ b/src/main/java/work/slhaf/agent/common/model/Model.java @@ -1,12 +1,12 @@ -package work.slhaf.agent.core.models.common; +package work.slhaf.agent.common.model; import lombok.Data; -import work.slhaf.agent.core.chat.ChatClient; -import work.slhaf.agent.core.chat.constant.Constant; -import work.slhaf.agent.core.chat.pojo.Message; -import work.slhaf.agent.core.config.Config; -import work.slhaf.agent.core.config.ModelConfig; -import work.slhaf.agent.core.memory.MemoryGraph; +import work.slhaf.agent.common.chat.ChatClient; +import work.slhaf.agent.common.chat.constant.Constant; +import work.slhaf.agent.common.chat.pojo.Message; +import work.slhaf.agent.common.config.Config; +import work.slhaf.agent.common.config.ModelConfig; +import work.slhaf.agent.modules.memory.MemoryGraph; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/work/slhaf/agent/core/models/common/ModelConstant.java b/src/main/java/work/slhaf/agent/common/model/ModelConstant.java similarity index 99% rename from src/main/java/work/slhaf/agent/core/models/common/ModelConstant.java rename to src/main/java/work/slhaf/agent/common/model/ModelConstant.java index 73ab37e6..00fac5bc 100644 --- a/src/main/java/work/slhaf/agent/core/models/common/ModelConstant.java +++ b/src/main/java/work/slhaf/agent/common/model/ModelConstant.java @@ -1,4 +1,4 @@ -package work.slhaf.agent.core.models.common; +package work.slhaf.agent.common.model; public class ModelConstant { public static final String CORE_MODEL_PROMPT = """ diff --git a/src/main/java/work/slhaf/agent/core/InteractionHub.java b/src/main/java/work/slhaf/agent/core/InteractionHub.java index f00f9c1c..042c3f30 100644 --- a/src/main/java/work/slhaf/agent/core/InteractionHub.java +++ b/src/main/java/work/slhaf/agent/core/InteractionHub.java @@ -1,4 +1,39 @@ package work.slhaf.agent.core; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import work.slhaf.agent.common.config.Config; +import work.slhaf.agent.core.interation.TaskCallback; +import work.slhaf.agent.core.interation.data.InteractionInputData; +import work.slhaf.agent.core.model.CoreModel; +import work.slhaf.agent.modules.memory.MemoryManager; +import work.slhaf.agent.modules.task.TaskScheduler; + +@Data +@Slf4j public class InteractionHub { + + private static InteractionHub interactionHub; + + private TaskCallback callback; + + private CoreModel coreModel; + private MemoryManager memoryManager; + private TaskScheduler taskScheduler; + + public static InteractionHub initialize(Config config) { + if (interactionHub == null) { + interactionHub = new InteractionHub(); + interactionHub.setCoreModel(CoreModel.initialize(config)); + interactionHub.setMemoryManager(MemoryManager.initialize(config)); + interactionHub.setTaskScheduler(TaskScheduler.initialize(config)); + log.info("InteractionHub注册完毕..."); + } + return interactionHub; + } + + public void call(InteractionInputData inputData) { + + callback.onTaskFinished(null, null); + } } diff --git a/src/main/java/work/slhaf/agent/core/interation/TaskCallback.java b/src/main/java/work/slhaf/agent/core/interation/TaskCallback.java new file mode 100644 index 00000000..3966fccf --- /dev/null +++ b/src/main/java/work/slhaf/agent/core/interation/TaskCallback.java @@ -0,0 +1,5 @@ +package work.slhaf.agent.core.interation; + +public interface TaskCallback { + void onTaskFinished(String userInfo,String output); +} diff --git a/src/main/java/work/slhaf/agent/core/interation/data/InteractionInputData.java b/src/main/java/work/slhaf/agent/core/interation/data/InteractionInputData.java new file mode 100644 index 00000000..7f66baf5 --- /dev/null +++ b/src/main/java/work/slhaf/agent/core/interation/data/InteractionInputData.java @@ -0,0 +1,13 @@ +package work.slhaf.agent.core.interation.data; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class InteractionInputData { + private String userInfo; + private String userNickName; + private String content; + private LocalDateTime localDateTime; +} diff --git a/src/main/java/work/slhaf/agent/core/interation/data/InteractionOutputData.java b/src/main/java/work/slhaf/agent/core/interation/data/InteractionOutputData.java new file mode 100644 index 00000000..dce47bbc --- /dev/null +++ b/src/main/java/work/slhaf/agent/core/interation/data/InteractionOutputData.java @@ -0,0 +1,10 @@ +package work.slhaf.agent.core.interation.data; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class InteractionOutputData { + private String content; +} diff --git a/src/main/java/work/slhaf/agent/core/memory/MemoryManager.java b/src/main/java/work/slhaf/agent/core/memory/MemoryManager.java deleted file mode 100644 index 1d72315b..00000000 --- a/src/main/java/work/slhaf/agent/core/memory/MemoryManager.java +++ /dev/null @@ -1,4 +0,0 @@ -package work.slhaf.agent.core.memory; - -public class MemoryManager { -} diff --git a/src/main/java/work/slhaf/agent/core/models/core/CoreModel.java b/src/main/java/work/slhaf/agent/core/model/CoreModel.java similarity index 67% rename from src/main/java/work/slhaf/agent/core/models/core/CoreModel.java rename to src/main/java/work/slhaf/agent/core/model/CoreModel.java index 50ee63f6..03a30ebc 100644 --- a/src/main/java/work/slhaf/agent/core/models/core/CoreModel.java +++ b/src/main/java/work/slhaf/agent/core/model/CoreModel.java @@ -1,13 +1,15 @@ -package work.slhaf.agent.core.models.core; +package work.slhaf.agent.core.model; import lombok.Data; import lombok.EqualsAndHashCode; -import work.slhaf.agent.core.config.Config; -import work.slhaf.agent.core.models.common.Model; -import work.slhaf.agent.core.models.common.ModelConstant; +import lombok.extern.slf4j.Slf4j; +import work.slhaf.agent.common.config.Config; +import work.slhaf.agent.common.model.Model; +import work.slhaf.agent.common.model.ModelConstant; @EqualsAndHashCode(callSuper = true) @Data +@Slf4j public class CoreModel extends Model { public static final String MODEL_KEY = "core_model"; @@ -18,6 +20,7 @@ public class CoreModel extends Model { coreModel = new CoreModel(); coreModel.setPrompt(ModelConstant.CORE_MODEL_PROMPT); setModel(config, coreModel, MODEL_KEY, coreModel.getPrompt()); + log.info("CoreModel注册完毕..."); } return coreModel; } diff --git a/src/main/java/work/slhaf/agent/core/models/task/TaskTrigger.java b/src/main/java/work/slhaf/agent/core/models/task/TaskTrigger.java deleted file mode 100644 index 8820cc00..00000000 --- a/src/main/java/work/slhaf/agent/core/models/task/TaskTrigger.java +++ /dev/null @@ -1,25 +0,0 @@ -package work.slhaf.agent.core.models.task; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import work.slhaf.agent.core.config.Config; -import work.slhaf.agent.core.models.common.Model; -import work.slhaf.agent.core.models.common.ModelConstant; - -@EqualsAndHashCode(callSuper = true) -@Data -public class TaskTrigger extends Model { - public static final String MODEL_KEY = "task_trigger"; - private static TaskTrigger taskTrigger; - public static TaskTrigger initialize(Config config) { - - if (taskTrigger == null) { - taskTrigger = new TaskTrigger(); - taskTrigger.setPrompt(ModelConstant.SLICE_EVALUATOR_PROMPT); - setModel(config,taskTrigger, MODEL_KEY, taskTrigger.getPrompt()); - } - - return taskTrigger; - } - -} diff --git a/src/main/java/work/slhaf/agent/core/task/TaskScheduler.java b/src/main/java/work/slhaf/agent/core/task/TaskScheduler.java deleted file mode 100644 index c9a7f290..00000000 --- a/src/main/java/work/slhaf/agent/core/task/TaskScheduler.java +++ /dev/null @@ -1,4 +0,0 @@ -package work.slhaf.agent.core.task; - -public class TaskScheduler { -} diff --git a/src/main/java/work/slhaf/agent/gateway/AgentWebSocketServer.java b/src/main/java/work/slhaf/agent/gateway/AgentWebSocketServer.java new file mode 100644 index 00000000..2561a460 --- /dev/null +++ b/src/main/java/work/slhaf/agent/gateway/AgentWebSocketServer.java @@ -0,0 +1,64 @@ +package work.slhaf.agent.gateway; + +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson2.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.java_websocket.WebSocket; +import org.java_websocket.handshake.ClientHandshake; +import org.java_websocket.server.WebSocketServer; +import work.slhaf.agent.Agent; +import work.slhaf.agent.core.interation.data.InteractionInputData; +import work.slhaf.agent.core.interation.data.InteractionOutputData; + +import java.net.InetSocketAddress; +import java.util.concurrent.ConcurrentHashMap; + +@Slf4j +public class AgentWebSocketServer extends WebSocketServer implements MessageSender { + + private final Agent agent; + private final ConcurrentHashMap userSessions = new ConcurrentHashMap<>(); + + public AgentWebSocketServer(int port, Agent agent) { + super(new InetSocketAddress(port)); + this.agent = agent; + } + + @Override + public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) { + log.info("新连接: {}",webSocket.getRemoteSocketAddress()); + } + + @Override + public void onClose(WebSocket webSocket, int i, String s, boolean b) { + log.info("连接关闭: {}",webSocket.getRemoteSocketAddress()); + userSessions.values().removeIf(session -> session.equals(webSocket)); + } + + @Override + public void onMessage(WebSocket webSocket, String s) { + InteractionInputData inputData = JSONObject.parseObject(s, InteractionInputData.class); + userSessions.put(inputData.getUserInfo(), webSocket); // 注册连接 + agent.receiveUserInput(inputData.getUserNickName(), inputData.getUserInfo(), inputData.getContent()); + } + + @Override + public void onError(WebSocket webSocket, Exception e) { + log.error(e.getLocalizedMessage()); + } + + @Override + public void onStart() { + log.info("WebSocketServer 已启动..."); + } + + @Override + public void sendMessage(String userInfo,String message) { + WebSocket webSocket = userSessions.get(userInfo); + if (webSocket != null && webSocket.isOpen()) { + webSocket.send(JSONUtil.toJsonStr(new InteractionOutputData(message))); + }else { + log.warn("用户不在线: {}",userInfo); + } + } +} diff --git a/src/main/java/work/slhaf/agent/gateway/MessageSender.java b/src/main/java/work/slhaf/agent/gateway/MessageSender.java new file mode 100644 index 00000000..9131059f --- /dev/null +++ b/src/main/java/work/slhaf/agent/gateway/MessageSender.java @@ -0,0 +1,5 @@ +package work.slhaf.agent.gateway; + +public interface MessageSender { + void sendMessage(String userInfo,String message); +} diff --git a/src/main/java/work/slhaf/agent/core/memory/MemoryGraph.java b/src/main/java/work/slhaf/agent/modules/memory/MemoryGraph.java similarity index 94% rename from src/main/java/work/slhaf/agent/core/memory/MemoryGraph.java rename to src/main/java/work/slhaf/agent/modules/memory/MemoryGraph.java index 812fbd2a..e676020d 100644 --- a/src/main/java/work/slhaf/agent/core/memory/MemoryGraph.java +++ b/src/main/java/work/slhaf/agent/modules/memory/MemoryGraph.java @@ -1,16 +1,16 @@ -package work.slhaf.agent.core.memory; +package work.slhaf.agent.modules.memory; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; -import work.slhaf.agent.core.chat.pojo.Message; -import work.slhaf.agent.core.memory.exception.UnExistedTopicException; -import work.slhaf.agent.core.memory.node.MemoryNode; -import work.slhaf.agent.core.memory.node.TopicNode; -import work.slhaf.agent.core.memory.pojo.MemoryResult; -import work.slhaf.agent.core.memory.pojo.MemorySlice; -import work.slhaf.agent.core.memory.pojo.MemorySliceResult; -import work.slhaf.agent.core.memory.pojo.PersistableObject; +import work.slhaf.agent.common.chat.pojo.Message; +import work.slhaf.agent.modules.memory.exception.UnExistedTopicException; +import work.slhaf.agent.modules.memory.node.MemoryNode; +import work.slhaf.agent.modules.memory.node.TopicNode; +import work.slhaf.agent.modules.memory.pojo.MemoryResult; +import work.slhaf.agent.modules.memory.pojo.MemorySlice; +import work.slhaf.agent.modules.memory.pojo.MemorySliceResult; +import work.slhaf.agent.modules.memory.pojo.PersistableObject; import java.io.*; import java.nio.file.Files; @@ -115,7 +115,6 @@ public class MemoryGraph extends PersistableObject { createStorageDirectory(); Path filePath = getFilePath(id); - if (memoryGraph == null && Files.exists(filePath)) { try { // 从文件加载 @@ -128,6 +127,7 @@ public class MemoryGraph extends PersistableObject { // 创建新实例 memoryGraph = new MemoryGraph(id); } + log.info("MemoryGraph注册完毕..."); return memoryGraph; } @@ -172,6 +172,40 @@ public class MemoryGraph extends PersistableObject { checkCacheDate(); //如果topicPath在memorySliceCache中存在对应缓存,由于进行的插入操作,则需要移除该缓存,但不清除相关计数 memorySliceCache.remove(topicPath); + TopicNode lastTopicNode = generateTopicPath(topicPath); + + //检查是否存在当天对应的memorySlice并确定是否插入 + LocalDate now = LocalDate.now(); + boolean hasSlice = false; + MemoryNode node = null; + for (MemoryNode memoryNode : lastTopicNode.getMemoryNodes()) { + if (now.equals(memoryNode.getLocalDate())) { + hasSlice = true; + node = memoryNode; + break; + } + } + if (!hasSlice) { + node = new MemoryNode(); + node.setLocalDate(now); + node.setMemoryNodeId(UUID.randomUUID().toString()); + node.setMemorySliceList(new ArrayList<>()); + lastTopicNode.getMemoryNodes().add(node); + lastTopicNode.getMemoryNodes().sort(null); + } + node.getMemorySliceList().add(slice); + + //生成relatedTopicPath + for (List relatedTopic : slice.getRelatedTopics()) { + generateTopicPath(relatedTopic); + } + + updateDateIndex(now, slice); + updateDialogMap(slice); + node.saveMemorySliceList(); + } + + private TopicNode generateTopicPath(List topicPath) { topicPath = new ArrayList<>(topicPath); //查看是否存在根主题节点 String rootTopic = topicPath.getFirst(); @@ -199,30 +233,7 @@ public class MemoryGraph extends PersistableObject { existedTopicNodes.add(topic); } } - //检查是否存在当天对应的memorySlice - LocalDate now = LocalDate.now(); - boolean hasSlice = false; - MemoryNode node = null; - for (MemoryNode memoryNode : lastTopicNode.getMemoryNodes()) { - if (now.equals(memoryNode.getLocalDate())) { - hasSlice = true; - node = memoryNode; - break; - } - } - if (!hasSlice) { - node = new MemoryNode(); - node.setLocalDate(now); - node.setMemoryNodeId(UUID.randomUUID().toString()); - node.setMemorySliceList(new ArrayList<>()); - lastTopicNode.getMemoryNodes().add(node); - lastTopicNode.getMemoryNodes().sort(null); - } - node.getMemorySliceList().add(slice); - - updateDateIndex(now, slice); - updateDialogMap(slice); - node.saveMemorySliceList(); + return lastTopicNode; } private void updateDialogMap(MemorySlice slice) { diff --git a/src/main/java/work/slhaf/agent/modules/memory/MemoryManager.java b/src/main/java/work/slhaf/agent/modules/memory/MemoryManager.java new file mode 100644 index 00000000..bd8cf11d --- /dev/null +++ b/src/main/java/work/slhaf/agent/modules/memory/MemoryManager.java @@ -0,0 +1,26 @@ +package work.slhaf.agent.modules.memory; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import work.slhaf.agent.common.config.Config; + +@Data +@Slf4j +public class MemoryManager { + + private static MemoryManager memoryManager; + + private MemoryGraph memoryGraph; + private SliceEvaluator sliceEvaluator; + + public static MemoryManager initialize(Config config){ + if (memoryManager == null) { + memoryManager = new MemoryManager(); + memoryManager.setMemoryGraph(MemoryGraph.initialize(config.getAgentId())); + memoryManager.setSliceEvaluator(SliceEvaluator.initialize(config)); + log.info("MemoryManager注册完毕..."); + } + return memoryManager; + } + +} diff --git a/src/main/java/work/slhaf/agent/core/models/slice/SliceEvaluator.java b/src/main/java/work/slhaf/agent/modules/memory/SliceEvaluator.java similarity index 68% rename from src/main/java/work/slhaf/agent/core/models/slice/SliceEvaluator.java rename to src/main/java/work/slhaf/agent/modules/memory/SliceEvaluator.java index 4ddfdc76..1c8b815d 100644 --- a/src/main/java/work/slhaf/agent/core/models/slice/SliceEvaluator.java +++ b/src/main/java/work/slhaf/agent/modules/memory/SliceEvaluator.java @@ -1,13 +1,15 @@ -package work.slhaf.agent.core.models.slice; +package work.slhaf.agent.modules.memory; import lombok.Data; import lombok.EqualsAndHashCode; -import work.slhaf.agent.core.config.Config; -import work.slhaf.agent.core.models.common.Model; -import work.slhaf.agent.core.models.common.ModelConstant; +import lombok.extern.slf4j.Slf4j; +import work.slhaf.agent.common.config.Config; +import work.slhaf.agent.common.model.Model; +import work.slhaf.agent.common.model.ModelConstant; @EqualsAndHashCode(callSuper = true) @Data +@Slf4j public class SliceEvaluator extends Model { public static final String MODEL_KEY = "slice_evaluator"; @@ -19,6 +21,7 @@ public class SliceEvaluator extends Model { sliceEvaluator = new SliceEvaluator(); sliceEvaluator.setPrompt(ModelConstant.SLICE_EVALUATOR_PROMPT); setModel(config,sliceEvaluator, MODEL_KEY, sliceEvaluator.getPrompt()); + log.info("SliceEvaluator注册完毕..."); } return sliceEvaluator; diff --git a/src/main/java/work/slhaf/agent/core/memory/exception/NullSliceListException.java b/src/main/java/work/slhaf/agent/modules/memory/exception/NullSliceListException.java similarity index 74% rename from src/main/java/work/slhaf/agent/core/memory/exception/NullSliceListException.java rename to src/main/java/work/slhaf/agent/modules/memory/exception/NullSliceListException.java index 595ec00c..eaa8b25a 100644 --- a/src/main/java/work/slhaf/agent/core/memory/exception/NullSliceListException.java +++ b/src/main/java/work/slhaf/agent/modules/memory/exception/NullSliceListException.java @@ -1,4 +1,4 @@ -package work.slhaf.agent.core.memory.exception; +package work.slhaf.agent.modules.memory.exception; public class NullSliceListException extends RuntimeException { public NullSliceListException(String message) { diff --git a/src/main/java/work/slhaf/agent/core/memory/exception/UnExistedTopicException.java b/src/main/java/work/slhaf/agent/modules/memory/exception/UnExistedTopicException.java similarity index 74% rename from src/main/java/work/slhaf/agent/core/memory/exception/UnExistedTopicException.java rename to src/main/java/work/slhaf/agent/modules/memory/exception/UnExistedTopicException.java index 6050b1c3..b620c202 100644 --- a/src/main/java/work/slhaf/agent/core/memory/exception/UnExistedTopicException.java +++ b/src/main/java/work/slhaf/agent/modules/memory/exception/UnExistedTopicException.java @@ -1,4 +1,4 @@ -package work.slhaf.agent.core.memory.exception; +package work.slhaf.agent.modules.memory.exception; public class UnExistedTopicException extends RuntimeException { public UnExistedTopicException(String message) { diff --git a/src/main/java/work/slhaf/agent/core/memory/node/MemoryNode.java b/src/main/java/work/slhaf/agent/modules/memory/node/MemoryNode.java similarity index 91% rename from src/main/java/work/slhaf/agent/core/memory/node/MemoryNode.java rename to src/main/java/work/slhaf/agent/modules/memory/node/MemoryNode.java index aaf3ab3c..8d3782ff 100644 --- a/src/main/java/work/slhaf/agent/core/memory/node/MemoryNode.java +++ b/src/main/java/work/slhaf/agent/modules/memory/node/MemoryNode.java @@ -1,11 +1,11 @@ -package work.slhaf.agent.core.memory.node; +package work.slhaf.agent.modules.memory.node; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; -import work.slhaf.agent.core.memory.exception.NullSliceListException; -import work.slhaf.agent.core.memory.pojo.MemorySlice; -import work.slhaf.agent.core.memory.pojo.PersistableObject; +import work.slhaf.agent.modules.memory.exception.NullSliceListException; +import work.slhaf.agent.modules.memory.pojo.MemorySlice; +import work.slhaf.agent.modules.memory.pojo.PersistableObject; import java.io.*; import java.time.LocalDate; diff --git a/src/main/java/work/slhaf/agent/core/memory/node/TopicNode.java b/src/main/java/work/slhaf/agent/modules/memory/node/TopicNode.java similarity index 80% rename from src/main/java/work/slhaf/agent/core/memory/node/TopicNode.java rename to src/main/java/work/slhaf/agent/modules/memory/node/TopicNode.java index a84ca505..c2e68f71 100644 --- a/src/main/java/work/slhaf/agent/core/memory/node/TopicNode.java +++ b/src/main/java/work/slhaf/agent/modules/memory/node/TopicNode.java @@ -1,8 +1,8 @@ -package work.slhaf.agent.core.memory.node; +package work.slhaf.agent.modules.memory.node; import lombok.Data; import lombok.EqualsAndHashCode; -import work.slhaf.agent.core.memory.pojo.PersistableObject; +import work.slhaf.agent.modules.memory.pojo.PersistableObject; import java.io.Serial; import java.util.concurrent.ConcurrentHashMap; diff --git a/src/main/java/work/slhaf/agent/core/memory/pojo/MemoryResult.java b/src/main/java/work/slhaf/agent/modules/memory/pojo/MemoryResult.java similarity index 80% rename from src/main/java/work/slhaf/agent/core/memory/pojo/MemoryResult.java rename to src/main/java/work/slhaf/agent/modules/memory/pojo/MemoryResult.java index 86d713d6..1788fef3 100644 --- a/src/main/java/work/slhaf/agent/core/memory/pojo/MemoryResult.java +++ b/src/main/java/work/slhaf/agent/modules/memory/pojo/MemoryResult.java @@ -1,4 +1,4 @@ -package work.slhaf.agent.core.memory.pojo; +package work.slhaf.agent.modules.memory.pojo; import lombok.Data; diff --git a/src/main/java/work/slhaf/agent/core/memory/pojo/MemorySlice.java b/src/main/java/work/slhaf/agent/modules/memory/pojo/MemorySlice.java similarity index 91% rename from src/main/java/work/slhaf/agent/core/memory/pojo/MemorySlice.java rename to src/main/java/work/slhaf/agent/modules/memory/pojo/MemorySlice.java index d497b524..03c5c4bd 100644 --- a/src/main/java/work/slhaf/agent/core/memory/pojo/MemorySlice.java +++ b/src/main/java/work/slhaf/agent/modules/memory/pojo/MemorySlice.java @@ -1,8 +1,8 @@ -package work.slhaf.agent.core.memory.pojo; +package work.slhaf.agent.modules.memory.pojo; import lombok.Data; import lombok.EqualsAndHashCode; -import work.slhaf.agent.core.chat.pojo.Message; +import work.slhaf.agent.common.chat.pojo.Message; import java.io.Serial; import java.util.List; @@ -48,7 +48,7 @@ public class MemorySlice extends PersistableObject implements Comparable involvedUsers; diff --git a/src/main/java/work/slhaf/agent/core/memory/pojo/MemorySliceResult.java b/src/main/java/work/slhaf/agent/modules/memory/pojo/MemorySliceResult.java similarity index 78% rename from src/main/java/work/slhaf/agent/core/memory/pojo/MemorySliceResult.java rename to src/main/java/work/slhaf/agent/modules/memory/pojo/MemorySliceResult.java index 2adb91e3..bd58183c 100644 --- a/src/main/java/work/slhaf/agent/core/memory/pojo/MemorySliceResult.java +++ b/src/main/java/work/slhaf/agent/modules/memory/pojo/MemorySliceResult.java @@ -1,4 +1,4 @@ -package work.slhaf.agent.core.memory.pojo; +package work.slhaf.agent.modules.memory.pojo; import lombok.Data; diff --git a/src/main/java/work/slhaf/agent/core/memory/pojo/PersistableObject.java b/src/main/java/work/slhaf/agent/modules/memory/pojo/PersistableObject.java similarity index 68% rename from src/main/java/work/slhaf/agent/core/memory/pojo/PersistableObject.java rename to src/main/java/work/slhaf/agent/modules/memory/pojo/PersistableObject.java index 270a8400..78148d02 100644 --- a/src/main/java/work/slhaf/agent/core/memory/pojo/PersistableObject.java +++ b/src/main/java/work/slhaf/agent/modules/memory/pojo/PersistableObject.java @@ -1,4 +1,4 @@ -package work.slhaf.agent.core.memory.pojo; +package work.slhaf.agent.modules.memory.pojo; import java.io.Serializable; diff --git a/src/main/java/work/slhaf/agent/modules/memory/pojo/User.java b/src/main/java/work/slhaf/agent/modules/memory/pojo/User.java new file mode 100644 index 00000000..0fead634 --- /dev/null +++ b/src/main/java/work/slhaf/agent/modules/memory/pojo/User.java @@ -0,0 +1,12 @@ +package work.slhaf.agent.modules.memory.pojo; + +import lombok.Data; + +import java.util.List; + +@Data +public class User { + private String uuid; + private List info; + private String nickName; +} diff --git a/src/main/java/work/slhaf/agent/modules/task/TaskExecutor.java b/src/main/java/work/slhaf/agent/modules/task/TaskExecutor.java new file mode 100644 index 00000000..d6ac4a5b --- /dev/null +++ b/src/main/java/work/slhaf/agent/modules/task/TaskExecutor.java @@ -0,0 +1,4 @@ +package work.slhaf.agent.modules.task; + +public class TaskExecutor { +} diff --git a/src/main/java/work/slhaf/agent/modules/task/TaskScheduler.java b/src/main/java/work/slhaf/agent/modules/task/TaskScheduler.java new file mode 100644 index 00000000..00bcd56f --- /dev/null +++ b/src/main/java/work/slhaf/agent/modules/task/TaskScheduler.java @@ -0,0 +1,28 @@ +package work.slhaf.agent.modules.task; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; +import work.slhaf.agent.common.config.Config; +import work.slhaf.agent.common.model.Model; +import work.slhaf.agent.common.model.ModelConstant; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class TaskScheduler extends Model { + public static final String MODEL_KEY = "task_trigger"; + private static TaskScheduler taskScheduler; + public static TaskScheduler initialize(Config config) { + + if (taskScheduler == null) { + taskScheduler = new TaskScheduler(); + taskScheduler.setPrompt(ModelConstant.SLICE_EVALUATOR_PROMPT); + setModel(config, taskScheduler, MODEL_KEY, taskScheduler.getPrompt()); + log.info("TaskScheduler注册完毕..."); + } + + return taskScheduler; + } + +} diff --git a/src/main/java/work/slhaf/agent/core/models/topic/TopicExtractor.java b/src/main/java/work/slhaf/agent/modules/topic/TopicExtractor.java similarity index 75% rename from src/main/java/work/slhaf/agent/core/models/topic/TopicExtractor.java rename to src/main/java/work/slhaf/agent/modules/topic/TopicExtractor.java index ec3a3e8a..a043ec7b 100644 --- a/src/main/java/work/slhaf/agent/core/models/topic/TopicExtractor.java +++ b/src/main/java/work/slhaf/agent/modules/topic/TopicExtractor.java @@ -1,10 +1,10 @@ -package work.slhaf.agent.core.models.topic; +package work.slhaf.agent.modules.topic; import lombok.Data; import lombok.EqualsAndHashCode; -import work.slhaf.agent.core.config.Config; -import work.slhaf.agent.core.models.common.Model; -import work.slhaf.agent.core.models.common.ModelConstant; +import work.slhaf.agent.common.config.Config; +import work.slhaf.agent.common.model.Model; +import work.slhaf.agent.common.model.ModelConstant; @EqualsAndHashCode(callSuper = true) @Data diff --git a/src/test/java/memory/InsertTest.java b/src/test/java/memory/InsertTest.java index 0c950cbf..d6a8711f 100644 --- a/src/test/java/memory/InsertTest.java +++ b/src/test/java/memory/InsertTest.java @@ -2,10 +2,10 @@ package memory; import org.junit.Before; import org.junit.Test; -import work.slhaf.agent.core.memory.MemoryGraph; -import work.slhaf.agent.core.memory.pojo.MemorySlice; -import work.slhaf.agent.core.memory.node.MemoryNode; -import work.slhaf.agent.core.memory.node.TopicNode; +import work.slhaf.agent.modules.memory.MemoryGraph; +import work.slhaf.agent.modules.memory.pojo.MemorySlice; +import work.slhaf.agent.modules.memory.node.MemoryNode; +import work.slhaf.agent.modules.memory.node.TopicNode; import java.io.IOException; import java.time.LocalDate; diff --git a/src/test/java/memory/SearchTest.java b/src/test/java/memory/SearchTest.java index 2b60d21e..08864488 100644 --- a/src/test/java/memory/SearchTest.java +++ b/src/test/java/memory/SearchTest.java @@ -2,12 +2,12 @@ package memory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import work.slhaf.agent.core.memory.MemoryGraph; -import work.slhaf.agent.core.memory.pojo.MemorySlice; -import work.slhaf.agent.core.memory.exception.UnExistedTopicException; -import work.slhaf.agent.core.memory.node.MemoryNode; -import work.slhaf.agent.core.memory.node.TopicNode; -import work.slhaf.agent.core.memory.pojo.MemoryResult; +import work.slhaf.agent.modules.memory.MemoryGraph; +import work.slhaf.agent.modules.memory.pojo.MemorySlice; +import work.slhaf.agent.modules.memory.exception.UnExistedTopicException; +import work.slhaf.agent.modules.memory.node.MemoryNode; +import work.slhaf.agent.modules.memory.node.TopicNode; +import work.slhaf.agent.modules.memory.pojo.MemoryResult; import java.io.IOException; import java.time.LocalDate;