| | |
| | | import com.mybatisflex.core.query.QueryWrapper; |
| | | import tech.aiflowy.ai.mapper.AiPluginMapper; |
| | | import tech.aiflowy.ai.service.AiPluginToolService; |
| | | import tech.aiflowy.common.ai.util.NestedParamConverter; |
| | | import tech.aiflowy.common.ai.util.PluginHttpClient; |
| | | import tech.aiflowy.common.ai.util.PluginParam; |
| | | import tech.aiflowy.common.ai.util.PluginParamConverter; |
| | | import tech.aiflowy.common.domain.Result; |
| | | import tech.aiflowy.common.util.SpringContextUtil; |
| | | |
| | | import java.lang.reflect.Array; |
| | | import java.math.BigInteger; |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.*; |
| | | |
| | | public class AiPluginFunction implements Function { |
| | | |
| | |
| | | params.add(pluginParam); |
| | | } |
| | | } |
| | | List<PluginParam> pluginParams = PluginParamConverter.convertFromJson(aiPluginTool.getInputData()); |
| | | Map<String, Object> nestedParams = NestedParamConverter.convertToNestedParamMap(pluginParams); |
| | | |
| | | // 准备存放不同位置的参数 |
| | | List<PluginParam> queryParams = new ArrayList<>(); |
| | | List<PluginParam> bodyParams = new ArrayList<>(); |
| | | List<PluginParam> headerParams = new ArrayList<>(); |
| | | List<PluginParam> pathParams = new ArrayList<>(); |
| | | |
| | | List<Map<String, Object>> dataList = getDataList(aiPluginTool.getInputData()); |
| | | // 遍历嵌套参数 |
| | | for (Map.Entry<String, Object> entry : nestedParams.entrySet()) { |
| | | String paramName = entry.getKey(); |
| | | |
| | | // 遍历插件工具定义的参数列表 |
| | | for (Map<String, Object> paramDef : dataList) { |
| | | String paramName = (String) paramDef.get("name"); |
| | | // 获取原始参数定义 |
| | | PluginParam originalParam = findOriginalParam(pluginParams, paramName); |
| | | if (originalParam == null || !originalParam.isEnabled()) { |
| | | continue; |
| | | } |
| | | |
| | | // 检查大模型返回的参数中是否包含当前参数 |
| | | // 创建参数副本以避免修改原始定义 |
| | | PluginParam requestParam = new PluginParam(); |
| | | requestParam.setName(originalParam.getName()); |
| | | requestParam.setDescription(originalParam.getDescription()); |
| | | requestParam.setRequired(originalParam.isRequired()); |
| | | requestParam.setType(originalParam.getType()); |
| | | requestParam.setEnabled(originalParam.isEnabled()); |
| | | requestParam.setMethod(originalParam.getMethod()); |
| | | |
| | | // 优先级: argsMap值 < 参数默认值 |
| | | if (argsMap != null && argsMap.containsKey(paramName)) { |
| | | PluginParam pluginParam = new PluginParam(); |
| | | pluginParam.setName(paramName); |
| | | pluginParam.setDescription((String) paramDef.get("description")); |
| | | pluginParam.setRequired((boolean) paramDef.get("required")); |
| | | pluginParam.setType((String) paramDef.get("type")); |
| | | pluginParam.setMethod((String) paramDef.get("method")); |
| | | pluginParam.setEnabled((boolean) paramDef.get("enabled")); |
| | | // 使用大模型返回的值,而不是默认值 |
| | | pluginParam.setDefaultValue(argsMap.get(paramName)); |
| | | // 1. 优先检查是否有有效的默认值 |
| | | if (hasValidDefaultValue(originalParam.getDefaultValue())) { |
| | | // 使用默认值 |
| | | requestParam.setDefaultValue(originalParam.getDefaultValue()); |
| | | } else { |
| | | // 使用大模型返回的值 |
| | | requestParam.setDefaultValue(argsMap.get(paramName)); |
| | | } |
| | | } else if (hasValidDefaultValue(originalParam.getDefaultValue())) { |
| | | // 2. 没有传参但默认值有效时使用默认值 |
| | | requestParam.setDefaultValue(originalParam.getDefaultValue()); |
| | | } |
| | | // 3. 其他情况(无传参且无有效默认值)保持null |
| | | |
| | | params.add(pluginParam); |
| | | } else if ((boolean) paramDef.get("required")) { |
| | | // 如果是必填参数但大模型没有返回,使用默认值或抛出异常 |
| | | PluginParam pluginParam = new PluginParam(); |
| | | pluginParam.setName(paramName); |
| | | pluginParam.setDescription((String) paramDef.get("description")); |
| | | pluginParam.setRequired(true); |
| | | pluginParam.setMethod((String) paramDef.get("method")); |
| | | pluginParam.setEnabled((boolean) paramDef.get("enabled")); |
| | | pluginParam.setType((String) paramDef.get("type")); |
| | | pluginParam.setDefaultValue(paramDef.get("defaultValue")); |
| | | params.add(pluginParam); |
| | | // 根据method分类参数 |
| | | switch (originalParam.getMethod().toLowerCase()) { |
| | | case "query": |
| | | queryParams.add(requestParam); |
| | | break; |
| | | case "body": |
| | | bodyParams.add(requestParam); |
| | | break; |
| | | case "header": |
| | | headerParams.add(requestParam); |
| | | break; |
| | | case "path": |
| | | pathParams.add(requestParam); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | JSONObject result = PluginHttpClient.sendRequest(url, method, headersMap, params); |
| | | // 合并所有参数 |
| | | List<PluginParam> allParams = new ArrayList<>(); |
| | | allParams.addAll(pathParams); |
| | | allParams.addAll(queryParams); |
| | | allParams.addAll(bodyParams); |
| | | allParams.addAll(headerParams); |
| | | allParams.addAll(params); |
| | | |
| | | // 发送请求 |
| | | JSONObject result = PluginHttpClient.sendRequest(url, method, headersMap, allParams); |
| | | return result; |
| | | } |
| | | |
| | | // 辅助方法:根据参数名查找原始参数定义 |
| | | private PluginParam findOriginalParam(List<PluginParam> params, String name) { |
| | | for (PluginParam param : params) { |
| | | if (name.equals(param.getName())) { |
| | | return param; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | // 添加辅助方法判断默认值是否有效 |
| | | private boolean hasValidDefaultValue(Object defaultValue) { |
| | | if (defaultValue == null) { |
| | | return false; |
| | | } |
| | | |
| | | // 字符串类型检查 |
| | | if (defaultValue instanceof CharSequence) { |
| | | return !((CharSequence) defaultValue).toString().trim().isEmpty(); |
| | | } |
| | | |
| | | // 集合/数组类型检查 |
| | | if (defaultValue instanceof Collection) { |
| | | return !((Collection<?>) defaultValue).isEmpty(); |
| | | } |
| | | if (defaultValue instanceof Map) { |
| | | return !((Map<?, ?>) defaultValue).isEmpty(); |
| | | } |
| | | if (defaultValue.getClass().isArray()) { |
| | | return Array.getLength(defaultValue) > 0; |
| | | } |
| | | |
| | | // 其他类型直接认为有效 |
| | | return true; |
| | | } |
| | | |
| | | private void processParamWithChildren(Map<String, Object> paramDef, Map<String, Object> argsMap, List<PluginParam> params) { |
| | | boolean enabled = (boolean) paramDef.get("enabled"); |
| | | if (!enabled){ |
| | | return; |
| | | } |
| | | String paramName = (String) paramDef.get("name"); |
| | | PluginParam pluginParam = new PluginParam(); |
| | | pluginParam.setName(paramName); |
| | | pluginParam.setDescription((String) paramDef.get("description")); |
| | | pluginParam.setRequired((boolean) paramDef.get("required")); |
| | | pluginParam.setType((String) paramDef.get("type")); |
| | | pluginParam.setEnabled((boolean) paramDef.get("enabled")); |
| | | pluginParam.setMethod((String) paramDef.get("method")); |
| | | |
| | | // 如果用户传了值,就用用户的值;否则用默认值 |
| | | if (paramDef.get("defaultValue") != null && !"".equals(paramDef.get("defaultValue"))) { |
| | | pluginParam.setDefaultValue(paramDef.get("defaultValue")); |
| | | } else if (argsMap != null && paramDef.get("name").equals(paramName) && paramDef.get("defaultValue") != null) { |
| | | pluginParam.setDefaultValue(argsMap.get(paramName)); |
| | | } |
| | | |
| | | params.add(pluginParam); |
| | | |
| | | // 处理 children |
| | | List<Map<String, Object>> children = (List<Map<String, Object>>) paramDef.get("children"); |
| | | if (children != null) { |
| | | for (Map<String, Object> child : children) { |
| | | processParamWithChildren(child, argsMap, params); |
| | | } |
| | | } |
| | | } |
| | | } |