2.0版本

This commit is contained in:
ageerle
2025-02-07 10:34:31 +08:00
parent 3c3ad701e3
commit c1cbfc2b93
968 changed files with 67565 additions and 1011 deletions

View File

@@ -4,7 +4,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ruoyi-ai</artifactId>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<version>${revision}</version>
<relativePath>../pom.xml</relativePath>
</parent>
@@ -16,7 +16,6 @@
<module>ruoyi-common-doc</module>
<module>ruoyi-common-excel</module>
<module>ruoyi-common-idempotent</module>
<module>ruoyi-common-job</module>
<module>ruoyi-common-log</module>
<module>ruoyi-common-mail</module>
<module>ruoyi-common-mybatis</module>
@@ -34,7 +33,6 @@
<module>ruoyi-common-tenant</module>
<module>ruoyi-common-chat</module>
<module>ruoyi-common-pay</module>
<module>ruoyi-common-wechat</module>
</modules>
<artifactId>ruoyi-common</artifactId>

View File

@@ -4,7 +4,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-bom</artifactId>
<version>${revision}</version>
<packaging>pom</packaging>
@@ -21,162 +21,148 @@
<dependencies>
<!-- 核心模块 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-core</artifactId>
<version>${revision}</version>
</dependency>
<!-- 接口模块 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-doc</artifactId>
<version>${revision}</version>
</dependency>
<!-- excel -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-excel</artifactId>
<version>${revision}</version>
</dependency>
<!-- 幂等 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-idempotent</artifactId>
<version>${revision}</version>
</dependency>
<!-- 调度模块 -->
<dependency>
<groupId>com.xmzs</groupId>
<artifactId>ruoyi-common-job</artifactId>
<version>${revision}</version>
</dependency>
<!-- 日志记录 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-log</artifactId>
<version>${revision}</version>
</dependency>
<!-- 邮件服务 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-mail</artifactId>
<version>${revision}</version>
</dependency>
<!-- 数据库服务 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-mybatis</artifactId>
<version>${revision}</version>
</dependency>
<!-- OSS -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-oss</artifactId>
<version>${revision}</version>
</dependency>
<!-- 限流 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-ratelimiter</artifactId>
<version>${revision}</version>
</dependency>
<!-- 缓存服务 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-redis</artifactId>
<version>${revision}</version>
</dependency>
<!-- satoken -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-satoken</artifactId>
<version>${revision}</version>
</dependency>
<!-- 安全模块 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-security</artifactId>
<version>${revision}</version>
</dependency>
<!-- 短信模块 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-sms</artifactId>
<version>${revision}</version>
</dependency>
<!-- web服务 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-web</artifactId>
<version>${revision}</version>
</dependency>
<!-- 翻译模块 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-translation</artifactId>
<version>${revision}</version>
</dependency>
<!-- 脱敏模块 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-sensitive</artifactId>
<version>${revision}</version>
</dependency>
<!-- 序列化模块 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-json</artifactId>
<version>${revision}</version>
</dependency>
<!-- 数据库加解密模块 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-encrypt</artifactId>
<version>${revision}</version>
</dependency>
<!-- 租户模块 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-tenant</artifactId>
<version>${revision}</version>
</dependency>
<!-- chat模块 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-chat</artifactId>
<version>${revision}</version>
</dependency>
<!-- 微信模块 -->
<dependency>
<groupId>com.xmzs</groupId>
<artifactId>ruoyi-common-wechat</artifactId>
<version>${revision}</version>
</dependency>
<!-- AI绘画 -->
<dependency>
<groupId>com.xmzs</groupId>
<artifactId>ruoyi-midjourney</artifactId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-fusion</artifactId>
<version>${revision}</version>
</dependency>
@@ -184,7 +170,7 @@
<!-- 支付模块 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-pay</artifactId>
<version>${revision}</version>
</dependency>

View File

@@ -3,7 +3,7 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
<version>${revision}</version>
<relativePath>../pom.xml</relativePath>
@@ -22,21 +22,23 @@
<dependencies>
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-core</artifactId>
</dependency>
<!-- 序列化模块 -->
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-json</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-redis</artifactId>
</dependency>
<dependency>
<groupId>com.xmzs</groupId>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-satoken</artifactId>
</dependency>

View File

@@ -0,0 +1,57 @@
package org.ruoyi.common.chat.config;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import org.ruoyi.common.chat.openai.OpenAiStreamClient;
import org.ruoyi.common.chat.openai.function.KeyRandomStrategy;
import org.ruoyi.common.chat.openai.interceptor.OpenAILogger;
import org.ruoyi.common.core.service.ConfigService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
/**
* Chat配置类
*
* @date: 2023/5/16
*/
@Configuration
@RequiredArgsConstructor
public class ChatConfig {
@Getter
private OpenAiStreamClient openAiStreamClient;
private final ConfigService configService;
// 重启才会生效
@Bean
public OpenAiStreamClient openAiStreamClient() {
String apiHost = configService.getConfigValue("chat", "apiHost");
String apiKey = configService.getConfigValue("chat", "apiKey");
openAiStreamClient = createOpenAiStreamClient(apiHost,apiKey);
return openAiStreamClient;
}
public OpenAiStreamClient createOpenAiStreamClient(String apiHost, String apiKey) {
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new OpenAILogger());
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.connectTimeout(30, TimeUnit.SECONDS)
.writeTimeout(600, TimeUnit.SECONDS)
.readTimeout(600, TimeUnit.SECONDS)
.build();
return OpenAiStreamClient.builder()
.apiHost(apiHost)
.apiKey(Collections.singletonList(apiKey))
.keyStrategy(new KeyRandomStrategy())
.okHttpClient(okHttpClient)
.build();
}
}

