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
- Switch to a model that supports the async start/status flow.
- Use generateVideo instead for synchronous models.
- Implement doStart in your custom model wrapper if you own it.
- 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
- Route models without async support to generateVideo.
- Verify doStart exists on custom model implementations.
- Maintain a capability map of your models.
- Update provider packages to versions with async video support.
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
- Video model ${model.modelId} does not implement doStatus.
- Video model ${model.modelId} does not implement doGenerate o
- No video generated.
- Video generation timed out after ${timeoutMs}ms.
- statusResult.error
AI-assisted analysis of vercel/ai@69428b1f8b (2026-08-30).
Data as JSON: /api/errors/bb00ce37112d8a1e.
Report an issue: GitHub.