mirror of
https://github.com/linux-do/new-api.git
synced 2025-09-18 16:36:37 +08:00
feat: 操作细分
This commit is contained in:
parent
2ad591411e
commit
d5ffaf2502
@ -4,31 +4,62 @@
|
|||||||
|
|
||||||
## 模型价格设置(在设置-运营设置-模型固定价格设置中设置)
|
## 模型价格设置(在设置-运营设置-模型固定价格设置中设置)
|
||||||
|
|
||||||
|
### 模型列表
|
||||||
|
|
||||||
|
### midjourney-proxy支持
|
||||||
|
|
||||||
|
- mj_imagine (绘图)
|
||||||
|
- mj_variation (变换)
|
||||||
|
- mj_reroll (重绘)
|
||||||
|
- mj_blend (混合)
|
||||||
|
- mj_upscale (放大)
|
||||||
|
- mj_describe (图生文)
|
||||||
|
|
||||||
|
### 仅midjourney-proxy-plus支持
|
||||||
|
|
||||||
|
- mj_zoom (比例变焦)
|
||||||
|
- mj_shorten (提示词缩短)
|
||||||
|
- mj_inpaint_pre (发起局部重绘,必须和mj_inpaint一同添加)
|
||||||
|
- mj_inpaint (局部重绘提交,必须和mj_inpaint_pre一同添加)
|
||||||
|
- mj_high_variation (强变换)
|
||||||
|
- mj_low_variation (弱变换)
|
||||||
|
- mj_pan (平移)
|
||||||
|
- swap_face (换脸)
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"gpt-4-gizmo-*": 0.1,
|
"mj_imagine": 0.1,
|
||||||
"mj_imagine": 0.1,
|
"mj_variation": 0.1,
|
||||||
"mj_variation": 0.1,
|
"mj_reroll": 0.1,
|
||||||
"mj_reroll": 0.1,
|
"mj_blend": 0.1,
|
||||||
"mj_blend": 0.1,
|
"mj_inpaint": 0.1,
|
||||||
"mj_inpaint": 0.1,
|
"mj_zoom": 0.1,
|
||||||
"mj_zoom": 0.1,
|
"mj_shorten": 0.1,
|
||||||
|
"mj_high_variation": 0.1,
|
||||||
|
"mj_low_variation": 0.1,
|
||||||
|
"mj_pan": 0.1,
|
||||||
"mj_inpaint_pre": 0,
|
"mj_inpaint_pre": 0,
|
||||||
"mj_describe": 0.05,
|
"mj_describe": 0.05,
|
||||||
"mj_upscale": 0.05,
|
"mj_upscale": 0.05,
|
||||||
"swap_face": 0.05
|
"swap_face": 0.05
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## 渠道设置
|
## 渠道设置
|
||||||
|
|
||||||
### 对接 midjourney-proxy(plus)
|
### 对接 midjourney-proxy(plus)
|
||||||
1. 部署Midjourney-Proxy,并配置好midjourney账号等(强烈建议设置密钥),[项目地址](https://github.com/novicezk/midjourney-proxy)
|
|
||||||
2. 在渠道管理中添加渠道,渠道类型选择**Midjourney Proxy**,如果是plus版本选择**Midjourney Proxy Plus**,模型选择midjourney,如果有换脸模型,可以选择swap_face
|
1.
|
||||||
|
|
||||||
|
部署Midjourney-Proxy,并配置好midjourney账号等(强烈建议设置密钥),[项目地址](https://github.com/novicezk/midjourney-proxy)
|
||||||
|
|
||||||
|
2. 在渠道管理中添加渠道,渠道类型选择**Midjourney Proxy**,如果是plus版本选择**Midjourney Proxy Plus**
|
||||||
|
,模型选择midjourney,如果有换脸模型,可以选择swap_face
|
||||||
3. 地址填写midjourney-proxy部署的地址,例如:http://localhost:8080
|
3. 地址填写midjourney-proxy部署的地址,例如:http://localhost:8080
|
||||||
4. 密钥填写midjourney-proxy的密钥,如果没有设置密钥,可以随便填
|
4. 密钥填写midjourney-proxy的密钥,如果没有设置密钥,可以随便填
|
||||||
|
|
||||||
### 对接上游new api
|
### 对接上游new api
|
||||||
|
|
||||||
1. 在渠道管理中添加渠道,渠道类型选择**Midjourney Proxy Plus**,模型选择midjourney,如果有换脸模型,可以选择swap_face
|
1. 在渠道管理中添加渠道,渠道类型选择**Midjourney Proxy Plus**,模型选择midjourney,如果有换脸模型,可以选择swap_face
|
||||||
2. 地址填写上游new api的地址,例如:http://localhost:3000
|
2. 地址填写上游new api的地址,例如:http://localhost:3000
|
||||||
3. 密钥填写上游new api的密钥
|
3. 密钥填写上游new api的密钥
|
@ -6,13 +6,17 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
MjActionImagine = "IMAGINE"
|
MjActionImagine = "IMAGINE"
|
||||||
MjActionDescribe = "DESCRIBE"
|
MjActionDescribe = "DESCRIBE"
|
||||||
MjActionBlend = "BLEND"
|
MjActionBlend = "BLEND"
|
||||||
MjActionUpscale = "UPSCALE"
|
MjActionUpscale = "UPSCALE"
|
||||||
MjActionVariation = "VARIATION"
|
MjActionVariation = "VARIATION"
|
||||||
MjActionInPaint = "INPAINT"
|
MjActionInPaint = "INPAINT"
|
||||||
MjActionInPaintPre = "INPAINT_PRE"
|
MjActionInPaintPre = "INPAINT_PRE"
|
||||||
MjActionZoom = "ZOOM"
|
MjActionZoom = "ZOOM"
|
||||||
MjActionShorten = "SHORTEN"
|
MjActionShorten = "SHORTEN"
|
||||||
|
MjActionHighVariation = "HIGH_VARIATION"
|
||||||
|
MjActionLowVariation = "LOW_VARIATION"
|
||||||
|
MjActionPan = "PAN"
|
||||||
|
SwapFace = "SWAP_FACE"
|
||||||
)
|
)
|
||||||
|
@ -12,7 +12,6 @@ import (
|
|||||||
relayconstant "one-api/relay/constant"
|
relayconstant "one-api/relay/constant"
|
||||||
"one-api/service"
|
"one-api/service"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func Relay(c *gin.Context) {
|
func Relay(c *gin.Context) {
|
||||||
@ -61,42 +60,13 @@ func Relay(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func RelayMidjourney(c *gin.Context) {
|
func RelayMidjourney(c *gin.Context) {
|
||||||
relayMode := relayconstant.RelayModeUnknown
|
relayMode := constant.Path2RelayModeMidjourney(c.Request.URL.Path)
|
||||||
if strings.HasPrefix(c.Request.URL.Path, "/mj/submit/action") {
|
|
||||||
// midjourney plus
|
|
||||||
relayMode = relayconstant.RelayModeMidjourneyAction
|
|
||||||
} else if strings.HasPrefix(c.Request.URL.Path, "/mj/submit/modal") {
|
|
||||||
// midjourney plus
|
|
||||||
relayMode = relayconstant.RelayModeMidjourneyModal
|
|
||||||
} else if strings.HasPrefix(c.Request.URL.Path, "/mj/submit/shorten") {
|
|
||||||
// midjourney plus
|
|
||||||
relayMode = relayconstant.RelayModeMidjourneyShorten
|
|
||||||
} else if strings.HasPrefix(c.Request.URL.Path, "/mj/submit/imagine") {
|
|
||||||
relayMode = relayconstant.RelayModeMidjourneyImagine
|
|
||||||
} else if strings.HasPrefix(c.Request.URL.Path, "/mj/submit/blend") {
|
|
||||||
relayMode = relayconstant.RelayModeMidjourneyBlend
|
|
||||||
} else if strings.HasPrefix(c.Request.URL.Path, "/mj/submit/describe") {
|
|
||||||
relayMode = relayconstant.RelayModeMidjourneyDescribe
|
|
||||||
} else if strings.HasPrefix(c.Request.URL.Path, "/mj/notify") {
|
|
||||||
relayMode = relayconstant.RelayModeMidjourneyNotify
|
|
||||||
} else if strings.HasPrefix(c.Request.URL.Path, "/mj/submit/change") {
|
|
||||||
relayMode = relayconstant.RelayModeMidjourneyChange
|
|
||||||
} else if strings.HasPrefix(c.Request.URL.Path, "/mj/submit/simple-change") {
|
|
||||||
relayMode = relayconstant.RelayModeMidjourneyChange
|
|
||||||
} else if strings.HasSuffix(c.Request.URL.Path, "/fetch") {
|
|
||||||
relayMode = relayconstant.RelayModeMidjourneyTaskFetch
|
|
||||||
} else if strings.HasSuffix(c.Request.URL.Path, "/list-by-condition") {
|
|
||||||
relayMode = relayconstant.RelayModeMidjourneyTaskFetchByCondition
|
|
||||||
}
|
|
||||||
|
|
||||||
var err *dto.MidjourneyResponse
|
var err *dto.MidjourneyResponse
|
||||||
switch relayMode {
|
switch relayMode {
|
||||||
case relayconstant.RelayModeMidjourneyNotify:
|
case relayconstant.RelayModeMidjourneyNotify:
|
||||||
err = relay.RelayMidjourneyNotify(c)
|
err = relay.RelayMidjourneyNotify(c)
|
||||||
case relayconstant.RelayModeMidjourneyTaskFetch, relayconstant.RelayModeMidjourneyTaskFetchByCondition:
|
case relayconstant.RelayModeMidjourneyTaskFetch, relayconstant.RelayModeMidjourneyTaskFetchByCondition:
|
||||||
err = relay.RelayMidjourneyTask(c, relayMode)
|
err = relay.RelayMidjourneyTask(c, relayMode)
|
||||||
//case relayconstant.RelayModeMidjourneyModal:
|
|
||||||
// err = relay.RelayMidjournneyModal(c)
|
|
||||||
default:
|
default:
|
||||||
err = relay.RelayMidjourneySubmit(c, relayMode)
|
err = relay.RelayMidjourneySubmit(c, relayMode)
|
||||||
}
|
}
|
||||||
|
@ -51,3 +51,34 @@ func Path2RelayMode(path string) int {
|
|||||||
}
|
}
|
||||||
return relayMode
|
return relayMode
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Path2RelayModeMidjourney(path string) int {
|
||||||
|
relayMode := RelayModeUnknown
|
||||||
|
if strings.HasPrefix(path, "/mj/submit/action") {
|
||||||
|
// midjourney plus
|
||||||
|
relayMode = RelayModeMidjourneyAction
|
||||||
|
} else if strings.HasPrefix(path, "/mj/submit/modal") {
|
||||||
|
// midjourney plus
|
||||||
|
relayMode = RelayModeMidjourneyModal
|
||||||
|
} else if strings.HasPrefix(path, "/mj/submit/shorten") {
|
||||||
|
// midjourney plus
|
||||||
|
relayMode = RelayModeMidjourneyShorten
|
||||||
|
} else if strings.HasPrefix(path, "/mj/submit/imagine") {
|
||||||
|
relayMode = RelayModeMidjourneyImagine
|
||||||
|
} else if strings.HasPrefix(path, "/mj/submit/blend") {
|
||||||
|
relayMode = RelayModeMidjourneyBlend
|
||||||
|
} else if strings.HasPrefix(path, "/mj/submit/describe") {
|
||||||
|
relayMode = RelayModeMidjourneyDescribe
|
||||||
|
} else if strings.HasPrefix(path, "/mj/notify") {
|
||||||
|
relayMode = RelayModeMidjourneyNotify
|
||||||
|
} else if strings.HasPrefix(path, "/mj/submit/change") {
|
||||||
|
relayMode = RelayModeMidjourneyChange
|
||||||
|
} else if strings.HasPrefix(path, "/mj/submit/simple-change") {
|
||||||
|
relayMode = RelayModeMidjourneyChange
|
||||||
|
} else if strings.HasSuffix(path, "/fetch") {
|
||||||
|
relayMode = RelayModeMidjourneyTaskFetch
|
||||||
|
} else if strings.HasSuffix(path, "/list-by-condition") {
|
||||||
|
relayMode = RelayModeMidjourneyTaskFetchByCondition
|
||||||
|
}
|
||||||
|
return relayMode
|
||||||
|
}
|
||||||
|
@ -22,16 +22,20 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var DefaultModelPrice = map[string]float64{
|
var DefaultModelPrice = map[string]float64{
|
||||||
"mj_imagine": 0.1,
|
"mj_imagine": 0.1,
|
||||||
"mj_variation": 0.1,
|
"mj_variation": 0.1,
|
||||||
"mj_reroll": 0.1,
|
"mj_reroll": 0.1,
|
||||||
"mj_blend": 0.1,
|
"mj_blend": 0.1,
|
||||||
"mj_inpaint": 0.1,
|
"mj_inpaint": 0.1,
|
||||||
"mj_zoom": 0.1,
|
"mj_zoom": 0.1,
|
||||||
"mj_inpaint_pre": 0,
|
"mj_shorten": 0.1,
|
||||||
"mj_describe": 0.05,
|
"mj_high_variation": 0.1,
|
||||||
"mj_upscale": 0.05,
|
"mj_low_variation": 0.1,
|
||||||
"swap_face": 0.05,
|
"mj_pan": 0.1,
|
||||||
|
"mj_inpaint_pre": 0,
|
||||||
|
"mj_describe": 0.05,
|
||||||
|
"mj_upscale": 0.05,
|
||||||
|
"swap_face": 0.05,
|
||||||
}
|
}
|
||||||
|
|
||||||
func RelayMidjourneyImage(c *gin.Context) {
|
func RelayMidjourneyImage(c *gin.Context) {
|
||||||
@ -151,31 +155,6 @@ func coverMidjourneyTaskDto(c *gin.Context, originTask *model.Midjourney) (midjo
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func RelayMidjournneyModal(c *gin.Context) *dto.MidjourneyResponse {
|
|
||||||
userId := c.GetInt("id")
|
|
||||||
var midjRequest dto.MidjourneyRequest
|
|
||||||
err := common.UnmarshalBodyReusable(c, &midjRequest)
|
|
||||||
if err != nil {
|
|
||||||
return service.MidjourneyErrorWrapper(constant.MjRequestError, "bind_request_body_failed")
|
|
||||||
}
|
|
||||||
originTask := model.GetByMJId(userId, midjRequest.TaskId)
|
|
||||||
if originTask == nil {
|
|
||||||
return service.MidjourneyErrorWrapper(constant.MjRequestError, "task_no_found")
|
|
||||||
}
|
|
||||||
|
|
||||||
respBody, err := json.Marshal(midjRequest)
|
|
||||||
if err != nil {
|
|
||||||
return service.MidjourneyErrorWrapper(constant.MjRequestError, "unmarshal_response_body_failed")
|
|
||||||
}
|
|
||||||
c.Writer.Header().Set("Content-Type", "application/json")
|
|
||||||
_, err = io.Copy(c.Writer, bytes.NewBuffer(respBody))
|
|
||||||
if err != nil {
|
|
||||||
return service.MidjourneyErrorWrapper(constant.MjRequestError, "copy_response_body_failed")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func RelayMidjourneyTask(c *gin.Context, relayMode int) *dto.MidjourneyResponse {
|
func RelayMidjourneyTask(c *gin.Context, relayMode int) *dto.MidjourneyResponse {
|
||||||
userId := c.GetInt("id")
|
userId := c.GetInt("id")
|
||||||
var err error
|
var err error
|
||||||
@ -274,7 +253,7 @@ func RelayMidjourneySubmit(c *gin.Context, relayMode int) *dto.MidjourneyRespons
|
|||||||
} else if relayMode == relayconstant.RelayModeMidjourneyShorten { //缩短任务,此类任务可重复,plus only
|
} else if relayMode == relayconstant.RelayModeMidjourneyShorten { //缩短任务,此类任务可重复,plus only
|
||||||
midjRequest.Action = constant.MjActionShorten
|
midjRequest.Action = constant.MjActionShorten
|
||||||
} else if relayMode == relayconstant.RelayModeMidjourneyBlend { //绘画任务,此类任务可重复
|
} else if relayMode == relayconstant.RelayModeMidjourneyBlend { //绘画任务,此类任务可重复
|
||||||
midjRequest.Action = "BLEND"
|
midjRequest.Action = constant.MjActionBlend
|
||||||
} else if midjRequest.TaskId != "" { //放大、变换任务,此类任务,如果重复且已有结果,远端api会直接返回最终结果
|
} else if midjRequest.TaskId != "" { //放大、变换任务,此类任务,如果重复且已有结果,远端api会直接返回最终结果
|
||||||
mjId := ""
|
mjId := ""
|
||||||
if relayMode == relayconstant.RelayModeMidjourneyChange {
|
if relayMode == relayconstant.RelayModeMidjourneyChange {
|
||||||
@ -634,10 +613,21 @@ func coverPlusActionToNormalAction(midjRequest *dto.MidjourneyRequest) *dto.Midj
|
|||||||
midjRequest.Index = index
|
midjRequest.Index = index
|
||||||
midjRequest.Action = constant.MjActionUpscale
|
midjRequest.Action = constant.MjActionUpscale
|
||||||
} else if strings.Contains(action, "variation") {
|
} else if strings.Contains(action, "variation") {
|
||||||
midjRequest.Action = constant.MjActionVariation
|
|
||||||
midjRequest.Index = 1
|
midjRequest.Index = 1
|
||||||
|
if action == "variation" {
|
||||||
|
index, err := strconv.Atoi(splits[3])
|
||||||
|
if err != nil {
|
||||||
|
return service.MidjourneyErrorWrapper(constant.MjRequestError, "index_parse_failed")
|
||||||
|
}
|
||||||
|
midjRequest.Index = index
|
||||||
|
midjRequest.Action = constant.MjActionVariation
|
||||||
|
} else if action == "low_variation" {
|
||||||
|
midjRequest.Action = constant.MjActionLowVariation
|
||||||
|
} else if action == "high_variation" {
|
||||||
|
midjRequest.Action = constant.MjActionHighVariation
|
||||||
|
}
|
||||||
} else if strings.Contains(action, "pan") {
|
} else if strings.Contains(action, "pan") {
|
||||||
midjRequest.Action = constant.MjActionVariation
|
midjRequest.Action = constant.MjActionPan
|
||||||
midjRequest.Index = 1
|
midjRequest.Index = 1
|
||||||
} else if action == "Outpaint" || action == "CustomZoom" {
|
} else if action == "Outpaint" || action == "CustomZoom" {
|
||||||
midjRequest.Action = constant.MjActionZoom
|
midjRequest.Action = constant.MjActionZoom
|
||||||
|
@ -31,6 +31,12 @@ function renderType(type) {
|
|||||||
return <Tag color="orange" size='large'>放大</Tag>;
|
return <Tag color="orange" size='large'>放大</Tag>;
|
||||||
case 'VARIATION':
|
case 'VARIATION':
|
||||||
return <Tag color="purple" size='large'>变换</Tag>;
|
return <Tag color="purple" size='large'>变换</Tag>;
|
||||||
|
case 'HIGH_VARIATION':
|
||||||
|
return <Tag color="purple" size='large'>强变换</Tag>;
|
||||||
|
case 'LOW_VARIATION':
|
||||||
|
return <Tag color="purple" size='large'>弱变换</Tag>;
|
||||||
|
case 'PAN':
|
||||||
|
return <Tag color="cyan" size='large'>平移</Tag>;
|
||||||
case 'DESCRIBE':
|
case 'DESCRIBE':
|
||||||
return <Tag color="yellow" size='large'>图生文</Tag>;
|
return <Tag color="yellow" size='large'>图生文</Tag>;
|
||||||
case 'BLEAND':
|
case 'BLEAND':
|
||||||
|
Loading…
Reference in New Issue
Block a user