diff --git a/relay/channel/task/ali/adaptor.go b/relay/channel/task/ali/adaptor.go index d3584656..32d5da39 100644 --- a/relay/channel/task/ali/adaptor.go +++ b/relay/channel/task/ali/adaptor.go @@ -15,6 +15,7 @@ import ( "github.com/QuantumNous/new-api/relay/channel" relaycommon "github.com/QuantumNous/new-api/relay/common" "github.com/QuantumNous/new-api/service" + "github.com/samber/lo" "github.com/gin-gonic/gin" "github.com/pkg/errors" @@ -155,8 +156,51 @@ func (a *TaskAdaptor) BuildRequestBody(c *gin.Context, info *relaycommon.RelayIn return bytes.NewReader(bodyBytes), nil } -func (a *TaskAdaptor) convertToAliRequest(info *relaycommon.RelayInfo, req relaycommon.TaskSubmitReq) (*AliVideoRequest, error) { - otherRatios := map[string]map[string]float64{ +var ( + size480p = []string{ + "832*480", + "480*832", + "624*624", + } + size720p = []string{ + "1280*720", + "720*1280", + "960*960", + "1088*832", + "832*1088", + } + size1080p = []string{ + "1920*1080", + "1080*1920", + "1440*1440", + "1632*1248", + "1248*1632", + } +) + +func sizeToResolution(size string) (string, error) { + if lo.Contains(size480p, size) { + return "480P", nil + } else if lo.Contains(size720p, size) { + return "720P", nil + } else if lo.Contains(size1080p, size) { + return "1080P", nil + } + return "", fmt.Errorf("invalid size: %s", size) +} + +func ProcessAliOtherRatios(aliReq *AliVideoRequest) (map[string]float64, error) { + otherRatios := make(map[string]float64) + aliRatios := map[string]map[string]float64{ + "wan2.5-t2v-preview": { + "480P": 1, + "720P": 2, + "1080P": 1 / 0.3, + }, + "wan2.2-t2v-plus": { + "480P": 1, + "1080P": 0.7 / 0.14, + }, "wan2.5-i2v-preview": { "480P": 1, "720P": 2, @@ -180,6 +224,30 @@ func (a *TaskAdaptor) convertToAliRequest(info *relaycommon.RelayInfo, req relay "720P": 0.9 / 0.5, }, } + var resolution string + + // size match + if aliReq.Parameters.Size != "" { + toResolution, err := sizeToResolution(aliReq.Parameters.Size) + if err != nil { + return nil, err + } + resolution = toResolution + } else { + resolution = strings.ToUpper(aliReq.Parameters.Resolution) + if !strings.HasSuffix(resolution, "P") { + resolution = resolution + "P" + } + } + if otherRatio, ok := aliRatios[aliReq.Model]; ok { + if ratio, ok := otherRatio[resolution]; ok { + otherRatios[fmt.Sprintf("resolution-%s", resolution)] = ratio + } + } + return otherRatios, nil +} + +func (a *TaskAdaptor) convertToAliRequest(info *relaycommon.RelayInfo, req relaycommon.TaskSubmitReq) (*AliVideoRequest, error) { aliReq := &AliVideoRequest{ Model: req.Model, Input: AliVideoInput{ @@ -194,22 +262,40 @@ func (a *TaskAdaptor) convertToAliRequest(info *relaycommon.RelayInfo, req relay // 处理分辨率映射 if req.Size != "" { - resolution := strings.ToUpper(req.Size) - // 支持 480p, 720p, 1080p 或 480P, 720P, 1080P - if !strings.HasSuffix(resolution, "P") { - resolution = resolution + "P" + // text to video size must be contained * + if strings.Contains(req.Model, "t2v") && !strings.Contains(req.Size, "*") { + return nil, fmt.Errorf("invalid size: %s, example: %s", req.Size, "1920*1080") + } + if strings.Contains(req.Size, "*") { + aliReq.Parameters.Size = req.Size + } else { + resolution := strings.ToUpper(req.Size) + // 支持 480p, 720p, 1080p 或 480P, 720P, 1080P + if !strings.HasSuffix(resolution, "P") { + resolution = resolution + "P" + } + aliReq.Parameters.Resolution = resolution } - aliReq.Parameters.Resolution = resolution } else { // 根据模型设置默认分辨率 - if strings.HasPrefix(req.Model, "wan2.5") { - aliReq.Parameters.Resolution = "1080P" - } else if strings.HasPrefix(req.Model, "wan2.2-i2v-flash") { - aliReq.Parameters.Resolution = "720P" - } else if strings.HasPrefix(req.Model, "wan2.2-i2v-plus") { - aliReq.Parameters.Resolution = "1080P" + if strings.Contains(req.Model, "t2v") { // image to video + if strings.HasPrefix(req.Model, "wan2.5") { + aliReq.Parameters.Size = "1920*1080" + } else if strings.HasPrefix(req.Model, "wan2.2") { + aliReq.Parameters.Size = "1920*1080" + } else { + aliReq.Parameters.Size = "1280*720" + } } else { - aliReq.Parameters.Resolution = "720P" + if strings.HasPrefix(req.Model, "wan2.5") { + aliReq.Parameters.Resolution = "1080P" + } else if strings.HasPrefix(req.Model, "wan2.2-i2v-flash") { + aliReq.Parameters.Resolution = "720P" + } else if strings.HasPrefix(req.Model, "wan2.2-i2v-plus") { + aliReq.Parameters.Resolution = "1080P" + } else { + aliReq.Parameters.Resolution = "720P" + } } } @@ -247,13 +333,13 @@ func (a *TaskAdaptor) convertToAliRequest(info *relaycommon.RelayInfo, req relay "seconds": float64(aliReq.Parameters.Duration), } - if otherRatio, ok := otherRatios[req.Model]; ok { - if ratio, ok := otherRatio[aliReq.Parameters.Resolution]; ok { - info.PriceData.OtherRatios[fmt.Sprintf("resolution-%s", aliReq.Parameters.Resolution)] = ratio - } + ratios, err := ProcessAliOtherRatios(aliReq) + if err != nil { + return nil, err + } + for s, f := range ratios { + info.PriceData.OtherRatios[s] = f } - - // println(fmt.Sprintf("other ratios: %v", info.PriceData.OtherRatios)) return aliReq, nil }