Skip to content

生成任务完成后产物未写入 character_data(绕过前端直接调 API 时资产树为空) #123

Description

@johnnyzhang-eng

现象

生成任务跑到 completed、产物齐全,但角色的资产树里什么都没有

2026-08-05 在一台已部署的实例上实测(真实后端 + 真实对象存储):

  1. POST /generation/actionaction_type: walk, num_frames: 16
  2. 轮询到 status: completedresult.frames16 帧index 0–15 连续,每帧 image_url 均可公网访问、duration_ms: 125
  3. 紧接着 GET /characters/{id}character_data.outfits[0].actions 长度为 0

也就是说:产物只活在 task.result 里,没有进入角色资产树。

为什么值得单独提

前端的 quick-start 流程里第 5 步是「保存」,由前端在任务完成后自己写回 character_data。所以走完整前端流程时看起来是正常的——只有绕过前端直接调 API 才暴露

这带来两个后果:

  1. 契约上"生成完成"与"成为资产"是两件事,但接口层没有任何地方写明这一点。任何第三方(另一个前端、脚本、将来的 Agent / MCP 调用方)按"任务完成即资产入库"的直觉来用,都会拿到一个空资产树,且不报错。
  2. 与产品主张有张力。项目策划案(Windup 产品策划案:面向国产小游戏的 2D 角色素材生成资产工作台 #37)反复强调「交付的是资产,而不是图片」,而当前实现里,让产物成为资产的那一步落在前端,后端只负责产出。前端崩了、网络断了、用户关掉页面,产物就停在 task.result 里,角色资产树永远缺这个动作。

需要确认的是设计意图

不预设这是 bug——有可能是有意为之(例如"生成结果需用户确认后才入库",配合产物审核与节点回退)。若是,建议:

  • 在生成接口的响应或文档里明写"产物不自动入库,需调用方确认后写入";
  • 并给出确认入库的接口,而不是让每个调用方自己拼 character_data 整树再 PATCH 回去(现在前端就是这么做的,整树替换在并发下会互相覆盖)。

若不是有意为之,那么在任务转 completed 时由后端写入 character_data 更符合"交付资产"的定位,也能顺带解决并发覆盖。

顺带的一处观察

同一轮实测里,POST /characters 携带 name 字段返回 200 但落库为 null(需要再 PATCH 一次才写得进去)。这条已在 #75 的评审里单独报过,不在本 Issue 展开。

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionFurther information is requested

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions