模型能力

视频生成

使用 Grok 视频模型根据文本 prompt 生成视频。API 支持配置 duration、aspect ratio 和 resolution,SDK 会自动处理异步 polling。在 grok-imagine-video-1.5 上,text-to-video 支持原生 1080p。

快速开始

通过一次 API 调用生成视频:

import os
import xai_sdk

client = xai_sdk.Client(api_key=os.getenv("XAI_API_KEY"))

response = client.video.generate(
    prompt="A glowing crystal-powered rocket launching from the red dunes of Mars, ancient alien ruins lighting up in the background as it soars into a sky full of unfamiliar constellations",
    model="grok-imagine-video-1.5",
    duration=10,
    aspect_ratio="16:9",
    resolution="720p",
)

print(response.url)

视频生成是一个异步过程,通常最多需要几分钟才能完成。具体耗时取决于:

  • Prompt 复杂度 — 场景越详细,需要的处理越多

  • Duration — 视频越长,生成时间越长

  • Resolution — resolution 越高(1080p 相比 480p),处理时间越长

  • 视频编辑 — 与 image-to-video 或 text-to-video 相比,编辑现有视频会增加额外开销

视频工作流

请根据希望创建的视频输出类型选择对应页面:

工作原理

在底层,视频生成分为两个步骤:

  1. 启动 — 提交生成请求并接收 request_id

  2. Poll — 使用 request_id 反复检查 status,直到视频就绪

xAI SDK 的 generate()extend() 方法完全封装了这一过程;它们会提交请求、poll 结果并返回已完成的视频 response。你无需管理 request ID 或实现 polling 逻辑。对于长时间运行的生成任务,你可以自定义 polling 行为,设置 timeout 和 interval 参数;也可以手动处理 polling,从而完全控制生成生命周期。

REST API 用户必须手动实现这一两步流程:

第 1 步:启动生成请求

Bash

curl -X POST https://api.x.ai/v1/videos/generations \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $XAI_API_KEY" \
  -d '{
    "model": "grok-imagine-video-1.5",
    "prompt": "A glowing crystal-powered rocket launching from Mars"
  }'

Response:

JSON

{"request_id": "d97415a1-5796-b7ec-379f-4e6819e08fdf"}

第 2 步:Poll 结果

使用 request_id 检查 status。每隔几秒继续 polling,直到视频就绪:

Bash

curl -X GET "https://api.x.ai/v1/videos/{request_id}" \
  -H "Authorization: Bearer $XAI_API_KEY"

Response 包含一个 status 字段,其值为以下之一:

Status说明
pending视频仍在生成
done视频已就绪
expired请求已过期
failed视频生成失败

Response(完成时):

JSON

{
  "status": "done",
  "video": {
    "url": "https://vidgen.x.ai/.../video.mp4",
    "duration": 8,
    "respect_moderation": true
  },
  "model": "grok-imagine-video-1.5"
}

视频以临时 URL 形式返回。需要时可以直接访问 xAI 托管的 URL;如果需要保留副本,请及时下载或处理。

配置

视频生成 API 允许你控制生成视频的输出格式。你可以指定 duration、aspect ratio、resolution,以及(在 reference-to-video 中)preset voice,以满足具体用例。

Duration

使用 duration 参数控制视频长度。允许范围为 1–15 秒。

视频编辑不支持自定义 duration。编辑后的视频会保留原视频时长,上限为 8.7 秒。

Aspect Ratio

