后端模块拆分
当前阶段:各模块定义抽象接口(ABC)+ Pydantic 领域模型。部分模块已有具体实现(media)。
每个模块包含 interface.py(接口)、model.py(领域模型),有实现的模块额外包含 service.py。
项目层级
backend/
├── packages/
│ ├── common/ # 共享:Response、BizException、BizCode 枚举
│ ├── framework/ # 基础设施:KodoStorage、ChatProvider、DB 配置
│ ├── ai_engine/ # 生成管线(独立包)
│ └── app/ # 业务应用
│ └── src/windup_app/
│ ├── web/api/ # FastAPI 路由
│ │ ├── generation.py # 生成任务 API + SSE 进度推送
│ │ ├── media.py # 媒体上传 API
│ │ ├── workflow_run.py # 执行记录 API
│ │ └── agent.py # LLM 代理 API(POST /ai/chat)
│ ├── bootstrap/app.py # 组装入口(composition root)
│ └── server/ # 业务域(按域分组)
│ ├── media/ # 用户素材上传
│ ├── project/ # 项目约束配置
│ ├── character/ # 角色资产数据
│ ├── orchestrator/ # 生成任务调度
│ └── workflow_run/ # 工作流执行记录
已删除的模块:
workflow(旧卡片体系,被 workflow_run 替代)
agent(后端不做 agent 编排,简化为 LLM 代理端点 POST /ai/chat)
web/sse/(SSE 模块,合并到 generation API)
依赖方向
common
▲
framework
▲
┌──────┴──────┐
ai_engine foundation
▲ ▲
│ │
│ workflow_run
│ │
└───── orchestrator
模块关系:
- workflow_run(执行记录):存储前端维护的节点树 JSONB,不感知节点结构
- orchestrator(生成任务调度):管理生成任务生命周期,调用 ai_engine
- ai_engine(生成管线):实际 AI 生成,被 orchestrator 调用
规则:
- foundation → framework, common
- workflow_run → foundation, framework, common
- orchestrator → ai_engine, foundation, framework, common
- ai_engine → framework.providers(接口), common
- 禁止:foundation → orchestrator / ai_engine
- 禁止:ai_engine → foundation / orchestrator
基础业务域
media — 用户素材上传
对应表: windup_media 接口: MediaService 实现: ObjectStorageMediaService
| 方法 |
说明 |
upload(data, metadata) |
上传文件到对象存储,返回 URL |
文件分类 MediaCategory:reference-image / outfit-preview / action-frame / general
project — 项目约束配置
对应表: windup_project 接口: ProjectService
| 方法 |
说明 |
create_project(project) |
创建项目 |
project_name_exists(user_id, name) |
名称唯一性校验 |
get_project(id) |
按 ID 查询 |
list_projects(page, page_size, user_id) |
分页查询 |
delete_project(id) |
删除 |
character — 角色资产数据
对应表: windup_character 接口: CharacterService
character_data JSONB 三层嵌套:outfit → action → frame
| 方法 |
说明 |
create_character(session, **fields) |
创建角色 |
get_character(session, character_id) |
按 ID 查询 |
list_characters(session, *, project_id, page, page_size) |
分页查询 |
update_character(session, character_id, **fields) |
更新角色 |
delete_character(session, character_id) |
删除角色 |
工作流域
orchestrator — 生成任务调度
对应表: windup_generation_task 接口: GenerationService
管理生成任务生命周期:创建任务 → 加载项目约束 → 调 ai_engine → 上传结果 → 回写状态。
| 方法 |
说明 |
generate_character_image(input) |
提交角色图片生成任务 |
generate_character_action(input) |
提交角色动作生成任务 |
get_task(project_id, task_id) |
查询任务状态与结果 |
SSE 推送:
端点:GET /generation/tasks/{task_id}/stream
事件类型:
progress:生成进度 {stage, current, total, note}
completed:任务完成,携带 result
failed:任务失败,携带 error
SSE 端点和 EventBus 内置于 web/api/generation.py,不单独维护 SSE 模块。
workflow_run — 工作流执行记录
对应表: windup_workflow_run 接口: WorkflowRunService
设计原则: 后端不感知节点结构。节点树由前端维护,通过 nodes JSONB 字段全量读写。
数据模型:
| 字段 |
类型 |
说明 |
id |
BigInteger |
主键 |
project_id |
BigInteger |
关联项目 |
parent_run_id |
BigInteger |
父执行记录(版本链) |
root_capability |
VARCHAR(50) |
根节点能力类型 |
root_input |
JSONB |
根节点输入 |
root_output |
JSONB |
根节点输出 |
nodes |
JSONB |
节点树(前端自定义结构,后端不校验) |
status |
VARCHAR(20) |
active / soft_deleted |
version |
INTEGER |
版本号 |
created_at |
TIMESTAMPTZ |
创建时间 |
接口方法:
| 方法 |
说明 |
create_run(project_id, root_capability, root_input, nodes?) |
创建执行记录 |
get_run(run_id) |
获取执行记录(含 nodes) |
update_run(run_id, root_output?, nodes?, status?) |
全量更新(含 nodes) |
delete_run(run_id) |
软删除 |
diff_runs(new_run_id, old_run_id) |
对比新旧 run |
API 端点:
POST /workflow-runs 创建执行记录
GET /workflow-runs/{id} 获取执行记录(含 nodes)
PATCH /workflow-runs/{id} 全量更新(含 nodes)
DELETE /workflow-runs/{id} 软删除
POST /workflow-runs/{id}/diff/{old_id} 对比新旧 run
版本链: 修改角色模板时,创建新 run(parent_run_id 指向旧 run),前端可通过 diff 判断哪些节点可复用。
AI Proxy
agent — LLM 代理
端点: POST /ai/chat
后端是无状态 LLM 代理,不做 agent 编排。前端维护 conversation history,传完整 messages 数组。
请求体:
{
"system": "系统提示词",
"messages": [{"role": "user", "content": "..."}],
"model": "gpt-4o",
"tools": [{"type": "function", "function": {...}}]
}
响应: OpenAI 兼容 SSE 流式格式。
后端职责: 认证 → 调用 LLM → 流式转发。不解析 tool_calls、不执行工具、不存对话历史。
前端职责: 维护对话历史、定义 tools、解析 tool_calls、调用原子能力 API 执行工具。
生成管线域
ai_engine — 生成管线
接口: CharacterGeneratorPort
生成管线:提示词 → 出图 → 抠图 → 截帧 → 返回产物。
| 组件 |
职责 |
strategy/ |
策略分发(VIDEO_I2V / PER_FRAME / PROC_IDLE) |
prompt/ |
提示词构建(walk / jump / attack) |
slicing/ |
帧提取(imageio/pyav) |
postprocess/ |
像素化、脚线对齐、sprite sheet 打包 |
master_prep.py |
母版预处理 |
设计哲学
后端不与前端 UI 耦合
后端提供固定的原子能力(生成图片、生成动画、导出)和存储能力(workflow_run),前端负责节点定义、拼装、推进。前端交互变更不影响后端。
workflow_run 只做记录
后端不感知节点结构,nodes JSONB 由前端全量读写。回滚、版本管理由前端逻辑驱动,后端只提供存储和 diff 能能。
SSE 不单独维护
SSE 端点内置于 generation 模块(GET /generation/tasks/{task_id}/stream),EventBus 也内置于同一文件。不抽象为通用基础设施。
Agent 在前端
后端只提供 POST /ai/chat LLM 代理。agent 编排逻辑(意图识别、工具调度、对话管理)全部在前端实现,前端调用后端原子能力 API 执行工具。
后端模块拆分
项目层级
依赖方向
模块关系:
规则:
基础业务域
media — 用户素材上传
对应表:
windup_media接口:MediaService实现:ObjectStorageMediaServiceupload(data, metadata)文件分类
MediaCategory:reference-image/outfit-preview/action-frame/generalproject — 项目约束配置
对应表:
windup_project接口:ProjectServicecreate_project(project)project_name_exists(user_id, name)get_project(id)list_projects(page, page_size, user_id)delete_project(id)character — 角色资产数据
对应表:
windup_character接口:CharacterServicecharacter_dataJSONB 三层嵌套:outfit → action → framecreate_character(session, **fields)get_character(session, character_id)list_characters(session, *, project_id, page, page_size)update_character(session, character_id, **fields)delete_character(session, character_id)工作流域
orchestrator — 生成任务调度
对应表:
windup_generation_task接口:GenerationService管理生成任务生命周期:创建任务 → 加载项目约束 → 调 ai_engine → 上传结果 → 回写状态。
generate_character_image(input)generate_character_action(input)get_task(project_id, task_id)SSE 推送:
端点:
GET /generation/tasks/{task_id}/stream事件类型:
progress:生成进度{stage, current, total, note}completed:任务完成,携带resultfailed:任务失败,携带errorworkflow_run — 工作流执行记录
对应表:
windup_workflow_run接口:WorkflowRunService设计原则: 后端不感知节点结构。节点树由前端维护,通过
nodesJSONB 字段全量读写。数据模型:
idproject_idparent_run_idroot_capabilityroot_inputroot_outputnodesstatusversioncreated_at接口方法:
create_run(project_id, root_capability, root_input, nodes?)get_run(run_id)update_run(run_id, root_output?, nodes?, status?)delete_run(run_id)diff_runs(new_run_id, old_run_id)API 端点:
版本链: 修改角色模板时,创建新 run(
parent_run_id指向旧 run),前端可通过 diff 判断哪些节点可复用。AI Proxy
agent — LLM 代理
端点:
POST /ai/chat后端是无状态 LLM 代理,不做 agent 编排。前端维护 conversation history,传完整 messages 数组。
请求体:
{ "system": "系统提示词", "messages": [{"role": "user", "content": "..."}], "model": "gpt-4o", "tools": [{"type": "function", "function": {...}}] }响应: OpenAI 兼容 SSE 流式格式。
后端职责: 认证 → 调用 LLM → 流式转发。不解析 tool_calls、不执行工具、不存对话历史。
前端职责: 维护对话历史、定义 tools、解析 tool_calls、调用原子能力 API 执行工具。
生成管线域
ai_engine — 生成管线
接口:
CharacterGeneratorPort生成管线:提示词 → 出图 → 抠图 → 截帧 → 返回产物。
strategy/prompt/slicing/postprocess/master_prep.py设计哲学
后端不与前端 UI 耦合
后端提供固定的原子能力(生成图片、生成动画、导出)和存储能力(workflow_run),前端负责节点定义、拼装、推进。前端交互变更不影响后端。
workflow_run 只做记录
后端不感知节点结构,
nodesJSONB 由前端全量读写。回滚、版本管理由前端逻辑驱动,后端只提供存储和 diff 能能。SSE 不单独维护
SSE 端点内置于 generation 模块(
GET /generation/tasks/{task_id}/stream),EventBus 也内置于同一文件。不抽象为通用基础设施。Agent 在前端
后端只提供
POST /ai/chatLLM 代理。agent 编排逻辑(意图识别、工具调度、对话管理)全部在前端实现,前端调用后端原子能力 API 执行工具。