vercel/ai · error

Video model ${model.modelId} does not implement doStart. Use

Error message

Video model ${model.modelId} does not implement doStart. Use generateVideo for models without an asynchronous start/status flow.

What it means

experimental_startVideo requires a model implementing doStart (the async start/status flow). If the resolved model has no doStart, it cannot produce an operation; the SDK throws and points you to generateVideo, which handles models without an async flow.

Source

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

  seed?: number;
  frameImages?: Array<{
    image: DataContent;
    frameType: Experimental_VideoModelV4FrameType;
  }>;
  inputReferences?: Array<
    DataContent | { data: DataContent; mediaType?: string }
  >;
  generateAudio?: boolean;
  providerOptions?: ProviderOptions;
  maxRetries?: number;
  abortSignal?: AbortSignal;
  headers?: Record<string, string>;
  webhookUrl?: string;
}): Promise<StartVideoResult> {
  const model = resolveVideoModel(modelArg);

  if (model.doStart == null) {
    throw new Error(
      `Video model ${model.modelId} does not implement doStart. ` +
        'Use generateVideo for models without an asynchronous start/status flow.',
    );
  }

  if (!Number.isInteger(n) || n < 1) {
    throw new Error(
      `Invalid n: expected a positive integer, received ${JSON.stringify(n)}.`,
    );
  }

  // A start yields one operation covering all n videos: refuse to silently
  // exceed a known per-call limit instead of splitting into several starts.
  const knownMaxVideosPerCall =
    maxVideosPerCall ??
    (typeof model.maxVideosPerCall === 'function'
      ? await model.maxVideosPerCall({ modelId: model.modelId })
      : model.maxVideosPerCall);

View on GitHub (pinned to 69428b1f8b)

Solutions

  1. Switch to a model that supports the async start/status flow.
  2. Use generateVideo instead for synchronous models.
  3. Implement doStart in your custom model wrapper if you own it.
  4. Gate the call at runtime by checking typeof model.doStart === 'function'.

Example fix

// before
const op = await experimental_startVideo({ model: syncModel, prompt });
// after
const { video } = await generateVideo({ model: syncModel, prompt }); // sync model
// or: const op = await experimental_startVideo({ model: asyncModel, prompt });
Defensive patterns

Strategy: type-guard

Validate before calling

if (model.doStart == null) {
  // use generateVideo for this model instead
}

Type guard

function supportsDoStart(model) {
  return typeof model?.doStart === 'function';
}

Try / catch

try {
  await experimental_startVideo({ model, prompt, n });
} catch (e) {
  if (e.message.includes('does not implement doStart')) {
    const { video } = await generateVideo({ model, prompt, n });
  }
}

Prevention

When it happens

Trigger: Calling experimental_startVideo (or startVideoStep) with a video model whose provider only supports synchronous generation (doStart undefined).

Common situations: Using startVideo against a synchronous video model; custom model implementation missing doStart; migrating code from generateVideo to startVideo without checking model support.

Related errors


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