--- title: Wan2.2 14B Fast Preview [NEW] emoji: 🏆 colorFrom: indigo colorTo: pink sdk: gradio sdk_version: 6.0.1 app_file: app.py pinned: false --- # Wan 2.2 I2V 14B Lightning · ZeroGPU 本 Space 保留 Gradio UI、MCP、`/generate_video` 与 `/extract_frame`,并额外提供一个不依赖 Gradio SSE 的异步视频任务 API。任务状态和幂等索引保存在当前进程内,Space 重启后不会保留;完成结果默认保存 1800 秒。 ## Space 配置 必需 Secret: - `HF_TOKEN`:仅用于读取模型或私有 LoRA,不会替代调用方的 Hugging Face 身份。 - `JOB_API_KEY`:至少 32 字符的随机共享密钥,仅通过 `X-API-Key` 传入,禁止提交到仓库。 平台内置 Variable: - `SPACE_HOST`:由 Hugging Face 自动注入,代码用它生成公开 URL;这是保留变量,不能在 Space Settings 中手工创建同名 Variable。 必需 Variable: - `JOB_IMAGE_ALLOWED_HOSTS`:允许抓取首图和尾图的精确主机名,以逗号分隔,不支持通配符、协议、端口或路径。 可选 Variable: - `JOB_RESULT_TTL_SECONDS`:终态结果保留秒数,默认 `1800`。 - `JOB_POLL_AFTER_SECONDS`:建议轮询间隔,默认 `2`。 - `JOB_IMAGE_FETCH_TIMEOUT_SECONDS`:单图连接与总抓取期限,默认且最大 `15`。 - `JOB_IMAGE_MAX_BYTES`:单图字节上限,默认且最大 `20971520`(20 MiB)。 - `JOB_IMAGE_MAX_PIXELS`:单图像素上限,默认且最大 `40000000`。 修改 Secret 或 Variable 会触发 Space 重启。 ## 自定义视频任务 API 所有任务管理请求都需要 `X-API-Key`。`Idempotency-Key` 可省略,正式调用方应提供不超过 200 字符的稳定唯一值。相同键与相同请求体只会生成一次;相同键配合不同请求体返回 `409`。 创建任务: ```bash curl -i -X POST "https://idlecloudx-i2v-1.hf.space/api/jobs" \ -H "X-API-Key: your-shared-random-key" \ -H "Idempotency-Key: caller-generated-unique-value" \ -H "Content-Type: application/json" \ --data '{ "input_image_url": "https://allowed.example/input.png", "last_image_url": null, "prompt": "make this image come alive, cinematic motion, smooth animation", "steps": 6, "negative_prompt": "", "duration_seconds": 3.5, "guidance_scale": 1, "guidance_scale_2": 1, "seed": 42, "randomize_seed": false, "quality": 6, "scheduler": "UniPCMultistep", "flow_shift": 3.0, "frame_multiplier": 16, "safe_mode": true, "lora_groups": [], "gpu_duration_seconds": 59 }' ``` `input_image_url` 必须是白名单精确主机上的 HTTPS URL;`last_image_url` 可空。抓取禁止重定向、用户信息、非默认端口和非公网解析地址,不会向图片主机转发 `Authorization`、Cookie、API key 或 ZeroGPU 请求头。每张图片仅接受实际 PNG/JPEG/WebP。`lora_groups` 中每一项都必须与当前 UI 下拉框显示名称完全一致。 字段边界: | 字段 | 默认值 | 边界 | | --- | --- | --- | | `prompt` | 当前 UI 默认文案 | 非空,最长 5000 | | `negative_prompt` | 当前 UI 默认文案 | 最长 5000,可空 | | `steps` | `6` | 1–30 | | `duration_seconds` | `3.5` | 0.5–20.1 | | `guidance_scale`, `guidance_scale_2` | `1` | 0–10 | | `seed` | `42` | 0–2147483647 | | `randomize_seed` | `true` | 布尔值 | | `quality` | `6` | 1–10 | | `scheduler` | `UniPCMultistep` | UI 当前 7 个调度器之一 | | `flow_shift` | `3.0` | 0.5–15 | | `frame_multiplier` | `16` | 仅 16/32/64/128 | | `safe_mode` | `true` | 布尔值 | | `gpu_duration_seconds` | `59` | 整数 1–59 | `gpu_duration_seconds` 只控制自定义任务向 ZeroGPU 申请的最长 GPU 时间,不改变生成参数,也不在 Space 内预估任务能否在该时间内完成。参数组合超过申请时长时由 Hugging Face 终止执行,并按普通生成失败返回脱敏的 `GENERATION_FAILED`。现有 UI、MCP 与 Gradio `/generate_video` 不接收此字段,继续使用原有动态时长估算。 成功创建返回 `202`,并同时设置 `Location` 与 `Cache-Control: no-store`: ```json {"job_id":"...","status_url":"https://.../api/jobs/...","poll_after_seconds":2} ``` 使用同一个 API key 轮询 `GET /api/jobs/{job_id}`。排队或运行中返回 `202`、`Retry-After` 和 `{"status":"queued"}` / `{"status":"running"}`。完成后返回: ```json {"video_url":"https://.../api/jobs/.../video?token=...","used_seed":42} ``` `video_url` 自带短期随机凭证,不再需要 API key。它支持 `GET`、`HEAD` 和单区间 `Range`: ```bash curl -I "https://.../api/jobs/.../video?token=..." curl -H "Range: bytes=0-1023" "https://.../api/jobs/.../video?token=..." -o first-kib.bin ``` 视频返回 `video/mp4`,有效单区间为 `206`;多区间或不可满足范围为 `416`。响应允许跨域播放,缓存策略为 `private, max-age=300`。 ## 身份、配额与并发 - 不带 `Authorization` 时,Hugging Face 将请求计入匿名共享 ZeroGPU 配额。 - 带 `Authorization: Bearer hf_<调用方令牌>` 时,由 Hugging Face 将生成计入调用方自己的 ZeroGPU 配额;应用仅保留代理注入的短效身份信息到任务启动,不保存或转发 Bearer 令牌。 - 内部模型下载使用的 `HF_TOKEN` 永远不会充当调用方身份。 - UI 和自定义 API 共用一个非阻塞推理槽位。已有任务运行时,新自定义提交立即返回 `503` 与 `Retry-After: 5`,不会在 Space 内排队。 ## 错误约定 - `400`:URL、图片内容或 `Idempotency-Key` 不合法。 - `401`:API key 或视频下载 token 缺失/错误。 - `404`:任务不存在或结果 TTL 已过期。 - `409`:幂等键冲突,或视频结果尚未就绪。 - `410`:任务元数据仍在但 MP4 已丢失。 - `422`:JSON Schema 校验失败,包括未知字段。 - `500`:生成失败;仅返回脱敏的 `GENERATION_FAILED`。 - `502` / `504`:图片源临时故障或抓取超时。 - `503`:推理槽位繁忙,或 Hugging Face 未提供 ZeroGPU 身份。