View File

@@ -0,0 +1,36 @@
package org.ruoyi.common.chat.config;
import cn.hutool.cache.CacheUtil;
import cn.hutool.cache.impl.TimedCache;
import cn.hutool.core.date.DateUnit;
import lombok.extern.slf4j.Slf4j;
/**
* 描述:
*
* @author https:www.unfbx.com
* @date 2023-03-10
*/
@Slf4j
public class LocalCache {
/**
* 缓存时长
*/
public static final long TIMEOUT = 30 * DateUnit.MINUTE.getMillis();
/**
* 清理间隔
*/
private static final long CLEAN_TIMEOUT = 30 * DateUnit.MINUTE.getMillis();
/**
* 缓存对象
*/
public static final TimedCache<String, Object> CACHE = CacheUtil.newTimedCache(TIMEOUT);
static {
//启动定时任务
CACHE.schedulePrune(CLEAN_TIMEOUT);
}
}

View File

@@ -0,0 +1,60 @@
package org.ruoyi.common.chat.config;
import cn.hutool.core.util.StrUtil;
import org.ruoyi.common.chat.config.properties.WebSocketProperties;
import org.ruoyi.common.chat.handler.PlusWebSocketHandler;
import org.ruoyi.common.chat.interceptor.PlusWebSocketInterceptor;
import org.ruoyi.common.chat.listener.WebSocketTopicListener;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.server.HandshakeInterceptor;
/**
* WebSocket 配置
*
* @author zendwang
*/
@AutoConfiguration
@ConditionalOnProperty(value = "websocket.enabled", havingValue = "true")
@EnableConfigurationProperties(WebSocketProperties.class)
@EnableWebSocket
public class WebSocketConfig {
@Bean
public WebSocketConfigurer webSocketConfigurer(HandshakeInterceptor handshakeInterceptor,
WebSocketHandler webSocketHandler,
WebSocketProperties webSocketProperties) {
if (StrUtil.isBlank(webSocketProperties.getPath())) {
webSocketProperties.setPath("/websocket");
}
if (StrUtil.isBlank(webSocketProperties.getAllowedOrigins())) {
webSocketProperties.setAllowedOrigins("*");
}
return registry -> registry
.addHandler(webSocketHandler, webSocketProperties.getPath())
.addInterceptors(handshakeInterceptor)
.setAllowedOrigins(webSocketProperties.getAllowedOrigins());
}
@Bean
public HandshakeInterceptor handshakeInterceptor() {
return new PlusWebSocketInterceptor();
}
@Bean
public WebSocketHandler webSocketHandler() {
return new PlusWebSocketHandler();
}
@Bean
public WebSocketTopicListener topicListener() {
return new WebSocketTopicListener();
}
}

View File

@@ -0,0 +1,26 @@
package org.ruoyi.common.chat.config.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* WebSocket 配置项
*
* @author zendwang
*/
@ConfigurationProperties("websocket")
@Data
public class WebSocketProperties {
private Boolean enabled;
/**
* 路径
*/
private String path;
/**
* 设置访问源地址
*/
private String allowedOrigins;
}

View File

@@ -0,0 +1,15 @@
package org.ruoyi.common.chat.constant;
/**
* 描述:
*
* @author https:www.unfbx.com
* @since 2023-03-06
*/
public class OpenAIConst {
public final static String OPENAI_HOST = "https://api.openai.com/";
public final static int SUCCEED_CODE = 200;
}

View File

@@ -0,0 +1,28 @@
package org.ruoyi.common.chat.constant;
/**
* websocket的常量配置
*
* @author zendwang
*/
public interface WebSocketConstants {
/**
* websocketSession中的参数的key
*/
String LOGIN_USER_KEY = "loginUser";
/**
* 订阅的频道
*/
String WEB_SOCKET_TOPIC = "global:websocket";
/**
* 前端心跳检查的命令
*/
String PING = "ping";
/**
* 服务端心跳恢复的字符串
*/
String PONG = "pong";
}

View File

@@ -0,0 +1,63 @@
package org.ruoyi.common.chat.domain.request;
import org.ruoyi.common.chat.entity.chat.Message;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import java.util.List;
/**
* 描述:
*
* @author https:www.unfbx.com
* @sine 2023-04-08
*/
@Data
public class ChatRequest {
private String frequency_penalty;
private String max_tokens;
@NotEmpty(message = "对话消息不能为空")
List<Message> messages;
@NotEmpty(message = "传入的模型不能为空")
private String model;
private String presence_penalty;
private String stream;
private double temperature;
private double top_p = 1;
// private String userId;
//
// /**
// * 知识库id
// */
// private String kid;
//
// /**
// * gpt的默认设置
// */
// private String systemMessage = "";
//
//
//
// private double temperature = 0.2;
//
// /**
// * 上下文的条数
// */
// private Integer contentNumber = 10;
//
// /**
// * 是否携带上下文
// */
// private Boolean usingContext = Boolean.TRUE;
}

View File

