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

  1. Read `reason` — moderation → reword prompt/swap image; resource exhaustion → switch region or retry later; cancelled → check the Volcengine console.
  2. If i2v, ensure the reference image meets Seedance's size/format constraints.
  3. 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

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


AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12). Data as JSON: /api/errors/951ea557515cfdc3. Report an issue: GitHub.