|
|
@@ -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;
|
|
|
+ }
|
|
|
}
|