nexu-io/open-design · error · Error

volcengine video fetch ${dlResp.status}

Error message

volcengine video fetch ${dlResp.status}

What it means

Thrown when downloading the produced video bytes from the temporary `video_url` Volcengine returned fails (`!dlResp.ok`). The temp URL is only valid ~24h, so the dispatcher streams bytes immediately; a non-2xx here usually means the URL expired, the CDN errored, or access was revoked.

Source

Thrown at apps/daemon/src/media/index.ts:1519

    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',
  };
}

function volcengineRatioFor(aspect?: string): string {
  // Seedance accepts a fixed list of ratios; map the OD vocabulary to
  // its canonical strings.
  if (!aspect) return '16:9';
  if (aspect === '1:1' || aspect === '16:9' || aspect === '9:16' || aspect === '4:3' || aspect === '3:4') {
    return aspect;
  }
  return '16:9';

View on GitHub (pinned to 5be4028344)

Solutions

  1. Retry the render; the download step is idempotent against transient CDN errors.
  2. Ensure the Volcengine object-storage/CDN host is reachable from the daemon host.
  3. If persistent, check whether the region's storage endpoint is allowlisted.
Defensive patterns

Strategy: retry

Try / catch

// The succeeded task id is useless once the URL fetch fails — retry the whole render.
try { return await renderVolcengineVideo(ctx, credentials, onProgress); }
catch (err) {
  const msg = err instanceof Error ? err.message : String(err);
  if (/video fetch 5\d{2}/.test(msg)) { return await renderVolcengineVideo(ctx, credentials, onProgress); }
  throw err;
}

Prevention

When it happens

Trigger: `dlResp.ok === false` on the `GET videoUrl` after the task succeeded. Causes: the signed/expiring URL already invalidated (rare within the same render), the object-storage CDN returned a transient 5xx, or a network/proxy blocked the object-storage host.

Common situations: (1) Object-storage CDN transient 5xx; (2) network policy blocking the Volcengine CDN domain; (3) unusually long delay between task success and download (paused process, clock skew).

Related errors


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