diff --git a/src/main/java/com/xly/service/XlyErpService.java b/src/main/java/com/xly/service/XlyErpService.java index b5fe019..d069f3b 100644 --- a/src/main/java/com/xly/service/XlyErpService.java +++ b/src/main/java/com/xly/service/XlyErpService.java @@ -352,9 +352,10 @@ public class XlyErpService { ){ String sSystemPrompt = AgentSystemPrompt.sSystemPrompt; //如果客户输入了确认/生成 切换引导语言 - Boolean isConfirmed = dynamicToolProvider.isConfirmed(input) || input.contains("生成") || input.contains("确认"); + Boolean isConfirmed = dynamicToolProvider.isConfirmed(input,session); if(ObjectUtil.isNotEmpty(session.getSSystemPrompt()) && isConfirmed){ sSystemPrompt = session.getSSystemPrompt(); +// session.setSSystemPrompt(); //重新生成新的aiAgent拿新的aiAgent 做选择 aiAgent = createConfirmeAgent(session); } diff --git a/src/main/java/com/xly/tool/DynamicToolProvider.java b/src/main/java/com/xly/tool/DynamicToolProvider.java index 060305c..d355588 100644 --- a/src/main/java/com/xly/tool/DynamicToolProvider.java +++ b/src/main/java/com/xly/tool/DynamicToolProvider.java @@ -1,6 +1,7 @@ package com.xly.tool; +import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; @@ -464,6 +465,10 @@ public class DynamicToolProvider implements ToolProvider { public String doDynamicTool(ToolMeta meta,UserSceneSession session) { List paramRuleData = meta.getParamRuleListAll(); List paramRuleDataCheck = meta.getParamRuleListCheck(); + Map argsOld = session.getArgs(); + if(ObjectUtil.isEmpty(argsOld)){ + argsOld = new HashMap<>(); + } Map args = session.getArgs(); List missing = checkRequiredParams(args, paramRuleDataCheck); @@ -478,8 +483,7 @@ public class DynamicToolProvider implements ToolProvider { if (userMessage != null) { input = StrUtil.replace(getChatMessageContent(userMessage), "用户输入:", StrUtil.EMPTY); } - - Boolean isConfirmed = isConfirmed(input) || input.contains("生成") || input.contains("确认"); + Boolean isConfirmed = isConfirmed(input,session); if((isConfirmed && (4== meta.getIBizType() ||1== meta.getIBizType())) || 2== meta.getIBizType() @@ -491,8 +495,15 @@ public class DynamicToolProvider implements ToolProvider { { List missingAfter = checkConfirmAfterParam(args, paramRuleData); if (!missingAfter.isEmpty()) { + //合并已选择数据 + argsOld.putAll(args); + session.setArgs(argsOld); String askMsg = buildAskUserMessage(meta, missingAfter,args); - throw new DataException(askMsg); + session.setSFunPrompts(askMsg); + List paramRuleDataMiss = getMissParamRuleAfter(args, paramRuleData); + String sSystemPrompt = buildMissParamPrompt(session,paramRuleDataMiss); + session.setSSystemPrompt(sSystemPrompt); + return askMsg; } return executeTool(meta, args, paramRuleData, session.getUserId(), session); } @@ -720,15 +731,34 @@ public class DynamicToolProvider implements ToolProvider { return bDbZero || bBhcs || (!returnMap.containsKey(pd.getSParamValue()) || (ObjectUtil.isEmpty(returnMap.get(pd.getSParamValue())))); } + /*** + * @Author 钱豹 + * @Date 1:08 2026/5/19 + * @Param [args, paramDefs] + * @return java.util.List + * @Description 获取缺失参数提示 + **/ private List checkConfirmAfterParam(Map args, List paramDefs) { + List paramRuleList = getMissParamRuleAfter( args, paramDefs); + return paramRuleList.stream() + .map(ParamRule::getSParam) + .toList(); + } + + /*** + * @Author 钱豹 + * @Date 2026/5/19 + * @Param [args, paramDefs] + * @return java.util.List + * @Description 获取保存后的缺失参数 + **/ + private List getMissParamRuleAfter(Map args, List paramDefs) { Map returnMap = transformationArgs( args, paramDefs); return paramDefs.stream() - .filter(pd -> Boolean.TRUE.equals(pd.getBConfirmAfter()) && pd.getBTipModel()) - .filter(pd -> - (!returnMap.containsKey(pd.getSParam()) || (ObjectUtil.isEmpty(returnMap.get(pd.getSParam())))) - && (!returnMap.containsKey(pd.getSParamValue()) || (ObjectUtil.isEmpty(returnMap.get(pd.getSParamValue())))) - ) - .map(ParamRule::getSParam) + .filter(pd -> ObjectUtil.isNotEmpty(pd.getBConfirmAfter()) && BooleanUtil.toBoolean(pd.getBConfirmAfter().toString())) + .filter(pd -> (!returnMap.containsKey(pd.getSParam()) || (ObjectUtil.isEmpty(returnMap.get(pd.getSParam())))) + && (!returnMap.containsKey(pd.getSParamValue()) || (ObjectUtil.isEmpty(returnMap.get(pd.getSParamValue())))) + ) .toList(); } @@ -1013,6 +1043,40 @@ public class DynamicToolProvider implements ToolProvider { return markdown.toString(); } + + /** + * 缺失参数统一提示模板:强制AI调用自定义方法,一次性回填所有参数 + */ + public String buildMissParamPrompt(UserSceneSession session, List paramRuleDataMiss) { + String methodNo = session.getCurrentTool().getSMethodNo(); + String rowJson = JSONUtil.toJsonStr(session.getArgs()); + + String paramDesc = paramRuleDataMiss.stream() + .map(p -> p.getSParam() + ":" + p.getSParamValue() + ",示例:" + p.getSExampleValue()) + .collect(Collectors.joining("\n")); + + String paramKeys = paramRuleDataMiss.stream() + .map(p -> "\"" + p.getSParamValue() + "\":\"\"") + .collect(Collectors.joining(",")); + + return String.format(""" + 请你补充参数。 + + 【极强约束·必须100%%遵守】 + 1. 必须调用方法:%s + 2. 只输出标准JSON,禁止说话、禁止解释、禁止换行 + + 缺失参数: + %s + + 已填数据: + %s + + 输出格式: + {%s} + """, methodNo, paramDesc, rowJson, paramKeys); + } + public String buildDynamicSystemPrompt(UserSceneSession session) { String methodNo = session.getCurrentTool().getSMethodNo(); String rowJson = JSONUtil.toJsonStr(session.getCurrentRowData()); @@ -1161,7 +1225,14 @@ public class DynamicToolProvider implements ToolProvider { return String.format("%s", result.get("initialResult")); } - public boolean isConfirmed(String userResponse) { - return userResponse.matches("(?i)(确认|全部确认|部分确认|是|yes|confirm|true|是的|可以|没问题|确定|好的|生成|)"); + public boolean isConfirmed(String userResponse,UserSceneSession session) { + boolean check = userResponse.matches("(?i)(确认|全部确认|部分确认|是|yes|confirm|true|是的|可以|没问题|确定|好的|生成|)"); + return check || userResponse.contains("生成") + || userResponse.contains("确认") + || (ObjectUtil.isNotEmpty(session.getArgs()) + && session.getArgs().containsKey("operateType") + && session.getArgs().containsKey("sSlaveId") + && ObjectUtil.isNotEmpty(session.getArgs().get("sSlaveId")) + ); } } \ No newline at end of file