Commit 6e789a252da3e6966b57b86ee87144991234d994

Authored by qianbao
1 parent 6e76fb7b

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

src/main/java/com/xly/service/XlyErpService.java
... ... @@ -949,29 +949,37 @@ public class XlyErpService {
949 949 }else {return null;}
950 950 }
951 951 // 4. 获取/创建用Agent
952   - ErpAiAgent aiAgent = UserSceneSessionService.ERP_AGENT_CACHE.get(userId);
953   - if(ObjectUtil.isEmpty(aiAgent)){
954   - List<ToolSpecificationHolder> dataList = dynamicToolProvider.sceneToolCacheMap.get(session.getCurrentScene().getSId());
955   - Set<String> immediateReturnToolNames = new HashSet<>();
956   - Map<ToolSpecification, ToolExecutor> executors = new HashMap<>();
957   - if(ObjectUtil.isNotEmpty(dataList)){
958   - dataList.forEach(one->{
959   - immediateReturnToolNames.add(one.getsName());
960   - executors.put(one.getToolSpecification(),one.getToolExecutor());
961   - });
962   - }
963   - aiAgent = AiServices.builder(ErpAiAgent.class)
964   - .chatModel(chatModel)
965   - .chatMemoryProvider(operableChatMemoryProvider)
966   - .tools(executors,immediateReturnToolNames)
  952 + // ErpAiAgent aiAgent = UserSceneSessionService.ERP_AGENT_CACHE.get(userId);
  953 +// if(ObjectUtil.isEmpty(aiAgent)){
  954 + List<ToolSpecificationHolder> dataList = dynamicToolProvider.sceneToolCacheMap.get(session.getCurrentScene().getSId());
  955 + List<ToolSpecificationHolder> dataListOne =
  956 + dataList.stream().filter(m->
  957 + userInput.equals(m.getsMethodName().trim()) || ("查询"+userInput).equals(m.getsMethodName().trim())
  958 + ).collect(Collectors.toUnmodifiableList());
  959 +
  960 + if(ObjectUtil.isNotEmpty(dataListOne)){
  961 + dataList = dataListOne;
  962 + }
  963 + Set<String> immediateReturnToolNames = new HashSet<>();
  964 + Map<ToolSpecification, ToolExecutor> executors = new HashMap<>();
  965 + if(ObjectUtil.isNotEmpty(dataList)){
  966 + dataList.forEach(one->{
  967 + immediateReturnToolNames.add(one.getsName());
  968 + executors.put(one.getToolSpecification(),one.getToolExecutor());
  969 + });
  970 + }
  971 + return AiServices.builder(ErpAiAgent.class)
  972 + .chatModel(chatModel)
  973 + .chatMemoryProvider(operableChatMemoryProvider)
  974 + .tools(executors,immediateReturnToolNames)
967 975 // .toolProvider(dynamicToolProvider)
968 976 // .returnBehavior(ReturnBehavior.IMMEDIATE)
969 977 // .toolChoice(ChatCompletionToolChoice.ofRequired())
970   - .build();
971   - UserSceneSessionService.ERP_AGENT_CACHE.put(userId, aiAgent);
972   - log.info("用户{}Agent构建完成,已选场景:{},场景ID{}", userId, session.isSceneSelected() ? session.getCurrentScene().getSSceneName() : "未选(全场景匹配)", dynamicToolProvider.sSceneIdMap.get(userId));
973   - }
974   - return aiAgent;
  978 + .build();
  979 +// UserSceneSessionService.ERP_AGENT_CACHE.put(userId, aiAgent);
  980 +// log.info("用户{}Agent构建完成,已选场景:{},场景ID{}", userId, session.isSceneSelected() ? session.getCurrentScene().getSSceneName() : "未选(全场景匹配)", dynamicToolProvider.sSceneIdMap.get(userId));
  981 +// }
  982 +// return aiAgent;