@@ -0,0 +1,33 @@
package org.ruoyi.common.chat.domain.request;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
/**
* 描述:
*
* @author https:www.unfbx.com
* @sine 2023-04-08
*/
@Data
public class Dall3Request {
@NotEmpty(message = "传入的模型不能为空")
private String model;
@NotEmpty(message = "提示词不能为空")
private String prompt;
/** 图片大小 */
@NotEmpty(message = "图片大小不能为空")
private String size ;
/** 图片质量 */
@NotEmpty(message = "图片质量不能为空")
private String quality;
/** 图片风格 */
@NotEmpty(message = "图片风格不能为空")
private String style;
}

View File

@@ -0,0 +1,48 @@
package org.ruoyi.common.chat.entity.Tts;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;
@Data
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
@NoArgsConstructor
@AllArgsConstructor
public class TextToSpeech {
@Builder.Default
private String model = Model.TTS_1.getName();
/**
* 音频声音源
*
* @see TtsVoice
*/
private String voice;
/**
* 输入内容
*/
private String input;
/**
* 输出音频文件格式
*
* @see TtsFormat
*/
@JsonProperty("response_format")
private String responseFormat;
/**
* 速度调节默认是1取值范围0.25——4.0
*/
private Double speed;
@Getter
@AllArgsConstructor
public enum Model {
TTS_1("tts-1"),
TTS_1_HD("tts-1-hd"),
;
private final String name;
}
}

View File

@@ -0,0 +1,15 @@
package org.ruoyi.common.chat.entity.Tts;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum TtsFormat {
MP3("mp3"),
OPUS("opus"),
AAC("aac"),
FLAC("flac"),
;
private final String name;
}

View File

@@ -0,0 +1,23 @@
package org.ruoyi.common.chat.entity.Tts;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 生成不同声音的音频
* <p>具体语音效果参考https://platform.openai.com/docs/guides/text-to-speech</p>
*/
@Getter
@AllArgsConstructor
public enum TtsVoice {
ALLOY("alloy"),
ECHO("echo"),
FABLE("fable"),
ONYX("onyx"),
NOVA("nova"),
SHIMMER("shimmer"),
;
private final String name;
}

View File

@@ -0,0 +1,33 @@
package org.ruoyi.common.chat.entity.billing;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 描述:金额消耗信息
*
* @author https:www.unfbx.com
* @since 2023-04-08
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class BillingUsage {
@JsonProperty("object")
private String object;
/**
* 账号金额消耗明细
*/
@JsonProperty("daily_costs")
private List<DailyCost> dailyCosts;
/**
* 总使用金额:美分
*/
@JsonProperty("total_usage")
private BigDecimal totalUsage;
}

View File

@@ -0,0 +1,39 @@
package org.ruoyi.common.chat.entity.billing;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 描述:余额查询接口返回值
*
* @author https:www.unfbx.com
* @since 2023-03-18
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class CreditGrantsResponse implements Serializable {
private String object;
/**
* 总金额:美元
*/
@JsonProperty("total_granted")
private BigDecimal totalGranted;
/**
* 总使用金额:美元
*/
@JsonProperty("total_used")
private BigDecimal totalUsed;
/**
* 总剩余金额:美元
*/
@JsonProperty("total_available")
private BigDecimal totalAvailable;
/**
* 余额明细
*/
private Grants grants;
}

View File

@@ -0,0 +1,28 @@
package org.ruoyi.common.chat.entity.billing;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
/**
* 描述:金额消耗列表
*
* @author https:www.unfbx.com
* @since 2023-04-08
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class DailyCost {
/**
* 时间戳
*/
@JsonProperty("timestamp")
private long timestamp;
/**
* 模型消耗金额详情
*/
@JsonProperty("line_items")
private List<LineItem> lineItems;
}

View File

@@ -0,0 +1,40 @@
package org.ruoyi.common.chat.entity.billing;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* 描述:
*
* @author https:www.unfbx.com
* @since 2023-03-18
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Datum {
private String object;
private String id;
/**
* 赠送金额:美元
*/
@JsonProperty("grant_amount")
private BigDecimal grantAmount;
/**
* 使用金额:美元
*/
@JsonProperty("used_amount")
private BigDecimal usedAmount;
/**
* 生效时间戳
*/
@JsonProperty("effective_at")
private Long effectiveAt;
/**
* 过期时间戳
*/
@JsonProperty("expires_at")
private Long expiresAt;
}

View File

@@ -0,0 +1,21 @@
package org.ruoyi.common.chat.entity.billing;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
/**
* 描述:
*
* @author https:www.unfbx.com
* @since 2023-03-18
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Grants {
private String object;
@JsonProperty("data")
private List<Datum> data;
}

View File

@@ -0,0 +1,56 @@
package org.ruoyi.common.chat.entity.billing;
import lombok.*;
import java.time.LocalDate;
/**
* openKey信息
*
* @author admin
* @date 2023/6/15
*/
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class KeyInfo {
/**
* 订阅类型
*/
private String planTitle;
/**
* key值
*/
private String keyValue;
/**
* 剩余额度
*/
private Double remaining;
/**
* 账户总余额
*/
private Double totalAmount;
/**
* 已使用的额度
*/
private Double totalUsage;
/**
* 截至日期
*/
private LocalDate limitDate;
/**
* 是否绑卡
*/
private Boolean isHasPaymentMethod;
/**
* 最高可用模型
*/
private String model;
}

View File

@@ -0,0 +1,25 @@
package org.ruoyi.common.chat.entity.billing;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import java.math.BigDecimal;
/**
* 描述:金额消耗列表
*
* @author https:www.unfbx.com
* @since 2023-04-08
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class LineItem {
/**
* 模型名称
*/
private String name;
/**
* 消耗金额
*/
private BigDecimal cost;
}

