11 KiB
11 KiB
M6:assets / 阿里云 OSS 任务清单
说明:
editor已于2026-04-21被确认为遗留无用模块,不再纳入本轮 Rust 后端重写范围。- 本文件保留原文件名仅用于延续既有任务编号与链接,不再继续安排 editor 迁移项。
1. OSS 基础设施
- 创建 OSS bucket 方案
- 设计对象键前缀
- 设计
object_key -> cdn_url解析策略 - 设计 public / private 对象访问策略
- 设计签名 URL 输出策略
- 设计
x-oss-meta-*元数据规范 - 设计内容 hash / 版本字段规范(Stage 1 明确为
asset_object.content_hash: Option<String>+version = 1,后续强 hash 单独阶段再扩)
2. 上传与对象确认
- 实现浏览器
PostObject直传签名接口 - 实现 STS 临时授权接口
- 实现服务端上传 helper
- 实现上传完成后的对象确认接口
- 实现对象绑定业务实体 reducer
补充说明:
- 自
2026-04-21起,当前重写节奏允许在M3/M4/M5之前先前置落地M6的 OSS 基础设施。 - 当前已在
server-rs/crates/platform-oss与server-rs/crates/api-server落下最小可用链路:PostObject直传签名能力/api/assets/direct-upload-tickets/api/assets/objects/confirm- 兼容旧
/generated-*前缀的对象键规划 .env/.env.local的 OSS 环境变量加载- 服务端
HEAD Object校验 asset_object确认真实 SpacetimeDB 持久化/api/assets/objects/bindasset_entity_binding业务实体槽位绑定/api/assets/sts-upload-credentials禁用式 contract- 服务端
PutObject上传 helper
- 当前 bucket 已明确为私有读写;后续正式存储口径改为
bucket + object_key双列,不再把匿名公开 URL 当成真相。 - 当前 STS 接口按“服务器上传、Web 只下载”的需求固定为
403禁用式 contract,不向浏览器下发 OSS 写权限。 2026-04-21已通过 live test 验证:真实 OSS 上传后,/api/assets/objects/confirm能把xushi-dev + object_key写入本地genarrative-dev.asset_object,并可继续通过/api/assets/objects/bind绑定到业务实体槽位。
3. 资产任务系统
- 设计
asset_job(Stage 1 明确不新增重复表,AI 资产任务先复用AiTaskService / ai_task口径) - 设计
asset_object - 设计
asset_manifest(Stage 1 使用 OSS JSON manifest +asset_object表达集合对象,不新增结构化表) - 设计
character_visual_asset(Stage 1 使用asset_entity_binding: character / primary_visual,强业务表延后) - 设计
character_animation_asset(Stage 1 使用asset_entity_binding: character / animation_set绑定总 manifest,强业务表延后) - 设计
scene_image_asset(Stage 1 使用asset_entity_binding: custom_world_landmark / scene_image,强业务表延后) - 设计
sprite_sheet_asset(Qwen 独立工具已清理,Stage 1 仅保留历史/generated-qwen-sprites/*读取兼容)
补充说明:
asset_object当前已冻结核心存储口径为:bucketobject_key
- 详细设计见:
- 当前已在
server-rs/crates/spacetime-module落下asset_object首版表骨架,并完成api-server -> SpacetimeDB的最小对象确认闭环。 - 元数据、版本、manifest 与强业务资产表边界见:
4. 资产生成链路
- 迁移角色主形象生成(Stage 1 已接通 Rust
generate / jobs / publish最小 OSS 主链,当前仍为 SVG 占位生成,不代表真实 DashScope 图片模型已迁完) - 迁移角色动作生成(Stage 1 已接通 Rust
generate / jobs / publish最小 OSS 主链,当前image-sequence为 SVG 占位帧,视频类策略优先复用参考视频或仓库占位预览,不代表真实视频模型已迁完) - 迁移动作模板查询(Stage 1 已接通 Rust 内置模板列表兼容接口)
- 迁移视频导入(Stage 1 已接通 Data URL 视频导入到 OSS 草稿区,不再写本地
public/) - 迁移工作流缓存(Stage 1 已接通 Rust
GET/POST character-workflow-cache到 OSS JSON 草稿对象,不再写本地public/) - 迁移场景图生成(已完成 Stage 2:custom world
scene-image走真实 DashScope 图片生成,并继续写入OSS + asset_object + asset_entity_binding) - 迁移封面图上传(已完成 Stage 2:custom world
cover-image / cover-upload已补齐真实 DashScope 生成与cropRect + 16:9 + WebP 压缩) - 首批收口 custom world
scene-image / cover-image / cover-upload到正式OSS + asset_object + asset_entity_binding主链(保持旧/generated-*返回 contract,不再写仓库public/)
补充说明:
- custom world 兼容图片入口现已完成 Stage 1 + Stage 2:正式资产真相链、真实 DashScope 图片生成,以及封面上传裁剪压缩都已迁完。
- 详细边界见:
- 角色动作模板与视频导入第一批已新增独立设计文档,当前只迁移:
GET /api/assets/character-animation/templatesPOST /api/assets/character-animation/import-video- ../docs/technical/M6_CHARACTER_ANIMATION_IMPORT_AND_TEMPLATE_STAGE1_2026-04-22.md
- 角色资产工作流缓存第一批已新增独立设计文档,当前把旧本地
workflow-cache.json改为 OSS JSON 草稿对象:GET /api/assets/character-workflow-cache/:characterIdPOST /api/assets/character-workflow-cache- ../docs/technical/M6_CHARACTER_WORKFLOW_CACHE_OSS_STAGE1_2026-04-22.md
2026-04-22复核确认:旧独立qwen-sprite-tool + qwenSpriteRoutes.ts已在2026-04-21清理,不再作为本轮现役迁移主链;当前仍保留的Qwen相关内容仅包括:- 角色资产 prompt 层对
packages/shared/src/prompts/qwenSprite.ts的复用 - 历史资源前缀
/generated-qwen-sprites/*的读取兼容
- 角色资产 prompt 层对
- custom world 图片链 Stage 2 已完成:
scene-image / cover-image已替换为真实 DashScope 图片生成cover-upload已补回 Node 旧链路中的cropRect + 16:9 + WebP 压缩- 详细口径与验证结果见 ../docs/technical/M6_CUSTOM_WORLD_ASSET_OSS_INTEGRATION_STAGE2_2026-04-22.md
5. 路径兼容
- 兼容
/generated-character-drafts/* - 兼容
/generated-characters/* - 兼容
/generated-animations/* - 兼容
/generated-custom-world-scenes/* - 兼容
/generated-custom-world-covers/* - 兼容
/generated-qwen-sprites/*
补充说明:
- 第一批路径兼容由 Rust
api-server同源代理到私有 OSS 短期读签名,不回退本地public/,详细边界见: - 当前 Stage 1 先全量代理对象内容,不实现视频 Range 分片;若后续真实视频体积变大,再按播放器需求补 Range。
6. 兼容接口
- 兼容
/api/assets/character-visual/generate - 兼容
/api/assets/character-visual/jobs/:taskId - 兼容
/api/assets/character-visual/publish - 兼容
/api/assets/character-animation/generate - 兼容
/api/assets/character-animation/jobs/:taskId - 兼容
/api/assets/character-animation/publish - 兼容
/api/assets/character-animation/import-video - 兼容
/api/assets/character-animation/templates - 兼容
/api/assets/character-workflow-cache - 兼容
/api/assets/character-workflow-cache/:characterId
7. 阶段验收
- OSS 直传对象可被服务端确认并写入
asset_object - 所有新生成资产都写入 OSS(Stage 1 覆盖当前现役角色主形象、角色动作、workflow cache、视频导入、custom world 场景图/封面图;历史清理掉的 Qwen 独立工具不再计入现役主链)
- 前端仍能通过旧路径习惯访问资源(Stage 1 通过 Rust 同源代理私有 OSS 对象,开发期 Vite 代理已覆盖现役 generated 前缀)
- 资产任务状态可查询(角色主形象与角色动作已通过
jobs/:taskId复用AiTaskService;同步上传/确认链路以接口返回结果为状态) - 已确认对象可绑定到业务实体槽位
补充说明:
- custom world 的
scene-image / cover-image / cover-upload已在本轮切到正式 OSS 对象与绑定主链。 - 角色主形象第一批已新增独立设计文档与 Rust 最小闭环:
- 当前角色主形象
generate先用 Rust SVG 占位生成打通task + OSS drafts + publish + asset_object + asset_entity_binding主链,后续再替换成真实图片模型。 - 角色动作模板与视频导入第一批已接入 Rust:
templates返回旧内置模板 contract。import-video当前只接受data:video/*;base64,...,并写入 OSSgenerated-character-drafts/*草稿区。
- 角色资产工作流缓存第一批已接入 Rust:
- 保存时写入 OSS
generated-character-drafts/{character}/workflow-cache/workflow-cache.json。 - 读取时未命中返回
cache: null,保持旧前端 contract。
- 保存时写入 OSS
- 角色动作第一批已接入 Rust:
generate直接写入 OSSgenerated-character-drafts/*。jobs/:taskId从AiTaskService派生旧任务状态 contract。publish会把动作帧与总 manifest 写入 OSSgenerated-animations/*,并确认asset_object + asset_entity_binding。
- custom world 场景图、封面图、封面上传已在
M6_CUSTOM_WORLD_ASSET_OSS_INTEGRATION_STAGE1_2026-04-22.md+M6_CUSTOM_WORLD_ASSET_OSS_INTEGRATION_STAGE2_2026-04-22.md范围内完成正式OSS + asset_object + asset_entity_binding主链、真实 DashScope 图片生成和封面上传裁剪压缩。 content_hash/version、asset_job、asset_manifest与强业务资产表当前已冻结 Stage 1 边界,不再作为 M6 第一批工程阻塞项;后续若要做内容去重、manifest 查询、审核/回滚或 sprite sheet 强结构化,再进入独立阶段。