From 7695a3f8b7d51347d5a5f3718cabb9653304ee53 Mon Sep 17 00:00:00 2001 From: jsonwan Date: Fri, 25 Oct 2024 17:38:47 +0800 Subject: [PATCH 1/3] =?UTF-8?q?perf:=20AI=E5=B0=8F=E9=B2=B8=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96=20#3258?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.支持记录发起对话时所在的业务信息。 --- .../analysis/api/web/impl/WebAIResourceImpl.java | 14 ++++++++++---- .../analysis/dao/impl/AIChatHistoryDAOImpl.java | 2 ++ .../job/analysis/model/dto/AIChatHistoryDTO.java | 5 +++++ .../analysis/service/ai/AIChatHistoryService.java | 2 ++ .../analysis/service/ai/AICheckScriptService.java | 3 ++- .../bk/job/analysis/service/ai/ChatService.java | 3 ++- .../service/ai/impl/AIAnalyzeErrorServiceImpl.java | 4 +++- .../analysis/service/ai/impl/AIBaseService.java | 11 +++++++++-- .../service/ai/impl/AIChatHistoryServiceImpl.java | 2 ++ .../service/ai/impl/AICheckScriptServiceImpl.java | 4 ++-- .../analysis/service/ai/impl/ChatServiceImpl.java | 3 ++- 11 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/api/web/impl/WebAIResourceImpl.java b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/api/web/impl/WebAIResourceImpl.java index 0d93088a65..191bb16c32 100644 --- a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/api/web/impl/WebAIResourceImpl.java +++ b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/api/web/impl/WebAIResourceImpl.java @@ -104,7 +104,7 @@ public Response> getLatestChatHistoryList(String username, Integer start, Integer length) { if (!aiChatHistoryService.existsChatHistory(username)) { - AIChatHistoryDTO greetingChatHistory = getGreetingChatHistory(username); + AIChatHistoryDTO greetingChatHistory = getGreetingChatHistory(username, appResourceScope.getAppId()); Long id = aiChatHistoryService.insertChatHistory(greetingChatHistory); log.debug("Greeting chat history created, username={}, id={}", username, id); } @@ -115,9 +115,10 @@ public Response> getLatestChatHistoryList(String username, return Response.buildSuccessResp(aiChatRecordList); } - private AIChatHistoryDTO getGreetingChatHistory(String username) { + private AIChatHistoryDTO getGreetingChatHistory(String username, Long appId) { AIChatHistoryDTO greetingChatHistory = new AIChatHistoryDTO(); greetingChatHistory.setUsername(username); + greetingChatHistory.setAppId(appId); greetingChatHistory.setUserInput(""); greetingChatHistory.setStartTime(System.currentTimeMillis()); greetingChatHistory.setPromptTemplateId(null); @@ -138,7 +139,7 @@ public Response generalChat(String username, String scopeType, String scopeId, AIGeneralChatReq req) { - AIChatRecord aiChatRecord = chatService.chatWithAI(username, req.getContent()); + AIChatRecord aiChatRecord = chatService.chatWithAI(username, appResourceScope.getAppId(), req.getContent()); return Response.buildSuccessResp(aiChatRecord); } @@ -148,7 +149,12 @@ public Response checkScript(String username, String scopeType, String scopeId, AICheckScriptReq req) { - AIChatRecord aiChatRecord = aiCheckScriptService.check(username, req.getType(), req.getContent()); + AIChatRecord aiChatRecord = aiCheckScriptService.check( + username, + appResourceScope.getAppId(), + req.getType(), + req.getContent() + ); return Response.buildSuccessResp(aiChatRecord); } diff --git a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/dao/impl/AIChatHistoryDAOImpl.java b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/dao/impl/AIChatHistoryDAOImpl.java index a059b69636..5cfc6cf092 100644 --- a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/dao/impl/AIChatHistoryDAOImpl.java +++ b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/dao/impl/AIChatHistoryDAOImpl.java @@ -79,6 +79,7 @@ public AIChatHistoryDAOImpl(@Qualifier("job-analysis-dsl-context") public Long insertAIChatHistory(AIChatHistoryDTO aiChatHistoryDTO) { val query = dslContext.insertInto(defaultTable, defaultTable.USERNAME, + defaultTable.APP_ID, defaultTable.USER_INPUT, defaultTable.PROMPT_TEMPLATE_ID, defaultTable.AI_INPUT, @@ -93,6 +94,7 @@ public Long insertAIChatHistory(AIChatHistoryDTO aiChatHistoryDTO) { ) .values( aiChatHistoryDTO.getUsername(), + aiChatHistoryDTO.getAppId(), aiChatHistoryDTO.getUserInput(), aiChatHistoryDTO.getPromptTemplateId(), aiChatHistoryDTO.getAiInput(), diff --git a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/model/dto/AIChatHistoryDTO.java b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/model/dto/AIChatHistoryDTO.java index 372f4960cc..8b1593a8b5 100644 --- a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/model/dto/AIChatHistoryDTO.java +++ b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/model/dto/AIChatHistoryDTO.java @@ -58,6 +58,11 @@ public class AIChatHistoryDTO { */ private String username; + /** + * Job业务ID + */ + private Long appId; + /** * 用户输入内容 */ diff --git a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/AIChatHistoryService.java b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/AIChatHistoryService.java index c2cce8f3e6..756beacf09 100644 --- a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/AIChatHistoryService.java +++ b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/AIChatHistoryService.java @@ -35,6 +35,7 @@ public interface AIChatHistoryService { * 构建AI聊天记录 * * @param username 用户名 + * @param appId Job业务ID * @param startTime 开始时间 * @param aiPromptDTO AI提示符信息 * @param status 对话状态 @@ -42,6 +43,7 @@ public interface AIChatHistoryService { * @return AI聊天记录 */ AIChatHistoryDTO buildAIChatHistoryDTO(String username, + Long appId, Long startTime, AIPromptDTO aiPromptDTO, Integer status, diff --git a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/AICheckScriptService.java b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/AICheckScriptService.java index 99524dd176..584b947862 100644 --- a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/AICheckScriptService.java +++ b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/AICheckScriptService.java @@ -32,9 +32,10 @@ public interface AICheckScriptService { * 检查脚本 * * @param username 用户名 + * @param appId Job业务ID * @param type 脚本类型 * @param scriptContent 脚本内容 * @return AI对话记录 */ - AIChatRecord check(String username, Integer type, String scriptContent); + AIChatRecord check(String username, Long appId, Integer type, String scriptContent); } diff --git a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/ChatService.java b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/ChatService.java index 0f3150e903..345b8aad5b 100644 --- a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/ChatService.java +++ b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/ChatService.java @@ -36,10 +36,11 @@ public interface ChatService { * 与AI聊天并处理聊天记录保存等逻辑 * * @param username 用户名 + * @param appId Job业务ID * @param userInput 用户输入 * @return AI对话记录 */ - AIChatRecord chatWithAI(String username, String userInput); + AIChatRecord chatWithAI(String username, Long appId, String userInput); /** * 获取最近的聊天记录列表 diff --git a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIAnalyzeErrorServiceImpl.java b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIAnalyzeErrorServiceImpl.java index 2631fc495b..c5592b051b 100644 --- a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIAnalyzeErrorServiceImpl.java +++ b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIAnalyzeErrorServiceImpl.java @@ -85,6 +85,7 @@ public AIChatRecord analyze(String username, Long appId, AIAnalyzeErrorReq req) if (!taskContext.isTaskFail()) { return getDirectlyAIChatRecord( username, + appId, aiPromptDTO, aiMessageI18nService.getNotFailTaskAIAnswerMessage() ); @@ -94,6 +95,7 @@ public AIChatRecord analyze(String username, Long appId, AIAnalyzeErrorReq req) if (!taskContext.isTaskFail()) { return getDirectlyAIChatRecord( username, + appId, aiPromptDTO, aiMessageI18nService.getNotFailTaskAIAnswerMessage() ); @@ -102,6 +104,6 @@ public AIChatRecord analyze(String username, Long appId, AIAnalyzeErrorReq req) throw new InvalidParamException(ErrorCode.AI_ANALYZE_ERROR_ONLY_SUPPORT_SCRIPT_OR_FILE_STEP); } AIAnalyzeErrorContextDTO analyzeErrorContext = AIAnalyzeErrorContextDTO.fromAIAnalyzeErrorReq(req); - return getAIChatRecord(username, aiPromptDTO, analyzeErrorContext); + return getAIChatRecord(username, appId, aiPromptDTO, analyzeErrorContext); } } diff --git a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIBaseService.java b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIBaseService.java index c729310d42..fe3b515053 100644 --- a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIBaseService.java +++ b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIBaseService.java @@ -50,29 +50,34 @@ public AIBaseService(AIChatHistoryService aiChatHistoryService) { * 使用AI提示符调用AI接口生成AI回答 * * @param username 用户名 + * @param appId Job业务ID * @param aiPromptDTO AI提示符 * @return AI对话记录 */ public AIChatRecord getAIChatRecord(String username, + Long appId, AIPromptDTO aiPromptDTO) { - return getAIChatRecord(username, aiPromptDTO, null); + return getAIChatRecord(username, appId, aiPromptDTO, null); } /** * 使用AI提示符调用AI接口生成AI回答(支持报错分析上下文) * * @param username 用户名 + * @param appId Job业务ID * @param aiPromptDTO AI提示符 * @param analyzeErrorContext 报错分析上下文信息 * @return AI对话记录 */ public AIChatRecord getAIChatRecord(String username, + Long appId, AIPromptDTO aiPromptDTO, AIAnalyzeErrorContextDTO analyzeErrorContext) { long startTime = System.currentTimeMillis(); // 1.插入初始聊天记录 AIChatHistoryDTO aiChatHistoryDTO = aiChatHistoryService.buildAIChatHistoryDTO( username, + appId, startTime, aiPromptDTO, AIChatStatusEnum.INIT.getStatus(), @@ -88,16 +93,18 @@ public AIChatRecord getAIChatRecord(String username, * 使用指定内容直接生成AI回答 * * @param username 用户名 + * @param appId Job业务ID * @param aiPromptDTO AI提示符 * @param content 指定内容 * @return AI对话记录 */ - public AIChatRecord getDirectlyAIChatRecord(String username, AIPromptDTO aiPromptDTO, String content) { + public AIChatRecord getDirectlyAIChatRecord(String username, Long appId, AIPromptDTO aiPromptDTO, String content) { long startTime = System.currentTimeMillis(); aiPromptDTO.setRenderedPrompt(buildAIDirectlyAnswerInput(content)); AIAnswer aiAnswer = new AIAnswer("0", "", content, System.currentTimeMillis()); AIChatHistoryDTO aiChatHistoryDTO = aiChatHistoryService.buildAIChatHistoryDTO( username, + appId, startTime, aiPromptDTO, AIChatStatusEnum.FINISHED.getStatus(), diff --git a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIChatHistoryServiceImpl.java b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIChatHistoryServiceImpl.java index 08ef542bc0..b0f1883f03 100644 --- a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIChatHistoryServiceImpl.java +++ b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIChatHistoryServiceImpl.java @@ -53,12 +53,14 @@ public AIChatHistoryServiceImpl(AIChatHistoryDAO aiChatHistoryDAO) { @Override public AIChatHistoryDTO buildAIChatHistoryDTO(String username, + Long appId, Long startTime, AIPromptDTO aiPromptDTO, Integer status, AIAnswer aiAnswer) { AIChatHistoryDTO aiChatHistoryDTO = new AIChatHistoryDTO(); aiChatHistoryDTO.setUsername(username); + aiChatHistoryDTO.setAppId(appId); aiChatHistoryDTO.setUserInput(aiPromptDTO.getRawPrompt()); aiChatHistoryDTO.setPromptTemplateId(aiPromptDTO.getPromptTemplateId()); aiChatHistoryDTO.setAiInput(aiPromptDTO.getRenderedPrompt()); diff --git a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AICheckScriptServiceImpl.java b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AICheckScriptServiceImpl.java index c9a4732c33..535f4c94e5 100644 --- a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AICheckScriptServiceImpl.java +++ b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AICheckScriptServiceImpl.java @@ -47,8 +47,8 @@ public AICheckScriptServiceImpl(CheckScriptAIPromptService checkScriptAIPromptSe } @Override - public AIChatRecord check(String username, Integer type, String scriptContent) { + public AIChatRecord check(String username, Long appId, Integer type, String scriptContent) { AIPromptDTO aiPromptDTO = checkScriptAIPromptService.getPrompt(type, scriptContent); - return getAIChatRecord(username, aiPromptDTO); + return getAIChatRecord(username, appId, aiPromptDTO); } } diff --git a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/ChatServiceImpl.java b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/ChatServiceImpl.java index 4859f72a4f..d3e3ee1fdc 100644 --- a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/ChatServiceImpl.java +++ b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/ChatServiceImpl.java @@ -72,12 +72,13 @@ public ChatServiceImpl(AIChatHistoryService aiChatHistoryService, } @Override - public AIChatRecord chatWithAI(String username, String userInput) { + public AIChatRecord chatWithAI(String username, Long appId, String userInput) { Long startTime = System.currentTimeMillis(); // 1.保存初始聊天记录 AIPromptDTO aiPromptDTO = new AIPromptDTO(null, userInput, userInput); AIChatHistoryDTO aiChatHistoryDTO = aiChatHistoryService.buildAIChatHistoryDTO( username, + appId, startTime, aiPromptDTO, AIChatStatusEnum.INIT.getStatus(), From 99222cbe9aaa8bf3196b9a156f1573461b148a90 Mon Sep 17 00:00:00 2001 From: jsonwan Date: Mon, 28 Oct 2024 10:32:19 +0800 Subject: [PATCH 2/3] =?UTF-8?q?perf:=20AI=E5=B0=8F=E9=B2=B8=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96=20#3258?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.日志优化。 --- .../bk/job/common/aidev/impl/JobOpenAiClientBuilderFactory.java | 1 - .../job/analysis/service/ai/impl/AIAnswerStreamSynchronizer.java | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/commons/ai-dev-sdk/src/main/java/com/tencent/bk/job/common/aidev/impl/JobOpenAiClientBuilderFactory.java b/src/backend/commons/ai-dev-sdk/src/main/java/com/tencent/bk/job/common/aidev/impl/JobOpenAiClientBuilderFactory.java index d5652af59f..154e0dbf30 100644 --- a/src/backend/commons/ai-dev-sdk/src/main/java/com/tencent/bk/job/common/aidev/impl/JobOpenAiClientBuilderFactory.java +++ b/src/backend/commons/ai-dev-sdk/src/main/java/com/tencent/bk/job/common/aidev/impl/JobOpenAiClientBuilderFactory.java @@ -33,7 +33,6 @@ public class JobOpenAiClientBuilderFactory implements OpenAiClientBuilderFactory { @Override public OpenAiClient.Builder get() { - log.info("Creating a new instance of the DefaultOpenAiClient.Builder"); return DefaultOpenAiClient.builder(); } } diff --git a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIAnswerStreamSynchronizer.java b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIAnswerStreamSynchronizer.java index 97787ce930..9a8d6fb55b 100644 --- a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIAnswerStreamSynchronizer.java +++ b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIAnswerStreamSynchronizer.java @@ -77,6 +77,7 @@ public AsyncConsumerAndProducerPair buildAsyncConsumerAndProducerPair() { if (event.isEnd()) { Throwable throwable = event.getThrowable(); if (throwable != null) { + log.warn("Receive end event with throwable", throwable); Response respBody = Response.buildCommonFailResp(ErrorCode.BK_OPEN_AI_API_DATA_ERROR); AIAnswerUtil.setRequestIdAndWriteResp(outputStream, respBody); From b8b5b427c3f8372555fb1e210b14720b864d1b08 Mon Sep 17 00:00:00 2001 From: jsonwan Date: Mon, 28 Oct 2024 15:03:51 +0800 Subject: [PATCH 3/3] =?UTF-8?q?perf:=20AI=E5=B0=8F=E9=B2=B8=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96=20#3258?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.错误响应处理优化。 --- .../bk/job/analysis/service/ai/impl/AIAnswerHandler.java | 8 +++++--- .../service/ai/impl/AIAnswerStreamSynchronizer.java | 9 ++++++--- .../bk/job/analysis/service/ai/impl/ChatServiceImpl.java | 5 +++++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIAnswerHandler.java b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIAnswerHandler.java index 45960f8728..cdd2a32ca2 100644 --- a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIAnswerHandler.java +++ b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIAnswerHandler.java @@ -26,6 +26,8 @@ import com.tencent.bk.job.analysis.model.web.resp.AIAnswer; import com.tencent.bk.job.analysis.service.ai.AIChatHistoryService; +import com.tencent.bk.job.common.constant.ErrorCode; +import com.tencent.bk.job.common.util.I18nUtil; import lombok.extern.slf4j.Slf4j; import org.slf4j.helpers.MessageFormatter; import org.springframework.beans.factory.annotation.Autowired; @@ -84,13 +86,13 @@ public void doHandleAIAnswer(Long recordId, String content, Throwable throwable) ); } else { // 3.对话异常 - aiAnswer = AIAnswer.failAnswer(content, throwable.getMessage()); + String errorContent = I18nUtil.getI18nMessage(String.valueOf(ErrorCode.BK_OPEN_AI_API_DATA_ERROR)); + aiAnswer = AIAnswer.failAnswer(errorContent, throwable.getMessage()); int affectedRow = aiChatHistoryService.finishAIAnswer(recordId, aiAnswer); String message = MessageFormatter.arrayFormat( - "AIAnswer finished(fail), recordId={}, length={}, affectedRow={}", + "AIAnswer finished(fail), recordId={}, affectedRow={}", new Object[]{ recordId, - content == null ? 0 : content.length(), affectedRow } ).getMessage(); diff --git a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIAnswerStreamSynchronizer.java b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIAnswerStreamSynchronizer.java index 9a8d6fb55b..9f57f0e307 100644 --- a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIAnswerStreamSynchronizer.java +++ b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/AIAnswerStreamSynchronizer.java @@ -29,9 +29,7 @@ import com.tencent.bk.job.analysis.service.ai.context.model.MessagePartEvent; import com.tencent.bk.job.analysis.util.ai.AIAnswerUtil; import com.tencent.bk.job.common.constant.ErrorCode; -import com.tencent.bk.job.common.exception.ServiceException; import com.tencent.bk.job.common.model.Response; -import com.tencent.bk.job.common.model.error.ErrorType; import com.tencent.bk.job.common.util.TimeUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; @@ -72,7 +70,11 @@ public AsyncConsumerAndProducerPair buildAsyncConsumerAndProducerPair() { try { MessagePartEvent event = messageQueue.poll(90, TimeUnit.SECONDS); if (event == null) { - throw new ServiceException(ErrorType.TIMEOUT, ErrorCode.BK_OPEN_AI_API_DATA_TIMEOUT); + Response respBody = + Response.buildCommonFailResp(ErrorCode.BK_OPEN_AI_API_DATA_TIMEOUT); + respBody.setData(AIAnswer.failAnswer(respBody.getErrorMsg(), respBody.getErrorMsg())); + AIAnswerUtil.setRequestIdAndWriteResp(outputStream, respBody); + break; } if (event.isEnd()) { Throwable throwable = event.getThrowable(); @@ -80,6 +82,7 @@ public AsyncConsumerAndProducerPair buildAsyncConsumerAndProducerPair() { log.warn("Receive end event with throwable", throwable); Response respBody = Response.buildCommonFailResp(ErrorCode.BK_OPEN_AI_API_DATA_ERROR); + respBody.setData(AIAnswer.failAnswer(respBody.getErrorMsg(), throwable.getMessage())); AIAnswerUtil.setRequestIdAndWriteResp(outputStream, respBody); } break; diff --git a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/ChatServiceImpl.java b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/ChatServiceImpl.java index d3e3ee1fdc..5607a8b7af 100644 --- a/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/ChatServiceImpl.java +++ b/src/backend/job-analysis/service-job-analysis/src/main/java/com/tencent/bk/job/analysis/service/ai/impl/ChatServiceImpl.java @@ -42,11 +42,13 @@ import io.micrometer.core.instrument.util.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Service; import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; import java.util.Comparator; import java.util.List; +import java.util.Locale; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @@ -124,8 +126,11 @@ public StreamingResponseBody generateChatStream(String username, Long recordId) currentChatHistoryDTO.getAiInput(), consumerAndProducerPair.getConsumer() ); + Locale locale = LocaleContextHolder.getLocale(); + log.debug("language={}", locale.getLanguage()); future.whenComplete((content, throwable) -> { // 5.处理AI回复内容 + LocaleContextHolder.setLocale(locale); aiAnswerHandler.handleAIAnswer(recordId, content, throwable); futureMap.remove(recordId); aiAnswerStreamSynchronizer.triggerEndEvent(throwable);