|
|
@@ -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;
|