{"record":{"id":"f769c35e164b462f","repo":"jackwener/OpenCLI","slug":"all-suno-clips-failed-errors-open-suno-url","errorCode":null,"errorMessage":"All Suno clips failed (${errors}). Open ${SUNO_URL}/song/${clipIds[0]} to inspect.","messagePattern":"All Suno clips failed \\((.+?)\\)\\. Open (.+?)/song/(.+?) to inspect\\.","errorType":"exception","errorClass":"CommandExecutionError","httpStatus":null,"severity":"error","filePath":"clis/suno/generate.js","lineNumber":184,"sourceCode":"            deviceId,\n        });\n\n        if (!Array.isArray(submission.clips)) {\n            throw new CommandExecutionError('Suno generation returned malformed clips payload.');\n        }\n        const clipIds = submission.clips.map(c => c?.id);\n        if (clipIds.some(id => !id)) {\n            throw new CommandExecutionError('Suno generation returned malformed clip identity.');\n        }\n        if (!clipIds.length) {\n            throw new CommandExecutionError('Suno accepted the request but returned no clip ids.');\n        }\n\n        const clips = await pollSunoClips(page, clipIds, timeout, deviceId);\n        const completed = clips.filter(c => c.status === 'complete');\n        if (!completed.length) {\n            const errors = clips.map(c => `${c.id.slice(0, 8)}:${c.status}`).join(', ');\n            throw new CommandExecutionError(`All Suno clips failed (${errors}). Open ${SUNO_URL}/song/${clipIds[0]} to inspect.`);\n        }\n\n        const rows = [];\n        for (const clip of clips) {\n            const link = `${SUNO_URL}/song/${clip.id}`;\n            if (clip.status !== 'complete') {\n                rows.push({\n                    status: `❌ ${clip.status}`,\n                    clip: clip.id.slice(0, 8),\n                    title: clip.title || '(untitled)',\n                    files: '-',\n                    link: `🔗 ${link}`,\n                });\n                continue;\n            }\n            if (skipDownload) {\n                rows.push({\n                    status: '🎵 generated',","sourceCodeStart":166,"sourceCodeEnd":202,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/suno/generate.js#L166-L202","documentation":"After polling, if none of the generated clips reached status 'complete', the CLI throws listing each clip's short id and terminal status, with a link to the first clip for manual inspection.","triggerScenarios":"`pollSunoClips()` returns clips where no `c.status === 'complete'` — all clips ended 'error', 'failed', or timed out in a non-complete state within --timeout.","commonSituations":"Content-moderation failure on the prompt/lyrics, Suno compute backlog causing timeouts, unsupported model tag, or lyrics with malformed metatags.","solutions":["Open the song URL from the message (https://suno.com/song/<clipId>) to see Suno's own failure reason.","Read the per-clip statuses in the error (e.g. abc12345:error) — 'error' usually means moderation rejection, timeout means backlog.","Retry with a longer --timeout if clips were still queued.","Rephrase prompt/lyrics or switch --model and regenerate."],"exampleFix":"// before: single 60s wait, gives up on slow queue\nconst clips = await pollSunoClips(page, clipIds, 60, deviceId);\n// after: allow more time for Suno backlog\nconst clips = await pollSunoClips(page, clipIds, 300, deviceId);","handlingStrategy":"retry","validationCode":"// Prefer generous timeouts up front; check account eligibility for the chosen model:\nawait opencli('suno', 'generate', prompt, '--timeout', '300'); // default 300s, raise for backlogs","typeGuard":"function anyCompleted(clips) { return Array.isArray(clips) && clips.some(c => c?.status === 'complete'); }","tryCatchPattern":"try {\n  const rows = await opencli('suno', 'generate', prompt);\n} catch (e) {\n  const m = /All Suno clips failed \\((.+)\\)/.exec(e.message);\n  if (m) {\n    const statuses = m[1];\n    if (/timeout/i.test(statuses)) await retryWithLongerTimeout();\n    else if (/error|failed/i.test(statuses)) reportModerationOrContentIssue(statuses);\n  } else throw e;\n}","preventionTips":["Use --timeout 300+ during Suno peak hours.","Avoid lyric content that commonly trips moderation.","Check clip status in the error string to pick retry vs rephrase.","Open the song URL from the message for Suno's own failure detail."],"tags":["generation-failed","timeout","content-moderation"],"backgroundTag":"generation-failed","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}