This commit is contained in:
ageer
2024-04-01 22:21:29 +08:00
parent cead269b19
commit dea23f13ef
552 changed files with 2144 additions and 154437 deletions

View File

@@ -173,13 +173,15 @@
<version>${revision}</version>
</dependency>
<!-- 微信模块 -->
<!-- AI绘画 -->
<dependency>
<groupId>com.xmzs</groupId>
<artifactId>ruoyi-midjourney</artifactId>
<version>${revision}</version>
</dependency>
<!-- 支付模块 -->
<dependency>
<groupId>com.xmzs</groupId>

View File

@@ -12,22 +12,27 @@ public class OpenAIConst {
public final static int SUCCEED_CODE = 200;
/** GPT3扣除费用 */
public final static double GPT3_COST = 0.05;
public final static double GPT4_COST = 0.3;
/** GPT4扣除费用 */
public final static double GPT4_COST = 0.2;
public final static double GPT4_ALL_COST = 0.3;
/** DALL普通绘图扣除费用 */
public final static double DALL3_COST = 0.3;
/** 绘图费用 */
public final static double DALL3_COST = 0.4;
/** DALL高清绘图扣除费用 */
public final static double DALL3_HD_COST = 0.5;
/** 绘图费用-高清 */
public final static double DALL3_HD_COST = 0.8;
/** MJ操作类型1(变化、变焦、文生图、图生图、局部重绘、混图)扣除费用 */
public final static double MJ_COST_TYPE1 = 0.3;
/** mdjourney绘图费用 */
public final static double MJ_COST = 0.3;
/** MJ操作类型2(换脸、放大、图生文、prompt分析)扣除费用 */
public final static double MJ_COST_TYPE2 = 0.1;
/** MJ操作类型3(查询任务进度、获取seed)扣除费用 */
public final static double MJ_COST_TYPE3 = 0.0;
/** 默认账户余额 */
public final static double USER_BALANCE = 5;
}

View File

