ソースを参照

feat: enhance Ali video request handling and validation

CaIon 4 ヶ月 前
コミット
a4cf9bb6fe
2 ファイル変更46 行追加8 行削除
  1. 45 8
      relay/channel/task/ali/adaptor.go
  2. 1 0
      relay/common/relay_utils.go

+ 45 - 8
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
 }
 

+ 1 - 0
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