From 2100d8ee0caf3b26ae887a3aed3ec6f5c9fcbb71 Mon Sep 17 00:00:00 2001 From: kakingone Date: Wed, 31 Jul 2024 15:48:51 +0800 Subject: [PATCH] addupload --- common/model-ratio.go | 1 + constant/midjourney.go | 2 ++ dto/midjourney.go | 6 ++++++ relay/constant/relay_mode.go | 4 ++++ relay/relay-mj.go | 8 ++++++-- router/relay-router.go | 1 + service/midjourney.go | 11 ++++++++--- web/src/components/MjLogsTable.js | 8 +++++++- 8 files changed, 35 insertions(+), 6 deletions(-) diff --git a/common/model-ratio.go b/common/model-ratio.go index 568254b..68b2d65 100644 --- a/common/model-ratio.go +++ b/common/model-ratio.go @@ -181,6 +181,7 @@ var defaultModelPrice = map[string]float64{ "mj_describe": 0.05, "mj_upscale": 0.05, "swap_face": 0.05, + "mj_upload": 0.05, } var ( diff --git a/constant/midjourney.go b/constant/midjourney.go index 1e9d30a..4fba479 100644 --- a/constant/midjourney.go +++ b/constant/midjourney.go @@ -27,6 +27,7 @@ const ( MjActionLowVariation = "LOW_VARIATION" MjActionPan = "PAN" MjActionSwapFace = "SWAP_FACE" + MjActionUpload = "UPLOAD" ) var MidjourneyModel2Action = map[string]string{ @@ -45,4 +46,5 @@ var MidjourneyModel2Action = map[string]string{ "mj_low_variation": MjActionLowVariation, "mj_pan": MjActionPan, "swap_face": MjActionSwapFace, + "mj_upload": MjActionUpload, } diff --git a/dto/midjourney.go b/dto/midjourney.go index c675f7e..40251ee 100644 --- a/dto/midjourney.go +++ b/dto/midjourney.go @@ -33,6 +33,12 @@ type MidjourneyResponse struct { Result string `json:"result"` } +type MidjourneyUploadResponse struct { + Code int `json:"code"` + Description string `json:"description"` + Result []string `json:"result"` +} + type MidjourneyResponseWithStatusCode struct { StatusCode int `json:"statusCode"` Response MidjourneyResponse diff --git a/relay/constant/relay_mode.go b/relay/constant/relay_mode.go index a072c74..6006bc6 100644 --- a/relay/constant/relay_mode.go +++ b/relay/constant/relay_mode.go @@ -27,6 +27,7 @@ const ( RelayModeMidjourneyModal RelayModeMidjourneyShorten RelayModeSwapFace + RelayModeMidjourneyUpload RelayModeAudioSpeech // tts RelayModeAudioTranscription // whisper @@ -81,6 +82,9 @@ func Path2RelayModeMidjourney(path string) int { } else if strings.HasSuffix(path, "/mj/insight-face/swap") { // midjourney plus relayMode = RelayModeSwapFace + } else if strings.HasSuffix(path, "/submit/upload-discord-images") { + // midjourney plus + relayMode = RelayModeMidjourneyUpload } else if strings.HasSuffix(path, "/mj/submit/imagine") { relayMode = RelayModeMidjourneyImagine } else if strings.HasSuffix(path, "/mj/submit/blend") { diff --git a/relay/relay-mj.go b/relay/relay-mj.go index b399061..73ea468 100644 --- a/relay/relay-mj.go +++ b/relay/relay-mj.go @@ -382,6 +382,8 @@ func RelayMidjourneySubmit(c *gin.Context, relayMode int) *dto.MidjourneyRespons midjRequest.Action = constant.MjActionShorten } else if relayMode == relayconstant.RelayModeMidjourneyBlend { //绘画任务,此类任务可重复 midjRequest.Action = constant.MjActionBlend + } else if relayMode == relayconstant.RelayModeMidjourneyUpload { //绘画任务,此类任务可重复 + midjRequest.Action = constant.MjActionUpload } else if midjRequest.TaskId != "" { //放大、变换任务,此类任务,如果重复且已有结果,远端api会直接返回最终结果 mjId := "" if relayMode == relayconstant.RelayModeMidjourneyChange { @@ -580,7 +582,10 @@ func RelayMidjourneySubmit(c *gin.Context, relayMode int) *dto.MidjourneyRespons responseBody = []byte(newBody) } } - + if midjResponse.Code == 1 && midjRequest.Action == "UPLOAD" { + midjourneyTask.Progress = "100%" + midjourneyTask.Status = "SUCCESS" + } err = midjourneyTask.Insert() if err != nil { return &dto.MidjourneyResponse{ @@ -594,7 +599,6 @@ func RelayMidjourneySubmit(c *gin.Context, relayMode int) *dto.MidjourneyRespons newBody := strings.Replace(string(responseBody), `"code":22`, `"code":1`, -1) responseBody = []byte(newBody) } - //resp.Body = io.NopCloser(bytes.NewBuffer(responseBody)) bodyReader := io.NopCloser(bytes.NewBuffer(responseBody)) diff --git a/router/relay-router.go b/router/relay-router.go index 2bf2ca2..b8d4a43 100644 --- a/router/relay-router.go +++ b/router/relay-router.go @@ -79,5 +79,6 @@ func registerMjRouterGroup(relayMjRouter *gin.RouterGroup) { relayMjRouter.GET("/task/:id/image-seed", controller.RelayMidjourney) relayMjRouter.POST("/task/list-by-condition", controller.RelayMidjourney) relayMjRouter.POST("/insight-face/swap", controller.RelayMidjourney) + relayMjRouter.POST("/submit/upload-discord-images", controller.RelayMidjourney) } } diff --git a/service/midjourney.go b/service/midjourney.go index 6bb3a9e..d7b2a9a 100644 --- a/service/midjourney.go +++ b/service/midjourney.go @@ -49,6 +49,8 @@ func GetMjRequestModel(relayMode int, midjRequest *dto.MidjourneyRequest) (strin action = constant.MjActionModal case relayconstant.RelayModeSwapFace: action = constant.MjActionSwapFace + case relayconstant.RelayModeMidjourneyUpload: + action = constant.MjActionUpload case relayconstant.RelayModeMidjourneySimpleChange: params := ConvertSimpleChangeParams(midjRequest.Content) if params == nil { @@ -220,7 +222,7 @@ func DoMidjourneyHttpRequest(c *gin.Context, timeout time.Duration, fullRequestU return MidjourneyErrorWithStatusCodeWrapper(constant.MjErrorUnknown, "close_request_body_failed", statusCode), nullBytes, err } var midjResponse dto.MidjourneyResponse - + var midjourneyUploadsResponse dto.MidjourneyUploadResponse responseBody, err := io.ReadAll(resp.Body) if err != nil { return MidjourneyErrorWithStatusCodeWrapper(constant.MjErrorUnknown, "read_response_body_failed", statusCode), nullBytes, err @@ -230,13 +232,16 @@ func DoMidjourneyHttpRequest(c *gin.Context, timeout time.Duration, fullRequestU return MidjourneyErrorWithStatusCodeWrapper(constant.MjErrorUnknown, "close_response_body_failed", statusCode), responseBody, err } respStr := string(responseBody) - log.Printf("responseBody: %s", respStr) + log.Printf("respStr: %s", respStr) if respStr == "" { return MidjourneyErrorWithStatusCodeWrapper(constant.MjErrorUnknown, "empty_response_body", statusCode), responseBody, nil } else { err = json.Unmarshal(responseBody, &midjResponse) if err != nil { - return MidjourneyErrorWithStatusCodeWrapper(constant.MjErrorUnknown, "unmarshal_response_body_failed", statusCode), responseBody, err + err2 := json.Unmarshal(responseBody, &midjourneyUploadsResponse) + if err2 != nil { + return MidjourneyErrorWithStatusCodeWrapper(constant.MjErrorUnknown, "unmarshal_response_body_failed", statusCode), responseBody, err + } } } //log.Printf("midjResponse: %v", midjResponse) diff --git a/web/src/components/MjLogsTable.js b/web/src/components/MjLogsTable.js index e86ee31..d6aac98 100644 --- a/web/src/components/MjLogsTable.js +++ b/web/src/components/MjLogsTable.js @@ -90,6 +90,12 @@ function renderType(type) { 图混合 ); + case 'UPLOAD': + return ( + + 上传文件 + + ); case 'SHORTEN': return ( @@ -239,7 +245,7 @@ const renderTimestamp = (timestampInSeconds) => { // 修改renderDuration函数以包含颜色逻辑 function renderDuration(submit_time, finishTime) { // 确保startTime和finishTime都是有效的时间戳 - if (!submit_time || !finishTime) return 'N/A'; + if (!submit_time || !finishTime) return 'N/A'; // 将时间戳转换为Date对象 const start = new Date(submit_time);