Split param processor and tighten Volces frame validation

This commit is contained in:
2026-05-14 00:41:06 +08:00
parent 3225833f96
commit cdf469eccf
9 changed files with 1983 additions and 1538 deletions
+36
View File
@@ -76,6 +76,9 @@ func (c VolcesClient) runVideo(ctx context.Context, request Request, apiKey stri
upstreamTaskID := strings.TrimSpace(request.RemoteTaskID)
if upstreamTaskID == "" {
body := volcesVideoBody(request)
if err := validateVolcesVideoTaskBody(body); err != nil {
return Response{}, err
}
submitResult, requestID, err := c.postJSON(ctx, request, request.Candidate.BaseURL, "/contents/generations/tasks", apiKey, body)
submitRequestID = requestID
if err != nil {
@@ -297,6 +300,39 @@ func volcesVideoTaskBody(body map[string]any, content []map[string]any) map[stri
return out
}
func validateVolcesVideoTaskBody(body map[string]any) error {
firstFrameCount := 0
lastFrameCount := 0
for _, item := range contentItems(body["content"]) {
if stringFromAny(item["type"]) != "image_url" {
continue
}
switch stringFromAny(item["role"]) {
case "first_frame":
firstFrameCount++
case "last_frame":
lastFrameCount++
}
}
if firstFrameCount > 1 {
return &ClientError{
Code: "invalid_parameter",
Message: fmt.Sprintf("content contains %d first_frame image items; expected at most one first frame image content", firstFrameCount),
StatusCode: 400,
Retryable: false,
}
}
if lastFrameCount > 1 {
return &ClientError{
Code: "invalid_parameter",
Message: fmt.Sprintf("content contains %d last_frame image items; expected at most one last frame image content", lastFrameCount),
StatusCode: 400,
Retryable: false,
}
}
return nil
}
func addVolcesVideoTaskParams(out map[string]any, body map[string]any) {
copyVolcesStringParam(out, "callback_url", body, "callback_url", "callbackUrl")
copyVolcesBoolParam(out, "return_last_frame", body, "return_last_frame", "returnLastFrame")