lyhzzz 5 meses atrás
pai
commit
7d12045f89

+ 6 - 12
README.md

@@ -52,16 +52,10 @@ fd_fusion_xj-init.sql
 ~~~~
 
 
-###**xj-1.0.0**
+###**1.7.0**
 ~~~~
-1.设置支持上传自定义图片
-2.案件设置地图链接,接口添加参数 mapUrl和latAndLong
-3.添加场景复制,模型复制,场景下载hash,模型下载hash
-4.添加系统设置管理
-5.添加勘验笔录管理
-6.照片制卷管理
-7.修改密码接口修改,去掉code参数,增加oldPassword参数
-8.新增接口,重置密码
-9.固件管理
-10.APP管理
-~~~~
+fusion:
+  ai-url: http://192.168.9.61:30000/v1/
+~~~~
+
+

+ 8 - 0
pom.xml

@@ -192,6 +192,14 @@
             <version>4.3.1</version>
         </dependency>
 
+        <!-- https://mvnrepository.com/artifact/org.springframework.ai/spring-ai-openai -->
+
+        <dependency>
+            <groupId>io.github.lambdua</groupId>
+            <artifactId>service</artifactId>
+            <version>0.22.92</version>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 2 - 0
src/main/java/com/fdkankan/fusion/common/ResultCode.java

