neodomain-ai
# 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 等详情
标签
skill
ai