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;