mirror of
https://gitcode.com/ageerle/ruoyi-ai.git
synced 2026-04-09 01:37:32 +00:00
feat: 流程编排init
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
package org.ruoyi.chat.service.chat;
|
||||
|
||||
import dev.langchain4j.model.chat.response.StreamingChatResponseHandler;
|
||||
import org.ruoyi.common.chat.request.ChatRequest;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
||||
|
||||
@@ -13,9 +14,21 @@ public interface IChatService {
|
||||
|
||||
/**
|
||||
* 客户端发送消息到服务端
|
||||
*
|
||||
* @param chatRequest 请求对象
|
||||
*/
|
||||
SseEmitter chat(ChatRequest chatRequest,SseEmitter emitter);
|
||||
SseEmitter chat(ChatRequest chatRequest, SseEmitter emitter);
|
||||
|
||||
/**
|
||||
* 工作流场景:支持 langchain4j 的 StreamingChatResponseHandler
|
||||
*
|
||||
* @param chatRequest ruoyi-ai 的请求对象
|
||||
* @param handler langchain4j 的流式响应处理器
|
||||
*/
|
||||
default void chat(ChatRequest chatRequest, StreamingChatResponseHandler handler) {
|
||||
throw new UnsupportedOperationException("此服务暂不支持工作流场景");
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取此服务支持的模型类别
|
||||
*/
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
package org.ruoyi.chat.service.chat.impl;
|
||||
|
||||
|
||||
import dev.langchain4j.data.message.AiMessage;
|
||||
import dev.langchain4j.data.message.ChatMessage;
|
||||
import dev.langchain4j.data.message.SystemMessage;
|
||||
import dev.langchain4j.data.message.UserMessage;
|
||||
import dev.langchain4j.model.chat.StreamingChatModel;
|
||||
import dev.langchain4j.model.chat.response.ChatResponse;
|
||||
import dev.langchain4j.model.chat.response.StreamingChatResponseHandler;
|
||||
@@ -16,6 +20,9 @@ import org.ruoyi.service.IChatModelService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
/**
|
||||
* deepseek
|
||||
*/
|
||||
@@ -70,6 +77,52 @@ public class DeepSeekChatImpl implements IChatService {
|
||||
return emitter;
|
||||
}
|
||||
|
||||
/**
|
||||
* 工作流场景:支持 langchain4j handler
|
||||
*/
|
||||
@Override
|
||||
public void chat(ChatRequest request, StreamingChatResponseHandler handler) {
|
||||
log.info("workflow chat, model: {}", request.getModel());
|
||||
|
||||
ChatModelVo chatModelVo = chatModelService.selectModelByName(request.getModel());
|
||||
|
||||
StreamingChatModel chatModel = OpenAiStreamingChatModel.builder()
|
||||
.baseUrl(chatModelVo.getApiHost())
|
||||
.apiKey(chatModelVo.getApiKey())
|
||||
.modelName(chatModelVo.getModelName())
|
||||
.logRequests(true)
|
||||
.logResponses(true)
|
||||
.temperature(0.8)
|
||||
.build();
|
||||
|
||||
try {
|
||||
// 将 ruoyi-ai 的 ChatRequest 转换为 langchain4j 的格式
|
||||
dev.langchain4j.model.chat.request.ChatRequest langchainRequest = convertToLangchainRequest(request);
|
||||
chatModel.chat(langchainRequest, handler);
|
||||
} catch (Exception e) {
|
||||
log.error("workflow deepseek请求失败:{}", e.getMessage(), e);
|
||||
throw new RuntimeException("DeepSeek workflow chat failed: " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换请求格式
|
||||
*/
|
||||
private dev.langchain4j.model.chat.request.ChatRequest convertToLangchainRequest(ChatRequest request) {
|
||||
List<ChatMessage> messages = new ArrayList<>();
|
||||
for (org.ruoyi.common.chat.entity.chat.Message msg : request.getMessages()) {
|
||||
// 简单转换,您可以根据实际需求调整
|
||||
if ("user".equals(msg.getRole())) {
|
||||
messages.add(UserMessage.from(msg.getContent().toString()));
|
||||
} else if ("system".equals(msg.getRole())) {
|
||||
messages.add(SystemMessage.from(msg.getContent().toString()));
|
||||
} else if ("assistant".equals(msg.getRole())) {
|
||||
messages.add(AiMessage.from(msg.getContent().toString()));
|
||||
}
|
||||
}
|
||||
return dev.langchain4j.model.chat.request.ChatRequest.builder().messages(messages).build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCategory() {
|
||||
return ChatModeType.DEEPSEEK.getCode();
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
package org.ruoyi.chat.service.chat.impl;
|
||||
|
||||
import dev.langchain4j.community.model.dashscope.QwenStreamingChatModel;
|
||||
import dev.langchain4j.data.message.AiMessage;
|
||||
import dev.langchain4j.data.message.ChatMessage;
|
||||
import dev.langchain4j.data.message.SystemMessage;
|
||||
import dev.langchain4j.data.message.UserMessage;
|
||||
import dev.langchain4j.model.chat.StreamingChatModel;
|
||||
import dev.langchain4j.model.chat.response.ChatResponse;
|
||||
import dev.langchain4j.model.chat.response.StreamingChatResponseHandler;
|
||||
@@ -8,13 +12,16 @@ import lombok.SneakyThrows;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.ruoyi.chat.enums.ChatModeType;
|
||||
import org.ruoyi.chat.service.chat.IChatService;
|
||||
import org.ruoyi.chat.support.ChatServiceHelper;
|
||||
import org.ruoyi.common.chat.request.ChatRequest;
|
||||
import org.ruoyi.domain.vo.ChatModelVo;
|
||||
import org.ruoyi.service.IChatModelService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
||||
import org.ruoyi.chat.support.ChatServiceHelper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
@@ -22,7 +29,7 @@ import org.ruoyi.chat.support.ChatServiceHelper;
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
public class QianWenAiChatServiceImpl implements IChatService {
|
||||
public class QianWenAiChatServiceImpl implements IChatService {
|
||||
|
||||
@Autowired
|
||||
private IChatModelService chatModelService;
|
||||
@@ -37,7 +44,6 @@ public class QianWenAiChatServiceImpl implements IChatService {
|
||||
.build();
|
||||
|
||||
|
||||
|
||||
// 发送流式消息
|
||||
try {
|
||||
model.chat(chatRequest.getPrompt(), new StreamingChatResponseHandler() {
|
||||
@@ -70,11 +76,53 @@ public class QianWenAiChatServiceImpl implements IChatService {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 工作流场景:支持 langchain4j handler
|
||||
*/
|
||||
@Override
|
||||
public void chat(ChatRequest request, StreamingChatResponseHandler handler) {
|
||||
log.info("workflow chat, model: {}", request.getModel());
|
||||
|
||||
ChatModelVo chatModelVo = chatModelService.selectModelByName(request.getModel());
|
||||
|
||||
StreamingChatModel model = QwenStreamingChatModel.builder()
|
||||
.apiKey(chatModelVo.getApiKey())
|
||||
.modelName(chatModelVo.getModelName())
|
||||
.build();
|
||||
|
||||
try {
|
||||
// 将 ruoyi-ai 的 ChatRequest 转换为 langchain4j 的格式
|
||||
dev.langchain4j.model.chat.request.ChatRequest langchainRequest = convertToLangchainRequest(request);
|
||||
model.chat(langchainRequest, handler);
|
||||
} catch (Exception e) {
|
||||
log.error("workflow 千问请求失败:{}", e.getMessage(), e);
|
||||
throw new RuntimeException("QianWen workflow chat failed: " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换请求格式
|
||||
*/
|
||||
private dev.langchain4j.model.chat.request.ChatRequest convertToLangchainRequest(ChatRequest request) {
|
||||
List<ChatMessage> messages = new ArrayList<>();
|
||||
for (org.ruoyi.common.chat.entity.chat.Message msg : request.getMessages()) {
|
||||
if ("user".equals(msg.getRole())) {
|
||||
messages.add(UserMessage.from(msg.getContent().toString()));
|
||||
} else if ("system".equals(msg.getRole())) {
|
||||
messages.add(SystemMessage.from(msg.getContent().toString()));
|
||||
} else if ("assistant".equals(msg.getRole())) {
|
||||
messages.add(AiMessage.from(msg.getContent().toString()));
|
||||
}
|
||||
}
|
||||
return dev.langchain4j.model.chat.request.ChatRequest.builder()
|
||||
.messages(messages)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCategory() {
|
||||
return ChatModeType.QIANWEN.getCode();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user