diff --git a/src/main/java/com/xly/tool/DynamicToolProvider.java b/src/main/java/com/xly/tool/DynamicToolProvider.java index f90aba4..ca0e254 100644 --- a/src/main/java/com/xly/tool/DynamicToolProvider.java +++ b/src/main/java/com/xly/tool/DynamicToolProvider.java @@ -1075,32 +1075,30 @@ public class DynamicToolProvider implements ToolProvider { */ public String buildMissParamPrompt(UserSceneSession session, List paramRuleDataMiss) { String methodNo = session.getCurrentTool().getSMethodNo(); - - // 拼接缺失参数的描述 + // 1. 拼接缺失参数的描述(增加“参数名”和“英文名”的对应,方便模型映射) String paramDesc = paramRuleDataMiss.stream() - .map(p -> p.getSParam() + ":" + p.getSParamValue() + ",示例:" + p.getSExampleValue()) + .map(p -> String.format("- 参数名:%s (对应字段: %s),示例值:%s", + p.getSParam(), p.getSParamValue(), p.getSExampleValue())) .collect(Collectors.joining("\n")); - - // 告诉模型需要补充哪些字段 - String missingKeys = paramRuleDataMiss.stream() - .map(p -> "\"" + p.getSParamValue() + "\":\"\"") - .collect(Collectors.joining(",")); - + // 但根据你的需求,其实 prompt 里并不需要强行插入一个空的 JSON 片段, + // 直接告诉模型去“合并”即可。 return String.format(""" - 请你根据用户最新的输入补充缺失的参数,并带着所有完整参数立即发起工具调用。 + 请你根据用户最新的输入,补充缺失的参数,并带着【所有完整参数】立即发起工具调用。 - 【执行规则】 - 1. 必须调用工具:%s,绝对禁止直接输出 JSON 文本或向用户索要信息; - 2. 完整调用:请带着合并后的所有参数,直接生成 tool_calls 请求。 - - 缺失参数说明: + 【核心执行规则】 + 1. **参数合并(至关重要)**:你必须保留上一轮对话中已经获取的参数(如 sSlaveId, operateType 等),并将用户本次提供的新参数与旧参数合并。 + 2. **必须调用工具**:必须调用工具 `%s`。绝对禁止直接输出 JSON 文本,也绝对禁止向用户反问或索要信息。 + 3. **完整调用**:请直接生成包含所有参数的 tool_calls 请求。 + 【已获取数据】 %s - """, methodNo, paramDesc, missingKeys); + 【当前缺失的参数说明】 + %s + """, methodNo,JSONObject.toJSONString(session.getArgs()), paramDesc); } public String buildDynamicSystemPrompt(UserSceneSession session) { String methodNo = session.getCurrentTool().getSMethodNo(); - String rowJson = JSONUtil.toJsonStr(session.getCurrentRowData()); + String rowJson = JSONUtil.toJsonPrettyStr(session.getCurrentRowData()); return """ 【极强约束·必须执行】 @@ -1118,8 +1116,16 @@ public class DynamicToolProvider implements ToolProvider { 【输出格式】 {"name": "%s", "parameters": {"operateType": "单行确认", "sSlaveId": "取出的ID"}} + 【输出格式·严格执行】 + 你必须分两步输出: + 1. **思考步骤**:明确写出“用户要求第N行,我在JSON中找到Key为N的数据,其sSlaveId是[完整复制ID]”。 + 2. **JSON步骤**:换行后输出标准的工具调用JSON。 + + 【输出示例】 + 思考:用户要求第3行,我在JSON中找到Key为"3"的数据,其sSlaveId是17782251520001103406038478326300。 + {"name": "queryUnstockedProducts", "parameters": {"operateType": "单行确认", "sSlaveId": "17782251520001103406038478326300"}} 【警告】 - 禁止编造!必须从表格中提取! + 思考步骤中的ID必须与JSON中的ID完全一致!禁止编造!必须从表格中提取! """.formatted(rowJson, methodNo); }