From a4cf9bb6feaa756812a17efea6d8d57e897eee9c Mon Sep 17 00:00:00 2001 From: CaIon Date: Fri, 31 Oct 2025 22:26:56 +0800 Subject: [PATCH] feat: enhance Ali video request handling and validation --- relay/channel/task/ali/adaptor.go | 53 ++++++++++++++++++++++++++----- relay/common/relay_utils.go | 1 + 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/relay/channel/task/ali/adaptor.go b/relay/channel/task/ali/adaptor.go index a40d343e5..bbfc9b78e 100644 --- a/relay/channel/task/ali/adaptor.go +++ b/relay/channel/task/ali/adaptor.go @@ -108,6 +108,7 @@ type TaskAdaptor struct { ChannelType int apiKey string baseURL string + aliReq *AliVideoRequest } func (a *TaskAdaptor) Init(info *relaycommon.RelayInfo) { @@ -118,6 +119,11 @@ func (a *TaskAdaptor) Init(info *relaycommon.RelayInfo) { func (a *TaskAdaptor) ValidateRequestAndSetAction(c *gin.Context, info *relaycommon.RelayInfo) (taskErr *dto.TaskError) { // 阿里通义万相支持 JSON 格式,不使用 multipart + var taskReq relaycommon.TaskSubmitReq + if err := common.UnmarshalBodyReusable(c, &taskReq); err != nil { + return service.TaskErrorWrapper(err, "unmarshal_task_request_failed", http.StatusBadRequest) + } + a.aliReq = a.convertToAliRequest(info, taskReq) return relaycommon.ValidateMultipartDirect(c, info) } @@ -134,13 +140,7 @@ func (a *TaskAdaptor) BuildRequestHeader(c *gin.Context, req *http.Request, info } func (a *TaskAdaptor) BuildRequestBody(c *gin.Context, info *relaycommon.RelayInfo) (io.Reader, error) { - var taskReq relaycommon.TaskSubmitReq - if err := common.UnmarshalBodyReusable(c, &taskReq); err != nil { - return nil, errors.Wrap(err, "unmarshal_task_request_failed") - } - aliReq := a.convertToAliRequest(taskReq) - - bodyBytes, err := common.Marshal(aliReq) + bodyBytes, err := common.Marshal(a.aliReq) if err != nil { return nil, errors.Wrap(err, "marshal_ali_request_failed") } @@ -148,7 +148,31 @@ func (a *TaskAdaptor) BuildRequestBody(c *gin.Context, info *relaycommon.RelayIn return bytes.NewReader(bodyBytes), nil } -func (a *TaskAdaptor) convertToAliRequest(req relaycommon.TaskSubmitReq) *AliVideoRequest { +func (a *TaskAdaptor) convertToAliRequest(info *relaycommon.RelayInfo, req relaycommon.TaskSubmitReq) *AliVideoRequest { + otherRatios := map[string]map[string]float64{ + "wan2.5-i2v-preview": { + "480P": 1, + "720P": 2, + "1080P": 1 / 0.3, + }, + "wan2.2-i2v-plus": { + "480P": 1, + "1080P": 0.7 / 0.14, + }, + "wan2.2-kf2v-flash": { + "480P": 1, + "720P": 2, + "1080P": 4.8, + }, + "wan2.2-i2v-flash": { + "480P": 1, + "720P": 2, + }, + "wan2.2-s2v": { + "480P": 1, + "720P": 0.9 / 0.5, + }, + } aliReq := &AliVideoRequest{ Model: req.Model, Input: AliVideoInput{ @@ -196,6 +220,19 @@ func (a *TaskAdaptor) convertToAliRequest(req relaycommon.TaskSubmitReq) *AliVid } } + info.PriceData.OtherRatios = map[string]float64{ + "seconds": float64(aliReq.Parameters.Duration), + //"size": 1, + } + + 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 + } + } + + // println(fmt.Sprintf("other ratios: %v", info.PriceData.OtherRatios)) + return aliReq } diff --git a/relay/common/relay_utils.go b/relay/common/relay_utils.go index 1cb2b9863..05c42dfd8 100644 --- a/relay/common/relay_utils.go +++ b/relay/common/relay_utils.go @@ -121,6 +121,7 @@ func ValidateMultipartDirect(c *gin.Context, info *RelayInfo) *dto.TaskError { prompt = req.Prompt model = req.Model + size = req.Size seconds, _ = strconv.Atoi(req.Seconds) if seconds == 0 { seconds = req.Duration