1
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
# RPG 运行时直读世界草稿 Profile 检查 2026-04-25
|
||||
|
||||
## 结论
|
||||
|
||||
RPG 运行时进入游戏时不应再通过 `resultPreview.preview` 或 legacy runtime profile 做中间转换,主数据源统一为 Agent session 的 `draftProfile`。
|
||||
|
||||
本次检查确认:
|
||||
|
||||
1. Rust 侧 `custom_world_foundation_draft` 已直接产出 `draftProfile`。
|
||||
2. 前端原先 `buildCustomWorldProfileFromAgentSession()` 仍只读取 `session.resultPreview.preview`,这会绕过草稿 profile 中已经存在的角色形象、关系、压力等字段。
|
||||
3. 角色选择页与游戏内角色本身可以消费 `CustomWorldProfile.playableNpcs[].imageSrc`,断点在“session -> profile”的入口,而不是角色选择页。
|
||||
4. “进入世界”按钮原先还会先执行 `sync_result_profile`,把当前结果页旧快照再同步回 session;如果结果页 profile 没有最新角色图,会在进入角色选择页前覆盖掉 `draftProfile` 中的正确形象。
|
||||
|
||||
## 已修正
|
||||
|
||||
- `buildCustomWorldProfileFromAgentSession()` 改为直接归一化 `session.draftProfile`。
|
||||
- `resultPreview` 只保留为发布质量、blocker、预览外壳信息,不再作为进入游戏 profile 的数据源。
|
||||
- Agent 草稿结果进入游戏时直接使用最新 `agentSessionProfile`,不再把当前结果页 profile 回写成新的运行时 profile。
|
||||
- 前端 `normalizeCustomWorldProfileRecord()` 补齐 rs 草稿角色字段兼容:
|
||||
- `publicMask/publicIdentity` -> `description/visualDescription/personality` fallback
|
||||
- `currentPressure/hiddenHook` -> `backstory/actionDescription/sceneVisualDescription` fallback
|
||||
- `relationToPlayer` -> `motivation/relationshipHooks` fallback
|
||||
- `imageSrc/generatedVisualAssetId/generatedAnimationSetId/animationMap` 保持直通
|
||||
|
||||
## 后续约束
|
||||
|
||||
- 新 RPG 运行时链路只允许读取 `draftProfile`。
|
||||
- 不再为进入游戏构造额外 legacy profile,也不再把 `resultPreview.preview` 当作运行时真相源。
|
||||
- 如果草稿中新增角色、场景、物品字段,应优先扩展 `draftProfile` 的归一化读取,而不是增加中间转换结构。
|
||||
@@ -197,3 +197,8 @@
|
||||
|
||||
这一轮最关键的经验是:
|
||||
**游戏 UI 的移动端优化,本质不是把元素缩小,而是重组视觉重心、固定操作锚点、让焦点内容在一屏内自然成立。**
|
||||
|
||||
### 10.1 可扮演角色形象预览保持 1:1
|
||||
- 可扮演角色的形象预览容器统一使用 1:1 方形,入口选择轮播、角色资产工坊和结果页角色卡片都不能用纵向长卡片去拉伸预览图。
|
||||
- 预览图片本身使用 `object-contain`,保证 AI 生成主形象、模板像素角色和运行时动画都在方形容器内完整显示,不裁切角色主体。
|
||||
- 卡片可以在方形预览下方放角色名、称号、状态等信息,但这些文本区不能反向影响预览区比例。
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
# 可扮演角色外观模板字段删除经验
|
||||
|
||||
## 背景
|
||||
|
||||
可扮演角色曾通过 `templateCharacterId` 保存“外观模板”选择。当前角色主形象已经由 `visualDescription`、`imageSrc` 与生成资产链路承接,外观模板不应继续作为可扮演角色档案字段暴露给用户编辑或持久化。
|
||||
|
||||
## 落地边界
|
||||
|
||||
- 可扮演角色数据结构不再声明 `templateCharacterId`。
|
||||
- 可扮演角色编辑面板删除“外观模板”下拉项,保存时不再补默认模板。
|
||||
- 草稿规范化与资料库读取时丢弃旧数据中的 `templateCharacterId`,避免旧快照把字段带回新数据。
|
||||
- 运行时如需要基础动作、默认立绘或战斗标签,只能通过角色文本、参考 profile 或固定 fallback 规则临时推导模板,不再写回角色字段。
|
||||
- 资产工坊可以继续接收运行时临时模板提示,但该提示不得成为可扮演角色的持久字段。
|
||||
|
||||
## 验收要点
|
||||
|
||||
- 新建或编辑可扮演角色时界面不出现“外观模板”。
|
||||
- 保存后的 `playableNpcs` 条目不包含 `templateCharacterId`。
|
||||
- 旧存档带有 `templateCharacterId` 时,进入当前规范化链路后会被丢弃。
|
||||
- 自定义世界运行角色仍能通过推导模板获得基础动作与默认占位图,不因字段删除而中断。
|
||||
@@ -26,6 +26,7 @@ RPG 草稿生成进入底稿素材阶段后,角色主形象与场景幕背景
|
||||
- 幕背景图失败文案必须带第几章、第几幕和幕标题,不能只显示“第1幕 / 第2幕 / 第3幕”,否则多章节同名幕会被用户误认为同一失败项重复上报。
|
||||
- 中止或部分失败前必须持久化已经成功生成的部分底稿到会话 `draftProfile`,不能因为某个角色或某一幕失败而丢掉其它已生成的 `imageSrc / generatedVisualAssetId / backgroundImageSrc / backgroundAssetId`。
|
||||
- 每一幕自动生图必须记录 operation、session、第几章、第几幕、sceneId、sceneName、attempt、elapsedMs 与供应商真实错误,避免再次出现只看到“生成幕背景图失败”但无法定位哪张图、哪次请求、哪个上游原因的问题。
|
||||
- 前端看到 `draft_foundation` operation completed 后,不能只延迟一次就读取 `resultPreview`;SpacetimeDB 写入、API 读模型和前端状态同步之间可能有短暂时差,必须短轮询等待结果页 profile 可用后再自动跳转到草稿页,避免卡在“底稿已整理”。
|
||||
- 前端 `CharacterAnimator` 对带 `generatedVisualAssetId` 但尚无 `animationMap` 的自定义角色,所有状态优先渲染生成主图;只有真正发布了动作集后才按动作帧播放,避免运行或战斗状态回落到模板 sprite。
|
||||
|
||||
## 后续注意
|
||||
@@ -34,3 +35,12 @@ RPG 草稿生成进入底稿素材阶段后,角色主形象与场景幕背景
|
||||
|
||||
|
||||
|
||||
|
||||
## 2026-04-25 补充:开局场景也必须逐幕生成背景图
|
||||
|
||||
本次排查发现旧草稿合成只从 `landmarks` 编译 `sceneChapterBlueprints`,导致 `camp` 开局场景只有 `camp.imageSrc`,没有进入 `sceneChapterBlueprints[*].acts[*]` 的幕背景生成队列。后续实现必须遵守:
|
||||
|
||||
1. `camp` 开局场景必须作为 `sceneChapterBlueprints[0]` 写入,`sceneId` 默认使用 `camp.id`,缺失时使用 `camp-1`。
|
||||
2. `camp.actBackgroundPromptTexts` 必须包含 3 条逐幕画面描述,并和普通场景一样生成 `acts[*].backgroundImageSrc`。
|
||||
3. 结果页场景目录可用场景图兜底展示旧草稿的幕缩略图,但新草稿不能只依赖兜底,必须让开局场景真实进入幕背景图生成链路。
|
||||
4. 手动同步场景资产时,必须同时更新 `sceneChapterBlueprints` 与兼容字段 `sceneChapters`,当前主链以 `sceneChapterBlueprints` 为准。
|
||||
|
||||
@@ -95,3 +95,28 @@ Rust 首版返回:
|
||||
4. `Upstream(status=429)` -> `429 TOO_MANY_REQUESTS`
|
||||
5. 其他 `Upstream` -> `502 BAD_GATEWAY`
|
||||
6. `stream=true` 首版直接返回 `501 NOT_IMPLEMENTED`
|
||||
|
||||
## 8. 角色扮演模型联网搜索补充(2026-04-25)
|
||||
|
||||
### 8.1 目标
|
||||
|
||||
角色扮演运行时调用文本模型生成剧情正文、NPC 对话、战斗演出文本时,需要默认允许模型使用上游联网搜索能力,提升现实题材、时代背景、地名器物、文化细节的准确度。
|
||||
|
||||
### 8.2 落地范围
|
||||
|
||||
1. `platform-llm` 的 `LlmTextRequest` 增加 `enable_web_search` 布尔开关,默认 `false`,避免影响普通平台代理和非剧情调用。
|
||||
2. `api-server` 配置增加 `GENARRATIVE_RPG_LLM_WEB_SEARCH_ENABLED` / `RPG_LLM_WEB_SEARCH_ENABLED`,默认 `true`。
|
||||
3. 仅 `runtime_story` 兼容链路中的角色扮演剧情文本请求按配置开启联网搜索。
|
||||
4. `/api/llm/chat/completions` 通用代理不默认开启联网搜索,避免外部调用方在无感情况下产生额外成本或不可预期内容来源。
|
||||
|
||||
### 8.3 上游请求口径
|
||||
|
||||
1. 当前默认文本模型走火山方舟 OpenAI 兼容 Chat Completions 路由。
|
||||
2. 联网搜索开启时,请求体追加 `web_search_options: {}`;关闭时不序列化该字段。
|
||||
3. 若后续迁移到 Responses API 或更换 provider,由 `platform-llm` 统一收口字段映射,业务层仍只使用 `enable_web_search` 语义开关。
|
||||
|
||||
### 8.4 验收
|
||||
|
||||
1. `platform-llm` 单测能捕获开启搜索时上游 JSON 包含 `web_search_options`。
|
||||
2. `api-server` 配置单测能验证角色扮演搜索开关默认开启、环境变量可关闭。
|
||||
3. 角色扮演剧情、NPC 对话、推理战斗文本请求都通过同一辅助函数设置搜索开关,避免漏接。
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
# 自定义世界草稿场景幕事件与任务字段落地设计(2026-04-25)
|
||||
|
||||
## 背景
|
||||
|
||||
自定义世界 Agent 生成第一版草稿时,已经会为 `sceneChapterBlueprints[*].acts[*]` 生成逐幕背景图描述,并为场景写入基础描述、出场角色等信息。后续运行时需要更稳定的章节任务上下文,因此草稿阶段必须同时生成:
|
||||
|
||||
1. 每一幕的对面角色。
|
||||
2. 每一幕的事件描述。
|
||||
3. 每个场景的场景任务描述。
|
||||
|
||||
## 字段契约
|
||||
|
||||
### SceneActBlueprint
|
||||
|
||||
新增字段:
|
||||
|
||||
- `oppositeNpcId: string`
|
||||
- 当前幕“对面的角色”,优先使用该场景 `sceneNpcNames` / `encounterNpcIds` 的第一个角色。
|
||||
- 若当前场景暂未绑定角色,使用空字符串,不在草稿合成阶段伪造角色 ID。
|
||||
- `eventDescription: string`
|
||||
- 描述当前幕正在发生的事件。
|
||||
- 必须强绑定 `oppositeNpcId` / `primaryNpcId` 所指角色,写清该角色的行动、阻碍、试探、求助或冲突。
|
||||
- 默认生成兜底规则:`第N幕中,玩家在当前场景遭遇/处理与某角色直接相关的事件,并推动当前场景问题升级或转向。`
|
||||
|
||||
兼容字段:
|
||||
|
||||
- `primaryNpcId` 继续保留,默认等于 `oppositeNpcId`,避免旧运行时代码读取不到主角色。
|
||||
- `encounterNpcIds` 继续保留,至少承载当前场景可出场角色名称/ID。
|
||||
|
||||
### SceneChapterBlueprint
|
||||
|
||||
新增字段:
|
||||
|
||||
- `sceneTaskDescription: string`
|
||||
- 当前场景的核心任务描述。
|
||||
- 文本会作为游戏中首次进入某个场景生成章节任务的关键上下文。
|
||||
- 必须结合场景描述、场景入口钩子、出场角色与 3 幕事件,说明玩家首次进入该场景时要完成什么。
|
||||
|
||||
## 生成链路
|
||||
|
||||
1. `api-server` 的 `custom_world_foundation_draft.rs` 是第一版草稿的真实生成入口。
|
||||
2. LLM 提示词需要要求:
|
||||
- `camp.sceneTaskDescription` 默认生成开局场景核心任务。
|
||||
- `landmarks[*].sceneTaskDescription` 默认生成关键场景核心任务。
|
||||
- `actEventDescriptions` 恰好 3 条,对应每一幕事件。
|
||||
3. 后端合成 `sceneChapterBlueprints` 时把这些源字段落到:
|
||||
- `sceneChapterBlueprints[*].sceneTaskDescription`
|
||||
- `sceneChapterBlueprints[*].acts[*].oppositeNpcId`
|
||||
- `sceneChapterBlueprints[*].acts[*].eventDescription`
|
||||
4. 若 LLM 遗漏字段,归一化阶段用场景描述、入口钩子、角色名单生成中文默认值,保证草稿阶段字段非空。
|
||||
5. 前端类型与归一化逻辑必须允许读取这些字段,旧草稿缺字段时仍自动补默认值。
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不新增 UI 说明文案。
|
||||
- 不迁移或兼容 `server-node`。
|
||||
- 不改变现有幕背景图生成队列与资产写回链路。
|
||||
Reference in New Issue
Block a user