View File

@@ -0,0 +1,17 @@
package org.ruoyi.common.chat.entity.billing;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
/**
* 描述:
*
* @author https:www.unfbx.com
* @since 2023-04-08
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Plan {
private String title;
private String id;
}

View File

@@ -0,0 +1,73 @@
package org.ruoyi.common.chat.entity.billing;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* 描述:账户信息
*
* @author https:www.unfbx.com
* @since 2023-04-08
*/
@Data
public class Subscription {
@JsonProperty("object")
private String object;
/**
* 付款方式
*/
@JsonProperty("has_payment_method")
private boolean hasPaymentMethod;
@JsonProperty("canceled")
private boolean canceled;
@JsonProperty("canceled_at")
private Object canceledAt;
@JsonProperty("delinquent")
private Object delinquent;
@JsonProperty("access_until")
private long accessUntil;
@JsonProperty("soft_limit")
private long softLimit;
@JsonProperty("hard_limit")
private long hardLimit;
@JsonProperty("system_hard_limit")
private long systemHardLimit;
@JsonProperty("soft_limit_usd")
private double softLimitUsd;
@JsonProperty("hard_limit_usd")
private double hardLimitUsd;
@JsonProperty("system_hard_limit_usd")
private double systemHardLimitUsd;
/**
* 计划
*/
@JsonProperty("plan")
private Plan plan;
/**
* 账户名称
*/
@JsonProperty("account_name")
private String accountName;
@JsonProperty("po_number")
private Object poNumber;
/**
* 账单邮箱
*/
@JsonProperty("billing_email")
private Object billingEmail;
@JsonProperty("tax_ids")
private Object taxIds;
@JsonProperty("billing_address")
private Object billingAddress;
@JsonProperty("business_address")
private Object businessAddress;
@JsonProperty("primary")
private Boolean primary;
}

View File

@@ -0,0 +1,255 @@
package org.ruoyi.common.chat.entity.chat;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;
import lombok.experimental.SuperBuilder;
import org.ruoyi.common.chat.entity.chat.tool.Tools;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import static org.ruoyi.common.chat.entity.chat.BaseChatCompletion.Model.GPT_3_5_TURBO;
/**
* 描述: chat模型基础类
*
* @author https:www.unfbx.com
* @since 1.1.2
* 2023-11-10
*/
@Data
@SuperBuilder
@JsonInclude(JsonInclude.Include.NON_NULL)
@NoArgsConstructor
@AllArgsConstructor
public class BaseChatCompletion implements Serializable {
@NonNull
@Builder.Default
private String model = GPT_3_5_TURBO.getName();
/**
* 指定模型必须输出的格式的对象。
*
* @since 1.1.2
*/
@JsonProperty("response_format")
private ResponseFormat responseFormat;
/**
* 已过时
*
* @see #tools
*/
@Deprecated
private List<Functions> functions;
/**
* 取值null,auto或者自定义
* functions没有值的时候默认为null
* functions存在值得时候默认为auto
* 也可以自定义
* <p>已过时</p>
*
* @see #toolChoice
*/
@Deprecated
@JsonProperty("function_call")
private Object functionCall;
/**
* 模型可能调用的工具列表。
* 当前版本仅支持functions
*
* @since 1.1.2
*/
private List<Tools> tools;
/**
* 取值String或者ToolChoiceObj
*
* @since 1.1.2
*/
@JsonProperty("tool_choice")
private Object toolChoice;
/**
* 使用什么取样温度0到2之间。较高的值(如0.8)将使输出更加随机,而较低的值(如0.2)将使输出更加集中和确定。
* <p>
* We generally recommend altering this or but not both.top_p
*/
@Builder.Default
private double temperature = 0.2;
/**
* 使用温度采样的替代方法称为核心采样其中模型考虑具有top_p概率质量的令牌的结果。因此0.1 意味着只考虑包含前 10% 概率质量的代币。
* <p>
* 我们通常建议更改此设置但不要同时更改两者。temperature
*/
@JsonProperty("top_p")
@Builder.Default
private Double topP = 1d;
/**
* 为每个提示生成的完成次数。
*/
@Builder.Default
private Integer n = 1;
/**
* 是否流式输出.
* default:false
*/
@Builder.Default
private boolean stream = false;
/**
* 停止输出标识
*/
private List<String> stop;
/**
* 最大支持4096
*/
@JsonProperty("max_tokens")
@Builder.Default
private Integer maxTokens = 2048;
@JsonProperty("presence_penalty")
@Builder.Default
private double presencePenalty = 0;
/**
* -2.0 ~~ 2.0
*/
@JsonProperty("frequency_penalty")
@Builder.Default
private double frequencyPenalty = 0;
@JsonProperty("logit_bias")
private Map logitBias;
/**
* 用户唯一值,确保接口不被重复调用
*/
private String user;
/**
* @since 1.1.2
*/
private Integer seed;
/**
* 最新模型参考官方文档:
* <a href="https://platform.openai.com/docs/models/model-endpoint-compatibility">官方稳定模型列表</a>
*/
@Getter
@AllArgsConstructor
public enum Model {
/**
* gpt-3.5-turbo
*/
GPT_3_5_TURBO("gpt-3.5-turbo"),
/**
* 临时模型不建议使用2023年9 月 13 日将被弃用
*/
@Deprecated
GPT_3_5_TURBO_0301("gpt-3.5-turbo-0301"),
/**
* gpt-3.5-turbo-0613 支持函数
*/
GPT_3_5_TURBO_1106("gpt-3.5-turbo-1106"),
GPT_3_5_TURBO_0613("gpt-3.5-turbo-0613"),
/**
* gpt-3.5-turbo-16k 超长上下文
*/
GPT_3_5_TURBO_16K("gpt-3.5-turbo-16k"),
/**
* gpt-3.5-turbo-16k-0613 超长上下文 支持函数
*/
GPT_3_5_TURBO_16K_0613("gpt-3.5-turbo-16k-0613"),
/**
* gpt-3.5-turbo-0125 超长上下文 支持函数
*/
GPT_3_5_TURBO_0125("gpt-3.5-turbo-0125"),
/**
* GPT4.0
*/
GPT_4("gpt-4"),
/**
* 临时模型不建议使用2023年9 月 13 日将被弃用
*/
@Deprecated
GPT_4_0314("gpt-4-0314"),
/**
* GPT4.0 超长上下文
*/
GPT_4_32K("gpt-4-32k"),
/**
* 临时模型不建议使用2023年9 月 13 日将被弃用
*/
@Deprecated
GPT_4_32K_0314("gpt-4-32k-0314"),
/**
* gpt-4-0613支持函数
*/
GPT_4_0613("gpt-4-0613"),
/**
* gpt-4-0613支持函数
*/
GPT_4_32K_0613("gpt-4-32k-0613"),
/**
* 支持数组模式支持function call支持可重复输出
*/
GPT_4_1106_PREVIEW("gpt-4-1106-preview"),
/**
* 支持图片
*/
GPT_4_VISION_PREVIEW("gpt-4-vision-preview"),
/**
* 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;
}
@Getter
@AllArgsConstructor
public enum ChatType {
/**
* 对话类型 - 输入
*/
CHAT_IN("in"),
/**
* 对话类型 - 输出
*/
CHAT_OUT("out"),
;
private final String name;
}
}

