新增图片生成与上传执行管线:nano-banana-2真实出图→上传→公网URL回填→上传后二次生成API调用稿

- 新增 image_generation_upload_rules.md、post_upload_call_draft_rules.md 规则文件,scripts/ 脚本目录
  - 工作流新增阶段 5.1 图片生成与上传、5.2 上传后调用稿分支,调整原有步骤编号
  - 所有模板和规则强制要求:API 图片输入使用上传后的公网 URL / asset:// URI,禁止本地路径或占位符
  - 官网 Prompt 模板强制要求使用 @官网上传名,绑定已上传资产
  - 附件/API 资产清单新增状态追踪列(pending_generation / pending_upload / generated_uploaded_ready 等)和 uploaded_assets.json 回填规则
  - api_payload_rules.md 新增"上传后二次生成硬约束",要求 JSONL 必须在图片上传完成后基于真实 URL 重新生成
  - image_model_provider_rules.md 明确 nano-banana-2 为默认执行资源(非仅提示词名称),新增图片生成/上传执行标记

  ---
  核心变更概括:工作流从"只写提示词"升级为"提示词→真实出图→上传→获取公网 URL→回填→二次生成调用稿"的完整资产管线。
This commit is contained in:
2026-05-26 15:45:46 +08:00
parent eb8e8b5ce9
commit 2eb629fe4b
13 changed files with 664 additions and 17 deletions
@@ -4,6 +4,8 @@
先在官网上传全局资产图片,并把素材命名为下方“官网上传名”。如果官网支持 `@` 图片/素材,在提示词中直接 `@官网上传名`
本文件只能引用已经在 `../../09_接口资产清单.md` 标记为 `generated_uploaded_ready` 的图片资产。未生成或未上传的图片不得写入本集官网 Prompt。
本文件只写本集视频生成用的官网提示词,不重新生成角色、场景、道具资产提示词。资产来源为:
- `../../04_人物场景道具设计.md`
@@ -17,6 +19,12 @@
| 官网上传名 | 内部引用 | 上传文件 | 参考职责 |
| --- | --- | --- | --- |
要求:
- `官网上传名` 必须与即梦素材库里的名字完全一致。
- `上传文件` 必须对应已上传公网 URL 或导入即梦后的素材,不写本地路径占位。
- Prompt 开头必须使用 `@官网上传名`,不能只写工作流内部 `@角色名`
### 官网 Prompt
```text
@@ -1 +1 @@
{"episode":"EP01_中文集名","shot_id":"EP01_S01","model":"doubao-seedance-2-0-pro","content":[{"type":"text","text":"参考图1锁定@角色名的外貌、发型和服装,不参考图中背景;参考图2锁定@场景名的空间结构、材质和光线;参考图3锁定@道具名的外观和尺寸。{景别/镜头类型},{主体 + 核心动作 + 场景},12s,9:16,电影级写实。首帧:{首帧状态}。镜头:{一个主要镜头运动或固定镜头;起点 -> 运动 -> 终点}。时间节拍:0-3s {动作1};3-7s {角色说出完整对白};7-12s {听者反应和动作结果}。对白/口型/表演:{写入本段由 Seedance 生成的完整对白;说明说话人、语气、语速、口型、停顿、听者反应、视线、呼吸、手部动作、身体重心变化}。声音:{Seedance 生成同期对白、VO、OS/环境音、音乐;如无则写无 VO、无背景音乐,只保留环境音}。环境:{灯光、材质、背景运动}。一致性:角色脸、服装、道具外观、场景空间保持参考图一致。尾帧:{最后0.5秒状态}。约束:不要字幕,不要把对白文字显示在画面里,不要水印,不要新增人物,不要变脸,不要夸张口型,不要口型机械开合,不要多余旁白,不要肢体畸变,不要闪烁。"},{"type":"image_url","image_url":{"url":"asset://replace-with-character-asset-id"},"role":"reference_image"},{"type":"image_url","image_url":{"url":"asset://replace-with-scene-asset-id"},"role":"reference_image"},{"type":"image_url","image_url":{"url":"asset://replace-with-prop-asset-id"},"role":"reference_image"}],"parameters":{"duration":12,"resolution":"720p","aspect_ratio":"9:16","return_last_frame":true},"callback_url":"https://your-domain.com/seedance/callback"}
{"episode":"EP01_中文集名","shot_id":"S01","model":"doubao-seedance-2-0-pro","content":[{"type":"image_url","image_url":{"url":"https://replace-with-uploaded-character-url"},"role":"reference_image","name":"Image1","source_ref":"@角色名","site_material_name":"角色名_标准中景","reference_duty":"锁定角色外貌、发型和服装,不参考原图背景和姿势"},{"type":"image_url","image_url":{"url":"https://replace-with-uploaded-scene-url"},"role":"reference_image","name":"Image2","source_ref":"@场景名","site_material_name":"场景名_主视角","reference_duty":"锁定场景空间、材质和光线方向,不改变角色身份"},{"type":"text","text":"参考图1锁定角色外貌、发型和服装,不参考图中背景或姿势;参考图2锁定场景空间、材质和光线方向。{景别/镜头类型},{主体 + 核心动作 + 场景},{时长}秒,{画幅},电影级写实。首帧:{首帧状态}。镜头:{镜头运动}。时间节拍:{动作顺序}。对白/口型/表演:{对白与表演}。声音:{环境音/对白/VO}。尾帧:{尾帧状态}。约束:不要字幕,不要水印,不要变脸。"}],"parameters":{"duration":12,"resolution":"720p","aspect_ratio":"9:16"},"callback_url":"https://your-domain.com/seedance/callback","asset_warnings":[]}
@@ -2,6 +2,8 @@
本文件集中输出本次输入的全部 MJ 版和 nano-banana-2 版图片资产提示词。分集目录不得再输出图片资产提示词,只能引用这里的资产。
本文件不是图片资产链路的终点。完成提示词后,必须按 `references/image_generation_upload_rules.md` 生成 `image_generation_jobs.json`,执行 nano-banana-2 出图和上传,并把上传结果回填到 `08_附件清单.md``09_接口资产清单.md`
## 语言与格式要求
- 统一管理全剧资产,不按集拆分。
@@ -144,6 +146,45 @@
- 分集 `04_资产引用.md` 只列出引用名,不复制本文件提示词。
- 分集 `05_Seedance视频提示词.md` 只通过 `@角色/@场景/@道具` 引用全局资产。
- 分集 `09_官网提示词.md` 只能使用已上传图片的即梦官网素材名。
- 分集 `10_接口请求体.jsonl` 只能使用上传后的公网 URL 或 `asset://` URI,不能使用本地路径。
## nano-banana-2 执行任务清单
完成本文件后,必须把可用于视频引用的 nano-banana-2 提示词整理为 `image_generation_jobs.json`。示例:
```json
[
{
"internalRef": "@角色名",
"type": "character",
"promptName": "标准中景参考图",
"fileName": "character_mid_reference.jpg",
"jimengUploadName": "角色名_标准中景",
"aspectRatio": "3:4",
"contentType": "image/jpeg",
"referenceDuty": "锁定角色脸型、发型、固定识别点和阶段服装,不参考背景和姿势",
"prompt": "粘贴最终 nano-banana-2 版标准中景参考图提示词"
},
{
"internalRef": "@场景名",
"type": "scene",
"promptName": "主视角宽幅参考图",
"fileName": "scene_main_wide_reference.jpg",
"jimengUploadName": "场景名_主视角宽幅",
"aspectRatio": "16:9",
"contentType": "image/jpeg",
"referenceDuty": "锁定场景空间结构、固定锚点、材质和光线方向,不参考临时氛围变化",
"prompt": "粘贴最终 nano-banana-2 版主视角宽幅参考图提示词"
}
]
```
执行命令:
```bash
node workflows/novel_to_seedance/scripts/generate_upload_assets.mjs --jobs outputs/novel_video_runs/{输入项目名}/image_generation_jobs.json --out-dir outputs/novel_video_runs/{输入项目名}/assets/generated --manifest outputs/novel_video_runs/{输入项目名}/uploaded_assets.json
```
## 道具参考图
@@ -2,6 +2,8 @@
本文件集中输出本次输入的全部即梦安全版资产提示词。分集目录不得再输出即梦资产提示词,只能在官网提示词中列出需要上传的全局资产附件。
即梦官网视频提示词不能只写内部 `@角色名`。必须先完成 nano-banana-2 出图和图片上传,把上传后的图片按 `09_接口资产清单.md` 中的“官网上传名”导入即梦,再在分集 `09_官网提示词.md` 中使用 `@官网上传名`
## 即梦写法原则
- 使用中文为主,表达更温和。
@@ -101,6 +103,18 @@
参考图1作为{角色}的外貌、发型和服装;参考图2作为{场景}的空间和光线。{视频动作描述}。自然克制的真实演员表演,不要夸张表情,不要文字,不要水印。
```
## 上传后即梦可调用格式
图片上传完成后,分集官网提示词必须使用以下格式:
```text
@角色名_标准中景 @场景名_主视角宽幅
参考图1锁定{角色}的外貌、发型、固定识别点和阶段服装,不参考图中背景或姿势;参考图2锁定{场景}的空间结构、固定锚点、材质和光线方向。
{视频动作描述}。自然克制的真实演员表演,不要夸张表情,不要文字,不要水印。
```
如果即梦官网不支持直接用 URL `@` 引用,则先把 `09_接口资产清单.md` 的公网 URL 下载或导入为官网素材,并保持素材名与“官网上传名”完全一致。
## 场景资产
- 风险等级:
@@ -4,15 +4,26 @@
本文件用于把工作流内部 `@角色/@场景/@道具` 映射到实际图片文件或 URL。网页端需要手动上传这些附件;API 端需要把这些文件 URL 放入请求体。
图片必须先由 nano-banana-2 生成并上传。未上传前不得标记为可用于即梦或 API。
## 资产总表
| 内部引用 | 类型 | 推荐文件名 | 本地路径/URL | 参考职责 | 首次使用集数 |
| --- | --- | --- | --- | --- | --- |
| 内部引用 | 类型 | 推荐文件名 | 即梦官网上传名 | 本地路径 | 公网URL | 参考职责 | 首次使用集数 | 状态 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
## 每集附件映射
### EP01
| 片段 | 官网附件槽位 | 上传文件 | API标签 | 内部引用 | 参考职责 |
| 片段 | 官网附件槽位 | 即梦官网上传名 | 公网URL/API标签 | 内部引用 | 参考职责 |
| --- | --- | --- | --- | --- | --- |
| 1 | 图1 | | @Image1 | | 锁定外貌/服装/道具/场景,不参考无关背景或姿势 |
| 1 | 图1 | @角色名_标准中景 | https://... | @角色名 | 锁定外貌/服装/道具/场景,不参考无关背景或姿势 |
## 状态规则
- `pending_generation`:已有提示词,未出图。
- `pending_upload`:已有本地图片,未上传。
- `generated_uploaded_ready`:已生成、已上传、已有公网 URL,可用于即梦和 API。
- `generated_uploaded_url_unparsed`:上传成功但响应未解析出 URL,需人工回填。
- `failed_generation`:图片生成失败。
- `failed_upload`:图片上传失败。
@@ -4,6 +4,8 @@
本文件把内部引用映射到 API 可用的 URL 或 `asset://` URI,同时记录官网上传后的 `@素材名`
公网 URL 必须来自图片上传接口返回结果。不能把本地路径、提示词文件路径或未上传图片写入 API URL。
## 资产总表
| 内部引用 | 类型 | 推荐文件名 | 官网上传名 | 本地路径 | 公网URL | 火山 asset URI | 参考职责 | 状态 |
@@ -12,6 +14,30 @@
## 使用规则
- 官网:用 `@官网上传名`
- API `公网URL` `火山 asset URI`
- API优先用上传后的 `公网URL`;如果后续进入火山素材库,再替换为 `火山 asset URI`
- 本地路径不能直接进入 API。
- 每条任务必须在文本里写清参考职责,避免图片背景、角色姿势、道具用途被错误继承。
## 图片生成与上传记录
运行 `scripts/generate_upload_assets.mjs` 后,把 `uploaded_assets.json` 中的记录回填到本表:
| 字段 | 回填位置 |
| --- | --- |
| `internalRef` | 内部引用 |
| `type` | 类型 |
| `fileName` | 推荐文件名 |
| `jimengUploadName` | 官网上传名 |
| `localPath` | 本地路径 |
| `publicUrl` | 公网URL |
| `referenceDuty` | 参考职责 |
| `status` | 状态 |
允许的状态:
- `pending_generation`
- `pending_upload`
- `generated_uploaded_ready`
- `generated_uploaded_url_unparsed`
- `failed_generation`
- `failed_upload`