nexu-io/open-design · error · Error
volcengine task ${lastStatus}: ${reason}
Error message
volcengine task ${lastStatus}: ${reason} What it means
Thrown when a polled Seedance task reports a terminal `failed` or `cancelled` status. The message carries the status plus `pollData.error.message` (falling back to the status) so the provider's rejection reason — content moderation, resource exhaustion, user cancel — is shown.
Source
Thrown at apps/daemon/src/media/index.ts:1511
} catch {
throw new Error(`volcengine poll non-JSON: ${truncate(pollText, 200)}`);
}
lastStatus = pollData.status || '';
// Forward each poll tick. Heartbeat doubles as a "command is alive"
// signal for the agent's bash tool — the daemon's SSE stream emits
// an event for every line, which cc renders into the chat as live
// output so its watchdog never marks the call as hung.
if (typeof onProgress === 'function') {
const elapsedSec = Math.round((Date.now() - startedAt) / 1000);
onProgress(`volcengine task ${taskId} status=${lastStatus || 'pending'} (elapsed ${elapsedSec}s)`);
}
if (lastStatus === 'succeeded') {
videoUrl = pollData?.content?.video_url || null;
break;
}
if (lastStatus === 'failed' || lastStatus === 'cancelled') {
const reason = pollData?.error?.message || lastStatus;
throw new Error(`volcengine task ${lastStatus}: ${reason}`);
}
}
if (!videoUrl) {
throw new Error(`volcengine task did not finish in time (last status: ${lastStatus || 'unknown'})`);
}
const dlResp = await fetch(videoUrl, withMediaRequestInit(ctx));
if (!dlResp.ok) throw new Error(`volcengine video fetch ${dlResp.status}`);
const arr = await dlResp.arrayBuffer();
const bytes = Buffer.from(arr);
return {
bytes,
providerNote: `volcengine/${ctx.wireModel} · ${ratio} · ${durationSec}s · ${bytes.length} bytes`,
suggestedExt: '.mp4',
};
}
View on GitHub (pinned to 5be4028344)
Solutions
- Read `reason` — moderation → reword prompt/swap image; resource exhaustion → switch region or retry later; cancelled → check the Volcengine console.
- If i2v, ensure the reference image meets Seedance's size/format constraints.
- Retry once after addressing the cited reason; do NOT blindly retry a moderation failure.
Defensive patterns
Strategy: try-catch
Try / catch
try {
return await renderVolcengineVideo(ctx, credentials, onProgress);
} catch (err) {
const msg = err instanceof Error ? err.message : String(err);
if (/task failed/.test(msg) && /moderat|content/i.test(msg)) {
throw new Error('Seedance rejected the prompt on content grounds — reword and retry');
}
if (/resource|exhaust/i.test(msg)) { /* switch region or retry later */ }
throw err;
} Prevention
- Never blindly retry a moderation failure — reword the prompt or swap the input image first.
- For i2v, validate the reference image's size/format before submission.
- On regional GPU exhaustion, retry off-peak or switch regions.
When it happens
Trigger: `pollData.status === 'failed'` or `'cancelled'`. Concrete: content-policy rejection of the prompt, source image disallowed for i2v, GPU resource exhaustion in the region, or the task was cancelled (manually or by quota revocation).
Common situations: (1) Prompt or input image tripped Volcengine content moderation; (2) regional GPU saturation causing Seedance to fail rather than queue; (3) account quota revoked mid-task.
Related errors
- volcengine task create ${taskResp.status}: ${truncate(taskTe
- volcengine poll ${pollResp.status}: ${truncate(pollText, 240
- volcengine task did not finish in time (last status: ${lastS
- volcengine video fetch ${dlResp.status}
- no Volcengine Ark API key — configure it in Settings or set
AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12).
Data as JSON: /api/errors/951ea557515cfdc3.
Report an issue: GitHub.