From c784f262f5a7794462c6c97e6cfef1fa57089e3d Mon Sep 17 00:00:00 2001 From: qianbao Date: Wed, 11 Mar 2026 16:11:12 +0800 Subject: [PATCH] AI 对于时间的处理 --- src/main/java/com/xly/constant/BusinessCode.java | 3 ++- src/main/java/com/xly/service/XlyErpService.java | 14 ++++++++------ src/main/java/com/xly/tool/DynamicToolProvider.java | 21 +++++++++++++-------- src/main/java/com/xly/tts/bean/TTSResponseDTO.java | 2 ++ src/main/java/com/xly/tts/service/PythonTtsProxyService.java | 4 ++++ 5 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/xly/constant/BusinessCode.java b/src/main/java/com/xly/constant/BusinessCode.java index 5ae0d46..16faef4 100644 --- a/src/main/java/com/xly/constant/BusinessCode.java +++ b/src/main/java/com/xly/constant/BusinessCode.java @@ -13,7 +13,8 @@ import lombok.Getter; public enum BusinessCode { //报价确认 - QUOCONFIRM("quoconfirm", "报价确认"); + QUOCONFIRM("quoconfirm", "报价确认"), + COMMONTS("commonTs", "如果切换场景,点[回首页],如果在本场景下,转换意图,点[清除记忆]"); private final String code; private final String message; diff --git a/src/main/java/com/xly/service/XlyErpService.java b/src/main/java/com/xly/service/XlyErpService.java index 5cdda28..19cdf3f 100644 --- a/src/main/java/com/xly/service/XlyErpService.java +++ b/src/main/java/com/xly/service/XlyErpService.java @@ -14,6 +14,7 @@ import com.xly.constant.CommonConstant; import com.xly.constant.ReturnTypeCode; import com.xly.entity.*; import com.xly.exception.sqlexception.SqlGenerateException; +import com.xly.exception.sqlexception.SqlValidateException; import com.xly.mapper.ToolMetaMapper; import com.xly.runner.AppStartupRunner; import com.xly.tool.DynamicToolProvider; @@ -157,12 +158,11 @@ public class XlyErpService { UserSceneSession session = userSceneSessionService.getUserSceneSession(userId,sUserName,sBrandsId,sSubsidiaryId,sUserType,authorization); operableChatMemoryProvider.clearSpecifiedMemory(userId); session.setCurrentTool(null); - session.setBCleanMemory(false); UserSceneSessionService.ERP_AGENT_CACHE.remove(userId); UserSceneSessionService.CHAT_AGENT_CACHE.remove(userId); + 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(); + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(StrUtil.EMPTY).aiText(StrUtil.EMPTY).systemText("清除记忆成功!").sReturnType(ReturnTypeCode.HTML.getCode()).build(); } @@ -180,6 +180,8 @@ public class XlyErpService { try{ attempt = attempt+1; return getDynamicTableSqlExec(session, input, userId, userInput,errorSql,errorMessage,iErroCount,historySqlList); + }catch (SqlValidateException e){ + return "本场景没有识别到您的意图
如果切换场景,点[回首页],如果在本场景下,转换意图,点[清除记忆]"; }catch (Exception e){ String erroMsg = e.getMessage(); String errorSqlOld = StrUtil.EMPTY; @@ -194,7 +196,7 @@ public class XlyErpService { } String errorMessageOld = erroMsg.split(EnhancedErrorGuidance.splitString)[0]; if (attempt == maxRetries) { - return resultExplain+"查询的SQL语句:"+historySqlList; + return resultExplain +"
查询的SQL语句:"+historySqlList; } else { return getDynamicTableSql( session, input, userId, userInput, attempt,errorSqlOld,errorMessageOld,attempt.toString(),historySqlList); } @@ -202,7 +204,7 @@ public class XlyErpService { } }catch (Exception e){ }finally { - doCleanUserMemory(session,userId); + // doCleanUserMemory(session,userId); } return resultExplain; } @@ -246,7 +248,7 @@ public class XlyErpService { rawSql = aiDynamicTableNl2SqlAiAgent.regenerateSqlWithError(userId, tableNames,tableStruct,sDataNow,userInput,errorSql,errorMessage,iErroCount,historySqlList); } if (rawSql == null || rawSql.trim().isEmpty()) { - throw new SqlGenerateException("SQL EMPTY"); + throw new SqlValidateException("SQL EMPTY"); } // 2. 清理SQL多余符号 + 生产级强校验(核心安全保障,不可省略) String cleanSql = SqlValidateUtil.cleanSqlSymbol(rawSql); diff --git a/src/main/java/com/xly/tool/DynamicToolProvider.java b/src/main/java/com/xly/tool/DynamicToolProvider.java index ff5f568..68de200 100644 --- a/src/main/java/com/xly/tool/DynamicToolProvider.java +++ b/src/main/java/com/xly/tool/DynamicToolProvider.java @@ -196,7 +196,12 @@ public class DynamicToolProvider implements ToolProvider { UserSceneSession session = UserSceneSessionService.USER_SCENE_SESSION_CACHE.get(sUserId); //过滤对应的权限方法 List datalist = new ArrayList<>(); - List toolMetaAll = session.getAuthTool(); + List toolMetaAll = new ArrayList<>(); + if(session.getCurrentTool()!=null){ + toolMetaAll.add(session.getCurrentTool()); + }else{ + toolMetaAll = session.getAuthTool(); + } if(ObjectUtil.isNotEmpty(toolMetaAll)){ toolMetaAll = toolMetaAll.stream().filter(to-> to.getSSceneId().equals(sSceneIdMap.get(sUserId))).collect(Collectors.toUnmodifiableList()); if(ObjectUtil.isNotEmpty(toolMetaAll)){ @@ -532,10 +537,8 @@ public class DynamicToolProvider implements ToolProvider { } // Map argsOld = DeepCopyUtils.deepCopy(args); List paramRuleData = meta.getParamRuleListAll(); - // 2. 【自动补全】应用参数的默认值 - args = applyDefaultValues(args, paramRuleData); - // 2.1 【补全动态参数】动态参数补全 + // 2 【补全动态参数】动态参数补全 try{ args = applyValues(args, meta.getParamRuleListCheck()); }catch (Exception e){ @@ -546,6 +549,9 @@ public class DynamicToolProvider implements ToolProvider { return String.valueOf(askUserResult(toolExecutionRequest, sTsMsg)); } + // 2.1 【自动补全】应用参数的默认值 + args = applyDefaultValues(args, paramRuleData); + // 3. 【自动校验】检查必填项 List missing = checkRequiredParams(args, paramRuleData); if (!missing.isEmpty()) { @@ -809,11 +815,10 @@ public class DynamicToolProvider implements ToolProvider { Map result = new HashMap<>(args); for (ParamRule pd : paramDefs) { String name = pd.getSParam(); - if ((!result.containsKey(name) - || ObjectUtil.isEmpty(result.get(name))) + if ((!result.containsKey(name)|| ObjectUtil.isEmpty(result.get(name))) && ObjectUtil.isNotEmpty(pd.getSDefaultValue()) - && !"enum".equals(pd.getSType()) - && !"array".equals(pd.getSType()) +// && !"enum".equals(pd.getSType()) +// && !"array".equals(pd.getSType()) ) { Object defaultValue = pd.getSDefaultValue(); result.put(name, defaultValue); diff --git a/src/main/java/com/xly/tts/bean/TTSResponseDTO.java b/src/main/java/com/xly/tts/bean/TTSResponseDTO.java index 160caf3..25ca39a 100644 --- a/src/main/java/com/xly/tts/bean/TTSResponseDTO.java +++ b/src/main/java/com/xly/tts/bean/TTSResponseDTO.java @@ -60,6 +60,8 @@ public class TTSResponseDTO implements Serializable { private String sSceneName; //业务方法名称 private String sMethodName; + //清除记忆提示 + private String sCommonts; private String sReturnType = ReturnTypeCode.MAKEDOWN.getCode(); diff --git a/src/main/java/com/xly/tts/service/PythonTtsProxyService.java b/src/main/java/com/xly/tts/service/PythonTtsProxyService.java index 3e5303e..4657e24 100644 --- a/src/main/java/com/xly/tts/service/PythonTtsProxyService.java +++ b/src/main/java/com/xly/tts/service/PythonTtsProxyService.java @@ -2,6 +2,7 @@ package com.xly.tts.service; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.xly.constant.BusinessCode; import com.xly.constant.ReturnTypeCode; import com.xly.entity.AiResponseDTO; import com.xly.service.UserSceneSessionService; @@ -149,6 +150,7 @@ public class PythonTtsProxyService { .sSceneName(aiResponseDTO.getSSceneName()) .sMethodName (aiResponseDTO.getSMethodName()) .sReturnType (aiResponseDTO.getSReturnType()) + .sCommonts(BusinessCode.COMMONTS.getMessage()) .timestamp(System.currentTimeMillis()) .textLength(request.getText().length()) .build()); @@ -190,6 +192,7 @@ public class PythonTtsProxyService { .sSceneName(aiResponseDTO.getSSceneName()) .sMethodName(aiResponseDTO.getSMethodName()) .sReturnType(aiResponseDTO.getSReturnType()) + .sCommonts(BusinessCode.COMMONTS.getMessage()) .audioFormat("audio/mpeg") .build(); return ResponseEntity.ok(ttsResponse); @@ -213,6 +216,7 @@ public class PythonTtsProxyService { .sSceneName(aiResponseDTO.getSSceneName()) .sMethodName (aiResponseDTO.getSMethodName()) .sReturnType (aiResponseDTO.getSReturnType()) + .sCommonts(BusinessCode.COMMONTS.getMessage()) .build(); return ResponseEntity.ok(ttsResponse); } -- libgit2 0.22.2