9.6 KiB
9.6 KiB
M0:/generated-* 静态资源前缀冻结基线
日期:2026-04-20
依据来源:
- ../docs/technical/NODE_BACKEND_MODULE_AND_API_INDEX.md
server-node/src/modules/assets/characterAssetRoutes.tsserver-node/src/modules/assets/qwenSpriteRoutes.tsserver-node/src/services/sceneImageService.tsserver-node/src/services/customWorldCoverAssetService.tsserver-node/src/services/customWorldAgentAutoAssetService.ts- ../docs/technical/SPACETIMEDB_AXUM_OSS_BACKEND_REWRITE_DESIGN_2026-04-20.md
1. 文档目的
这份文档用于完成 M0 的第五条任务:
- 整理当前所有
/generated-*静态资源前缀
这里的“整理”不是只列出几个目录名,而是要求冻结以下信息:
- 当前哪些
/generated-*前缀是正式业务前缀。 - 每个前缀由哪条后端链路产出。
- 每个前缀对应的当前路径模板是什么。
- 哪些前缀只是未来设计名或测试噪音,不能误当成当前正式兼容面。
2. 冻结结论
当前工程里,正式业务使用的 /generated-* 静态资源前缀固定为以下 6 个:
| 前缀 | 当前状态 | 当前主要生产链路 | 当前典型路径模板 | 重写后兼容要求 |
|---|---|---|---|---|
/generated-character-drafts/* |
正式前缀 | 角色主形象草稿、动作草稿、导入参考素材 | /generated-character-drafts/{characterId}/{kind}/{jobId}/{file} |
必须保留 |
/generated-characters/* |
正式前缀 | 角色主形象正式发布、Agent 自动角色图回填 | /generated-characters/{characterId}/visual/{assetId}/{file} |
必须保留 |
/generated-animations/* |
正式前缀 | 角色基础动作正式发布 | /generated-animations/{characterId}/{animationSetId}/{action}/{file} |
必须保留 |
/generated-custom-world-scenes/* |
正式前缀 | 世界场景图生成、Agent 自动场景图回填 | /generated-custom-world-scenes/{world}/{landmarkOrAct}/{assetId}/{file} |
必须保留 |
/generated-custom-world-covers/* |
正式前缀 | 世界封面图生成、封面上传 | /generated-custom-world-covers/{world}/{assetId}/{file} |
必须保留 |
/generated-qwen-sprites/* |
正式前缀 | Qwen 主图草稿、精灵表草稿、修帧草稿、最终保存 | /generated-qwen-sprites/{assetKeyOrDraftScope}/{actionOrKind}/{assetId}/{file} |
必须保留 |
额外结论:
- 当前仓库里真实业务前缀是
6个,不是4个也不是5个。 - 其中
generated-animations与generated-custom-world-covers是当前代码已正式使用、但早期重写设计里容易漏掉的两个前缀。 - 当前
public/目录下已存在:generated-character-draftsgenerated-charactersgenerated-qwen-sprites
generated-animations、generated-custom-world-scenes、generated-custom-world-covers当前按需惰性创建,不代表它们不是正式前缀。
3. 正式前缀清单
3.1 /generated-character-drafts/*
当前用途:
- 角色主形象候选图草稿。
- 角色动作草稿帧、草稿视频、导入参考素材。
- 角色资产工作流缓存与任务记录。
当前主要生产链路:
POST /api/assets/character-visual/generatePOST /api/assets/character-animation/generatePOST /api/assets/character-animation/import-videoPOST /api/assets/character-workflow-cache
当前典型路径模板:
/generated-character-drafts/{characterId}/visual/{jobId}/candidate-01.png/generated-character-drafts/{characterId}/animation/{action}/{jobId}/preview.mp4/generated-character-drafts/{characterId}/animation/{action}/{jobId}/frame-01.png/generated-character-drafts/{characterId}-{cacheKey}/workflow-cache.json
冻结要求:
- 它是“草稿态真相路径”,不是正式发布路径。
- 重写为 OSS 后仍要保留这一层 HTTP 兼容前缀,哪怕底层已不是本地磁盘。
3.2 /generated-characters/*
当前用途:
- 角色主形象正式发布路径。
- Custom World Agent 自动回填的角色主图。
当前主要生产链路:
POST /api/assets/character-visual/publishcustomWorldAgentAutoAssetService
当前典型路径模板:
/generated-characters/{characterId}/visual/{assetId}/master.png/generated-characters/{characterId}/visual/{assetId}/preview-01.png
冻结要求:
- 它是角色正式视觉资产前缀,不允许与草稿前缀混用。
- 后续即使内部改成 OSS,也必须继续对前端暴露这一前缀。
3.3 /generated-animations/*
当前用途:
- 角色基础动作正式发布路径。
CharacterAnimator侧消费的核心动画资源前缀。
当前主要生产链路:
POST /api/assets/character-animation/publish
当前典型路径模板:
/generated-animations/{characterId}/{animationSetId}/{action}/frame-01.png/generated-animations/{characterId}/{animationSetId}/{action}/preview.mp4/generated-animations/{characterId}/{animationSetId}/{action}/manifest.json
冻结要求:
- 当前正式动画并不挂在
/generated-characters/.../animation/...下,而是独立前缀/generated-animations/*。 - 后续重写若想合并对象键,也必须先做兼容别名,不能直接改掉公开路径。
3.4 /generated-custom-world-scenes/*
当前用途:
- 自定义世界场景图生成结果。
- Agent 自动生成的场景图回填结果。
当前主要生产链路:
POST /api/custom-world/scene-imagecustomWorldAgentAutoAssetService
当前典型路径模板:
/generated-custom-world-scenes/{worldSegment}/{landmarkSegment}/{assetId}/scene.png/generated-custom-world-scenes/{sceneSegment}/{actSegment}/{assetId}/scene.png
冻结要求:
- 前缀里当前显式带
custom-world-scenes,不是通用generated-scenes。 - 后续世界资料库、世界编辑器和 Agent 卡片仍会依赖这一命名习惯。
3.5 /generated-custom-world-covers/*
当前用途:
- 自定义世界封面图生成结果。
- 自定义世界封面图上传后规范化结果。
当前主要生产链路:
POST /api/custom-world/cover-imagePOST /api/custom-world/cover-upload
当前典型路径模板:
/generated-custom-world-covers/{worldSegment}/{assetId}/cover.png/generated-custom-world-covers/{worldSegment}/{assetId}/manifest.json
冻结要求:
- 当前正式前缀是
/generated-custom-world-covers/*,不是/generated-cover-images/*。 - 后续重写设计和 OSS key 规划必须以这个现状兼容面为准。
3.6 /generated-qwen-sprites/*
当前用途:
- Qwen 精灵主图草稿。
- Qwen 精灵表草稿。
- Qwen 修帧草稿。
- Qwen 精灵表最终保存结果。
当前主要生产链路:
POST /api/assets/qwen-sprite/masterPOST /api/assets/qwen-sprite/sheetPOST /api/assets/qwen-sprite/frame-repairPOST /api/assets/qwen-sprite/save
当前典型路径模板:
/generated-qwen-sprites/_drafts/master/{draftId}/candidate-01.png/generated-qwen-sprites/_drafts/sheet/{draftId}/candidate-01.png/generated-qwen-sprites/_drafts/repair/{draftId}/candidate-01.png/generated-qwen-sprites/{assetKey}/{actionKey}/{assetId}/sheet.png
冻结要求:
- 这个前缀当前既承载草稿,也承载正式保存结果。
- 如果未来要把草稿与正式对象拆桶,也必须先保留同一公开前缀兼容。
4. 非正式前缀与噪音项
以下命名当前不能当成“正式兼容前缀”:
| 名称 | 当前来源 | 处理结论 |
|---|---|---|
/generated-cover-images/* |
仅出现在重写设计文档旧草案里 | 这是未来提案名,不是当前工程真实前缀。 |
/generated-role* |
测试数据或示例 ID | 不是正式静态资源前缀。 |
/generated-world* |
测试数据或对象 ID | 不是正式静态资源前缀。 |
/generated-ruins* |
测试数据或对象 ID | 不是正式静态资源前缀。 |
结论:
- 后续做 Axum 静态资源兼容层时,只能以第 2 节和第 3 节里的
6个前缀为正式基线。 - 不能把测试里的字符串误判成真实资源入口。
5. 与重写设计的对齐要求
为避免后续按错路径重写,当前冻结以下对齐规则:
- Axum 第一阶段必须兼容这
6个公开资源前缀。 - OSS 内部对象键可以调整,但对前端暴露的 URL 前缀不能少于这
6个。 - 设计文档里的对象键规划如果与这份基线冲突,以这份“当前工程冻结基线”为准,然后再在设计文档中补兼容说明。
6. 本轮冻结后的硬约束
后续迁移中,不允许出现以下情况:
- 把
/generated-animations/*直接并入/generated-characters/*却不保留兼容别名。 - 把
/generated-custom-world-covers/*擅自改成/generated-cover-images/*。 - 在未做兼容层前,删除
/generated-character-drafts/*或/generated-qwen-sprites/*的草稿访问习惯。 - 仅因为某个目录在当前仓库里尚未生成,就把它从正式前缀清单里删掉。
7. 本任务完成定义
当以下条件成立时,这条任务视为完成:
- 当前正式
/generated-*前缀已经有书面冻结清单。 - 每个前缀都已明确:
- 当前用途
- 当前生产链路
- 当前路径模板
- 后续兼容要求
- 已明确哪些“generated-*”字符串只是噪音,不属于正式前缀。
8. 后续直接依赖这份基线的任务
- 设计 Axum 静态资源兼容层
- 设计 OSS 对象键与 CDN 别名
- 做 assets / custom world / editor 的路径回归测试