From d00e3ce11efc7e96638ed4768bf8a4b5aa765745 Mon Sep 17 00:00:00 2001 From: Ttt Date: Fri, 13 Mar 2026 21:25:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=B8=A6=E8=AE=B0=E5=BF=86=E4=BD=93?= =?UTF-8?q?=E7=9A=84=E7=AE=80=E5=8D=95=E8=81=8A=E5=A4=A9AI=E6=99=BA?= =?UTF-8?q?=E8=83=BD=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xservice/ai/server/ChatController.java | 4 +- .../xiang/xservice/ai/agent/BaseAgent.java | 2 +- .../xservice/ai/agent/SimpleChatAgent.java | 31 +++++++++++++-- .../xservice/ai/core/assistant/Assistant.java | 12 ++++++ .../ai/core/provider/OpenAILlmProvider.java | 3 ++ .../ai/core/storage/DbPersistentStore.java | 23 +++++++++++ .../core/storage/MemoryPersistentStore.java | 39 +++++++++++++++++++ .../xservice/ai/service/AgentService.java | 16 -------- .../xiang/xservice/ai/service/AiService.java | 19 --------- 9 files changed, 108 insertions(+), 41 deletions(-) create mode 100644 xservice-service/src/main/java/com/xiang/xservice/ai/core/assistant/Assistant.java create mode 100644 xservice-service/src/main/java/com/xiang/xservice/ai/core/storage/DbPersistentStore.java create mode 100644 xservice-service/src/main/java/com/xiang/xservice/ai/core/storage/MemoryPersistentStore.java delete mode 100644 xservice-service/src/main/java/com/xiang/xservice/ai/service/AgentService.java delete mode 100644 xservice-service/src/main/java/com/xiang/xservice/ai/service/AiService.java diff --git a/xservice-server/src/main/java/com/xiang/xsa/xservice/ai/server/ChatController.java b/xservice-server/src/main/java/com/xiang/xsa/xservice/ai/server/ChatController.java index 826fd96..9b5e834 100644 --- a/xservice-server/src/main/java/com/xiang/xsa/xservice/ai/server/ChatController.java +++ b/xservice-server/src/main/java/com/xiang/xsa/xservice/ai/server/ChatController.java @@ -14,8 +14,8 @@ public class ChatController { private final BaseAgent baseAgent; @GetMapping("/chat") - public String chatDemo(@RequestParam("question") String question) { - baseAgent.chat(ModelTypeEnum.OPEN_AI, question); + public String chatDemo(@RequestParam("question") String question, @RequestParam("id") Long id) { + baseAgent.chat(ModelTypeEnum.OPEN_AI, id, question); return "321"; } diff --git a/xservice-service/src/main/java/com/xiang/xservice/ai/agent/BaseAgent.java b/xservice-service/src/main/java/com/xiang/xservice/ai/agent/BaseAgent.java index 06c4454..bd48c1e 100644 --- a/xservice-service/src/main/java/com/xiang/xservice/ai/agent/BaseAgent.java +++ b/xservice-service/src/main/java/com/xiang/xservice/ai/agent/BaseAgent.java @@ -3,5 +3,5 @@ package com.xiang.xservice.ai.agent; import com.xiang.xservice.ai.core.enums.ModelTypeEnum; public interface BaseAgent { - void chat(ModelTypeEnum modelType, String message); + void chat(ModelTypeEnum modelType, Long memoryId, String message); } diff --git a/xservice-service/src/main/java/com/xiang/xservice/ai/agent/SimpleChatAgent.java b/xservice-service/src/main/java/com/xiang/xservice/ai/agent/SimpleChatAgent.java index ee6e083..b53aa7f 100644 --- a/xservice-service/src/main/java/com/xiang/xservice/ai/agent/SimpleChatAgent.java +++ b/xservice-service/src/main/java/com/xiang/xservice/ai/agent/SimpleChatAgent.java @@ -3,15 +3,20 @@ package com.xiang.xservice.ai.agent; import com.google.common.collect.Lists; import com.xiang.xservice.ai.config.OpenAIBaseConfig; import com.xiang.xservice.ai.config.OpenAIConfig; +import com.xiang.xservice.ai.core.assistant.Assistant; import com.xiang.xservice.ai.core.entity.ModelConfig; import com.xiang.xservice.ai.core.enums.ModelStrategyEnum; import com.xiang.xservice.ai.core.enums.ModelTypeEnum; import com.xiang.xservice.ai.core.handler.MyStreamingHandler; import com.xiang.xservice.ai.core.route.TaskRouter; +import com.xiang.xservice.ai.core.storage.MemoryPersistentStore; import dev.langchain4j.data.message.SystemMessage; import dev.langchain4j.data.message.UserMessage; +import dev.langchain4j.memory.chat.ChatMemoryProvider; +import dev.langchain4j.memory.chat.MessageWindowChatMemory; import dev.langchain4j.model.chat.ChatModel; import dev.langchain4j.model.chat.StreamingChatModel; +import dev.langchain4j.service.AiServices; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -21,11 +26,19 @@ public class SimpleChatAgent implements BaseAgent { private final TaskRouter router; private final OpenAIBaseConfig openAIBaseConfig; - private final MyStreamingHandler streamingHandler; @Override - public void chat(ModelTypeEnum modelType, String message) { + public void chat(ModelTypeEnum modelType, Long id, String message) { + + MemoryPersistentStore store = new MemoryPersistentStore(); + + ChatMemoryProvider chatMemoryProvider = memoryId -> MessageWindowChatMemory.builder() + .id(memoryId) + .maxMessages(10) + .chatMemoryStore(store) + .build(); + OpenAIConfig openAIConfig = openAIBaseConfig.getConfigs().get("bai-lian"); ModelConfig modelConfig = ModelConfig.builder() .baseUrl(openAIConfig.getBaseUrl()) @@ -35,8 +48,20 @@ public class SimpleChatAgent implements BaseAgent { .temperature(openAIConfig.getTemperature()) .build(); StreamingChatModel chat = router.route(ModelStrategyEnum.CHAT, modelType.getModelType(), modelConfig); + if (chat == null) { + throw new RuntimeException("chat model route failed"); + } + Assistant assistant = AiServices.builder(Assistant.class) + .streamingChatModel(chat) + .chatMemoryProvider(chatMemoryProvider) + .build(); UserMessage userMessage = new UserMessage(message); SystemMessage systemMessage = new SystemMessage("你是一个能够与人聊天的AI智能助手,名字叫龙虾"); - chat.chat(Lists.newArrayList(systemMessage, userMessage), streamingHandler); + assistant.chat(id, Lists.newArrayList(systemMessage, userMessage)) + .onPartialResponse(System.out::print) + .onCompleteResponse(res -> System.out.println("\n完成")) + .onToolExecuted(error -> System.out.println("\n错误")) + .ignoreErrors() + .start(); } } diff --git a/xservice-service/src/main/java/com/xiang/xservice/ai/core/assistant/Assistant.java b/xservice-service/src/main/java/com/xiang/xservice/ai/core/assistant/Assistant.java new file mode 100644 index 0000000..ede41cf --- /dev/null +++ b/xservice-service/src/main/java/com/xiang/xservice/ai/core/assistant/Assistant.java @@ -0,0 +1,12 @@ +package com.xiang.xservice.ai.core.assistant; + +import dev.langchain4j.data.message.ChatMessage; +import dev.langchain4j.service.MemoryId; +import dev.langchain4j.service.TokenStream; +import dev.langchain4j.service.UserMessage; + +import java.util.List; + +public interface Assistant { + TokenStream chat(@MemoryId Object memoryId, @UserMessage List messages); +} diff --git a/xservice-service/src/main/java/com/xiang/xservice/ai/core/provider/OpenAILlmProvider.java b/xservice-service/src/main/java/com/xiang/xservice/ai/core/provider/OpenAILlmProvider.java index 3cabe2f..ea52dce 100644 --- a/xservice-service/src/main/java/com/xiang/xservice/ai/core/provider/OpenAILlmProvider.java +++ b/xservice-service/src/main/java/com/xiang/xservice/ai/core/provider/OpenAILlmProvider.java @@ -3,6 +3,9 @@ package com.xiang.xservice.ai.core.provider; import com.xiang.xservice.ai.core.entity.ModelConfig; import com.xiang.xservice.ai.core.enums.ModelStrategyEnum; import com.xiang.xservice.ai.core.enums.ModelTypeEnum; +import com.xiang.xservice.ai.core.storage.MemoryPersistentStore; +import dev.langchain4j.memory.chat.ChatMemoryProvider; +import dev.langchain4j.memory.chat.MessageWindowChatMemory; import dev.langchain4j.model.chat.StreamingChatModel; import dev.langchain4j.model.openai.OpenAiStreamingChatModel; import org.springframework.stereotype.Component; diff --git a/xservice-service/src/main/java/com/xiang/xservice/ai/core/storage/DbPersistentStore.java b/xservice-service/src/main/java/com/xiang/xservice/ai/core/storage/DbPersistentStore.java new file mode 100644 index 0000000..0ae3339 --- /dev/null +++ b/xservice-service/src/main/java/com/xiang/xservice/ai/core/storage/DbPersistentStore.java @@ -0,0 +1,23 @@ +package com.xiang.xservice.ai.core.storage; + +import dev.langchain4j.data.message.ChatMessage; +import dev.langchain4j.store.memory.chat.ChatMemoryStore; + +import java.util.List; + +public class DbPersistentStore implements ChatMemoryStore { + @Override + public List getMessages(Object memoryId) { + return List.of(); + } + + @Override + public void updateMessages(Object memoryId, List list) { + + } + + @Override + public void deleteMessages(Object memoryId) { + + } +} diff --git a/xservice-service/src/main/java/com/xiang/xservice/ai/core/storage/MemoryPersistentStore.java b/xservice-service/src/main/java/com/xiang/xservice/ai/core/storage/MemoryPersistentStore.java new file mode 100644 index 0000000..ed91329 --- /dev/null +++ b/xservice-service/src/main/java/com/xiang/xservice/ai/core/storage/MemoryPersistentStore.java @@ -0,0 +1,39 @@ +package com.xiang.xservice.ai.core.storage; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import dev.langchain4j.data.message.ChatMessage; +import dev.langchain4j.store.memory.chat.ChatMemoryStore; + +import java.util.List; +import java.util.Map; + +public class MemoryPersistentStore implements ChatMemoryStore { + + private static Map> MAP = Maps.newHashMap(); + + + @Override + public List getMessages(Object memoryId) { + Long id = (Long) memoryId; + if (MAP.containsKey(id)) { + return MAP.get(id); + } + return Lists.newArrayList(); + } + + @Override + public void updateMessages(Object memoryId, List list) { + Long id = (Long) memoryId; + if (MAP.containsKey(id)) { + MAP.get(id).addAll(list); + } else { + MAP.put(id, list); + } + } + + @Override + public void deleteMessages(Object memoryId) { + MAP.remove((Long) memoryId); + } +} diff --git a/xservice-service/src/main/java/com/xiang/xservice/ai/service/AgentService.java b/xservice-service/src/main/java/com/xiang/xservice/ai/service/AgentService.java deleted file mode 100644 index ddc756d..0000000 --- a/xservice-service/src/main/java/com/xiang/xservice/ai/service/AgentService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.xiang.xservice.ai.service; - -import com.xiang.xservice.ai.core.entity.ModelConfig; -import com.xiang.xservice.ai.core.enums.ModelStrategyEnum; -import com.xiang.xservice.ai.core.route.TaskRouter; -import dev.langchain4j.model.chat.ChatModel; -import dev.langchain4j.service.AiServices; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class AgentService { - -} diff --git a/xservice-service/src/main/java/com/xiang/xservice/ai/service/AiService.java b/xservice-service/src/main/java/com/xiang/xservice/ai/service/AiService.java deleted file mode 100644 index 18fc34c..0000000 --- a/xservice-service/src/main/java/com/xiang/xservice/ai/service/AiService.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.xiang.xservice.ai.service; - -import com.xiang.xservice.ai.core.entity.ModelConfig; -import com.xiang.xservice.ai.core.enums.ModelTypeEnum; -import com.xiang.xservice.ai.core.route.ModelRouter; -import dev.langchain4j.model.chat.ChatModel; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class AiService { - -// private final ModelRouter modelRouter; -// -// private ChatModel createChat(ModelTypeEnum modelType, ModelConfig modelConfig) { -// return modelRouter.create(modelType.getModelType(), modelConfig); -// } -}