Restore standard MiniMax resolutions and client mapping
This commit is contained in:
@@ -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")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user