View File

@@ -0,0 +1,84 @@
package org.ruoyi.common.chat.entity.chat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import org.ruoyi.common.chat.entity.chat.tool.ToolCalls;
import java.io.Serializable;
import java.util.List;
/**
* 描述:
*
* @author https:www.unfbx.com
* @since 1.1.2
* 2023-03-02
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@AllArgsConstructor
public class BaseMessage implements Serializable {
/**
* 目前支持四个中角色参考官网,进行情景输入:
* https://platform.openai.com/docs/guides/chat/introduction
*/
private String role;
private String name;
/**
* The tool calls generated by the model, such as function calls.
* @since 1.1.2
*/
@JsonProperty("tool_calls")
private List<ToolCalls> toolCalls;
/**
* @since 1.1.2
*/
@JsonProperty("tool_call_id")
private String toolCallId;
@Deprecated
@JsonProperty("function_call")
private FunctionCall functionCall;
/**
* 构造函数
*
* @param role 角色
* @param name name
* @param functionCall functionCall
*/
public BaseMessage(String role, String name, FunctionCall functionCall) {
this.role = role;
this.name = name;
this.functionCall = functionCall;
}
public BaseMessage() {
}
@Getter
@AllArgsConstructor
public enum Role {
SYSTEM("system"),
USER("user"),
ASSISTANT("assistant"),
FUNCTION("function"),
TOOL("tool"),
;
private final String name;
}
}

View File

@@ -0,0 +1,31 @@
package org.ruoyi.common.chat.entity.chat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 描述:
*
* @author https:www.unfbx.com
* @since 2023-03-02
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class ChatChoice implements Serializable {
private long index;
/**
* 请求参数stream为true返回是delta
*/
@JsonProperty("delta")
private Message delta;
/**
* 请求参数stream为false返回是message
*/
@JsonProperty("message")
private Message message;
@JsonProperty("finish_reason")
private String finishReason;
}

View File

@@ -0,0 +1,34 @@
package org.ruoyi.common.chat.entity.chat;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.experimental.SuperBuilder;
import lombok.extern.slf4j.Slf4j;
import java.io.Serializable;
import java.util.List;
/**
* 描述: chat模型参数
*
* @author https:www.unfbx.com
* 2023-03-02
*/
@Data
@SuperBuilder
@Slf4j
@JsonInclude(JsonInclude.Include.NON_NULL)
@NoArgsConstructor
@AllArgsConstructor
public class ChatCompletion extends BaseChatCompletion implements Serializable {
/**
* 问题描述
*/
@NonNull
private List<Message> messages;
}

View File

@@ -0,0 +1,25 @@
package org.ruoyi.common.chat.entity.chat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import org.ruoyi.common.chat.entity.common.Usage;
import java.io.Serializable;
import java.util.List;
/**
* 描述: chat答案类
*
* @author https:www.unfbx.com
* 2023-03-02
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class ChatCompletionResponse implements Serializable {
private String id;
private String object;
private long created;
private String model;
private List<ChatChoice> choices;
private Usage usage;
}

View File

@@ -0,0 +1,32 @@
package org.ruoyi.common.chat.entity.chat;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import lombok.extern.slf4j.Slf4j;
import java.io.Serializable;
import java.util.List;
/**
* 描述: chat模型附带图片的参数
*
* @author https:www.unfbx.com
* @since 1.1.2
* 2023-11-10
*/
@Data
@SuperBuilder
@Slf4j
@JsonInclude(JsonInclude.Include.NON_NULL)
@NoArgsConstructor
@AllArgsConstructor
public class ChatCompletionWithPicture extends BaseChatCompletion implements Serializable {
/**
* 问题描述
*/
private List<MessagePicture> messages;
}

