mirror of
https://github.com/yangjian102621/geekai.git
synced 2025-09-19 01:36:38 +08:00
feat: gpt-4-gizmo-g-* model is supported
This commit is contained in:
parent
59fa21779b
commit
dc24a8c781
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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 {
|
||||||
|
@ -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) {
|
||||||
|
@ -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
12
api/store/model/file.go
Normal 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
10
api/store/vo/File.go
Normal 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"`
|
||||||
|
}
|
@ -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`;
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user