# 分镜图生成质量提升计划

**目标：** 解决分镜图生成时出现宫格布局、角色外貌不一致、背景不一致等问题，并规划后续质量提升路径。

**技术栈：** Node.js (Express), better-sqlite3, Vue 3, Element Plus, Gemini / NanoBanana 图片 API

---

## 已完成（2026-03-14）

### 问题一：场景四视图生成后不显示

**原因：** `imageClient.createAndGenerateImage` 是为角色图片设计的函数，缺少 `scene_id` 参数支持，导致：
- 图片存储路径 hardcode 为 `characters/`（应为 `scenes/`）
- `image_generations` 表不写入 `scene_id`
- 生成完成后不回写 `scenes` 表的 `image_url` / `local_path`

**修复：**
- `imageClient.js`：`createAndGenerateImage` 新增 `scene_id` 参数，动态判断存储目录（`scenes` / `characters` / `images`），生成完成后回写 `scenes` 表
- `sceneService.js`：调用时传入 `scene_id: sceneId`

---

### 问题二：分镜图生成结果仍为宫格布局

**原因：** 传入的场景/角色参考图是 2×2 四视图合图，图片 AI 看到宫格参考图后会模仿其布局格式输出宫格图，且提示词中没有明确的"单张输出"约束。

**修复：**
- `imageService.js`：单张分镜生成时，在 Step 2.5 记录参考图映射，通过 Gemini parts 结构传递说明
- `imageClient.js`：重构 Gemini 多模态输入结构为正确顺序：
  ```
  [总说明文字] → [参考1说明] → [参考图1] → [参考2说明] → [参考图2] → [生成指令+主提示词]
  ```
  而非原来的"prompt 在前，图片附后"的错误顺序

---

### 问题三：角色外貌不一致（参考图格式干扰）

**原因：** 作为参考图传入的是 2×2 四视图合图（含头像/正面/侧面/背面 4 格），图片 AI 难以从合图中准确提取角色外貌，且四格合图的视觉格式会干扰输出布局。

**修复：**
- `imageService.js`（`splitQuadGridToImages`）：INSERT 时增加 `character_id` 字段，让角色拆分面板可按 ID 查询
- `imageService.js`（Step 2 参考图解析）：优先查询拆分后的单张面板作为参考：
  - 场景：`quad_panel_0`（左上格 = 建立远景，最能代表环境）
  - 角色：`quad_panel_1`（右上格 = 正面全身图，最能代表角色外貌）
  - 无拆分面板时 fallback 到四视图合图
- 角色最多取 3 个（避免超出模型参考图限制），Gemini 参考图上限从 3 改为 4（场景1 + 角色3）

---

### 问题四：参考图标签与实际传图数量不对齐

**原因：** 当角色有 `extra_images` 且无主图时，`extra_images` 仍会被推入 refs 但无对应主标签，导致后续角色编号错乱；`refLabels` 数量可能超过 Gemini 实际接收的图片数，让模型产生困惑。

**修复：**
- `extra_images` 推入逻辑移入 `if (primaryRef)` 块内，确保无主图时不产生孤立的 extra 标签
- `refLabels.slice(0, refs.length)` 强制对齐条数
- Gemini parts 构建时，按实际传入图片数裁剪标签

---

## 待完成（优先级排序）

### P1：分镜 prompt 二次优化

**背景：** 当前分镜描述（由文本 AI 生成的首帧/关键帧/尾帧提示词）是针对"分镜内容描述"设计的，直接发给图片 AI 效果打折。

**方案：** 在 `imageService.js` Step 3 之前增加一个文本 AI 优化步骤：
- 输入：原始分镜提示词 + 风格 + 宽高比 + 参考资产名称列表
- 输出：针对图片生成模型优化的提示词（增强细节描述、统一风格词汇、加入参考资产名称映射）
- 模型：使用轻量文本模型（如 deepseek-v3），成本低
- 缓存：优化后的 prompt 回写 `image_generations.prompt`，同一分镜重新生成时可复用

**预期收益：** 图片细节更丰富，风格更一致，角色名称与参考图映射更清晰

---

### P2：批量宫格生成（同一分镜多帧）

**背景：** 当前每一帧独立调用图片 API，导致同一分镜的首帧/关键帧/尾帧在风格、光线、色调上可能不一致。

**方案：** 复用现有 `quad_grid` / `nine_grid` 基础设施：
- 在分镜图生成时，将同一分镜的多帧组合为宫格提示词，一次生成宫格图
- 生成完成后调用 `splitQuadGridToImages` 自动拆分为独立帧
- API 调用次数从 N 次降为 1 次

**预期收益：** 同一分镜内视觉一致性大幅提升，API 成本降低

---

### P3：参考图智能过滤

**背景：** 当前把分镜绑定的所有角色/场景参考图都传入，部分角色/场景可能在当前帧中根本未出现，增加无效噪声。

**方案：** 在 Step 2 解析参考图后，调用文本 AI 判断：
- 输入：分镜描述 + 候选资产列表（名称 + 简介）
- 输出：与本帧内容直接相关的资产列表
- 只传相关资产的参考图

**预期收益：** 减少无关参考图干扰，提高角色/场景还原度

---

### P4：参考图压缩

**背景：** 传参考图前无压缩处理，可能触发 API 请求大小限制。

**方案：** 在 `callGeminiImageApi` 中对参考图 buffer 做压缩：
- 单张目标：≤ 3MB（JPEG quality 递减压缩）
- 总大小：≤ 10MB（按大小降序优先压缩大图）
- 使用 `sharp` 处理（项目已依赖）

---

### P5：多 Agent 大纲生成

**背景：** 当前大纲/剧本生成为单次 AI 调用，无法做到自动审核、迭代修改。

**方案：** 基于 Vercel AI SDK 的 Tool Use，实现三 Agent 协作：
- **故事师**：分析输入主题，生成故事线（存 `storylines` 表）
- **大纲师**：根据故事线生成各集大纲（存 `outlines` 表）
- **导演**：审核大纲与故事线一致性，提出修改建议并执行

工具调用链：`主Agent → 故事师 → saveStoryline → 大纲师 → saveOutline → 导演 → updateOutline`

---

### P6：分镜自动生成 Agent（shotAgent）

**背景：** 当前分镜需要用户手动拆分，或依赖单次 AI 调用，缺少自动化流程。

**方案：**
- **segmentAgent**：从剧本中自动拆分场景片段（含情绪、动作描述）
- **shotAgent**：根据片段生成分镜提示词（含景别、角度、运镜、角色、对话）
- 前端通过 WebSocket 接收流式进度更新