View File

@@ -0,0 +1,43 @@
package org.ruoyi.common.chat.entity.chat;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;
import lombok.extern.slf4j.Slf4j;
/**
* 描述:
*
* @author https://www.unfbx.com
* @since 1.1.2
* 2023-11-10
*/
@Data
@Builder
@Slf4j
@JsonInclude(JsonInclude.Include.NON_NULL)
@NoArgsConstructor
@AllArgsConstructor
public class Content {
/**
* 输入类型text、image_url
*
* @see Type
*/
private String type;
private String text;
@JsonProperty("image_url")
private ImageUrl imageUrl;
/**
* 生成图片风格
*/
@Getter
@AllArgsConstructor
public enum Type {
TEXT("text"),
IMAGE_URL("image_url"),
;
private final String name;
}
}

View File

@@ -0,0 +1,27 @@
package org.ruoyi.common.chat.entity.chat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 描述:函数调用返回值
*
* @author https://www.unfbx.com
* @since 2023-06-14
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class FunctionCall {
/**
* 方法名
*/
private String name;
/**
* 方法参数
*/
private String arguments;
}

View File

@@ -0,0 +1,46 @@
package org.ruoyi.common.chat.entity.chat;
import lombok.Builder;
import lombok.Data;
import java.io.Serializable;
/**
* 描述:方法参数实体类,实例数据如下
* <pre>
* {
* "name": "get_current_weather",
* "description": "Get the current weather in a given location",
* "parameters": {
* "type": "object",
* "properties": {
* "location": {
* "type": "string",
* "description": "The city and state, e.g. San Francisco, CA"
* },
* "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
* },
* "required": ["location"]
* },
* }
* </pre>
* @author https:www.unfbx.com
* @since 2023-06-14
*/
@Data
@Builder
public class Functions implements Serializable {
/**
* 方法名称
*/
private String name;
/**
* 方法描述
*/
private String description;
/**
* 方法参数
* 扩展参数可以继承Parameters自己实现json格式的数据
*/
private Parameters parameters;
}

View File

@@ -0,0 +1,28 @@
package org.ruoyi.common.chat.entity.chat;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* 描述:
*
* @author https://www.unfbx.com
* 2023-11-10
*/
@Data
@Builder
@Slf4j
@JsonInclude(JsonInclude.Include.NON_NULL)
@NoArgsConstructor
@AllArgsConstructor
public class ImageUrl {
/**
* 图片地址支持base64. eg: data:image/jpeg;base64,{base64_image} <p\>
* https://platform.openai.com/docs/guides/vision
*/
private String url;
}

View File

@@ -0,0 +1,116 @@
package org.ruoyi.common.chat.entity.chat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import java.io.Serializable;
/**
* 描述:
*
* @author https:www.unfbx.com
* @since 2023-03-02
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class Message implements Serializable {
/**
* 目前支持四个中角色参考官网,进行情景输入:
* https://platform.openai.com/docs/guides/chat/introduction
*/
private String role;
private Object content;
private String name;
@JsonProperty("function_call")
private FunctionCall functionCall;
public static Builder builder() {
return new Builder();
}
/**
* 构造函数
*
* @param role 角色
* @param content 描述主题信息
* @param name name
* @param functionCall functionCall
*/
public Message(String role, String content, String name, FunctionCall functionCall) {
this.role = role;
this.content = content;
this.name = name;
this.functionCall = functionCall;
}
public Message() {
}
private Message(Builder builder) {
setRole(builder.role);
setContent(builder.content);
setName(builder.name);
setFunctionCall(builder.functionCall);
}
@Getter
@AllArgsConstructor
public enum Role {
SYSTEM("system"),
USER("user"),
ASSISTANT("assistant"),
FUNCTION("function"),
;
private String name;
}
public static final class Builder {
private String role;
private String content;
private String name;
private FunctionCall functionCall;
public Builder() {
}
public Builder role(Role role) {
this.role = role.getName();
return this;
}
public Builder role(String role) {
this.role = role;
return this;
}
public Builder content(String content) {
this.content = content;
return this;
}
public Builder name(String name) {
this.name = name;
return this;
}
public Builder functionCall(FunctionCall functionCall) {
this.functionCall = functionCall;
return this;
}
public Message build() {
return new Message(this);
}
}
}

View File

