From ea01b3826baf3dc3f5fc63d110364a15cd0176e4 Mon Sep 17 00:00:00 2001 From: stream Date: Wed, 18 Mar 2026 17:22:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=8E=B7=E5=8F=96=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=90=8D=E7=A7=B0=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-dev.yml | 1 + .../com/cmvr/llm/config/APIProperties.java | 2 + .../java/com/cmvr/test/enums/ActionEnum.java | 1 + .../llm/LLMCurrentPageOperateService.java | 88 +++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/llm/LLMCurrentPageOperateService.java diff --git a/cmvr-iot-admin/src/main/resources/application-dev.yml b/cmvr-iot-admin/src/main/resources/application-dev.yml index 5b987bd..6ffa547 100644 --- a/cmvr-iot-admin/src/main/resources/application-dev.yml +++ b/cmvr-iot-admin/src/main/resources/application-dev.yml @@ -124,6 +124,7 @@ api: app-id: d1ebtabnjkflk4gmhikg app-key: d5thge2cktmipk78h82g evaluation: http://192.168.0.8:8000/analyze + current-page: http://192.168.0.222:5000/search_similar flowise: tts: 192.168.0.222:8080/tts/ diff --git a/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/config/APIProperties.java b/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/config/APIProperties.java index a200e09..c20a1ac 100644 --- a/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/config/APIProperties.java +++ b/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/config/APIProperties.java @@ -43,6 +43,8 @@ public class APIProperties { private String evaluation; + private String currentPage; + /** * 根据 ActionEnum 名称获取 app 配置 */ diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/enums/ActionEnum.java b/cmvr-iot-test/src/main/java/com/cmvr/test/enums/ActionEnum.java index e06f6bc..a888df8 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/enums/ActionEnum.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/enums/ActionEnum.java @@ -70,6 +70,7 @@ public enum ActionEnum { GENERATE_ADVANCED_AUDIO("LLM", "GENERATE_ADVANCED_AUDIO", "tts语音合成"), AI_AGENT_PLATFORM("LLM", "AI_AGENT_PLATFORM", "商道智能体"), AI_TTS("LLM", "AI_TTS", "tts语音播放"), + GET_CURRENT_PAGE("LLM", "GET_CURRENT_PAGE", "获取当前页面名称"), // 触控交互 TI_PATH_SEARCH("EDGE", "TI_PATH_SEARCH", "路径搜索"), diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/llm/LLMCurrentPageOperateService.java b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/llm/LLMCurrentPageOperateService.java new file mode 100644 index 0000000..b87f78c --- /dev/null +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/llm/LLMCurrentPageOperateService.java @@ -0,0 +1,88 @@ +package com.cmvr.test.flow.runtime.operator.llm; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.cmvr.common.utils.http.CallAPIUtil; +import com.cmvr.llm.config.APIProperties; +import com.cmvr.test.enums.ActionEnum; +import com.cmvr.test.flow.runtime.message.TaskNodeExecuteMessage; +import com.cmvr.test.flow.runtime.message.TaskNodeExecuteResult; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.io.File; + +@Slf4j +@Service +@RequiredArgsConstructor +public class LLMCurrentPageOperateService implements LLMOperateService { + + private final APIProperties apiProperties; + + @Override + public boolean supports(ActionEnum action) { + return action.name().equals("GET_CURRENT_PAGE"); + } + + @Override + public TaskNodeExecuteResult execute(TaskNodeExecuteMessage message) { + JSONObject inputParams = message.getInputParams(); + + String fileUrl = inputParams.getString("url"); // 原图片地址 + String targetUrl = apiProperties.getCurrentPage(); // 目标接口地址 + + File tempFile = null; + try { + // 1. 截取文件名 + String fileName = getFileNameFromUrl(fileUrl); + + // 2. 创建临时文件 + tempFile = File.createTempFile("upload_", "_" + fileName); + + // 3. 下载远程文件到本地临时文件 + HttpUtil.downloadFile(fileUrl, tempFile); + + // 4. 调用上传接口 + String resp = CallAPIUtil.doPostFile(targetUrl, null, "file", tempFile, null); + + JSONObject jsonObject = JSON.parseObject(resp); + JSONArray results = jsonObject.getJSONArray("results"); + + String pageName = null; + for (Object result : results) { + JSONObject resultJson = (JSONObject) result; + if (resultJson.getInteger("rank") == 1) { + String filename = resultJson.getString("filename"); + pageName = filename.substring(0, filename.lastIndexOf(".")); + } + } + + JSONObject output = new JSONObject(); + output.put("pageName", pageName); + + return TaskNodeExecuteResult.success(output); + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + if (tempFile != null && tempFile.exists()) { + FileUtil.del(tempFile); + } + } + } + + /** + * 从 URL 中截取最后的文件名 + */ + private String getFileNameFromUrl(String url) { + String cleanUrl = url; + int qIndex = cleanUrl.indexOf("?"); + if (qIndex > -1) { + cleanUrl = cleanUrl.substring(0, qIndex); + } + return cleanUrl.substring(cleanUrl.lastIndexOf("/") + 1); + } +} \ No newline at end of file