Commit 0c696213612b9d9d8d20480501eb8f397cad2fd1

Authored by qianbao
1 parent 0ed098ff

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

src/main/java/com/xly/service/XlyErpService.java
@@ -953,11 +953,11 @@ public class XlyErpService { @@ -953,11 +953,11 @@ public class XlyErpService {
953 .build(); 953 .build();
954 UserSceneSessionService.ERP_AGENT_CACHE.put(userId, aiAgent); 954 UserSceneSessionService.ERP_AGENT_CACHE.put(userId, aiAgent);
955 // 初始化AiService 以防止热加载太慢 找不到相应的方法 955 // 初始化AiService 以防止热加载太慢 找不到相应的方法
956 - try{  
957 - aiAgent.chat(userId, "initAiService",AgentSystemPrompt.sSystemPrompt);  
958 - }catch (Exception e){  
959 - e.printStackTrace();  
960 - } 956 +// try{
  957 +// aiAgent.chat(userId, "initAiService",AgentSystemPrompt.sSystemPrompt);
  958 +// }catch (Exception e){
  959 +// e.printStackTrace();
  960 +// }
961 log.info("用户{}Agent构建完成,已选场景:{},场景ID{}", userId, session.isSceneSelected() ? session.getCurrentScene().getSSceneName() : "未选(全场景匹配)", dynamicToolProvider.sSceneIdMap.get(userId)); 961 log.info("用户{}Agent构建完成,已选场景:{},场景ID{}", userId, session.isSceneSelected() ? session.getCurrentScene().getSSceneName() : "未选(全场景匹配)", dynamicToolProvider.sSceneIdMap.get(userId));
962 } 962 }
963 return aiAgent; 963 return aiAgent;
src/main/java/com/xly/tool/DynamicToolProvider.java
@@ -258,14 +258,14 @@ public class DynamicToolProvider implements ToolProvider { @@ -258,14 +258,14 @@ public class DynamicToolProvider implements ToolProvider {
258 StringBuffer xt = new StringBuffer(); 258 StringBuffer xt = new StringBuffer();
259 259
260 // 强制指令【完全保留】 260 // 强制指令【完全保留】
261 - String forceToolPrompt = """  
262 - 【重要·强制指令】  
263 - 1. 这是当前唯一可用工具,必须调用,禁止直接回答  
264 - 2. 用户输入包含:确认、全部确认、合并确认、行号(第1行/第一行等)  
265 - 3. 必须调用本工具,只调用一次!  
266 - """; 261 + String forceToolPrompt = StrUtil.EMPTY;
  262 +// """
  263 +// 【重要·强制指令】
  264 +// 1. 这是当前唯一可用工具,必须调用,禁止直接回答
  265 +// 2. 用户输入包含:确认、全部确认、合并确认、行号(第1行/第一行等)
  266 +// 3. 必须调用本工具,只调用一次!
  267 +// """;
267 stoolDesc.append(forceToolPrompt); 268 stoolDesc.append(forceToolPrompt);
268 -  
269 if (ObjectUtil.isNotEmpty(meta.getStoolDesc())) { 269 if (ObjectUtil.isNotEmpty(meta.getStoolDesc())) {
270 stoolDesc.append("MethodNo:").append(meta.getSMethodNo()) 270 stoolDesc.append("MethodNo:").append(meta.getSMethodNo())
271 .append(",当用户").append(meta.getSMethodName()) 271 .append(",当用户").append(meta.getSMethodName())
@@ -275,22 +275,16 @@ public class DynamicToolProvider implements ToolProvider { @@ -275,22 +275,16 @@ public class DynamicToolProvider implements ToolProvider {
275 275
276 JsonObjectSchema.Builder schemaBuilder = JsonObjectSchema.builder(); 276 JsonObjectSchema.Builder schemaBuilder = JsonObjectSchema.builder();
277 List<String> requiredParams = new ArrayList<>(); 277 List<String> requiredParams = new ArrayList<>();
278 -  
279 try { 278 try {
280 List<ParamRule> paramRuleData = meta.getParamRuleList(); 279 List<ParamRule> paramRuleData = meta.getParamRuleList();
281 -  
282 for (ParamRule paramRule : paramRuleData) { 280 for (ParamRule paramRule : paramRuleData) {
283 String paramDesc = paramRule.getSParam(); 281 String paramDesc = paramRule.getSParam();
284 String paramType = paramRule.getSType(); 282 String paramType = paramRule.getSType();
285 Boolean bEmpty = paramRule.getBEmpty(); 283 Boolean bEmpty = paramRule.getBEmpty();
286 -  
287 if (paramDesc == null || paramDesc.isEmpty()) { 284 if (paramDesc == null || paramDesc.isEmpty()) {
288 continue; 285 continue;
289 } 286 }
290 -  
291 - String sRuleCost = getConstMeg(paramRule.getSParamConfig(), paramRule);  
292 -  
293 - // ===================== 修复后:安全不报错 ===================== 287 + String sRuleCost = getConstMeg(paramRule);
294 switch (paramType.toLowerCase()) { 288 switch (paramType.toLowerCase()) {
295 case "string": 289 case "string":
296 if (bEmpty) sbt.append(paramDesc).append("(字符串)、"); 290 if (bEmpty) sbt.append(paramDesc).append("(字符串)、");
@@ -321,24 +315,47 @@ public class DynamicToolProvider implements ToolProvider { @@ -321,24 +315,47 @@ public class DynamicToolProvider implements ToolProvider {
321 break; 315 break;
322 316
323 case "array": 317 case "array":
324 - schemaBuilder.addStringProperty(paramDesc, paramDesc); 318 + // 印后工艺:从SQL获取可选工艺列表
  319 + String postProcessArray = getArrrayBySql(paramRule);
  320 + List<String> postProcessEnums = new ArrayList<>();
  321 + if (StrUtil.isNotBlank(postProcessArray)) {
  322 + postProcessEnums = Arrays.asList(postProcessArray.split("/"));
  323 + }
  324 + StringBuffer paramDescTs = new StringBuffer();
  325 + paramDescTs.append(paramDesc).append("(数组类型,可多选印后工艺 [").append(postProcessArray).append("]");
  326 + // 处理默认值
  327 + if (ObjectUtil.isNotEmpty(paramRule.getSDefaultValue()) ||
  328 + (ObjectUtil.isNotEmpty(postProcessArray) && postProcessArray.split("/").length == 1)) {
  329 + String defaultVal = (ObjectUtil.isNotEmpty(postProcessArray) && postProcessArray.split("/").length == 1)
  330 + ? postProcessArray
  331 + : paramRule.getSDefaultValue();
  332 + paramDescTs.append(",默认值[").append(defaultVal).append("]");
  333 + } else {
  334 + paramDescTs.append(",无默认值");
  335 + }
  336 + paramDescTs.append(")、");
  337 + // 有枚举值走枚举,没有走普通字符串
  338 + if (postProcessEnums.isEmpty()) {
  339 + sbt.append(paramDescTs);
  340 + schemaBuilder.addStringProperty(paramDesc, paramDescTs.toString());
  341 + } else {
  342 + xt.append(paramDescTs);
  343 + schemaBuilder.addEnumProperty(paramDesc, postProcessEnums, paramDescTs.toString());
  344 + }
325 break; 345 break;
326 346
327 case "enum": 347 case "enum":
328 - List<String> enums = new ArrayList<>(); 348 + // 印后工艺单选枚举
  349 + List<String> postProcessList = new ArrayList<>();
329 if (StrUtil.isNotBlank(sRuleCost)) { 350 if (StrUtil.isNotBlank(sRuleCost)) {
330 - enums = Arrays.asList(sRuleCost.split("/")); 351 + postProcessList = Arrays.asList(sRuleCost.split("/"));
331 } 352 }
332 -  
333 - // ===================== 核心修复 =====================  
334 - if (enums.isEmpty()) {  
335 - // 空枚举 → 自动转字符串,绝对不报错  
336 - schemaBuilder.addStringProperty(paramDesc, paramDesc); 353 + if (postProcessList.isEmpty()) {
  354 + schemaBuilder.addStringProperty(paramDesc, sRuleCost);
337 } else { 355 } else {
338 - schemaBuilder.addEnumProperty(paramDesc, enums, paramDesc); 356 + schemaBuilder.addEnumProperty(paramDesc, postProcessList, sRuleCost);
339 } 357 }
340 break; 358 break;
341 -  
342 default: 359 default:
343 schemaBuilder.addStringProperty(paramDesc, paramDesc); 360 schemaBuilder.addStringProperty(paramDesc, paramDesc);
344 break; 361 break;
@@ -349,12 +366,12 @@ public class DynamicToolProvider implements ToolProvider { @@ -349,12 +366,12 @@ public class DynamicToolProvider implements ToolProvider {
349 } 366 }
350 } 367 }
351 368
352 - if (ObjectUtil.isNotEmpty(sbt)) {  
353 - stoolDesc.append(System.lineSeparator()).append("1.必填参数:").append(sbt);  
354 - }  
355 - if (ObjectUtil.isNotEmpty(xt)) {  
356 - stoolDesc.append(System.lineSeparator()).append("2.选填参数:").append(xt);  
357 - } 369 +// if (ObjectUtil.isNotEmpty(sbt)) {
  370 +// stoolDesc.append(System.lineSeparator()).append("1.必填参数:").append(sbt);
  371 +// }
  372 +// if (ObjectUtil.isNotEmpty(xt)) {
  373 +// stoolDesc.append(System.lineSeparator()).append("2.选填参数:").append(xt);
  374 +// }
358 375
359 } catch (Exception e) { 376 } catch (Exception e) {
360 e.printStackTrace(); 377 e.printStackTrace();
@@ -382,10 +399,11 @@ public class DynamicToolProvider implements ToolProvider { @@ -382,10 +399,11 @@ public class DynamicToolProvider implements ToolProvider {
382 * @return java.lang.String 399 * @return java.lang.String
383 * @Description 常量类型枚举 400 * @Description 常量类型枚举
384 **/ 401 **/
385 - private String getConstMeg(String sConstConfig,ParamRule paramRule){ 402 + private String getConstMeg(ParamRule paramRule){
386 if(!RuleCode.CONST.getCode().equals(paramRule.getSRule())){ 403 if(!RuleCode.CONST.getCode().equals(paramRule.getSRule())){
387 return StrUtil.EMPTY; 404 return StrUtil.EMPTY;
388 } 405 }
  406 + String sConstConfig = paramRule.getSParamConfig();
389 if(StrUtil.isNotEmpty(sConstConfig)){ 407 if(StrUtil.isNotEmpty(sConstConfig)){
390 Map<String,Object> constMap = JSONUtil.parseObj(sConstConfig); 408 Map<String,Object> constMap = JSONUtil.parseObj(sConstConfig);
391 StringBuffer sb = new StringBuffer(); 409 StringBuffer sb = new StringBuffer();
@@ -399,7 +417,6 @@ public class DynamicToolProvider implements ToolProvider { @@ -399,7 +417,6 @@ public class DynamicToolProvider implements ToolProvider {
399 417
400 return StrUtil.EMPTY; 418 return StrUtil.EMPTY;
401 } 419 }
402 -  
403 //数组类型枚举 420 //数组类型枚举
404 private String getArrrayBySql(ParamRule paramRule){ 421 private String getArrrayBySql(ParamRule paramRule){
405 Boolean bCheckArray = !(RuleCode.SQL.getCode().equals(paramRule.getSRule())); 422 Boolean bCheckArray = !(RuleCode.SQL.getCode().equals(paramRule.getSRule()));
src/main/resources/application.yml
@@ -135,8 +135,8 @@ langchain4j: @@ -135,8 +135,8 @@ langchain4j:
135 ollama: 135 ollama:
136 # 聊天模型配置(用于一般对话) 136 # 聊天模型配置(用于一般对话)
137 base-url: http://112.82.245.194:11434 137 base-url: http://112.82.245.194:11434
138 - chat-model-name: qwen2.5:7b-instruct  
139 -# chat-model-name: qwen3:14b 138 +# chat-model-name: qwen2.5:7b-instruct
  139 + chat-model-name: qwen3:14b
140 # chat-model-name: qwen3.5:9b 140 # chat-model-name: qwen3.5:9b
141 # SQL/代码模型配置(专门用于代码和SQL生成) 141 # SQL/代码模型配置(专门用于代码和SQL生成)
142 sql-model-name: qwen2.5-coder:7b 142 sql-model-name: qwen2.5-coder:7b