You need to sign in before continuing.

Commit c2f0732653435d4c5d4337037d42c8fd01db33ff

Authored by qianbao
1 parent 97ec2c2e

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

src/main/java/com/xly/tool/DynamicToolProvider.java
@@ -213,6 +213,14 @@ public class DynamicToolProvider implements ToolProvider { @@ -213,6 +213,14 @@ public class DynamicToolProvider implements ToolProvider {
213 // 2.1 【自动补全】应用参数的默认值 213 // 2.1 【自动补全】应用参数的默认值
214 List<ParamRule> paramRuleData = meta.getParamRuleListAll(); 214 List<ParamRule> paramRuleData = meta.getParamRuleListAll();
215 args = applyDefaultValues(args, paramRuleData); 215 args = applyDefaultValues(args, paramRuleData);
  216 + //客户选择行号转sSLaveId
  217 + if(ObjectUtil.isNotEmpty(args)
  218 + && args.containsKey("rowNumbers")
  219 + && ObjectUtil.isNotEmpty(args.get("rowNumbers"))
  220 + && ObjectUtil.isNotEmpty(session.getCurrentRowData())
  221 + ){
  222 + doSetSlaveIdToArgs( args, session);
  223 + }
216 session.setArgs(args); 224 session.setArgs(args);
217 // 3. 【自动校验】检查必填项 225 // 3. 【自动校验】检查必填项
218 List<String> missing = checkRequiredParams(args, paramRuleData); 226 List<String> missing = checkRequiredParams(args, paramRuleData);
@@ -229,6 +237,20 @@ public class DynamicToolProvider implements ToolProvider { @@ -229,6 +237,20 @@ public class DynamicToolProvider implements ToolProvider {
229 }; 237 };
230 } 238 }
231 239
  240 + private void doSetSlaveIdToArgs(Map<String,Object> args,UserSceneSession session){
  241 + Map<Integer,Map<String,Object>> data = session.getCurrentRowData();
  242 + List<Integer> rowNumbers = (List<Integer>) args.get("rowNumbers");
  243 + List<String> sSlaveIds = new ArrayList<>();
  244 + rowNumbers.forEach(one->{
  245 + try{
  246 + sSlaveIds.add(data.get(one-1).get("sSlaveId").toString());
  247 + }catch (Exception e){
  248 + }
  249 + });
  250 + args.put("sSlaveId",String.join(",",sSlaveIds));
  251 + args.remove("rowNumbers");
  252 + }
  253 +