@@ -0,0 +1,114 @@
package org.ruoyi.common.chat.entity.chat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.ruoyi.common.chat.entity.chat.tool.ToolCalls;
import java.io.Serializable;
import java.util.List;
/**
* 描述:
*
* @author https:www.unfbx.com
* @since 2023-03-02
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@AllArgsConstructor
public class MessagePicture extends BaseMessage implements Serializable {
/**
* Content数组支持多图片输入
* https://platform.openai.com/docs/guides/vision
*/
private List<Content> content;
public static Builder builder() {
return new Builder();
}
/**
* 构造函数
*
* @param role 角色
* @param name name
* @param content content
* @param functionCall functionCall
*/
public MessagePicture(String role, String name, List<Content> content, List<ToolCalls> toolCalls, String toolCallId, FunctionCall functionCall) {
this.content = content;
super.setRole(role);
super.setName(name);
super.setToolCalls(toolCalls);
super.setToolCallId(toolCallId);
super.setFunctionCall(functionCall);
}
public MessagePicture() {
}
private MessagePicture(Builder builder) {
setContent(builder.content);
super.setRole(builder.role);
super.setName(builder.name);
super.setFunctionCall(builder.functionCall);
super.setToolCalls(builder.toolCalls);
super.setToolCallId(builder.toolCallId);
}
public static final class Builder {
private String role;
private List<Content> content;
private String name;
private String toolCallId;
private List<ToolCalls> toolCalls;
private FunctionCall functionCall;
public Builder() {
}
public Builder role(Role role) {
this.role = role.getName();
return this;
}
public Builder role(String role) {
this.role = role;
return this;
}
public Builder content(List<Content> content) {
this.content = content;
return this;
}
public Builder name(String name) {
this.name = name;
return this;
}
public Builder functionCall(FunctionCall functionCall) {
this.functionCall = functionCall;
return this;
}
public Builder toolCalls(List<ToolCalls> toolCalls) {
this.toolCalls = toolCalls;
return this;
}
public Builder toolCallId(String toolCallId) {
this.toolCallId = toolCallId;
return this;
}
public MessagePicture build() {
return new MessagePicture(this);
}
}
}

View File

@@ -0,0 +1,42 @@
package org.ruoyi.common.chat.entity.chat;
import lombok.Builder;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 描述方法参数类扩展参数可以继承Parameters自己实现
* 参考:
* <pre>
* {
* "type": "object",
* "properties": {
* "location": {
* "type": "string",
* "description": "The city and state, e.g. San Francisco, CA"
* },
* "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
* },
* "required": ["location"]
* }
* </pre>
* @author https:www.unfbx.com
* @since 2023-06-14
*/
@Data
@Builder
public class Parameters implements Serializable {
/**
* 参数类型
*/
private String type;
/**
* 参数属性、描述
*/
private Object properties;
/**
* 方法必输字段
*/
private List<String> required;
}

View File

@@ -0,0 +1,28 @@
package org.ruoyi.common.chat.entity.chat;
import lombok.*;
/**
* 指定模型必须输出的格式的对象。
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ResponseFormat {
/**
* 默认text
*
* @see Type
*/
private String type;
@Getter
@AllArgsConstructor
public enum Type {
JSON_OBJECT("json_object"),
TEXT("text"),
;
private final String name;
}
}

View File

@@ -0,0 +1,31 @@
package org.ruoyi.common.chat.entity.chat.tool;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* ToolCall 的 Function参数
* The function that the model called.
*
* @author https:www.unfbx.com
* @since 1.1.2
* 2023-11-09
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ToolCallFunction implements Serializable {
/**
* 方法名
*/
private String name;
/**
* 方法参数
*/
private String arguments;
}

View File

@@ -0,0 +1,37 @@
package org.ruoyi.common.chat.entity.chat.tool;
import lombok.*;
import java.io.Serializable;
/**
* The tool calls generated by the model, such as function calls.
*
* @author <a href="https://www.unfbx.com">unfbx</a>
* @since 1.1.2
* 2023-11-09
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ToolCalls implements Serializable {
/**
* The ID of the tool call.
*/
private String id;
/**
* The type of the tool. Currently, only function is supported.
*/
private String type;
private ToolCallFunction function;
@Getter
@AllArgsConstructor
public enum Type {
FUNCTION("function"),
;
private final String name;
}
}

View File

@@ -0,0 +1,27 @@
package org.ruoyi.common.chat.entity.chat.tool;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import java.io.Serializable;
/**
* choice和object同时存在是以object为准
*
* @author <a href="https://www.unfbx.com">unfbx</a>
* @since 1.1.2
* 2023-11-09
*/
@Data
public class ToolChoice implements Serializable {
@Getter
@AllArgsConstructor
public enum Choice {
NONE("none"),
AUTO("auto"),
;
private final String name;
}
}

View File

@@ -0,0 +1,33 @@
package org.ruoyi.common.chat.entity.chat.tool;
import lombok.*;
/**
* @author <a href="https://www.unfbx.com">unfbx</a>
* @since 1.1.2
* 2023-11-09
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ToolChoiceObj {
/**
* 需要调用的方法名称
*/
private ToolChoiceObjFunction function;
/**
* 工具的类型。目前仅支持函数。
*
* @see Type
*/
private String type;
@Getter
@AllArgsConstructor
public enum Type {
FUNCTION("function"),
;
private final String name;
}
}

View File

@@ -0,0 +1,21 @@
package org.ruoyi.common.chat.entity.chat.tool;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author <a href="https://www.unfbx.com">unfbx</a>
* @since 1.1.2
* 2023-11-09
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ToolChoiceObjFunction {
private String name;
}

View File

@@ -0,0 +1,35 @@
package org.ruoyi.common.chat.entity.chat.tool;
import lombok.*;
import java.io.Serializable;
/**
* @author <a href="https://www.unfbx.com">unfbx</a>
* @since 1.1.2
* 2023-11-09
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Tools implements Serializable {
/**
* 目前只支持function
*
* @see Type
*/
private String type;
private ToolsFunction function;
@Getter
@AllArgsConstructor
public enum Type {
FUNCTION("function"),
;
private final String name;
}
}

View File

