Commit 0c696213612b9d9d8d20480501eb8f397cad2fd1
1 parent
0ed098ff
添加未清选择 改成动态引导语
Showing
3 changed files
with
56 additions
and
39 deletions
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 |