232 private void doSetToolAIshowfieldShow(ToolMeta meta){ 254 private void doSetToolAIshowfieldShow(ToolMeta meta){
233 String sToolId = meta.getSId(); 255 String sToolId = meta.getSId();
234 List<ParamRule> paramRuleData = getParamRuleDataAll(); 256 List<ParamRule> paramRuleData = getParamRuleDataAll();
@@ -824,6 +846,10 @@ public class DynamicToolProvider implements ToolProvider { @@ -824,6 +846,10 @@ public class DynamicToolProvider implements ToolProvider {
824 if(ObjectUtil.isEmpty(args.get("sSlaveId"))){ 846 if(ObjectUtil.isEmpty(args.get("sSlaveId"))){
825 //插入AI记忆 847 //插入AI记忆
826 String sMsg = "请选择操作数据"; 848 String sMsg = "请选择操作数据";
  849 + Map<String, Object> sessA = session.getArgs();
  850 + sessA.remove("sSlaveId");
  851 + sessA.remove("operateType");
  852 + session.setArgs(sessA);
827 addSystemMessage(session, sMsg); 853 addSystemMessage(session, sMsg);
828 throw new BusinessException(-1,sMsg); 854 throw new BusinessException(-1,sMsg);
829 } 855 }
@@ -831,6 +857,10 @@ public class DynamicToolProvider implements ToolProvider { @@ -831,6 +857,10 @@ public class DynamicToolProvider implements ToolProvider {
831 if(ObjectUtil.isEmpty(sRowData)){ 857 if(ObjectUtil.isEmpty(sRowData)){
832 String sMsg = "选择的数据ID:"+args.get("sSlaveId")+"不存在,请重新选择。"; 858 String sMsg = "选择的数据ID:"+args.get("sSlaveId")+"不存在,请重新选择。";
833 session.setSFunPrompts(sMsg); 859 session.setSFunPrompts(sMsg);
  860 + Map<String, Object> sessA = session.getArgs();
  861 + sessA.remove("sSlaveId");
  862 + sessA.remove("operateType");
  863 + session.setArgs(sessA);
834 //插入AI记忆 864 //插入AI记忆
835 addSystemMessage(session, sMsg); 865 addSystemMessage(session, sMsg);
836 throw new BusinessException(-1,sMsg); 866 throw new BusinessException(-1,sMsg);
@@ -1131,37 +1161,74 @@ public class DynamicToolProvider implements ToolProvider { @@ -1131,37 +1161,74 @@ public class DynamicToolProvider implements ToolProvider {
1131 } 1161 }
1132 1162
1133 public String buildDynamicSystemPrompt(UserSceneSession session) { 1163 public String buildDynamicSystemPrompt(UserSceneSession session) {
  1164 + // 获取当前工具编号(用于 JSON 的 name 字段)
1134 String methodNo = session.getCurrentTool().getSMethodNo(); 1165 String methodNo = session.getCurrentTool().getSMethodNo();
1135 - String rowJson = JSONUtil.toJsonPrettyStr(session.getCurrentRowData());  
1136 -  
1137 return """ 1166 return """
1138 - 【极强约束·必须执行】  
1139 - 1. 禁止说话!禁止解释!  
1140 - 2. 必须调用工具!  
1141 - 3. 只输出标准工具调用JSON!  
1142 -  
1143 - 表格数据(key是行号):  
1144 - %s  
1145 -  
1146 - 【规则】  
1147 - 用户输入如"第N条数据确认",N为行号。  
1148 - 在表格中查找 key = N 的数据,取出 sSlaveId。  
1149 -  
1150 - 【输出格式】  
1151 - {"name": "%s", "parameters": {"operateType": "单行确认", "sSlaveId": "取出的ID"}}  
1152 -  
1153 - 【输出格式·严格执行】  
1154 - 你必须分两步输出:  
1155 - 1. **思考步骤**:明确写出“用户要求第N行,我在JSON中找到Key为N的数据,其sSlaveId是[完整复制ID]”。  
1156 - 2. **JSON步骤**:换行后输出标准的工具调用JSON。  
1157 -  
1158 - 【输出示例】  
1159 - 思考:用户要求第3行,我在JSON中找到Key为"3"的数据,其sSlaveId是17782251520001103406038478326300。  
1160 - {"name": "queryUnstockedProducts", "parameters": {"operateType": "单行确认", "sSlaveId": "17782251520001103406038478326300"}}  
1161 - 【警告】  
1162 - 思考步骤中的ID必须与JSON中的ID完全一致!禁止编造!必须从表格中提取!  
1163 - """.formatted(rowJson, methodNo); 1167 + 【极强约束·必须执行】
  1168 + 1. 禁止说话!禁止解释!
  1169 + 2. 必须调用工具!
  1170 + 3. 只输出标准工具调用JSON!
  1171 +
  1172 + ### 任务背景 ###
  1173 + 用户会输入自然语言指令(如“第1行确认”、“全部合并”等)。
  1174 + 你的任务是:解析出【操作类型】和【目标行号】。
  1175 +
  1176 + ### 解析规则(必须严格遵守) ###
  1177 +
  1178 + 1. **操作类型 (operateType)**:
  1179 + - 如果用户说“全部确认”、“生成多个单据”,识别为:"全部确认"
  1180 + - 如果用户说“合并确认”、“生成一个单据”,识别为:"合并确认"
  1181 + - 其他情况,默认为:"单行确认"
  1182 +
  1183 + 2. **行号提取 (rowNumbers)**:
  1184 + - 单选:如“第5行”,提取为 [5]
  1185 + - 多选:如“第1、3、5行”,提取为 [1, 3, 5]
  1186 + - 范围:如“第2到4行”,提取为 [2, 3, 4]
  1187 + - 全选:如“全部”、“所有”,提取为 ["ALL"]
  1188 +
  1189 + ### 输出格式规范 ###
  1190 + 请直接输出以下 JSON(不要任何 Markdown 格式,不要 ```json):
  1191 + {"name": "%s", "parameters": {"operateType": "解析出的类型", "rowNumbers": [行号数组或"ALL"]}}
  1192 +
  1193 + """.formatted(methodNo);
1164 } 1194 }
  1195 +// public String buildDynamicSystemPrompt(UserSceneSession session) {
  1196 +// // 获取当前工具编号
  1197 +// String methodNo = session.getCurrentTool().getSMethodNo();
  1198 +// // 格式化表格数据(保持缩进,方便模型阅读)
  1199 +// String rowJson = JSONUtil.toJsonPrettyStr(session.getCurrentRowData());
  1200 +//
  1201 +// return """
  1202 +// 【极强约束·必须执行】
  1203 +// 1. 禁止说话!禁止解释!
  1204 +// 2. 必须调用工具!
  1205 +// 3. 只输出标准工具调用JSON!
  1206 +//
  1207 +// ### 任务背景 ###
  1208 +// 用户会输入类似“第5行确认”或“确认第3条”的指令。
  1209 +// 你的任务是:解析行号 -> 在下方表格中找到对应行 -> 提取 sSlaveId -> 调用工具。
  1210 +//
  1211 +// ### 数据源(表格 key 是行号) ###
  1212 +// %s
  1213 +//
  1214 +// ### 防错黄金法则(必须严格遵守) ###
  1215 +// 1. **查找阶段**:不要凭空编造 ID。必须先在“思考步骤”中明确写出:
  1216 +// “用户输入是[xx],提取行号[N] -> 查找表格 Key=[N] -> 对应的 sSlaveId 是 [这里填入表格里的完整数字]”
  1217 +// 2. **复制阶段**:sSlaveId 是一长串数字,请务必**直接复制**表格中的原始值,不要加省略号(...),不要改变数字。
  1218 +// 3. **输出阶段**:只有确认复制无误后,才在 JSON 的 sSlaveId 字段中填入该值。
  1219 +//
  1220 +// ### 输出格式规范 ###
  1221 +// {"name": "%s", "parameters": {"operateType": "单行确认", "sSlaveId": "在这里填入你从表格中复制的ID"}}
  1222 +//
  1223 +// ### 执行流程(一步一步来) ###
  1224 +// 1. **解析**:阅读用户输入,确定他想操作的是第几行(N)。
  1225 +// 2. **思考**:在回复的第一行,写出你的查找过程(例如:用户要求第5行...)。
  1226 +// 3. **JSON**:换行后,输出最终的工具调用 JSON。
  1227 +//
  1228 +// 【警告】
  1229 +// 如果用户要求的行号在表格中不存在,请返回错误信息,不要调用工具。
  1230 +// """.formatted(rowJson, methodNo);
  1231 +// }
1165 1232
1166 private List<Map<String, Object>> findFieldNameByChinese(List<Map<String, Object>> sAIshowfieldShow,List<Map<String, Object>> rows){ 1233 private List<Map<String, Object>> findFieldNameByChinese(List<Map<String, Object>> sAIshowfieldShow,List<Map<String, Object>> rows){
1167 Map<String,String> keyMappings = new HashMap<>(); 1234 Map<String,String> keyMappings = new HashMap<>();