main
HuangHai 2 months ago
parent 1fc1588b12
commit b2af724e01

@ -2,6 +2,7 @@ package com.dsideal.aiSupport.Util.Liblib.Kit;
import java.security.InvalidKeyException; import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.concurrent.TimeUnit;
import javax.crypto.Mac; import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
@ -9,24 +10,26 @@ import javax.crypto.spec.SecretKeySpec;
import com.dsideal.aiSupport.Plugin.YamlProp; import com.dsideal.aiSupport.Plugin.YamlProp;
import com.jfinal.kit.Prop; import com.jfinal.kit.Prop;
import lombok.Getter; import lombok.Getter;
import okhttp3.OkHttpClient;
import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomStringUtils;
import static com.dsideal.aiSupport.AiSupportApplication.getEnvPrefix; import static com.dsideal.aiSupport.AiSupportApplication.getEnvPrefix;
public class SignUtil { public class LibLibUtil {
// API基础URL
protected static final String API_BASE_URL = "https://openapi.liblibai.cloud";
// API访问凭证 // API访问凭证
protected static final String ak; // Access Key protected static final String accessKey; // Access Key
protected static final String sk; // Secret Key protected static final String secretKey; // Secret Key
public static Prop PropKit; // 配置文件工具 public static Prop PropKit; // 配置文件工具
static { static {
//加载配置文件 //加载配置文件
String configFile = "application_{?}.yaml".replace("{?}", getEnvPrefix()); String configFile = "application_{?}.yaml".replace("{?}", getEnvPrefix());
PropKit = new YamlProp(configFile); PropKit = new YamlProp(configFile);
ak = PropKit.get("LIBLIB.accessKey"); // 从配置文件获取Access Key accessKey = PropKit.get("LIBLIB.accessKey"); // 从配置文件获取Access Key
sk = PropKit.get("LIBLIB.secretKey"); // 从配置文件获取Secret Key secretKey = PropKit.get("LIBLIB.secretKey"); // 从配置文件获取Secret Key
} }
/** /**
@ -45,13 +48,23 @@ public class SignUtil {
} }
} }
/**
* OkHttpClient
* @return OkHttpClient
*/
protected static OkHttpClient createHttpClient() {
return new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build();
}
/** /**
* *
* @param uri APIuri * @param uri APIuri
* @return * @return
*/ */
public static SignatureInfo makeSignInfo(String uri) { public static SignatureInfo sign(String uri) {
// 当前毫秒时间戳 // 当前毫秒时间戳
long timestamp = System.currentTimeMillis(); long timestamp = System.currentTimeMillis();
// 随机字符串 // 随机字符串
@ -60,7 +73,7 @@ public class SignUtil {
String content = uri + "&" + timestamp + "&" + signatureNonce; String content = uri + "&" + timestamp + "&" + signatureNonce;
try { try {
// 生成签名 // 生成签名
SecretKeySpec secret = new SecretKeySpec(sk.getBytes(), "HmacSHA1"); SecretKeySpec secret = new SecretKeySpec(secretKey.getBytes(), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1"); Mac mac = Mac.getInstance("HmacSHA1");
mac.init(secret); mac.init(secret);
String signature = Base64.encodeBase64URLSafeString(mac.doFinal(content.getBytes())); String signature = Base64.encodeBase64URLSafeString(mac.doFinal(content.getBytes()));

@ -4,7 +4,7 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.dsideal.aiSupport.Plugin.YamlProp; import com.dsideal.aiSupport.Plugin.YamlProp;
import com.dsideal.aiSupport.Util.Liblib.Kit.SignUtil; import com.dsideal.aiSupport.Util.Liblib.Kit.LibLibUtil;
import com.jfinal.kit.Prop; import com.jfinal.kit.Prop;
import okhttp3.*; import okhttp3.*;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -15,79 +15,39 @@ import java.util.concurrent.TimeUnit;
import static com.dsideal.aiSupport.AiSupportApplication.getEnvPrefix; import static com.dsideal.aiSupport.AiSupportApplication.getEnvPrefix;
/** public class UltraImg2Img extends LibLibUtil {
* LibLib API //日志
* 使ControlNet private static final Logger log = LoggerFactory.getLogger(UltraImg2Img.class);
*/
public class ImageToImageUltra {
private static final Logger log = LoggerFactory.getLogger(ImageToImageUltra.class);
// API基础URL
private static final String API_BASE_URL = "https://openapi.liblibai.cloud";
// 图生图API路径 // 图生图API路径
private static final String IMG_TO_IMG_PATH = "/api/generate/webui/img2img/ultra"; private static final String IMG_TO_IMG_PATH = "/api/generate/webui/img2img/ultra";
// API访问凭证
protected static String accessKey;
protected static String secretKey;
public static Prop PropKit;
static {
//加载配置文件
String configFile = "application_{?}.yaml".replace("{?}", getEnvPrefix());
PropKit = new YamlProp(configFile);
accessKey = PropKit.get("LIBLIB.accessKey");
secretKey = PropKit.get("LIBLIB.secretKey");
}
/**
* OkHttpClient
* @return OkHttpClient
*/
private static OkHttpClient createHttpClient() {
return new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build();
}
/** /**
* *
* @param templateUuid UUID *
* @param prompt * @param templateUuid UUID
* @param sourceImageUrl URL * @param prompt
* @param width * @param sourceImageUrl URL
* @param height * @param width
* @param steps * @param height
* @param cfgScale * @param steps
* @param seed -1 * @param cfgScale
* @param seed -1
* @param controlNetModel ControlNetID * @param controlNetModel ControlNetID
* @param controlWeight * @param controlWeight
* @return UUID * @return UUID
* @throws IOException * @throws IOException
*/ */
public static String submitImageToImageTask( public static String submitImageToImageTask(
String templateUuid, String templateUuid, String prompt, String sourceImageUrl, int width,
String prompt, int height, int steps, double cfgScale, long seed, String controlNetModel,
String sourceImageUrl,
int width,
int height,
int steps,
double cfgScale,
long seed,
String controlNetModel,
double controlWeight) throws IOException { double controlWeight) throws IOException {
// 创建OkHttpClient // 创建OkHttpClient
OkHttpClient client = createHttpClient(); OkHttpClient client = createHttpClient();
// 构建请求体 // 构建请求体
JSONObject requestBody = new JSONObject(); JSONObject requestBody = new JSONObject();
// 添加模板UUID // 添加模板UUID
requestBody.put("templateUuid", templateUuid); requestBody.put("templateUuid", templateUuid);
// 构建生成参数 // 构建生成参数
JSONObject generateParams = new JSONObject(); JSONObject generateParams = new JSONObject();
generateParams.put("prompt", prompt); generateParams.put("prompt", prompt);
@ -102,59 +62,18 @@ public class ImageToImageUltra {
generateParams.put("steps", steps); generateParams.put("steps", steps);
generateParams.put("restoreFaces", 0); generateParams.put("restoreFaces", 0);
generateParams.put("sourceImage", sourceImageUrl); generateParams.put("sourceImage", sourceImageUrl);
// 构建ControlNet参数
JSONArray controlNetArray = new JSONArray();
JSONObject controlNet = new JSONObject();
controlNet.put("unitOrder", 0);
/*
1. controlType
1. line线稿
2. depth
3. pose姿
4. IPAdapter
2. controlImage访URL
*/
controlNet.put("controlImage", sourceImageUrl);
controlNet.put("width", width);
controlNet.put("height", height);
controlNet.put("preprocessor", 68);
// 构建注释参数
JSONObject annotationParameters = new JSONObject();
annotationParameters.put("entityControl", new JSONObject());
controlNet.put("annotationParameters", annotationParameters);
// 设置ControlNet模型和权重
controlNet.put("model", controlNetModel);
controlNet.put("controlWeight", controlWeight);
controlNet.put("startingControlStep", 0);
controlNet.put("endingControlStep", 1);
controlNet.put("pixelPerfect", 1);
controlNet.put("controlMode", 0);
controlNet.put("resizeMode", 1);
// 添加ControlNet到数组
// 暂不加载ControlNet
//controlNetArray.add(controlNet);
//generateParams.put("controlNet", controlNetArray);
// 将生成参数添加到请求体 // 将生成参数添加到请求体
requestBody.put("generateParams", generateParams); requestBody.put("generateParams", generateParams);
// 获取API路径 // 获取API路径
String uri = IMG_TO_IMG_PATH; String uri = IMG_TO_IMG_PATH;
// 生成签名信息 // 生成签名信息
SignUtil.SignatureInfo signInfo = SignUtil.makeSignInfo(uri); LibLibUtil.SignatureInfo signInfo = LibLibUtil.sign(uri);
// 构建带签名的URL // 构建带签名的URL
HttpUrl.Builder urlBuilder = HttpUrl.parse(API_BASE_URL + uri).newBuilder() HttpUrl.Builder urlBuilder = HttpUrl.parse(API_BASE_URL + uri).newBuilder()
.addQueryParameter("AccessKey", accessKey) .addQueryParameter("AccessKey", accessKey)
.addQueryParameter("Signature", signInfo.getSignature()) .addQueryParameter("Signature", signInfo.getSignature())
.addQueryParameter("Timestamp", String.valueOf(signInfo.getTimestamp())) .addQueryParameter("Timestamp", String.valueOf(signInfo.getTimestamp()))
.addQueryParameter("SignatureNonce", signInfo.getSignatureNonce()); .addQueryParameter("SignatureNonce", signInfo.getSignatureNonce());
// 创建请求 // 创建请求
MediaType mediaType = MediaType.parse("application/json"); MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, requestBody.toJSONString()); RequestBody body = RequestBody.create(mediaType, requestBody.toJSONString());
@ -163,36 +82,34 @@ public class ImageToImageUltra {
.method("POST", body) .method("POST", body)
.addHeader("Content-Type", "application/json") .addHeader("Content-Type", "application/json")
.build(); .build();
// 执行请求 // 执行请求
log.info("提交图生图任务: {}", requestBody.toJSONString()); log.info("提交图生图任务: {}", requestBody.toJSONString());
log.info("请求URL: {}", urlBuilder.build()); log.info("请求URL: {}", urlBuilder.build());
Response response = client.newCall(request).execute(); Response response = client.newCall(request).execute();
// 处理响应 // 处理响应
if (!response.isSuccessful()) { if (!response.isSuccessful()) {
String errorMsg = "图生图任务提交失败,状态码: " + response.code(); String errorMsg = "图生图任务提交失败,状态码: " + response.code();
log.error(errorMsg); log.error(errorMsg);
throw new IOException(errorMsg); throw new IOException(errorMsg);
} }
// 解析响应 // 解析响应
String responseBody = response.body().string(); String responseBody = response.body().string();
log.info("图生图任务提交响应: {}", responseBody); log.info("图生图任务提交响应: {}", responseBody);
JSONObject responseJson = JSON.parseObject(responseBody); JSONObject responseJson = JSON.parseObject(responseBody);
int code = responseJson.getIntValue("code"); int code = responseJson.getIntValue("code");
if (code != 0) { if (code != 0) {
String errorMsg = "图生图任务提交失败,错误码: " + code + ", 错误信息: " + responseJson.getString("msg"); String errorMsg = "图生图任务提交失败,错误码: " + code + ", 错误信息: " + responseJson.getString("msg");
log.error(errorMsg); log.error(errorMsg);
throw new IOException(errorMsg); throw new IOException(errorMsg);
} }
// 获取生成任务UUID // 获取生成任务UUID
String generateUuid = responseJson.getJSONObject("data").getString("generateUuid"); String generateUuid = responseJson.getJSONObject("data").getString("generateUuid");
log.info("图生图任务已提交任务UUID: {}", generateUuid); log.info("图生图任务已提交任务UUID: {}", generateUuid);
return generateUuid; return generateUuid;
} }
@ -220,7 +137,7 @@ public class ImageToImageUltra {
String controlNetModel = "6f1767b5f9eb47289525d06ae882a0e5"; String controlNetModel = "6f1767b5f9eb47289525d06ae882a0e5";
// 控制权重 // 控制权重
double controlWeight = 0.9; double controlWeight = 0.9;
// 提交图生图任务 // 提交图生图任务
String generateUuid = submitImageToImageTask( String generateUuid = submitImageToImageTask(
templateUuid, templateUuid,
@ -234,11 +151,11 @@ public class ImageToImageUltra {
controlNetModel, controlNetModel,
controlWeight controlWeight
); );
// 输出生成任务UUID // 输出生成任务UUID
log.info("图生图任务已提交任务UUID: {}", generateUuid); log.info("图生图任务已提交任务UUID: {}", generateUuid);
log.info("请使用此UUID查询任务进度和结果"); log.info("请使用此UUID查询任务进度和结果");
} catch (Exception e) { } catch (Exception e) {
log.error("图生图任务执行失败", e); log.error("图生图任务执行失败", e);
} }
Loading…
Cancel
Save