main
HuangHai 2 months ago
parent 96fb466504
commit 33559006d5

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

@ -0,0 +1,123 @@
package com.dsideal.aiSupport.Util.KeLing.Kit;
import lombok.Getter;
/**
* AI API
*/
@Getter
public enum KlErrorCode {
SUCCESS(0, "请求成功", "请求成功"),
// 身份验证错误 (401)
AUTH_FAILED(1000, "身份验证失败", "检查Authorization是否正确"),
AUTH_EMPTY(1001, "Authorization为空", "在RequestHeader中填写正确的Authorization"),
AUTH_INVALID(1002, "Authorization值非法", "在RequestHeader中填写正确的Authorization"),
AUTH_NOT_EFFECTIVE(1003, "Authorization未到有效时间", "检查token的开始生效时间等待生效或重新签发"),
AUTH_EXPIRED(1004, "Authorization已失效", "检查token的有效期重新签发"),
// 账户异常 (429)
ACCOUNT_EXCEPTION(1100, "账户异常", "检查账户配置信息"),
ACCOUNT_ARREARS(1101, "账户欠费 (后付费场景)", "进行账户充值,确保余额充足"),
RESOURCE_EXHAUSTED(1102, "资源包已用完/已过期(预付费场景)", "购买额外的资源包,或开通后付费服务(如有)"),
// 权限错误 (403)
NO_PERMISSION(1103, "请求的资源无权限,如接口/模型", "检查账户权限"),
// 请求参数非法 (400/404)
PARAM_INVALID(1200, "请求参数非法", "检查请求参数是否正确"),
PARAM_ERROR(1201, "参数非法如key写错或value非法", "参考返回体中message字段的具体信息修改请求参数"),
METHOD_INVALID(1202, "请求的method无效", "查看接口文档使用正确的requestmethod"),
RESOURCE_NOT_EXIST(1203, "请求的资源不存在,如模型", "参考返回体中message字段的具体信息修改请求参数"),
// 触发策略 (400/429)
POLICY_TRIGGERED(1300, "触发平台策略", "检查是否触发平台策略"),
CONTENT_SECURITY(1301, "触发平台的内容安全策略", "检查输入内容,修改后重新发起请求"),
RATE_LIMIT(1302, "API请求过快超过平台速率限制", "降低请求频率、稍后重试,或联系客服增加限额"),
CONCURRENT_LIMIT(1303, "并发或QPS超出预付费资源包限制", "降低请求频率、稍后重试,或联系客服增加限额"),
IP_WHITELIST(1304, "触发平台的IP白名单策略", "联系客服"),
// 内部错误 (500/503/504)
INTERNAL_ERROR(5000, "服务器内部错误", "稍后重试,或联系客服"),
SERVICE_UNAVAILABLE(5001, "服务器暂时不可用,通常是在维护", "稍后重试,或联系客服"),
INTERNAL_TIMEOUT(5002, "服务器内部超时,通常是发生积压", "稍后重试,或联系客服");
private final int code;
private final String message;
private final String solution;
KlErrorCode(int code, String message, String solution) {
this.code = code;
this.message = message;
this.solution = solution;
}
/**
*
* @param code
* @return null
*/
public static KlErrorCode getByCode(int code) {
for (KlErrorCode errorCode : values()) {
if (errorCode.getCode() == code) {
return errorCode;
}
}
return null;
}
/**
*
* @param code
* @return "未知错误"
*/
public static String getMessageByCode(int code) {
KlErrorCode errorCode = getByCode(code);
return errorCode != null ? errorCode.getMessage() : "未知错误";
}
/**
*
* @param code
* @return "请联系客服"
*/
public static String getSolutionByCode(int code) {
KlErrorCode errorCode = getByCode(code);
return errorCode != null ? errorCode.getSolution() : "请联系客服";
}
/**
*
* @param code
* @return
*/
public static boolean isSuccess(int code) {
return code == SUCCESS.getCode();
}
/**
*
* @param code
* @return
*/
public static boolean isRetryable(int code) {
return code == RATE_LIMIT.getCode() ||
code == CONCURRENT_LIMIT.getCode() ||
code == INTERNAL_ERROR.getCode() ||
code == SERVICE_UNAVAILABLE.getCode() ||
code == INTERNAL_TIMEOUT.getCode();
}
/**
*
* @param code
* @return
*/
public static boolean isAccountIssue(int code) {
return code == ACCOUNT_EXCEPTION.getCode() ||
code == ACCOUNT_ARREARS.getCode() ||
code == RESOURCE_EXHAUSTED.getCode() ||
code == NO_PERMISSION.getCode();
}
}

