---
name: leoyeai/neodomain-ai
source: https://app.decimal.ai/s/leoyeai-neodomain-ai@1/SKILL.md
source_sha256: 81782610e046
---

# Neodomain AI Content Generator

## 核心行为规范

- **Token 检查**：每次执行前确认 `NEODOMAIN_ACCESS_TOKEN` 已设置。若未设置或遇到 token 过期错误（errCode 2001），立即走 [认证流程](#authentication)，动态询问用户手机号/邮箱，不要硬编码保存。
- **模型选择**：根据用户需求按 [模型选择逻辑](#model-selection-logic) 自主选择，无需询问用户（除非用户明确指定）。
- **提示词规范**：必须遵循各模式的提示词公式，尤其是 UNIVERSAL_TO_VIDEO 必须用 `@图片 1`/`@视频 1` 等明确引用素材。
- **输出目录**：默认使用 `./output`，若用户未指定则不需询问。
- **`--generate-audio`** 是布尔 flag，写 `--generate-audio` 即可，不要写 `--generate-audio true`。

---

## ⚠️ 常见问题与解决方案 (FAQ)

### 1. Token has been revoked (errCode 2001)

**现象**：视频生成 API 返回 `Token has been revoked`，但图片 API 可能正常。

**原因**：
- 企业版 token 的视频服务权限被撤销
- Token 已过期
- 服务端认证系统临时故障

**解决方案**：
1. 先用图片 API 测试 token 是否有效：`curl -H "accessToken: $TOKEN" https://story.neodomain.cn/agent/ai-image-generation/models`
2. 如果图片 API 正常但视频 API 失败 → 联系管理员确认视频服务权限
3. 如果全部失败 → 重新登录获取新 token（走认证流程）

### 2. 模型不支持某 generationType

**现象**：`❌ Failed: 模型 xxx 不支持 YYY 类型`

**原因**：不是所有模型都支持所有生成类型。

**解决方案**：
- `neo-video-2-0` / `neo-video-2-0-fast` → 仅支持 `UNIVERSAL_TO_VIDEO`
- `kling-video-o1` / `kling-v3-omni` → 仅支持 `UNIVERSAL_TO_VIDEO`
- `veo-3.1-*` → 支持 `REFERENCE_TO_VIDEO`（多图参考）
- 其他模型 → 通常支持 `TEXT_TO_VIDEO` 和 `IMAGE_TO_VIDEO`

**正确选择**：
- 多张角色图 → 用 `neo-video-2-0` + `UNIVERSAL_TO_VIDEO`
- 单张首帧 → 用 `doubao-seedance-1-5-pro` + `IMAGE_TO_VIDEO`
- 纯文字 → 用 `doubao-seedance-1-5-pro` + `TEXT_TO_VIDEO`

### 3. UNIVERSAL_TO_VIDEO 提示词写法错误

**错误示例**：`--prompt "蓝白校服的男生和穿碎花裙子的女生在校园里散步"`

**正确示例**：`--prompt "参考@图片 1 的男生和@图片 2 的女生，两人在阳光明媚的校园里并肩散步，镜头缓慢跟随"`

**规则**：
- `--image-urls` 中第 1 个 URL → 用 `@图片 1` 引用
- `--image-urls` 中第 2 个 URL → 用 `@图片 2` 引用
- `--video-urls` 中第 1 个 URL → 用 `@视频 1` 引用
- `--audio-urls` 中第 1 个 URL → 用 `@音频 1` 引用
- **必须**在 prompt 中明确引用每个素材，不要用"那张图"等模糊表达

### 4. 认证服务不可用

**现象**：`Authentication service unavailable, please try again`

**原因**：Neodomain 服务端认证系统临时故障（可能在重启）

**解决方案**：等待 5-10 分钟后重试

---

## 意图识别与路径选择

根据用户意图选择正确路径：

| 用户意图 | 路径 |
|---------|------|
| 生成图片（无参考图） | `generate_image.py` → TEXT_TO_IMAGE |
| 生成图片（有参考图/角色一致性） | `generate_image_ref.py` |
| 生成视频（纯文字描述） | `generate_video.py` → `TEXT_TO_VIDEO` |
| 生成视频（有参考图/首帧） | `generate_video.py` → `IMAGE_TO_VIDEO` |
| 生成视频（多张参考图保持一致性） | `generate_video.py` → `REFERENCE_TO_VIDEO`（仅 Veo 3.1） |
| 生成视频（多模态：图 + 视频 + 音频组合） | `generate_video.py` → `UNIVERSAL_TO_VIDEO`（Universal 模型） |
| 动作迁移（把参考视频动作转移到图片人物上） | `motion_control.py` |
| 故事板/分镜批量生视频 | `batch_video.py` |

---

## Model Selection Logic

### 图片模型选择

```
有参考图？
├─ 是 → generate_image_ref.py，模型用 doubao-seedream-5-0-260128
└─ 否 → generate_image.py
        ├─ 追求高性价比 → doubao-seedream-5-0-260128 (25pts)
        ├─ 追求最高质量 → gemini-3-pro-image-preview (100pts)
        └─ 默认/普通需求 → gemini-3.1-flash-image-preview (90pts)
```

### 视频模型选择

```
有多模态素材（视频/音频参考）？
└─ 是 → UNIVERSAL_TO_VIDEO
        ├─ 追求最高品质 → neo-video-2-0
        ├─ 追求速度/性价比 → neo-video-2-0-fast
        └─ 需要高分辨率 (1080p) → kling-v3-omni 或 kling-video-o1

有多张参考图（保持角色一致性）？
└─ 是 → REFERENCE_TO_VIDEO，模型用 veo-3.1-generate-preview

有参考图（图生视频）？
└─ 是 → IMAGE_TO_VIDEO
        ├─ 需要音频 → doubao-seedance-1-5-pro-251215 或 kling-v3
        ├─ 需要首尾帧精确控制 → kling-v3 或 kling-v2-6
        ├─ 需要超高清 4K → veo-3.1-generate-preview
        ├─ 需要超长时长 (15s+) → kling-v3(最长 15s) 或 vidu-q3-pro(最长 16s)
        └─ 默认 → doubao-seedance-1-5-pro-251215

纯文字生视频？
└─ 是 → TEXT_TO_VIDEO
        ├─ 需要音频 → doubao-seedance-1-5-pro-251215 或 kling-v3
        ├─ 高性价比 → doubao-seedance-1-0-pro-fast-251015
        └─ 默认 → doubao-seedance-1-5-pro-251215
```

### 视频参数选择规则

- **resolution**：用户未指定时默认 `720p`；明确要求高清用 `1080p`；明确要求超清用 `4K`（仅 Veo 3.1 支持）
- **duration**：用户未指定时默认 `8s`；需注意各模型上限（见下表），不要超出范围
- **aspect-ratio**：根据用途自主判断——竖屏内容用 `9:16`，横屏用 `16:9`，方形用 `1:1`；IMAGE_TO_VIDEO 模式下此参数无效，无需传入
- **generate-audio**：用户提到"有声音"/"带音频"/"有背景音乐"时自动加上

---

## Authentication

```bash
# Step 1：发送验证码（询问用户手机号或邮箱后执行）
python3 {baseDir}/scripts/login.py --send-code --contact "手机号或邮箱"

# Step 2：用户提供验证码后登录
python3 {baseDir}/scripts/login.py --login --contact "手机号或邮箱" --code "验证码"
```

**Step 2 可能出现两种结果：**

- **单一身份**：直接输出 `accessToken`，告知用户设置到 `NEODOMAIN_ACCESS_TOKEN` 环境变量。

- **多身份**：输出身份列表（含编号、类型、昵称、企业名、userId），需执行 Step 3 选择身份：

```bash
# Step 3：选择身份（仅在 Step 2 返回多身份时执行）
python3 {baseDir}/scripts/login.py --select-identity --contact "手机号或邮箱" --user-id "选中的userId"
```

Step 3 成功后输出 `accessToken`，告知用户设置到 `NEODOMAIN_ACCESS_TOKEN` 环境变量。

---

## Image Generation

### generate_image.py（文生图 / 图生图）

```bash
python3 {baseDir}/scripts/generate_image.py \
  --prompt "A beautiful mountain landscape, golden hour, cinematic" \
  --model "doubao-seedream-5-0-260128" \
  --aspect-ratio "16:9" \
  --size "2K" \
  --token $NEODOMAIN_ACCESS_TOKEN
```

| 参数 | 说明 | 默认值 |
|------|------|--------|
| `--prompt` | 图片描述 | 必填 |
| `--model` | 模型 ID | `gemini-3.1-flash-image-preview` |
| `--aspect-ratio` | `1:1`, `16:9`, `9:16`, `4:3`, `3:4` | `1:1` |
| `--num-images` | `1` 或 `4` | `1` |
| `--size` | `1K`, `2K`, `4K` | `2K` |
| `--negative-prompt` | 负向提示词 | - |
| `--guidance-scale` | 提示词遵循度 (1.0-20.0) | `7.5` |
| `--seed` | 随机种子 | 随机 |
| `--output-format` | `jpeg`, `png`, `webp` | `jpeg` |
| `--output-dir` | 保存目录 | `./output` |

**可用模型：**

| 模型 ID | 费用 | 支持尺寸 | 特点 |
|--------|------|----------|------|
| `gemini-2.5-flash-image` | 30 pts | 1K | 快速低价 |
| `gemini-3.1-flash-image-preview` | 90 pts | 1K, 2K, 4K | 均衡 |
| `gemini-3-pro-image-preview` | 100 pts | 2K, 4K | 最高质量 |
| `doubao-seedream-5-0-260128` | 25 pts | 2K, 3K | 最高性价比，推荐参考图用 |
| `doubao-seedream-4-5-251128` | 30 pts | 2K, 4K | - |
| `doubao-seedream-4-0-250828` | 25 pts | 2K, 4K | - |
| `gpt-image-1.5` | 100 pts | 1K | GPT 风格 |
| `Midjourney-niji 7` | 30 pts | 1K | 二次元/动漫 |
| `Midjourney-v 7` | 30 pts | 1K | 艺术风格 |

### generate_image_ref.py（参考图生图 / 角色一致性）

```bash
python3 {baseDir}/scripts/generate_image_ref.py \
  --prompt "A woman walking in a forest" \
  --reference-image "https://example.com/character1.jpg" \
  --reference-image "https://example.com/character2.jpg" \
  --model "doubao-seedream-5-0-260128" \
  --aspect-ratio "16:9" \
  --token $NEODOMAIN_ACCESS_TOKEN
```

`--reference-image` 可多次指定，上限 10 张。其余参数同 `generate_image.py`，默认模型为 `doubao-seedream-5-0-260128`。

---

## Video Generation

### generate_video.py

统一入口，通过 `--generation-type` 区分模式。

#### TEXT_TO_VIDEO（文生视频）

```bash
python3 {baseDir}/scripts/generate_video.py \
  --prompt "A serene lake at dawn, mist rising, cinematic wide shot" \
  --model "doubao-seedance-1-5-pro-251215" \
  --generation-type "TEXT_TO_VIDEO" \
  --aspect-ratio "16:9" \
  --resolution "720p" \
  --duration "8s" \
  --generate-audio \
  --token $NEODOMAIN_ACCESS_TOKEN
```

#### IMAGE_TO_VIDEO（图生视频）

```bash
# 首帧必填，尾帧可选（需模型支持首尾帧）；宽高比自动按参考图，无需指定
python3 {baseDir}/scripts/generate_video.py \
  --prompt "The camera slowly pans across the landscape" \
  --model "kling-v3" \
  --generation-type "IMAGE_TO_VIDEO" \
  --first-frame "https://example.com/image.jpg" \
  --last-frame "https://example.com/end.jpg" \
  --resolution "1080p" \
  --duration "5s" \
  --generate-audio \
  --token $NEODOMAIN_ACCESS_TOKEN
```

#### REFERENCE_TO_VIDEO（多图参考生视频）

仅 `veo-3.1-generate-preview` / `veo-3.1-fast-generate-preview` 支持。

```bash
python3 {baseDir}/scripts/generate_video.py \
  --prompt "Characters interacting in a scene" \
  --model "veo-3.1-generate-preview" \
  --generation-type "REFERENCE_TO_VIDEO" \
  --image-urls "https://example.com/ref1.jpg,https://example.com/ref2.jpg" \
  --aspect-ratio "16:9" \
  --resolution "1080p" \
  --duration "8s" \
  --generate-audio \
  --token $NEODOMAIN_ACCESS_TOKEN
```

#### UNIVERSAL_TO_VIDEO（多模态组合生视频）

支持图片、视频、音频混合参考。**必须**在 prompt 中用 `@图片 1`/`@图片 2`/`@视频 1`/`@音频 1` 精确引用对应素材（顺序即编号）。

```bash
python3 {baseDir}/scripts/generate_video.py \
  --prompt "参考@图片 1 的男生和@图片 2 的女生，两人在阳光明媚的校园里并肩散步，镜头缓慢跟随" \
  --model "neo-video-2-0" \
  --generation-type "UNIVERSAL_TO_VIDEO" \
  --image-urls "https://example.com/boy.jpg,https://example.com/girl.jpg" \
  --resolution "720p" \
  --duration "5s" \
  --token $NEODOMAIN_ACCESS_TOKEN
```

**Universal 提示词公式：** `@素材引用 + 主体描述 + 动作/场景 + 镜头语言 + 风格美学`

**@素材引用规则（重要！）**：
- `--image-urls` 中第 1 个 URL → 用 `@图片 1` 引用
- `--image-urls` 中第 2 个 URL → 用 `@图片 2` 引用
- `--video-urls` 中第 1 个 URL → 用 `@视频 1` 引用
- `--audio-urls` 中第 1 个 URL → 用 `@音频 1` 引用
- **必须**在 prompt 开头明确引用每个素材，不要用"那张图""这个角色"等模糊表达

**错误示例** ❌：
```bash
--prompt "蓝白校服的男生和穿碎花裙子的女生在校园里散步"
--image-urls "boy.jpg,girl.jpg"
```

**正确示例** ✅：
```bash
--prompt "参考@图片 1 的蓝白校服男生和@图片 2 的碎花裙子女生，两人在阳光明媚的校园里并肩散步，镜头缓慢跟随"
--image-urls "boy.jpg,girl.jpg"
```

**适用模型**：`neo-video-2-0`, `neo-video-2-0-fast`, `kling-video-o1`, `kling-v3-omni`

#### generate_video.py 完整参数表

| 参数 | 说明 | 默认值 |
|------|------|--------|
| `--prompt` | 视频描述 | 必填 |
| `--model` | 模型 ID | `doubao-seedance-1-5-pro-251215` |
| `--generation-type` | `TEXT_TO_VIDEO` / `IMAGE_TO_VIDEO` / `REFERENCE_TO_VIDEO` / `UNIVERSAL_TO_VIDEO` | `TEXT_TO_VIDEO` |
| `--first-frame` | 首帧图片 URL（I2V 必填） | - |
| `--last-frame` | 尾帧图片 URL（可选，需模型支持） | - |
| `--image-urls` | 参考图 URL 逗号分隔（R2V 必填；U2V 可选，→ `imageUrls`） | - |
| `--video-urls` | 参考视频 URL 逗号分隔（U2V 可选，→ `referenceVideoUrls`） | - |
| `--audio-urls` | 参考音频 URL 逗号分隔（U2V 可选，→ `audioUrl`） | - |
| `--aspect-ratio` | `16:9`/`9:16`/`1:1`/`4:3`/`3:4`/`21:9`/`9:21`（T2V/R2V 有效；I2V 无效） | `16:9` |
| `--resolution` | `480p`/`720p`/`768p`/`1080p`/`2k`/`4K`（各模型范围不同） | `720p` |
| `--duration` | 时长如 `5s`/`8s`/`10s`（各模型范围不同） | `8s` |
| `--fps` | 帧率 | `24` |
| `--seed` | 随机种子 | 随机 |
| `--generate-audio` | 生成音频（flag） | false |
| `--enhance-prompt` | 增强提示词（flag） | false |
| `--negative-prompt` | 负向提示词 | - |
| `--output-dir` | 保存目录 | `./output` |

#### 各模型支持范围（Cascading）

| 模型 ID | 类型 | 分辨率 | 时长 | 音频 | 首尾帧 |
|--------|------|--------|------|------|--------|
| `doubao-seedance-1-5-pro-251215` | T2V/I2V | 480p, 720p, 1080p | 4–12s | ✅ | ✅ |
| `doubao-seedance-1-0-pro-250528` | T2V/I2V | 720p, 1080p | 2–10s | ❌ | ✅ |
| `doubao-seedance-1-0-pro-fast-251015` | T2V/I2V | 720p, 1080p | 3–10s | ❌ | ❌ |
| `kling-v3` | T2V/I2V | 720p, 1080p | 3–15s | ✅ | ✅ |
| `kling-v2-6` | T2V/I2V | 1080p | 5s, 10s | ✅ | ✅ |
| `kling-v2-5-turbo` | T2V/I2V | 720p, 1080p | 5s, 10s | ❌ | ✅ |
| `kling-v2-1` | **I2V 仅** | 720p, 1080p | 5s, 10s | ❌ | ✅ |
| `vidu-q3-pro` | T2V/I2V | 720p, 1080p, 2k¹ | 5–16s | ✅ | ✅ |
| `vidu-q2-pro` | **I2V 仅** | 720p, 1080p | 5s, 8s | ❌ | ✅ |
| `wan2.6` | T2V/I2V | 720p, 1080p | 5s, 10s, 15s | ✅ | ❌ |
| `wan2.6-i2v-flash` | **I2V 仅** | 720p, 1080p | 5s, 10s, 15s | ✅ | ❌ |
| `MiniMax-Hailuo-2.3` | T2V/I2V | 768p, 1080p | 6s, 10s | ❌ | ❌ |
| `MiniMax-Hailuo-2.3-Fast` | T2V/I2V | 768p, 1080p | 6s, 10s | ❌ | ❌ |
| `MiniMax-Hailuo-02` | T2V/I2V | 768p, 1080p | 6s, 10s | ❌ | ✅ |
| `veo-3.1-generate-preview` | T2V/I2V/**R2V** | 720p, 1080p, 4K | 4s, 6s, 8s | ✅ | ✅ |
| `veo-3.1-fast-generate-preview` | T2V/I2V/**R2V** | 720p, 1080p, 4K | 4s, 6s, 8s | ✅ | ✅ |

> ¹ Vidu Q3 Pro 的 2k 仅在 I2V 模式下支持。
> T2V 宽高比：Doubao 支持 `16:9/9:16/1:1/4:3/3:4/21:9/9:21`；Kling/Vidu/Wan 支持 `16:9/9:16/1:1`；Hailuo 仅 `16:9`；Veo 支持 `16:9/9:16`。

#### 各模型支持范围（Universal，--generation-type UNIVERSAL_TO_VIDEO）

| 模型 ID | 分辨率 | 时长 | 音频 | 首尾帧 | 最大参考数 |
|--------|--------|------|------|--------|-----------|
| `neo-video-2-0` | 480p, 720p | 4–15s | ✅ | ✅ | 图×9, 视频×3, 音频×3 |
| `neo-video-2-0-fast` | 480p, 720p | 4–12s | ✅ | ✅ | 图×9, 视频×3, 音频×3 |
| `kling-video-o1` | 720p, 1080p | 3–10s | ❌ | ❌ | 图×12, 视频×1 |
| `kling-v3-omni` | 720p, 1080p | 3–15s | ✅ | ❌ | 图×12, 视频×1 |

### motion_control.py（动作迁移）

将参考视频的人物动作迁移到参考图片上：

```bash
python3 {baseDir}/scripts/motion_control.py \
  --image "https://example.com/ref_image.jpg" \
  --video "https://example.com/ref_video.mp4" \
  --prompt "Make the character dance" \
  --mode "pro" \
  --duration 5000 \
  --token $NEODOMAIN_ACCESS_TOKEN
```

| 参数 | 说明 | 默认值 |
|------|------|--------|
| `--image` | 参考图片 URL | 必填 |
| `--video` | 参考动作视频 URL | 必填 |
| `--prompt` | 附加文字控制 | - |
| `--mode` | `std`（标准）/ `pro`（专业） | `std` |
| `--orientation` | 角色朝向来源：`image` / `video` | `image` |
| `--keep-original-sound` | 保留原视频声音：`yes` / `no` | `yes` |
| `--duration` | 时长（毫秒） | `5000` |
| `--output-dir` | 保存目录 | `./output` |

### batch_video.py（批量分镜生视频）

> 需要 `pip install oss2`（用于上传本地图片到 OSS）。默认使用 `doubao-seedance-1-5-pro-251215`，IMAGE_TO_VIDEO，720p/5s。

```bash
python3 {baseDir}/scripts/batch_video.py \
  --storyboard-dir ./storyboards \
  --output-dir ./output/videos \
  --start 1 \
  --end 17 \
  --token $NEODOMAIN_ACCESS_TOKEN
```

| 参数 | 说明 | 默认值 |
|------|------|--------|
| `--storyboard-dir` | 分镜图片目录（命名格式：`shot_01_*.jpeg`） | 必填 |
| `--output-dir` | 视频输出目录 | 必填 |
| `--start` | 起始镜头编号 | `1` |
| `--end` | 结束镜头编号 | `17` |

---

## Output

所有脚本完成后自动下载到输出目录：
- 图片：`image_1.jpg` / `.png` / `.webp`
- 视频：`video.mp4` + `thumbnail.jpg`
- 批量视频：`video_01.mp4`, `video_02.mp4`, ...
- `metadata.json`：任务 ID、参数、文件 URL 等详情