| 1 | # MovieAssistant API 文档 |
| 2 | |
| 3 | ## 概述 |
| 4 | |
| 5 | MovieAssistant 是一个 AI 视频生成系统,提供 REST API 供外部调用。API 与前端共享同一个历史数据库,支持在 API 和前端之间无缝切换。 |
| 6 | |
| 7 | **基础 URL**: `http://localhost:8000` |
| 8 | |
| 9 | --- |
| 10 | |
| 11 | ## 认证 |
| 12 | |
| 13 | 当前版本无需认证,所有接口均可公开访问。 |
| 14 | |
| 15 | --- |
| 16 | |
| 17 | ## 可用阶段 |
| 18 | |
| 19 | | 阶段 ID | 名称 | 说明 | |
| 20 | |---------|------|------| |
| 21 | | `script_generation` | 剧本生成 | 将灵感转化为结构化剧本 | |
| 22 | | `character_design` | 角色/场景设计 | 生成角色设计图和场景背景 | |
| 23 | | `storyboard` | 分镜设计 | 设计镜头语言和分镜脚本 | |
| 24 | | `reference_generation` | 参考图生成 | 生成高精度参考图 | |
| 25 | | `video_generation` | 视频生成 | 将参考图/分镜图生成视频 | |
| 26 | | `post_production` | 后期剪辑 | 拼接视频片段为最终成片 | |
| 27 | |
| 28 | --- |
| 29 | |
| 30 | ## API 接口列表 |
| 31 | |
| 32 | ### 1. 创建项目 |
| 33 | |
| 34 | 创建一个新的视频生成项目。 |
| 35 | |
| 36 | **接口**: `POST /api/project/start` |
| 37 | |
| 38 | **请求体**: |
| 39 | ```json |
| 40 | { |
| 41 | "idea": "故事线描述", |
| 42 | "style": "anime", |
| 43 | "episodes": 4, |
| 44 | "llm_model": "deepseek-v3.2", |
| 45 | "vlm_model": "qwen3.5-plus", |
| 46 | "image_t2i_model": "doubao-seedream-5-0-260128", |
| 47 | "image_it2i_model": "doubao-seedream-5-0-260128", |
| 48 | "video_model": "wan2.7-i2v", |
| 49 | "enable_concurrency": true |
| 50 | } |
| 51 | ``` |
| 52 | |
| 53 | **参数说明**: |
| 54 | | 参数 | 类型 | 必填 | 说明 | 默认值 | |
| 55 | |------|------|------|------|--------| |
| 56 | | idea | string | 是 | 故事线描述 | - | |
| 57 | | style | string | 否 | 视频风格 | anime | |
| 58 | | episodes | int | 否 | 生成的剧集数量 | 4 | |
| 59 | | llm_model | string | 是 | LLM 模型;前端从 `backend/config.yaml` 读取默认值并传递 | - | |
| 60 | | vlm_model | string | 是 | VLM 评估模型;前端从 `backend/config.yaml` 读取默认值并传递 | - | |
| 61 | | image_t2i_model | string | 是 | 文生图模型;前端从 `backend/config.yaml` 读取默认值并传递 | - | |
| 62 | | image_it2i_model | string | 是 | 图生图模型;前端从 `backend/config.yaml` 读取默认值并传递 | - | |
| 63 | | video_model | string | 是 | 视频模型;前端从 `backend/config.yaml` 读取默认值并传递 | - | |
| 64 | | enable_concurrency | bool | 否 | 开启并发生成(可同时生成多张图片/视频) | true | |
| 65 | |
| 66 | **响应示例**: |
| 67 | ```json |
| 68 | { |
| 69 | "session_id": "1773208355389", |
| 70 | "status": "stage_completed", |
| 71 | "params": { |
| 72 | "idea": "故事线描述", |
| 73 | "style": "anime", |
| 74 | "llm_model": "deepseek-v3.2", |
| 75 | "vlm_model": "qwen3.5-plus", |
| 76 | "episodes": 4 |
| 77 | } |
| 78 | } |
| 79 | ``` |
| 80 | |
| 81 | --- |
| 82 | |
| 83 | ### 2. 执行阶段 |
| 84 | |
| 85 | 执行指定的生成阶段。 |
| 86 | |
| 87 | **接口**: `POST /api/project/{session_id}/execute/{stage}` |
| 88 | |
| 89 | **路径参数**: |
| 90 | - `session_id`: 项目会话 ID |
| 91 | - `stage`: 阶段 ID(见上表) |
| 92 | |
| 93 | **请求体**: |
| 94 | ```json |
| 95 | { |
| 96 | "style": "anime" |
| 97 | } |
| 98 | ``` |
| 99 | |
| 100 | > 请求体参数与创建项目相同(可选),会覆盖项目中已有的对应参数。 |
| 101 | |
| 102 | **响应**: SSE 流式返回,包含以下事件类型: |
| 103 | - `progress`: 进度更新 |
| 104 | - `stage_complete`: 阶段完成 |
| 105 | - `error`: 执行错误 |
| 106 | |
| 107 | **示例 - 进度事件**: |
| 108 | ```json |
| 109 | { |
| 110 | "type": "progress", |
| 111 | "message": "剧本生成: 正在生成...", |
| 112 | "phase": "剧本生成", |
| 113 | "step_desc": "正在生成...", |
| 114 | "percent": 50 |
| 115 | } |
| 116 | ``` |
| 117 | |
| 118 | **示例 - 阶段完成事件**: |
| 119 | ```json |
| 120 | { |
| 121 | "type": "stage_complete", |
| 122 | "stage": "script_generation", |
| 123 | "status": "stage_completed", |
| 124 | "requires_intervention": false |
| 125 | } |
| 126 | ``` |
| 127 | |
| 128 | --- |
| 129 | |
| 130 | ### 3. 获取项目状态 |
| 131 | |
| 132 | 获取项目的当前状态。 |
| 133 | |
| 134 | **接口**: `GET /api/project/{session_id}/status` |
| 135 | |
| 136 | **响应示例**: |
| 137 | ```json |
| 138 | { |
| 139 | "session_id": "1773208355389", |
| 140 | "current_stage": "script_generation", |
| 141 | "status": "running", |
| 142 | "error": null, |
| 143 | "stages_completed": [], |
| 144 | "artifacts": {}, |
| 145 | "meta": { |
| 146 | "idea": "故事线描述", |
| 147 | "style": "anime" |
| 148 | }, |
| 149 | "updated_at": 1773208355389 |
| 150 | } |
| 151 | ``` |
| 152 | |
| 153 | --- |
| 154 | |
| 155 | ### 4. 获取阶段产物 |
| 156 | |
| 157 | 获取指定阶段的产物数据。 |
| 158 | |
| 159 | **接口**: `GET /api/project/{session_id}/artifact/{stage}` |
| 160 | |
| 161 | **响应示例** (剧本生成阶段): |
| 162 | ```json |
| 163 | { |
| 164 | "stage": "script_generation", |
| 165 | "artifact": { |
| 166 | "title": "剧本名称", |
| 167 | "logline": "...", |
| 168 | "characters": [...], |
| 169 | "settings": [...], |
| 170 | "episodes": [...] |
| 171 | } |
| 172 | } |
| 173 | ``` |
| 174 | |
| 175 | --- |
| 176 | |
| 177 | ### 5. 更新阶段产物 |
| 178 | |
| 179 | 更新指定阶段的产物数据(如用户修改提示词、选择版本)。 |
| 180 | |
| 181 | **接口**: `PATCH /api/project/{session_id}/artifact/{stage}` |
| 182 | |
| 183 | 请求体格式**因阶段而异**: |
| 184 | |
| 185 | #### storyboard — 修改分集/片段/镜头 |
| 186 | ```json |
| 187 | { |
| 188 | "episodes": [ |
| 189 | { |
| 190 | "episode_number": 1, |
| 191 | "segments": [ |
| 192 | { |
| 193 | "segment_id": "seg_01_01", |
| 194 | "total_duration": 10, |
| 195 | "visual_prompt": "新视觉提示词", |
| 196 | "video_prompt": "新视频提示词", |
| 197 | "shots": [] |
| 198 | } |
| 199 | ] |
| 200 | } |
| 201 | ] |
| 202 | } |
| 203 | ``` |
| 204 | |
| 205 | #### reference_generation — 修改视觉提示词 |
| 206 | ```json |
| 207 | { |
| 208 | "segments": [ |
| 209 | {"segment_id": "seg_01_01", "visual_prompt": "新提示词"} |
| 210 | ] |
| 211 | } |
| 212 | ``` |
| 213 | |
| 214 | #### reference_generation — 选择参考图版本 |
| 215 | ```json |
| 216 | { |
| 217 | "seg_01_01": "code/result/image/xxx/seg_01_01_v2.jpg" |
| 218 | } |
| 219 | ``` |
| 220 | |
| 221 | #### video_generation — 修改片段描述/时长 |
| 222 | ```json |
| 223 | { |
| 224 | "seg_01_01": {"description": "新描述", "duration": 5} |
| 225 | } |
| 226 | ``` |
| 227 | |
| 228 | #### video_generation — 选择视频版本 |
| 229 | ```json |
| 230 | { |
| 231 | "seg_01_01": "code/result/video/xxx/seg_01_01_v2.mp4" |
| 232 | } |
| 233 | ``` |
| 234 | |
| 235 | **响应**: `{"status": "ok"}` |
| 236 | |
| 237 | --- |
| 238 | |
| 239 | ### 6. 干预阶段 |
| 240 | |
| 241 | 对已完成的阶段进行修改并重新执行(重新生成部分产物)。 |
| 242 | |
| 243 | **接口**: `POST /api/project/{session_id}/intervene` |
| 244 | |
| 245 | **请求体**: |
| 246 | ```json |
| 247 | { |
| 248 | "stage": "reference_generation", |
| 249 | "modifications": { |
| 250 | "regenerate_scenes": ["shot_001_01", "shot_001_02"] |
| 251 | } |
| 252 | } |
| 253 | ``` |
| 254 | |
| 255 | - `stage`:要干预的阶段 |
| 256 | - `modifications`:修改内容,目前支持 `regenerate_scenes`(要重新生成的镜头 ID 列表) |
| 257 | |
| 258 | **响应**: SSE 流式返回,包含以下事件类型: |
| 259 | - `progress`: 进度更新 |
| 260 | - `stage_complete`: 阶段完成 |
| 261 | - `error`: 执行错误 |
| 262 | |
| 263 | --- |
| 264 | |
| 265 | ### 7. 确认并继续 |
| 266 | |
| 267 | 确认当前阶段的修改,进入下一阶段。 |
| 268 | |
| 269 | **接口**: `POST /api/project/{session_id}/continue` |
| 270 | |
| 271 | **响应示例**: |
| 272 | ```json |
| 273 | { |
| 274 | "status": "ready", |
| 275 | "next_stage": "character_design" |
| 276 | } |
| 277 | ``` |
| 278 | |
| 279 | --- |
| 280 | |
| 281 | ### 8. 停止执行 |
| 282 | |
| 283 | 停止当前正在执行的阶段。 |
| 284 | |
| 285 | **接口**: `POST /api/project/{session_id}/stop` |
| 286 | |
| 287 | **响应示例**: |
| 288 | ```json |
| 289 | { |
| 290 | "status": "stopped" |
| 291 | } |
| 292 | ``` |
| 293 | |
| 294 | --- |
| 295 | |
| 296 | ### 9. 获取会话列表 |
| 297 | |
| 298 | 获取所有历史项目列表。 |
| 299 | |
| 300 | **接口**: `GET /api/sessions` |
| 301 | |
| 302 | **响应示例**: |
| 303 | ```json |
| 304 | { |
| 305 | "sessions": [ |
| 306 | { |
| 307 | "id": "1773208355389", |
| 308 | "idea": "故事线", |
| 309 | "style": "anime", |
| 310 | "date": 1773208355389, |
| 311 | "stages": ["script_generation", "character_design"] |
| 312 | } |
| 313 | ] |
| 314 | } |
| 315 | ``` |
| 316 | |
| 317 | --- |
| 318 | |
| 319 | ### 10. 获取阶段列表 |
| 320 | |
| 321 | 获取所有可用阶段列表。 |
| 322 | |
| 323 | **接口**: `GET /api/stages` |
| 324 | |
| 325 | **响应示例**: |
| 326 | ```json |
| 327 | { |
| 328 | "stages": [ |
| 329 | {"id": "script_generation", "name": "剧本生成", "order": 1, "description": "将灵感转化为结构化剧本"}, |
| 330 | {"id": "character_design", "name": "角色/场景设计", "order": 2}, |
| 331 | {"id": "storyboard", "name": "分镜设计", "order": 3}, |
| 332 | {"id": "reference_generation", "name": "参考图生成", "order": 4}, |
| 333 | {"id": "video_generation", "name": "视频生成", "order": 5}, |
| 334 | {"id": "post_production", "name": "后期剪辑", "order": 6} |
| 335 | ] |
| 336 | } |
| 337 | ``` |
| 338 | |
| 339 | --- |
| 340 | |
| 341 | ## 调用示例 |
| 342 | |
| 343 | ### 完整流程示例 |
| 344 | |
| 345 | ```bash |
| 346 | # 1. 创建项目 |
| 347 | SESSION_ID=$(curl -s -X POST http://localhost:8000/api/project/start \ |
| 348 | -H "Content-Type: application/json" \ |
| 349 | -d '{ |
| 350 | "idea": "失忆女刺客刺杀目标时恢复记忆,与爱人联手复仇师兄", |
| 351 | "style": "anime" |
| 352 | }' | jq -r '.session_id') |
| 353 | |
| 354 | echo "Session ID: $SESSION_ID" |
| 355 | |
| 356 | # 2. 执行第一阶段(剧本生成)- 监听 SSE |
| 357 | curl -X POST "http://localhost:8000/api/project/${SESSION_ID}/execute/script_generation" \ |
| 358 | -H "Content-Type: application/json" \ |
| 359 | -d '{"style": "anime"}' |
| 360 | |
| 361 | # 3. 获取剧本产物 |
| 362 | curl -s "http://localhost:8000/api/project/${SESSION_ID}/artifact/script_generation" |
| 363 | |
| 364 | # 4. 确认并继续到下一阶段 |
| 365 | curl -s -X POST "http://localhost:8000/api/project/${SESSION_ID}/continue" |
| 366 | |
| 367 | # 5. 执行第二阶段(角色设计) |
| 368 | curl -X POST "http://localhost:8000/api/project/${SESSION_ID}/execute/character_design" \ |
| 369 | -H "Content-Type: application/json" \ |
| 370 | -d '{"style": "anime"}' |
| 371 | |
| 372 | # 6. 确认并继续 |
| 373 | curl -s -X POST "http://localhost:8000/api/project/${SESSION_ID}/continue" |
| 374 | |
| 375 | # 7. 执行第三阶段(分镜设计) |
| 376 | curl -X POST "http://localhost:8000/api/project/${SESSION_ID}/execute/storyboard" \ |
| 377 | -H "Content-Type: application/json" \ |
| 378 | -d '{"style": "anime"}' |
| 379 | |
| 380 | # 8. 确认并继续 |
| 381 | curl -s -X POST "http://localhost:8000/api/project/${SESSION_ID}/continue" |
| 382 | |
| 383 | # 9. 执行第四阶段(参考图生成) |
| 384 | curl -X POST "http://localhost:8000/api/project/${SESSION_ID}/execute/reference_generation" \ |
| 385 | -H "Content-Type: application/json" \ |
| 386 | -d '{"style": "anime"}' |
| 387 | |
| 388 | # 10. 确认并继续 |
| 389 | curl -s -X POST "http://localhost:8000/api/project/${SESSION_ID}/continue" |
| 390 | |
| 391 | # 11. 执行第五阶段(视频生成) |
| 392 | curl -X POST "http://localhost:8000/api/project/${SESSION_ID}/execute/video_generation" \ |
| 393 | -H "Content-Type: application/json" \ |
| 394 | -d '{"style": "anime"}' |
| 395 | |
| 396 | # 12. 确认并继续 |
| 397 | curl -s -X POST "http://localhost:8000/api/project/${SESSION_ID}/continue" |
| 398 | |
| 399 | # 13. 执行第六阶段(后期剪辑) |
| 400 | curl -X POST "http://localhost:8000/api/project/${SESSION_ID}/execute/post_production" \ |
| 401 | -H "Content-Type: application/json" \ |
| 402 | -d '{"style": "anime"}' |
| 403 | ``` |
| 404 | |
| 405 | ### 使用 jq 简化 |
| 406 | |
| 407 | ```bash |
| 408 | # 创建项目并提取 session_id |
| 409 | SESSION_ID=$(curl -s -X POST http://localhost:8000/api/project/start \ |
| 410 | -H "Content-Type: application/json" \ |
| 411 | -d '{"idea": "故事线", "style": "anime"}' | python3 -c "import json,sys; print(json.load(sys.stdin)['session_id'])") |
| 412 | |
| 413 | # 查看项目状态 |
| 414 | curl -s "http://localhost:8000/api/project/${SESSION_ID}/status" | python3 -m json.tool |
| 415 | ``` |
| 416 | |
| 417 | --- |
| 418 | |
| 419 | ## 错误处理 |
| 420 | |
| 421 | ### HTTP 状态码 |
| 422 | |
| 423 | | 状态码 | 说明 | |
| 424 | |--------|------| |
| 425 | | 200 | 请求成功 | |
| 426 | | 400 | 请求参数错误 | |
| 427 | | 404 | 资源不存在 | |
| 428 | | 500 | 服务器内部错误 | |
| 429 | |
| 430 | ### 错误响应格式 |
| 431 | |
| 432 | ```json |
| 433 | { |
| 434 | "detail": "错误描述" |
| 435 | } |
| 436 | ``` |
| 437 | |
| 438 | ### 常见错误 |
| 439 | |
| 440 | | 错误 | 说明 | |
| 441 | |------|------| |
| 442 | | Session not found | 指定的 session_id 不存在 | |
| 443 | | Artifact for stage 'xxx' not found | 指定阶段的产物不存在 | |
| 444 | | 阶段执行失败 | 阶段执行过程中发生错误 | |
| 445 | |
| 446 | --- |
| 447 | |
| 448 | ## 前端与 API 共享 |
| 449 | |
| 450 | API 和前端共享同一个 session 存储: |
| 451 | - Session 文件位置: `backend/code/data/sessions/{session_id}.json` |
| 452 | - 产物位置: `backend/code/result/` |
| 453 | |
| 454 | 这意味着: |
| 455 | 1. API 创建的项目可以在前端查看和继续 |
| 456 | 2. 前端创建的项目可以继续使用 API 操作 |
| 457 | 3. 两种方式可以随时切换 |
| 458 |