31 KiB
31 KiB
CURRENT_ARCHITECTURE
扫描时间:2026-06-17
范围:backend、user-app、admin、workers、backend/prisma、deploy、tools。
说明:本文只记录当前项目结构、实现状态和关键路径,不包含任何 Provider 密钥。
1. 系统整体架构图
flowchart TB
User[用户前台\nllzai.top\nVue 3 + Vite] --> Nginx[Nginx / 宝塔站点]
Admin[管理后台\nai.admin.llzai.top\nVue 3 + Vite] --> Nginx
Nginx --> API[后端 API\nai.api.llzai.top\nNestJS /api]
API --> Auth[Auth / User / RBAC]
API --> Project[Projects / Workflow]
API --> Novel[Novel Library / Reader]
API --> Story[StoryBible / Episode / Script / Storyboard]
API --> Character[Character Library / Actor Profile]
API --> Live[Live Action Pipeline]
API --> Provider[AI Provider Layer]
API --> Media[Media / FFmpeg Render]
API --> AdminApi[Admin / Ops / Provider Config]
API --> Billing[Billing / Quota / Provider Cost]
API --> Prisma[Prisma ORM]
Prisma --> MySQL[(MySQL)]
API --> Redis[(Redis)]
Redis --> BullMQ[BullMQ Queues]
Worker[workers\nBullMQ Worker] --> BullMQ
Worker --> InternalAPI[/api/internal/worker/tasks/:id/execute]
InternalAPI --> API
API --> Storage[StorageService\nLocal / MinIO / Public Temp URL]
Storage --> Files[(storage / object files)]
Provider --> OpenAI[OpenAI]
Provider --> Volc[火山 / 豆包]
Provider --> Kling[可灵 Kling]
Provider --> MiniMax[MiniMax / 海螺]
Provider --> Domestic[DeepSeek / 通义 / Kimi / 智谱等]
Provider --> Mock[Mock Providers]
Live --> FFmpeg[FFmpeg / FFprobe]
Media --> FFmpeg
FFmpeg --> FinalVideo[成品视频 / 素材库]
真人短剧主流程:
flowchart LR
Prompt[外部提示词 / 小说章节 / 项目设定] --> Parse[提示词拆镜 / 分镜草稿]
Parse --> Project[创建 Project / Episode / StoryBible]
Project --> Prepare[真人分镜准备\nTextProvider 可选]
Prepare --> Keyframe[关键帧生成\nImageProvider 可选]
Keyframe --> Video[视频片段生成\nVideoProvider 可选]
Video --> Select[每个分镜选择候选片段]
Select --> Render[FFmpeg 合成]
Render --> Works[作品列表 / 素材列表]
小说主流程:
flowchart LR
Import[后台导入小说\n粘贴 / 批量 / 文件] --> Split[章节自动切割]
Split --> NovelSource[NovelSource]
Split --> Chapter[NovelChapter]
NovelSource --> Reader[前台小说详情 / 目录 / 阅读器]
Reader --> Progress[阅读进度]
Reader --> Bookmark[书签]
Reader --> Annotation[批注]
NovelSource --> ShortDrama[选择小说生成短剧]
2. 核心模块
后端 Backend
入口:
backend/src/main.ts:全局/api前缀、CORS、请求体大小、全局拦截器、异常过滤器。backend/src/app.module.ts:注册全部业务模块。
核心模块:
AuthModule:登录、JWT、权限守卫。UsersModule:用户资料和账号信息。BillingModule:订单、额度、Provider 消耗记录。ProjectsModule:项目创建、提示词直出分镜、作品库、小说库前台接口。AssetsModule:文件上传、素材存储、临时公网访问。NovelsModule:小说导入、解析、章节管理、原创小说工具。StoryBiblesModule:故事圣经、世界观设定。CharactersModule:项目角色库、我的真人脸包、角色定妆版本、状态变体。MemoriesModule:剧情记忆、连续性。EpisodesModule:分集。ScriptsModule:脚本、分镜。ImagesModule:角色图、关键帧、锚点图生成。LiveActionModule:真人短剧全流程。MediaModule:传统音频、字幕、视频合成。ProvidersModule:AI Provider 注册、调用、配置、日志、成本。QueuesModule:RenderTask、BullMQ 队列、内部 Worker 执行入口。ReviewsModule:内容审核、返修、案例展示。AdminModule:后台用户、项目、素材、小说、Provider、Router、运营数据。
前端 User App
- 技术栈:Vue 3 + Vite。
- 主要页面:
user-app/src/pages/index/index.vue。 - 主要能力:作品列表、视频/小说/素材 Tab、提示词直出分镜、真人短剧流程、模型选择、素材预览、小说阅读器、我的真人脸包。
后台 Admin
- 技术栈:Vue 3 + Vite。
- 主要页面:
admin/src/App.vue。 - 主要能力:Provider 配置、模型开关、成本规则、小说管理、章节管理、素材管理、用户项目管理、运营看板。
Worker
workers/src/main.ts:BullMQ Worker 进程。- Worker 不直接写复杂业务,主要从队列拿
RenderTask,再调用后端内部接口执行。
3. 数据表关系
当前 Prisma Schema 以 *_id 字段做逻辑关联,很多模型没有声明 Prisma @relation。下面是业务关系视图,不代表数据库里已经全部建外键约束。
erDiagram
User ||--o{ Project : owns
User ||--o{ NovelReadingProgress : reads
User ||--o{ NovelBookmark : bookmarks
User ||--o{ NovelAnnotation : annotates
User ||--o{ GlobalCharacter : owns
Project ||--o{ StoryBible : has
Project ||--o{ WorldBible : has
Project ||--o{ Character : has
Project ||--o{ Episode : has
Project ||--o{ Asset : has
Project ||--o{ CopyrightRecord : has
Project ||--o{ RenderTask : has
Project ||--o{ ActorProfile : has
NovelSource ||--o{ NovelChapter : has
NovelSource ||--o{ NovelReadingProgress : has
NovelSource ||--o{ NovelBookmark : has
NovelSource ||--o{ NovelAnnotation : has
Episode ||--o{ EpisodeScript : has
Episode ||--o{ StoryboardShot : has
Episode ||--o{ VideoClip : has
StoryboardShot ||--o{ ShotImage : has
StoryboardShot ||--o{ VideoClip : candidates
Character ||--o{ CharacterImage : has
Character ||--o{ CharacterMemory : has
Character ||--o{ CharacterDesignVersion : has
Character ||--o{ CharacterState : has
GlobalCharacter ||--o{ GlobalCharacterAsset : has
GlobalCharacter ||--o{ Character : binds
ProviderConfig ||--o{ ProviderLog : logs
ProviderConfig ||--o{ RenderTask : used_by
Asset ||--o{ VideoClip : stores
核心表分组:
| 分组 | 表 |
|---|---|
| 用户 / 项目 | User, Project, CopyrightRecord |
| 小说 / 阅读 | NovelSource, NovelChapter, NovelReadingProgress, NovelBookmark, NovelAnnotation |
| 故事世界 | StoryBible, WorldBible |
| 角色 | Character, GlobalCharacter, GlobalCharacterAsset, CharacterImage, CharacterMemory, CharacterDesignVersion, CharacterState, ActorProfile |
| 分集 / 分镜 | Episode, EpisodeScript, StoryboardShot, ShotImage |
| 视频 / 素材 | VideoClip, Asset, RenderTask |
| Provider / 成本 | ProviderConfig, ProviderLog, Order, QuotaAccount, QuotaLog |
| 审核 / 运营 | RevisionRequest, ContentReview, CaseShowcase, OperationLog, SystemConfig |
| 爆款分析 | HitAnalysisCase, HitAnalysisSegment, CreativePattern, ProjectCreativePattern, AnalyticsEvent |
重要唯一约束和索引:
NovelChapter:novel_source_id + chapter_no唯一,支持章节分页和卷号索引。NovelReadingProgress:user_id + novel_source_id唯一。CharacterDesignVersion:character_id + version_no唯一。CharacterState:character_id + state_code唯一。Episode:project_id + episode_no唯一。StoryboardShot:episode_id + shot_no唯一。ActorProfile:project_id + character_id唯一。ProviderConfig:provider_type + provider_code唯一。RenderTask:idempotency_key唯一。ProjectCreativePattern:project_id + creative_pattern_id唯一。
4. AI Provider 列表
Provider 配置来自 ProviderConfig 表和初始化配置。状态按当前扫描结果记录。
Provider 类型统计
| 类型 | 总数 | 启用 |
|---|---|---|
TextProvider |
35 | 26 |
NovelProvider |
15 | 9 |
ImageProvider |
11 | 5 |
VideoProvider |
21 | 10 |
VoiceProvider |
5 | 2 |
LipSyncProvider |
8 | 0 |
EmbeddingProvider |
2 | 2 |
ModerationProvider |
2 | 2 |
FileParseProvider |
1 | 1 |
QualityCheckProvider |
1 | 1 |
TextProvider
已启用:
| Provider | 显示名 | 模型 |
|---|---|---|
volcengine-doubao-seed20-pro-text |
豆包文本 2.0 Pro | doubao-seed-2-0-pro-260215 |
volcengine-doubao-seed20-lite-text |
豆包文本 2.0 Lite | doubao-seed-2-0-lite-260215 |
volcengine-doubao-seed20-mini-text |
豆包文本 2.0 Mini | 当前配置 |
volcengine-doubao-text |
豆包文本 | doubao-seed-1-6-250615 |
deepseek-text |
DeepSeek | deepseek-chat |
qwen-text |
通义千问 | qwen-plus |
kimi-text |
Kimi | kimi-latest |
zhipu-glm-text |
智谱 GLM | glm-4.5 |
baidu-qianfan-text |
百度千帆 | 当前配置 |
tencent-hunyuan-text |
腾讯混元 | 当前配置 |
iflytek-spark-text |
讯飞星火 | 当前配置 |
minimax-text |
MiniMax 文本 | 当前配置 |
baichuan-text |
百川 | 当前配置 |
stepfun-text |
阶跃星辰 | 当前配置 |
sensenova-text |
商汤日日新 | 当前配置 |
ai360-text |
360 智脑 | 当前配置 |
mistral-text |
Mistral | 当前配置 |
xai-grok-text |
xAI Grok | 当前配置 |
openrouter-text |
OpenRouter | 当前配置 |
together-llama-text |
Together Llama | 当前配置 |
fireworks-llama-text |
Fireworks Llama | 当前配置 |
perplexity-sonar-text |
Perplexity Sonar | 当前配置 |
azure-openai-text |
Azure OpenAI | 当前配置 |
aws-bedrock-openai-compatible-text |
AWS Bedrock OpenAI Compatible | 当前配置 |
openai-responses-text |
OpenAI Responses | gpt-5.5 |
mock-text |
Mock Text | Mock |
未启用:
openai-gpt54-textopenai-gpt54-mini-textopenai-gpt54-nano-textopenai-gpt5-textopenai-gpt41-textopenai-gpt41-mini-textgoogle-gemini-textanthropic-claude-textcohere-command-text
NovelProvider
已启用:
| Provider | 显示名 | 模型 |
|---|---|---|
volcengine-doubao-seed20-pro-novel |
豆包小说 2.0 Pro | doubao-seed-2-0-pro-260215 |
volcengine-doubao-seed20-lite-novel |
豆包小说 2.0 Lite | doubao-seed-2-0-lite-260215 |
volcengine-doubao-novel |
豆包小说 | doubao-seed-1-6-250615 |
deepseek-novel |
DeepSeek 小说 | deepseek-chat |
qwen-novel |
通义小说 | qwen-plus |
kimi-novel |
Kimi 小说 | kimi-latest |
zhipu-glm-novel |
智谱小说 | glm-4.5 |
openai-responses-novel |
OpenAI Responses 小说 | gpt-5.5 |
mock-novel |
Mock Novel | Mock |
未启用:
openai-gpt54-novelopenai-gpt54-mini-novelopenai-gpt5-novelopenai-gpt41-novelgoogle-gemini-novelanthropic-claude-novel
ImageProvider
已启用:
| Provider | 显示名 | 模型 |
|---|---|---|
volcengine-seedream-50-image |
豆包 Seedream 5.0 图片 | doubao-seedream-5-0-260128 |
volcengine-seedream-50-lite-image |
豆包 Seedream 5.0 Lite 图片 | doubao-seedream-5-0-lite-260128 |
volcengine-seedream-45-image |
豆包 Seedream 4.5 图片 | doubao-seedream-4-5-251128 |
openai-image |
OpenAI Image | gpt-image-2 |
mock-image |
Mock Image | Mock |
未启用:
google-gemini-imagestability-imagereplicate-flux-imagefal-flux-imageideogram-imageleonardo-image
VideoProvider
已启用:
| Provider | 显示名 | 模型 |
|---|---|---|
volcengine_seedance_20_fast |
豆包 Seedance 2.0 Fast 视频 | doubao-seedance-2-0-fast-260128 |
volcengine_seedance_20 |
豆包 Seedance 2.0 视频 | doubao-seedance-2-0-260128 |
jimeng_seedance |
豆包 Seedance 1.5 Pro 视频 | doubao-seedance-1-5-pro-251215 |
kling-image-to-video |
可灵图生视频 | kling-v3 |
kling-21-image-to-video |
可灵 2.1 图生视频 | kling-v2-1 |
kling-21-master-image-to-video |
可灵 2.1 Master 图生视频 | kling-v2-1-master |
minimax_hailuo_23_fast |
海螺 2.3 Fast | MiniMax-Hailuo-2.3-Fast |
minimax_hailuo_23 |
海螺 2.3 | MiniMax-Hailuo-2.3 |
openai-video |
OpenAI Sora | sora-2 |
mock-video |
Mock Video | Mock |
未启用:
alibaba_wan26_i2v_flashalibaba_wan26_i2vvidu_q3_turbo_referencevidu_q3_proopenai-sora-2-pro-videorunway-image-to-videogoogle-veo-videoreplicate-videofal-videoluma-ray-videopika-video
VoiceProvider
已启用:
openai-tts:gpt-4o-mini-ttsmock-voice
未启用:
elevenlabs-ttsminimax-ttsvolcengine-tts
LipSyncProvider
当前全部未启用:
mock-lipsyncminimax-lipsyncalibaba-videoretalk-lipsyncheygen-lipsyncsync-labs-lipsyncfal-veed-lipsyncvolcengine-doubao-lipsyncgeneric-lipsync
其他 Provider
已启用:
openai-embeddingmock-embeddingmock-file-parseopenai-moderationmock-moderationmock-quality-check
5. Router 逻辑
Router 主要服务真人视频生成,核心文件:
backend/src/ai-router/ai-router.service.tsbackend/src/ai-router/ai-router.types.ts
默认配置:
- Router 版本:
ai.router.v1 - 默认语言:
zh-CN - 每日预算:
500 - 普通路线默认 Provider:
minimax_hailuo_23_fast - 高价值路线默认 Provider:
kling-image-to-video - 普通 fallback:
minimax_hailuo_23_fast→volcengine_seedance_20_fast→volcengine_seedance_20→jimeng_seedance→mock-video - 高价值 fallback:
kling-image-to-video→volcengine_seedance_20→minimax_hailuo_23_fast→volcengine_seedance_20_fast→jimeng_seedance→mock-video
决策步骤:
- 如果前端手动选择了视频模型,并且 Router 允许手动覆盖,优先使用手动 Provider。
- 如果手动选择了模型,但系统不允许覆盖,直接返回错误,避免假装生效。
- 没有手动选择时,读取系统 Router 配置。
- 根据分镜文本推断
scene_type,例如对话、冲突、揭露、武打、玄幻变身等。 - 对分镜打分:重要性、情绪强度、动作强度。
- 如果重要性或动作强度较高,进入
premium路线;否则进入normal路线。 - 根据候选 Provider 顺序逐个检查:
- Provider 是否存在。
- Provider 是否启用。
- 单条成本是否超过上限。
- 当日预算是否超过限制。
- 时长、分辨率、比例等能力是否可用。
- 选中第一个可用 Provider。
- 记录 Router 决策、跳过原因、成本估算、Provider 调用日志。
当前实现特点:
- 支持前端手动指定 Provider。
- 支持按分镜打分自动调度。
- 支持 Provider fallback。
- 支持成本估算和日限额拦截。
- 支持 Provider 不可用时给出明确跳过原因。
- 支持长时长拆段,避免单个 Provider 不支持当前时长。
6. Prompt Builder 实现情况
核心文件:
backend/src/live-action/prompt-builder.service.tsbackend/src/live-action/prompt-builder.service.spec.ts
当前版本:
live-action-prompt-engine-v2
Provider Profile:
generichailuoklingmock
场景模板:
dialogconflictrevealengagement_breakuphumiliationrich_arrivalidentity_revealbank_balance_revealboardroom_face_slapceo_entrancedimensional_breakxianxia_transformationaction
Prompt Builder 输出内容:
- prompt 版本。
- Provider profile。
- scene type。
- template ids。
- applied rules。
- route tier。
- aspect ratio。
- visual style。
- characters。
- actor consistency rules。
- location。
- main action。
- camera shot / camera move / camera tag。
- performance。
- lighting。
- VFX / sound cues。
- duration。
- continuity rules。
- motion director。
- director plan。
- lip sync policy。
- negative prompt。
不同 Provider 的处理:
- 海螺:偏中文真人短剧风格,控制提示词长度,强调镜头、人物、动作和短剧质感。
- 可灵:偏图生视频、参考图、动作连续性和真实镜头。
- 通用:偏 photorealistic vertical short drama。
- Mock:输出结构化 key-value,便于测试。
当前使用位置:
- 真人分镜准备后,视频片段生成前,会根据 Router 决策和 Provider Profile 重新构建最终提交给视频模型的 Prompt。
LiveActionService会把分镜、角色锁定信息、导演计划、唇形策略、Provider 能力一起传给 Prompt Builder。
待加强点:
- Prompt Builder 目前主要服务真人视频生成。
- 小说、故事圣经、角色抽取、分集、脚本、普通分镜等文本步骤虽然已有 Provider 接入点,但还需要统一成更严格的 schema、重试、验证和 Prompt 版本管理。
- 可继续增加“Prompt 调试面板”,把最终提交给 Provider 的完整参数、参考图、负面词、成本估算展示给前端测试人员。
7. Character Library 实现情况
核心文件:
backend/src/characters/characters.service.tsbackend/src/characters/characters.controller.tsbackend/src/characters/character.dto.tsbackend/src/characters/character.types.tsbackend/src/images/images.service.tsbackend/src/live-action/live-action.service.ts
当前角色体系分两层:
我的真人脸包
对应表:
GlobalCharacterGlobalCharacterAsset
当前逻辑:
- 用户可以在“我的”里维护长期可复用的真人脸包。
- 真人脸包只保存脸部身份参考。
- 上传时需要本人/授权确认。
- 支持 1-10 张脸部参考图。
- 不默认把真人照当作项目角色锚点。
- 后续项目套用脸包时,需要在项目里生成或选择“仿真定妆锚点图”。
这样做的原因:
- 真人照片只用于锁脸,不应直接作为视频主角图。
- 不同项目有不同服装、发型、时代、风格,需要在项目内重新定妆。
- 视频模型对真人照片有限制时,可以把真人脸包作为身份参考,而不是首帧图。
项目角色库
对应表:
CharacterCharacterImageCharacterDesignVersionCharacterStateActorProfile
当前逻辑:
- 项目可以从故事圣经、章节、提示词中抽取角色。
- 角色可以绑定我的真人脸包。
- 角色可以生成多张定妆图。
- 可设置角色锚点图。
- 可保存设计版本。
- 可保存状态变体,例如不同服装、受伤状态、战斗状态。
ActorProfile用于真人短剧阶段锁定角色参考图、锚点、脸包引用。
真人视频使用角色时:
- 优先使用项目内已确认的定妆锚点图。
- 真人脸包作为脸部参考。
- 如果 Provider 支持角色参考图,则把参考图传入 Provider。
- 如果 Provider 不支持角色参考图,则只在 Prompt 和前置关键帧生成里体现角色一致性。
- 对不允许真人图直接生成视频的 Provider,会排除真人脸包作为首帧,避免触发真实人物限制。
8. FFmpeg 流程
相关文件:
backend/src/live-action/live-action.service.tsbackend/src/media/media.service.tsbackend/src/live-action/live-action.types.ts
真人短剧 FFmpeg 合成流程:
flowchart TB
Selected[每个分镜已选择 VideoClip] --> Download[下载/读取素材文件]
Download --> Probe[ffprobe 探测\n时长 / 音轨 / 编码]
Probe --> Normalize[标准化片段\n裁剪 / 补齐 / 缩放 / pad / fps]
Normalize --> Concat[concat demuxer 拼接]
Concat --> VideoTrack[video-track.mp4]
VideoTrack --> Post[后期处理]
Dialogue[可选后期对白 / TTS] --> Post
BGM[可选 BGM] --> Post
SFX[可选音效] --> Post
Subtitle[可选 ASS 字幕] --> Post
Post --> Encode[编码输出\nlibx264 / libopenh264 / mpeg4 fallback]
Encode --> Final[最终 MP4]
标准化动作:
- 读取源视频。
- 按分镜时长裁剪或补齐。
- 统一为竖屏
720x1280。 force_original_aspect_ratio=decrease后 pad。setsar=1。fps=30。format=yuv420p。- 根据配置决定是否保留源音频。
拼接动作:
- 每段生成临时标准化 clip。
- 写入
clips.txt。 - 使用 FFmpeg concat demuxer 拼接。
- 输出
video-track.mp4。
后期动作:
- 可选后期对白。
- 可选 BGM。
- 可选 SFX。
- 可选字幕。
- 可选画面 polish filter。
- 音频使用
amix、loudnorm、limiter等策略混合。
编码器 fallback:
- 优先
libx264。 - 如果环境没有
libx264,使用libopenh264。 - 如果仍不可用,退到
mpeg4。
这解决了服务器 FFmpeg 缺少 libx264 时合成失败的问题。
当前后期策略:
- 合成时可命名成品,默认项目名。
- 分镜可以保留源视频声音。
- 后期对白、字幕、BGM、音效应由前端可选。
- 字幕不适合默认塞入长描述,当前应更偏短标题或分镜短句。
9. 当前已完成功能
基础工程
- NestJS 后端、Vue 前台、Vue 后台、BullMQ Worker 的 monorepo 结构。
- Prisma + MySQL 数据层。
- Redis 队列基础。
- StorageService 支持本地/对象存储/临时公网 URL。
- 全局 API 响应封装、异常处理、请求 ID。
用户与后台
- 用户登录、JWT、基础权限。
- 后台 Provider 管理。
- 后台用户、项目、素材、小说、运营配置管理。
- Provider 日志和成本记录。
小说系统
- 后台小说源管理。
- 小说简介、引文、章节管理。
- 章节增删改查。
- 批量粘贴导入。
- 支持按章节分隔符切割,例如
===== 第6章:直播里的耳光 =====。 - 支持卷号逻辑,当前可按 30 章一卷。
- 前台小说列表、小说详情、目录、章节详情。
- 阅读进度保存。
- 书签。
- 批注。
- 搜索。
- 真书翻页模式和传统按钮模式的基础入口。
提示词直出分镜
- 可从外部提示词创建分镜项目。
- 支持解析 3 个镜头、不同镜头标题、不同镜头时长。
- 支持预览镜头数量和总时长。
- 创建后可进入真人分镜、关键帧、视频片段、合成流程。
- 可绑定我的真人脸包,但不会直接把真人照作为角色主图。
AI Provider
- 文本、小说、图片、视频、语音、审核、向量、文件解析等 Provider 类型已建模。
- 支持启用/停用。
- 支持后台配置。
- 支持模型下拉按步骤类型过滤。
- 支持前端手动选模型。
- 支持默认智能计划。
- 支持 Provider 日志。
- 支持成本估算和日限额拦截。
真人短剧
- 角色抽取。
- 真人分镜准备。
- 文本模型可参与真人分镜改写。
- 角色锚点图生成。
- 关键帧生成。
- 单镜头测试生成。
- 批量视频片段生成。
- 多 Provider 生成候选片段。
- 每个分镜选择候选片段。
- 视频 Provider 预检。
- Provider 长任务轮询和恢复。
- 对超时但外部仍 running 的任务支持继续查询。
- 失败片段记录。
- 质量检查和人工审核入口。
- FFmpeg 合成真人短剧。
素材与作品
- 素材表记录图片、视频、音频、字幕、最终视频等。
- 视频片段记录 Provider、模型、成本、状态。
- 前台作品列表已区分视频/小说/素材方向。
- 图片和视频预览能力已具备基础形态。
10. 待优化功能
Provider 能力矩阵
当前不同 Provider 的时长、分辨率、参考图能力不一致。需要继续把能力显式配置化:
- 支持时长:例如 4s、5s、6s、10s。
- 支持分辨率:例如
720p、768P、1080P。 - 支持首帧。
- 支持尾帧。
- 支持角色参考图。
- 是否允许真人照片。
- 是否支持多参考图。
- 是否支持同步声音。
前端应根据能力矩阵隐藏不可用选项,而不是等 Provider 报错。
外部任务与费用
- 已有 RenderTask 和长任务恢复,但还可以增强“正在生成”Tab。
- 应支持取消、重新拉取、手动对账。
- 外部官方账单 API 尚未统一接入,当前成本主要来自本地估算和 ProviderLog。
- 需要按 Provider 建立实际账单同步策略。
Prompt Builder
- 真人视频 Prompt Builder 已成型。
- 小说、故事圣经、角色抽取、分集、脚本、分镜等文本步骤需要统一 Prompt Builder、schema 校验和版本记录。
- 前台应展示最终提交参数,方便测试模型质量。
Character Library
- 真人脸包和项目定妆已经拆开。
- 需要继续强化锚点图候选管理、选中状态、历史保留。
- 需要给用户明确说明上传脸包的照片要求。
- 需要支持“同一脸包在不同项目生成不同定妆”的对比管理。
真人/版权安全
- 视频模型可能拒绝真实人物图。
- 需要更清楚地区分本人授权、素材授权、商业可用状态。
- 需要生成记录可追溯到使用了哪个脸包、哪个锚点、哪个 Provider、哪个 Prompt。
FFmpeg / 后期
- 服务器字体需要稳定打包,避免中文字幕显示方框。
- 字幕默认策略应更轻,只显示短标题或用户指定字幕。
- 后期对白需要按分镜时长自适应,避免裁剪和重叠。
- 源视频声音、后期配音、BGM、SFX 都应在前端合成前可选。
小说阅读器
- 真书翻页效果还可以继续做成点击右下角卷页,而不是按钮触发。
- 需要继续优化分页算法、阅读主题、字体、行距、自动保存。
- 可以增加章节购买/权限、阅读历史、多设备同步。
数据模型
- 当前大量关系通过
*_id逻辑关联,没有全部声明 Prisma@relation。 - 后续如果要生成更标准 ERD、级联删除、关联查询,可以逐步补充显式关系。
队列化
- 长耗时任务已有队列基础和部分恢复机制。
- 仍建议把图片生成、视频生成、合成、质量检查统一走 RenderTask + Worker,减少 HTTP 请求长时间等待。
11. 关键文件路径
工程入口
package.jsonbackend/src/main.tsbackend/src/app.module.tsbackend/prisma/schema.prismabackend/prisma/seed.ts
Provider
backend/src/providers/providers.service.tsbackend/src/providers/providers.controller.tsbackend/src/providers/provider.types.tsbackend/src/providers/providers.service.spec.tsbackend/prisma/migrations/20260615143000_seedance_20_providers/backend/prisma/migrations/20260615152000_volcengine_creation_providers/backend/prisma/migrations/20260615165000_openai_model_pool/backend/prisma/migrations/20260615172000_volcengine_content_generation_video/backend/prisma/migrations/20260616014000_seedance_20_cost_rules/
Router
backend/src/ai-router/ai-router.service.tsbackend/src/ai-router/ai-router.types.tsbackend/src/ai-router/ai-router.service.spec.ts
Live Action
backend/src/live-action/live-action.service.tsbackend/src/live-action/live-action.controller.tsbackend/src/live-action/live-action.dto.tsbackend/src/live-action/live-action.types.tsbackend/src/live-action/prompt-builder.service.tsbackend/src/live-action/prompt-builder.service.spec.tsbackend/src/live-action/live-action-provider-acceptance.ts
Character / Image
backend/src/characters/characters.service.tsbackend/src/characters/characters.controller.tsbackend/src/characters/character.dto.tsbackend/src/characters/character.types.tsbackend/src/images/images.service.tsbackend/src/images/images.controller.tsbackend/src/images/image.dto.tsbackend/src/images/image.types.tsbackend/prisma/migrations/20260615125000_character_workshop_v1/
Project / Story / Script
backend/src/projects/projects.service.tsbackend/src/projects/projects.controller.tsbackend/src/projects/project.dto.tsbackend/src/story-bibles/story-bibles.service.tsbackend/src/story-bibles/story-bible.dto.tsbackend/src/episodes/episodes.service.tsbackend/src/episodes/episode.dto.tsbackend/src/scripts/scripts.service.tsbackend/src/scripts/script.dto.ts
Novel
backend/src/novels/novels.service.tsbackend/src/novels/novels.service.spec.tsbackend/src/novels/novel-parser.service.tsbackend/src/novels/novel-parser.service.spec.tsbackend/src/novels/novel.dto.tsbackend/src/novels/novel.types.tsbackend/src/novels/original-novel-mock.service.tsbackend/src/novels/original-novel.dto.tsbackend/src/novels/original-novel.types.tsbackend/prisma/migrations/20260617093000_novel_chapter_volumes/backend/prisma/migrations/20260617111500_novel_reader_tools/
Media / FFmpeg
backend/src/media/media.service.tsbackend/src/media/media.controller.tsbackend/src/media/media.dto.tsbackend/src/live-action/live-action.service.ts
Assets / Storage
backend/src/assets/assets.service.tsbackend/src/assets/assets.controller.tsbackend/src/assets/storage.service.tsbackend/src/assets/public-temp-assets.controller.tsbackend/src/assets/asset.types.ts
Queue / Worker
backend/src/queues/queues.service.tsbackend/src/queues/worker-tasks.controller.tsworkers/src/main.ts
Admin Frontend
admin/src/App.vueadmin/src/api/client.tsadmin/src/styles.css
User Frontend
user-app/src/pages/index/index.vueuser-app/src/api/client.tsuser-app/src/styles.cssuser-app/src/workflow.ts
Deploy / Tooling
deploy/nginx.https.example.confdeploy/docker-compose.dev.yml.env.exampletools/frontend-visual-audit.mjstools/frontend-business-e2e.mjs
12. 当前 Router / Provider / Prompt / Character 的协作关系
flowchart TB
UI[前端步骤模型选择\n智能计划 / 手动模型] --> LiveAPI[LiveActionController]
LiveAPI --> LiveService[LiveActionService]
LiveService --> CharacterCtx[角色上下文\nCharacter / ActorProfile / FacePack / Anchor]
LiveService --> Router[AiRouterService]
Router --> ProviderConfig[ProviderConfig\n启用状态 / 成本 / 能力]
Router --> Decision[RouterDecision\nprovider / fallback / cost / tier]
CharacterCtx --> PromptBuilder[PromptBuilderService]
Decision --> PromptBuilder
PromptBuilder --> FinalPrompt[最终视频 Prompt\nPrompt Components / Negative Prompt]
FinalPrompt --> ProviderService[ProvidersService]
ProviderService --> ExternalAI[外部 AI 平台]
ExternalAI --> Asset[Asset / VideoClip / RenderTask]
关键原则:
- 前端每个 AI 步骤应只展示对应类型模型:文本、图片、视频、语音。
- 用户不选模型时走智能计划。
- 用户手动选模型时必须真实生效;如果不可用应直接报错。
- 同一分镜可以用多个视频模型生成多个候选。
- 合成前必须选择每个分镜最终使用哪个候选片段。
- 真人脸包只锁脸,项目锚点图才是视频角色主参考。
- Provider 报 running 时,本地不应直接判失败,应记录外部任务号并继续轮询恢复。