Commit dfc18450a7a06ee3682adb888d37d416981a7d91
1 parent
81a572e6
1111
Showing
3 changed files
with
65 additions
and
10 deletions
src/main/java/com/xly/service/XlyErpService.java
| ... | ... | @@ -63,7 +63,8 @@ public class XlyErpService { |
| 63 | 63 | String sSubsidiaryId, |
| 64 | 64 | String sUserType, |
| 65 | 65 | String authorization) { |
| 66 | - long startTime = System.currentTimeMillis(); | |
| 66 | + String sceneName = StrUtil.EMPTY; | |
| 67 | + String methodName = StrUtil.EMPTY; | |
| 67 | 68 | try { |
| 68 | 69 | // 0. 预处理用户输入:去空格、转小写(方便匹配) |
| 69 | 70 | String input= InputPreprocessor.preprocessWithCommons(userInput); |
| ... | ... | @@ -71,6 +72,8 @@ public class XlyErpService { |
| 71 | 72 | UserSceneSession session = userSceneSessionService.getUserSceneSession(userId,sUserName,sBrandsId,sSubsidiaryId,sUserType,authorization); |
| 72 | 73 | session.setAuthorization(authorization); |
| 73 | 74 | session.setSFunPrompts(null); |
| 75 | + sceneName = ObjectUtil.isNotEmpty(session.getCurrentScene())?session.getCurrentScene().getSSceneName():StrUtil.EMPTY; | |
| 76 | + methodName = ObjectUtil.isNotEmpty(session.getCurrentTool())?session.getCurrentTool().getSMethodName():StrUtil.EMPTY; | |
| 74 | 77 | // 2. 特殊指令:重置场景(无论是否已选,都可重置) |
| 75 | 78 | if (input.contains("重置") || input.contains("重新选择")) { |
| 76 | 79 | //清除记忆缓存 |
| ... | ... | @@ -118,7 +121,6 @@ public class XlyErpService { |
| 118 | 121 | ){ |
| 119 | 122 | sResponMessage = getDynamicTableSql(session, input, userId, userInput); |
| 120 | 123 | } |
| 121 | - | |
| 122 | 124 | //如果返回空的进入闲聊模式 |
| 123 | 125 | if (ObjectUtil.isEmpty(sResponMessage)){ |
| 124 | 126 | return getChatiAgent (input, session); |
| ... | ... | @@ -130,13 +132,29 @@ public class XlyErpService { |
| 130 | 132 | .sReturnType(ReturnTypeCode.MAKEDOWN.getCode()) |
| 131 | 133 | .build(); |
| 132 | 134 | }else { |
| 133 | - return AiResponseDTO.builder().aiText("当前场景:没有选择 退回当前场景 请输入 "+ CommonConstant.RESET + sResponMessage).sReturnType(ReturnTypeCode.HTML.getCode()).build(); | |
| 135 | + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(methodName).aiText("当前场景:没有选择 退回当前场景 请输入 "+ CommonConstant.RESET + sResponMessage).sReturnType(ReturnTypeCode.HTML.getCode()).build(); | |
| 134 | 136 | } |
| 135 | 137 | } catch (Exception e) { |
| 136 | - return AiResponseDTO.builder().aiText("系统异常:" + e.getMessage() + ",请稍后重试!").sReturnType(ReturnTypeCode.HTML.getCode()).build(); | |
| 138 | + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(methodName).aiText("系统异常:" + e.getMessage() + ",请稍后重试!").sReturnType(ReturnTypeCode.HTML.getCode()).build(); | |
| 137 | 139 | } |
| 138 | 140 | } |
| 139 | 141 | |
| 142 | + public AiResponseDTO cleanMemory( String userId , | |
| 143 | + String sUserName , | |
| 144 | + String sBrandsId , | |
| 145 | + String sSubsidiaryId, | |
| 146 | + String sUserType, | |
| 147 | + String authorization) { | |
| 148 | + | |
| 149 | + UserSceneSession session = userSceneSessionService.getUserSceneSession(userId,sUserName,sBrandsId,sSubsidiaryId,sUserType,authorization); | |
| 150 | + operableChatMemoryProvider.clearSpecifiedMemory(userId); | |
| 151 | + session.setCurrentTool(null); | |
| 152 | + session.setBCleanMemory(false); | |
| 153 | + String sceneName = ObjectUtil.isNotEmpty(session.getCurrentScene())?session.getCurrentScene().getSSceneName():StrUtil.EMPTY; | |
| 154 | + String methodName = ObjectUtil.isNotEmpty(session.getCurrentTool())?session.getCurrentTool().getSMethodName():StrUtil.EMPTY; | |
| 155 | + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(methodName).aiText(StrUtil.EMPTY).systemText("清除记忆成功!").sReturnType(ReturnTypeCode.HTML.getCode()).build(); | |
| 156 | + } | |
| 157 | + | |
| 140 | 158 | |
| 141 | 159 | /*** |
| 142 | 160 | * @Author 钱豹 |
| ... | ... | @@ -333,6 +351,8 @@ public class XlyErpService { |
| 333 | 351 | private AiResponseDTO handleSceneSelect(String userId, String userInput, UserSceneSession session) { |
| 334 | 352 | // 1. 尝试根据序号匹配场景 |
| 335 | 353 | boolean selectSuccess = session.selectSceneByInput(userInput); |
| 354 | + String sceneName = StrUtil.EMPTY; | |
| 355 | + String methodName = StrUtil.EMPTY; | |
| 336 | 356 | if (selectSuccess) { |
| 337 | 357 | // 2. 选择成功:更新缓存,返回成功提示 |
| 338 | 358 | UserSceneSessionService.USER_SCENE_SESSION_CACHE.put(userId, session); |
| ... | ... | @@ -341,10 +361,12 @@ public class XlyErpService { |
| 341 | 361 | //清除记忆缓存 |
| 342 | 362 | operableChatMemoryProvider.clearSpecifiedMemory(userId); |
| 343 | 363 | String aiText = "智能体选择成功! 现在可以问她相关问题(如" + String.join("、", session.getCurrentScene().getSSceneContext()) + ")"; |
| 344 | - return AiResponseDTO.builder().aiText(aiText).sSceneName(session.getCurrentScene().getSSceneName()).build(); | |
| 364 | + sceneName = ObjectUtil.isNotEmpty(session.getCurrentScene().getSSceneName())?session.getCurrentScene().getSSceneName():StrUtil.EMPTY; | |
| 365 | + methodName = ObjectUtil.isNotEmpty(session.getCurrentTool().getSControlName())?session.getCurrentTool().getSControlName():StrUtil.EMPTY; | |
| 366 | + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(methodName).aiText(aiText).sSceneName(session.getCurrentScene().getSSceneName()).build(); | |
| 345 | 367 | } else { |
| 346 | 368 | // 3. 选择失败:重新展示场景选择提示 |
| 347 | - return AiResponseDTO.builder().aiText(session.buildSceneSelectHint()).build(); | |
| 369 | + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(methodName).aiText(session.buildSceneSelectHint()).build(); | |
| 348 | 370 | } |
| 349 | 371 | } |
| 350 | 372 | |
| ... | ... | @@ -364,7 +386,9 @@ public class XlyErpService { |
| 364 | 386 | .build(); |
| 365 | 387 | UserSceneSessionService.CHAT_AGENT_CACHE.put(session.getUserId(), chatiAgent); } |
| 366 | 388 | String sChatMessage = chatiAgent.chat(session.getUserId(), input); |
| 367 | - return AiResponseDTO.builder().aiText(sChatMessage).sSceneName("随便聊聊").systemText(StrUtil.EMPTY).sReturnType(ReturnTypeCode.HTML.getCode()).build(); | |
| 389 | + String sceneName = ObjectUtil.isNotEmpty(session.getCurrentScene())?session.getCurrentScene().getSSceneName():StrUtil.EMPTY; | |
| 390 | + String methodName = ObjectUtil.isNotEmpty(session.getCurrentTool())?session.getCurrentTool().getSMethodName():StrUtil.EMPTY; | |
| 391 | + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(methodName).aiText(sChatMessage).sSceneName("随便聊聊").systemText(StrUtil.EMPTY).sReturnType(ReturnTypeCode.HTML.getCode()).build(); | |
| 368 | 392 | } |
| 369 | 393 | |
| 370 | 394 | } |
| 371 | 395 | \ No newline at end of file | ... | ... |
src/main/java/com/xly/tts/service/PythonTtsProxyService.java
| ... | ... | @@ -76,11 +76,34 @@ public class PythonTtsProxyService { |
| 76 | 76 | String sSubsidiaryId = request.getSubsidiaryid(); |
| 77 | 77 | String sUserType = request.getUsertype(); |
| 78 | 78 | String authorization = request.getAuthorization(); |
| 79 | - //校验登录token 是否有效 | |
| 80 | 79 | AiResponseDTO voiceText = xlyErpService.erpUserInput(userInput,sUserId,sUserName,sBrandsId,sSubsidiaryId,sUserType, authorization); |
| 81 | 80 | return synthesizeStreamAi(request,voiceText); |
| 82 | 81 | } |
| 83 | 82 | |
| 83 | + public ResponseEntity<TTSResponseDTO> cleanMemory(TTSRequestDTO request) { | |
| 84 | + //调用AI返回请求内容 | |
| 85 | + String sUserId = request.getUserid(); | |
| 86 | + String sUserName = request.getUsername(); | |
| 87 | + String sBrandsId = request.getBrandsid(); | |
| 88 | + String sSubsidiaryId = request.getSubsidiaryid(); | |
| 89 | + String sUserType = request.getUsertype(); | |
| 90 | + String authorization = request.getAuthorization(); | |
| 91 | + AiResponseDTO aiResponseDTO = xlyErpService.cleanMemory(sUserId,sUserName,sBrandsId,sSubsidiaryId,sUserType, authorization); | |
| 92 | + return ResponseEntity.ok(TTSResponseDTO.builder() | |
| 93 | + .code(200) | |
| 94 | + .message("success") | |
| 95 | + .originalText(request.getText()) // 原始文本 | |
| 96 | + .processedText(aiResponseDTO.getAiText()) // AI提示语 | |
| 97 | + .systemText(aiResponseDTO.getSystemText()) // 系统提示语言 | |
| 98 | + .voice(request.getVoice()) | |
| 99 | + .sSceneName(aiResponseDTO.getSSceneName()) | |
| 100 | + .sMethodName (aiResponseDTO.getSMethodName()) | |
| 101 | + .sReturnType (aiResponseDTO.getSReturnType()) | |
| 102 | + .timestamp(System.currentTimeMillis()) | |
| 103 | + .textLength(request.getText().length()) | |
| 104 | + .build()); | |
| 105 | + } | |
| 106 | + | |
| 84 | 107 | /*** |
| 85 | 108 | * @Author 钱豹 |
| 86 | 109 | * @Date 11:16 2026/2/8 |
| ... | ... | @@ -165,8 +188,8 @@ public class PythonTtsProxyService { |
| 165 | 188 | .audioBase64(audioBase64) // Base64编码的音频 |
| 166 | 189 | .audioSize(response.getBody().length) |
| 167 | 190 | .sSceneName(aiResponseDTO.getSSceneName()) |
| 168 | - .sMethodName (aiResponseDTO.getSMethodName()) | |
| 169 | - .sReturnType (aiResponseDTO.getSReturnType()) | |
| 191 | + .sMethodName(aiResponseDTO.getSMethodName()) | |
| 192 | + .sReturnType(aiResponseDTO.getSReturnType()) | |
| 170 | 193 | .audioFormat("audio/mpeg") |
| 171 | 194 | .build(); |
| 172 | 195 | return ResponseEntity.ok(ttsResponse); | ... | ... |
src/main/java/com/xly/web/TTSStreamController.java
| ... | ... | @@ -79,6 +79,14 @@ public class TTSStreamController { |
| 79 | 79 | } |
| 80 | 80 | |
| 81 | 81 | /** |
| 82 | + * 流式合成语音(代理到Python服务) | |
| 83 | + */ | |
| 84 | + @PostMapping("/cleanMemory") | |
| 85 | + public ResponseEntity<TTSResponseDTO> cleanMemory(@RequestBody TTSRequestDTO request) { | |
| 86 | + return pythonTtsProxyService.cleanMemory(request); | |
| 87 | + } | |
| 88 | + | |
| 89 | + /** | |
| 82 | 90 | * 流式合成语音(异步) |
| 83 | 91 | */ |
| 84 | 92 | @PostMapping("/async-stream") | ... | ... |