| | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.alibaba.fastjson.serializer.SerializeConfig; |
| | | import com.fasterxml.jackson.databind.ObjectMapper; |
| | | import com.google.gson.Gson; |
| | | import com.google.gson.GsonBuilder; |
| | | import com.google.gson.JsonObject; |
| | | import com.mybatisflex.core.query.QueryWrapper; |
| | | import com.mybatisflex.core.table.TableInfo; |
| | | import com.mybatisflex.core.table.TableInfoFactory; |
| | |
| | | import org.springframework.web.context.request.ServletRequestAttributes; |
| | | import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; |
| | | import tech.aiflowy.ai.config.DifyStreamClient; |
| | | import tech.aiflowy.ai.config.FileReference; |
| | | import tech.aiflowy.ai.entity.*; |
| | | import tech.aiflowy.ai.mapper.AiBotConversationMessageMapper; |
| | | import tech.aiflowy.ai.service.*; |
| | |
| | | @JsonBody(value = "botId", required = true) BigInteger botId, |
| | | @JsonBody(value = "sessionId", required = true) String sessionId, |
| | | @JsonBody(value = "isExternalMsg") int isExternalMsg, |
| | | @JsonBody(value = "file") String file, |
| | | HttpServletResponse response) { |
| | | response.setContentType("text/event-stream"); |
| | | AiBot aiBot = service.getById(botId); |
| | |
| | | } |
| | | Map<String, Object> llmOptions = aiBot.getLlmOptions(); |
| | | String systemPrompt = llmOptions != null ? (String) llmOptions.get("systemPrompt") : null; |
| | | |
| | | if (StringUtil.hasText(aiBot.getModelAPI())){ |
| | | if (aiBot.getBotTypeId() == 2) { |
| | | |
| | | String apiUrl = aiBot.getModelAPI()+"/workflows/run"; // 替换为实际API URL |
| | | String apiKey = aiBot.getModelKEY(); // 替换为实际API Key |
| | | |
| | | DifyStreamClient client = new DifyStreamClient(apiUrl, apiKey, aiBotMessageService); |
| | | DifyStreamClient uploadClient = new DifyStreamClient(aiBot.getModelAPI()+"/files/upload", apiKey, aiBotMessageService); |
| | | String test = uploadClient.fileUpload(SaTokenUtil.getLoginAccount().getId() + "", file); |
| | | System.out.println(test); |
| | | Gson gson = new GsonBuilder().setPrettyPrinting().create(); |
| | | JsonObject fileJson = gson.fromJson(test, JsonObject.class); |
| | | String fileId = fileJson.get("id").getAsString(); |
| | | |
| | | // 2. 构建文件参数对象 |
| | | Map<String, Object> fileParam = new HashMap<>(); |
| | | fileParam.put("transfer_method", "local_file"); |
| | | fileParam.put("upload_file_id", fileId); |
| | | String[] split = file.split("\\."); |
| | | // fileParam.put("type", fileJson.get("extension").getAsString()); // 例如 "excel"、"pdf" 等 |
| | | fileParam.put("type", "document"); // 例如 "excel"、"pdf" 等 |
| | | |
| | | // 3. 组装 inputs 参数 |
| | | Map<String, Object> inputs = new HashMap<>(); |
| | | inputs.put("w", fileParam); // 添加文件参数,variableName 如 "document" |
| | | |
| | | |
| | | |
| | | AiBotMessageMemory memory = new AiBotMessageMemory(botId, SaTokenUtil.getLoginAccount().getId(), |
| | | sessionId, isExternalMsg, aiBotMessageService, aiBotConversationMessageMapper, |
| | | aiBotConversationMessageService); |
| | | |
| | | final HistoriesPrompt historiesPrompt = new HistoriesPrompt(); |
| | | if (systemPrompt != null) { |
| | | historiesPrompt.setSystemMessage(SystemMessage.of(systemPrompt)); |
| | | } |
| | | |
| | | historiesPrompt.setMemory(memory); |
| | | |
| | | HumanMessage humanMessage = new HumanMessage(prompt); |
| | | |
| | | // 添加插件相关的function calling |
| | | appendPluginToolFunction(botId, humanMessage); |
| | | |
| | | //添加工作流相关的 Function Calling |
| | | appendWorkflowFunctions(botId, humanMessage); |
| | | |
| | | //添加知识库相关的 Function Calling |
| | | appendKnowledgeFunctions(botId, humanMessage); |
| | | |
| | | historiesPrompt.addMessage(humanMessage); |
| | | |
| | | |
| | | final Boolean[] needClose = {true}; |
| | | |
| | | ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); |
| | | |
| | | |
| | | MySseEmitter emitter = new MySseEmitter(1000L * 60 * 2); // 2分钟超时 |
| | | |
| | | try { |
| | | String userId = SaTokenUtil.getLoginAccount().getId() + ""; |
| | | client.runWorkflow(inputs, prompt, userId, emitter, sessionId, botId); |
| | | } catch (Exception e) { |
| | | emitter.completeWithError(e); |
| | | } |
| | | // System.out.println(emitter.toString()); |
| | | |
| | | return emitter; |
| | | } |
| | | aiBot.setModelAPI(aiBot.getModelAPI()+"/chat-messages"); |
| | | String apiUrl = aiBot.getModelAPI(); // 替换为实际API URL |
| | | String apiKey = aiBot.getModelKEY(); // 替换为实际API Key |
| | | |
| | |
| | | |
| | | } |
| | | |
| | | @PostMapping("files/upload") |
| | | public Result filesUpload(@JsonBody(value = "botId", required = true) BigInteger botId, |
| | | String file, |
| | | HttpServletResponse response){ |
| | | try{ |
| | | String userId = SaTokenUtil.getLoginAccount().getId() + ""; |
| | | response.setContentType("text/event-stream"); |
| | | AiBot aiBot = service.getById(botId); |
| | | aiBot.setModelAPI(aiBot.getModelAPI()+"/files/upload"); |
| | | String apiUrl = aiBot.getModelAPI(); // 替换为实际API URL |
| | | String apiKey = aiBot.getModelKEY(); // 替换为实际API Key |
| | | DifyStreamClient client = new DifyStreamClient(apiUrl, apiKey, aiBotMessageService); |
| | | client.fileUpload(userId,file); |
| | | return Result.success("成功!"); |
| | | }catch (Exception e){ |
| | | return Result.fail(400, String.valueOf(e)); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | public Result save(@RequestBody String jsonStr) { |
| | | // 解析JSON |
| | | JSONObject json = JSONObject.parseObject(jsonStr); |