package org.ruoyi.chat.service.chat.impl; import dev.langchain4j.model.chat.StreamingChatModel; import dev.langchain4j.model.chat.response.ChatResponse; import dev.langchain4j.model.chat.response.StreamingChatResponseHandler; import dev.langchain4j.model.openai.OpenAiStreamingChatModel; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.ruoyi.chat.enums.ChatModeType; import org.ruoyi.chat.service.chat.IChatService; 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 java.util.HashMap; import java.util.Map; /** * deepseek */ @Service @Slf4j public class DeepSeekChatImpl implements IChatService { @Autowired private IChatModelService chatModelService; @Override public SseEmitter chat(ChatRequest chatRequest, SseEmitter emitter) { ChatModelVo chatModelVo = chatModelService.selectModelByName(chatRequest.getModel()); StreamingChatModel chatModel = OpenAiStreamingChatModel.builder() .baseUrl(chatModelVo.getApiHost()) .apiKey(chatModelVo.getApiKey()) .modelName(chatModelVo.getModelName()) .logRequests(true) .logResponses(true) .temperature(0.8) .build(); // 发送流式消息 try { chatModel.chat(chatRequest.getPrompt(), new StreamingChatResponseHandler() { @SneakyThrows @Override public void onPartialResponse(String partialResponse) { emitter.send(partialResponse); log.info("收到消息片段: {}", partialResponse); System.out.print(partialResponse); } @Override public void onCompleteResponse(ChatResponse completeResponse) { emitter.complete(); log.info("消息结束,完整消息ID: {}", completeResponse); } @Override public void onError(Throwable error) { System.err.println("错误: " + error.getMessage()); } }); } catch (Exception e) { log.error("deepseek请求失败:{}", e.getMessage()); } return emitter; } @Override public String getCategory() { return ChatModeType.DEEPSEEK.getCode(); } }