Compare commits
4 Commits
fa93d4ffe0
...
feat/langc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5267d29d97 | ||
|
|
24d01bc3e1 | ||
|
|
5dbd0b3a36 | ||
|
|
35dca0a435 |
@@ -2,6 +2,8 @@ package com.xiang.xsa.xservice.ai.server;
|
|||||||
|
|
||||||
import com.xiang.xservice.ai.agent.BaseAgent;
|
import com.xiang.xservice.ai.agent.BaseAgent;
|
||||||
import com.xiang.xservice.ai.core.enums.ModelTypeEnum;
|
import com.xiang.xservice.ai.core.enums.ModelTypeEnum;
|
||||||
|
import com.xiang.xservice.ai.pojo.enums.AgentEnums;
|
||||||
|
import com.xiang.xservice.ai.service.AgentService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
@@ -11,11 +13,12 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class ChatController {
|
public class ChatController {
|
||||||
|
|
||||||
private final BaseAgent baseAgent;
|
private final AgentService agentService;
|
||||||
|
|
||||||
@GetMapping("/chat")
|
@GetMapping("/chat")
|
||||||
public String chatDemo(@RequestParam("question") String question, @RequestParam("id") Long id) {
|
public String chatDemo(@RequestParam("question") String question, @RequestParam("memoryId") Long memoryId, @RequestParam("userId") Long userId) {
|
||||||
baseAgent.chat(ModelTypeEnum.OPEN_AI, id, question);
|
BaseAgent agent = agentService.createAgent(AgentEnums.SIMPLE_CHAT_AGENT);
|
||||||
|
agent.chat(ModelTypeEnum.OPEN_AI, memoryId, userId, question);
|
||||||
return "321";
|
return "321";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,4 +12,9 @@ ai:
|
|||||||
apiKey: sk-70cb426d7d1e4b54b4ffe71022e7d815
|
apiKey: sk-70cb426d7d1e4b54b4ffe71022e7d815
|
||||||
modelName: qwen3.5-plus
|
modelName: qwen3.5-plus
|
||||||
baseUrl: https://dashscope.aliyuncs.com/compatible-mode/v1
|
baseUrl: https://dashscope.aliyuncs.com/compatible-mode/v1
|
||||||
|
ollama:
|
||||||
|
configs:
|
||||||
|
qwen3:
|
||||||
|
modelName: qwen3
|
||||||
|
baseUrl: http://192.168.1.12:11434/api/chat
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,14 @@
|
|||||||
spring:
|
spring:
|
||||||
|
|
||||||
datasource:
|
datasource:
|
||||||
url: jdbc:mysql://rm-bp15t34gqx62jm069ro.mysql.rds.aliyuncs.com:3306/xservice-ai-center?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
|
url: jdbc:mysql://rm-bp15t34gqx62jm069ro.mysql.rds.aliyuncs.com:3306/xservice-ai-center?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
|
||||||
username: root
|
username: root
|
||||||
password: xb#UWqnhH24&XpX
|
password: sdkljfikdfn@123
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
ai:
|
|
||||||
dashscope:
|
ai:
|
||||||
api-key: sk-07353fd191074c9c930b134230ba88ea
|
openai:
|
||||||
chat:
|
configs:
|
||||||
options:
|
bai-lian:
|
||||||
model: qwen-plus
|
apiKey: sk-70cb426d7d1e4b54b4ffe71022e7d815
|
||||||
http:
|
modelName: qwen3.5-plus
|
||||||
connect-timeout: 30s
|
baseUrl: https://dashscope.aliyuncs.com/compatible-mode/v1
|
||||||
read-timeout: 60s
|
|
||||||
@@ -1,16 +1,14 @@
|
|||||||
spring:
|
spring:
|
||||||
|
|
||||||
datasource:
|
datasource:
|
||||||
url: jdbc:mysql://rm-bp15t34gqx62jm069ro.mysql.rds.aliyuncs.com:3306/xservice-ai-center?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
|
url: jdbc:mysql://120.27.153.87:3306/xe-service-ai?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
|
||||||
username: root
|
username: root
|
||||||
password: xb#UWqnhH24&XpX
|
password: sdkljfikdfn@123
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
ai:
|
|
||||||
dashscope:
|
ai:
|
||||||
api-key: sk-07353fd191074c9c930b134230ba88ea
|
openai:
|
||||||
chat:
|
configs:
|
||||||
options:
|
bai-lian:
|
||||||
model: qwen-plus
|
apiKey: sk-70cb426d7d1e4b54b4ffe71022e7d815
|
||||||
http:
|
modelName: qwen3.5-plus
|
||||||
connect-timeout: 30s
|
baseUrl: https://dashscope.aliyuncs.com/compatible-mode/v1
|
||||||
read-timeout: 60s
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
spring:
|
spring:
|
||||||
|
|
||||||
application:
|
application:
|
||||||
name: xservice-ai-center
|
name: xservice-ai-center
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,17 @@
|
|||||||
package com.xiang.xservice.ai.agent;
|
package com.xiang.xservice.ai.agent;
|
||||||
|
|
||||||
import com.xiang.xservice.ai.core.enums.ModelTypeEnum;
|
import com.xiang.xservice.ai.core.enums.ModelTypeEnum;
|
||||||
|
import com.xiang.xservice.ai.pojo.enums.AgentEnums;
|
||||||
|
|
||||||
public interface BaseAgent {
|
public interface BaseAgent {
|
||||||
void chat(ModelTypeEnum modelType, Long memoryId, String message);
|
/**
|
||||||
|
* chat
|
||||||
|
* @param modelType 模型枚举
|
||||||
|
* @param memoryId
|
||||||
|
* @param userId
|
||||||
|
* @param message
|
||||||
|
*/
|
||||||
|
void chat(ModelTypeEnum modelType, Long memoryId, Long userId, String message);
|
||||||
|
|
||||||
|
AgentEnums agent();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,16 +7,14 @@ import com.xiang.xservice.ai.core.assistant.Assistant;
|
|||||||
import com.xiang.xservice.ai.core.entity.ModelConfig;
|
import com.xiang.xservice.ai.core.entity.ModelConfig;
|
||||||
import com.xiang.xservice.ai.core.enums.ModelStrategyEnum;
|
import com.xiang.xservice.ai.core.enums.ModelStrategyEnum;
|
||||||
import com.xiang.xservice.ai.core.enums.ModelTypeEnum;
|
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.route.TaskRouter;
|
||||||
import com.xiang.xservice.ai.core.storage.DbPersistentStore;
|
import com.xiang.xservice.ai.core.storage.DbPersistentStore;
|
||||||
import com.xiang.xservice.ai.core.storage.MemoryPersistentStore;
|
import com.xiang.xservice.ai.pojo.enums.AgentEnums;
|
||||||
import com.xiang.xservice.ai.repository.manage.IAiSimpleChatMessageManage;
|
import com.xiang.xservice.ai.repository.manage.IAiSimpleChatMessageManage;
|
||||||
import dev.langchain4j.data.message.SystemMessage;
|
import dev.langchain4j.data.message.SystemMessage;
|
||||||
import dev.langchain4j.data.message.UserMessage;
|
import dev.langchain4j.data.message.UserMessage;
|
||||||
import dev.langchain4j.memory.chat.ChatMemoryProvider;
|
import dev.langchain4j.memory.chat.ChatMemoryProvider;
|
||||||
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
|
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
|
||||||
import dev.langchain4j.model.chat.ChatModel;
|
|
||||||
import dev.langchain4j.model.chat.StreamingChatModel;
|
import dev.langchain4j.model.chat.StreamingChatModel;
|
||||||
import dev.langchain4j.service.AiServices;
|
import dev.langchain4j.service.AiServices;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@@ -32,16 +30,17 @@ public class SimpleChatAgent implements BaseAgent {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void chat(ModelTypeEnum modelType, Long id, String message) {
|
public void chat(ModelTypeEnum modelType, Long memoryId, Long userId, String message) {
|
||||||
|
|
||||||
DbPersistentStore store = new DbPersistentStore(aiSimpleChatMessageManage);
|
DbPersistentStore store = new DbPersistentStore(aiSimpleChatMessageManage);
|
||||||
|
|
||||||
ChatMemoryProvider chatMemoryProvider = memoryId -> MessageWindowChatMemory.builder()
|
ChatMemoryProvider chatMemoryProvider = args -> MessageWindowChatMemory.builder()
|
||||||
.id(memoryId)
|
.id(memoryId)
|
||||||
.maxMessages(10)
|
.maxMessages(10)
|
||||||
.chatMemoryStore(store)
|
.chatMemoryStore(store)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
|
||||||
OpenAIConfig openAIConfig = openAIBaseConfig.getConfigs().get("bai-lian");
|
OpenAIConfig openAIConfig = openAIBaseConfig.getConfigs().get("bai-lian");
|
||||||
ModelConfig modelConfig = ModelConfig.builder()
|
ModelConfig modelConfig = ModelConfig.builder()
|
||||||
.baseUrl(openAIConfig.getBaseUrl())
|
.baseUrl(openAIConfig.getBaseUrl())
|
||||||
@@ -50,7 +49,7 @@ public class SimpleChatAgent implements BaseAgent {
|
|||||||
.modelName(openAIConfig.getModelName())
|
.modelName(openAIConfig.getModelName())
|
||||||
.temperature(openAIConfig.getTemperature())
|
.temperature(openAIConfig.getTemperature())
|
||||||
.build();
|
.build();
|
||||||
StreamingChatModel chat = router.route(ModelStrategyEnum.CHAT, modelType.getModelType(), modelConfig);
|
StreamingChatModel chat = router.routeStream(ModelStrategyEnum.CHAT, modelType.getModelType(), modelConfig);
|
||||||
if (chat == null) {
|
if (chat == null) {
|
||||||
throw new RuntimeException("chat model route failed");
|
throw new RuntimeException("chat model route failed");
|
||||||
}
|
}
|
||||||
@@ -60,6 +59,7 @@ public class SimpleChatAgent implements BaseAgent {
|
|||||||
.build();
|
.build();
|
||||||
UserMessage userMessage = new UserMessage(message);
|
UserMessage userMessage = new UserMessage(message);
|
||||||
SystemMessage systemMessage = new SystemMessage("你是一个能够与人聊天的AI智能助手,名字叫龙虾");
|
SystemMessage systemMessage = new SystemMessage("你是一个能够与人聊天的AI智能助手,名字叫龙虾");
|
||||||
|
String id = userId + "-" + memoryId;
|
||||||
assistant.chat(id, Lists.newArrayList(systemMessage, userMessage))
|
assistant.chat(id, Lists.newArrayList(systemMessage, userMessage))
|
||||||
.onPartialResponse(System.out::print)
|
.onPartialResponse(System.out::print)
|
||||||
.onCompleteResponse(res -> System.out.println("\n完成"))
|
.onCompleteResponse(res -> System.out.println("\n完成"))
|
||||||
@@ -67,4 +67,9 @@ public class SimpleChatAgent implements BaseAgent {
|
|||||||
.ignoreErrors()
|
.ignoreErrors()
|
||||||
.start();
|
.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AgentEnums agent() {
|
||||||
|
return AgentEnums.SIMPLE_CHAT_AGENT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package com.xiang.xservice.ai.agent;
|
||||||
|
|
||||||
|
import com.xiang.xservice.ai.core.enums.ModelTypeEnum;
|
||||||
|
import com.xiang.xservice.ai.pojo.enums.AgentEnums;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class StockAnalysisAgent implements BaseAgent{
|
||||||
|
@Override
|
||||||
|
public void chat(ModelTypeEnum modelType, Long memoryId, Long userId, String message) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AgentEnums agent() {
|
||||||
|
return AgentEnums.STOCK_ANALYZER_AGENT;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,6 @@ package com.xiang.xservice.ai.core.provider;
|
|||||||
|
|
||||||
import com.xiang.xservice.ai.core.entity.ModelConfig;
|
import com.xiang.xservice.ai.core.entity.ModelConfig;
|
||||||
import com.xiang.xservice.ai.core.enums.ModelStrategyEnum;
|
import com.xiang.xservice.ai.core.enums.ModelStrategyEnum;
|
||||||
import com.xiang.xservice.ai.core.enums.ModelTypeEnum;
|
|
||||||
import dev.langchain4j.model.chat.ChatModel;
|
import dev.langchain4j.model.chat.ChatModel;
|
||||||
import dev.langchain4j.model.chat.StreamingChatModel;
|
import dev.langchain4j.model.chat.StreamingChatModel;
|
||||||
|
|
||||||
@@ -14,11 +13,18 @@ public interface BaseProvider {
|
|||||||
*/
|
*/
|
||||||
String providerName();
|
String providerName();
|
||||||
/**
|
/**
|
||||||
* 创建model
|
* 创建流式model
|
||||||
* @param config model配置文件
|
* @param config model配置文件
|
||||||
* @return ChatModel
|
* @return ChatModel
|
||||||
*/
|
*/
|
||||||
StreamingChatModel build(ModelConfig config);
|
StreamingChatModel build(ModelConfig config);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 同步聊天模型
|
||||||
|
* @param config
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
ChatModel buildChatModel(ModelConfig config);
|
||||||
/**
|
/**
|
||||||
* 用于标记这个 Provider 是否适合某个 TaskType
|
* 用于标记这个 Provider 是否适合某个 TaskType
|
||||||
* @param taskType ModelStrategyEnum
|
* @param taskType ModelStrategyEnum
|
||||||
|
|||||||
@@ -26,6 +26,15 @@ public class OllamaLlmProvider implements BaseProvider{
|
|||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ChatModel buildChatModel(ModelConfig config) {
|
||||||
|
return OllamaChatModel.builder()
|
||||||
|
.baseUrl(config.getBaseUrl())
|
||||||
|
.modelName(config.getModelName())
|
||||||
|
.temperature(config.getTemperature())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean support(ModelStrategyEnum taskType) {
|
public boolean support(ModelStrategyEnum taskType) {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -3,13 +3,14 @@ package com.xiang.xservice.ai.core.provider;
|
|||||||
import com.xiang.xservice.ai.core.entity.ModelConfig;
|
import com.xiang.xservice.ai.core.entity.ModelConfig;
|
||||||
import com.xiang.xservice.ai.core.enums.ModelStrategyEnum;
|
import com.xiang.xservice.ai.core.enums.ModelStrategyEnum;
|
||||||
import com.xiang.xservice.ai.core.enums.ModelTypeEnum;
|
import com.xiang.xservice.ai.core.enums.ModelTypeEnum;
|
||||||
import com.xiang.xservice.ai.core.storage.MemoryPersistentStore;
|
import dev.langchain4j.model.chat.ChatModel;
|
||||||
import dev.langchain4j.memory.chat.ChatMemoryProvider;
|
|
||||||
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
|
|
||||||
import dev.langchain4j.model.chat.StreamingChatModel;
|
import dev.langchain4j.model.chat.StreamingChatModel;
|
||||||
|
import dev.langchain4j.model.openai.OpenAiChatModel;
|
||||||
import dev.langchain4j.model.openai.OpenAiStreamingChatModel;
|
import dev.langchain4j.model.openai.OpenAiStreamingChatModel;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
|
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class OpenAILlmProvider implements BaseProvider {
|
public class OpenAILlmProvider implements BaseProvider {
|
||||||
@@ -33,6 +34,18 @@ public class OpenAILlmProvider implements BaseProvider {
|
|||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ChatModel buildChatModel(ModelConfig config) {
|
||||||
|
return OpenAiChatModel.builder()
|
||||||
|
.baseUrl(config.getBaseUrl())
|
||||||
|
.apiKey(config.getApiKey())
|
||||||
|
.modelName(config.getModelName())
|
||||||
|
.temperature(config.getTemperature())
|
||||||
|
.maxTokens(config.getMaxTokens())
|
||||||
|
.timeout(Duration.ofSeconds(300))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean support(ModelStrategyEnum taskType) {
|
public boolean support(ModelStrategyEnum taskType) {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -3,10 +3,8 @@ package com.xiang.xservice.ai.core.route;
|
|||||||
import com.xiang.xservice.ai.core.entity.ModelConfig;
|
import com.xiang.xservice.ai.core.entity.ModelConfig;
|
||||||
import com.xiang.xservice.ai.core.enums.ModelStrategyEnum;
|
import com.xiang.xservice.ai.core.enums.ModelStrategyEnum;
|
||||||
import com.xiang.xservice.ai.core.provider.BaseProvider;
|
import com.xiang.xservice.ai.core.provider.BaseProvider;
|
||||||
import com.xiang.xservice.ai.core.strategy.BaseStrategy;
|
|
||||||
import dev.langchain4j.model.chat.ChatModel;
|
import dev.langchain4j.model.chat.ChatModel;
|
||||||
import dev.langchain4j.model.chat.StreamingChatModel;
|
import dev.langchain4j.model.chat.StreamingChatModel;
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -29,7 +27,7 @@ public class ModelRouter {
|
|||||||
/**
|
/**
|
||||||
* 根据 providerName 选择 Provider,并用 config 构建模型
|
* 根据 providerName 选择 Provider,并用 config 构建模型
|
||||||
*/
|
*/
|
||||||
public StreamingChatModel route(String providerName, ModelConfig config) {
|
public StreamingChatModel routeStream(String providerName, ModelConfig config) {
|
||||||
BaseProvider provider = providerMap.get(providerName);
|
BaseProvider provider = providerMap.get(providerName);
|
||||||
if (provider == null) {
|
if (provider == null) {
|
||||||
throw new RuntimeException("Provider " + providerName + " not found");
|
throw new RuntimeException("Provider " + providerName + " not found");
|
||||||
@@ -37,6 +35,14 @@ public class ModelRouter {
|
|||||||
return provider.build(config);
|
return provider.build(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ChatModel route(String providerName, ModelConfig config) {
|
||||||
|
BaseProvider provider = providerMap.get(providerName);
|
||||||
|
if (provider == null) {
|
||||||
|
throw new RuntimeException("Provider " + providerName + " not found");
|
||||||
|
}
|
||||||
|
return provider.buildChatModel(config);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取某个 TaskType 支持的所有 Provider 名称
|
* 获取某个 TaskType 支持的所有 Provider 名称
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.xiang.xservice.ai.core.route;
|
|||||||
import com.xiang.xservice.ai.core.entity.ModelConfig;
|
import com.xiang.xservice.ai.core.entity.ModelConfig;
|
||||||
import com.xiang.xservice.ai.core.enums.ModelStrategyEnum;
|
import com.xiang.xservice.ai.core.enums.ModelStrategyEnum;
|
||||||
import com.xiang.xservice.ai.core.provider.BaseProvider;
|
import com.xiang.xservice.ai.core.provider.BaseProvider;
|
||||||
|
import dev.langchain4j.model.chat.ChatModel;
|
||||||
import dev.langchain4j.model.chat.StreamingChatModel;
|
import dev.langchain4j.model.chat.StreamingChatModel;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@@ -29,7 +30,17 @@ public class TaskRouter {
|
|||||||
/**
|
/**
|
||||||
* 第一层路由 + 第二层 ProviderRouter
|
* 第一层路由 + 第二层 ProviderRouter
|
||||||
*/
|
*/
|
||||||
public StreamingChatModel route(ModelStrategyEnum taskType, String providerName, ModelConfig config) {
|
public StreamingChatModel routeStream(ModelStrategyEnum taskType, String providerName, ModelConfig config) {
|
||||||
|
// 如果没有传 providerName,使用默认 Provider
|
||||||
|
if (providerName == null || providerName.isEmpty()) {
|
||||||
|
providerName = taskDefaultProviderMap.get(taskType).get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 第二层路由
|
||||||
|
return providerRouter.routeStream(providerName, config);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChatModel route(ModelStrategyEnum taskType, String providerName, ModelConfig config) {
|
||||||
// 如果没有传 providerName,使用默认 Provider
|
// 如果没有传 providerName,使用默认 Provider
|
||||||
if (providerName == null || providerName.isEmpty()) {
|
if (providerName == null || providerName.isEmpty()) {
|
||||||
providerName = taskDefaultProviderMap.get(taskType).get(0);
|
providerName = taskDefaultProviderMap.get(taskType).get(0);
|
||||||
|
|||||||
@@ -22,8 +22,12 @@ public class DbPersistentStore implements ChatMemoryStore {
|
|||||||
private final IAiSimpleChatMessageManage aiSimpleChatMessageManage;
|
private final IAiSimpleChatMessageManage aiSimpleChatMessageManage;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<ChatMessage> getMessages(Object memoryId) {
|
public List<ChatMessage> getMessages(Object args) {
|
||||||
List<AiSimpleChatMessageDO> msg = aiSimpleChatMessageManage.getMsgByMemoryId((Long) memoryId);
|
String argsStr = String.valueOf(args);
|
||||||
|
String[] split = argsStr.split("-");
|
||||||
|
Long userId = Long.valueOf(split[0]);
|
||||||
|
Long memoryId = Long.valueOf(split[1]);
|
||||||
|
List<AiSimpleChatMessageDO> msg = aiSimpleChatMessageManage.getMsgByMemoryId(userId, memoryId);
|
||||||
if (CollectionUtils.isEmpty(msg)) {
|
if (CollectionUtils.isEmpty(msg)) {
|
||||||
return Lists.newArrayList();
|
return Lists.newArrayList();
|
||||||
}
|
}
|
||||||
@@ -52,7 +56,11 @@ public class DbPersistentStore implements ChatMemoryStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateMessages(Object memoryId, List<ChatMessage> list) {
|
public void updateMessages(Object args, List<ChatMessage> list) {
|
||||||
|
String argsStr = String.valueOf(args);
|
||||||
|
String[] split = argsStr.split("-");
|
||||||
|
Long userId = Long.valueOf(split[0]);
|
||||||
|
Long memoryId = Long.valueOf(split[1]);
|
||||||
List<AiSimpleChatMessageDO> result = Lists.newArrayList();
|
List<AiSimpleChatMessageDO> result = Lists.newArrayList();
|
||||||
for (ChatMessage chatMessage : list) {
|
for (ChatMessage chatMessage : list) {
|
||||||
StringBuilder str = new StringBuilder();
|
StringBuilder str = new StringBuilder();
|
||||||
@@ -77,8 +85,8 @@ public class DbPersistentStore implements ChatMemoryStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
AiSimpleChatMessageDO message = AiSimpleChatMessageDO.builder()
|
AiSimpleChatMessageDO message = AiSimpleChatMessageDO.builder()
|
||||||
.userId(1L)
|
.userId(userId)
|
||||||
.memoryId((Long) memoryId)
|
.memoryId(memoryId)
|
||||||
.message(str.toString())
|
.message(str.toString())
|
||||||
.createTime(LocalDateTime.now())
|
.createTime(LocalDateTime.now())
|
||||||
.delFlag(0)
|
.delFlag(0)
|
||||||
@@ -91,7 +99,11 @@ public class DbPersistentStore implements ChatMemoryStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deleteMessages(Object memoryId) {
|
public void deleteMessages(Object args) {
|
||||||
aiSimpleChatMessageManage.deleteByMemoryId((Long) memoryId);
|
String argsStr = String.valueOf(args);
|
||||||
|
String[] split = argsStr.split("-");
|
||||||
|
Long userId = Long.valueOf(split[0]);
|
||||||
|
Long memoryId = Long.valueOf(split[1]);
|
||||||
|
aiSimpleChatMessageManage.deleteByMemoryId(userId, memoryId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,7 @@ package com.xiang.xservice.ai.core.strategy;
|
|||||||
|
|
||||||
import com.xiang.xservice.ai.core.entity.ModelConfig;
|
import com.xiang.xservice.ai.core.entity.ModelConfig;
|
||||||
import com.xiang.xservice.ai.core.enums.ModelStrategyEnum;
|
import com.xiang.xservice.ai.core.enums.ModelStrategyEnum;
|
||||||
import com.xiang.xservice.ai.core.provider.BaseProvider;
|
|
||||||
import com.xiang.xservice.ai.core.route.TaskRouter;
|
import com.xiang.xservice.ai.core.route.TaskRouter;
|
||||||
import dev.langchain4j.model.chat.ChatModel;
|
|
||||||
import dev.langchain4j.model.chat.StreamingChatModel;
|
import dev.langchain4j.model.chat.StreamingChatModel;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@@ -22,6 +20,6 @@ public class ChatStrategy implements BaseStrategy {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public StreamingChatModel createProvider(String provider, ModelConfig config) {
|
public StreamingChatModel createProvider(String provider, ModelConfig config) {
|
||||||
return taskRouter.route(ModelStrategyEnum.CHAT, provider, config);
|
return taskRouter.routeStream(ModelStrategyEnum.CHAT, provider, config);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package com.xiang.xservice.ai.pojo.enums;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum AgentEnums {
|
||||||
|
SIMPLE_CHAT_AGENT("SimpleChatAgent"),
|
||||||
|
STOCK_ANALYZER_AGENT("StockAnalysisAgent"),
|
||||||
|
;
|
||||||
|
private final String name;
|
||||||
|
}
|
||||||
@@ -12,15 +12,16 @@ import java.util.List;
|
|||||||
@Service
|
@Service
|
||||||
public class AiSimpleChatMessageManageImpl extends ServiceImpl<IAiSimpleChatMessageMapper, AiSimpleChatMessageDO> implements IAiSimpleChatMessageManage {
|
public class AiSimpleChatMessageManageImpl extends ServiceImpl<IAiSimpleChatMessageMapper, AiSimpleChatMessageDO> implements IAiSimpleChatMessageManage {
|
||||||
@Override
|
@Override
|
||||||
public List<AiSimpleChatMessageDO> getMsgByMemoryId(Long memoryId) {
|
public List<AiSimpleChatMessageDO> getMsgByMemoryId(Long userId, Long memoryId) {
|
||||||
LambdaQueryWrapper<AiSimpleChatMessageDO> lambdaQueryWrapper = Wrappers.lambdaQuery();
|
LambdaQueryWrapper<AiSimpleChatMessageDO> lambdaQueryWrapper = Wrappers.lambdaQuery();
|
||||||
|
lambdaQueryWrapper.eq(AiSimpleChatMessageDO::getUserId, userId);
|
||||||
lambdaQueryWrapper.eq(AiSimpleChatMessageDO::getMemoryId, memoryId);
|
lambdaQueryWrapper.eq(AiSimpleChatMessageDO::getMemoryId, memoryId);
|
||||||
lambdaQueryWrapper.eq(AiSimpleChatMessageDO::getDelFlag, 0);
|
lambdaQueryWrapper.eq(AiSimpleChatMessageDO::getDelFlag, 0);
|
||||||
return baseMapper.selectList(lambdaQueryWrapper);
|
return baseMapper.selectList(lambdaQueryWrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean deleteByMemoryId(Long memoryId) {
|
public boolean deleteByMemoryId(Long userId, Long memoryId) {
|
||||||
return baseMapper.deleteByMemoryId(memoryId) > 0;
|
return baseMapper.deleteByMemoryId(userId, memoryId) > 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,6 @@ import com.xiang.xservice.ai.pojo.entity.AiSimpleChatMessageDO;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public interface IAiSimpleChatMessageManage extends IService<AiSimpleChatMessageDO> {
|
public interface IAiSimpleChatMessageManage extends IService<AiSimpleChatMessageDO> {
|
||||||
List<AiSimpleChatMessageDO> getMsgByMemoryId(Long memoryId);
|
List<AiSimpleChatMessageDO> getMsgByMemoryId(Long userId, Long memoryId);
|
||||||
boolean deleteByMemoryId(Long memoryId);
|
boolean deleteByMemoryId(Long userId, Long memoryId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,6 @@ import org.springframework.stereotype.Repository;
|
|||||||
@Mapper
|
@Mapper
|
||||||
@Repository
|
@Repository
|
||||||
public interface IAiSimpleChatMessageMapper extends BaseMapper<AiSimpleChatMessageDO> {
|
public interface IAiSimpleChatMessageMapper extends BaseMapper<AiSimpleChatMessageDO> {
|
||||||
int deleteByMemoryId(@Param("id") Long memoryId);
|
int deleteByMemoryId(@Param("userId") Long userId, @Param("memoryId") Long memoryId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package com.xiang.xservice.ai.service;
|
||||||
|
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
import com.xiang.xservice.ai.agent.BaseAgent;
|
||||||
|
import com.xiang.xservice.ai.pojo.enums.AgentEnums;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class AgentService {
|
||||||
|
|
||||||
|
private final static Map<AgentEnums, BaseAgent> agents = Maps.newHashMap();
|
||||||
|
|
||||||
|
public AgentService(List<BaseAgent> agentList) {
|
||||||
|
agents.putAll(agentList.stream()
|
||||||
|
.collect(Collectors.toMap(BaseAgent::agent, Function.identity())));
|
||||||
|
}
|
||||||
|
|
||||||
|
public BaseAgent createAgent(AgentEnums name) {
|
||||||
|
BaseAgent agent = agents.get(name);
|
||||||
|
if (Objects.isNull(agent)) throw new RuntimeException("Agent not found: " + name);
|
||||||
|
return agent;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
</sql>
|
</sql>
|
||||||
|
|
||||||
<update id="deleteByMemoryId">
|
<update id="deleteByMemoryId">
|
||||||
update ai_simple_chat_message set del_flag = 1 where memory_id = #{id}
|
update ai_simple_chat_message set del_flag = 1 where memory_id = #{memoryId} and user_id = #{userId}
|
||||||
</update>
|
</update>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
Reference in New Issue
Block a user