vercel/ai · error · NoVideoGeneratedError

No video generated.

Error message

No video generated.

What it means

After all generation attempts finish, experimental_generateVideo collects the produced videos; if the array is empty, it throws NoVideoGeneratedError (which carries the provider `responses`). This means the provider call(s) succeeded at the transport level but returned no usable video data — often a content-policy refusal, unsupported prompt, or an empty/unexpected provider response body.

Source

Thrown at packages/ai/src/generate-video/generate-video.ts:455

      }
    }

    warnings.push(...result.warnings);

    responses.push({
      timestamp: result.response.timestamp,
      modelId: result.response.modelId,
      headers: result.response.headers,
      providerMetadata: result.providerMetadata,
    });

    if (result.providerMetadata != null) {
      mergeProviderMetadata(providerMetadata, result.providerMetadata);
    }
  }

  if (videos.length === 0) {
    throw new NoVideoGeneratedError({ responses });
  }

  if (warnings.length > 0) {
    logWarnings({
      warnings,
      provider: model.provider,
      model: model.modelId,
    });
  }

  return {
    video: videos[0],
    videos,
    warnings,
    responses,
    providerMetadata,
  };
}

View on GitHub (pinned to 69428b1f8b)

Solutions

  1. Inspect error.responses (and result warnings) to see what the provider actually returned.
  2. Adjust the prompt to comply with the provider's content policy and retry.
  3. Verify the model id is valid and enabled for your account/region.
  4. Handle AI_NoVideoGeneratedError explicitly in catch blocks and offer the user a retry path.
  5. If using a custom model, make doGenerate/doStatus return a non-empty videos array.

Example fix

// before
const { video } = await experimental_generateVideo({ model, prompt }); // throws when empty

// after
try {
  const { video } = await experimental_generateVideo({ model, prompt });
} catch (error) {
  if (NoVideoGeneratedError.isInstance(error)) {
    console.warn('No video returned:', error.responses);
    // retry with adjusted prompt or notify user
  } else {
    throw error;
  }
}
Defensive patterns

Strategy: try-catch

Validate before calling

// No reliable pre-call check; validate the prompt against provider policy and model availability
if (!isModelEnabledForAccount(modelId)) {
  throw new Error(`model ${modelId} not enabled for this account`);
}

Type guard

null

Try / catch

try {
  const result = await experimental_generateVideo({ model, prompt });
} catch (error) {
  if (NoVideoGeneratedError.isInstance(error)) {
    console.warn('Provider returned no video:', error.responses);
    // retry with adjusted prompt or notify the user
  } else throw error;
}

Prevention

When it happens

Trigger: Provider returns a 200 response whose body contains no video (filtered/moderated prompt, empty output list); all polled status checks report completion with no artifacts; a custom doGenerate implementation resolves with an empty videos array.

Common situations: Prompts rejected by the provider's safety filters; model id that does not actually produce output (preview/deprecated models); a custom mock model that returns no videos; quota/entitlement issues where the provider silently returns empty results.

Related errors


AI-assisted analysis of vercel/ai@69428b1f8b (2026-08-30). Data as JSON: /api/errors/feb25d05051cfc83. Report an issue: GitHub.