Pārlūkot izejas kodu

TTS请求加入了重试逻辑(重试2次)

liyanbo 1 mēnesi atpakaļ
vecāks
revīzija
ab5c2f6f4f

+ 15 - 10
byzs-module-ai/src/main/java/cn/iocoder/byzs/module/ai/service/chat/AiChatMessageServiceImpl.java

@@ -3,11 +3,6 @@ package cn.iocoder.byzs.module.ai.service.chat;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.iocoder.byzs.module.ai.dal.dataobject.tts.AiTtsDO;
-import cn.iocoder.byzs.module.ai.dal.mysql.tts.AiTtsMapper;
-import cn.iocoder.byzs.module.ai.util.tts.StreamTtsService;
-import cn.iocoder.byzs.module.ai.enums.model.AiPlatformEnum;
-import cn.iocoder.byzs.module.ai.util.AiUtils;
 import cn.iocoder.byzs.framework.common.pojo.CommonResult;
 import cn.iocoder.byzs.framework.common.pojo.PageResult;
 import cn.iocoder.byzs.framework.common.util.object.BeanUtils;
@@ -22,8 +17,11 @@ import cn.iocoder.byzs.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO;
 import cn.iocoder.byzs.module.ai.dal.dataobject.model.AiChatRoleDO;
 import cn.iocoder.byzs.module.ai.dal.dataobject.model.AiModelDO;
 import cn.iocoder.byzs.module.ai.dal.dataobject.model.AiToolDO;
+import cn.iocoder.byzs.module.ai.dal.dataobject.tts.AiTtsDO;
 import cn.iocoder.byzs.module.ai.dal.mysql.chat.AiChatMessageMapper;
+import cn.iocoder.byzs.module.ai.dal.mysql.tts.AiTtsMapper;
 import cn.iocoder.byzs.module.ai.enums.ErrorCodeConstants;
+import cn.iocoder.byzs.module.ai.enums.model.AiPlatformEnum;
 import cn.iocoder.byzs.module.ai.service.knowledge.AiKnowledgeDocumentService;
 import cn.iocoder.byzs.module.ai.service.knowledge.AiKnowledgeSegmentService;
 import cn.iocoder.byzs.module.ai.service.knowledge.bo.AiKnowledgeSegmentSearchReqBO;
@@ -31,6 +29,8 @@ import cn.iocoder.byzs.module.ai.service.knowledge.bo.AiKnowledgeSegmentSearchRe
 import cn.iocoder.byzs.module.ai.service.model.AiChatRoleService;
 import cn.iocoder.byzs.module.ai.service.model.AiModelService;
 import cn.iocoder.byzs.module.ai.service.model.AiToolService;
+import cn.iocoder.byzs.module.ai.util.AiUtils;
+import cn.iocoder.byzs.module.ai.util.tts.StreamTtsService;
 import cn.iocoder.byzs.module.ai.util.tts.WavHeader;
 import com.alibaba.nls.client.protocol.SampleRateEnum;
 import jakarta.annotation.Resource;
@@ -47,12 +47,11 @@ import org.springframework.ai.chat.prompt.Prompt;
 import org.springframework.beans.factory.ObjectProvider;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import reactor.core.publisher.DirectProcessor;
+import org.springframework.web.reactive.function.client.WebClientRequestException;
 import reactor.core.publisher.Flux;
-import reactor.core.publisher.FluxSink;
+import reactor.util.retry.Retry;
 
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
+import java.time.Duration;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.Executors;
@@ -204,7 +203,13 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
 
         // 4.2 构建 Prompt,并进行调用
         Prompt prompt = buildPrompt(conversation, historyMessages, knowledgeSegments, model, sendReqVO);
-        Flux<ChatResponse> streamResponse = chatModel.stream(prompt);
+        // 重试逻辑
+        Flux<ChatResponse> streamResponse = Flux.defer(() -> chatModel.stream(prompt))
+                .retryWhen(Retry.backoff(2, Duration.ofSeconds(1))
+                        .filter(throwable -> throwable instanceof WebClientRequestException
+                                && throwable.getMessage().contains("Connection reset by peer")));
+
+//        Flux<ChatResponse> streamResponse = chatModel.stream(prompt);
 
         // 4.3 初始化TTS服务 - 创建新的实例而非使用共享实例
         StreamTtsService streamTtsService;