Commit 5c38d571e483b6dbc577f28ecee951fc2a2b1d11

Authored by qianbao
1 parent 6e789a25

添加未清选择 改成动态引导语

src/main/java/com/xly/service/XlyErpService.java
@@ -352,9 +352,10 @@ public class XlyErpService { @@ -352,9 +352,10 @@ public class XlyErpService {
352 ){ 352 ){
353 String sSystemPrompt = AgentSystemPrompt.sSystemPrompt; 353 String sSystemPrompt = AgentSystemPrompt.sSystemPrompt;
354 //如果客户输入了确认/生成 切换引导语言 354 //如果客户输入了确认/生成 切换引导语言
355 - Boolean isConfirmed = dynamicToolProvider.isConfirmed(input) || input.contains("生成") || input.contains("确认"); 355 + Boolean isConfirmed = dynamicToolProvider.isConfirmed(input,session);
356 if(ObjectUtil.isNotEmpty(session.getSSystemPrompt()) && isConfirmed){ 356 if(ObjectUtil.isNotEmpty(session.getSSystemPrompt()) && isConfirmed){
357 sSystemPrompt = session.getSSystemPrompt(); 357 sSystemPrompt = session.getSSystemPrompt();
  358 +// session.setSSystemPrompt();
358 //重新生成新的aiAgent拿新的aiAgent 做选择 359 //重新生成新的aiAgent拿新的aiAgent 做选择
359 aiAgent = createConfirmeAgent(session); 360 aiAgent = createConfirmeAgent(session);
360 } 361 }
src/main/java/com/xly/tool/DynamicToolProvider.java
1 package com.xly.tool; 1 package com.xly.tool;
2 2
3 3
  4 +import cn.hutool.core.util.BooleanUtil;
4 import cn.hutool.core.util.ObjectUtil; 5 import cn.hutool.core.util.ObjectUtil;
5 import cn.hutool.core.util.StrUtil; 6 import cn.hutool.core.util.StrUtil;
6 import cn.hutool.json.JSONUtil; 7 import cn.hutool.json.JSONUtil;
@@ -464,6 +465,10 @@ public class DynamicToolProvider implements ToolProvider { @@ -464,6 +465,10 @@ public class DynamicToolProvider implements ToolProvider {
464 public String doDynamicTool(ToolMeta meta,UserSceneSession session) { 465 public String doDynamicTool(ToolMeta meta,UserSceneSession session) {
465 List<ParamRule> paramRuleData = meta.getParamRuleListAll(); 466 List<ParamRule> paramRuleData = meta.getParamRuleListAll();
466 List<ParamRule> paramRuleDataCheck = meta.getParamRuleListCheck(); 467 List<ParamRule> paramRuleDataCheck = meta.getParamRuleListCheck();
  468 + Map<String, Object> argsOld = session.getArgs();
  469 + if(ObjectUtil.isEmpty(argsOld)){
  470 + argsOld = new HashMap<>();
  471 + }
467 Map<String, Object> args = session.getArgs(); 472 Map<String, Object> args = session.getArgs();
468 473
469 List<String> missing = checkRequiredParams(args, paramRuleDataCheck); 474 List<String> missing = checkRequiredParams(args, paramRuleDataCheck);
@@ -478,8 +483,7 @@ public class DynamicToolProvider implements ToolProvider { @@ -478,8 +483,7 @@ public class DynamicToolProvider implements ToolProvider {
478 if (userMessage != null) { 483 if (userMessage != null) {
479 input = StrUtil.replace(getChatMessageContent(userMessage), "用户输入:", StrUtil.EMPTY); 484 input = StrUtil.replace(getChatMessageContent(userMessage), "用户输入:", StrUtil.EMPTY);
480 } 485 }
481 -  
482 - Boolean isConfirmed = isConfirmed(input) || input.contains("生成") || input.contains("确认"); 486 + Boolean isConfirmed = isConfirmed(input,session);
483 487
484 if((isConfirmed && (4== meta.getIBizType() ||1== meta.getIBizType())) 488 if((isConfirmed && (4== meta.getIBizType() ||1== meta.getIBizType()))
485 || 2== meta.getIBizType() 489 || 2== meta.getIBizType()
@@ -491,8 +495,15 @@ public class DynamicToolProvider implements ToolProvider { @@ -491,8 +495,15 @@ public class DynamicToolProvider implements ToolProvider {
491 { 495 {
492 List<String> missingAfter = checkConfirmAfterParam(args, paramRuleData); 496 List<String> missingAfter = checkConfirmAfterParam(args, paramRuleData);
493 if (!missingAfter.isEmpty()) { 497 if (!missingAfter.isEmpty()) {
  498 + //合并已选择数据
  499 + argsOld.putAll(args);
  500 + session.setArgs(argsOld);
494 String askMsg = buildAskUserMessage(meta, missingAfter,args); 501 String askMsg = buildAskUserMessage(meta, missingAfter,args);
495 - throw new DataException(askMsg); 502 + session.setSFunPrompts(askMsg);
  503 + List<ParamRule> paramRuleDataMiss = getMissParamRuleAfter(args, paramRuleData);
  504 + String sSystemPrompt = buildMissParamPrompt(session,paramRuleDataMiss);
  505 + session.setSSystemPrompt(sSystemPrompt);
  506 + return askMsg;
496 } 507 }
497 return executeTool(meta, args, paramRuleData, session.getUserId(), session); 508 return executeTool(meta, args, paramRuleData, session.getUserId(), session);
498 } 509 }
@@ -720,15 +731,34 @@ public class DynamicToolProvider implements ToolProvider { @@ -720,15 +731,34 @@ public class DynamicToolProvider implements ToolProvider {
720 return bDbZero || bBhcs || (!returnMap.containsKey(pd.getSParamValue()) || (ObjectUtil.isEmpty(returnMap.get(pd.getSParamValue())))); 731 return bDbZero || bBhcs || (!returnMap.containsKey(pd.getSParamValue()) || (ObjectUtil.isEmpty(returnMap.get(pd.getSParamValue()))));
721 } 732 }
722 733
  734 + /***
  735 + * @Author 钱豹
  736 + * @Date 1:08 2026/5/19
  737 + * @Param [args, paramDefs]
  738 + * @return java.util.List<java.lang.String>
  739 + * @Description 获取缺失参数提示
  740 + **/
723 private List<String> checkConfirmAfterParam(Map<String, Object> args, List<ParamRule> paramDefs) { 741 private List<String> checkConfirmAfterParam(Map<String, Object> args, List<ParamRule> paramDefs) {
  742 + List<ParamRule> paramRuleList = getMissParamRuleAfter( args, paramDefs);
  743 + return paramRuleList.stream()
  744 + .map(ParamRule::getSParam)
  745 + .toList();
  746 + }
  747 +
  748 + /***
  749 + * @Author 钱豹
  750 + * @Date 2026/5/19
  751 + * @Param [args, paramDefs]
  752 + * @return java.util.List<com.xly.entity.ParamRule>
  753 + * @Description 获取保存后的缺失参数
  754 + **/
  755 + private List<ParamRule> getMissParamRuleAfter(Map<String, Object> args, List<ParamRule> paramDefs) {
724 Map<String,Object> returnMap = transformationArgs( args, paramDefs); 756 Map<String,Object> returnMap = transformationArgs( args, paramDefs);
725 return paramDefs.stream() 757 return paramDefs.stream()
726 - .filter(pd -> Boolean.TRUE.equals(pd.getBConfirmAfter()) && pd.getBTipModel())  
727 - .filter(pd ->  
728 - (!returnMap.containsKey(pd.getSParam()) || (ObjectUtil.isEmpty(returnMap.get(pd.getSParam()))))  
729 - && (!returnMap.containsKey(pd.getSParamValue()) || (ObjectUtil.isEmpty(returnMap.get(pd.getSParamValue()))))  
730 - )  
731 - .map(ParamRule::getSParam) 758 + .filter(pd -> ObjectUtil.isNotEmpty(pd.getBConfirmAfter()) && BooleanUtil.toBoolean(pd.getBConfirmAfter().toString()))
  759 + .filter(pd -> (!returnMap.containsKey(pd.getSParam()) || (ObjectUtil.isEmpty(returnMap.get(pd.getSParam()))))
  760 + && (!returnMap.containsKey(pd.getSParamValue()) || (ObjectUtil.isEmpty(returnMap.get(pd.getSParamValue()))))
  761 + )
732 .toList(); 762 .toList();
733 } 763 }
734 764
@@ -1013,6 +1043,40 @@ public class DynamicToolProvider implements ToolProvider { @@ -1013,6 +1043,40 @@ public class DynamicToolProvider implements ToolProvider {
1013 return markdown.toString(); 1043 return markdown.toString();
1014 } 1044 }
1015 1045
  1046 +
  1047 + /**
  1048 + * 缺失参数统一提示模板:强制AI调用自定义方法,一次性回填所有参数
  1049 + */
  1050 + public String buildMissParamPrompt(UserSceneSession session, List<ParamRule> paramRuleDataMiss) {
  1051 + String methodNo = session.getCurrentTool().getSMethodNo();
  1052 + String rowJson = JSONUtil.toJsonStr(session.getArgs());
  1053 +
  1054 + String paramDesc = paramRuleDataMiss.stream()
  1055 + .map(p -> p.getSParam() + ":" + p.getSParamValue() + ",示例:" + p.getSExampleValue())
  1056 + .collect(Collectors.joining("\n"));
  1057 +
  1058 + String paramKeys = paramRuleDataMiss.stream()
  1059 + .map(p -> "\"" + p.getSParamValue() + "\":\"\"")
  1060 + .collect(Collectors.joining(","));
  1061 +
  1062 + return String.format("""
  1063 + 请你补充参数。
  1064 +
  1065 + 【极强约束·必须100%%遵守】
  1066 + 1. 必须调用方法:%s
  1067 + 2. 只输出标准JSON,禁止说话、禁止解释、禁止换行
  1068 +
  1069 + 缺失参数:
  1070 + %s
  1071 +
  1072 + 已填数据:
  1073 + %s
  1074 +
  1075 + 输出格式:
  1076 + {%s}
  1077 + """, methodNo, paramDesc, rowJson, paramKeys);
  1078 + }
  1079 +
1016 public String buildDynamicSystemPrompt(UserSceneSession session) { 1080 public String buildDynamicSystemPrompt(UserSceneSession session) {
1017 String methodNo = session.getCurrentTool().getSMethodNo(); 1081 String methodNo = session.getCurrentTool().getSMethodNo();
1018 String rowJson = JSONUtil.toJsonStr(session.getCurrentRowData()); 1082 String rowJson = JSONUtil.toJsonStr(session.getCurrentRowData());
@@ -1161,7 +1225,14 @@ public class DynamicToolProvider implements ToolProvider { @@ -1161,7 +1225,14 @@ public class DynamicToolProvider implements ToolProvider {
1161 return String.format("%s", result.get("initialResult")); 1225 return String.format("%s", result.get("initialResult"));
1162 } 1226 }
1163 1227
1164 - public boolean isConfirmed(String userResponse) {  
1165 - return userResponse.matches("(?i)(确认|全部确认|部分确认|是|yes|confirm|true|是的|可以|没问题|确定|好的|生成|)"); 1228 + public boolean isConfirmed(String userResponse,UserSceneSession session) {
  1229 + boolean check = userResponse.matches("(?i)(确认|全部确认|部分确认|是|yes|confirm|true|是的|可以|没问题|确定|好的|生成|)");
  1230 + return check || userResponse.contains("生成")
  1231 + || userResponse.contains("确认")
  1232 + || (ObjectUtil.isNotEmpty(session.getArgs())
  1233 + && session.getArgs().containsKey("operateType")
  1234 + && session.getArgs().containsKey("sSlaveId")
  1235 + && ObjectUtil.isNotEmpty(session.getArgs().get("sSlaveId"))
  1236 + );
1166 } 1237 }
1167 } 1238 }
1168 \ No newline at end of file 1239 \ No newline at end of file