Ratio用例
1:1社交媒体、缩略图
16:9 / 9:16宽屏、移动端、Stories(默认:16:9
4:3 / 3:4演示文稿、人像
3:2 / 2:3摄影

对于 image-to-video 生成,输出默认采用输入图像的 aspect ratio。如果指定 aspect_ratio 参数,则会覆盖默认值,并将图像拉伸到所需的 aspect ratio。

视频编辑不支持自定义 aspect_ratio — 输出会匹配输入视频的 aspect ratio。

Resolution

Resolution说明
1080pFull HD 画质
720pHD 画质
480p标准清晰度,处理更快(默认)

注意: 1080pgrok-imagine-video-1.5 上支持 text-to-video 和 image-to-video。Reference-to-video 最高为 720p。

视频编辑不支持自定义 resolution。输出 resolution 会匹配输入视频的 resolution,最高为 720p(例如,1080p 输入会缩小到 720p)。

音频

grok-imagine-video-1.5 上,reference-to-video 可以通过 reference_audios 携带 voice。voice 来自内置列表,并通过 voice_id 命名;你不能上传自己的音频 clip:

属性说明
来源一个 preset voice_id(例如 {"voice_id": "eve"}),来自与 Text to Speech 相同的列表。标识符不区分大小写
限制每次请求最多 3 个 voice
Prompt按索引引用 voice:<AUDIO_0> 上,<AUDIO_1> 上,<AUDIO_2>

生成的视频默认包含音轨。

示例

import os
import xai_sdk

client = xai_sdk.Client(api_key=os.getenv("XAI_API_KEY"))

response = client.video.generate(
    prompt="Timelapse of a flower blooming in a sunlit garden",
    model="grok-imagine-video-1.5",
    duration=10,
    aspect_ratio="16:9",
    resolution="720p",
)

print(f"Video URL: {response.url}")
print(f"Duration: {response.duration}s")

请求模式

视频生成 endpoint 支持多种模式,具体模式由设置的字段决定。每次请求只能激活一种模式:

模式REST API 字段AI SDK 结构说明
Text-to-videoprompt onlyprompt: "..."仅根据文本 prompt 生成视频。
Image-to-videoprompt + imageprompt: { image, text }使用提供的图像作为起始帧生成视频。
Reference-to-videoprompt + reference_imagesreference_audiosprompt: "..." + providerOptions.xai.{ mode: "reference-to-video", referenceImageUrls }grok-imagine-video-1.5 上,根据参考图像和/或 preset voice 引导视频生成。
Edit-video/v1/videos/edits + videoprompt: "..." + providerOptions.xai.{ mode: "edit-video", videoUrl }根据 prompt 修改现有视频。
Extend-video/v1/videos/extensions + videoprompt: "..." + providerOptions.xai.{ mode: "extend-video", videoUrl }从现有视频的最后一帧进行扩展。

以下组合不允许使用,并会返回 400 Bad Request 错误:

  • image + reference_images — 二者只能选其一

  • 在 AI SDK 中混用 mode 值 — 每次请求只支持 "edit-video" 上,"extend-video""reference-to-video"

省略 mode 时,AI SDK 会使用标准生成模式。

自定义 Polling 行为

使用 SDK 的 generate()extend() 方法时,可以控制等待时长和结果检查频率:

Python SDKAI SDK(providerOptions.xai说明默认值
timeoutpollTimeoutMs等待视频完成的最长时间10 分钟
intervalpollIntervalMsstatus 检查间隔100 毫秒
import os
from datetime import timedelta
import xai_sdk

client = xai_sdk.Client(api_key=os.getenv("XAI_API_KEY"))

response = client.video.generate(
    prompt="Epic cinematic drone shot flying through mountain peaks",
    model="grok-imagine-video-1.5",
    duration=15,
    timeout=timedelta(minutes=15),  # Wait up to 15 minutes
    interval=timedelta(seconds=5),  # Check every 5 seconds
)

print(response.url)

如果视频在 timeout 期限内仍未就绪,Python SDK 会抛出 TimeoutError,AI SDK 则会通过其 AbortSignal 中止。如需更精细的控制,请使用手动 polling 方式;Python SDK 提供 start()get() 方法,AI SDK 则支持自定义 abortSignal 来取消操作。

手动处理 Polling

如需精细控制生成生命周期,请分别使用 start()extend_start() 发起生成/扩展请求,并使用 get() 检查 status。

get() 方法会返回包含 status 字段的 response。请从 SDK 导入 status enum:

import os
import time
import xai_sdk
from xai_sdk.proto import deferred_pb2

client = xai_sdk.Client(api_key=os.getenv("XAI_API_KEY"))

# Start the generation request
start_response = client.video.start(
    prompt="A cat lounging in a sunbeam, tail gently swishing",
    model="grok-imagine-video-1.5",
    duration=5,
)

print(f"Request ID: {start_response.request_id}")

# Poll for results
while True:
    result = client.video.get(start_response.request_id)
    
    if result.status == deferred_pb2.DeferredStatus.DONE:
        print(f"Video URL: {result.response.video.url}")
        break
    elif result.status == deferred_pb2.DeferredStatus.EXPIRED:
        print("Request expired")
        break
    elif result.status == deferred_pb2.DeferredStatus.FAILED:
        print("Video generation failed")
        break
    elif result.status == deferred_pb2.DeferredStatus.PENDING:
        print("Still processing...")
        time.sleep(5)

可用的 status 值如下:

Proto 值说明
deferred_pb2.DeferredStatus.PENDING视频仍在生成
deferred_pb2.DeferredStatus.DONE视频已就绪
deferred_pb2.DeferredStatus.EXPIRED请求已过期
deferred_pb2.DeferredStatus.FAILED视频生成失败

错误处理

使用 SDK 的 generate()extend() 方法时,视频生成失败会以 VideoGenerationError exception 形式抛出。该 exception 包含 codemessage,用于说明错误原因。请从 xai_sdk.video 导入:

Python

import os
import xai_sdk
from xai_sdk.video import VideoGenerationError

client = xai_sdk.Client(api_key=os.getenv("XAI_API_KEY"))

try:
    response = client.video.generate(
        prompt="A cat lounging in a sunbeam, tail gently swishing",
        model="grok-imagine-video-1.5",
        duration=5,
    )
    print(response.url)
except VideoGenerationError as e:
    print(f"Error code: {e.code}")
    print(f"Error message: {e.message}")

VideoGenerationError exception 具有以下属性:

属性类型说明
codestr用于标识失败原因的错误代码
messagestr描述失败原因的可读消息

手动 polling 时,生成失败会返回 status: "failed",其中包含 error 对象:

JSON

{
  "status": "failed",
  "error": {
    "code": "invalid_argument",
    "message": "Prompt cannot be empty. Please provide a prompt."
  }
}

可能的 error.code 值如下:

代码含义处理方式
invalid_argument请求输入无效,例如不支持的 duration、无效的图像或视频输入、过长的 prompt、冲突的请求模式,或内容被 moderation 阻止。修正请求参数或输入媒体,然后提交新请求。
permission_deniedAPI key 或 team 没有执行所请求视频操作的权限。确认 API key 属于正确的 team,并且该 team 有权访问所请求的能力。
failed_precondition所选 model 或设置不支持请求的操作,例如视频编辑、视频扩展,或 model 无法处理所请求的 resolution。更改 model、mode、resolution 或其他请求设置。
service_unavailable视频生成服务暂时过载。稍后重试请求。
internal_error服务因内部故障无法完成生成。重试请求。如果错误仍然存在,请携带 request_id 上,根据参考图像和/或 preset voice 引导视频生成。

身份验证错误、model 不存在和 rate limit 会在创建视频 job 之前作为标准 API 错误同步返回,因此不会出现在失败视频结果的 error.code 字段中。

你可以将其与 TimeoutError 处理结合使用,以全面覆盖错误:

Python

import os
import xai_sdk
from xai_sdk.video import VideoGenerationError

client = xai_sdk.Client(api_key=os.getenv("XAI_API_KEY"))

try:
    response = client.video.generate(
        prompt="A cat lounging in a sunbeam, tail gently swishing",
        model="grok-imagine-video-1.5",
        duration=5,
    )
    print(response.url)
except VideoGenerationError as e:
    print(f"Generation failed [{e.code}]: {e.message}")
except TimeoutError:
    print("Generation timed out — try increasing the timeout or simplifying the prompt")

Response 详情

SDK response 包含生成的视频和 provider-specific metadata。在 AI SDK 中,xAI 托管的输出 URL 位于 providerMetadata.xai.videoUrl 上,根据参考图像和/或 preset voice 引导视频生成。

if response.respect_moderation:
    print(response.url)
else:
    print("Video filtered by moderation")

print(f"Duration: {response.duration} seconds")
print(f"Model: {response.model}")

并发请求

需要生成多个视频时,请并发运行请求。这对于比较 prompt 或创建多个变体尤其有用。

Python

import os
import asyncio
import xai_sdk

async def generate_concurrently():
    client = xai_sdk.AsyncClient(api_key=os.getenv("XAI_API_KEY"))

    prompts = [
        "A cat sitting on a sunlit windowsill, tail gently swishing.",
        "A dog sprinting through a field of tall grass at golden hour.",
        "A hummingbird hovering near a red flower in slow motion.",
    ]

    tasks = [
        client.video.generate(
            prompt=prompt,
            model="grok-imagine-video-1.5",
            duration=5,
        )
        for prompt in prompts
    ]

    results = await asyncio.gather(*tasks)

    for prompt, result in zip(prompts, results):
        print(f"{prompt}: {result.url}")

asyncio.run(generate_concurrently())