Skip to content

feat:module-split #124

Description

@xiaocheny214

后端模块拆分

当前阶段:各模块定义抽象接口(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

Image

基础业务域

media — 用户素材上传

对应表: windup_media 接口: MediaService 实现: ObjectStorageMediaService

方法 说明
upload(data, metadata) 上传文件到对象存储,返回 URL

文件分类 MediaCategoryreference-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 执行工具。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions