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

  1. Use a video model whose provider implements the async start/status flow (e.g. async-capable provider models).
  2. If the model is synchronous, obtain the result directly from generateVideo instead of polling status.
  3. If it's a custom model wrapper, implement doStatus per LanguageModelV* video spec.
  4. 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

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


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