Browse Source

feat: kling cost quota support use FinalUnitDeduction as totalToken

feitianbubu 3 months ago
parent
commit
88b7322483
1 changed files with 32 additions and 10 deletions
  1. 32 10
      relay/channel/task/kling/adaptor.go

+ 32 - 10
relay/channel/task/kling/adaptor.go

@@ -5,7 +5,9 @@ import (
 	"encoding/json"
 	"encoding/json"
 	"fmt"
 	"fmt"
 	"io"
 	"io"
+	"math"
 	"net/http"
 	"net/http"
+	"strconv"
 	"strings"
 	"strings"
 	"time"
 	"time"
 
 
@@ -80,15 +82,28 @@ type responsePayload struct {
 		TaskId        string `json:"task_id"`
 		TaskId        string `json:"task_id"`
 		TaskStatus    string `json:"task_status"`
 		TaskStatus    string `json:"task_status"`
 		TaskStatusMsg string `json:"task_status_msg"`
 		TaskStatusMsg string `json:"task_status_msg"`
-		TaskResult    struct {
+		TaskInfo      struct {
+			ExternalTaskId string `json:"external_task_id"`
+		} `json:"task_info"`
+		WatermarkInfo struct {
+			Enabled bool `json:"enabled"`
+		} `json:"watermark_info"`
+		TaskResult struct {
 			Videos []struct {
 			Videos []struct {
-				Id       string `json:"id"`
-				Url      string `json:"url"`
-				Duration string `json:"duration"`
+				Id           string `json:"id"`
+				Url          string `json:"url"`
+				WatermarkUrl string `json:"watermark_url"`
+				Duration     string `json:"duration"`
 			} `json:"videos"`
 			} `json:"videos"`
+			Images []struct {
+				Index        int    `json:"index"`
+				Url          string `json:"url"`
+				WatermarkUrl string `json:"watermark_url"`
+			} `json:"images"`
 		} `json:"task_result"`
 		} `json:"task_result"`
-		CreatedAt int64 `json:"created_at"`
-		UpdatedAt int64 `json:"updated_at"`
+		CreatedAt          int64  `json:"created_at"`
+		UpdatedAt          int64  `json:"updated_at"`
+		FinalUnitDeduction string `json:"final_unit_deduction"`
 	} `json:"data"`
 	} `json:"data"`
 }
 }
 
 
@@ -356,15 +371,22 @@ func (a *TaskAdaptor) ParseTaskResult(respBody []byte) (*relaycommon.TaskInfo, e
 		taskInfo.Status = model.TaskStatusInProgress
 		taskInfo.Status = model.TaskStatusInProgress
 	case "succeed":
 	case "succeed":
 		taskInfo.Status = model.TaskStatusSuccess
 		taskInfo.Status = model.TaskStatusSuccess
+		if videos := resPayload.Data.TaskResult.Videos; len(videos) > 0 {
+			video := videos[0]
+			taskInfo.Url = video.Url
+		}
+		if tokens, err := strconv.ParseFloat(resPayload.Data.FinalUnitDeduction, 64); err == nil {
+			rounded := int(math.Ceil(tokens))
+			if rounded > 0 {
+				taskInfo.CompletionTokens = rounded
+				taskInfo.TotalTokens = rounded
+			}
+		}
 	case "failed":
 	case "failed":
 		taskInfo.Status = model.TaskStatusFailure
 		taskInfo.Status = model.TaskStatusFailure
 	default:
 	default:
 		return nil, fmt.Errorf("unknown task status: %s", status)
 		return nil, fmt.Errorf("unknown task status: %s", status)
 	}
 	}
-	if videos := resPayload.Data.TaskResult.Videos; len(videos) > 0 {
-		video := videos[0]
-		taskInfo.Url = video.Url
-	}
 	return taskInfo, nil
 	return taskInfo, nil
 }
 }