From 63446c356df28f927e4d4735b2f867b278c1fec6 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 26 Aug 2025 11:38:30 +0800
Subject: [PATCH] refactor(ai): 优化 AI聊天功能代码

---
 src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java          |   73 ++++++++++++++++++++++++------------
 src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java |    5 ++
 src/main/java/cc/mrbird/febs/ai/req/talk/AiTalkAnswerStream.java         |    1 
 3 files changed, 52 insertions(+), 27 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java b/src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java
index ada9ad3..ce47ea2 100644
--- a/src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java
+++ b/src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java
@@ -17,6 +17,7 @@
 import cc.mrbird.febs.ai.service.AiMemberTalkService;
 import cc.mrbird.febs.ai.service.AiTalkService;
 import cc.mrbird.febs.common.entity.FebsResponse;
+import cn.hutool.core.util.StrUtil;
 import io.swagger.annotations.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -96,7 +97,9 @@
     })
     @PostMapping("/answer-streamV2")
     public Flux<FebsResponse> answerStreamV2(@RequestBody @Validated AiTalkAnswerStream dto) {
-
+        if (StrUtil.isEmpty(dto.getQuestion())){
+            return Flux.just(new FebsResponse().fail().message("请输入问题"));
+        }
         return aiTalkService.answerStreamV2(dto);
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/req/talk/AiTalkAnswerStream.java b/src/main/java/cc/mrbird/febs/ai/req/talk/AiTalkAnswerStream.java
index 0f4836e..199a944 100644
--- a/src/main/java/cc/mrbird/febs/ai/req/talk/AiTalkAnswerStream.java
+++ b/src/main/java/cc/mrbird/febs/ai/req/talk/AiTalkAnswerStream.java
@@ -17,7 +17,6 @@
     private String talkId;
 
 
-    @NotBlank(message = "内容不能为空")
     @ApiModelProperty(value = "内容", example = "10")
     private String question;
 }
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 cccfe88..1ea2e73 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
@@ -428,31 +428,27 @@
         String question = dto.getQuestion();
         log.info("----- standard request -----");
 
+        // 参数校验
+        if (StrUtil.isBlank(question)) {
+            return Flux.just(new FebsResponse().fail().message("问题不能为空"));
+        }
 
         List<ChatMessage> messages = new ArrayList<>();
+
         final ChatMessage systemMessage = ChatMessage.builder()
                 .role(ChatMessageRole.SYSTEM)
                 .content("你是豆包,是由字节跳动开发的 AI 人工智能助手")
                 .build();
         messages.add(systemMessage);
-        //获取消息记录
-        if (StrUtil.isNotEmpty(dto.getTalkId())){
+
+        // 获取历史消息记录
+        if (StrUtil.isNotEmpty(dto.getTalkId())) {
             List<AiTalkItem> aiTalkItems = aiTalkItemService.getListByTalkId(dto.getTalkId());
-            if(CollUtil.isNotEmpty(aiTalkItems)){
-                for (AiTalkItem aiTalkItem : aiTalkItems){
-                    if (aiTalkItem.getType() == 1){
-                        ChatMessage memberMessage = ChatMessage.builder()
-                                .role(ChatMessageRole.USER)
-                                .content(aiTalkItem.getContext())
-                                .build();
-                        messages.add(memberMessage);
-                    }
-                    if (aiTalkItem.getType() == 2){
-                        ChatMessage assistantMessage = ChatMessage.builder()
-                                .role(ChatMessageRole.ASSISTANT)
-                                .content(aiTalkItem.getContext())
-                                .build();
-                        messages.add(assistantMessage);
+            if (CollUtil.isNotEmpty(aiTalkItems)) {
+                for (AiTalkItem aiTalkItem : aiTalkItems) {
+                    ChatMessage chatMessage = buildChatMessageFromItem(aiTalkItem);
+                    if (chatMessage != null) {
+                        messages.add(chatMessage);
                     }
                 }
             }
@@ -486,18 +482,24 @@
                         return new FebsResponse().success().data("END");
                     }
 
-
-                    ApiMemberTalkStreamVo apiMemberTalkStreamVo = new ApiMemberTalkStreamVo();
-                    // 判断是否触发深度思考,触发则打印模型输出的思维链内容
                     ChatMessage message = choice.getMessage();
-                    if (message.getReasoningContent()!= null &&!message.getReasoningContent().isEmpty()) {
-                        apiMemberTalkStreamVo.setReasoningContent(message.getReasoningContent());
-                        System.out.print(message.getReasoningContent());
+                    ApiMemberTalkStreamVo apiMemberTalkStreamVo = new ApiMemberTalkStreamVo();
+
+                    // 处理 reasoning content
+                    String reasoningContent = message.getReasoningContent();
+                    if (StrUtil.isNotEmpty(reasoningContent)) {
+                        apiMemberTalkStreamVo.setReasoningContent(reasoningContent);
+                        log.debug("Reasoning Content: {}", reasoningContent);
                     }
 
-                    String content = message.getContent() == null ? "" : message.getContent().toString();
+                    // 安全处理 content
+                    String content = "";
+                    if (message.getContent() != null) {
+                        content = message.getContent().toString();
+                    }
                     apiMemberTalkStreamVo.setContent(content);
-                    System.out.print(content);
+                    log.debug("Content: {}", content);
+
                     return new FebsResponse().success().data(apiMemberTalkStreamVo);
                 })
                 .onErrorResume(throwable -> {
@@ -507,6 +509,27 @@
                 });
     }
 
+    // 提取为私有方法,提高可读性和复用性
+    private ChatMessage buildChatMessageFromItem(AiTalkItem item) {
+        if (item == null) return null;
+
+        switch (item.getType()) {
+            case 1:
+                return ChatMessage.builder()
+                        .role(ChatMessageRole.USER)
+                        .content(item.getContext())
+                        .build();
+            case 2:
+                return ChatMessage.builder()
+                        .role(ChatMessageRole.ASSISTANT)
+                        .content(item.getContext())
+                        .build();
+            default:
+                return null;
+        }
+    }
+
+
 
     private Report tryRepairTruncatedJson(String truncatedJson) {
         String[] repairAttempts = {

--
Gitblit v1.9.1