3.9 KiB
Agent 草稿编译后重复生成草稿修复 2026-04-23
更新时间:2026-04-23
1. 问题现象
当前创作链里,用户打开一个已有 Agent 草稿,继续编辑并触发结果页编译或自动保存后,作品库里会新增一份 draft,而不是更新原来的那一份。
这会带来两个直接问题:
- 同一个会话在作品库里出现多份草稿
- 原草稿状态没有被正确推进,导致发布、恢复、继续创作都可能命中旧条目
2. 根因拆解
本次问题不是单点,而是两段身份链没有收口到同一套规则:
2.1 sync_result_profile 会直接覆盖 session 里的 draft_profile_json.id
当前 sync_result_profile 会把结果页传回来的 profile 直接写回 draft_profile_json。
如果结果页上的 profile.id 已经不是原草稿 id,那么:
- session 主链中的
draft_profile_json.id会被改成新 id resultPreview.preview.id也会跟着变成新 id- 前端 autosave 会拿着这个新 id 去调作品库
PUT /custom-world-library/:profileId
2.2 作品库 upsert 只按 profile_id 命中,不按 source_agent_session_id 兜底
当前作品库落库路径:
结果页 autosave -> PUT /custom-world-library/:profileId -> upsert_custom_world_profile_record
其中普通 autosave 路径此前存在两个问题:
- 前端没有透传
sourceAgentSessionId - 后端普通 upsert 只按
(owner_user_id, profile_id)查旧记录
所以一旦 profile.id 漂移,后端就会把它当作一条新的 draft 插入。
3. 修复目标
本轮修复要求同时满足下面两条:
- Agent 草稿结果页继续编辑时,必须优先继承当前 session 已有的稳定
profileId - 即使前端传来的
profile.id已经漂移,作品库 upsert 也要能按source_agent_session_id命中同一份 draft 并更新
4. 本轮落地策略
4.1 session 主链侧:稳定保留草稿 id
在 sync_result_profile 中,若当前 session 已经存在草稿身份:
- 优先读取
draft_profile_json.legacyResultProfile.id - 其次读取
draft_profile_json.id - 若命中稳定 id,则把传入 profile 的:
- 顶层
id legacyResultProfile.id都强制回写为这个稳定 id
- 顶层
这样可以保证:
draft_profile_json.id不会被结果页里的漂移 id 覆盖resultPreview.preview.id会持续稳定- 前端后续 autosave 会继续更新原草稿
4.2 作品库保存侧:透传 sourceAgentSessionId
前端 upsertRpgWorldProfile(...) 新增可选参数:
sourceAgentSessionId?: string | null
结果页属于 Agent 草稿视图时,autosave 会把 activeAgentSessionId 一并传给作品库接口。
4.3 后端 upsert 侧:按 session 命中旧 draft
普通作品库 PUT /custom-world-library/:profileId 接口新增读取 sourceAgentSessionId。
Spacetime upsert_custom_world_profile_record(...) 在按 profile_id 未命中时,新增二级兜底:
owner_user_id相同publication_status == draftdeleted_at == Nonesource_agent_session_id == input.source_agent_session_id
若命中这条旧 draft:
- 删除旧 row
- 使用旧 row 的
profile_id - 更新 payload / metadata / updated_at
这样即使前端 path 参数已经是新 id,也仍然会命中原草稿并更新,而不是再插入第二份草稿。
5. 验收标准
修复后应满足:
- 打开已有 Agent draft 后继续编译,不会新增第二份 draft
- 原 draft 的
profileId保持不变 resultPreview.preview.id与作品库profileId一致- 自动保存、继续创作、进入世界、发布前检查都围绕同一份草稿身份工作
6. 结论
这次问题的本质不是“自动保存重复调用”,而是:
Agent 草稿在 session 主链和作品库 upsert 两端都缺少稳定身份约束。
本轮通过“session 保 id + 作品库按 session 兜底命中”双保险,把同一份草稿重新收口为单一身份。