Bläddra i källkod

小程序新版模型生成图

zoujiajian 1 år sedan
förälder
incheckning
54fe06dba9

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/request/MiniAiPicturesReq.java

@@ -44,4 +44,9 @@ public class MiniAiPicturesReq {
 	 * 默认普通1  2.垫图风格
 	 */
 	private Integer type = 1;
+
+	/**
+	 * 模型 默认新版模型
+	 */
+	private int model = 0;
 }

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/response/MiniPopularizeResp.java

@@ -19,4 +19,6 @@ public class MiniPopularizeResp {
 	private String conversationId;
 
 	private Long chatId;
+
+	private String url;
 }

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/mini/MiniPopularizeFrontService.java

@@ -15,7 +15,7 @@ import java.io.IOException;
  * 创建时间:2025/4/8 16:51
  */
 public interface MiniPopularizeFrontService {
-	MiniPopularizeResp createPictures(MiniAiPicturesReq miniAiPicturesReq) throws IOException;
+	MiniPopularizeResp createPictures(MiniAiPicturesReq miniAiPicturesReq) throws Exception;
 
 	MiniPopularizeUser getUser(long userId);
 

+ 89 - 34
netflix-service/src/main/java/com/cyksj/service/mini/impl/MiniPopularizeFrontServiceImpl.java

@@ -5,11 +5,13 @@ import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.ContentType;
 import cn.hutool.http.Header;
+import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.SignatureUtils;
 import com.cyksj.common.util.StringUtil;
 import com.cyksj.mapper.mini.*;
@@ -24,20 +26,17 @@ import com.cyksj.service.mini.MiniPopularizeFrontService;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import okhttp3.MediaType;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.RequestBody;
+import okhttp3.*;
 import okhttp3.sse.EventSource;
 import okhttp3.sse.EventSources;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.math.BigDecimal;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -53,6 +52,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
 public class MiniPopularizeFrontServiceImpl implements MiniPopularizeFrontService {
 	public static final String GPT_URL = "https://api.nf.video/v1/chat/completions";
 
+	public static final String NEW_MODEL_GPT_URL = "https://api.nf.video/v1/images/generations";
+
 	public static final String GPT_DRAW_TOKEN = "sk-Tsxxyfly6RCuyJ6hq6iNdPkSD1SzUxQX3mgO0ItF1AaLWacR";
 
 	public static final String SIGN_SECRET = "6mR7XvKbPeShVmYq3t5w9z$C&FH@McQ";
@@ -80,7 +81,7 @@ public class MiniPopularizeFrontServiceImpl implements MiniPopularizeFrontServic
 
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
-	public MiniPopularizeResp createPictures(MiniAiPicturesReq miniAiPicturesReq) throws IOException {
+	public MiniPopularizeResp createPictures(MiniAiPicturesReq miniAiPicturesReq) throws Exception {
 		String conversationId = miniAiPicturesReq.getConversationId();
 		AtomicBoolean recoverNum = new AtomicBoolean(true);
 		Long userId = miniAiPicturesReq.getUserId();
@@ -100,7 +101,7 @@ public class MiniPopularizeFrontServiceImpl implements MiniPopularizeFrontServic
 				miniAiPicturesReq.setTips(miniPopularizeConfig.getTips());
 			}
 		}
-
+		int model = miniAiPicturesReq.getModel();
 		//聊天记录
 		MiniPopularizeUserConversationChat chat = MiniPopularizeUserConversationChat.builder()
 				.conversationId(conversationId)
@@ -112,17 +113,6 @@ public class MiniPopularizeFrontServiceImpl implements MiniPopularizeFrontServic
 				.userId(userId)
 				.build();
 		conversationChatMapper.insert(chat);
-//		if (StrUtil.isNotBlank(miniAiPicturesReq.getImg())) {
-//			//聊天记录
-//			MiniPopularizeUserConversationChat imag = MiniPopularizeUserConversationChat.builder()
-//					.conversationId(conversationId)
-//					.img(miniAiPicturesReq.getImg())
-//					.type(MiniPopularizeUserConversationChat.Type.image)
-//					.role(MiniPopularizeUserConversationChat.Role.user)
-//					.userId(userId)
-//					.build();
-//			conversationChatMapper.insert(imag);
-//		}
 		//图像生成记录
 		MiniPopularizeUserConversationChat imageRecord = MiniPopularizeUserConversationChat.builder()
 				.userId(miniAiPicturesReq.getUserId())
@@ -131,22 +121,33 @@ public class MiniPopularizeFrontServiceImpl implements MiniPopularizeFrontServic
 				.type(MiniPopularizeUserConversationChat.Type.image)
 				.status(MiniPopularizeUserConversationChat.Status.processing)
 				.build();
-
 		miniPopularizeCommonService.saveImgRecord(imageRecord);
-		ConsoleStreamListener listener = ConsoleStreamListener.builder()
-				.userId(userId)
-				.miniPopularizeCommonService(miniPopularizeCommonService)
-				.conversationId(conversationId)
-				.imgRecordId(imageRecord.getId())
-				.recoverNum(recoverNum.get())
-				.build();
-		streamChatCompletion(miniAiPicturesReq, listener);
+		//新版模型
+		if (model == 0) {
+			String url = newGptModelCreateImage(miniAiPicturesReq);
+			imageRecord.setStatus(MiniPopularizeUserConversationChat.Status.success);
+			imageRecord.setImg(url);
+			conversationChatMapper.updateById(imageRecord);
 
-		MiniPopularizeResp resp = MiniPopularizeResp.builder()
-				.conversationId(conversationId)
-				.chatId(imageRecord.getId())
-				.build();
-		return resp;
+			MiniPopularizeResp resp = MiniPopularizeResp.builder()
+					.url(url)
+					.build();
+			return resp;
+		} else {
+			ConsoleStreamListener listener = ConsoleStreamListener.builder()
+					.userId(userId)
+					.miniPopularizeCommonService(miniPopularizeCommonService)
+					.conversationId(conversationId)
+					.imgRecordId(imageRecord.getId())
+					.recoverNum(recoverNum.get())
+					.build();
+			streamChatCompletion(miniAiPicturesReq, listener);
+			MiniPopularizeResp resp = MiniPopularizeResp.builder()
+					.conversationId(conversationId)
+					.chatId(imageRecord.getId())
+					.build();
+			return resp;
+		}
 	}
 
 	@Override
@@ -361,4 +362,58 @@ public class MiniPopularizeFrontServiceImpl implements MiniPopularizeFrontServic
 		}
 	}
 