975 983 }
976 984  
977 985 private ErpAiAgent createConfirmeAgent(UserSceneSession session) {
... ...
src/main/java/com/xly/tool/DynamicToolProvider.java
... ... @@ -83,14 +83,14 @@ public class DynamicToolProvider implements ToolProvider {
83 83 doSetToolAIshowfieldShow(meta);
84 84 ToolSpecification spec = buildToolSpecification(meta);
85 85 ToolExecutor executor = createToolExecutor(meta);
86   - toolCache.put(meta.getSMethodNo(), new ToolSpecificationHolder(spec, executor,meta.getSMethodNo()));
  86 + toolCache.put(meta.getSMethodNo(), new ToolSpecificationHolder(spec, executor,meta.getSMethodNo(),meta.getSMethodName()));
87 87 log.info("已加载动态工具:{}", meta.getSMethodNo());
88 88 String sceneId = meta.getSSceneId();
89 89 List<ToolSpecificationHolder> dataList = new ArrayList<>();
90 90 if(ObjectUtil.isNotEmpty(sceneToolCacheMap.get(sceneId))) {
91 91 dataList = sceneToolCacheMap.get(sceneId);
92 92 }
93   - dataList.add(new ToolSpecificationHolder(spec, executor,meta.getSMethodNo()));
  93 + dataList.add(new ToolSpecificationHolder(spec, executor,meta.getSMethodNo(),meta.getSMethodName()));
94 94 sceneToolCacheMap.put(sceneId, dataList);
95 95 } catch (Exception e) {
96 96 e.printStackTrace();
... ... @@ -1016,31 +1016,25 @@ public class DynamicToolProvider implements ToolProvider {
1016 1016 public String buildDynamicSystemPrompt(UserSceneSession session) {
1017 1017 String methodNo = session.getCurrentTool().getSMethodNo();
1018 1018 String rowJson = JSONUtil.toJsonStr(session.getCurrentRowData());
1019   -
1020 1019 return """
1021   - 【极强约束·必须执行】
1022   - 1. 禁止说话!禁止解释!
1023   - 2. 必须调用工具!
1024   - 3. 只输出标准工具调用JSON!
1025   -
1026   - 表格数据:
1027   - %s
1028   -
1029   - 【解析规则】
1030   - 1. 用户说“第N行” → 取对应sSlaveId
1031   - 2. 用户说“全部确认” → 取所有sSlaveId
1032   - 3. 多行用英文逗号拼接
1033   -
1034   - 【输出格式·绝对严格·必须照做】
1035   - 你必须输出标准工具调用JSON,只输出这一段,不许加任何文字:
1036   - {
1037   - "name": "%s",
1038   - "parameters": {
1039   - "operateType": "全部确认/合并确认/单行确认",
1040   - "sSlaveId": "id1,id2,id3"
1041   - }
1042   - }
1043   - """.formatted(rowJson, methodNo);
  1020 + 【极强约束·必须执行】
  1021 + 1. 禁止说话!禁止解释!
  1022 + 2. 必须调用工具!
  1023 + 3. 只输出标准工具调用JSON!
  1024 +
  1025 + 表格数据(key是行号):
  1026 + %s
  1027 +
  1028 + 【规则】
  1029 + 用户输入如"第N条数据确认",N为行号。
  1030 + 在表格中查找 key = N 的数据,取出 sSlaveId。
  1031 +
  1032 + 【输出格式】
  1033 + {"name": "%s", "parameters": {"operateType": "单行确认", "sSlaveId": "取出的ID"}}
  1034 +
  1035 + 【警告】
  1036 + 禁止编造!必须从表格中提取!
  1037 + """.formatted(rowJson, methodNo);
1044 1038 }
1045 1039  
1046 1040 private List<Map<String, Object>> findFieldNameByChinese(List<Map<String, Object>> sAIshowfieldShow,List<Map<String, Object>> rows){
... ...
src/main/java/com/xly/tool/ToolSpecificationHolder.java
... ... @@ -8,10 +8,12 @@ public class ToolSpecificationHolder {
8 8 private final ToolSpecification toolSpecification;
9 9 private final ToolExecutor toolExecutor;
10 10 private final String sName;
11   - public ToolSpecificationHolder(ToolSpecification toolSpecification, ToolExecutor toolExecutor,String sName) {
  11 + private final String sMethodName;
  12 + public ToolSpecificationHolder(ToolSpecification toolSpecification, ToolExecutor toolExecutor,String sName,String sMethodName) {
12 13 this.toolSpecification = toolSpecification;
13 14 this.toolExecutor = toolExecutor;
14 15 this.sName = sName;
  16 + this.sMethodName = sMethodName;
15 17 }
16 18  
17 19 public ToolSpecification getToolSpecification() {
... ... @@ -26,5 +28,8 @@ public class ToolSpecificationHolder {
26 28 return sName;
27 29 }
28 30  
  31 + public String getsMethodName() {
  32 + return sMethodName;
  33 + }
29 34 }
30 35  
... ...
src/main/java/com/xly/tts/service/PythonTtsProxyService.java
... ... @@ -4,7 +4,6 @@ import cn.hutool.core.util.ObjectUtil;
4 4 import cn.hutool.core.util.StrUtil;
5 5 import com.xly.constant.BusinessCode;
6 6 import com.xly.constant.ReturnTypeCode;
7   -import com.xly.entity.AiResponseAccumulator;
8 7 import com.xly.entity.AiResponseDTO;
9 8 import com.xly.entity.UserSceneSession;
10 9 import com.xly.service.UserSceneSessionService;
... ...
src/main/resources/application.yml
... ... @@ -135,7 +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
  138 +# chat-model-name: qwen2.5:7b-instruct
  139 + chat-model-name: qwen2.5:14b
139 140 # chat-model-name: qwen3:14b
140 141 # chat-model-name: qwen3.5:9b
141 142 # SQL/代码模型配置(专门用于代码和SQL生成)
... ...