From fb0722b250d3f77c93a32cbdd347c474008638ca Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Fri, 22 Aug 2025 13:33:22 +0800
Subject: [PATCH] feat(ai): 添加 AI 对话流式接口并优化相关服务

---
 src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java |   59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 58 insertions(+), 1 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java
index fb2b2e7..7e1e566 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java
@@ -1,14 +1,16 @@
 package cc.mrbird.febs.ai.service.impl;
 
-import cc.mrbird.febs.ai.controller.enumerates.AiTypeEnum;
+import cc.mrbird.febs.ai.enumerates.AiTypeEnum;
 import cc.mrbird.febs.ai.entity.AiProductRole;
 import cc.mrbird.febs.ai.req.ai.AiMessage;
 import cc.mrbird.febs.ai.req.ai.AiRequest;
 import cc.mrbird.febs.ai.res.ai.AiResponse;
 import cc.mrbird.febs.ai.res.ai.RadarDataItem;
 import cc.mrbird.febs.ai.res.ai.Report;
+import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkStreamVo;
 import cc.mrbird.febs.ai.service.AiProductRoleService;
 import cc.mrbird.febs.ai.service.AiService;
+import cc.mrbird.febs.common.entity.FebsResponse;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.json.JSONUtil;
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -23,10 +25,12 @@
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
+import reactor.core.publisher.Flux;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
@@ -354,6 +358,59 @@
         }
     }
 
+        // 修改服务实现
+    @Override
+    public Flux<FebsResponse> answerStream(String question) {
+        log.info("----- standard request -----");
+
+        final ChatMessage systemMessage = ChatMessage.builder()
+                .role(ChatMessageRole.SYSTEM)
+                .content("你是豆包,是由字节跳动开发的 AI 人工智能助手")
+                .build();
+
+        final ChatMessage userMessage = ChatMessage.builder()
+                .role(ChatMessageRole.USER)
+                .content(question)
+                .build();
+
+        List<ChatMessage> messages = Arrays.asList(systemMessage, userMessage);
+
+        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
+                .model("ep-20250805124033-lhxbf")
+                .messages(messages)
+                .stream(true)
+                .temperature(0.7)
+                .topP(0.9)
+                .maxTokens(2048)
+                .frequencyPenalty(0.0)
+                .build();
+
+        return Flux.from(service.streamChatCompletion(chatCompletionRequest))
+                .map(response -> {
+                    if (response == null || response.getChoices() == null || response.getChoices().isEmpty()) {
+                        return new FebsResponse().success().data("END");
+                    }
+
+                    ChatCompletionChoice choice = response.getChoices().get(0);
+                    if (choice == null || choice.getMessage() == null) {
+                        return new FebsResponse().success().data("END");
+                    }
+
+                    Object contentObj = choice.getMessage().getContent();
+                    String content = contentObj == null ? "" : contentObj.toString();
+
+                    ApiMemberTalkStreamVo apiMemberTalkStreamVo = new ApiMemberTalkStreamVo();
+                    apiMemberTalkStreamVo.setContent(content);
+                    return new FebsResponse().success().data(apiMemberTalkStreamVo);
+                })
+                .onErrorResume(throwable -> {
+                    log.error("流式调用AI服务失败,问题输入: {}", question, throwable);
+                    FebsResponse errorResponse = new FebsResponse().message("AI服务调用失败");
+                    return Flux.just(errorResponse);
+                });
+    }
+
+
     private Report tryRepairTruncatedJson(String truncatedJson) {
         String[] repairAttempts = {
                 truncatedJson + "\"}}}",

--
Gitblit v1.9.1