+	private String newGptModelCreateImage(MiniAiPicturesReq miniAiPicturesReq) throws Exception {
+		String tips = miniAiPicturesReq.getTips();
+		Integer type = miniAiPicturesReq.getType();
+		JSONObject json = new JSONObject();
+		json.putOpt("model", "gpt-image-1");
+		if (type == 1) {
+			json.putOpt("n", 1);
+			json.putOpt("size", "1024x1024");
+		} else {
+			String img = miniAiPicturesReq.getImg();
+			JSONArray imgs = JSONUtil.parseArray(img);
+			//垫图
+			imgs.forEach(mg -> json.putOpt("image[]", mg));
+		}
+		json.putOpt("prompt", tips);
+		ObjectMapper mapper = new ObjectMapper();
+		String requestBody = mapper.writeValueAsString(json);
+		Request request = new Request.Builder()
+				.url(NEW_MODEL_GPT_URL)
+				.post(RequestBody.create(MediaType.parse(ContentType.JSON.getValue()),
+						requestBody))
+				.header(Header.AUTHORIZATION.name(), GPT_DRAW_TOKEN)
+				.build();
+		OkHttpClient client = new OkHttpClient.Builder()
+				// 设置连接超时,单位:秒
+				.connectTimeout(300, TimeUnit.SECONDS)
+				// 设置读取超时,单位:秒
+				.readTimeout(120, TimeUnit.SECONDS)
+				.build();
+		Response execute = client.newCall(request).execute();
+		ResponseBody body = execute.body();
+		JSONObject jsonObject = Jsons.parseObject(body.bytes(), JSONObject.class);
+		Object data = jsonObject.getJSONArray("data").get(0);
+		JSONObject b64Json = Jsons.parseObject(data, JSONObject.class);
+		String base64Image = b64Json.getStr("b64_json");
+		// 解码 Base64 字符串
+		byte[] imageBytes = Base64.getDecoder().decode(base64Image);
+		String fileName = new StringBuilder().append("mgpt").append(RandomUtil.randomString(9)).append(".png").toString();
+		// 保存为图片文件
+		try (FileOutputStream fos = new FileOutputStream(fileName)) {
+			fos.write(imageBytes);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		File file = new File(fileName);
+		Map<String, Object> paramMap = new HashMap<>();
+		paramMap.put("file", file);
+		JSONObject result = JSONUtil.parseObj(HttpUtil.post("https://files.liuliangbang.vip/pic/ups", paramMap));
+		String imgUrl = result.getJSONObject("value").getJSONArray("saved").getJSONObject(0).getJSONObject("info").getStr("cdnUrl");
+		if (file.exists()) {
+			file.delete();
+		}
+		return imgUrl;
+	}
 }