# RPG 创作 profile 生成后端迁移(2026-04-28) ## 1. 背景 `docs/audits/engineering/RPG_FRONTEND_SCRIPT_BACKEND_MIGRATION_AUDIT_2026-04-28.md` 的 5.3 指出,`src/services/rpg-creation/rpgCreationGenerationClient.ts` 在非浏览器环境仍会动态 `import('../ai')`,让 RPG 创作 profile 生成继续保留前端 legacy AI 后门。 这与当前边界冲突: 1. 前端只负责表现和 API client。 2. RPG 创作 prompt 与 LLM 编排只能在 `server-rs/crates/api-server/src/prompt/rpg/` 与 `api-server` 侧出现。 3. 外部 LLM 调用不能进入 SpacetimeDB reducer,必须由 Axum / `platform-llm` 完成后再把确定结果交给后续持久化链。 ## 2. 本轮落地 ### 2.1 前端 `src/services/rpg-creation/rpgCreationGenerationClient.ts` 现在不再判断 `typeof window`,也不再动态导入 `src/services/ai.ts`。 无论浏览器、SSR 还是 Vitest node 环境,`generateRpgWorldProfile(...)` 都只调用: ```text POST /api/runtime/custom-world/profile ``` 测试如需离线运行,应 mock `requestJson`,不能恢复本地 AI 生成链。 ### 2.2 后端 `server-rs/crates/api-server/src/app.rs` 新增: ```text POST /api/runtime/custom-world/profile ``` handler 落在 `server-rs/crates/api-server/src/custom_world.rs`: 1. 校验 `settingText`。 2. 要求 Bearer 鉴权。 3. 要求 `platform-llm` 可用。 4. 复用 `generate_custom_world_foundation_draft(...)` 生成 profile 草稿。 5. 补齐结果页需要的 `id / settingText / templateWorldType / compatibilityTemplateWorldType / items / generationMode / generationStatus / creatorIntent`。 6. 直接返回 `CustomWorldProfile` JSON,保持前端旧 client contract 不变。 本轮不新增 SpacetimeDB 表,不修改 `migration.rs`。 ## 3. 验收 1. `src/services/rpg-creation/**` 不再出现 `import('../ai')`、`LegacyAiModule`、`loadLegacyAiModule`。 2. `src/services/rpg-creation/index.ts` 不再导出 `generateLegacyCustomWorldProfile`。 3. node 环境测试确认 profile 生成只走 `requestJson` mock。 4. Rust `api-server` 测试确认 `/api/runtime/custom-world/profile` 未登录返回 `401`。