vercel/ai · error
Video model ${model.modelId} does not implement doStatus.
Error message
Video model ${model.modelId} does not implement doStatus. What it means
experimental_getVideoStatus requires the video model to implement the doStatus method for polling async operations. The resolved model lacks doStatus, so status cannot be queried; the SDK throws immediately with the model ID. This is a capability mismatch, not a runtime failure.
Source
Thrown at packages/ai/src/generate-video/get-video-status.ts:49
*/
export async function experimental_getVideoStatus(
modelArg: VideoModel,
{
operation,
headers,
abortSignal,
maxRetries: maxRetriesArg,
}: {
operation: JSONValue;
headers?: Record<string, string>;
abortSignal?: AbortSignal;
maxRetries?: number;
},
): Promise<GetVideoStatusResult> {
const model = resolveVideoModel(modelArg);
if (model.doStatus == null) {
throw new Error(
`Video model ${model.modelId} does not implement doStatus.`,
);
}
const { retry } = prepareRetries({
maxRetries: maxRetriesArg,
abortSignal,
});
return retry(() =>
model.doStatus!({
operation,
headers: withUserAgentSuffix(headers ?? {}, `ai/${VERSION}`),
abortSignal,
}),
);
}
View on GitHub (pinned to 69428b1f8b)
Solutions
- Use a video model whose provider implements the async start/status flow (e.g. async-capable provider models).
- If the model is synchronous, obtain the result directly from generateVideo instead of polling status.
- If it's a custom model wrapper, implement doStatus per LanguageModelV* video spec.
- Check model.provider support before calling the status API.
Example fix
// before
const status = await experimental_getVideoStatus({ model: syncVideoModel, operation });
// after
const status = await experimental_getVideoStatus({ model: asyncVideoModel, operation }); // model with doStatus
// or for sync models use generateVideo directly Defensive patterns
Strategy: type-guard
Validate before calling
if (model.doStatus == null) {
throw new Error(`${model.modelId} cannot be polled; use generateVideo instead`);
} Type guard
function supportsDoStatus(model) {
return typeof model?.doStatus === 'function';
} Try / catch
try {
const status = await experimental_getVideoStatus({ model, operation });
} catch (e) {
if (e.message.includes('does not implement doStatus')) {
// switch to a sync flow or an async-capable model
}
} Prevention
- Check model capabilities before choosing start/status vs generateVideo.
- Keep custom model wrappers implementing the full video spec.
- Document per-model async support in your model registry.
- Pin provider package versions that implement doStatus for your models.
When it happens
Trigger: Calling experimental_getVideoStatus (or getVideoStatusStep in an agent/step context) with a model that only supports synchronous generateVideo and has no start/status flow.
Common situations: Passing a synchronous-only video model (no async flow) to the async status API; using a custom/mock model implementation missing doStatus; swapping models after upgrading where the new model is sync-only.
Related errors
- Video model ${model.modelId} does not implement doStart. Use
- 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/5c300c30aadbba99.
Report an issue: GitHub.