{"record":{"id":"5c300c30aadbba99","repo":"vercel/ai","slug":"video-model-model-modelid-does-not-implement-do-5c300c","errorCode":null,"errorMessage":"Video model ${model.modelId} does not implement doStatus.","messagePattern":"Video model (.+?) does not implement doStatus\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/ai/src/generate-video/get-video-status.ts","lineNumber":49,"sourceCode":" */\nexport async function experimental_getVideoStatus(\n  modelArg: VideoModel,\n  {\n    operation,\n    headers,\n    abortSignal,\n    maxRetries: maxRetriesArg,\n  }: {\n    operation: JSONValue;\n    headers?: Record<string, string>;\n    abortSignal?: AbortSignal;\n    maxRetries?: number;\n  },\n): Promise<GetVideoStatusResult> {\n  const model = resolveVideoModel(modelArg);\n\n  if (model.doStatus == null) {\n    throw new Error(\n      `Video model ${model.modelId} does not implement doStatus.`,\n    );\n  }\n\n  const { retry } = prepareRetries({\n    maxRetries: maxRetriesArg,\n    abortSignal,\n  });\n\n  return retry(() =>\n    model.doStatus!({\n      operation,\n      headers: withUserAgentSuffix(headers ?? {}, `ai/${VERSION}`),\n      abortSignal,\n    }),\n  );\n}\n","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/vercel/ai/blob/69428b1f8b037e4d118fb4853428d5c4e620493c/packages/ai/src/generate-video/get-video-status.ts#L31-L67","documentation":"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.","triggerScenarios":"Calling experimental_getVideoStatus (or getVideoStatusStep in an agent/step context) with a model that only supports synchronous generateVideo and has no start/status flow.","commonSituations":"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.","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."],"exampleFix":"// before\nconst status = await experimental_getVideoStatus({ model: syncVideoModel, operation });\n// after\nconst status = await experimental_getVideoStatus({ model: asyncVideoModel, operation }); // model with doStatus\n// or for sync models use generateVideo directly","handlingStrategy":"type-guard","validationCode":"if (model.doStatus == null) {\n  throw new Error(`${model.modelId} cannot be polled; use generateVideo instead`);\n}","typeGuard":"function supportsDoStatus(model) {\n  return typeof model?.doStatus === 'function';\n}","tryCatchPattern":"try {\n  const status = await experimental_getVideoStatus({ model, operation });\n} catch (e) {\n  if (e.message.includes('does not implement doStatus')) {\n    // switch to a sync flow or an async-capable model\n  }\n}","preventionTips":["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."],"tags":["video","capability","unsupported-operation"],"backgroundTag":"model-capability-not-implemented","analyzedSha":"69428b1f8b037e4d118fb4853428d5c4e620493c","analyzedAt":"2026-08-30T12:32:21.016Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}