@@ -22,16 +22,16 @@ public class ChatRequest {
@NotEmpty(message = "对话消息不能为空")
List<Message> messages;
List<Content> content;
List<Content> imageContent;
private String prompt;
private String userId;
/**
* 需要识别的图片地址
* 知识库id
*/
private String imgurl;
private String kid;
/**
* gpt的默认设置

View File

@@ -0,0 +1,34 @@
package com.xmzs.common.chat.domain.request;
import lombok.Data;
/**
* @author WangLe
*/
@Data
public class RoleRequest {
/**
* 角色名称
*/
private String name;
/**
* 角色描述
*/
private String description;
/**
* 音频地址
*/
private String prompt;
/**
* 头像
*/
private String avatar;
private String preProcess;
}

View File

@@ -0,0 +1,35 @@
package com.xmzs.common.chat.domain.request;
import lombok.Data;
/**
* @author WangLe
*/
@Data
public class SimpleGenerateRequest {
/**
* 要使用的模型ID (目前统一为reecho-neural-voice-001)
*/
private String model = "reecho-neural-voice-001";
/**
* 多样性 (0-100默认为97)
*/
private Integer randomness;
/**
* 稳定性过滤 (0-100默认为0)
*/
private Integer stability_boost;
/**
* 角色ID
*/
private String voiceId;
/**
* 要生成的文本内容
*/
private String text;
}

View File

@@ -0,0 +1,14 @@
package com.xmzs.common.chat.domain.response;
import lombok.Data;
/**
* @author WangLe
*/
@Data
public class MetadataResponse {
private String promptMP3StorageUrl;
private String promptOriginAudioStorageUrl;
private String description;
private boolean preProcess;
}

View File

@@ -0,0 +1,20 @@
package com.xmzs.common.chat.domain.response;
import lombok.Data;
/**
* @author WangLe
*/
@Data
public class RoleDataResponse {
private String id;
private String name;
private String status;
private String from;
private String originId;
private MetadataResponse metadata;
private String createdAt;
private String updatedAt;
private String deletedAt;
private String userId;
}

View File

@@ -0,0 +1,13 @@
package com.xmzs.common.chat.domain.response;
import lombok.Data;
/**
* @author WangLe
*/
@Data
public class RoleResponse {
private String status;
private String message;
private RoleDataResponse data;
}

View File

@@ -0,0 +1,25 @@
package com.xmzs.common.chat.domain.response;
import lombok.Data;
/**
* @author WangLe
*/
@Data
public class SimpleGenerateDataResponse {
/**
* 本次生成的ID
*/
private String id;
/**
* 本次生成结果的音频文件地址
*/
private String audio;
/**
* 本次生成所消耗的点数
*/
private Integer credit_used;
}

View File

@@ -0,0 +1,25 @@
package com.xmzs.common.chat.domain.response;
import lombok.Data;
/**
* @author WangLe
*/
@Data
public class SimpleGenerateResponse {
/**
* 状态码失败时则为500
*/
private String status;
/**
* 状态消息
*/
private String message;
/**
* 生成详情
*/
private SimpleGenerateDataResponse data;
}

View File

@@ -2,7 +2,6 @@ package com.xmzs.common.chat.entity.chat;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.xmzs.common.chat.constant.OpenAIConst;
import com.xmzs.common.chat.entity.chat.tool.Tools;
import lombok.*;
@@ -217,6 +216,23 @@ public class BaseChatCompletion implements Serializable {
* gpt-4-0613支持函数
*/
GPT_4_0125_PREVIEW("gpt-4-0125-preview"),
/**
* GPT_4_ALL
*/
GPT_4_ALL("gpt-4-all"),
GPT_4_GIZMO("gpt-4-gizmo"),
NET("net"),
CLAUDE_3_SONNET("claude-3-sonnet-20240229"),
GEMINI_PRO("gemini-pro"),
STABLE_DIFFUSION("stable-diffusion"),
SUNO_V3("suno-v3"),
;
private final String name;
}
@@ -238,9 +254,10 @@ public class BaseChatCompletion implements Serializable {
}
public static double getModelCost(String modelName) {
return switch (modelName) {
case "gpt-3.5-turbo-0613" -> OpenAIConst.GPT3_COST;
default -> OpenAIConst.GPT4_COST;
};
if(modelName.startsWith("gpt-3.5")){
return OpenAIConst.GPT3_COST;
}else {
return OpenAIConst.GPT4_COST;
}
}
}

View File

@@ -16,13 +16,20 @@ import java.io.Serializable;
@JsonIgnoreProperties(ignoreUnknown = true)
public class File implements Serializable {
private String id;
private String object;
// private String id;
// private String object;
// private long bytes;
// private long created_at;
// private String filename;
// private String purpose;
// private String status;
// @JsonProperty("status_details")
// private String statusDetails;
private long bytes;
private long created_at;
private String filename;
private String purpose;
private String status;
@JsonProperty("status_details")
private String statusDetails;
private String id;
private String object;
private String url;
}

View File

