From fbd599194c81b249d970640cca4c683a63a0e1c6 Mon Sep 17 00:00:00 2001 From: RockYang Date: Sun, 8 Oct 2023 17:48:50 +0800 Subject: [PATCH] feat: add system config item for reward image, add app config item to use custom text2img param json file --- api/core/config.go | 2 +- api/core/types/config.go | 8 +- api/res/text2img.json | 203 ++++++++++++++++++++++++++++++ api/service/sd/service.go | 37 +++--- api/service/sd/types.go | 108 ++-------------- api/test/test.go | 9 +- web/src/views/ChatPlus.vue | 1 + web/src/views/ImageSd.vue | 13 +- web/src/views/admin/SysConfig.vue | 46 ++++++- 9 files changed, 296 insertions(+), 131 deletions(-) create mode 100644 api/res/text2img.json diff --git a/api/core/config.go b/api/core/config.go index 28be3cad..95c8953a 100644 --- a/api/core/config.go +++ b/api/core/config.go @@ -34,7 +34,7 @@ func NewDefaultConfig() *types.AppConfig { }, }, MjConfig: types.MidJourneyConfig{Enabled: false}, - SdConfig: types.StableDiffusionConfig{Enabled: false}, + SdConfig: types.StableDiffusionConfig{Enabled: false, Txt2ImgJsonPath: "res/text2img.json"}, WeChatBot: false, } } diff --git a/api/core/types/config.go b/api/core/types/config.go index 85067dde..34fdbdce 100644 --- a/api/core/types/config.go +++ b/api/core/types/config.go @@ -42,9 +42,10 @@ type WeChatConfig struct { } type StableDiffusionConfig struct { - Enabled bool - ApiURL string - ApiKey string + Enabled bool + ApiURL string + ApiKey string + Txt2ImgJsonPath string } type AliYunSmsConfig struct { @@ -112,4 +113,5 @@ type SystemConfig struct { EnabledRegister bool `json:"enabled_register"` EnabledMsg bool `json:"enabled_msg"` // 启用短信验证码服务 EnabledDraw bool `json:"enabled_draw"` // 启动 AI 绘画功能 + RewardImg string `json:"reward_img"` // 众筹收款二维码地址 } diff --git a/api/res/text2img.json b/api/res/text2img.json new file mode 100644 index 00000000..dd2a7c80 --- /dev/null +++ b/api/res/text2img.json @@ -0,0 +1,203 @@ +{ + "fn_index": 405, + "data": [ + "task(x690lsugziqd8x9)", + "A chinese girl Walking the streets of ancient China", + "", + [], + 20, + "DPM++ 2M Karras", + false, + false, + 1, + 1, + 7, + -1, + -1, + 0, + 0, + 0, + false, + 256, + 256, + false, + 0.7, + 2, + "Latent", + 0, + 0, + 0, + [], + "None", + false, + "MultiDiffusion", + false, + 10, + 1, + 1, + 64, + false, + true, + 1024, + 1024, + 96, + 96, + 48, + 1, + "None", + 2, + false, + false, + false, + false, + false, + 0.4, + 0.4, + 0.2, + 0.2, + "", + "", + "Background", + 0.2, + -1, + false, + 0.4, + 0.4, + 0.2, + 0.2, + "", + "", + "Background", + 0.2, + -1, + false, + 0.4, + 0.4, + 0.2, + 0.2, + "", + "", + "Background", + 0.2, + -1, + false, + 0.4, + 0.4, + 0.2, + 0.2, + "", + "", + "Background", + 0.2, + -1, + false, + 0.4, + 0.4, + 0.2, + 0.2, + "", + "", + "Background", + 0.2, + -1, + false, + 0.4, + 0.4, + 0.2, + 0.2, + "", + "", + "Background", + 0.2, + -1, + false, + 0.4, + 0.4, + 0.2, + 0.2, + "", + "", + "Background", + 0.2, + -1, + false, + 0.4, + 0.4, + 0.2, + 0.2, + "", + "", + "Background", + 0.2, + -1, + false, + false, + true, + true, + false, + 1536, + 96, + false, + false, + "LoRA", + "None", + 1, + 1, + "LoRA", + "None", + 1, + 1, + "LoRA", + "None", + 1, + 1, + "LoRA", + "None", + 1, + 1, + "LoRA", + "None", + 1, + 1, + null, + "Refresh models", + null, + null, + null, + null, + false, + false, + "positive", + "comma", + 0, + false, + false, + "", + "Seed", + "", + "Nothing", + "", + "Nothing", + "", + true, + false, + false, + false, + 0, + null, + false, + null, + false, + null, + false, + null, + false, + 50, + [], + "", + "", + "" + ], + "event_data": null, + "session_hash": "fxz5yw7n1a4" +} \ No newline at end of file diff --git a/api/service/sd/service.go b/api/service/sd/service.go index a95b9cc9..ed7ff531 100644 --- a/api/service/sd/service.go +++ b/api/service/sd/service.go @@ -8,11 +8,13 @@ import ( "chatplus/store/vo" "chatplus/utils" "context" + "encoding/json" "fmt" "github.com/go-redis/redis/v8" "github.com/imroc/req/v3" "gorm.io/gorm" "io" + "os" "strconv" "time" ) @@ -85,11 +87,18 @@ func (s *Service) PushTask(task types.SdTask) { // Txt2Img 文生图 API func (s *Service) Txt2Img(task types.SdTask) error { - var data []interface{} - err := utils.JsonDecode(Text2ImgParamTemplate, &data) + var taskInfo TaskInfo + bytes, err := os.ReadFile(s.config.Txt2ImgJsonPath) if err != nil { - return err + return fmt.Errorf("error with load text2img json template file: %s", err.Error()) } + + err = json.Unmarshal(bytes, &taskInfo) + if err != nil { + return fmt.Errorf("error with decode json params: %s", err.Error()) + } + + data := taskInfo.Data params := task.Params data[ParamKeys["task_id"]] = params.TaskId data[ParamKeys["prompt"]] = params.Prompt @@ -107,16 +116,12 @@ func (s *Service) Txt2Img(task types.SdTask) error { data[ParamKeys["hd_scale_alg"]] = params.HdScaleAlg data[ParamKeys["hd_sample_num"]] = params.HdSteps + taskInfo.SessionId = task.SessionId + taskInfo.TaskId = params.TaskId + taskInfo.Data = data + taskInfo.JobId = task.Id go func() { - s.runTask(TaskInfo{ - SessionId: task.SessionId, - JobId: task.Id, - TaskId: params.TaskId, - Data: data, - EventData: nil, - FnIndex: 232, - SessionHash: "ycaxgzm9ah", - }, s.httpClient) + s.runTask(taskInfo, s.httpClient) }() return nil } @@ -177,9 +182,7 @@ func (s *Service) runTask(taskInfo TaskInfo, client *req.Client) { return } - //for k, v := range info { - // fmt.Println(k, " => ", v) - //} + // 获取真实的 seed 值 cbReq.ImageName = images[0].Name seed, _ := strconv.ParseInt(utils.InterfaceToString(info["seed"]), 10, 64) cbReq.Seed = seed @@ -278,7 +281,7 @@ func (s *Service) callback(data CBReq) { return } - if data.Progress < 100 { + if data.Progress < 100 && data.ImageData != "" { jobVo.ImgURL = data.ImageData } @@ -295,7 +298,7 @@ func (s *Service) callback(data CBReq) { utils.ReplyChunkMessage(client, vo.SdJob{ Id: uint(data.JobId), Progress: -1, - Prompt: fmt.Sprintf("任务[%s]执行失败,已删除!", data.TaskId), + TaskId: data.TaskId, }) } } diff --git a/api/service/sd/types.go b/api/service/sd/types.go index ec6a33aa..04901a5a 100644 --- a/api/service/sd/types.go +++ b/api/service/sd/types.go @@ -5,13 +5,13 @@ import logger2 "chatplus/logger" var logger = logger2.GetLogger() type TaskInfo struct { - SessionId string - JobId int - TaskId string - Data []interface{} - EventData interface{} - FnIndex int - SessionHash string + SessionId string `json:"session_id"` + JobId int `json:"job_id"` + TaskId string `json:"task_id"` + Data []interface{} `json:"data"` + EventData interface{} `json:"event_data"` + FnIndex int `json:"fn_index"` + SessionHash string `json:"session_hash"` } type CBReq struct { @@ -43,97 +43,3 @@ var ParamKeys = map[string]int{ "hd_scale_alg": 22, // 高清修复放大算法 "hd_sample_num": 23, // 高清修复采样次数 } - -const Text2ImgParamTemplate = `[ - "task(6sm0b3j17tag2gd)", - "A beautiful Chinese girl wearing a cheongsam walks on the bluestone street", - "", - [], - 50, - "Euler a", - false, - false, - 1, - 1, - 15, - null, - -1, - 0, - 0, - 0, - false, - 768, - 512, - false, - 0.7, - 2, - "ESRGAN_4x", - 10, - 0, - 0, - "Use same sampler", - "", - "", - [], - "None", - null, - false, - false, - "positive", - "comma", - 0, - false, - false, - "", - "Seed", - "", - [], - "Nothing", - "", - [], - "Nothing", - "", - [], - true, - false, - false, - false, - 0, - "Not set", - true, - true, - "", - "", - "", - "", - "", - 1.3, - "Not set", - "Not set", - 1.3, - "Not set", - 1.3, - "Not set", - 1.3, - 1.3, - "Not set", - 1.3, - "Not set", - 1.3, - "Not set", - 1.3, - "Not set", - 1.3, - "Not set", - 1.3, - "Not set", - false, - "None", - null, - false, - 50, - [], - "", - "", - "" -]` diff --git a/api/test/test.go b/api/test/test.go index b327c799..62c0e4de 100644 --- a/api/test/test.go +++ b/api/test/test.go @@ -2,16 +2,13 @@ package main import ( "fmt" - "net/url" - "path" + "os" ) func main() { - imgURL := "https://www.baidu.com/static/upload/2023/10/1696497571220711277.png?ex=6530f4a2&is=651e7fa28hmFd709d069ca05d7855ebdae42e5aa436883a36f9310d546" - parse, err := url.Parse(imgURL) + bytes, err := os.ReadFile("res/text2img.json") if err != nil { panic(err) } - - fmt.Println(path.Ext(parse.Path)) + fmt.Println(string(bytes)) } diff --git a/web/src/views/ChatPlus.vue b/web/src/views/ChatPlus.vue index 7a618fd6..c3974215 100644 --- a/web/src/views/ChatPlus.vue +++ b/web/src/views/ChatPlus.vue @@ -358,6 +358,7 @@ onMounted(() => { httpGet("/api/admin/config/get?key=system").then(res => { title.value = res.data.title + rewardImg.value = res.data.reward_img }).catch(e => { ElMessage.error("获取系统配置失败:" + e.message) }) diff --git a/web/src/views/ImageSd.vue b/web/src/views/ImageSd.vue index bea9a074..0befe858 100644 --- a/web/src/views/ImageSd.vue +++ b/web/src/views/ImageSd.vue @@ -241,7 +241,7 @@
- 图片比例: + 反向提示词: { finishedJobs.value.unshift(data) } previewImgList.value.unshift(data["img_url"]) + } else if (data.progress === -1) { // 任务执行失败 + ElNotification({ + title: '任务执行失败', + message: "任务ID:" + data['task_id'], + type: 'error', + }) + runningJobs.value = removeArrayItem(runningJobs.value, data, (v1, v2) => v1.id === v2.id) + } else { // 启动新的任务 for (let i = 0; i < runningJobs.value.length; i++) { if (runningJobs.value[i].id === data.id) { diff --git a/web/src/views/admin/SysConfig.vue b/web/src/views/admin/SysConfig.vue index f7447098..a273fe4d 100644 --- a/web/src/views/admin/SysConfig.vue +++ b/web/src/views/admin/SysConfig.vue @@ -24,6 +24,21 @@ + + + + + 保存 @@ -93,7 +108,9 @@