You need to sign in before continuing.
Commit c2f0732653435d4c5d4337037d42c8fd01db33ff
1 parent
97ec2c2e
添加未清选择 改成动态引导语
Showing
1 changed file
with
95 additions
and
28 deletions
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<>(); |