1
This commit is contained in:
@@ -5,6 +5,9 @@
|
||||
## 文档列表
|
||||
|
||||
- [PUZZLE_RUNTIME_FRONTEND_LOGIC_REHOME_2026-05-02.md](./PUZZLE_RUNTIME_FRONTEND_LOGIC_REHOME_2026-05-02.md):记录拼图正式平台入口移动、交换、合并、拆分和通关裁决收回前端即时运行态,排行榜、下一关和游玩记录继续由后端持久化处理。
|
||||
- [RPG_FOUNDATION_DRAFT_ROLE_DOSSIER_TIMEOUT_FALLBACK_2026-05-02.md](./RPG_FOUNDATION_DRAFT_ROLE_DOSSIER_TIMEOUT_FALLBACK_2026-05-02.md):记录 `agent-foundation-*-dossier-batch-*` 无搜索 Responses 请求超时后的本地养成档案兜底,避免底稿主链被尾部角色润色阶段阻断。
|
||||
- [RPG_IMAGE_GENERATION_GPT_IMAGE_2_MIGRATION_2026-05-02.md](./RPG_IMAGE_GENERATION_GPT_IMAGE_2_MIGRATION_2026-05-02.md):记录 RPG 角色主图与场景幕背景图统一迁移到 APIMart OpenAI 兼容 `gpt-image-2` 生图入口的边界、配置和验收口径。
|
||||
- [RPG_FOUNDATION_DRAFT_LANDMARK_SEED_BATCH_TIMEOUT_FIX_2026-05-02.md](./RPG_FOUNDATION_DRAFT_LANDMARK_SEED_BATCH_TIMEOUT_FIX_2026-05-02.md):记录 `agent-foundation-landmark-seed-batch-1` 无搜索 Responses 请求超时的根因,并将场景骨架批次收敛为单场景生成。
|
||||
- [PROFILE_MAIN_ROUTE_VITE_PROXY_FIX_2026-05-02.md](./PROFILE_MAIN_ROUTE_VITE_PROXY_FIX_2026-05-02.md):记录“我的”和“存档”页面在本地把 `/api/profile/*` 请求落到 Vite SPA fallback、导致 HTML 被当 JSON 解析的根因,以及 `/api/profile` 代理补齐与回归测试。
|
||||
- [SERVER_RS_DDD_WP_DEL_CLEANUP_2026-05-01.md](./SERVER_RS_DDD_WP_DEL_CLEANUP_2026-05-01.md):记录 `WP-DEL 删除旧层与命名收口`,物理删除旧 runtime story HTTP DTO、前端 `Rpg*` alias、旧 `/api/custom-world/*` 非 runtime 前缀、Puzzle `local-next-level` 入口和 `/generated-*` 资产直读代理;生成资产读取统一走 OSS read-url 链路。
|
||||
- [SERVER_RS_DDD_WP_API_BFF_CLOSURE_2026-05-01.md](./SERVER_RS_DDD_WP_API_BFF_CLOSURE_2026-05-01.md):记录 `WP-API api-server BFF` 收尾,补齐 `/api/llm/chat/completions` 的 `stream=true` SSE 代理,明确手机号/微信配置门控和角色动画资产占位不阻塞本次 BFF 关闭。
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
# RPG foundation draft 场景骨架批次超时修正(2026-05-02)
|
||||
|
||||
## 背景
|
||||
|
||||
现场底稿生成失败信息:
|
||||
|
||||
```text
|
||||
agent-foundation-landmark-seed-batch-1 LLM 请求失败:LLM 请求超时,累计尝试 2 次
|
||||
```
|
||||
|
||||
本次 `logs/llm-raw` 对应请求体没有 `tools` / `web_search` 字段,说明 2026-05-01 已落地的联网搜索降级并不是本次失败根因。失败发生在无搜索 Responses 请求自身超时。
|
||||
|
||||
## 根因
|
||||
|
||||
`agent-foundation-landmark-seed-batch-1` 原本一次要求模型生成 2 个场景。每个场景又必须包含:
|
||||
|
||||
1. 场景基础字段。
|
||||
2. `sceneTaskDescription`。
|
||||
3. 3 条 `actBackgroundPromptTexts`。
|
||||
4. 3 条 `actEventDescriptions`。
|
||||
5. 3 个 `actNPCNames`。
|
||||
6. 相连场景和进入钩子。
|
||||
|
||||
这个批次的输出密度明显高于角色 outline 批次。深海题材现场输入下,单次 prompt 已要求开局场景和普通关键场景同时生成,Responses 请求在默认 30 秒超时窗口内连续两次未完成,最终导致 operation 失败。
|
||||
|
||||
## 落地策略
|
||||
|
||||
1. 保持 `FOUNDATION_DRAFT_LANDMARK_COUNT = 2` 不变,仍生成 1 个开局场景和 1 个普通关键场景。
|
||||
2. 将 `FOUNDATION_LANDMARK_BATCH_SIZE` 从 `2` 收敛为 `1`。
|
||||
3. 第一批只生成开局场景,并继续作为 `camp` 写入。
|
||||
4. 第二批只生成普通关键场景,带上已生成场景名作为 forbidden names,避免重复开局场景。
|
||||
5. 单场景开局 prompt 不再写“一次性生成开局场景和普通关键场景”,避免模型在 batch_count=1 时被旧文案诱导多产。
|
||||
|
||||
## 验收标准
|
||||
|
||||
1. `generate_custom_world_foundation_draft_uses_seed_text_and_normalizes_fields` 中必须捕获 2 个 `场景框架名单` 请求。
|
||||
2. 第 1 个场景请求必须明确“本批场景必须是玩家进入世界时所在的开局场景”。
|
||||
3. 第 2 个场景请求必须明确“本批只生成普通关键场景”,并带上已生成开局场景名的禁止重复约束。
|
||||
4. 编译后的 `camp` 仍来自第 1 个生成场景,`landmarks` 仍只保留后续普通关键场景。
|
||||
5. 运行 `cargo test -p api-server custom_world_foundation_draft --manifest-path server-rs/Cargo.toml` 通过。
|
||||
@@ -0,0 +1,43 @@
|
||||
# RPG foundation draft 角色养成档案超时兜底(2026-05-02)
|
||||
|
||||
## 背景
|
||||
|
||||
场景骨架批次拆小后,现场底稿生成继续失败在角色养成档案阶段:
|
||||
|
||||
```text
|
||||
agent-foundation-story-dossier-batch-1 LLM 请求失败:LLM 请求超时,累计尝试 2 次
|
||||
```
|
||||
|
||||
同一轮 `logs/llm-raw` 还出现过:
|
||||
|
||||
```text
|
||||
agent-foundation-playable-dossier-batch-1 LLM 请求失败:LLM 请求超时,累计尝试 2 次
|
||||
```
|
||||
|
||||
这些请求体都没有 `tools` / `web_search` 字段,说明本次不是联网搜索降级问题,而是无搜索 Responses 请求在角色 `dossier` 阶段自身超时。
|
||||
|
||||
## 根因
|
||||
|
||||
`dossier` 阶段要求模型为角色补齐 `backstoryReveal`、`skills` 和 `initialItems`。这部分属于结果页和运行时可继续编辑的养成档案润色,不是底稿主链必须依赖 LLM 才能成立的业务真相。
|
||||
|
||||
在深海题材现场输入下,即使单个可扮演角色的养成档案请求也发生超时;继续只靠减小 batch size 不能保证主链稳定。
|
||||
|
||||
## 落地策略
|
||||
|
||||
1. `narrative` 阶段仍保持 LLM 生成,因为它补的是角色背景、性格、动机和行动风格。
|
||||
2. `dossier` 阶段改为 LLM 优先。
|
||||
3. 若 `dossier` 阶段发生请求超时、连接失败、上游失败、空响应或 JSON 解析失败,不再让底稿 operation 失败。
|
||||
4. 兜底使用当前角色对象本地生成:
|
||||
- `backstoryReveal.publicSummary`
|
||||
- 4 个固定好感档位章节,档位为 `15 / 30 / 60 / 90`
|
||||
- 3 个技能
|
||||
- 3 个初始物品
|
||||
5. 本地兜底只补缺字段,不覆盖模型已经成功生成的完整字段。
|
||||
6. SpacetimeDB 仍只接收 api-server 生成后的确定性 `draftProfile`;不新增外部 I/O。
|
||||
|
||||
## 验收标准
|
||||
|
||||
1. `story-dossier` 超时后,底稿生成继续完成,角色仍包含 `backstoryReveal / skills / initialItems`。
|
||||
2. fallback 后的角色名必须与输入角色名一致,不能增删改名。
|
||||
3. `backstoryReveal.chapters` 必须恰好 4 个,`affinityRequired` 固定为 `15 / 30 / 60 / 90`。
|
||||
4. `cargo test -p api-server custom_world_foundation_draft --manifest-path server-rs/Cargo.toml` 通过。
|
||||
@@ -0,0 +1,76 @@
|
||||
# RPG 图片生成 gpt-image-2 迁移 2026-05-02
|
||||
|
||||
## 背景
|
||||
|
||||
RPG 创作链路里有两类正式图片资产需要统一模型:
|
||||
|
||||
1. 角色主图候选生成。
|
||||
2. 场景幕背景图生成。
|
||||
|
||||
旧实现中角色主图默认使用 `wan2.7-image-pro`,场景图根据是否有参考图分别使用 DashScope 文生图与图生图模型。拼图链路已经接入 APIMart 的 OpenAI 兼容 `/images/generations`,并以 `gpt-image-2` 作为默认图片模型,因此本次 RPG 图片迁移复用同一类服务端配置与请求口径。
|
||||
|
||||
## 落地范围
|
||||
|
||||
1. `POST /api/assets/character-visual/generate`
|
||||
- 前端默认 `imageModel` 改为 `gpt-image-2`。
|
||||
- 后端把空值、历史 `wan2.7-image-pro`、`wan2.7-image` 统一归一为 `gpt-image-2`。
|
||||
- 继续保留角色主图 prompt、负向 prompt、审核失败后原创安全 prompt 兜底、PNG 去绿幕/去白底、OSS 草稿与发布链路。
|
||||
2. `POST /api/runtime/custom-world/scene-image`
|
||||
- 文生图与参考图生图统一走 `gpt-image-2`。
|
||||
- 参考图继续只支持 Data URL 与 `/generated-*` 旧路径,经服务端回读后传给上游。
|
||||
- 继续保留场景 prompt 编译、负向 prompt、OSS、`asset_object` 与 `asset_entity_binding` 链路。
|
||||
3. 自动草稿资产生成中的角色主图与幕背景图分别复用上述后端函数,因此同步使用 `gpt-image-2`。
|
||||
|
||||
## 上游协议
|
||||
|
||||
服务端使用:
|
||||
|
||||
```text
|
||||
POST {APIMART_BASE_URL}/images/generations
|
||||
Authorization: Bearer {APIMART_API_KEY}
|
||||
model = gpt-image-2
|
||||
```
|
||||
|
||||
请求体统一包含:
|
||||
|
||||
1. `model`
|
||||
2. `prompt`
|
||||
3. `n`
|
||||
4. `size`
|
||||
5. 有参考图时增加 `image_urls`
|
||||
|
||||
尺寸归一规则:
|
||||
|
||||
1. `1024*1024`、`1024x1024`、`1:1` -> `1:1`
|
||||
2. `1280*720`、`1600*900`、`16:9` -> `16:9`
|
||||
|
||||
响应解析兼容同步 `data[].url`、`data[].b64_json` 与异步 `task_id` / `GET /tasks/{task_id}` 结构。
|
||||
|
||||
## 非范围
|
||||
|
||||
1. 不迁移角色动作图片序列帧或视频模型。
|
||||
2. 不迁移 Custom World 封面图生成。
|
||||
3. 不改变 SpacetimeDB 表结构、migration 或 bindings。
|
||||
4. 不改变前端 UI 面板文案。
|
||||
|
||||
## 配置
|
||||
|
||||
本次复用已有 APIMart 配置:
|
||||
|
||||
```text
|
||||
APIMART_BASE_URL=https://api.apimart.ai/v1
|
||||
APIMART_API_KEY=...
|
||||
APIMART_IMAGE_REQUEST_TIMEOUT_MS=180000
|
||||
```
|
||||
|
||||
`APIMART_API_KEY` 缺失时,角色主图与场景图返回 `SERVICE_UNAVAILABLE`,`details.provider = "apimart"`。
|
||||
|
||||
## 验收
|
||||
|
||||
1. 角色主图生成请求上游 `model` 为 `gpt-image-2`。
|
||||
2. 场景图生成请求上游 `model` 为 `gpt-image-2`。
|
||||
3. 旧前端或历史草稿传 `wan2.7-image-pro` 时不会回退旧模型。
|
||||
4. 场景参考图生成仍能把参考图 Data URL 放入 `image_urls`。
|
||||
5. 角色主图生成后仍执行原有 PNG 透明背景处理与 OSS 写入。
|
||||
6. `cargo test -p api-server character_visual --manifest-path server-rs/Cargo.toml` 通过。
|
||||
7. `cargo test -p api-server custom_world_ai --manifest-path server-rs/Cargo.toml` 通过。
|
||||
Reference in New Issue
Block a user