mirror of
https://gitee.com/blackfox/geekai.git
synced 2025-12-06 16:58:24 +08:00
Merge branch 'v4.2.1' of https://gitee.com/blackfox/geekai-plus into v4.2.1
This commit is contained in:
commit
4dcb0d850c
@ -144,15 +144,15 @@ type SystemConfig struct {
|
||||
OrderPayTimeout int `json:"order_pay_timeout,omitempty"` //订单支付超时时间
|
||||
VipInfoText string `json:"vip_info_text,omitempty"` // 会员页面充值说明
|
||||
|
||||
MjPower int `json:"mj_power,omitempty"` // MJ 绘画消耗算力
|
||||
MjActionPower int `json:"mj_action_power,omitempty"` // MJ 操作(放大,变换)消耗算力
|
||||
SdPower int `json:"sd_power,omitempty"` // SD 绘画消耗算力
|
||||
DallPower int `json:"dall_power,omitempty"` // DALL-E-3 绘图消耗算力
|
||||
SunoPower int `json:"suno_power,omitempty"` // Suno 生成歌曲消耗算力
|
||||
LumaPower int `json:"luma_power,omitempty"` // Luma 生成视频消耗算力
|
||||
KeLingPower int `json:"keling_power,omitempty"` // 可灵生成视频消耗算力
|
||||
AdvanceVoicePower int `json:"advance_voice_power,omitempty"` // 高级语音对话消耗算力
|
||||
PromptPower int `json:"prompt_power,omitempty"` // 生成提示词消耗算力
|
||||
MjPower int `json:"mj_power,omitempty"` // MJ 绘画消耗算力
|
||||
MjActionPower int `json:"mj_action_power,omitempty"` // MJ 操作(放大,变换)消耗算力
|
||||
SdPower int `json:"sd_power,omitempty"` // SD 绘画消耗算力
|
||||
DallPower int `json:"dall_power,omitempty"` // DALL-E-3 绘图消耗算力
|
||||
SunoPower int `json:"suno_power,omitempty"` // Suno 生成歌曲消耗算力
|
||||
LumaPower int `json:"luma_power,omitempty"` // Luma 生成视频消耗算力
|
||||
KeLingPowers map[string]int `json:"keling_powers,omitempty"` // 可灵生成视频消耗算力
|
||||
AdvanceVoicePower int `json:"advance_voice_power,omitempty"` // 高级语音对话消耗算力
|
||||
PromptPower int `json:"prompt_power,omitempty"` // 生成提示词消耗算力
|
||||
|
||||
WechatCardURL string `json:"wechat_card_url,omitempty"` // 微信客服地址
|
||||
|
||||
@ -171,6 +171,5 @@ type SystemConfig struct {
|
||||
EmailWhiteList []string `json:"email_white_list"` // 邮箱白名单列表
|
||||
TranslateModelId int `json:"translate_model_id"` // 用来做提示词翻译的大模型 id
|
||||
MaxFileSize int `json:"max_file_size"` // 最大文件大小,单位:MB
|
||||
License string `json:"license"` // License
|
||||
|
||||
}
|
||||
|
||||
@ -91,7 +91,8 @@ type SunoTask struct {
|
||||
Title string `json:"title"`
|
||||
RefTaskId string `json:"ref_task_id,omitempty"`
|
||||
RefSongId string `json:"ref_song_id,omitempty"`
|
||||
Prompt string `json:"prompt"` // 提示词/歌词
|
||||
Prompt string `json:"prompt"` // 提示词
|
||||
Lyrics string `json:"lyrics,omitempty"` // 歌词
|
||||
Tags string `json:"tags"`
|
||||
Model string `json:"model"`
|
||||
Instrumental bool `json:"instrumental"` // 是否纯音乐
|
||||
|
||||
@ -48,6 +48,7 @@ func (h *ConfigHandler) Update(c *gin.Context) {
|
||||
}
|
||||
|
||||
if err := c.ShouldBindJSON(&data); err != nil {
|
||||
logger.Errorf("Update config failed: %v", err)
|
||||
resp.ERROR(c, types.InvalidArgs)
|
||||
return
|
||||
}
|
||||
@ -131,14 +132,6 @@ func (h *ConfigHandler) Active(c *gin.Context) {
|
||||
resp.ERROR(c, err.Error())
|
||||
return
|
||||
}
|
||||
h.App.SysConfig.License = data.License
|
||||
|
||||
// 将 license 写入数据库
|
||||
err = h.DB.Model(&model.Config{}).Where("marker", "system").UpdateColumn("config_json", utils.JsonEncode(h.App.SysConfig)).Error
|
||||
if err != nil {
|
||||
resp.ERROR(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
resp.SUCCESS(c)
|
||||
|
||||
@ -153,7 +146,6 @@ func (h *ConfigHandler) GetLicense(c *gin.Context) {
|
||||
// FixData 修复数据
|
||||
func (h *ConfigHandler) FixData(c *gin.Context) {
|
||||
resp.ERROR(c, "当前升级版本没有数据需要修正!")
|
||||
return
|
||||
//var fixed bool
|
||||
//version := "data_fix_4.1.4"
|
||||
//err := h.levelDB.Get(version, &fixed)
|
||||
|
||||
@ -18,9 +18,10 @@ import (
|
||||
"geekai/store/vo"
|
||||
"geekai/utils"
|
||||
"geekai/utils/resp"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
"time"
|
||||
)
|
||||
|
||||
type SunoHandler struct {
|
||||
@ -96,6 +97,7 @@ func (h *SunoHandler) Create(c *gin.Context) {
|
||||
RefSongId: data.RefSongId,
|
||||
ExtendSecs: data.ExtendSecs,
|
||||
Prompt: data.Prompt,
|
||||
Lyrics: data.Lyrics,
|
||||
Tags: data.Tags,
|
||||
Model: data.Model,
|
||||
Instrumental: data.Instrumental,
|
||||
|
||||
@ -281,6 +281,8 @@ func (h *VideoHandler) Remove(c *gin.Context) {
|
||||
// 删除文件
|
||||
_ = h.uploader.GetUploadHandler().Delete(job.CoverURL)
|
||||
_ = h.uploader.GetUploadHandler().Delete(job.VideoURL)
|
||||
|
||||
resp.SUCCESS(c)
|
||||
}
|
||||
|
||||
func (h *VideoHandler) Publish(c *gin.Context) {
|
||||
|
||||
@ -13,9 +13,6 @@ import (
|
||||
"geekai/core"
|
||||
"geekai/core/types"
|
||||
"geekai/store"
|
||||
"geekai/store/model"
|
||||
"geekai/utils"
|
||||
"gorm.io/gorm"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@ -25,27 +22,17 @@ import (
|
||||
|
||||
type LicenseService struct {
|
||||
config types.ApiConfig
|
||||
db *gorm.DB
|
||||
levelDB *store.LevelDB
|
||||
license *types.License
|
||||
urlWhiteList []string
|
||||
machineId string
|
||||
}
|
||||
|
||||
func NewLicenseService(server *core.AppServer, levelDB *store.LevelDB, db *gorm.DB) *LicenseService {
|
||||
func NewLicenseService(server *core.AppServer, levelDB *store.LevelDB) *LicenseService {
|
||||
var license types.License
|
||||
var machineId string
|
||||
err := levelDB.Get(types.LicenseKey, &license)
|
||||
logger.Infof("License: %+v", server.SysConfig)
|
||||
if err != nil {
|
||||
var cfg model.Config
|
||||
db.Where("marker", "system").First(&cfg)
|
||||
var sysConfig types.SystemConfig
|
||||
if err := utils.JsonDecode(cfg.Config, &sysConfig); err == nil {
|
||||
license.Key = sysConfig.License
|
||||
license.IsActive = true
|
||||
}
|
||||
}
|
||||
info, err := host.Info()
|
||||
if err == nil {
|
||||
machineId = info.HostID
|
||||
|
||||
@ -134,7 +134,7 @@ func (s *Service) Create(task types.SunoTask) (RespVo, error) {
|
||||
if task.Type == 1 {
|
||||
reqBody["gpt_description_prompt"] = task.Prompt
|
||||
} else { // 自定义模式
|
||||
reqBody["prompt"] = task.Prompt
|
||||
reqBody["prompt"] = task.Lyrics
|
||||
reqBody["tags"] = task.Tags
|
||||
reqBody["mv"] = task.Model
|
||||
reqBody["title"] = task.Title
|
||||
|
||||
@ -44,20 +44,41 @@ const ImagePromptOptimizeTemplate = `
|
||||
const LyricPromptTemplate = `
|
||||
你是一位才华横溢的作曲家,拥有丰富的情感和细腻的笔触,你对文字有着独特的感悟力,能将各种情感和意境巧妙地融入歌词中。
|
||||
请以【%s】为主题创作一首歌曲,歌曲时间不要太短,3分钟左右,不要输出任何解释性的内容。
|
||||
输出格式如下:
|
||||
下面是一个标准的歌词输出模板:
|
||||
歌曲名称
|
||||
第一节:
|
||||
{{歌词内容}}
|
||||
副歌:
|
||||
{{歌词内容}}
|
||||
|
||||
第二节:
|
||||
{{歌词内容}}
|
||||
副歌:
|
||||
{{歌词内容}}
|
||||
[Verse]
|
||||
[歌词]
|
||||
|
||||
尾声:
|
||||
{{歌词内容}}
|
||||
[Verse 2]
|
||||
[歌词]
|
||||
|
||||
[Chorus]
|
||||
[歌词]
|
||||
|
||||
[Verse 3]
|
||||
[歌词]
|
||||
|
||||
[Bridge]
|
||||
[歌词]
|
||||
|
||||
[Chorus]
|
||||
[歌词]
|
||||
|
||||
[Verse 4]
|
||||
[歌词]
|
||||
|
||||
[Bridge]
|
||||
假如此刻眼泪能倒流
|
||||
让我学会微笑不掩忧
|
||||
一次次的碎片堆积的愁
|
||||
最终也会开成希望的秋
|
||||
|
||||
[Chorus]
|
||||
假如我还能牵你的手
|
||||
天空也许会更蔚蓝悠游
|
||||
曾经那些未完成的错过
|
||||
愿能变成今天的收获
|
||||
`
|
||||
|
||||
const VideoPromptTemplate = `## 任务描述
|
||||
|
||||
@ -519,7 +519,7 @@ func (s *Service) KeLingCreate(task types.VideoTask) (KeLingRespVo, error) {
|
||||
|
||||
// 2. 构建API请求参数
|
||||
payload := map[string]interface{}{
|
||||
"model": params.Model,
|
||||
"model_name": params.Model,
|
||||
"prompt": task.Prompt,
|
||||
"negative_prompt": params.NegPrompt,
|
||||
"cfg_scale": params.CfgScale,
|
||||
|
||||
@ -243,8 +243,24 @@
|
||||
<el-form-item label="Luma 算力" prop="luma_power">
|
||||
<el-input v-model.number="system['luma_power']" placeholder="使用 Luma 生成一段视频消耗算力" />
|
||||
</el-form-item>
|
||||
<el-form-item label="可灵算力" prop="keling_power">
|
||||
<el-input v-model.number="system['keling_power']" placeholder="使用快手可灵生成一段视频消耗算力" />
|
||||
<el-form-item>
|
||||
<template #label>
|
||||
<div class="label-title">
|
||||
可灵算力
|
||||
<el-tooltip effect="dark" content="可灵每个模型价格不一样,具体请参考:https://api.geekai.pro/models" raw-content placement="right">
|
||||
<el-icon>
|
||||
<InfoFilled />
|
||||
</el-icon>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</template>
|
||||
<el-row :gutter="20" v-if="system['keling_powers']">
|
||||
<el-col :span="6" v-for="[key] in Object.entries(system['keling_powers'])" :key="key">
|
||||
<el-form-item :label="key" label-position="left">
|
||||
<el-input v-model.number="system['keling_powers'][key]" size="small" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<template #label>
|
||||
@ -412,6 +428,20 @@ onMounted(() => {
|
||||
httpGet("/api/admin/config/get?key=system")
|
||||
.then((res) => {
|
||||
system.value = res.data;
|
||||
system.value.keling_powers = system.value.keling_powers || {
|
||||
"kling-v1-6_std_5": 240,
|
||||
"kling-v1-6_std_10": 480,
|
||||
"kling-v1-6_pro_5": 420,
|
||||
"kling-v1-6_pro_10": 840,
|
||||
"kling-v1-5_std_5": 240,
|
||||
"kling-v1-5_std_10": 480,
|
||||
"kling-v1-5_pro_5": 420,
|
||||
"kling-v1-5_pro_10": 840,
|
||||
"kling-v1_std_5": 120,
|
||||
"kling-v1_std_10": 240,
|
||||
"kling-v1_pro_5": 420,
|
||||
"kling-v1_pro_10": 840,
|
||||
};
|
||||
configBak.value = copyObj(system.value);
|
||||
})
|
||||
.catch((e) => {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user