Restore standard MiniMax resolutions and client mapping

This commit is contained in:
2026-06-08 09:29:45 +08:00
parent ca5e71c8e8
commit 97f29ed156
8 changed files with 587 additions and 4 deletions
+44 -2
View File
@@ -21,6 +21,7 @@ type providerTaskSpec struct {
FailureStatuses []string
ProcessStatuses []string
DefaultSubmitBody func(Request, map[string]any) map[string]any
ResolveSuccess func(context.Context, *http.Client, Request, map[string]any) (map[string]any, string, error)
}
type providerTaskClient struct {
@@ -54,6 +55,15 @@ func (c providerTaskClient) Run(ctx context.Context, request Request) (Response,
return Response{}, providerTaskFailure(c.Spec, result, requestID, startedAt)
}
if isProviderTaskSuccess(c.Spec, result) && hasProviderTaskResult(result) {
resolved, resolvedRequestID, err := c.resolveSuccess(ctx, request, result)
if err != nil {
return Response{}, annotateResponseError(err, firstNonEmptyString(resolvedRequestID, requestID), startedAt, time.Now())
}
result = resolved
requestID = firstNonEmptyString(resolvedRequestID, requestID)
if isProviderTaskFailure(c.Spec, result) {
return Response{}, providerTaskFailure(c.Spec, result, requestID, startedAt)
}
return Response{
Result: normalizeProviderTaskResult(request, c.Spec, result, ""),
RequestID: requestID,
@@ -96,6 +106,15 @@ func (c providerTaskClient) Run(ctx context.Context, request Request) (Response,
lastResult = result
requestID = firstNonEmptyString(pollRequestID, requestID, requestIDFromResult(result), upstreamTaskID)
if isProviderTaskSuccess(c.Spec, result) {
resolved, resolvedRequestID, err := c.resolveSuccess(ctx, request, result)
if err != nil {
return Response{}, annotateResponseError(err, firstNonEmptyString(resolvedRequestID, requestID, upstreamTaskID), pollStarted, time.Now())
}
result = resolved
requestID = firstNonEmptyString(resolvedRequestID, requestID)
if isProviderTaskFailure(c.Spec, result) {
return Response{}, providerTaskFailure(c.Spec, result, requestID, startedAt)
}
finishedAt := time.Now()
return Response{
Result: normalizeProviderTaskResult(request, c.Spec, result, upstreamTaskID),
@@ -119,6 +138,13 @@ func (c providerTaskClient) Run(ctx context.Context, request Request) (Response,
}
}
func (c providerTaskClient) resolveSuccess(ctx context.Context, request Request, result map[string]any) (map[string]any, string, error) {
if c.Spec.ResolveSuccess == nil {
return result, "", nil
}
return c.Spec.ResolveSuccess(ctx, httpClient(request.HTTPClient, c.HTTPClient), request, result)
}
func providerTaskKindSupported(kind string) bool {
switch kind {
case "images.generations", "images.edits", "videos.generations", "song.generations", "music.generations", "speech.generations":
@@ -282,9 +308,16 @@ func isProviderTaskSuccess(spec providerTaskSpec, result map[string]any) bool {
}
func isProviderTaskFailure(spec providerTaskSpec, result map[string]any) bool {
if statusCode := providerTaskBusinessStatusCode(result); statusCode != "" && statusCode != "0" {
return true
}
return containsStatus(append([]string{"failed", "failure", "error", "cancelled", "canceled", "fail", "expired", "task not found"}, spec.FailureStatuses...), providerTaskStatus(spec, result))
}
func providerTaskBusinessStatusCode(result map[string]any) string {
return strings.TrimSpace(stringFromPathValue(valueAtPath(result, "base_resp.status_code")))
}
func containsStatus(values []string, status string) bool {
status = strings.ToLower(strings.TrimSpace(status))
for _, value := range values {
@@ -397,9 +430,9 @@ func appendURLValues(out *[]any, value any) {
}
func providerTaskFailure(spec providerTaskSpec, result map[string]any, requestID string, startedAt time.Time) error {
message := firstNonEmptyString(valueAtPath(result, "message"), valueAtPath(result, "error.message"), valueAtPath(result, "error"), valueAtPath(result, "Response.ErrorMessage"), valueAtPath(result, "comment"), spec.Name+" task failed")
message := firstNonEmptyString(valueAtPath(result, "message"), valueAtPath(result, "error.message"), valueAtPath(result, "error"), valueAtPath(result, "base_resp.status_msg"), valueAtPath(result, "Response.ErrorMessage"), valueAtPath(result, "comment"), spec.Name+" task failed")
return &ClientError{
Code: firstNonEmptyString(valueAtPath(result, "code"), valueAtPath(result, "error_code"), valueAtPath(result, "Response.ErrorCode"), "provider_failed"),
Code: firstNonEmptyPathString(valueAtPath(result, "code"), valueAtPath(result, "error_code"), valueAtPath(result, "base_resp.status_code"), valueAtPath(result, "Response.ErrorCode"), "provider_failed"),
Message: message,
RequestID: requestID,
ResponseStartedAt: startedAt,
@@ -409,6 +442,15 @@ func providerTaskFailure(spec providerTaskSpec, result map[string]any, requestID
}
}
func firstNonEmptyPathString(values ...any) string {
for _, value := range values {
if text := stringFromPathValue(value); text != "" {
return text
}
}
return ""
}
func providerPollInterval(request Request) time.Duration {
return durationFromConfig(request.Candidate.PlatformConfig, 2*time.Second, "pollIntervalMs", "poll_interval_ms")
}