diff --git a/src/main/java/com/xly/service/XlyErpService.java b/src/main/java/com/xly/service/XlyErpService.java index b27c2ea..0cb61f2 100644 --- a/src/main/java/com/xly/service/XlyErpService.java +++ b/src/main/java/com/xly/service/XlyErpService.java @@ -63,7 +63,8 @@ public class XlyErpService { String sSubsidiaryId, String sUserType, String authorization) { - long startTime = System.currentTimeMillis(); + String sceneName = StrUtil.EMPTY; + String methodName = StrUtil.EMPTY; try { // 0. 预处理用户输入:去空格、转小写(方便匹配) String input= InputPreprocessor.preprocessWithCommons(userInput); @@ -71,6 +72,8 @@ public class XlyErpService { UserSceneSession session = userSceneSessionService.getUserSceneSession(userId,sUserName,sBrandsId,sSubsidiaryId,sUserType,authorization); session.setAuthorization(authorization); session.setSFunPrompts(null); + sceneName = ObjectUtil.isNotEmpty(session.getCurrentScene())?session.getCurrentScene().getSSceneName():StrUtil.EMPTY; + methodName = ObjectUtil.isNotEmpty(session.getCurrentTool())?session.getCurrentTool().getSMethodName():StrUtil.EMPTY; // 2. 特殊指令:重置场景(无论是否已选,都可重置) if (input.contains("重置") || input.contains("重新选择")) { //清除记忆缓存 @@ -118,7 +121,6 @@ public class XlyErpService { ){ sResponMessage = getDynamicTableSql(session, input, userId, userInput); } - //如果返回空的进入闲聊模式 if (ObjectUtil.isEmpty(sResponMessage)){ return getChatiAgent (input, session); @@ -130,13 +132,29 @@ public class XlyErpService { .sReturnType(ReturnTypeCode.MAKEDOWN.getCode()) .build(); }else { - return AiResponseDTO.builder().aiText("当前场景:没有选择 退回当前场景 请输入 "+ CommonConstant.RESET + sResponMessage).sReturnType(ReturnTypeCode.HTML.getCode()).build(); + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(methodName).aiText("当前场景:没有选择 退回当前场景 请输入 "+ CommonConstant.RESET + sResponMessage).sReturnType(ReturnTypeCode.HTML.getCode()).build(); } } catch (Exception e) { - return AiResponseDTO.builder().aiText("系统异常:" + e.getMessage() + ",请稍后重试!").sReturnType(ReturnTypeCode.HTML.getCode()).build(); + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(methodName).aiText("系统异常:" + e.getMessage() + ",请稍后重试!").sReturnType(ReturnTypeCode.HTML.getCode()).build(); } } + public AiResponseDTO cleanMemory( String userId , + String sUserName , + String sBrandsId , + String sSubsidiaryId, + String sUserType, + String authorization) { + + UserSceneSession session = userSceneSessionService.getUserSceneSession(userId,sUserName,sBrandsId,sSubsidiaryId,sUserType,authorization); + operableChatMemoryProvider.clearSpecifiedMemory(userId); + session.setCurrentTool(null); + session.setBCleanMemory(false); + String sceneName = ObjectUtil.isNotEmpty(session.getCurrentScene())?session.getCurrentScene().getSSceneName():StrUtil.EMPTY; + String methodName = ObjectUtil.isNotEmpty(session.getCurrentTool())?session.getCurrentTool().getSMethodName():StrUtil.EMPTY; + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(methodName).aiText(StrUtil.EMPTY).systemText("清除记忆成功!").sReturnType(ReturnTypeCode.HTML.getCode()).build(); + } + /*** * @Author 钱豹 @@ -333,6 +351,8 @@ public class XlyErpService { private AiResponseDTO handleSceneSelect(String userId, String userInput, UserSceneSession session) { // 1. 尝试根据序号匹配场景 boolean selectSuccess = session.selectSceneByInput(userInput); + String sceneName = StrUtil.EMPTY; + String methodName = StrUtil.EMPTY; if (selectSuccess) { // 2. 选择成功:更新缓存,返回成功提示 UserSceneSessionService.USER_SCENE_SESSION_CACHE.put(userId, session); @@ -341,10 +361,12 @@ public class XlyErpService { //清除记忆缓存 operableChatMemoryProvider.clearSpecifiedMemory(userId); String aiText = "智能体选择成功! 现在可以问她相关问题(如" + String.join("、", session.getCurrentScene().getSSceneContext()) + ")"; - return AiResponseDTO.builder().aiText(aiText).sSceneName(session.getCurrentScene().getSSceneName()).build(); + sceneName = ObjectUtil.isNotEmpty(session.getCurrentScene().getSSceneName())?session.getCurrentScene().getSSceneName():StrUtil.EMPTY; + methodName = ObjectUtil.isNotEmpty(session.getCurrentTool().getSControlName())?session.getCurrentTool().getSControlName():StrUtil.EMPTY; + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(methodName).aiText(aiText).sSceneName(session.getCurrentScene().getSSceneName()).build(); } else { // 3. 选择失败:重新展示场景选择提示 - return AiResponseDTO.builder().aiText(session.buildSceneSelectHint()).build(); + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(methodName).aiText(session.buildSceneSelectHint()).build(); } } @@ -364,7 +386,9 @@ public class XlyErpService { .build(); UserSceneSessionService.CHAT_AGENT_CACHE.put(session.getUserId(), chatiAgent); } String sChatMessage = chatiAgent.chat(session.getUserId(), input); - return AiResponseDTO.builder().aiText(sChatMessage).sSceneName("随便聊聊").systemText(StrUtil.EMPTY).sReturnType(ReturnTypeCode.HTML.getCode()).build(); + String sceneName = ObjectUtil.isNotEmpty(session.getCurrentScene())?session.getCurrentScene().getSSceneName():StrUtil.EMPTY; + String methodName = ObjectUtil.isNotEmpty(session.getCurrentTool())?session.getCurrentTool().getSMethodName():StrUtil.EMPTY; + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(methodName).aiText(sChatMessage).sSceneName("随便聊聊").systemText(StrUtil.EMPTY).sReturnType(ReturnTypeCode.HTML.getCode()).build(); } } \ No newline at end of file diff --git a/src/main/java/com/xly/tts/service/PythonTtsProxyService.java b/src/main/java/com/xly/tts/service/PythonTtsProxyService.java index 032b599..3e5303e 100644 --- a/src/main/java/com/xly/tts/service/PythonTtsProxyService.java +++ b/src/main/java/com/xly/tts/service/PythonTtsProxyService.java @@ -76,11 +76,34 @@ public class PythonTtsProxyService { String sSubsidiaryId = request.getSubsidiaryid(); String sUserType = request.getUsertype(); String authorization = request.getAuthorization(); - //校验登录token 是否有效 AiResponseDTO voiceText = xlyErpService.erpUserInput(userInput,sUserId,sUserName,sBrandsId,sSubsidiaryId,sUserType, authorization); return synthesizeStreamAi(request,voiceText); } + public ResponseEntity cleanMemory(TTSRequestDTO request) { + //调用AI返回请求内容 + String sUserId = request.getUserid(); + String sUserName = request.getUsername(); + String sBrandsId = request.getBrandsid(); + String sSubsidiaryId = request.getSubsidiaryid(); + String sUserType = request.getUsertype(); + String authorization = request.getAuthorization(); + AiResponseDTO aiResponseDTO = xlyErpService.cleanMemory(sUserId,sUserName,sBrandsId,sSubsidiaryId,sUserType, authorization); + return ResponseEntity.ok(TTSResponseDTO.builder() + .code(200) + .message("success") + .originalText(request.getText()) // 原始文本 + .processedText(aiResponseDTO.getAiText()) // AI提示语 + .systemText(aiResponseDTO.getSystemText()) // 系统提示语言 + .voice(request.getVoice()) + .sSceneName(aiResponseDTO.getSSceneName()) + .sMethodName (aiResponseDTO.getSMethodName()) + .sReturnType (aiResponseDTO.getSReturnType()) + .timestamp(System.currentTimeMillis()) + .textLength(request.getText().length()) + .build()); + } + /*** * @Author 钱豹 * @Date 11:16 2026/2/8 @@ -165,8 +188,8 @@ public class PythonTtsProxyService { .audioBase64(audioBase64) // Base64编码的音频 .audioSize(response.getBody().length) .sSceneName(aiResponseDTO.getSSceneName()) - .sMethodName (aiResponseDTO.getSMethodName()) - .sReturnType (aiResponseDTO.getSReturnType()) + .sMethodName(aiResponseDTO.getSMethodName()) + .sReturnType(aiResponseDTO.getSReturnType()) .audioFormat("audio/mpeg") .build(); return ResponseEntity.ok(ttsResponse); diff --git a/src/main/java/com/xly/web/TTSStreamController.java b/src/main/java/com/xly/web/TTSStreamController.java index c9ae312..56f31a1 100644 --- a/src/main/java/com/xly/web/TTSStreamController.java +++ b/src/main/java/com/xly/web/TTSStreamController.java @@ -79,6 +79,14 @@ public class TTSStreamController { } /** + * 流式合成语音(代理到Python服务) + */ + @PostMapping("/cleanMemory") + public ResponseEntity cleanMemory(@RequestBody TTSRequestDTO request) { + return pythonTtsProxyService.cleanMemory(request); + } + + /** * 流式合成语音(异步) */ @PostMapping("/async-stream")