feat: gpt-4-gizmo-g-* model is supported

This commit is contained in:
RockYang 2024-01-15 15:03:05 +08:00
parent 59fa21779b
commit dc24a8c781
14 changed files with 86 additions and 31 deletions

View File

@ -435,7 +435,7 @@ func (h *ChatHandler) doRequest(ctx context.Context, req types.ApiRequest, platf
apiURL = strings.Replace(apiKey.ApiURL, "{model}", req.Model, 1) apiURL = strings.Replace(apiKey.ApiURL, "{model}", req.Model, 1)
break break
default: default:
if req.Model == "gpt-4-all" { if req.Model == "gpt-4-all" || strings.HasPrefix(req.Model, "gpt-4-gizmo-g-") {
apiURL = "https://gpt.bemore.lol/v1/chat/completions" apiURL = "https://gpt.bemore.lol/v1/chat/completions"
} else { } else {
apiURL = apiKey.ApiURL apiURL = apiKey.ApiURL

View File

@ -329,7 +329,7 @@ func (h *PaymentHandler) notify(orderNo string) error {
user.ImgCalls += remark.ImgCalls user.ImgCalls += remark.ImgCalls
} }
} else { // 非 VIP 用户 } else { // 非 VIP 用户
if remark.Days > 0 { // vip 套餐days > 0, calls == 0 if remark.Days > 0 { // vip 套餐days > 0, calls == 0
user.ExpiredTime = time.Now().AddDate(0, 0, remark.Days).Unix() user.ExpiredTime = time.Now().AddDate(0, 0, remark.Days).Unix()
user.Calls += h.App.SysConfig.VipMonthCalls user.Calls += h.App.SysConfig.VipMonthCalls

View File

@ -21,11 +21,11 @@ func NewUploadHandler(app *core.AppServer, db *gorm.DB, manager *oss.UploaderMan
} }
func (h *UploadHandler) Upload(c *gin.Context) { func (h *UploadHandler) Upload(c *gin.Context) {
fileURL, err := h.uploaderManager.GetUploadHandler().PutFile(c, "file") file, err := h.uploaderManager.GetUploadHandler().PutFile(c, "file")
if err != nil { if err != nil {
resp.ERROR(c, err.Error()) resp.ERROR(c, err.Error())
return return
} }
resp.SUCCESS(c, fileURL) resp.SUCCESS(c, file)
} }

View File

@ -44,16 +44,16 @@ func NewAliYunOss(appConfig *types.AppConfig) (*AliYunOss, error) {
} }
func (s AliYunOss) PutFile(ctx *gin.Context, name string) (string, error) { func (s AliYunOss) PutFile(ctx *gin.Context, name string) (File, error) {
// 解析表单 // 解析表单
file, err := ctx.FormFile(name) file, err := ctx.FormFile(name)
if err != nil { if err != nil {
return "", err return File{}, err
} }
// 打开上传文件 // 打开上传文件
src, err := file.Open() src, err := file.Open()
if err != nil { if err != nil {
return "", err return File{}, err
} }
defer src.Close() defer src.Close()
@ -62,10 +62,14 @@ func (s AliYunOss) PutFile(ctx *gin.Context, name string) (string, error) {
// 上传文件 // 上传文件
err = s.bucket.PutObject(objectKey, src) err = s.bucket.PutObject(objectKey, src)
if err != nil { if err != nil {
return "", err return File{}, err
} }
return fmt.Sprintf("%s/%s", s.config.Domain, objectKey), nil return File{
URL: fmt.Sprintf("%s/%s", s.config.Domain, objectKey),
Ext: fileExt,
Size: file.Size,
}, nil
} }
func (s AliYunOss) PutImg(imageURL string, useProxy bool) (string, error) { func (s AliYunOss) PutImg(imageURL string, useProxy bool) (string, error) {

View File

@ -23,23 +23,28 @@ func NewLocalStorage(config *types.AppConfig) LocalStorage {
} }
} }
func (s LocalStorage) PutFile(ctx *gin.Context, name string) (string, error) { func (s LocalStorage) PutFile(ctx *gin.Context, name string) (File, error) {
file, err := ctx.FormFile(name) file, err := ctx.FormFile(name)
if err != nil { if err != nil {
return "", fmt.Errorf("error with get form: %v", err) return File{}, fmt.Errorf("error with get form: %v", err)
} }
filePath, err := utils.GenUploadPath(s.config.BasePath, file.Filename) path, err := utils.GenUploadPath(s.config.BasePath, file.Filename)
if err != nil { if err != nil {
return "", fmt.Errorf("error with generate filename: %s", err.Error()) return File{}, fmt.Errorf("error with generate filename: %s", err.Error())
} }
// 将文件保存到指定路径 // 将文件保存到指定路径
err = ctx.SaveUploadedFile(file, filePath) err = ctx.SaveUploadedFile(file, path)
if err != nil { if err != nil {
return "", fmt.Errorf("error with save upload file: %s", err.Error()) return File{}, fmt.Errorf("error with save upload file: %s", err.Error())
} }
return utils.GenUploadUrl(s.config.BasePath, s.config.BaseURL, filePath), nil ext := filepath.Ext(file.Filename)
return File{
URL: utils.GenUploadUrl(s.config.BasePath, s.config.BaseURL, path),
Ext: ext,
Size: file.Size,
}, nil
} }
func (s LocalStorage) PutImg(imageURL string, useProxy bool) (string, error) { func (s LocalStorage) PutImg(imageURL string, useProxy bool) (string, error) {

View File

@ -65,15 +65,15 @@ func (s MiniOss) PutImg(imageURL string, useProxy bool) (string, error) {
return fmt.Sprintf("%s/%s/%s", s.config.Domain, s.config.Bucket, info.Key), nil return fmt.Sprintf("%s/%s/%s", s.config.Domain, s.config.Bucket, info.Key), nil
} }
func (s MiniOss) PutFile(ctx *gin.Context, name string) (string, error) { func (s MiniOss) PutFile(ctx *gin.Context, name string) (File, error) {
file, err := ctx.FormFile(name) file, err := ctx.FormFile(name)
if err != nil { if err != nil {
return "", fmt.Errorf("error with get form: %v", err) return File{}, fmt.Errorf("error with get form: %v", err)
} }
// Open the uploaded file // Open the uploaded file
fileReader, err := file.Open() fileReader, err := file.Open()
if err != nil { if err != nil {
return "", fmt.Errorf("error opening file: %v", err) return File{}, fmt.Errorf("error opening file: %v", err)
} }
defer fileReader.Close() defer fileReader.Close()
@ -83,10 +83,14 @@ func (s MiniOss) PutFile(ctx *gin.Context, name string) (string, error) {
ContentType: file.Header.Get("Content-Type"), ContentType: file.Header.Get("Content-Type"),
}) })
if err != nil { if err != nil {
return "", fmt.Errorf("error uploading to MinIO: %v", err) return File{}, fmt.Errorf("error uploading to MinIO: %v", err)
} }
return fmt.Sprintf("%s/%s/%s", s.config.Domain, s.config.Bucket, info.Key), nil return File{
URL: fmt.Sprintf("%s/%s/%s", s.config.Domain, s.config.Bucket, info.Key),
Ext: fileExt,
Size: file.Size,
}, nil
} }
func (s MiniOss) Delete(fileURL string) error { func (s MiniOss) Delete(fileURL string) error {

View File

@ -50,16 +50,16 @@ func NewQiNiuOss(appConfig *types.AppConfig) QinNiuOss {
} }
} }
func (s QinNiuOss) PutFile(ctx *gin.Context, name string) (string, error) { func (s QinNiuOss) PutFile(ctx *gin.Context, name string) (File, error) {
// 解析表单 // 解析表单
file, err := ctx.FormFile(name) file, err := ctx.FormFile(name)
if err != nil { if err != nil {
return "", err return File{}, err
} }
// 打开上传文件 // 打开上传文件
src, err := file.Open() src, err := file.Open()
if err != nil { if err != nil {
return "", err return File{}, err
} }
defer src.Close() defer src.Close()
@ -70,10 +70,15 @@ func (s QinNiuOss) PutFile(ctx *gin.Context, name string) (string, error) {
extra := storage.PutExtra{} extra := storage.PutExtra{}
err = s.uploader.Put(ctx, &ret, s.putPolicy.UploadToken(s.mac), key, src, file.Size, &extra) err = s.uploader.Put(ctx, &ret, s.putPolicy.UploadToken(s.mac), key, src, file.Size, &extra)
if err != nil { if err != nil {
return "", err return File{}, err
} }
return fmt.Sprintf("%s/%s", s.config.Domain, ret.Key), nil return File{
URL: fmt.Sprintf("%s/%s", s.config.Domain, ret.Key),
Ext: fileExt,
Size: file.Size,
}, nil
} }
func (s QinNiuOss) PutImg(imageURL string, useProxy bool) (string, error) { func (s QinNiuOss) PutImg(imageURL string, useProxy bool) (string, error) {

View File

@ -2,8 +2,13 @@ package oss
import "github.com/gin-gonic/gin" import "github.com/gin-gonic/gin"
type File struct {
Size int64
URL string
Ext string
}
type Uploader interface { type Uploader interface {
PutFile(ctx *gin.Context, name string) (string, error) PutFile(ctx *gin.Context, name string) (File, error)
PutImg(imageURL string, useProxy bool) (string, error) PutImg(imageURL string, useProxy bool) (string, error)
Delete(fileURL string) error Delete(fileURL string) error
} }

12
api/store/model/file.go Normal file
View File

@ -0,0 +1,12 @@
package model
import "time"
type File struct {
Id uint `gorm:"primarykey;column:id"`
UserId uint
URL string
Ext string
Size int64
CreatedAt time.Time
}

10
api/store/vo/File.go Normal file
View File

@ -0,0 +1,10 @@
package vo
type File struct {
Id uint
UserId uint `json:"user_id"`
URL string `json:"url"`
Ext string `json:"ext"`
Size int64 `json:"size"`
CreatedAt int64 `json:"created_at"`
}

View File

@ -1,2 +1,12 @@
ALTER TABLE `chatgpt_orders` CHANGE `mobile` `username` VARCHAR(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户明'; ALTER TABLE `chatgpt_orders` CHANGE `mobile` `username` VARCHAR(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户明';
ALTER TABLE `chatgpt_invite_logs` CHANGE `username` `username` VARCHAR(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名'; ALTER TABLE `chatgpt_invite_logs` CHANGE `username` `username` VARCHAR(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名';
CREATE TABLE `chatgpt_plus`.`chatgpt_files` (
`id` INT(11) NOT NULL AUTO_INCREMENT ,
`user_id` INT(11) NOT NULL COMMENT '用户 ID' ,
`url` VARCHAR(255) NOT NULL COMMENT '文件地址' ,
`ext` VARCHAR(10) NOT NULL COMMENT '文件后缀' ,
`created_at` DATETIME NOT NULL COMMENT '创建时间' ,
PRIMARY KEY (`id`)) ENGINE = InnoDB COMMENT = '用户文件表';
ALTER TABLE `chatgpt_files` ADD `size` BIGINT(20) NOT NULL DEFAULT '0' COMMENT '文件大小' AFTER `ext`;

View File

@ -93,7 +93,7 @@ const afterRead = (file) => {
formData.append('file', result, result.name); formData.append('file', result, result.name);
// //
httpPost('/api/upload', formData).then((res) => { httpPost('/api/upload', formData).then((res) => {
user.value.avatar = res.data user.value.avatar = res.data.url
ElMessage.success({message: "上传成功", duration: 500}) ElMessage.success({message: "上传成功", duration: 500})
}).catch((e) => { }).catch((e) => {
ElMessage.error('图片上传失败:' + e.message) ElMessage.error('图片上传失败:' + e.message)

View File

@ -668,7 +668,7 @@ const afterRead = (file) => {
formData.append('file', result, result.name); formData.append('file', result, result.name);
// //
httpPost('/api/upload', formData).then((res) => { httpPost('/api/upload', formData).then((res) => {
params.value.img = res.data params.value.img = res.data.url
ElMessage.success('上传成功') ElMessage.success('上传成功')
}).catch((e) => { }).catch((e) => {
ElMessage.error('上传失败:' + e.message) ElMessage.error('上传失败:' + e.message)

View File

@ -316,7 +316,7 @@ const uploadRewardImg = (file) => {
formData.append('file', result, result.name); formData.append('file', result, result.name);
// //
httpPost('/api/upload', formData).then((res) => { httpPost('/api/upload', formData).then((res) => {
system.value['reward_img'] = res.data system.value['reward_img'] = res.data.url
ElMessage.success('上传成功') ElMessage.success('上传成功')
}).catch((e) => { }).catch((e) => {
ElMessage.error('上传失败:' + e.message) ElMessage.error('上传失败:' + e.message)