@@ -0,0 +1,36 @@
package org.ruoyi.common.chat.entity.chat.tool;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.ruoyi.common.chat.entity.chat.Parameters;
import java.io.Serializable;
/**
* @author <a href="https://www.unfbx.com">unfbx</a>
* @since 1.1.2
* 2023-11-09
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ToolsFunction implements Serializable {
/**
* 要调用的函数的名称。必须是 a-z、A-Z、0-9或包含下划线和破折号最大长度为 64
*/
private String name;
/**
* 对函数功能的描述,模型使用它来选择何时以及如何调用该函数。
*/
private String description;
/**
* 函数接受的参数,描述为 JSON Schema 对象
* 扩展参数可以继承Parameters自己实现json格式的数据
*/
private Parameters parameters;
}

View File

@@ -0,0 +1,23 @@
package org.ruoyi.common.chat.entity.common;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 描述:
*
* @author https:www.unfbx.com
* 2023-02-15
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Choice implements Serializable {
private String text;
private long index;
private Object logprobs;
@JsonProperty("finish_reason")
private String finishReason;
}

View File

@@ -0,0 +1,20 @@
package org.ruoyi.common.chat.entity.common;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import java.io.Serializable;
/**
* 描述:
*
* @author https:www.unfbx.com
* 2023-02-15
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class DeleteResponse implements Serializable {
private String id;
private String object;
private boolean deleted;
}

View File

@@ -0,0 +1,30 @@
package org.ruoyi.common.chat.entity.common;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 描述:
*
* @author https:www.unfbx.com
* 2023-02-15
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class OpenAiResponse<T> implements Serializable {
private String object;
private List<T> data;
private Error error;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Error {
private String message;
private String type;
private String param;
private String code;
}
}

View File

@@ -0,0 +1,24 @@
package org.ruoyi.common.chat.entity.common;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 描述:
*
* @author https:www.unfbx.com
* 2023-02-15
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Usage implements Serializable {
@JsonProperty("prompt_tokens")
private long promptTokens;
@JsonProperty("completion_tokens")
private long completionTokens;
@JsonProperty("total_tokens")
private long totalTokens;
}

View File

@@ -0,0 +1,125 @@
package org.ruoyi.common.chat.entity.completions;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;
import lombok.extern.slf4j.Slf4j;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
* 描述: 问题类
*
* @author https:www.unfbx.com
* 2023-02-11
*/
@Data
@Builder
@Slf4j
@JsonInclude(JsonInclude.Include.NON_NULL)
@NoArgsConstructor
@AllArgsConstructor
public class Completion implements Serializable {
@NonNull
@Builder.Default
private String model = Model.DAVINCI_003.getName();
/**
* 问题描述
*/
@NonNull
private String prompt;
/**
* 完成输出后的后缀,用于格式化输出结果
*/
private String suffix;
/**
* 最大支持4096
*/
@JsonProperty("max_tokens")
@Builder.Default
private Integer maxTokens = 2048;
/**
* 使用什么取样温度0到2之间。较高的值(如0.8)将使输出更加随机,而较低的值(如0.2)将使输出更加集中和确定。
* <p>
* We generally recommend altering this or but not both.top_p
*/
@Builder.Default
private double temperature = 0;
/**
* 使用温度采样的替代方法称为核心采样其中模型考虑具有top_p概率质量的令牌的结果。因此0.1 意味着只考虑包含前 10% 概率质量的代币。
* <p>
* 我们通常建议更改此设置但不要同时更改两者。temperature
*/
@JsonProperty("top_p")
@Builder.Default
private Double topP = 1d;
/**
* 为每个提示生成的完成次数。
*/
@Builder.Default
private Integer n = 1;
@Builder.Default
private boolean stream = false;
/**
* 最大值5
*/
private Integer logprobs;
@Builder.Default
private boolean echo = false;
private List<String> stop;
@JsonProperty("presence_penalty")
@Builder.Default
private double presencePenalty = 0;
/**
* -2.0 ~~ 2.0
*/
@JsonProperty("frequency_penalty")
@Builder.Default
private double frequencyPenalty = 0;
@JsonProperty("best_of")
@Builder.Default
private Integer bestOf = 1;
@JsonProperty("logit_bias")
private Map logitBias;
/**
* 用户唯一值,确保接口不被重复调用
*/
private String user;
/**
* 获取当前参数的tokens数
* @return token数量
*/
// public long tokens() {
// if (StrUtil.isBlank(this.prompt) || StrUtil.isBlank(this.model)) {
// log.warn("参数异常model{}prompt{}", this.model, this.prompt);
// return 0;
// }
// return TikTokensUtil.tokens(this.model, this.prompt);
// }
@Getter
@AllArgsConstructor
public enum Model {
DAVINCI_003("text-davinci-003"),
DAVINCI_002("text-davinci-002"),
DAVINCI("davinci"),
;
private String name;
}
}

View File

@@ -0,0 +1,26 @@
package org.ruoyi.common.chat.entity.completions;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import org.ruoyi.common.chat.entity.common.Choice;
import org.ruoyi.common.chat.entity.common.OpenAiResponse;
import org.ruoyi.common.chat.entity.common.Usage;
import java.io.Serializable;
/**
* 描述: 答案类
*
* @author https:www.unfbx.com
* 2023-02-11
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class CompletionResponse extends OpenAiResponse implements Serializable {
private String id;
private String object;
private long created;
private String model;
private Choice[] choices;
private Usage usage;
}

Some files were not shown because too many files have changed in this diff Show More