fix: improve error handling and validation in Ali video request conversion

This commit is contained in:
CaIon
2025-10-31 22:39:35 +08:00
parent a4cf9bb6fe
commit 70f8a59a65

View File

@@ -5,10 +5,12 @@ import (
"fmt" "fmt"
"io" "io"
"net/http" "net/http"
"strconv"
"strings" "strings"
"github.com/QuantumNous/new-api/common" "github.com/QuantumNous/new-api/common"
"github.com/QuantumNous/new-api/dto" "github.com/QuantumNous/new-api/dto"
"github.com/QuantumNous/new-api/logger"
"github.com/QuantumNous/new-api/model" "github.com/QuantumNous/new-api/model"
"github.com/QuantumNous/new-api/relay/channel" "github.com/QuantumNous/new-api/relay/channel"
relaycommon "github.com/QuantumNous/new-api/relay/common" relaycommon "github.com/QuantumNous/new-api/relay/common"
@@ -123,7 +125,12 @@ func (a *TaskAdaptor) ValidateRequestAndSetAction(c *gin.Context, info *relaycom
if err := common.UnmarshalBodyReusable(c, &taskReq); err != nil { if err := common.UnmarshalBodyReusable(c, &taskReq); err != nil {
return service.TaskErrorWrapper(err, "unmarshal_task_request_failed", http.StatusBadRequest) return service.TaskErrorWrapper(err, "unmarshal_task_request_failed", http.StatusBadRequest)
} }
a.aliReq = a.convertToAliRequest(info, taskReq) aliReq, err := a.convertToAliRequest(info, taskReq)
if err != nil {
return service.TaskErrorWrapper(err, "convert_to_ali_request_failed", http.StatusInternalServerError)
}
a.aliReq = aliReq
logger.LogJson(c, "ali video request body", aliReq)
return relaycommon.ValidateMultipartDirect(c, info) return relaycommon.ValidateMultipartDirect(c, info)
} }
@@ -148,7 +155,7 @@ func (a *TaskAdaptor) BuildRequestBody(c *gin.Context, info *relaycommon.RelayIn
return bytes.NewReader(bodyBytes), nil return bytes.NewReader(bodyBytes), nil
} }
func (a *TaskAdaptor) convertToAliRequest(info *relaycommon.RelayInfo, req relaycommon.TaskSubmitReq) *AliVideoRequest { func (a *TaskAdaptor) convertToAliRequest(info *relaycommon.RelayInfo, req relaycommon.TaskSubmitReq) (*AliVideoRequest, error) {
otherRatios := map[string]map[string]float64{ otherRatios := map[string]map[string]float64{
"wan2.5-i2v-preview": { "wan2.5-i2v-preview": {
"480P": 1, "480P": 1,
@@ -209,6 +216,13 @@ func (a *TaskAdaptor) convertToAliRequest(info *relaycommon.RelayInfo, req relay
// 处理时长 // 处理时长
if req.Duration > 0 { if req.Duration > 0 {
aliReq.Parameters.Duration = req.Duration aliReq.Parameters.Duration = req.Duration
} else if req.Seconds != "" {
seconds, err := strconv.Atoi(req.Seconds)
if err != nil {
return nil, errors.Wrap(err, "convert seconds to int failed")
} else {
aliReq.Parameters.Duration = seconds
}
} else { } else {
aliReq.Parameters.Duration = 5 // 默认5秒 aliReq.Parameters.Duration = 5 // 默认5秒
} }
@@ -216,13 +230,21 @@ func (a *TaskAdaptor) convertToAliRequest(info *relaycommon.RelayInfo, req relay
// 从 metadata 中提取额外参数 // 从 metadata 中提取额外参数
if req.Metadata != nil { if req.Metadata != nil {
if metadataBytes, err := common.Marshal(req.Metadata); err == nil { if metadataBytes, err := common.Marshal(req.Metadata); err == nil {
_ = common.Unmarshal(metadataBytes, aliReq) err = common.Unmarshal(metadataBytes, aliReq)
if err != nil {
return nil, errors.Wrap(err, "unmarshal metadata failed")
} }
} else {
return nil, errors.Wrap(err, "marshal metadata failed")
}
}
if aliReq.Model != req.Model {
return nil, errors.New("can't change model with metadata")
} }
info.PriceData.OtherRatios = map[string]float64{ info.PriceData.OtherRatios = map[string]float64{
"seconds": float64(aliReq.Parameters.Duration), "seconds": float64(aliReq.Parameters.Duration),
//"size": 1,
} }
if otherRatio, ok := otherRatios[req.Model]; ok { if otherRatio, ok := otherRatios[req.Model]; ok {
@@ -233,7 +255,7 @@ func (a *TaskAdaptor) convertToAliRequest(info *relaycommon.RelayInfo, req relay
// println(fmt.Sprintf("other ratios: %v", info.PriceData.OtherRatios)) // println(fmt.Sprintf("other ratios: %v", info.PriceData.OtherRatios))
return aliReq return aliReq, nil
} }
// DoRequest delegates to common helper // DoRequest delegates to common helper