@@ -79,6 +79,8 @@ public enum ResultCode {
     AUTH_ERROR(8029, "授权访问失败"),
     DEL_NUM_ERROR(8030, "无法移除,场景已加入多元融合,请进入多元融合删除场景后再试"),
 
+    AI_ERROR(8031, "调用ai出错"),
+
     ;
 
 

+ 71 - 0
src/main/java/com/fdkankan/fusion/common/util/Openai.java

@@ -0,0 +1,71 @@
+package com.fdkankan.fusion.common.util;
+
+import com.theokanning.openai.completion.chat.ChatCompletionChoice;
+import com.theokanning.openai.completion.chat.ChatCompletionRequest;
+import com.theokanning.openai.completion.chat.ChatMessage;
+import com.theokanning.openai.completion.chat.UserMessage;
+import com.theokanning.openai.service.OpenAiService;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.IOException;
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Xiewj
+ * @date 2024/10/11
+ */
+public class Openai {
+    public static void main(String[] args) throws IOException {
+       // gptVision("https://4dkankan.oss-cn-shenzhen.aliyuncs.com/images/imagesg5LNCydH6k/pan/high/7c84b1610aec4ee6095f1fa76ad6236c.png","http://192.168.9.61:30000/v1/");
+        gptVision("https://4dkankan.oss-cn-shenzhen.aliyuncs.com/images/imagesg5LNCydH6k/pan/high/7c84b1610aec4ee6095f1fa76ad6236c.png","http://192.168.9.61:30000/v1/",null);
+
+    }
+
+   public static String gptVision(String imgPath,String httpUrl,String text) throws IOException {
+        OpenAiService openAiService1 = new OpenAiService("", Duration.ofSeconds(120), httpUrl);
+        final List<ChatMessage> messages = new ArrayList<>();
+        if(StringUtils.isBlank(text)){
+            text = "任务指令:根据提供的户型图,识别并描述其结构及房间详情。请按照上北、下南、左西、右东的方向进行定位。\n" +
+                    "\n" +
+                    "输出格式要求:\n" +
+                    "不能使用Markdown(MD)格式。\n" +
+                    "结构清晰,易于理解。\n" +
+                    "请遵循以下具体步骤:\n" +
+                    "\n" +
+                    "整体描述:\n" +
+                    "1. 概述:首先给出整个户型的结构概述,简要描述户型。对于无法明确识别房间名的房间,可以采用代码形式表示。\n" +
+                    "\n" +
+                    "详细描述:\n" +
+                    "1. 单个房间描述:接下来,针对每个房间单独一段进行描述。每段开头以房间名称开始,接着说明该房间位于图片的相对位置,以及房间内可见的具体家具数量和类型。注意,仅需描述实际识别到的家具,不要使用诸如“等”这样的词汇来泛指其他可能存在的物品。\n" +
+                    "\n" +
+                    "示例模板:\n" +
+                    "整体描述:“这是一个${房间数}室${客厅数}厅${卫生间数}卫的户型。”\n" +
+                    "房间描述:“${房间名称}:位于户型图${坐标方位}${房间名}通过${连接方式}与${房间名}相连,放置了${家具数量}个${家具类型}家具...”\n" +
+                    "\n" +
+                    "注意事项:\n" +
+                    "确保输出的整体描述数据和房间数量对应上,室排除厨房数量。\n" +
+                    "确保所有信息基于提供的户型图准确无误地提取。\n" +
+                    "描述时保持语言简洁明了,直接传达关键信息。\n" +
+                    "\n" +
+                    "请确保您的描述符合上述要求,并尽可能提供详尽的信息。";
+        }
+        UserMessage imageMessage = UserMessage.builder().buildImageMessage(text, imgPath);
+
+
+        messages.add(imageMessage);
+        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
+                .model("Qwen2-VL-7B")
+                //.model("qwen2-vl-instruct")
+                .messages(messages)
+                .temperature(0.06)
+                .topP(0.75)
+                .maxTokens(1024)
+                .n(1)
+                .build();
+        ChatCompletionChoice choice = openAiService1.createChatCompletion(chatCompletionRequest).getChoices().get(0);
+        return choice.getMessage().getContent();
+    }
+
+}

+ 15 - 0
src/main/java/com/fdkankan/fusion/config/FusionConfig.java

@@ -0,0 +1,15 @@
+package com.fdkankan.fusion.config;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@RefreshScope
+@Data
+public class FusionConfig {
+
+    @Value("${fusion.ai-url}")
+    private String aiUrl;
+}

+ 49 - 0
src/main/java/com/fdkankan/fusion/controller/AiController.java

@@ -0,0 +1,49 @@
+package com.fdkankan.fusion.controller;
+
+
+import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.common.util.Openai;
+import com.fdkankan.fusion.common.util.UploadToOssUtil;
+import com.fdkankan.fusion.config.FusionConfig;
+import com.fdkankan.fusion.entity.CaseInquestInfo;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.request.AiParam;
+import com.fdkankan.fusion.service.ICaseInquestInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-12-10
+ */
+@RestController
+@RequestMapping("/ai")
+@Slf4j
+public class AiController {
+
+    @Autowired
+    FusionConfig fusionConfig;
+
+    @PostMapping("/getByImage")
+    public ResultData getByImage(@RequestBody AiParam param){
+        if(StringUtils.isBlank(param.getImageUrl())){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        try {
+            return ResultData.ok(Openai.gptVision(param.getImageUrl(),fusionConfig.getAiUrl(),null));
+        } catch (Exception e) {
+            log.info("Openai-error:{}",e);
+            throw new BusinessException(ResultCode.AI_ERROR);
+        }
+    }
+}
+

+ 2 - 0
src/main/java/com/fdkankan/fusion/controller/CaseInquestInfoController.java

@@ -2,9 +2,11 @@ package com.fdkankan.fusion.controller;
 
 
 import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.config.FusionConfig;
 import com.fdkankan.fusion.entity.CaseInquestCriminal;
 import com.fdkankan.fusion.entity.CaseInquestInfo;
 import com.fdkankan.fusion.service.ICaseInquestInfoService;
+import com.theokanning.openai.client.OpenAiApi;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 

+ 9 - 0
src/main/java/com/fdkankan/fusion/request/AiParam.java

@@ -0,0 +1,9 @@
+package com.fdkankan.fusion.request;
+
+import lombok.Data;
+
+@Data
+public class AiParam {
+
+    private String imageUrl;
+}