@@ -12,6 +12,7 @@ import com.xmzs.common.chat.entity.billing.Subscription;
import com.xmzs.common.chat.entity.chat.BaseChatCompletion;
import com.xmzs.common.chat.entity.chat.ChatCompletionResponse;
import com.xmzs.common.chat.entity.chat.ChatCompletionWithPicture;
import com.xmzs.common.chat.entity.files.UploadFileResponse;
import com.xmzs.common.chat.entity.images.Image;
import com.xmzs.common.chat.entity.images.ImageResponse;
import com.xmzs.common.chat.entity.models.Model;
@@ -231,6 +232,23 @@ public class OpenAiStreamClient {
return chatCompletionResponse.blockingGet();
}
/**
* 上传文件
*
* @param purpose purpose
* @param file 文件对象
* @return UploadFileResponse
*/
public UploadFileResponse uploadFile(String purpose, java.io.File file) {
// 创建 RequestBody用于封装构建RequestBody
RequestBody fileBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part multipartBody = MultipartBody.Part.createFormData("file", file.getName(), fileBody);
RequestBody purposeBody = RequestBody.create(MediaType.parse("multipart/form-data"), purpose);
Single<UploadFileResponse> uploadFileResponse = this.openAiApi.uploadFile(multipartBody, purposeBody);
return uploadFileResponse.blockingGet();
}
/**
* 获取openKey账户信息(近90天)
*

View File

@@ -1,50 +1,57 @@
package com.xmzs.common.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 支付配置信息
*
* @author Admin
*/
@Data
@Component
@ConfigurationProperties(prefix = "pay")
public class PayConfig {
/**
* 商户ID
*/
public static String pid = "xxx";
private String pid;
/**
* 接口地址
*/
public static String payUrl = "https://pay-cloud.vip/mapi.php";
private String payUrl;
/**
* 私钥
*/
public static String key = "xxx";
private String key ;
/**
* 服务器异步通知地址
*/
public static String notify_url = "https://www.pandarobot.chat/pay/returnUrl";
private String notify_url;
/**
* 页面跳转通知地址
*/
public static String return_url = "https://www.pandarobot.chat/pay/notifyUrl";
private String return_url;
/**
* 支付方式
*/
public static String type = "wxpay";
private String type;
/**
* 设备类型
*/
public static String device = "pc";
private String device;
/**
* 加密方式默认MD5
*/
public static String sign_type = "MD5";
private String sign_type;
}

View File

@@ -2,9 +2,11 @@ package com.xmzs.common.service.impl;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import com.xmzs.common.config.PayConfig;
import com.xmzs.common.service.PayService;
import com.xmzs.common.utils.MD5Util;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.HashMap;
@@ -15,28 +17,31 @@ import java.util.Map;
* @author Admin
*/
@Service
@RequiredArgsConstructor
public class PayServiceImpl implements PayService {
private final PayConfig payConfig;
@Override
public String getPayUrl(String orderNo, String name, double money, String clientIp) {
String out_trade_no = orderNo, sign = "";
//封装请求参数
String mdString = "clientip=" + clientIp + "&device=" + PayConfig.device + "&money=" + money + "&name=" + name + "&" +
"notify_url=" + PayConfig.notify_url + "&out_trade_no=" + out_trade_no + "&pid=" + PayConfig.pid + "&return_url=" + PayConfig.return_url +
"&type=" + PayConfig.type + PayConfig.key;
String mdString = "clientip=" + clientIp + "&device=" + payConfig.getDevice() + "&money=" + money + "&name=" + name + "&" +
"notify_url=" + payConfig.getNotify_url() + "&out_trade_no=" + out_trade_no + "&pid=" + payConfig.getPid() + "&return_url=" + payConfig.getReturn_url() +
"&type=" + payConfig.getType() + payConfig.getKey();
sign = MD5Util.GetMD5Code(mdString);
Map<String, Object> map = new HashMap<>(10);
map.put("clientip", clientIp);
map.put("device", PayConfig.device);
map.put("device", payConfig.getDevice());
map.put("money", money);
map.put("name", name);
map.put("notify_url", PayConfig.notify_url);
map.put("notify_url", payConfig.getNotify_url());
map.put("out_trade_no", out_trade_no);
map.put("pid", PayConfig.pid);
map.put("return_url", PayConfig.return_url);
map.put("sign_type", PayConfig.sign_type);
map.put("type", PayConfig.type);
map.put("pid", payConfig.getPid());
map.put("return_url", payConfig.getReturn_url());
map.put("sign_type", payConfig.getSign_type());
map.put("type", payConfig.getType());
map.put("sign", sign);
String body = HttpUtil.post(PayConfig.payUrl, map);
String body = HttpUtil.post(payConfig.getPayUrl(), map);
JSONObject jsonObject = new JSONObject(body);
return (String) jsonObject.get("qrcode");
}