feat: support cloned voice deletion

This commit is contained in:
2026-06-17 12:03:13 +08:00
parent c4341335d7
commit 6089aa6085
8 changed files with 259 additions and 1 deletions
@@ -398,6 +398,36 @@ func (c MinimaxClient) runVoiceClone(ctx context.Context, request Request) (Resp
}, nil
}
func (c MinimaxClient) DeleteVoiceClone(ctx context.Context, request VoiceCloneDeleteRequest) (VoiceCloneDeleteResponse, error) {
startedAt := time.Now()
voiceID := strings.TrimSpace(request.VoiceID)
if voiceID == "" {
return VoiceCloneDeleteResponse{}, &ClientError{Code: "bad_request", Message: "voice_id is required", Retryable: false}
}
client := httpClient(request.HTTPClient, c.HTTPClient)
payload := map[string]any{
"voice_type": "voice_cloning",
"voice_id": voiceID,
}
result, requestID, err := providerPostJSON(ctx, client, providerURL(request.Candidate.BaseURL, "/delete_voice"), payload, request.Candidate.Credentials, "bearer")
finishedAt := time.Now()
if err != nil {
return VoiceCloneDeleteResponse{}, annotateResponseError(err, requestID, startedAt, finishedAt)
}
if isProviderTaskFailure(providerTaskSpec{Name: "minimax"}, result) {
return VoiceCloneDeleteResponse{}, providerTaskFailure(providerTaskSpec{Name: "minimax"}, result, firstNonEmptyString(requestID, requestIDFromResult(result)), startedAt)
}
deletedVoiceID := firstNonEmptyString(valueAtPath(result, "voice_id"), voiceID)
return VoiceCloneDeleteResponse{
VoiceID: deletedVoiceID,
RequestID: firstNonEmptyString(requestID, requestIDFromResult(result)),
Result: result,
StartedAt: startedAt,
FinishedAt: finishedAt,
DurationMS: responseDurationMS(startedAt, finishedAt),
}, nil
}
func (c MinimaxClient) minimaxVoiceCloneFileID(ctx context.Context, client *http.Client, request Request, body map[string]any, purpose string, fileIDKey string, sourceKeys ...string) (any, string, error) {
if value := firstPresent(body[fileIDKey], nil); value != nil {
return normalizeMinimaxFileID(value), "", nil
+19
View File
@@ -60,6 +60,25 @@ type Client interface {
Run(ctx context.Context, request Request) (Response, error)
}
type VoiceCloneDeleteRequest struct {
VoiceID string
Candidate store.RuntimeModelCandidate
HTTPClient *http.Client
}
type VoiceCloneDeleteResponse struct {
VoiceID string
RequestID string
Result map[string]any
StartedAt time.Time
FinishedAt time.Time
DurationMS int64
}
type VoiceCloneDeleter interface {
DeleteVoiceClone(ctx context.Context, request VoiceCloneDeleteRequest) (VoiceCloneDeleteResponse, error)
}
type ClientError struct {
Code string
Message string