nexu-io/open-design · error · Error

volcengine task create ${taskResp.status}: ${truncate(taskTe

Error message

volcengine task create ${taskResp.status}: ${truncate(taskText, 240)}

What it means

Thrown when the Seedance task-creation `POST /api/v3/contents/generations/tasks` returns a non-2xx status. The message includes the HTTP status and up to 240 chars of the body, surfacing Volcengine's JSON error (auth, quota, model-not-enabled, invalid params).

Source

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

    });
  }

  const taskBody = {
    model: ctx.wireModel,
    content,
  };

  const taskResp = await fetch(`${baseUrl}/contents/generations/tasks`, withMediaRequestInit(ctx, {
    method: 'POST',
    headers: {
      'authorization': `Bearer ${credentials.apiKey}`,
      'content-type': 'application/json',
    },
    body: JSON.stringify(taskBody),
  }));
  const taskText = await taskResp.text();
  if (!taskResp.ok) {
    throw new Error(`volcengine task create ${taskResp.status}: ${truncate(taskText, 240)}`);
  }
  let taskData: any;
  try {
    taskData = JSON.parse(taskText);
  } catch {
    throw new Error(`volcengine non-JSON: ${truncate(taskText, 200)}`);
  }
  const taskId = taskData && taskData.id;
  if (!taskId) throw new Error('volcengine task response missing id');

  // Poll until succeeded/failed. Keep a hard cap, but make it long
  // enough for real Seedance queues: fast t2v often returns in 30-120s,
  // while i2v and busy-region t2v can exceed the old 6-minute ceiling.
  const startedAt = Date.now();
  const configuredMaxMs = Number(process.env.OD_VOLCENGINE_VIDEO_MAX_POLL_MS);
  const maxMs =
    Number.isFinite(configuredMaxMs) && configuredMaxMs >= 60_000
      ? configuredMaxMs

View on GitHub (pinned to 5be4028344)

Solutions

  1. Inspect the embedded status+body: 401 → fix key; 403/'permission denied' → enable the Seedance model in the Volcengine console under inference access; 400 → adjust aspect/duration; 429 → wait for quota reset.
  2. Ensure `ctx.wireModel` matches an activated Ark endpoint id (e.g. `ep-xxxx`) or model name.
  3. If using a custom `baseUrl`, confirm it's the correct regional Ark host (`ark.cn-beijing.volces.com`).
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 create 429/.test(msg)) { /* quota — do not retry immediately */ }
  if (/task create 40[13]/.test(msg)) { throw new Error('Volcengine auth failed — check ARK_API_KEY'); }
  if (/permission|forbidden/i.test(msg)) { throw new Error('Seedance model not activated for this account'); }
  throw err;
}

Prevention

When it happens

Trigger: `taskResp.ok === false` on creation. Concretely: 401 from a wrong/expired ARK key, 403/permission-denied because the Seedance model isn't activated for the account, 400 from an unsupported `--resolution`/`--ratio`/`--duration` flag combination, or 429 quota exhaustion.

Common situations: (1) ARK key valid but the specific Doubao Seedance model not subscribed/activated in the Volcengine console; (2) ratio/duration/resolution combination Seedance rejects; (3) account out of video-generation quota; (4) `baseUrl` overridden to a region that doesn't host the model.

Related errors


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