@ -9,6 +9,7 @@ import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.dsideal.aiSupport.Util.KeLing.Kit.KeLingJwtUtil;
import com.dsideal.aiSupport.Util.KeLing.Kit.KlCommon;
import com.dsideal.aiSupport.Util.KeLing.Kit.KlErrorCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -46,6 +47,7 @@ public class KlText2Image extends KlCommon {
.execute();
log.info("生成图片请求体:{}", JSONUtil.toJsonStr(requestBody));
log.info("生成图片响应体:{}", response.body());
// 检查响应状态码
if (response.getStatus() != 200) {
throw new Exception("请求失败,状态码:" + response.getStatus());
@ -60,7 +62,16 @@ public class KlText2Image extends KlCommon {
int code = responseJson.getInt("code");
if (code != 0) {
String message = responseJson.getStr("message");
throw new Exception("生成图片失败:" + message);
String solution = KlErrorCode.getSolutionByCode(code);
String errorMsg = String.format("生成图片失败:[%d] %s - %s", code, message, solution);
// 特殊处理资源包耗尽的情况
if (code == KlErrorCode.RESOURCE_EXHAUSTED.getCode()) {
log.error("可灵AI资源包已耗尽请充值后再试");
throw new Exception("可灵AI资源包已耗尽请充值后再试");
}
throw new Exception(errorMsg);
}
// 获取任务ID
@ -101,7 +112,9 @@ public class KlText2Image extends KlCommon {
int code = responseJson.getInt("code");
if (code != 0) {
String message = responseJson.getStr("message");
throw new Exception("查询任务状态失败:" + message);
String solution = KlErrorCode.getSolutionByCode(code);
String errorMsg = String.format("查询任务状态失败:[%d] %s - %s", code, message, solution);
throw new Exception(errorMsg);
}
return responseJson;
@ -132,66 +145,92 @@ public class KlText2Image extends KlCommon {
// 添加重试逻辑
int generateRetryCount = 0;
int maxGenerateRetries = 1000; // 最大重试次数
int maxGenerateRetries = 5; // 最大重试次数
int generateRetryInterval = 5000; // 重试间隔(毫秒)
String taskId;
while (true) {
String taskId = null;
boolean accountIssue = false;
while (generateRetryCount < maxGenerateRetries && !accountIssue) {
try {
taskId = generateImage(prompt, modelName);
break;
} catch (Exception e) {
log.error("生成图片异常: {}", e.getMessage(), e);
generateRetryCount++;
if (generateRetryCount < maxGenerateRetries) {
log.warn("等待{}毫秒后重试...", generateRetryInterval);
Thread.sleep(generateRetryInterval);
// 检查是否是账户问题
if (e.getMessage().contains("资源包已耗尽") ||
e.getMessage().contains("账户欠费") ||
e.getMessage().contains("无权限")) {
log.error("账户问题,停止重试");
accountIssue = true;
} else {
throw e; // 达到最大重试次数,抛出异常
generateRetryCount++;
if (generateRetryCount < maxGenerateRetries) {
log.warn("等待{}毫秒后重试...", generateRetryInterval);
Thread.sleep(generateRetryInterval);
} else {
throw e; // 达到最大重试次数,抛出异常
}
}
}
}
if (taskId == null) {
log.error("生成图片失败,已达到最大重试次数: {}", maxGenerateRetries);
if (accountIssue) {
log.error("账户问题,请检查账户状态或充值后再试");
} else {
log.error("生成图片失败,已达到最大重试次数: {}", maxGenerateRetries);
}
return;
}
// 查询任务状态
int queryRetryCount = 0;
int maxQueryRetries = 1000; // 最大查询次数
int maxQueryRetries = 30; // 最大查询次数
int queryRetryInterval = 3000; // 查询间隔(毫秒)
while (queryRetryCount < maxQueryRetries) {
JSONObject result = queryTaskStatus(taskId);
JSONObject data = result.getJSONObject("data");
String taskStatus = data.getStr("task_status");
if ("failed".equals(taskStatus)) {
String taskStatusMsg = data.getStr("task_status_msg");
log.error("任务失败: {}", taskStatusMsg);
break;
} else if ("succeed".equals(taskStatus)) {
// 获取图片URL
JSONObject taskResult = data.getJSONObject("task_result");
JSONArray images = taskResult.getJSONArray("images");
try {
JSONObject result = queryTaskStatus(taskId);
JSONObject data = result.getJSONObject("data");
String taskStatus = data.getStr("task_status");
for (int i = 0; i < images.size(); i++) {
JSONObject image = images.getJSONObject(i);
int index = image.getInt("index");
String imageUrl = image.getStr("url");
if ("failed".equals(taskStatus)) {
String taskStatusMsg = data.getStr("task_status_msg");
log.error("任务失败: {}", taskStatusMsg);
break;
} else if ("succeed".equals(taskStatus)) {
// 获取图片URL
JSONObject taskResult = data.getJSONObject("task_result");
JSONArray images = taskResult.getJSONArray("images");
// 下载图片
String saveImagePath = basePath + "image_" + index + ".png";
log.info("开始下载图片...");
downloadFile(imageUrl, saveImagePath);
log.info("图片已下载到: {}", saveImagePath);
for (int i = 0; i < images.size(); i++) {
JSONObject image = images.getJSONObject(i);
int index = image.getInt("index");
String imageUrl = image.getStr("url");
// 下载图片
String saveImagePath = basePath + "image_" + index + ".png";
log.info("开始下载图片...");
downloadFile(imageUrl, saveImagePath);
log.info("图片已下载到: {}", saveImagePath);
}
break;
} else {
log.info("任务状态: {}, 等待{}毫秒后重试...", taskStatus, queryRetryInterval);
Thread.sleep(queryRetryInterval);
queryRetryCount++;
}
break;
} else {
log.info("任务状态: {}, 等待{}毫秒后重试...", taskStatus, queryRetryInterval);
Thread.sleep(queryRetryInterval);
} catch (Exception e) {
log.error("查询任务状态异常: {}", e.getMessage(), e);
queryRetryCount++;
if (queryRetryCount < maxQueryRetries) {
log.warn("等待{}毫秒后重试...", queryRetryInterval);
Thread.sleep(queryRetryInterval);
} else {
throw e; // 达到最大重试次数,抛出异常
}
}
}

Loading…
Cancel
Save