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 | 953 | .build(); |
| 954 | 954 | UserSceneSessionService.ERP_AGENT_CACHE.put(userId, aiAgent); |
| 955 | 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 | 961 | log.info("用户{}Agent构建完成,已选场景:{},场景ID{}", userId, session.isSceneSelected() ? session.getCurrentScene().getSSceneName() : "未选(全场景匹配)", dynamicToolProvider.sSceneIdMap.get(userId)); |
| 962 | 962 | } |
| 963 | 963 | return aiAgent; | ... | ... |
src/main/java/com/xly/tool/DynamicToolProvider.java
| ... | ... | @@ -258,14 +258,14 @@ public class DynamicToolProvider implements ToolProvider { |
| 258 | 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 | 268 | stoolDesc.append(forceToolPrompt); |
| 268 | - | |
| 269 | 269 | if (ObjectUtil.isNotEmpty(meta.getStoolDesc())) { |
| 270 | 270 | stoolDesc.append("MethodNo:").append(meta.getSMethodNo()) |
| 271 | 271 | .append(",当用户").append(meta.getSMethodName()) |
| ... | ... | @@ -275,22 +275,16 @@ public class DynamicToolProvider implements ToolProvider { |
| 275 | 275 | |
| 276 | 276 | JsonObjectSchema.Builder schemaBuilder = JsonObjectSchema.builder(); |
| 277 | 277 | List<String> requiredParams = new ArrayList<>(); |
| 278 | - | |
| 279 | 278 | try { |
| 280 | 279 | List<ParamRule> paramRuleData = meta.getParamRuleList(); |
| 281 | - | |
| 282 | 280 | for (ParamRule paramRule : paramRuleData) { |
| 283 | 281 | String paramDesc = paramRule.getSParam(); |
| 284 | 282 | String paramType = paramRule.getSType(); |
| 285 | 283 | Boolean bEmpty = paramRule.getBEmpty(); |
| 286 | - | |
| 287 | 284 | if (paramDesc == null || paramDesc.isEmpty()) { |
| 288 | 285 | continue; |
| 289 | 286 | } |
| 290 | - | |
| 291 | - String sRuleCost = getConstMeg(paramRule.getSParamConfig(), paramRule); | |
| 292 | - | |
| 293 | - // ===================== 修复后:安全不报错 ===================== | |
| 287 | + String sRuleCost = getConstMeg(paramRule); | |
| 294 | 288 | switch (paramType.toLowerCase()) { |
| 295 | 289 | case "string": |
| 296 | 290 | if (bEmpty) sbt.append(paramDesc).append("(字符串)、"); |
| ... | ... | @@ -321,24 +315,47 @@ public class DynamicToolProvider implements ToolProvider { |
| 321 | 315 | break; |
| 322 | 316 | |
| 323 | 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 | 345 | break; |
| 326 | 346 | |
| 327 | 347 | case "enum": |
| 328 | - List<String> enums = new ArrayList<>(); | |
| 348 | + // 印后工艺单选枚举 | |
| 349 | + List<String> postProcessList = new ArrayList<>(); | |
| 329 | 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 | 355 | } else { |
| 338 | - schemaBuilder.addEnumProperty(paramDesc, enums, paramDesc); | |
| 356 | + schemaBuilder.addEnumProperty(paramDesc, postProcessList, sRuleCost); | |
| 339 | 357 | } |
| 340 | 358 | break; |
| 341 | - | |
| 342 | 359 | default: |
| 343 | 360 | schemaBuilder.addStringProperty(paramDesc, paramDesc); |
| 344 | 361 | break; |
| ... | ... | @@ -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 | 376 | } catch (Exception e) { |
| 360 | 377 | e.printStackTrace(); |
| ... | ... | @@ -382,10 +399,11 @@ public class DynamicToolProvider implements ToolProvider { |
| 382 | 399 | * @return java.lang.String |
| 383 | 400 | * @Description 常量类型枚举 |
| 384 | 401 | **/ |
| 385 | - private String getConstMeg(String sConstConfig,ParamRule paramRule){ | |
| 402 | + private String getConstMeg(ParamRule paramRule){ | |
| 386 | 403 | if(!RuleCode.CONST.getCode().equals(paramRule.getSRule())){ |
| 387 | 404 | return StrUtil.EMPTY; |
| 388 | 405 | } |
| 406 | + String sConstConfig = paramRule.getSParamConfig(); | |
| 389 | 407 | if(StrUtil.isNotEmpty(sConstConfig)){ |
| 390 | 408 | Map<String,Object> constMap = JSONUtil.parseObj(sConstConfig); |
| 391 | 409 | StringBuffer sb = new StringBuffer(); |
| ... | ... | @@ -399,7 +417,6 @@ public class DynamicToolProvider implements ToolProvider { |
| 399 | 417 | |
| 400 | 418 | return StrUtil.EMPTY; |
| 401 | 419 | } |
| 402 | - | |
| 403 | 420 | //数组类型枚举 |
| 404 | 421 | private String getArrrayBySql(ParamRule paramRule){ |
| 405 | 422 | Boolean bCheckArray = !(RuleCode.SQL.getCode().equals(paramRule.getSRule())); | ... | ... |
src/main/resources/application.yml
| ... | ... | @@ -135,8 +135,8 @@ langchain4j: |
| 135 | 135 | ollama: |
| 136 | 136 | # 聊天模型配置(用于一般对话) |
| 137 | 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 | 140 | # chat-model-name: qwen3.5:9b |
| 141 | 141 | # SQL/代码模型配置(专门用于代码和SQL生成) |
| 142 | 142 | sql-model-name: qwen2.5-coder:7b | ... | ... |