package org.ruoyi.chat.service.chat.impl; import io.github.imfangs.dify.client.DifyClient; import io.github.imfangs.dify.client.DifyClientFactory; import io.github.imfangs.dify.client.callback.ChatStreamCallback; import io.github.imfangs.dify.client.enums.ResponseMode; import io.github.imfangs.dify.client.event.ErrorEvent; import io.github.imfangs.dify.client.event.MessageEndEvent; import io.github.imfangs.dify.client.event.MessageEvent; import io.github.imfangs.dify.client.model.DifyConfig; import io.github.imfangs.dify.client.model.chat.ChatMessage; 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; /** * dify 聊天管理 * * @author ageer */ @Service @Slf4j public class DifyServiceImpl implements IChatService { @Autowired private IChatModelService chatModelService; @Override public SseEmitter chat(ChatRequest chatRequest, SseEmitter emitter) { ChatModelVo chatModelVo = chatModelService.selectModelByName(chatRequest.getModel()); // 使用自定义配置创建客户端 DifyConfig config = DifyConfig.builder() .baseUrl(chatModelVo.getApiHost()) .apiKey(chatModelVo.getApiKey()) .connectTimeout(5000) .readTimeout(60000) .writeTimeout(30000) .build(); DifyClient chatClient = DifyClientFactory.createClient(config); // 创建聊天消息 ChatMessage message = ChatMessage.builder() .query(chatRequest.getPrompt()) .user(chatRequest.getUserId().toString()) .responseMode(ResponseMode.STREAMING) .build(); // 发送流式消息 try { chatClient.sendChatMessageStream(message, new ChatStreamCallback() { @SneakyThrows @Override public void onMessage(MessageEvent event) { emitter.send(event.getAnswer()); log.info("收到消息片段: {}", event.getAnswer()); } @Override public void onMessageEnd(MessageEndEvent event) { emitter.complete(); log.info("消息结束,完整消息ID: {}", event.getMessageId()); } @Override public void onError(ErrorEvent event) { System.err.println("错误: " + event.getMessage()); } @Override public void onException(Throwable throwable) { System.err.println("异常: " + throwable.getMessage()); } }); } catch (Exception e) { log.error("dify请求失败:{}", e.getMessage()); } return emitter; } @Override public String getCategory() { return ChatModeType.DIFY.getCode(); } }