Integrate role asset studio into custom world agent flow
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,766 @@
|
||||
# AI 原生 Agent-First 自定义世界创作工具第二阶段技术落地方案
|
||||
|
||||
更新时间:`2026-04-13`
|
||||
|
||||
## 0. 文档目的
|
||||
|
||||
这份文档用于把以下两份文档进一步收束成第二阶段实现方案:
|
||||
|
||||
- [AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PRD_2026-04-12.md](./AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PRD_2026-04-12.md)
|
||||
- [AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PHASE1_IMPLEMENTATION_PLAN_2026-04-13.md](./AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PHASE1_IMPLEMENTATION_PLAN_2026-04-13.md)
|
||||
|
||||
如果说第一阶段的目标是:
|
||||
|
||||
**先把创作页面和 Agent 工作区的外壳搭起来**
|
||||
|
||||
那么第二阶段的目标就是:
|
||||
|
||||
**让 Agent 会话真正开始理解创作者输入,并把自然语言聊天沉淀成结构化创作锚点。**
|
||||
|
||||
一句话定义:
|
||||
|
||||
**第二阶段先把“收集最小锚点、追问缺口、更新创作意图、同步草稿摘要”这条主链打通,而不是先急着生成完整世界。**
|
||||
|
||||
---
|
||||
|
||||
## 1. 阶段衔接关系
|
||||
|
||||
## 1.1 第一阶段已经完成什么
|
||||
|
||||
第二阶段默认建立在第一阶段已经完成的能力之上:
|
||||
|
||||
1. 从世界选择页可以进入创作页面
|
||||
2. 创作页面可以展示草稿和已发布作品
|
||||
3. 新建作品可以创建 Agent session
|
||||
4. 可以进入 Agent 工作区
|
||||
5. 用户发送消息后,服务端会写入 user / assistant 消息
|
||||
6. session snapshot 和 operation 可以持久化与恢复
|
||||
|
||||
## 1.2 第二阶段不再重做什么
|
||||
|
||||
以下内容第二阶段不重做:
|
||||
|
||||
1. 不重做创作页面整体布局
|
||||
2. 不重做 session 基础持久化
|
||||
3. 不重做 operation 轮询主链
|
||||
4. 不重做 workspace 基础壳层
|
||||
|
||||
第二阶段只在第一阶段骨架上继续补:
|
||||
|
||||
1. 意图提取
|
||||
2. 最小锚点判断
|
||||
3. 澄清问题生成
|
||||
4. `creatorIntent` 持续更新
|
||||
5. 创作页面草稿摘要变得更像“作品”
|
||||
|
||||
---
|
||||
|
||||
## 2. 第二阶段在八阶段中的位置
|
||||
|
||||
八阶段拆分如下:
|
||||
|
||||
1. 阶段 1:创作页面入口、Agent 会话主链与工作区骨架
|
||||
2. 阶段 2:最小锚点收集与澄清流程
|
||||
3. 阶段 3:世界底稿生成与草稿卡编译
|
||||
4. 阶段 4:草稿设定编辑与 AI 新增角色/场景生成
|
||||
5. 阶段 5:角色主图与动作资产工坊接入
|
||||
6. 阶段 6:场景背景图工坊接入
|
||||
7. 阶段 7:长尾内容扩展与自动补齐
|
||||
8. 阶段 8:发布、世界库接入与继续创作恢复
|
||||
|
||||
本文件只覆盖:
|
||||
|
||||
**阶段 2:最小锚点收集与澄清流程**
|
||||
|
||||
---
|
||||
|
||||
## 3. 第二阶段目标
|
||||
|
||||
第二阶段只做 6 件必须一起成立的事:
|
||||
|
||||
1. 把用户自然语言输入持续抽取为结构化 `creatorIntent`
|
||||
2. 明确最小锚点是否齐备
|
||||
3. 当锚点不足时,生成 `1~3` 个高杠杆澄清问题
|
||||
4. 在 Agent 工作区中展示“已收集锚点摘要”和“待补充问题”
|
||||
5. 把 `creatorIntent` 的变化同步反映到创作页面草稿卡片摘要里
|
||||
6. 当最小锚点齐备时,把 session 阶段推进到 `foundation_review`
|
||||
|
||||
一句话目标:
|
||||
|
||||
**让第二阶段结束时,Agent 不再只是会回话,而是真正开始把“聊天内容”沉淀成“世界锚点”。**
|
||||
|
||||
---
|
||||
|
||||
## 4. 第二阶段完成定义
|
||||
|
||||
第二阶段完成后,必须同时满足以下结果:
|
||||
|
||||
1. 用户连续输入多轮自然语言后,`creatorIntent` 会被持续更新。
|
||||
2. `creatorIntent` 中至少这些字段会真实变化:
|
||||
- `worldHook`
|
||||
- `themeKeywords`
|
||||
- `toneDirectives`
|
||||
- `playerPremise`
|
||||
- `openingSituation`
|
||||
- `coreConflicts`
|
||||
- `keyCharacters`
|
||||
- `iconicElements`
|
||||
- `forbiddenDirectives`
|
||||
3. 当最小锚点不完整时,workspace 右侧会显示待澄清问题。
|
||||
4. Agent 的回复不再只做“复述”,而会围绕缺失锚点主动追问。
|
||||
5. 当最小锚点齐备时,session 会进入 `foundation_review`,并明确告知“已可以进入下一阶段生成世界底稿”。
|
||||
6. 创作页面里的草稿作品标题和摘要会随着 `creatorIntent` 更新而变得更准确,不再只是空壳草稿。
|
||||
7. 第二阶段仍然不要求真正生成世界底稿,也不要求编出角色卡和地点卡。
|
||||
|
||||
---
|
||||
|
||||
## 5. 范围控制
|
||||
|
||||
## 5.1 第二阶段纳入范围
|
||||
|
||||
纳入范围的模块:
|
||||
|
||||
- `packages/shared/src/contracts/customWorldAgent.ts`
|
||||
- `src/services/customWorldCreatorIntent.ts`
|
||||
- `src/services/aiService.ts`
|
||||
- `src/components/custom-world-home/CustomWorldCreationHub.tsx`
|
||||
- `src/components/custom-world-agent/CustomWorldAgentWorkspace.tsx`
|
||||
- `src/components/custom-world-agent/CustomWorldAgentQuickActions.tsx`
|
||||
- `server-node/src/services/customWorldWorkSummaryService.ts`
|
||||
- `server-node/src/services/customWorldAgentSessionStore.ts`
|
||||
- `server-node/src/services/customWorldAgentOrchestrator.ts`
|
||||
|
||||
新增前端模块:
|
||||
|
||||
- `src/components/custom-world-agent/CustomWorldAgentIntentSummaryPanel.tsx`
|
||||
- `src/components/custom-world-agent/CustomWorldAgentClarificationPanel.tsx`
|
||||
|
||||
新增服务端模块:
|
||||
|
||||
- `server-node/src/services/customWorldAgentIntentExtractionService.ts`
|
||||
- `server-node/src/services/customWorldAgentClarificationService.ts`
|
||||
|
||||
## 5.2 第二阶段明确不做
|
||||
|
||||
以下内容不放进第二阶段:
|
||||
|
||||
1. 不生成世界底稿
|
||||
2. 不生成 draftCards
|
||||
3. 不进入角色、地点、势力、章节的实体卡编译
|
||||
4. 不做锁定逻辑
|
||||
5. 不做角色资产工坊
|
||||
6. 不做场景图工坊
|
||||
7. 不做长尾扩展
|
||||
8. 不做发布
|
||||
|
||||
原因:
|
||||
|
||||
**第二阶段的唯一重点,是把 Agent 会话从“能聊”推进到“能收集创作锚点”。**
|
||||
|
||||
---
|
||||
|
||||
## 6. 第二阶段最小闭环
|
||||
|
||||
建议把第二阶段的最小闭环定义为:
|
||||
|
||||
```text
|
||||
创作页面新建作品
|
||||
-> 进入 Agent 工作区
|
||||
-> 用户输入世界想法
|
||||
-> 服务端提取 creatorIntent patch
|
||||
-> 更新 creatorIntent / anchorPack / pendingClarifications
|
||||
-> Agent 回复补问或确认
|
||||
-> 前端展示已收集锚点摘要
|
||||
-> 用户继续补充
|
||||
-> 最小锚点齐备
|
||||
-> session 进入 foundation_review
|
||||
-> 创作页面草稿摘要同步更新
|
||||
```
|
||||
|
||||
这个闭环里,先只强接两条高价值链路:
|
||||
|
||||
1. 对话 -> creatorIntent
|
||||
2. creatorIntent -> 草稿摘要
|
||||
|
||||
---
|
||||
|
||||
## 7. 第二阶段产品行为定义
|
||||
|
||||
## 7.1 最小锚点定义
|
||||
|
||||
第二阶段必须明确判定“最小锚点是否齐备”。
|
||||
|
||||
建议统一收束成以下 6 组:
|
||||
|
||||
1. 世界一句话与核心幻想
|
||||
- 对应:`worldHook`
|
||||
|
||||
2. 玩家身份与开局困境
|
||||
- 对应:`playerPremise + openingSituation`
|
||||
|
||||
3. 主题气质与禁忌边界
|
||||
- 对应:`themeKeywords + toneDirectives + forbiddenDirectives`
|
||||
|
||||
4. 核心冲突
|
||||
- 对应:`coreConflicts`
|
||||
|
||||
5. 关键关系钩子
|
||||
- 对应:`keyCharacters`
|
||||
- 最低要求:至少有 1 个关键人物种子,且带 `relationToPlayer` 或 `hiddenHook`
|
||||
|
||||
6. 标志性要素
|
||||
- 对应:`iconicElements`
|
||||
|
||||
## 7.2 最小锚点齐备规则
|
||||
|
||||
建议使用 deterministic 规则判断:
|
||||
|
||||
```ts
|
||||
type CreatorIntentReadiness = {
|
||||
isReady: boolean;
|
||||
completedKeys: string[];
|
||||
missingKeys: string[];
|
||||
};
|
||||
```
|
||||
|
||||
### 判定要求
|
||||
|
||||
#### `world_hook`
|
||||
|
||||
满足任一条件即视为完成:
|
||||
|
||||
1. `worldHook.trim().length >= 8`
|
||||
2. `rawSettingText.trim().length >= 24` 且可提取稳定世界命题
|
||||
|
||||
#### `player_premise`
|
||||
|
||||
必须:
|
||||
|
||||
1. `playerPremise` 非空
|
||||
2. `openingSituation` 非空
|
||||
|
||||
#### `theme_and_tone`
|
||||
|
||||
满足:
|
||||
|
||||
1. `themeKeywords.length >= 1`
|
||||
2. `toneDirectives.length >= 1`
|
||||
|
||||
`forbiddenDirectives` 可选,但一旦用户明确提到禁忌,必须写入
|
||||
|
||||
#### `core_conflict`
|
||||
|
||||
满足:
|
||||
|
||||
1. `coreConflicts.length >= 1`
|
||||
|
||||
#### `relationship_seed`
|
||||
|
||||
满足:
|
||||
|
||||
1. `keyCharacters.length >= 1`
|
||||
2. 至少一个条目同时满足:
|
||||
- `name` 非空
|
||||
- 且 `relationToPlayer` 或 `hiddenHook` 非空
|
||||
|
||||
#### `iconic_element`
|
||||
|
||||
满足:
|
||||
|
||||
1. `iconicElements.length >= 1`
|
||||
|
||||
## 7.3 缺口澄清规则
|
||||
|
||||
当 `isReady === false` 时,Agent 必须追问,但必须遵守:
|
||||
|
||||
1. 一次最多追问 `3` 个问题
|
||||
2. 问题必须优先覆盖最高杠杆缺口
|
||||
3. 问题不能像问卷
|
||||
4. 每个问题最好给一个方向提示
|
||||
|
||||
### 优先级顺序
|
||||
|
||||
1. `world_hook`
|
||||
2. `player_premise`
|
||||
3. `core_conflict`
|
||||
4. `theme_and_tone`
|
||||
5. `relationship_seed`
|
||||
6. `iconic_element`
|
||||
|
||||
## 7.4 阶段推进规则
|
||||
|
||||
### 初始
|
||||
|
||||
- `collecting_intent`
|
||||
|
||||
### 缺口存在
|
||||
|
||||
- `clarifying`
|
||||
|
||||
### 最小锚点齐备
|
||||
|
||||
- `foundation_review`
|
||||
|
||||
### 说明
|
||||
|
||||
第二阶段进入 `foundation_review` 后,不代表已经生成底稿;
|
||||
只代表:
|
||||
|
||||
**已经具备进入第三阶段生成世界底稿的输入条件。**
|
||||
|
||||
## 7.5 Agent 回复行为
|
||||
|
||||
第二阶段起,assistant 回复必须升级成 3 段结构:
|
||||
|
||||
1. 已确认内容
|
||||
2. 仍缺内容
|
||||
3. 下一步提问或建议
|
||||
|
||||
### 示例结构
|
||||
|
||||
```text
|
||||
我先把目前已经明确的部分收一下:
|
||||
- ...
|
||||
|
||||
现在还缺两块最关键的信息:
|
||||
- ...
|
||||
- ...
|
||||
|
||||
你可以先告诉我:
|
||||
1. ...
|
||||
2. ...
|
||||
```
|
||||
|
||||
禁止:
|
||||
|
||||
1. 只说“收到”
|
||||
2. 一次问超过 3 个问题
|
||||
3. 明知缺世界核心还继续追问长尾细节
|
||||
|
||||
---
|
||||
|
||||
## 8. 数据结构落地方案
|
||||
|
||||
## 8.1 修改 `CustomWorldCreatorIntent`
|
||||
|
||||
继续复用 `src/services/customWorldCreatorIntent.ts` 的现有结构,不新增第二套意图对象。
|
||||
|
||||
第二阶段要求:
|
||||
|
||||
1. 所有字段都支持增量 patch
|
||||
2. patch 合并必须是“补充 + 覆盖用户明确改写”
|
||||
3. 不允许每次新消息都重置整个 intent
|
||||
|
||||
## 8.2 新增 `CreatorIntentReadiness`
|
||||
|
||||
建议新增到:
|
||||
|
||||
- `packages/shared/src/contracts/customWorldAgent.ts`
|
||||
|
||||
```ts
|
||||
export interface CreatorIntentReadiness {
|
||||
isReady: boolean;
|
||||
completedKeys: string[];
|
||||
missingKeys: string[];
|
||||
}
|
||||
```
|
||||
|
||||
## 8.3 扩展 `pendingClarifications`
|
||||
|
||||
当前第一阶段里的澄清结构太轻,第二阶段要扩成:
|
||||
|
||||
```ts
|
||||
export interface CustomWorldPendingClarification {
|
||||
id: string;
|
||||
label: string;
|
||||
question: string;
|
||||
targetKey:
|
||||
| 'world_hook'
|
||||
| 'player_premise'
|
||||
| 'theme_and_tone'
|
||||
| 'core_conflict'
|
||||
| 'relationship_seed'
|
||||
| 'iconic_element';
|
||||
priority: number;
|
||||
answer?: string;
|
||||
}
|
||||
```
|
||||
|
||||
## 8.4 扩展 `CustomWorldAgentSessionSnapshot`
|
||||
|
||||
第二阶段必须新增:
|
||||
|
||||
```ts
|
||||
creatorIntentReadiness: CreatorIntentReadiness;
|
||||
```
|
||||
|
||||
并把:
|
||||
|
||||
```ts
|
||||
pendingClarifications: CustomWorldPendingClarification[];
|
||||
```
|
||||
|
||||
替换掉第一阶段的轻量问题数组。
|
||||
|
||||
## 8.5 扩展 `CustomWorldWorkSummary`
|
||||
|
||||
为了让创作页面草稿卡更像一个“作品”,第二阶段必须要求草稿摘要从 `creatorIntent` 实时编译。
|
||||
|
||||
规则:
|
||||
|
||||
### 标题
|
||||
|
||||
按优先级取:
|
||||
|
||||
1. `creatorIntent.worldHook`
|
||||
2. `rawSettingText` 截断
|
||||
3. `未命名草稿`
|
||||
|
||||
### 摘要
|
||||
|
||||
按优先级取:
|
||||
|
||||
1. `buildCustomWorldCreatorIntentDisplayText(intent)`
|
||||
2. `rawSettingText` 截断
|
||||
3. 默认空态文案
|
||||
|
||||
### 阶段文案
|
||||
|
||||
按 session.stage 直接映射。
|
||||
|
||||
---
|
||||
|
||||
## 9. 服务端实现方案
|
||||
|
||||
## 9.1 新增 `customWorldAgentIntentExtractionService.ts`
|
||||
|
||||
### 文件
|
||||
|
||||
`server-node/src/services/customWorldAgentIntentExtractionService.ts`
|
||||
|
||||
### 职责
|
||||
|
||||
输入:
|
||||
|
||||
1. 当前 `creatorIntent`
|
||||
2. 最新用户消息
|
||||
3. 最近若干轮对话摘要
|
||||
|
||||
输出:
|
||||
|
||||
```ts
|
||||
type ExtractedCreatorIntentPatch = {
|
||||
worldHook?: string;
|
||||
themeKeywords?: string[];
|
||||
toneDirectives?: string[];
|
||||
playerPremise?: string;
|
||||
openingSituation?: string;
|
||||
coreConflicts?: string[];
|
||||
keyCharacters?: CreatorCharacterSeed[];
|
||||
iconicElements?: string[];
|
||||
forbiddenDirectives?: string[];
|
||||
};
|
||||
```
|
||||
|
||||
### 推荐实现策略
|
||||
|
||||
第一优先:
|
||||
|
||||
1. 使用 deterministic 规则提取明显字段
|
||||
|
||||
第二优先:
|
||||
|
||||
2. 用一个轻量 LLM contract 只提取 patch,不生成世界内容
|
||||
|
||||
### 第一阶段之外、第二阶段之内的硬要求
|
||||
|
||||
这一步的 LLM 输出必须只做“结构提取”,不能夹带世界扩写。
|
||||
|
||||
## 9.2 新增 `customWorldAgentClarificationService.ts`
|
||||
|
||||
### 文件
|
||||
|
||||
`server-node/src/services/customWorldAgentClarificationService.ts`
|
||||
|
||||
### 职责
|
||||
|
||||
1. 根据 `creatorIntent` 计算 readiness
|
||||
2. 生成 `pendingClarifications`
|
||||
3. 按优先级裁剪到 `1~3` 个问题
|
||||
|
||||
### 导出函数建议
|
||||
|
||||
```ts
|
||||
evaluateCreatorIntentReadiness(intent)
|
||||
buildPendingClarifications(intent, readiness)
|
||||
```
|
||||
|
||||
## 9.3 修改 `customWorldAgentOrchestrator.ts`
|
||||
|
||||
第二阶段它要从“写消息 + 回固定话术”升级为:
|
||||
|
||||
1. 写入 user message
|
||||
2. 提取 intent patch
|
||||
3. 合并 intent
|
||||
4. 更新 anchorPack
|
||||
5. 计算 readiness
|
||||
6. 生成 clarifications
|
||||
7. 生成更结构化的 assistant 回复
|
||||
8. 更新 snapshot
|
||||
|
||||
### 关键顺序
|
||||
|
||||
必须严格按下面顺序:
|
||||
|
||||
```text
|
||||
收到用户消息
|
||||
-> 提取 intent patch
|
||||
-> merge creatorIntent
|
||||
-> build anchorPack
|
||||
-> evaluate readiness
|
||||
-> build pendingClarifications
|
||||
-> compose assistant reply
|
||||
-> 写回 snapshot
|
||||
```
|
||||
|
||||
### 第一阶段兼容要求
|
||||
|
||||
如果提取失败:
|
||||
|
||||
1. 不允许清空原有 intent
|
||||
2. assistant 仍要给出可继续的澄清回复
|
||||
|
||||
## 9.4 修改 `customWorldWorkSummaryService.ts`
|
||||
|
||||
第二阶段它必须从 session 中读取:
|
||||
|
||||
1. `creatorIntent`
|
||||
2. `creatorIntentReadiness`
|
||||
3. `stage`
|
||||
|
||||
并生成更准确的:
|
||||
|
||||
1. 草稿标题
|
||||
2. 草稿摘要
|
||||
3. 当前阶段标签
|
||||
|
||||
---
|
||||
|
||||
## 10. 前端实现方案
|
||||
|
||||
## 10.1 修改 `CustomWorldAgentWorkspace.tsx`
|
||||
|
||||
第二阶段它不再只是空壳工作区,而要新增:
|
||||
|
||||
1. 意图摘要区
|
||||
2. 澄清问题区
|
||||
|
||||
### 右侧结构建议
|
||||
|
||||
1. `CustomWorldAgentIntentSummaryPanel`
|
||||
2. `CustomWorldAgentClarificationPanel`
|
||||
3. `CustomWorldAgentLockBar`
|
||||
4. `CustomWorldAgentDraftDrawer`
|
||||
5. `CustomWorldAgentQuickActions`
|
||||
|
||||
说明:
|
||||
|
||||
第二阶段虽然还没有真正 `draftCards`,但壳层继续保留。
|
||||
|
||||
## 10.2 新增 `CustomWorldAgentIntentSummaryPanel.tsx`
|
||||
|
||||
### 职责
|
||||
|
||||
展示当前已收集的最小锚点摘要。
|
||||
|
||||
### 展示项
|
||||
|
||||
1. 世界一句话
|
||||
2. 玩家身份
|
||||
3. 开局处境
|
||||
4. 核心冲突
|
||||
5. 主题气质
|
||||
6. 标志性要素
|
||||
|
||||
### 空态
|
||||
|
||||
未收集到时显示:
|
||||
|
||||
- `还在收集你的世界锚点`
|
||||
|
||||
## 10.3 新增 `CustomWorldAgentClarificationPanel.tsx`
|
||||
|
||||
### 职责
|
||||
|
||||
展示当前 `pendingClarifications`
|
||||
|
||||
### 展示规则
|
||||
|
||||
1. 每个问题显示 label + question
|
||||
2. 最多展示 3 个
|
||||
3. 若 `isReady === true`,显示:
|
||||
- `最小锚点已齐备,可以进入下一阶段`
|
||||
|
||||
## 10.4 修改 `CustomWorldCreationHub.tsx`
|
||||
|
||||
第二阶段必须让草稿卡开始体现“已收集锚点”的变化。
|
||||
|
||||
要求:
|
||||
|
||||
1. 草稿卡标题和摘要来自统一 `CustomWorldWorkSummary`
|
||||
2. 列表刷新后可以看到标题变化
|
||||
3. 草稿从“未命名草稿”变成更接近创作主题的标题
|
||||
|
||||
## 10.5 修改 `CustomWorldAgentQuickActions.tsx`
|
||||
|
||||
第二阶段只保留轻动作:
|
||||
|
||||
1. `总结当前设定`
|
||||
2. `继续补充锚点`
|
||||
|
||||
不允许展示:
|
||||
|
||||
1. `生成世界底稿`
|
||||
2. `发布世界`
|
||||
|
||||
因为这属于后续阶段。
|
||||
|
||||
---
|
||||
|
||||
## 11. 交互时序
|
||||
|
||||
## 11.1 用户补充锚点
|
||||
|
||||
```text
|
||||
用户发消息
|
||||
-> 前端 POST /messages
|
||||
-> 后端提取 creatorIntent patch
|
||||
-> 更新 creatorIntent
|
||||
-> 更新 readiness 和 pendingClarifications
|
||||
-> 写入 assistant 回复
|
||||
-> 前端刷新 snapshot
|
||||
-> 前端刷新意图摘要和澄清问题
|
||||
```
|
||||
|
||||
## 11.2 锚点齐备
|
||||
|
||||
```text
|
||||
用户最后一轮补齐关键锚点
|
||||
-> 后端 evaluate readiness = true
|
||||
-> session.stage 切到 foundation_review
|
||||
-> assistant 回复“已可进入下一阶段”
|
||||
-> 前端显示完成态
|
||||
-> 创作页面草稿摘要同步更新
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 12. 第一阶段到第二阶段的兼容要求
|
||||
|
||||
第二阶段必须兼容第一阶段已有数据。
|
||||
|
||||
## 12.1 旧 session 兼容
|
||||
|
||||
如果存在第一阶段创建的 session,没有:
|
||||
|
||||
1. `creatorIntentReadiness`
|
||||
2. 新版 `pendingClarifications`
|
||||
|
||||
则读取时要自动补 fallback。
|
||||
|
||||
## 12.2 旧草稿兼容
|
||||
|
||||
如果草稿还没有明确 `worldHook`:
|
||||
|
||||
1. 继续显示 `未命名草稿`
|
||||
2. 不允许报错
|
||||
|
||||
---
|
||||
|
||||
## 13. 落地文件清单
|
||||
|
||||
## 13.1 shared
|
||||
|
||||
必须修改:
|
||||
|
||||
1. `packages/shared/src/contracts/customWorldAgent.ts`
|
||||
|
||||
## 13.2 frontend
|
||||
|
||||
必须新增:
|
||||
|
||||
1. `src/components/custom-world-agent/CustomWorldAgentIntentSummaryPanel.tsx`
|
||||
2. `src/components/custom-world-agent/CustomWorldAgentClarificationPanel.tsx`
|
||||
|
||||
必须修改:
|
||||
|
||||
1. `src/components/custom-world-home/CustomWorldCreationHub.tsx`
|
||||
2. `src/components/custom-world-agent/CustomWorldAgentWorkspace.tsx`
|
||||
3. `src/components/custom-world-agent/CustomWorldAgentQuickActions.tsx`
|
||||
4. `src/services/aiService.ts`
|
||||
5. `src/services/customWorldCreatorIntent.ts`
|
||||
|
||||
## 13.3 backend
|
||||
|
||||
必须新增:
|
||||
|
||||
1. `server-node/src/services/customWorldAgentIntentExtractionService.ts`
|
||||
2. `server-node/src/services/customWorldAgentClarificationService.ts`
|
||||
|
||||
必须修改:
|
||||
|
||||
1. `server-node/src/services/customWorldAgentOrchestrator.ts`
|
||||
2. `server-node/src/services/customWorldWorkSummaryService.ts`
|
||||
3. `server-node/src/services/customWorldAgentSessionStore.ts`
|
||||
|
||||
---
|
||||
|
||||
## 14. 测试要求
|
||||
|
||||
## 14.1 服务端测试
|
||||
|
||||
至少要补:
|
||||
|
||||
1. 用户消息能提取到 `creatorIntent` patch
|
||||
2. patch 合并不会覆盖无关旧字段
|
||||
3. readiness 能正确判断缺失项
|
||||
4. clarifications 最多只返回 3 个
|
||||
5. readiness 达标后 stage 会切到 `foundation_review`
|
||||
|
||||
## 14.2 前端测试
|
||||
|
||||
至少要补:
|
||||
|
||||
1. intent summary panel 能展示已收集锚点
|
||||
2. clarification panel 能展示待补充问题
|
||||
3. readiness 达标后显示完成态
|
||||
4. 创作页面草稿卡能随着摘要变化更新
|
||||
|
||||
## 14.3 手工回归
|
||||
|
||||
至少走这 4 条:
|
||||
|
||||
1. 用户输入一段简单世界想法 -> 被正确提取为 worldHook
|
||||
2. 用户补充“玩家是谁” -> summary 更新
|
||||
3. 用户补充核心冲突 -> clarification 继续减少
|
||||
4. 锚点齐备 -> session 进入 foundation_review
|
||||
|
||||
---
|
||||
|
||||
## 15. 第二阶段验收标准
|
||||
|
||||
做到以下几点,才算第二阶段真正完成:
|
||||
|
||||
1. Agent 会话已经可以持续收集并更新 `creatorIntent`。
|
||||
2. 最小锚点不足时,系统会追问真正缺失的高杠杆问题。
|
||||
3. 最小锚点齐备时,session 会进入 `foundation_review`。
|
||||
4. 创作页面中的草稿摘要会明显变得更像一个作品,而不是空壳 session。
|
||||
5. 第二阶段仍然不生成世界底稿,不越权进入第三阶段。
|
||||
|
||||
---
|
||||
|
||||
## 16. 一句话结论
|
||||
|
||||
第二阶段最重要的不是“让 Agent 写得更长”,而是:
|
||||
|
||||
**先让它学会把用户说过的话,稳定地变成创作锚点。**
|
||||
@@ -0,0 +1,981 @@
|
||||
# AI 原生 Agent-First 自定义世界创作工具第三阶段技术落地方案
|
||||
|
||||
更新时间:`2026-04-14`
|
||||
|
||||
## 0. 文档目的
|
||||
|
||||
这份文档用于把以下几份文档进一步收束成第三阶段实现方案:
|
||||
|
||||
- [AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PRD_2026-04-12.md](./AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PRD_2026-04-12.md)
|
||||
- [AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PHASE1_IMPLEMENTATION_PLAN_2026-04-13.md](./AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PHASE1_IMPLEMENTATION_PLAN_2026-04-13.md)
|
||||
- [AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PHASE2_IMPLEMENTATION_PLAN_2026-04-13.md](./AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PHASE2_IMPLEMENTATION_PLAN_2026-04-13.md)
|
||||
|
||||
如果说第一阶段的目标是:
|
||||
|
||||
**先把创作页面和 Agent 工作区的壳层搭起来**
|
||||
|
||||
第二阶段的目标是:
|
||||
|
||||
**先把自然语言对话稳定沉淀成结构化创作锚点**
|
||||
|
||||
那么第三阶段的目标就是:
|
||||
|
||||
**把已经齐备的最小锚点,正式编译成第一版可浏览、可讨论、可继续精修的世界底稿。**
|
||||
|
||||
一句话定义:
|
||||
|
||||
**第三阶段先让 Agent 不只是“知道你想做什么世界”,而是能真的给出一版像样的世界草稿。**
|
||||
|
||||
---
|
||||
|
||||
## 1. 阶段衔接关系
|
||||
|
||||
## 1.1 第一阶段已经完成什么
|
||||
|
||||
第三阶段默认建立在第一阶段已经完成的能力之上:
|
||||
|
||||
1. 世界选择页点击“创建自定义世界”后,可以先进入创作页面
|
||||
2. 创作页面可以展示草稿与已发布作品
|
||||
3. 新建作品可以创建 Agent session
|
||||
4. Agent workspace 可进入、可恢复、可轮询 operation
|
||||
5. 基础 `customWorldAgent` contract 已建立
|
||||
|
||||
## 1.2 第二阶段已经完成什么
|
||||
|
||||
第三阶段默认建立在第二阶段已经完成的能力之上:
|
||||
|
||||
1. 用户自然语言输入可以持续更新 `creatorIntent`
|
||||
2. 系统可以判断最小锚点是否齐备
|
||||
3. 缺口存在时会生成澄清问题
|
||||
4. 锚点齐备时,session 会进入 `foundation_review`
|
||||
5. 创作页面草稿摘要能反映 `creatorIntent`
|
||||
|
||||
## 1.3 第三阶段不再重做什么
|
||||
|
||||
以下内容第三阶段不重做:
|
||||
|
||||
1. 不重做创作页面整体结构
|
||||
2. 不重做 session 基础持久化
|
||||
3. 不重做 creatorIntent 提取和 readiness 判断主链
|
||||
4. 不重做 operation 轮询
|
||||
|
||||
第三阶段只在前两阶段骨架上继续补:
|
||||
|
||||
1. `draft_foundation` 动作真正可执行
|
||||
2. 世界底稿生成
|
||||
3. 草稿卡编译
|
||||
4. 卡片详情读取
|
||||
5. 工作区右侧从“空抽屉”升级成“有世界内容”
|
||||
6. 创作页面草稿卡从“意图摘要”升级为“世界草稿摘要”
|
||||
|
||||
---
|
||||
|
||||
## 2. 第三阶段在八阶段中的位置
|
||||
|
||||
八阶段拆分如下:
|
||||
|
||||
1. 阶段 1:创作页面入口、Agent 会话主链与工作区骨架
|
||||
2. 阶段 2:最小锚点收集与澄清流程
|
||||
3. 阶段 3:世界底稿生成与草稿卡编译
|
||||
4. 阶段 4:草稿设定编辑与 AI 新增角色/场景生成
|
||||
5. 阶段 5:角色主图与动作资产工坊接入
|
||||
6. 阶段 6:场景背景图工坊接入
|
||||
7. 阶段 7:长尾内容扩展与自动补齐
|
||||
8. 阶段 8:发布、世界库接入与继续创作恢复
|
||||
|
||||
本文件只覆盖:
|
||||
|
||||
**阶段 3:世界底稿生成与草稿卡编译**
|
||||
|
||||
---
|
||||
|
||||
## 3. 第三阶段目标
|
||||
|
||||
第三阶段只做 7 件必须一起成立的事:
|
||||
|
||||
1. 当 `creatorIntentReadiness.isReady === true` 时,`draft_foundation` 可以真正执行
|
||||
2. 系统能根据 `creatorIntent + anchorPack` 生成首轮世界底稿
|
||||
3. 系统能把首轮世界底稿编译成一组 `draftCards`
|
||||
4. Agent workspace 能展示并切换这些卡片
|
||||
5. `GET /cards/:cardId` 可以返回卡片详情
|
||||
6. Agent 会话会从“收集锚点”切换到“校对世界底稿”
|
||||
7. 创作页面草稿作品卡能体现“这个草稿已经不只是想法,而是有底稿内容”
|
||||
|
||||
一句话目标:
|
||||
|
||||
**让第三阶段结束时,用户第一次看到“这个世界已经长出来了”。**
|
||||
|
||||
---
|
||||
|
||||
## 4. 第三阶段完成定义
|
||||
|
||||
第三阶段完成后,必须同时满足以下结果:
|
||||
|
||||
1. 用户在 `foundation_review` 阶段点击“整理一版世界底稿”后,会产生真实的底稿生成 operation。
|
||||
2. operation 完成后,session 中会出现:
|
||||
- 更新后的 `draftProfile`
|
||||
- 一组非空 `draftCards`
|
||||
3. `draftCards` 至少覆盖:
|
||||
- 世界总卡
|
||||
- 势力卡
|
||||
- 关键角色卡
|
||||
- 关键地点卡
|
||||
- 线程卡
|
||||
- 主线第一幕卡
|
||||
4. 用户可以在 workspace 中点击卡片,查看卡片详情。
|
||||
5. `suggestedActions` 会从“继续补锚点”转为“精修这个角色 / 继续补地点 / 进入下一步”等更像编辑阶段的动作。
|
||||
6. 创作页面中对应的草稿作品卡,会显示更明确的标题、摘要、阶段标签与对象数量。
|
||||
7. 第三阶段仍然不要求草稿设定编辑、AI 新增角色/场景生成,也不要求资产工坊接入。
|
||||
|
||||
---
|
||||
|
||||
## 5. 范围控制
|
||||
|
||||
## 5.1 第三阶段纳入范围
|
||||
|
||||
纳入范围的模块:
|
||||
|
||||
- `packages/shared/src/contracts/customWorldAgent.ts`
|
||||
- `src/services/customWorld.ts`
|
||||
- `src/services/customWorldBuilder.ts`
|
||||
- `src/services/aiService.ts`
|
||||
- `src/components/custom-world-home/CustomWorldCreationHub.tsx`
|
||||
- `src/components/custom-world-agent/CustomWorldAgentWorkspace.tsx`
|
||||
- `src/components/custom-world-agent/CustomWorldAgentDraftDrawer.tsx`
|
||||
- `src/components/custom-world-agent/CustomWorldAgentQuickActions.tsx`
|
||||
- `server-node/src/services/customWorldAgentSessionStore.ts`
|
||||
- `server-node/src/services/customWorldAgentOrchestrator.ts`
|
||||
- `server-node/src/services/customWorldWorkSummaryService.ts`
|
||||
|
||||
新增前端模块:
|
||||
|
||||
- `src/components/custom-world-agent/CustomWorldAgentDraftDetailPanel.tsx`
|
||||
- `src/components/custom-world-agent/CustomWorldDraftCardDetailModal.tsx`
|
||||
|
||||
新增服务端模块:
|
||||
|
||||
- `server-node/src/services/customWorldAgentFoundationDraftService.ts`
|
||||
- `server-node/src/services/customWorldAgentDraftCompiler.ts`
|
||||
|
||||
## 5.2 第三阶段明确不做
|
||||
|
||||
以下内容不放进第三阶段:
|
||||
|
||||
1. 不做锁定逻辑
|
||||
2. 不做局部重生成
|
||||
3. 不做角色主图与动作资产工坊接入
|
||||
4. 不做场景图工坊接入
|
||||
5. 不做长尾内容扩展
|
||||
6. 不做发布
|
||||
|
||||
原因:
|
||||
|
||||
**第三阶段的唯一重点,是先把“会话里已经收集好的锚点”编成“第一版世界底稿”。**
|
||||
|
||||
---
|
||||
|
||||
## 6. 第三阶段最小闭环
|
||||
|
||||
建议把第三阶段的最小闭环定义为:
|
||||
|
||||
```text
|
||||
第二阶段已收集完最小锚点
|
||||
-> session 进入 foundation_review
|
||||
-> 用户点击“整理一版世界底稿”
|
||||
-> 服务端生成首轮 foundation draft
|
||||
-> 服务端编译 draftCards
|
||||
-> workspace 刷新右侧卡片抽屉
|
||||
-> 用户查看世界卡 / 势力卡 / 角色卡 / 地点卡 / 第一幕卡
|
||||
-> 创作页面草稿摘要同步升级
|
||||
```
|
||||
|
||||
这个闭环里,先只强接两条高价值链路:
|
||||
|
||||
1. `creatorIntent -> foundation draft`
|
||||
2. `foundation draft -> draftCards`
|
||||
|
||||
---
|
||||
|
||||
## 7. 第三阶段产品行为定义
|
||||
|
||||
## 7.1 进入条件
|
||||
|
||||
第三阶段的唯一正式进入条件是:
|
||||
|
||||
```ts
|
||||
session.stage === 'foundation_review'
|
||||
&& creatorIntentReadiness.isReady === true
|
||||
```
|
||||
|
||||
只有满足这两个条件时,才允许执行:
|
||||
|
||||
```ts
|
||||
draft_foundation
|
||||
```
|
||||
|
||||
## 7.2 首轮世界底稿的最小内容
|
||||
|
||||
第三阶段不要求一次生成全世界,但必须生成“像一个作品”的第一版基础结构。
|
||||
|
||||
建议最小包含:
|
||||
|
||||
1. 世界总卡 `world`
|
||||
2. 势力卡 `faction`
|
||||
- `2~4` 张
|
||||
3. 关键角色卡 `character`
|
||||
- `3~5` 张
|
||||
4. 关键地点卡 `landmark`
|
||||
- `4~6` 张
|
||||
5. 世界线程卡 `thread`
|
||||
- `3~5` 张
|
||||
6. 主线第一幕卡 `chapter`
|
||||
- `1` 张
|
||||
7. 营地卡 `camp`
|
||||
- `1` 张,可选但建议有
|
||||
|
||||
### 说明
|
||||
|
||||
这里的“关键角色 / 地点 / 势力 / 线程”不是后续完整长尾版,而是:
|
||||
|
||||
**第一批高价值草稿对象。**
|
||||
|
||||
## 7.3 世界底稿生成原则
|
||||
|
||||
第三阶段必须遵守:
|
||||
|
||||
1. 只围绕 `creatorIntent + anchorPack` 生成
|
||||
2. 不直接扩到长尾 NPC 与长尾地点
|
||||
3. 不引入用户从未表达过的核心主题反转
|
||||
4. 尽量把已有锚点长出来,而不是另起炉灶
|
||||
|
||||
### 世界总卡必须回答
|
||||
|
||||
1. 这个世界一句话是什么
|
||||
2. 玩家是谁
|
||||
3. 眼下最大的冲突是什么
|
||||
4. 这个世界最吸引人的独特点是什么
|
||||
|
||||
### 势力卡必须回答
|
||||
|
||||
1. 势力是谁
|
||||
2. 公开目标是什么
|
||||
3. 与哪条冲突直接相关
|
||||
4. 它和玩家、关键角色的关系是什么
|
||||
|
||||
### 角色卡必须回答
|
||||
|
||||
1. 这个角色表面上是什么
|
||||
2. 当前压力是什么
|
||||
3. 他和玩家什么关系
|
||||
4. 他属于哪条线程
|
||||
|
||||
### 地点卡必须回答
|
||||
|
||||
1. 这个地方是什么
|
||||
2. 为什么重要
|
||||
3. 和谁、哪条线程有关
|
||||
4. 玩家第一次到这里会感到什么
|
||||
|
||||
### 线程卡必须回答
|
||||
|
||||
1. 明线还是暗线
|
||||
2. 这条线的主要冲突是什么
|
||||
3. 牵涉哪些角色和地点
|
||||
|
||||
### 主线第一幕卡必须回答
|
||||
|
||||
1. 开幕事件
|
||||
2. 玩家第一目标
|
||||
3. 第一批关键角色
|
||||
4. 第一批关键地点
|
||||
5. 第一幕结束时玩家会理解到什么
|
||||
|
||||
---
|
||||
|
||||
## 8. 草稿卡设计
|
||||
|
||||
## 8.1 卡片种类
|
||||
|
||||
第三阶段实际生成的 `draftCards` 限定为:
|
||||
|
||||
```ts
|
||||
type EnabledPhase3DraftCardKind =
|
||||
| 'world'
|
||||
| 'camp'
|
||||
| 'faction'
|
||||
| 'character'
|
||||
| 'landmark'
|
||||
| 'thread'
|
||||
| 'chapter';
|
||||
```
|
||||
|
||||
明确不做:
|
||||
|
||||
1. `scene_chapter`
|
||||
2. `carrier`
|
||||
3. `sidequest_seed`
|
||||
|
||||
这些留到后续阶段。
|
||||
|
||||
## 8.2 草稿卡状态
|
||||
|
||||
第三阶段卡片状态只允许:
|
||||
|
||||
1. `suggested`
|
||||
2. `warning`
|
||||
|
||||
第三阶段不做:
|
||||
|
||||
1. `confirmed`
|
||||
2. `locked`
|
||||
|
||||
原因:
|
||||
|
||||
锁定属于第四阶段。
|
||||
|
||||
## 8.3 草稿卡摘要要求
|
||||
|
||||
每张卡都必须包含:
|
||||
|
||||
1. `title`
|
||||
2. `subtitle`
|
||||
3. `summary`
|
||||
4. `linkedIds`
|
||||
5. `warningCount`
|
||||
|
||||
### world 卡
|
||||
|
||||
#### `title`
|
||||
|
||||
- 世界名称或世界一句话
|
||||
|
||||
#### `subtitle`
|
||||
|
||||
- 玩家视角 + 核心冲突短句
|
||||
|
||||
#### `summary`
|
||||
|
||||
- 世界总摘要
|
||||
|
||||
### faction 卡
|
||||
|
||||
#### `title`
|
||||
|
||||
- 势力名
|
||||
|
||||
#### `subtitle`
|
||||
|
||||
- 公开目标
|
||||
|
||||
#### `summary`
|
||||
|
||||
- 势力位置、冲突和代表关系
|
||||
|
||||
### character 卡
|
||||
|
||||
#### `title`
|
||||
|
||||
- 角色名
|
||||
|
||||
#### `subtitle`
|
||||
|
||||
- 外显身份
|
||||
|
||||
#### `summary`
|
||||
|
||||
- 当前压力 + 与玩家关系 + 线程位置
|
||||
|
||||
### landmark 卡
|
||||
|
||||
#### `title`
|
||||
|
||||
- 地点名
|
||||
|
||||
#### `subtitle`
|
||||
|
||||
- 功能定位或情绪定位
|
||||
|
||||
#### `summary`
|
||||
|
||||
- 地点重要性 + 关联角色 / 线程
|
||||
|
||||
### thread 卡
|
||||
|
||||
#### `title`
|
||||
|
||||
- 线程标题
|
||||
|
||||
#### `subtitle`
|
||||
|
||||
- 明线 / 暗线
|
||||
|
||||
#### `summary`
|
||||
|
||||
- 主要冲突和相关对象
|
||||
|
||||
### chapter 卡
|
||||
|
||||
#### `title`
|
||||
|
||||
- 主线第一幕标题
|
||||
|
||||
#### `subtitle`
|
||||
|
||||
- 开幕目标
|
||||
|
||||
#### `summary`
|
||||
|
||||
- 第一幕承诺、角色、地点与理解变化
|
||||
|
||||
## 8.4 卡片详情要求
|
||||
|
||||
第三阶段卡片详情必须支持读取,但不要求直接编辑。
|
||||
|
||||
卡片详情统一结构:
|
||||
|
||||
```ts
|
||||
interface CustomWorldDraftCardDetail {
|
||||
id: string;
|
||||
kind: CustomWorldDraftCardKind;
|
||||
title: string;
|
||||
sections: Array<{
|
||||
id: string;
|
||||
label: string;
|
||||
value: string;
|
||||
}>;
|
||||
linkedIds: string[];
|
||||
locked: false;
|
||||
warningMessages: string[];
|
||||
}
|
||||
```
|
||||
|
||||
### 详情 section 最少要求
|
||||
|
||||
#### world
|
||||
|
||||
1. 世界一句话
|
||||
2. 玩家是谁
|
||||
3. 核心冲突
|
||||
4. 世界气质
|
||||
|
||||
#### faction
|
||||
|
||||
1. 势力定位
|
||||
2. 公开目标
|
||||
3. 冲突关系
|
||||
|
||||
#### character
|
||||
|
||||
1. 外显身份
|
||||
2. 当前压力
|
||||
3. 关系钩子
|
||||
4. 关联线程
|
||||
|
||||
#### landmark
|
||||
|
||||
1. 地点定位
|
||||
2. 场景情绪
|
||||
3. 关联角色
|
||||
4. 关联线程
|
||||
|
||||
#### thread
|
||||
|
||||
1. 线程类型
|
||||
2. 冲突内容
|
||||
3. 相关对象
|
||||
|
||||
#### chapter
|
||||
|
||||
1. 开幕事件
|
||||
2. 玩家目标
|
||||
3. 第一批角色
|
||||
4. 第一批地点
|
||||
5. 第一幕理解变化
|
||||
|
||||
---
|
||||
|
||||
## 9. 数据结构落地方案
|
||||
|
||||
## 9.1 扩展 `CustomWorldDraftCardSummary`
|
||||
|
||||
第三阶段必须把 `draftCards` 从空数组变成稳定可渲染的数据。
|
||||
|
||||
如果需要补字段,优先只补:
|
||||
|
||||
```ts
|
||||
kind
|
||||
title
|
||||
subtitle
|
||||
summary
|
||||
status
|
||||
linkedIds
|
||||
warningCount
|
||||
```
|
||||
|
||||
不额外加复杂 UI 字段。
|
||||
|
||||
## 9.2 扩展 `draftProfile`
|
||||
|
||||
第三阶段的 `draftProfile` 必须第一次真正有内容。
|
||||
|
||||
建议结构仍然复用现有 `CustomWorldProfile` 方向,但允许为“草稿版”:
|
||||
|
||||
```ts
|
||||
type CustomWorldFoundationDraftProfile = {
|
||||
name: string;
|
||||
subtitle: string;
|
||||
summary: string;
|
||||
tone: string;
|
||||
playerGoal: string;
|
||||
majorFactions: string[];
|
||||
coreConflicts: string[];
|
||||
playableNpcs: CustomWorldPlayableNpc[];
|
||||
storyNpcs: CustomWorldNpc[];
|
||||
landmarks: CustomWorldLandmark[];
|
||||
camp?: CustomWorldCampScene | null;
|
||||
themePack?: ThemePack | null;
|
||||
storyGraph?: WorldStoryGraph | null;
|
||||
};
|
||||
```
|
||||
|
||||
### 第三阶段限制
|
||||
|
||||
1. `items` 允许为空
|
||||
2. `knowledgeFacts / threadContracts` 允许为空
|
||||
3. `playableNpcs / storyNpcs / landmarks` 只要求第一批关键对象,不要求长尾完整
|
||||
|
||||
## 9.3 扩展 `CustomWorldWorkSummary`
|
||||
|
||||
第三阶段创作页面卡片应进一步升级:
|
||||
|
||||
### 草稿卡显示
|
||||
|
||||
1. `playableNpcCount`
|
||||
2. `landmarkCount`
|
||||
3. `stageLabel`
|
||||
4. `summary`
|
||||
|
||||
必须来自新的 foundation draft,而不只是 intent。
|
||||
|
||||
## 9.4 新增 foundation draft operation detail
|
||||
|
||||
建议新增:
|
||||
|
||||
```ts
|
||||
interface CustomWorldFoundationDraftResult {
|
||||
draftProfile: CustomWorldFoundationDraftProfile;
|
||||
draftCards: CustomWorldDraftCardSummary[];
|
||||
}
|
||||
```
|
||||
|
||||
供 orchestrator 内部使用,不一定要单独暴露给前端接口。
|
||||
|
||||
---
|
||||
|
||||
## 10. 服务端实现方案
|
||||
|
||||
## 10.1 新增 `customWorldAgentFoundationDraftService.ts`
|
||||
|
||||
### 文件
|
||||
|
||||
`server-node/src/services/customWorldAgentFoundationDraftService.ts`
|
||||
|
||||
### 职责
|
||||
|
||||
输入:
|
||||
|
||||
1. `creatorIntent`
|
||||
2. `anchorPack`
|
||||
|
||||
输出:
|
||||
|
||||
```ts
|
||||
CustomWorldFoundationDraftResult
|
||||
```
|
||||
|
||||
### 实现原则
|
||||
|
||||
优先复用已有能力:
|
||||
|
||||
1. `src/services/customWorld.ts`
|
||||
2. `src/services/customWorldBuilder.ts`
|
||||
3. 当前自定义世界生成链中已有的 framework / themePack / storyGraph 方向
|
||||
|
||||
但第三阶段不能直接照搬旧全量生成链。
|
||||
|
||||
### 第三阶段推荐生成顺序
|
||||
|
||||
```text
|
||||
creatorIntent
|
||||
-> anchorPack
|
||||
-> foundation framework
|
||||
-> themePack
|
||||
-> storyGraph(mini)
|
||||
-> key character seeds
|
||||
-> key landmark seeds
|
||||
-> first-act chapter draft
|
||||
-> foundation draft profile
|
||||
```
|
||||
|
||||
### 第三阶段数量要求
|
||||
|
||||
#### 势力
|
||||
|
||||
- 目标:`2~4`
|
||||
|
||||
#### 关键角色
|
||||
|
||||
- 目标:`3~5`
|
||||
|
||||
#### 关键地点
|
||||
|
||||
- 目标:`4~6`
|
||||
|
||||
#### 线程
|
||||
|
||||
- 目标:`3~5`
|
||||
|
||||
#### 主线第一幕
|
||||
|
||||
- 固定 `1` 张 chapter 卡
|
||||
|
||||
## 10.2 新增 `customWorldAgentDraftCompiler.ts`
|
||||
|
||||
### 文件
|
||||
|
||||
`server-node/src/services/customWorldAgentDraftCompiler.ts`
|
||||
|
||||
### 职责
|
||||
|
||||
负责把 foundation draft profile 编译成:
|
||||
|
||||
1. `draftCards`
|
||||
2. `card detail`
|
||||
3. 前端可直接消费的摘要
|
||||
|
||||
### 第一优先输出
|
||||
|
||||
1. `compileDraftCards(profile)`
|
||||
2. `getDraftCardDetail(profile, cardId)`
|
||||
|
||||
### 规则
|
||||
|
||||
1. 前端不自己把 profile 拼成卡片
|
||||
2. 全部卡片摘要与详情都由后端编译
|
||||
|
||||
## 10.3 修改 `customWorldAgentOrchestrator.ts`
|
||||
|
||||
第三阶段要把:
|
||||
|
||||
```ts
|
||||
draft_foundation
|
||||
```
|
||||
|
||||
从占位动作变成真实动作。
|
||||
|
||||
### 新职责
|
||||
|
||||
1. 校验当前 session 是否处于 `foundation_review`
|
||||
2. 调用 `customWorldAgentFoundationDraftService`
|
||||
3. 调用 `customWorldAgentDraftCompiler`
|
||||
4. 更新 `draftProfile`
|
||||
5. 更新 `draftCards`
|
||||
6. 更新 `suggestedActions`
|
||||
7. 写入 assistant summary message
|
||||
8. 写入 checkpoint
|
||||
|
||||
### assistant 回复要求
|
||||
|
||||
生成底稿后,assistant 回复必须至少包含:
|
||||
|
||||
1. 已经整理出的世界总纲
|
||||
2. 当前第一批关键角色 / 地点 / 势力数量
|
||||
3. 推荐用户先看哪一张卡
|
||||
|
||||
### session 阶段更新
|
||||
|
||||
第三阶段完成后,session 默认进入:
|
||||
|
||||
```ts
|
||||
object_refining
|
||||
```
|
||||
|
||||
原因:
|
||||
|
||||
底稿生成后,用户就进入“精修对象”的前置阶段。
|
||||
|
||||
## 10.4 修改 `customWorldWorkSummaryService.ts`
|
||||
|
||||
第三阶段它必须优先读取:
|
||||
|
||||
1. `draftProfile.name`
|
||||
2. `draftProfile.summary`
|
||||
3. `draftProfile.landmarks.length`
|
||||
4. `draftProfile.playableNpcs.length`
|
||||
|
||||
用于创作页面作品卡展示。
|
||||
|
||||
如果 `draftProfile` 为空,才回退到第二阶段基于 `creatorIntent` 的摘要。
|
||||
|
||||
---
|
||||
|
||||
## 11. 前端实现方案
|
||||
|
||||
## 11.1 修改 `CustomWorldAgentQuickActions.tsx`
|
||||
|
||||
第三阶段必须让:
|
||||
|
||||
```ts
|
||||
draft_foundation
|
||||
```
|
||||
|
||||
成为真实可点击动作。
|
||||
|
||||
### 显示条件
|
||||
|
||||
仅当:
|
||||
|
||||
1. `session.stage === 'foundation_review'`
|
||||
2. `creatorIntentReadiness.isReady === true`
|
||||
|
||||
时显示:
|
||||
|
||||
- `整理一版世界底稿`
|
||||
|
||||
## 11.2 修改 `CustomWorldAgentDraftDrawer.tsx`
|
||||
|
||||
第三阶段起,它不再只是空抽屉。
|
||||
|
||||
### 展示要求
|
||||
|
||||
1. 按 kind 分组展示
|
||||
2. world 卡固定置顶
|
||||
3. chapter 卡单独展示
|
||||
4. 其余卡片按 kind 分组
|
||||
|
||||
### 分组顺序建议
|
||||
|
||||
1. `world`
|
||||
2. `chapter`
|
||||
3. `thread`
|
||||
4. `faction`
|
||||
5. `character`
|
||||
6. `landmark`
|
||||
7. `camp`
|
||||
|
||||
## 11.3 新增 `CustomWorldAgentDraftDetailPanel.tsx`
|
||||
|
||||
### 职责
|
||||
|
||||
在第三阶段中,detail panel 是第一次真正有内容的右侧详情区。
|
||||
|
||||
### props
|
||||
|
||||
```ts
|
||||
{
|
||||
detail: CustomWorldDraftCardDetail | null;
|
||||
loading: boolean;
|
||||
onClose: () => void;
|
||||
}
|
||||
```
|
||||
|
||||
### 第一版显示
|
||||
|
||||
1. 标题
|
||||
2. kind 标签
|
||||
3. sections 列表
|
||||
4. linkedIds 数量提示
|
||||
5. warningMessages
|
||||
|
||||
### 第一版明确不做
|
||||
|
||||
1. 不在 detail panel 里直接编辑
|
||||
2. 不在这里加锁
|
||||
|
||||
## 11.4 修改 `CustomWorldAgentWorkspace.tsx`
|
||||
|
||||
第三阶段它必须支持:
|
||||
|
||||
1. 点击某张 draft card
|
||||
2. 请求 card detail
|
||||
3. 在右侧打开 detail panel
|
||||
|
||||
### 状态新增
|
||||
|
||||
```ts
|
||||
activeCardId?: string | null;
|
||||
activeCardDetail?: CustomWorldDraftCardDetail | null;
|
||||
isCardDetailLoading: boolean;
|
||||
```
|
||||
|
||||
## 11.5 修改 `CustomWorldCreationHub.tsx`
|
||||
|
||||
第三阶段创作页面草稿卡要更像一个作品。
|
||||
|
||||
要求:
|
||||
|
||||
1. 标题优先读 `draftProfile.name`
|
||||
2. 摘要优先读 `draftProfile.summary`
|
||||
3. 卡片上显示:
|
||||
- 可扮演角色数量
|
||||
- 地点数量
|
||||
- 当前阶段标签
|
||||
|
||||
---
|
||||
|
||||
## 12. 接口与交互时序
|
||||
|
||||
## 12.1 生成底稿时序
|
||||
|
||||
```text
|
||||
用户点击“整理一版世界底稿”
|
||||
-> 前端 POST /actions { action: draft_foundation }
|
||||
-> 服务端创建 operation
|
||||
-> 服务端生成 foundation draft
|
||||
-> 服务端编译 draftCards
|
||||
-> 服务端更新 snapshot
|
||||
-> 服务端写入 assistant summary
|
||||
-> operation completed
|
||||
-> 前端轮询结束
|
||||
-> 前端刷新 snapshot
|
||||
```
|
||||
|
||||
## 12.2 查看卡片详情时序
|
||||
|
||||
```text
|
||||
用户点击某张草稿卡
|
||||
-> 前端 GET /cards/:cardId
|
||||
-> 服务端编译 detail
|
||||
-> 前端展示 detail panel
|
||||
```
|
||||
|
||||
## 12.3 创作页面同步时序
|
||||
|
||||
```text
|
||||
底稿生成完成
|
||||
-> 用户返回创作页面
|
||||
-> 前端 GET /custom-world/works
|
||||
-> 服务端返回更新后的 work summary
|
||||
-> 草稿卡显示新的标题、摘要和数量
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 13. 与第二阶段的兼容要求
|
||||
|
||||
## 13.1 只对 ready session 开放
|
||||
|
||||
若:
|
||||
|
||||
```ts
|
||||
creatorIntentReadiness.isReady === false
|
||||
```
|
||||
|
||||
则:
|
||||
|
||||
- `draft_foundation` 不允许执行
|
||||
- 前端不显示该快捷动作
|
||||
|
||||
## 13.2 兼容旧 session
|
||||
|
||||
如果 session 是第二阶段前创建的,且:
|
||||
|
||||
1. 没有 `draftProfile`
|
||||
2. 没有 `draftCards`
|
||||
|
||||
则:
|
||||
|
||||
- 允许读到空数组和空对象
|
||||
- 不允许报错
|
||||
|
||||
---
|
||||
|
||||
## 14. 落地文件清单
|
||||
|
||||
## 14.1 shared
|
||||
|
||||
必须修改:
|
||||
|
||||
1. `packages/shared/src/contracts/customWorldAgent.ts`
|
||||
|
||||
## 14.2 frontend
|
||||
|
||||
必须新增:
|
||||
|
||||
1. `src/components/custom-world-agent/CustomWorldAgentDraftDetailPanel.tsx`
|
||||
2. `src/components/custom-world-agent/CustomWorldDraftCardDetailModal.tsx`
|
||||
|
||||
必须修改:
|
||||
|
||||
1. `src/components/custom-world-home/CustomWorldCreationHub.tsx`
|
||||
2. `src/components/custom-world-agent/CustomWorldAgentWorkspace.tsx`
|
||||
3. `src/components/custom-world-agent/CustomWorldAgentDraftDrawer.tsx`
|
||||
4. `src/components/custom-world-agent/CustomWorldAgentQuickActions.tsx`
|
||||
5. `src/services/aiService.ts`
|
||||
|
||||
## 14.3 backend
|
||||
|
||||
必须新增:
|
||||
|
||||
1. `server-node/src/services/customWorldAgentFoundationDraftService.ts`
|
||||
2. `server-node/src/services/customWorldAgentDraftCompiler.ts`
|
||||
|
||||
必须修改:
|
||||
|
||||
1. `server-node/src/services/customWorldAgentOrchestrator.ts`
|
||||
2. `server-node/src/services/customWorldAgentSessionStore.ts`
|
||||
3. `server-node/src/services/customWorldWorkSummaryService.ts`
|
||||
4. `server-node/src/routes/customWorldAgent.ts`
|
||||
|
||||
---
|
||||
|
||||
## 15. 测试要求
|
||||
|
||||
## 15.1 服务端测试
|
||||
|
||||
至少要补:
|
||||
|
||||
1. ready session 能成功执行 `draft_foundation`
|
||||
2. not-ready session 会拒绝执行 `draft_foundation`
|
||||
3. foundation draft 生成后 `draftProfile` 非空
|
||||
4. foundation draft 生成后 `draftCards` 非空
|
||||
5. `GET /cards/:cardId` 能返回正确详情
|
||||
|
||||
## 15.2 前端测试
|
||||
|
||||
至少要补:
|
||||
|
||||
1. foundation_review 阶段能显示“整理一版世界底稿”
|
||||
2. draftCards 生效后 drawer 可以正常展示
|
||||
3. 点击卡片后 detail panel 能正常展示
|
||||
4. 返回创作页面后草稿卡摘要会更新
|
||||
|
||||
## 15.3 手工回归
|
||||
|
||||
至少走这 4 条:
|
||||
|
||||
1. 用第二阶段已就绪的 session 生成底稿
|
||||
2. 查看 world / faction / character / landmark / chapter 卡
|
||||
3. 刷新页面后草稿卡仍在
|
||||
4. 返回创作页面后草稿摘要明显变化
|
||||
|
||||
---
|
||||
|
||||
## 16. 第三阶段验收标准
|
||||
|
||||
做到以下几点,才算第三阶段真正完成:
|
||||
|
||||
1. `draft_foundation` 已经从占位动作变成真实动作。
|
||||
2. 用户第一次可以在工作区里看到一组真实世界草稿卡。
|
||||
3. 草稿卡覆盖世界、势力、角色、地点、线程和第一幕。
|
||||
4. 草稿卡详情可以查看。
|
||||
5. 创作页面中的草稿卡第一次看起来像一个“世界作品”,而不只是对话 session。
|
||||
6. 第三阶段仍然不越界去做锁定、资产工坊或发布逻辑。
|
||||
|
||||
---
|
||||
|
||||
## 17. 一句话结论
|
||||
|
||||
第三阶段最重要的不是“继续问更多问题”,而是:
|
||||
|
||||
**先把已经收集到的锚点,变成一版真能看的世界底稿。**
|
||||
@@ -0,0 +1,943 @@
|
||||
# AI 原生 Agent-First 自定义世界创作工具第四阶段技术落地方案
|
||||
|
||||
更新时间:`2026-04-14`
|
||||
|
||||
## 0. 文档目的
|
||||
|
||||
这份文档用于把以下几份文档进一步收束成第四阶段实现方案:
|
||||
|
||||
- [AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PRD_2026-04-12.md](./AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PRD_2026-04-12.md)
|
||||
- [AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PHASE1_IMPLEMENTATION_PLAN_2026-04-13.md](./AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PHASE1_IMPLEMENTATION_PLAN_2026-04-13.md)
|
||||
- [AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PHASE2_IMPLEMENTATION_PLAN_2026-04-13.md](./AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PHASE2_IMPLEMENTATION_PLAN_2026-04-13.md)
|
||||
- [AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PHASE3_IMPLEMENTATION_PLAN_2026-04-14.md](./AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PHASE3_IMPLEMENTATION_PLAN_2026-04-14.md)
|
||||
|
||||
如果说第三阶段的目标是:
|
||||
|
||||
**把已经收集好的创作锚点编译成第一版世界底稿**
|
||||
|
||||
那么第四阶段的目标就是:
|
||||
|
||||
**让创作者直接修改这版草稿设定,并且继续用 AI 为这版草稿扩出新的角色和场景。**
|
||||
|
||||
一句话定义:
|
||||
|
||||
**第四阶段把“世界已经长出来”升级成“世界开始可编辑、可继续长新内容”。**
|
||||
|
||||
---
|
||||
|
||||
## 1. 阶段衔接关系
|
||||
|
||||
## 1.1 第三阶段已经完成什么
|
||||
|
||||
第四阶段默认建立在第三阶段已经完成的能力之上:
|
||||
|
||||
1. session 已进入 `object_refining`
|
||||
2. `draftProfile` 已经非空
|
||||
3. `draftCards` 已经非空
|
||||
4. 工作区可以展示世界、势力、角色、地点、线程和第一幕卡片
|
||||
5. 用户可以查看卡片详情
|
||||
6. 创作页面草稿卡已经能显示更像作品的标题、摘要与对象数量
|
||||
|
||||
## 1.2 第四阶段不再重做什么
|
||||
|
||||
以下内容第四阶段不重做:
|
||||
|
||||
1. 不重做最小锚点收集
|
||||
2. 不重做 foundation draft 生成主链
|
||||
3. 不重做基础 draftCards 编译
|
||||
4. 不重做创作页面和工作区壳层
|
||||
|
||||
第四阶段只继续补:
|
||||
|
||||
1. 草稿设定编辑
|
||||
2. 编辑后的草稿对象写回
|
||||
3. 新增角色的 AI 生成
|
||||
4. 新增场景的 AI 生成
|
||||
5. 新卡片插入与摘要重编译
|
||||
6. assistant 变更总结与 checkpoint
|
||||
|
||||
---
|
||||
|
||||
## 2. 第四阶段在八阶段中的位置
|
||||
|
||||
八阶段拆分如下:
|
||||
|
||||
1. 阶段 1:创作页面入口、Agent 会话主链与工作区骨架
|
||||
2. 阶段 2:最小锚点收集与澄清流程
|
||||
3. 阶段 3:世界底稿生成与草稿卡编译
|
||||
4. 阶段 4:草稿设定编辑与 AI 新增角色/场景生成
|
||||
5. 阶段 5:角色主图与动作资产工坊接入
|
||||
6. 阶段 6:场景背景图工坊接入
|
||||
7. 阶段 7:长尾内容扩展与自动补齐
|
||||
8. 阶段 8:发布、世界库接入与继续创作恢复
|
||||
|
||||
本文件只覆盖:
|
||||
|
||||
**阶段 4:草稿设定编辑与 AI 新增角色/场景生成**
|
||||
|
||||
---
|
||||
|
||||
## 3. 第四阶段目标
|
||||
|
||||
第四阶段只做 7 件必须一起成立的事:
|
||||
|
||||
1. 用户可以直接修改 draft card 中的可编辑设定字段
|
||||
2. 编辑后的内容会稳定写回 `draftProfile`
|
||||
3. 写回后 `draftCards` 摘要会同步更新
|
||||
4. 用户可以让 AI 新增角色
|
||||
5. 用户可以让 AI 新增场景
|
||||
6. 新生成的角色和场景会插入 `draftProfile` 并出现为新的 `draftCards`
|
||||
7. 每次编辑或新增后,系统都要写入 assistant 变更摘要和 checkpoint
|
||||
|
||||
一句话目标:
|
||||
|
||||
**让第四阶段结束时,创作者第一次能像在真正做作品一样修改草稿、继续长出新对象。**
|
||||
|
||||
---
|
||||
|
||||
## 4. 第四阶段完成定义
|
||||
|
||||
第四阶段完成后,必须同时满足以下结果:
|
||||
|
||||
1. 用户可以在 world / faction / character / landmark / thread / chapter 卡详情中进入编辑模式。
|
||||
2. 用户保存编辑后,`draftProfile` 会真实变化,而不是只改前端显示。
|
||||
3. 保存后,对应 `draftCards` 的标题、副标题、摘要会更新。
|
||||
4. 用户可以通过 AI 生成 `1~3` 个新角色卡。
|
||||
5. 用户可以通过 AI 生成 `1~3` 个新场景卡。
|
||||
6. 新角色卡和新场景卡插入后,draft drawer 能立即看到新增对象。
|
||||
7. 创作页面里的草稿作品卡数量统计会同步增加。
|
||||
8. 第四阶段仍然不要求做视觉资产工坊、长尾扩展和发布。
|
||||
|
||||
---
|
||||
|
||||
## 5. 范围控制
|
||||
|
||||
## 5.1 第四阶段纳入范围
|
||||
|
||||
纳入范围的模块:
|
||||
|
||||
- `packages/shared/src/contracts/customWorldAgent.ts`
|
||||
- `src/components/custom-world-home/CustomWorldCreationHub.tsx`
|
||||
- `src/components/custom-world-agent/CustomWorldAgentWorkspace.tsx`
|
||||
- `src/components/custom-world-agent/CustomWorldAgentDraftDrawer.tsx`
|
||||
- `src/components/custom-world-agent/CustomWorldAgentDraftDetailPanel.tsx`
|
||||
- `src/components/custom-world-agent/CustomWorldAgentQuickActions.tsx`
|
||||
- `src/services/aiService.ts`
|
||||
- `server-node/src/services/customWorldAgentSessionStore.ts`
|
||||
- `server-node/src/services/customWorldAgentOrchestrator.ts`
|
||||
- `server-node/src/services/customWorldAgentDraftCompiler.ts`
|
||||
- `server-node/src/services/customWorldWorkSummaryService.ts`
|
||||
|
||||
新增前端模块:
|
||||
|
||||
- `src/components/custom-world-agent/CustomWorldDraftEditPanel.tsx`
|
||||
- `src/components/custom-world-agent/CustomWorldGenerateEntityModal.tsx`
|
||||
|
||||
新增服务端模块:
|
||||
|
||||
- `server-node/src/services/customWorldAgentDraftEditService.ts`
|
||||
- `server-node/src/services/customWorldAgentEntityGenerationService.ts`
|
||||
- `server-node/src/services/customWorldAgentChangeSummaryService.ts`
|
||||
|
||||
## 5.2 第四阶段明确不做
|
||||
|
||||
以下内容不放进第四阶段:
|
||||
|
||||
1. 不做锁定
|
||||
2. 不做局部重生成
|
||||
3. 不做角色主图与动作资产工坊接入
|
||||
4. 不做场景图工坊接入
|
||||
5. 不做长尾内容自动补齐
|
||||
6. 不做发布
|
||||
|
||||
原因:
|
||||
|
||||
**第四阶段只解决“这版底稿怎么继续被编辑和扩展”的问题。**
|
||||
|
||||
---
|
||||
|
||||
## 6. 第四阶段最小闭环
|
||||
|
||||
建议把第四阶段的最小闭环定义为:
|
||||
|
||||
```text
|
||||
第三阶段已有 foundation draft
|
||||
-> 用户打开某张角色卡
|
||||
-> 修改角色压力与关系描述
|
||||
-> 保存
|
||||
-> draftProfile 更新
|
||||
-> 对应 draftCard 摘要更新
|
||||
-> 用户点击“新增角色”
|
||||
-> AI 生成 2 个新角色
|
||||
-> draftProfile.storyNpcs 增加
|
||||
-> 新角色卡出现在 drawer
|
||||
-> 创作页面草稿卡数量同步增加
|
||||
```
|
||||
|
||||
这个闭环里,先只强接两条高价值链路:
|
||||
|
||||
1. `draftCard -> draftProfile 编辑`
|
||||
2. `AI 新增对象 -> draftProfile 扩展`
|
||||
|
||||
---
|
||||
|
||||
## 7. 第四阶段产品行为定义
|
||||
|
||||
## 7.1 可编辑的卡片类型
|
||||
|
||||
第四阶段允许直接编辑这些卡片:
|
||||
|
||||
1. `world`
|
||||
2. `faction`
|
||||
3. `character`
|
||||
4. `landmark`
|
||||
5. `thread`
|
||||
6. `chapter`
|
||||
7. `camp`
|
||||
|
||||
## 7.2 编辑模式规则
|
||||
|
||||
第四阶段采用:
|
||||
|
||||
**卡片详情内编辑**
|
||||
|
||||
不采用:
|
||||
|
||||
1. 大型全局表单
|
||||
2. 多卡同时编辑
|
||||
3. 独立复杂后台编辑器
|
||||
|
||||
### 编辑流程
|
||||
|
||||
```text
|
||||
打开卡片详情
|
||||
-> 点击“编辑设定”
|
||||
-> 进入编辑模式
|
||||
-> 修改字段
|
||||
-> 点击保存
|
||||
-> 写回 draftProfile
|
||||
-> 重编译 draftCards
|
||||
-> 写入 assistant action_result
|
||||
```
|
||||
|
||||
### 取消规则
|
||||
|
||||
用户点击取消后:
|
||||
|
||||
1. 丢弃本次未保存草稿
|
||||
2. 回到只读详情模式
|
||||
|
||||
## 7.3 各卡片可编辑字段
|
||||
|
||||
为了避免实现漂移,第四阶段明确限定每种卡的可编辑字段。
|
||||
|
||||
### `world`
|
||||
|
||||
允许编辑:
|
||||
|
||||
1. `title`
|
||||
2. `subtitle`
|
||||
3. `summary`
|
||||
4. `playerGoal`
|
||||
5. `tone`
|
||||
6. `coreConflicts`
|
||||
|
||||
### `faction`
|
||||
|
||||
允许编辑:
|
||||
|
||||
1. `title`
|
||||
2. `subtitle`
|
||||
3. `summary`
|
||||
4. `publicGoal`
|
||||
5. `tension`
|
||||
|
||||
### `character`
|
||||
|
||||
允许编辑:
|
||||
|
||||
1. `name`
|
||||
2. `role`
|
||||
3. `publicMask`
|
||||
4. `hiddenHook`
|
||||
5. `relationToPlayer`
|
||||
6. `summary`
|
||||
|
||||
### `landmark`
|
||||
|
||||
允许编辑:
|
||||
|
||||
1. `name`
|
||||
2. `purpose`
|
||||
3. `mood`
|
||||
4. `secret`
|
||||
5. `summary`
|
||||
|
||||
### `thread`
|
||||
|
||||
允许编辑:
|
||||
|
||||
1. `title`
|
||||
2. `summary`
|
||||
3. `conflictType`
|
||||
4. `stakes`
|
||||
|
||||
### `chapter`
|
||||
|
||||
允许编辑:
|
||||
|
||||
1. `title`
|
||||
2. `summary`
|
||||
3. `openingEvent`
|
||||
4. `playerGoal`
|
||||
5. `understandingShift`
|
||||
|
||||
### `camp`
|
||||
|
||||
允许编辑:
|
||||
|
||||
1. `name`
|
||||
2. `description`
|
||||
3. `dangerLevel`
|
||||
|
||||
## 7.4 第四阶段不允许编辑的内容
|
||||
|
||||
为控制范围,以下内容第四阶段不开放:
|
||||
|
||||
1. 技能
|
||||
2. 初始物品
|
||||
3. 场景连接网络
|
||||
4. sceneNpcIds
|
||||
5. 背景章节分段
|
||||
6. 视觉资产引用
|
||||
|
||||
这些内容留给后续阶段。
|
||||
|
||||
## 7.5 AI 新增角色
|
||||
|
||||
第四阶段要支持:
|
||||
|
||||
```text
|
||||
新增角色
|
||||
```
|
||||
|
||||
### 目标对象
|
||||
|
||||
默认新增:
|
||||
|
||||
1. `storyNpcs`
|
||||
|
||||
说明:
|
||||
|
||||
第四阶段不默认新增 `playableNpcs`,避免过早引入玩家入口角色平衡问题。
|
||||
|
||||
### 输入
|
||||
|
||||
用户可以提供:
|
||||
|
||||
1. 一句话要求
|
||||
2. 角色数量
|
||||
3. 可选参考卡片
|
||||
|
||||
### 数量限制
|
||||
|
||||
每次允许:
|
||||
|
||||
1. `1~3` 个角色
|
||||
|
||||
### 必须生成的字段
|
||||
|
||||
每个新角色至少要带:
|
||||
|
||||
1. `id`
|
||||
2. `name`
|
||||
3. `role`
|
||||
4. `publicMask`
|
||||
5. `hiddenHook`
|
||||
6. `relationToPlayer`
|
||||
7. `summary`
|
||||
|
||||
### 插入规则
|
||||
|
||||
生成后:
|
||||
|
||||
1. 写入 `draftProfile.storyNpcs`
|
||||
2. 重新编译 `character` 类 draftCards
|
||||
3. 在 drawer 中显示
|
||||
|
||||
## 7.6 AI 新增场景
|
||||
|
||||
第四阶段要支持:
|
||||
|
||||
```text
|
||||
新增场景
|
||||
```
|
||||
|
||||
### 目标对象
|
||||
|
||||
默认新增:
|
||||
|
||||
1. `landmarks`
|
||||
|
||||
### 输入
|
||||
|
||||
用户可以提供:
|
||||
|
||||
1. 一句话要求
|
||||
2. 场景数量
|
||||
3. 可选参考线程 / 角色 / 势力
|
||||
|
||||
### 数量限制
|
||||
|
||||
每次允许:
|
||||
|
||||
1. `1~3` 个场景
|
||||
|
||||
### 必须生成的字段
|
||||
|
||||
每个新场景至少要带:
|
||||
|
||||
1. `id`
|
||||
2. `name`
|
||||
3. `description` 或 `summary`
|
||||
4. `dangerLevel`
|
||||
5. `purpose`
|
||||
6. `mood`
|
||||
|
||||
### 插入规则
|
||||
|
||||
生成后:
|
||||
|
||||
1. 写入 `draftProfile.landmarks`
|
||||
2. 重新编译 `landmark` 类 draftCards
|
||||
3. 在 drawer 中显示
|
||||
|
||||
## 7.7 新增对象的归类规则
|
||||
|
||||
为了避免新增对象漂移,第四阶段新增对象必须绑定至少一个已有语义锚点:
|
||||
|
||||
### 新角色至少要绑定一个:
|
||||
|
||||
1. 线程
|
||||
2. 势力
|
||||
3. 玩家关系
|
||||
|
||||
### 新场景至少要绑定一个:
|
||||
|
||||
1. 线程
|
||||
2. 角色
|
||||
3. 势力
|
||||
|
||||
如果 AI 生成结果无法绑定任何现有锚点,则:
|
||||
|
||||
1. 允许生成
|
||||
2. 但卡片标记为 `warning`
|
||||
|
||||
---
|
||||
|
||||
## 8. 数据结构落地方案
|
||||
|
||||
## 8.1 扩展 `CustomWorldAgentActionRequest`
|
||||
|
||||
第四阶段必须正式启用以下 action:
|
||||
|
||||
```ts
|
||||
| {
|
||||
action: 'update_draft_card';
|
||||
cardId: string;
|
||||
sections: Array<{
|
||||
sectionId: string;
|
||||
value: string;
|
||||
}>;
|
||||
}
|
||||
| {
|
||||
action: 'generate_characters';
|
||||
count: number;
|
||||
promptText?: string | null;
|
||||
anchorCardIds?: string[];
|
||||
}
|
||||
| {
|
||||
action: 'generate_landmarks';
|
||||
count: number;
|
||||
promptText?: string | null;
|
||||
anchorCardIds?: string[];
|
||||
}
|
||||
```
|
||||
|
||||
### 第一版限制
|
||||
|
||||
1. `count` 只能是 `1~3`
|
||||
2. `anchorCardIds` 可选
|
||||
3. `sections` 不能为空
|
||||
|
||||
## 8.2 扩展 `CustomWorldAgentOperationType`
|
||||
|
||||
第四阶段新增:
|
||||
|
||||
```ts
|
||||
| 'update_draft_card'
|
||||
| 'generate_characters'
|
||||
| 'generate_landmarks'
|
||||
```
|
||||
|
||||
## 8.3 扩展 `CustomWorldDraftCardDetail`
|
||||
|
||||
第四阶段开始,detail 里需要返回:
|
||||
|
||||
```ts
|
||||
editable: boolean;
|
||||
editableSectionIds: string[];
|
||||
```
|
||||
|
||||
### 规则
|
||||
|
||||
1. 第四阶段所有可编辑卡返回 `editable = true`
|
||||
2. 非可编辑卡返回 `editable = false`
|
||||
|
||||
## 8.4 `draftProfile` 写回规则
|
||||
|
||||
第四阶段的所有保存动作都必须最终落到 `draftProfile` 对应对象上。
|
||||
|
||||
不得:
|
||||
|
||||
1. 只改 `draftCards`
|
||||
2. 只改前端详情临时数据
|
||||
|
||||
顺序必须是:
|
||||
|
||||
```text
|
||||
update draftProfile
|
||||
-> recompile draftCards
|
||||
-> return snapshot
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. 服务端实现方案
|
||||
|
||||
## 9.1 新增 `customWorldAgentDraftEditService.ts`
|
||||
|
||||
### 文件
|
||||
|
||||
`server-node/src/services/customWorldAgentDraftEditService.ts`
|
||||
|
||||
### 职责
|
||||
|
||||
1. 校验 card 是否存在
|
||||
2. 校验 card 是否可编辑
|
||||
3. 校验 sectionId 是否允许编辑
|
||||
4. 把 section patch 写回对应对象
|
||||
5. 返回新的 `draftProfile`
|
||||
|
||||
### 导出函数建议
|
||||
|
||||
```ts
|
||||
updateDraftCardSections(params)
|
||||
```
|
||||
|
||||
### 输入
|
||||
|
||||
```ts
|
||||
type UpdateDraftCardSectionsParams = {
|
||||
draftProfile: Record<string, unknown>;
|
||||
cardId: string;
|
||||
sections: Array<{
|
||||
sectionId: string;
|
||||
value: string;
|
||||
}>;
|
||||
};
|
||||
```
|
||||
|
||||
## 9.2 新增 `customWorldAgentEntityGenerationService.ts`
|
||||
|
||||
### 文件
|
||||
|
||||
`server-node/src/services/customWorldAgentEntityGenerationService.ts`
|
||||
|
||||
### 职责
|
||||
|
||||
1. 生成新增角色
|
||||
2. 生成新增场景
|
||||
3. 把新增对象插入 `draftProfile`
|
||||
|
||||
### 导出函数建议
|
||||
|
||||
```ts
|
||||
generateAdditionalCharacters(params)
|
||||
generateAdditionalLandmarks(params)
|
||||
```
|
||||
|
||||
### 输入
|
||||
|
||||
必须包含:
|
||||
|
||||
1. `creatorIntent`
|
||||
2. `anchorPack`
|
||||
3. `draftProfile`
|
||||
4. `count`
|
||||
5. `promptText`
|
||||
6. `anchorCardIds`
|
||||
|
||||
### 生成原则
|
||||
|
||||
1. 只围绕当前已生成的 foundation draft 扩展
|
||||
2. 不能重做已有对象
|
||||
3. 不能直接扩成完整长尾
|
||||
|
||||
## 9.3 新增 `customWorldAgentChangeSummaryService.ts`
|
||||
|
||||
### 职责
|
||||
|
||||
每次编辑或新增对象后,生成一段简短变更摘要。
|
||||
|
||||
要求至少包含:
|
||||
|
||||
1. 改了什么卡 / 新增了什么对象
|
||||
2. 影响到哪些对象数量
|
||||
3. 下一步建议
|
||||
|
||||
## 9.4 修改 `customWorldAgentOrchestrator.ts`
|
||||
|
||||
第四阶段必须启用以下 action:
|
||||
|
||||
1. `update_draft_card`
|
||||
2. `generate_characters`
|
||||
3. `generate_landmarks`
|
||||
|
||||
### `update_draft_card` 流程
|
||||
|
||||
```text
|
||||
收到 update_draft_card
|
||||
-> 校验 cardId
|
||||
-> 调用 DraftEditService
|
||||
-> 更新 draftProfile
|
||||
-> 调用 DraftCompiler
|
||||
-> 更新 draftCards
|
||||
-> 写入 assistant action_result
|
||||
-> 写入 checkpoint
|
||||
-> operation completed
|
||||
```
|
||||
|
||||
### `generate_characters` 流程
|
||||
|
||||
```text
|
||||
收到 generate_characters
|
||||
-> 校验 count
|
||||
-> 调用 EntityGenerationService
|
||||
-> 更新 draftProfile.storyNpcs
|
||||
-> 调用 DraftCompiler
|
||||
-> 更新 draftCards
|
||||
-> 写入 assistant action_result
|
||||
-> 写入 checkpoint
|
||||
-> operation completed
|
||||
```
|
||||
|
||||
### `generate_landmarks` 流程
|
||||
|
||||
```text
|
||||
收到 generate_landmarks
|
||||
-> 校验 count
|
||||
-> 调用 EntityGenerationService
|
||||
-> 更新 draftProfile.landmarks
|
||||
-> 调用 DraftCompiler
|
||||
-> 更新 draftCards
|
||||
-> 写入 assistant action_result
|
||||
-> 写入 checkpoint
|
||||
-> operation completed
|
||||
```
|
||||
|
||||
## 9.5 修改 `customWorldAgentDraftCompiler.ts`
|
||||
|
||||
第四阶段它必须继续承担:
|
||||
|
||||
1. 根据新的 `draftProfile` 重编译摘要
|
||||
2. 对新增角色生成新的 character 卡
|
||||
3. 对新增场景生成新的 landmark 卡
|
||||
|
||||
### 第四阶段新增要求
|
||||
|
||||
对 detail 详情返回:
|
||||
|
||||
1. `editable`
|
||||
2. `editableSectionIds`
|
||||
|
||||
---
|
||||
|
||||
## 10. 前端实现方案
|
||||
|
||||
## 10.1 修改 `CustomWorldAgentDraftDetailPanel.tsx`
|
||||
|
||||
第四阶段它要从只读详情升级成:
|
||||
|
||||
1. 只读模式
|
||||
2. 编辑模式
|
||||
|
||||
### 新增动作
|
||||
|
||||
1. `编辑设定`
|
||||
2. `保存`
|
||||
3. `取消`
|
||||
4. `新增角色`
|
||||
5. `新增场景`
|
||||
|
||||
### 模式规则
|
||||
|
||||
#### 只读模式
|
||||
|
||||
显示:
|
||||
|
||||
1. sections
|
||||
2. 编辑设定按钮
|
||||
|
||||
#### 编辑模式
|
||||
|
||||
对 `editableSectionIds` 对应的 section 渲染输入框:
|
||||
|
||||
1. 短字段用 `input`
|
||||
2. 长字段用 `textarea`
|
||||
|
||||
## 10.2 新增 `CustomWorldDraftEditPanel.tsx`
|
||||
|
||||
### 职责
|
||||
|
||||
承接 detail panel 的编辑表单。
|
||||
|
||||
### props
|
||||
|
||||
```ts
|
||||
{
|
||||
detail: CustomWorldDraftCardDetail;
|
||||
onSave: (sections) => void;
|
||||
onCancel: () => void;
|
||||
}
|
||||
```
|
||||
|
||||
## 10.3 新增 `CustomWorldGenerateEntityModal.tsx`
|
||||
|
||||
### 职责
|
||||
|
||||
统一承接:
|
||||
|
||||
1. AI 新增角色
|
||||
2. AI 新增场景
|
||||
|
||||
### 模式
|
||||
|
||||
```ts
|
||||
mode: 'character' | 'landmark'
|
||||
```
|
||||
|
||||
### 字段
|
||||
|
||||
1. `count`
|
||||
2. `promptText`
|
||||
3. 当前参考卡提示
|
||||
|
||||
### 第一版限制
|
||||
|
||||
1. 不做复杂多选引用 UI
|
||||
2. `anchorCardIds` 可先默认使用当前焦点卡
|
||||
|
||||
## 10.4 修改 `CustomWorldAgentQuickActions.tsx`
|
||||
|
||||
第四阶段开始可以根据 session.stage 显示:
|
||||
|
||||
1. `新增角色`
|
||||
2. `新增场景`
|
||||
|
||||
说明:
|
||||
|
||||
这些只是快捷入口,本质仍然打开 modal 并走 action route。
|
||||
|
||||
## 10.5 修改 `CustomWorldAgentWorkspace.tsx`
|
||||
|
||||
第四阶段它要新增:
|
||||
|
||||
1. `editMode`
|
||||
2. `showGenerateEntityModal`
|
||||
3. `generateEntityMode`
|
||||
|
||||
同时要支持:
|
||||
|
||||
1. 打开详情并进入编辑
|
||||
2. 保存编辑
|
||||
3. 打开新增角色 modal
|
||||
4. 打开新增场景 modal
|
||||
|
||||
## 10.6 修改 `CustomWorldCreationHub.tsx`
|
||||
|
||||
第四阶段它必须支持作品摘要继续升级:
|
||||
|
||||
1. 新增角色后,数量变化
|
||||
2. 新增场景后,数量变化
|
||||
3. 编辑世界卡后,标题或摘要变化
|
||||
|
||||
---
|
||||
|
||||
## 11. 交互时序
|
||||
|
||||
## 11.1 编辑草稿设定
|
||||
|
||||
```text
|
||||
用户打开角色卡详情
|
||||
-> 点击编辑设定
|
||||
-> 修改字段
|
||||
-> 点击保存
|
||||
-> 前端 POST /actions { action: update_draft_card }
|
||||
-> 服务端更新 draftProfile
|
||||
-> 服务端重编译 draftCards
|
||||
-> 服务端写入变更摘要
|
||||
-> 前端刷新 snapshot
|
||||
```
|
||||
|
||||
## 11.2 AI 新增角色
|
||||
|
||||
```text
|
||||
用户点击新增角色
|
||||
-> 打开 generate modal
|
||||
-> 输入数量和补充描述
|
||||
-> 前端 POST /actions { action: generate_characters }
|
||||
-> 服务端新增角色
|
||||
-> 服务端更新 draftProfile.storyNpcs
|
||||
-> 服务端重编译 draftCards
|
||||
-> 前端刷新 snapshot
|
||||
```
|
||||
|
||||
## 11.3 AI 新增场景
|
||||
|
||||
```text
|
||||
用户点击新增场景
|
||||
-> 打开 generate modal
|
||||
-> 输入数量和补充描述
|
||||
-> 前端 POST /actions { action: generate_landmarks }
|
||||
-> 服务端新增场景
|
||||
-> 服务端更新 draftProfile.landmarks
|
||||
-> 服务端重编译 draftCards
|
||||
-> 前端刷新 snapshot
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 12. 与第三阶段的兼容要求
|
||||
|
||||
## 12.1 旧 draftCards 兼容
|
||||
|
||||
第三阶段生成的 card detail 如果没有:
|
||||
|
||||
```ts
|
||||
editable
|
||||
editableSectionIds
|
||||
```
|
||||
|
||||
服务端读取时应自动补:
|
||||
|
||||
```ts
|
||||
editable: true/false
|
||||
editableSectionIds: []
|
||||
```
|
||||
|
||||
## 12.2 旧 draftProfile 兼容
|
||||
|
||||
如果旧 draftProfile 缺少某些新增字段:
|
||||
|
||||
1. 编辑时允许 fallback
|
||||
2. 不允许因为字段缺失直接报错
|
||||
|
||||
## 12.3 新增角色/场景 ID 规则
|
||||
|
||||
新增对象时,必须使用稳定 id 生成规则,不能临时用数组下标。
|
||||
|
||||
---
|
||||
|
||||
## 13. 落地文件清单
|
||||
|
||||
## 13.1 shared
|
||||
|
||||
必须修改:
|
||||
|
||||
1. `packages/shared/src/contracts/customWorldAgent.ts`
|
||||
|
||||
## 13.2 frontend
|
||||
|
||||
必须新增:
|
||||
|
||||
1. `src/components/custom-world-agent/CustomWorldDraftEditPanel.tsx`
|
||||
2. `src/components/custom-world-agent/CustomWorldGenerateEntityModal.tsx`
|
||||
|
||||
必须修改:
|
||||
|
||||
1. `src/components/custom-world-agent/CustomWorldAgentWorkspace.tsx`
|
||||
2. `src/components/custom-world-agent/CustomWorldAgentDraftDetailPanel.tsx`
|
||||
3. `src/components/custom-world-agent/CustomWorldAgentQuickActions.tsx`
|
||||
4. `src/components/custom-world-home/CustomWorldCreationHub.tsx`
|
||||
5. `src/services/aiService.ts`
|
||||
|
||||
## 13.3 backend
|
||||
|
||||
必须新增:
|
||||
|
||||
1. `server-node/src/services/customWorldAgentDraftEditService.ts`
|
||||
2. `server-node/src/services/customWorldAgentEntityGenerationService.ts`
|
||||
3. `server-node/src/services/customWorldAgentChangeSummaryService.ts`
|
||||
|
||||
必须修改:
|
||||
|
||||
1. `server-node/src/services/customWorldAgentOrchestrator.ts`
|
||||
2. `server-node/src/services/customWorldAgentDraftCompiler.ts`
|
||||
3. `server-node/src/services/customWorldAgentSessionStore.ts`
|
||||
4. `server-node/src/routes/customWorldAgent.ts`
|
||||
|
||||
---
|
||||
|
||||
## 14. 测试要求
|
||||
|
||||
## 14.1 服务端测试
|
||||
|
||||
至少要补:
|
||||
|
||||
1. `update_draft_card` 能正确写回 draftProfile
|
||||
2. 写回后 draftCards 摘要会更新
|
||||
3. `generate_characters` 会新增 `storyNpcs` 并生成新的 character 卡
|
||||
4. `generate_landmarks` 会新增 `landmarks` 并生成新的 landmark 卡
|
||||
5. 每次编辑或新增后会写入 checkpoint
|
||||
|
||||
## 14.2 前端测试
|
||||
|
||||
至少要补:
|
||||
|
||||
1. detail panel 可以进入编辑模式
|
||||
2. 保存编辑会调用 action route
|
||||
3. 可以打开新增角色 modal
|
||||
4. 可以打开新增场景 modal
|
||||
5. 操作完成后 drawer 与创作页面摘要会更新
|
||||
|
||||
## 14.3 手工回归
|
||||
|
||||
至少走这 5 条:
|
||||
|
||||
1. 编辑世界总卡标题和摘要
|
||||
2. 编辑一张角色卡的压力与关系
|
||||
3. 新增 2 个角色
|
||||
4. 新增 2 个场景
|
||||
5. 返回创作页面确认数量与摘要变化
|
||||
|
||||
---
|
||||
|
||||
## 15. 第四阶段验收标准
|
||||
|
||||
做到以下几点,才算第四阶段真正完成:
|
||||
|
||||
1. 用户可以直接修改草稿中的设定。
|
||||
2. 修改后的内容会真正写回 draftProfile,而不是只改前端展示。
|
||||
3. 用户可以继续用 AI 新增角色和场景。
|
||||
4. 新增角色和场景会成为新的草稿卡。
|
||||
5. 创作页面草稿作品卡会同步反映这些变化。
|
||||
6. 第四阶段仍然不越界去做资产工坊、长尾扩展和发布。
|
||||
|
||||
---
|
||||
|
||||
## 16. 一句话结论
|
||||
|
||||
第四阶段最重要的不是“继续控制已有结果不动”,而是:
|
||||
|
||||
**让这版世界草稿开始具备真正的可编辑性和可扩展性。**
|
||||
@@ -0,0 +1,782 @@
|
||||
# AI 原生 Agent-First 自定义世界创作工具第五阶段技术落地方案
|
||||
|
||||
更新时间:`2026-04-14`
|
||||
|
||||
## 0. 文档目的
|
||||
|
||||
这份文档用于把以下几份文档进一步收束成第五阶段实现方案:
|
||||
|
||||
- [AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PRD_2026-04-12.md](./AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PRD_2026-04-12.md)
|
||||
- [AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PHASE3_IMPLEMENTATION_PLAN_2026-04-14.md](./AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PHASE3_IMPLEMENTATION_PLAN_2026-04-14.md)
|
||||
- [AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PHASE4_IMPLEMENTATION_PLAN_2026-04-14.md](./AI_NATIVE_AGENT_FIRST_CUSTOM_WORLD_CREATOR_PHASE4_IMPLEMENTATION_PLAN_2026-04-14.md)
|
||||
- [AI_CHARACTER_VISUAL_ANIMATION_MVP_PRD_2026-04-04.md](./AI_CHARACTER_VISUAL_ANIMATION_MVP_PRD_2026-04-04.md)
|
||||
|
||||
如果说第四阶段的目标是:
|
||||
|
||||
**让草稿世界变得可编辑、可继续长出新角色和新场景**
|
||||
|
||||
那么第五阶段的目标就是:
|
||||
|
||||
**把草稿里的角色第一次接上正式的主图与核心动作资产工坊。**
|
||||
|
||||
一句话定义:
|
||||
|
||||
**第五阶段把“角色只是文字卡”升级成“角色开始有可预览、可应用的主形象和动作资产”。**
|
||||
|
||||
---
|
||||
|
||||
## 1. 阶段衔接关系
|
||||
|
||||
## 1.1 第四阶段已经完成什么
|
||||
|
||||
第五阶段默认建立在第四阶段已经完成的能力之上:
|
||||
|
||||
1. `draftProfile` 已经可编辑
|
||||
2. 用户可以新增角色
|
||||
3. `draftCards` 中已经有稳定的 `character` 卡
|
||||
4. `CustomWorldAgentDraftDetailPanel` 已经存在
|
||||
5. 用户可以从工作区聚焦到某个具体角色
|
||||
|
||||
## 1.2 第五阶段不再重做什么
|
||||
|
||||
以下内容第五阶段不重做:
|
||||
|
||||
1. 不重做 foundation draft 生成
|
||||
2. 不重做 draftCards 主链
|
||||
3. 不重做草稿设定编辑
|
||||
4. 不重做 AI 新增角色 / 场景
|
||||
|
||||
第五阶段只继续补:
|
||||
|
||||
1. 角色主图候选生成
|
||||
2. 角色主图发布
|
||||
3. 角色核心动作生成
|
||||
4. 角色核心动作发布
|
||||
5. 资产状态写回 session 与 draftProfile
|
||||
6. 角色卡资产状态展示
|
||||
|
||||
---
|
||||
|
||||
## 2. 第五阶段在八阶段中的位置
|
||||
|
||||
八阶段拆分如下:
|
||||
|
||||
1. 阶段 1:创作页面入口、Agent 会话主链与工作区骨架
|
||||
2. 阶段 2:最小锚点收集与澄清流程
|
||||
3. 阶段 3:世界底稿生成与草稿卡编译
|
||||
4. 阶段 4:草稿设定编辑与 AI 新增角色/场景生成
|
||||
5. 阶段 5:角色主图与动作资产工坊接入
|
||||
6. 阶段 6:场景背景图工坊接入
|
||||
7. 阶段 7:长尾内容扩展与自动补齐
|
||||
8. 阶段 8:发布、世界库接入与继续创作恢复
|
||||
|
||||
本文件只覆盖:
|
||||
|
||||
**阶段 5:角色主图与动作资产工坊接入**
|
||||
|
||||
---
|
||||
|
||||
## 3. 第五阶段目标
|
||||
|
||||
第五阶段只做 7 件必须一起成立的事:
|
||||
|
||||
1. 用户可以从角色卡打开资产工坊
|
||||
2. 用户可以为角色生成主图候选
|
||||
3. 用户可以选择主图候选并发布为角色主图
|
||||
4. 用户可以基于已发布主图生成核心动作
|
||||
5. 用户可以发布核心动作资产
|
||||
6. 发布成功后,角色对象会写回 `imageSrc / generatedVisualAssetId / generatedAnimationSetId / animationMap`
|
||||
7. 工作区和创作页面能感知角色资产状态变化
|
||||
|
||||
一句话目标:
|
||||
|
||||
**让第五阶段结束时,至少部分关键角色已经不只是“设定存在”,而是“能动起来”。**
|
||||
|
||||
---
|
||||
|
||||
## 4. 第五阶段完成定义
|
||||
|
||||
第五阶段完成后,必须同时满足以下结果:
|
||||
|
||||
1. 用户从某张 `character` 卡进入详情后,可以点击“角色资产”打开 `CustomWorldRoleAssetStudioModal`。
|
||||
2. 用户可以生成主图候选,并能预览多个候选。
|
||||
3. 用户选择候选并发布后,对应角色会得到:
|
||||
- `imageSrc`
|
||||
- `generatedVisualAssetId`
|
||||
4. 用户可以基于主图继续生成核心动作草稿。
|
||||
5. 用户发布动作后,对应角色会得到:
|
||||
- `generatedAnimationSetId`
|
||||
- `animationMap`
|
||||
6. assetCoverage 中对应角色状态会更新。
|
||||
7. 工作区中的角色卡会显示主图 / 动作状态变化。
|
||||
8. 第五阶段仍然不要求场景背景图接入,也不要求所有角色都必须完成资产生成。
|
||||
|
||||
---
|
||||
|
||||
## 5. 范围控制
|
||||
|
||||
## 5.1 第五阶段纳入范围
|
||||
|
||||
纳入范围的模块:
|
||||
|
||||
- `packages/shared/src/contracts/customWorldAgent.ts`
|
||||
- `src/components/custom-world-agent/CustomWorldAgentWorkspace.tsx`
|
||||
- `src/components/custom-world-agent/CustomWorldAgentDraftDetailPanel.tsx`
|
||||
- `src/components/custom-world-agent/CustomWorldAgentQuickActions.tsx`
|
||||
- `src/components/CustomWorldRoleAssetStudioModal.tsx`
|
||||
- `src/components/asset-studio/characterAssetWorkflowPersistence.ts`
|
||||
- `src/services/aiService.ts`
|
||||
- `server-node/src/services/customWorldAgentSessionStore.ts`
|
||||
- `server-node/src/services/customWorldAgentOrchestrator.ts`
|
||||
- `server-node/src/services/customWorldAgentDraftCompiler.ts`
|
||||
- `server-node/src/services/customWorldWorkSummaryService.ts`
|
||||
- `server-node/src/modules/assets/characterAssetRoutes.ts`
|
||||
|
||||
新增服务端模块:
|
||||
|
||||
- `server-node/src/services/customWorldAgentAssetBridgeService.ts`
|
||||
- `server-node/src/services/customWorldAgentRoleAssetStateService.ts`
|
||||
|
||||
## 5.2 第五阶段明确不做
|
||||
|
||||
以下内容不放进第五阶段:
|
||||
|
||||
1. 不做场景背景图工坊接入
|
||||
2. 不做长尾角色批量自动出图
|
||||
3. 不做所有角色的自动动作补齐
|
||||
4. 不做发布时强制所有角色资产齐全
|
||||
5. 不做视频导入高级编辑链
|
||||
6. 不做口型 / 对话特写
|
||||
|
||||
原因:
|
||||
|
||||
**第五阶段只解决“选中的角色如何进入资产工坊并成功把结果写回草稿世界”。**
|
||||
|
||||
---
|
||||
|
||||
## 6. 第五阶段最小闭环
|
||||
|
||||
建议把第五阶段的最小闭环定义为:
|
||||
|
||||
```text
|
||||
第四阶段已有角色卡
|
||||
-> 用户打开某张角色卡详情
|
||||
-> 点击“角色资产”
|
||||
-> 打开角色资产工坊
|
||||
-> 生成主图候选
|
||||
-> 选择并发布主图
|
||||
-> 生成核心动作
|
||||
-> 发布动作
|
||||
-> sync_role_assets
|
||||
-> role card / assetCoverage / 创作页面摘要同步更新
|
||||
```
|
||||
|
||||
这个闭环里,先只强接两条高价值链路:
|
||||
|
||||
1. `character card -> asset studio`
|
||||
2. `asset studio publish -> session sync`
|
||||
|
||||
---
|
||||
|
||||
## 7. 第五阶段产品行为定义
|
||||
|
||||
## 7.1 哪些角色可以进入资产工坊
|
||||
|
||||
第五阶段允许以下角色进入资产工坊:
|
||||
|
||||
1. `playableNpcs`
|
||||
2. `storyNpcs`
|
||||
|
||||
但默认推荐优先处理:
|
||||
|
||||
1. 主线关键角色
|
||||
2. 可扮演角色
|
||||
3. 创作者重点想看的角色
|
||||
|
||||
## 7.2 入口位置
|
||||
|
||||
### 角色卡详情入口
|
||||
|
||||
在 `CustomWorldAgentDraftDetailPanel` 中,当当前卡类型为:
|
||||
|
||||
```ts
|
||||
kind === 'character'
|
||||
```
|
||||
|
||||
显示按钮:
|
||||
|
||||
- `角色资产`
|
||||
|
||||
### 快捷动作入口
|
||||
|
||||
当当前 focus card 为角色卡时,`CustomWorldAgentQuickActions` 可显示:
|
||||
|
||||
- `生成角色主图与动作`
|
||||
|
||||
说明:
|
||||
|
||||
快捷动作与详情按钮最终都打开同一个 modal。
|
||||
|
||||
## 7.3 第五阶段支持的资产流程
|
||||
|
||||
### 阶段 A:主图候选
|
||||
|
||||
允许:
|
||||
|
||||
1. `text-to-image`
|
||||
2. `image-to-image`
|
||||
|
||||
不做:
|
||||
|
||||
1. 批量上传模式
|
||||
2. 一次性批量生成多个角色主图
|
||||
|
||||
### 阶段 B:主图发布
|
||||
|
||||
用户在候选中选择一个结果后,发布主图。
|
||||
|
||||
### 阶段 C:核心动作草稿
|
||||
|
||||
基于主图生成当前工坊支持的核心动作:
|
||||
|
||||
1. `idle`
|
||||
2. `run`
|
||||
3. `attack`
|
||||
4. `hurt`
|
||||
5. `die`
|
||||
|
||||
### 阶段 D:动作发布
|
||||
|
||||
将动作草稿发布为正式动画资产,并写回角色。
|
||||
|
||||
## 7.4 第五阶段不强制的事情
|
||||
|
||||
第五阶段明确不强制:
|
||||
|
||||
1. 每个角色都必须立刻生成主图
|
||||
2. 每个角色都必须立刻生成动作
|
||||
3. 没有资产的角色不能继续文本创作
|
||||
|
||||
说明:
|
||||
|
||||
这一步是“角色开始接资产”,不是“所有角色必须立刻完工”。
|
||||
|
||||
## 7.5 积分消耗提示规则
|
||||
|
||||
当前项目已经明确:
|
||||
|
||||
**不做预算限制,但高成本生成前必须明确提示积分消耗。**
|
||||
|
||||
因此第五阶段必须遵守:
|
||||
|
||||
### 主图候选生成前
|
||||
|
||||
必须提示:
|
||||
|
||||
1. 本次会消耗多少积分
|
||||
2. 这是候选抽卡,不是最终发布
|
||||
|
||||
### 动作草稿生成前
|
||||
|
||||
必须提示:
|
||||
|
||||
1. 本次会消耗多少积分
|
||||
2. 这是动作草稿,不是最终发布
|
||||
|
||||
### 发布前
|
||||
|
||||
发布动作或主图本身不应再次重复收积分,除非现有资产接口明确要求。
|
||||
|
||||
---
|
||||
|
||||
## 8. 角色资产状态定义
|
||||
|
||||
## 8.1 `assetCoverage.roleAssets`
|
||||
|
||||
第五阶段必须开始真正使用它。
|
||||
|
||||
建议状态:
|
||||
|
||||
```ts
|
||||
type CustomWorldRoleAssetStatus =
|
||||
| 'missing'
|
||||
| 'visual_ready'
|
||||
| 'animations_ready'
|
||||
| 'complete';
|
||||
```
|
||||
|
||||
### 含义
|
||||
|
||||
#### `missing`
|
||||
|
||||
角色还没有正式主图
|
||||
|
||||
#### `visual_ready`
|
||||
|
||||
角色已经有:
|
||||
|
||||
1. `imageSrc`
|
||||
2. `generatedVisualAssetId`
|
||||
|
||||
但没有完整动作
|
||||
|
||||
#### `animations_ready`
|
||||
|
||||
角色已经有:
|
||||
|
||||
1. `generatedAnimationSetId`
|
||||
2. 至少一组核心动作映射
|
||||
|
||||
但若需要更严格区分,也允许继续映射到 `complete`
|
||||
|
||||
#### `complete`
|
||||
|
||||
角色有:
|
||||
|
||||
1. 主图
|
||||
2. 核心动作
|
||||
|
||||
### 第五阶段建议判定
|
||||
|
||||
为了避免漂移,直接使用:
|
||||
|
||||
1. 只有主图:`visual_ready`
|
||||
2. 主图 + 五组核心动作都齐:`complete`
|
||||
|
||||
第五阶段不强制使用 `animations_ready` 作为单独过渡,可选保留。
|
||||
|
||||
## 8.2 角色对象写回字段
|
||||
|
||||
发布主图成功后,必须写回:
|
||||
|
||||
```ts
|
||||
imageSrc
|
||||
generatedVisualAssetId
|
||||
```
|
||||
|
||||
发布动作成功后,必须写回:
|
||||
|
||||
```ts
|
||||
generatedAnimationSetId
|
||||
animationMap
|
||||
```
|
||||
|
||||
### 明确要求
|
||||
|
||||
第五阶段不允许只更新 `assetCoverage`,不更新角色对象本身。
|
||||
|
||||
---
|
||||
|
||||
## 9. 数据结构落地方案
|
||||
|
||||
## 9.1 扩展 `CustomWorldAgentActionRequest`
|
||||
|
||||
第五阶段正式启用:
|
||||
|
||||
```ts
|
||||
| { action: 'generate_role_assets'; roleIds: string[] }
|
||||
| {
|
||||
action: 'sync_role_assets';
|
||||
roleId: string;
|
||||
portraitPath: string;
|
||||
generatedVisualAssetId: string;
|
||||
generatedAnimationSetId?: string | null;
|
||||
animationMap?: JsonObject | null;
|
||||
}
|
||||
```
|
||||
|
||||
### 第五阶段限制
|
||||
|
||||
1. `generate_role_assets` 第一版只允许单角色:
|
||||
- `roleIds.length === 1`
|
||||
2. 批量角色资产生成留到后续阶段
|
||||
|
||||
## 9.2 扩展 `CustomWorldRoleAssetSummary`
|
||||
|
||||
第五阶段开始必须真正填:
|
||||
|
||||
1. `portraitPath`
|
||||
2. `generatedVisualAssetId`
|
||||
3. `generatedAnimationSetId`
|
||||
4. `status`
|
||||
5. `missingAnimations`
|
||||
6. `nextPointCost`
|
||||
|
||||
## 9.3 新增角色资产同步结果结构
|
||||
|
||||
建议新增:
|
||||
|
||||
```ts
|
||||
type SyncRoleAssetsResult = {
|
||||
roleId: string;
|
||||
updatedRole: Record<string, unknown>;
|
||||
updatedAssetSummary: CustomWorldRoleAssetSummary;
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 10. 服务端实现方案
|
||||
|
||||
## 10.1 新增 `customWorldAgentAssetBridgeService.ts`
|
||||
|
||||
### 文件
|
||||
|
||||
`server-node/src/services/customWorldAgentAssetBridgeService.ts`
|
||||
|
||||
### 职责
|
||||
|
||||
负责连接:
|
||||
|
||||
1. Agent session
|
||||
2. 现有角色资产路由与持久化能力
|
||||
|
||||
### 第一版职责
|
||||
|
||||
1. 将角色卡编译成资产工坊启动参数
|
||||
2. 接收工坊发布结果
|
||||
3. 转换为 session 可写回的标准结果
|
||||
|
||||
### 输入
|
||||
|
||||
```ts
|
||||
buildRoleAssetStudioContext(snapshot, roleId)
|
||||
applyRoleAssetPublishResult(snapshot, payload)
|
||||
```
|
||||
|
||||
### 说明
|
||||
|
||||
它不自己生成图片或动作,仍然复用现有资产链。
|
||||
|
||||
## 10.2 新增 `customWorldAgentRoleAssetStateService.ts`
|
||||
|
||||
### 文件
|
||||
|
||||
`server-node/src/services/customWorldAgentRoleAssetStateService.ts`
|
||||
|
||||
### 职责
|
||||
|
||||
根据角色对象真实字段,更新:
|
||||
|
||||
1. `assetCoverage.roleAssets`
|
||||
2. `draftCards` 中角色卡的副摘要
|
||||
3. 创作页面作品卡统计
|
||||
|
||||
### 导出函数建议
|
||||
|
||||
```ts
|
||||
rebuildRoleAssetCoverage(draftProfile)
|
||||
mergeRoleAssetIntoDraftProfile(draftProfile, payload)
|
||||
```
|
||||
|
||||
## 10.3 修改 `customWorldAgentOrchestrator.ts`
|
||||
|
||||
第五阶段必须启用:
|
||||
|
||||
1. `generate_role_assets`
|
||||
2. `sync_role_assets`
|
||||
|
||||
### `generate_role_assets` 流程
|
||||
|
||||
```text
|
||||
收到 generate_role_assets
|
||||
-> 校验 roleIds
|
||||
-> 构建 role asset studio context
|
||||
-> 返回 operation completed
|
||||
-> 前端打开资产工坊
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
这里的 operation 不是生成图片,而是准备进入工坊。
|
||||
|
||||
### `sync_role_assets` 流程
|
||||
|
||||
```text
|
||||
收到 sync_role_assets
|
||||
-> 校验 roleId
|
||||
-> 写回 draftProfile 中的角色字段
|
||||
-> 重建 assetCoverage.roleAssets
|
||||
-> 重新编译角色卡摘要
|
||||
-> 写入 assistant action_result
|
||||
-> 写入 checkpoint
|
||||
-> operation completed
|
||||
```
|
||||
|
||||
## 10.4 修改 `customWorldAgentDraftCompiler.ts`
|
||||
|
||||
第五阶段它必须让 `character` 卡摘要带出资产状态。
|
||||
|
||||
### 角色卡摘要新增要求
|
||||
|
||||
在 `subtitle` 或 `summary` 中追加:
|
||||
|
||||
1. `主图已就绪`
|
||||
2. `动作已就绪`
|
||||
3. `待生成主图`
|
||||
|
||||
但不要让卡片默认变成技术清单。
|
||||
|
||||
推荐形式:
|
||||
|
||||
- `外显身份 / 主图已就绪`
|
||||
|
||||
或:
|
||||
|
||||
- `当前压力……(动作待补)`
|
||||
|
||||
## 10.5 修改 `customWorldWorkSummaryService.ts`
|
||||
|
||||
第五阶段创作页面草稿卡应支持展示:
|
||||
|
||||
1. 已有多少角色具备主图
|
||||
2. 已有多少角色具备动作
|
||||
|
||||
第一版如果不想上具体数字,也至少要能在草稿卡上体现:
|
||||
|
||||
- `角色资产进行中`
|
||||
|
||||
---
|
||||
|
||||
## 11. 前端实现方案
|
||||
|
||||
## 11.1 修改 `CustomWorldAgentDraftDetailPanel.tsx`
|
||||
|
||||
当卡片类型为 `character` 时,新增:
|
||||
|
||||
1. `角色资产` 按钮
|
||||
2. 资产状态 badge
|
||||
|
||||
### 状态显示建议
|
||||
|
||||
1. `待生成主图`
|
||||
2. `主图已就绪`
|
||||
3. `动作已就绪`
|
||||
|
||||
## 11.2 修改 `CustomWorldAgentQuickActions.tsx`
|
||||
|
||||
当当前 focus 为角色卡时,可显示:
|
||||
|
||||
1. `生成角色主图与动作`
|
||||
|
||||
点击后:
|
||||
|
||||
1. 调用 `generate_role_assets`
|
||||
2. 成功后打开 `CustomWorldRoleAssetStudioModal`
|
||||
|
||||
## 11.3 修改 `CustomWorldAgentWorkspace.tsx`
|
||||
|
||||
新增状态:
|
||||
|
||||
```ts
|
||||
activeRoleAssetTargetId?: string | null;
|
||||
showRoleAssetStudio: boolean;
|
||||
```
|
||||
|
||||
### 打开逻辑
|
||||
|
||||
1. 来自 detail panel
|
||||
2. 来自 quick actions
|
||||
|
||||
### 关闭逻辑
|
||||
|
||||
关闭后不代表写回成功。
|
||||
|
||||
必须等:
|
||||
|
||||
1. 工坊发布成功
|
||||
2. `sync_role_assets` 成功
|
||||
|
||||
之后才刷新角色资产状态。
|
||||
|
||||
## 11.4 修改 `CustomWorldRoleAssetStudioModal.tsx`
|
||||
|
||||
第五阶段不重做这个组件,但必须调整为:
|
||||
|
||||
1. 接收来自 Agent 工作区的角色对象
|
||||
2. 发布成功后,不直接改本地 profile
|
||||
3. 统一回调:
|
||||
|
||||
```ts
|
||||
onPublishSuccess(payload)
|
||||
```
|
||||
|
||||
### `onPublishSuccess` 最小字段
|
||||
|
||||
```ts
|
||||
{
|
||||
roleId: string;
|
||||
portraitPath: string;
|
||||
generatedVisualAssetId: string;
|
||||
generatedAnimationSetId?: string | null;
|
||||
animationMap?: Record<string, unknown> | null;
|
||||
}
|
||||
```
|
||||
|
||||
## 11.5 修改 `CustomWorldCreationHub.tsx`
|
||||
|
||||
第五阶段它必须支持草稿作品卡的“资产进度感”。
|
||||
|
||||
第一版至少做到:
|
||||
|
||||
1. 草稿卡可展示:
|
||||
- 角色资产进行中
|
||||
- 或若数量可得,则展示主图 / 动作完成数
|
||||
|
||||
不要求这一版做得很重。
|
||||
|
||||
---
|
||||
|
||||
## 12. 交互时序
|
||||
|
||||
## 12.1 打开角色资产工坊
|
||||
|
||||
```text
|
||||
用户点击角色卡
|
||||
-> 打开 detail panel
|
||||
-> 点击“角色资产”
|
||||
-> 前端 POST /actions { action: generate_role_assets }
|
||||
-> 服务端校验角色
|
||||
-> 服务端返回可进入工坊
|
||||
-> 前端打开 CustomWorldRoleAssetStudioModal
|
||||
```
|
||||
|
||||
## 12.2 发布主图
|
||||
|
||||
```text
|
||||
用户在工坊中选择主图候选
|
||||
-> 发布主图
|
||||
-> 工坊获得 portraitPath + generatedVisualAssetId
|
||||
-> 暂不关闭会话
|
||||
-> 可继续生成动作
|
||||
```
|
||||
|
||||
## 12.3 发布动作并同步
|
||||
|
||||
```text
|
||||
用户发布动作
|
||||
-> 工坊获得 generatedAnimationSetId + animationMap
|
||||
-> 前端调用 sync_role_assets
|
||||
-> 服务端写回 draftProfile.character
|
||||
-> 服务端重建 assetCoverage.roleAssets
|
||||
-> 服务端重编译角色卡摘要
|
||||
-> 前端刷新 snapshot
|
||||
-> 工坊关闭
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 13. 与第四阶段的兼容要求
|
||||
|
||||
## 13.1 兼容新增角色
|
||||
|
||||
第四阶段新增的角色对象只要已经在 `draftProfile.storyNpcs` 或 `playableNpcs` 中,均允许进入资产工坊。
|
||||
|
||||
不要求:
|
||||
|
||||
1. 该角色必须有完整长背景
|
||||
2. 该角色必须已进入后续发布阶段
|
||||
|
||||
## 13.2 兼容无主图角色
|
||||
|
||||
如果某角色完全无:
|
||||
|
||||
1. `imageSrc`
|
||||
2. `generatedVisualAssetId`
|
||||
|
||||
也允许打开工坊,从零开始生成。
|
||||
|
||||
## 13.3 兼容有主图无动作角色
|
||||
|
||||
如果角色已经有:
|
||||
|
||||
1. `imageSrc`
|
||||
2. `generatedVisualAssetId`
|
||||
|
||||
但没有:
|
||||
|
||||
1. `generatedAnimationSetId`
|
||||
|
||||
则工坊默认直接进入动作阶段。
|
||||
|
||||
---
|
||||
|
||||
## 14. 落地文件清单
|
||||
|
||||
## 14.1 frontend
|
||||
|
||||
必须修改:
|
||||
|
||||
1. `src/components/custom-world-agent/CustomWorldAgentWorkspace.tsx`
|
||||
2. `src/components/custom-world-agent/CustomWorldAgentDraftDetailPanel.tsx`
|
||||
3. `src/components/custom-world-agent/CustomWorldAgentQuickActions.tsx`
|
||||
4. `src/components/CustomWorldRoleAssetStudioModal.tsx`
|
||||
5. `src/components/custom-world-home/CustomWorldCreationHub.tsx`
|
||||
6. `src/services/aiService.ts`
|
||||
|
||||
## 14.2 backend
|
||||
|
||||
必须新增:
|
||||
|
||||
1. `server-node/src/services/customWorldAgentAssetBridgeService.ts`
|
||||
2. `server-node/src/services/customWorldAgentRoleAssetStateService.ts`
|
||||
|
||||
必须修改:
|
||||
|
||||
1. `server-node/src/services/customWorldAgentOrchestrator.ts`
|
||||
2. `server-node/src/services/customWorldAgentDraftCompiler.ts`
|
||||
3. `server-node/src/services/customWorldAgentSessionStore.ts`
|
||||
4. `server-node/src/services/customWorldWorkSummaryService.ts`
|
||||
|
||||
---
|
||||
|
||||
## 15. 测试要求
|
||||
|
||||
## 15.1 服务端测试
|
||||
|
||||
至少要补:
|
||||
|
||||
1. `generate_role_assets` 仅允许单角色
|
||||
2. `sync_role_assets` 能正确写回角色字段
|
||||
3. 写回后 `assetCoverage.roleAssets` 状态更新
|
||||
4. 写回后角色卡摘要更新
|
||||
5. 写回后 checkpoint 存在
|
||||
|
||||
## 15.2 前端测试
|
||||
|
||||
至少要补:
|
||||
|
||||
1. character 卡详情可显示角色资产入口
|
||||
2. quick actions 可打开角色资产工坊
|
||||
3. 工坊发布成功后会触发 `sync_role_assets`
|
||||
4. snapshot 刷新后角色卡显示新状态
|
||||
|
||||
## 15.3 手工回归
|
||||
|
||||
至少走这 4 条:
|
||||
|
||||
1. 为一个无主图角色生成主图
|
||||
2. 为该角色继续生成并发布核心动作
|
||||
3. 返回 workspace 确认角色卡状态变化
|
||||
4. 返回创作页面确认草稿卡摘要变化
|
||||
|
||||
---
|
||||
|
||||
## 16. 第五阶段验收标准
|
||||
|
||||
做到以下几点,才算第五阶段真正完成:
|
||||
|
||||
1. 角色卡已经可以接入并打开角色资产工坊。
|
||||
2. 主图发布成功后,角色对象会写回 `imageSrc / generatedVisualAssetId`。
|
||||
3. 动作发布成功后,角色对象会写回 `generatedAnimationSetId / animationMap`。
|
||||
4. 角色资产状态会同步反映到 session snapshot 和角色卡摘要。
|
||||
5. 角色资产接入不会阻塞继续文本创作。
|
||||
6. 第五阶段仍然不越界去做场景背景图、长尾扩展和发布逻辑。
|
||||
|
||||
---
|
||||
|
||||
## 17. 一句话结论
|
||||
|
||||
第五阶段最重要的不是“让所有角色都立刻变成完整资产”,而是:
|
||||
|
||||
**先把草稿世界里的角色,真正接到一条可预览、可发布、可写回的资产工坊链路上。**
|
||||
File diff suppressed because it is too large
Load Diff
788
docs/prd/AI_NATIVE_CUSTOM_WORLD_CREATION_HUB_PRD_2026-04-13.md
Normal file
788
docs/prd/AI_NATIVE_CUSTOM_WORLD_CREATION_HUB_PRD_2026-04-13.md
Normal file
@@ -0,0 +1,788 @@
|
||||
# AI 原生自定义世界创作页面 PRD
|
||||
|
||||
更新时间:`2026-04-13`
|
||||
|
||||
## 0. 文档目的
|
||||
|
||||
这份 PRD 用于定义一个新的、独立的“自定义世界创作页面”。
|
||||
|
||||
目标不是继续沿用当前“世界选择页里弹出创建弹窗”的旧流程,而是把“创作入口”和“历史作品管理”正式从世界选择页中抽出来,形成一个专门承接创作行为的页面。
|
||||
|
||||
这份 PRD 要解决的核心问题是:
|
||||
|
||||
**当用户在世界选择页点击“创建自定义世界”后,不应该立刻被丢进一个弹窗或某个具体工作流,而应该先进入一个专门的创作页面,在这里完成:**
|
||||
|
||||
1. 新建作品
|
||||
2. 继续创作草稿
|
||||
3. 查看历史已发布作品
|
||||
4. 从创作页面进入具体 Agent 创作工作区
|
||||
|
||||
一句话目标:
|
||||
|
||||
**让“创作自定义世界”从一个一次性动作,升级成一个正式的创作入口与作品管理入口。**
|
||||
|
||||
---
|
||||
|
||||
## 1. 当前问题
|
||||
|
||||
## 1.1 当前创建入口过于直接
|
||||
|
||||
当前链路是:
|
||||
|
||||
```text
|
||||
世界选择页
|
||||
-> 点击创建自定义世界
|
||||
-> 直接打开创建弹窗
|
||||
```
|
||||
|
||||
这会带来几个问题:
|
||||
|
||||
1. 入口太窄
|
||||
- 用户只有“立刻创建”这一个选择,没有“先看看历史作品”“继续草稿”的缓冲页。
|
||||
|
||||
2. 创作与管理没有分层
|
||||
- 新建、继续创作、查看已发布作品都混在世界选择页这个入口层里。
|
||||
|
||||
3. 后续 Agent 工作区不好接
|
||||
- 如果直接从世界选择页跳进 Agent session,用户缺少“这是一个创作空间”的过渡。
|
||||
|
||||
## 1.2 历史作品入口不完整
|
||||
|
||||
当前世界选择页里虽然能展示已保存的自定义世界,但它更像“世界卡片列表”,不是一个真正的创作历史页。
|
||||
|
||||
缺口主要有:
|
||||
|
||||
1. 草稿和已发布作品没有统一视图
|
||||
2. 草稿没有正式“继续创作”入口体系
|
||||
3. 已发布作品只是“世界库内容”,不是“创作成果”
|
||||
4. 用户看不到自己的创作历史全貌
|
||||
|
||||
## 1.3 未来 Agent 工作区缺少前置首页
|
||||
|
||||
后续 Agent-first 创作工具一定会有:
|
||||
|
||||
1. 草稿 session
|
||||
2. 已发布世界
|
||||
3. 继续创作入口
|
||||
4. 发布后的回看入口
|
||||
|
||||
如果没有一个专门的创作页面,这些入口只能继续塞在:
|
||||
|
||||
- 世界选择页
|
||||
- 结果页
|
||||
- 临时 modal
|
||||
|
||||
最终会让流程越来越乱。
|
||||
|
||||
---
|
||||
|
||||
## 2. 产品目标
|
||||
|
||||
这次要做的创作页面,必须同时满足 6 个目标:
|
||||
|
||||
1. 把“新建作品”和“管理作品”放到同一入口里
|
||||
2. 支持同时展示草稿和已发布作品
|
||||
3. 让用户从世界选择页进入后,先感知到“这里是创作空间”
|
||||
4. 为后续 Agent 创作工作区提供稳定前置页
|
||||
5. 保持移动端优先,界面清爽,不堆规则说明
|
||||
6. 前端只负责展示和跳转,数据聚合与状态归类全部交给后端
|
||||
|
||||
---
|
||||
|
||||
## 3. 核心结论
|
||||
|
||||
新的用户主链应该改成:
|
||||
|
||||
```text
|
||||
世界选择页
|
||||
-> 点击“创建自定义世界”
|
||||
-> 进入“创作页面”
|
||||
-> 用户选择:
|
||||
- 新建作品
|
||||
- 继续创作草稿
|
||||
- 查看已发布作品
|
||||
-> 再进入具体 Agent 工作区或正式世界
|
||||
```
|
||||
|
||||
一句话:
|
||||
|
||||
**创作页面是“创作中心”,不是“又一个创建弹窗”。**
|
||||
|
||||
---
|
||||
|
||||
## 4. 页面定位
|
||||
|
||||
## 4.1 页面名称
|
||||
|
||||
建议名称:
|
||||
|
||||
`创作页面`
|
||||
|
||||
UI 主标题建议:
|
||||
|
||||
`自定义世界创作`
|
||||
|
||||
## 4.2 页面职责
|
||||
|
||||
这个页面只负责 4 件事:
|
||||
|
||||
1. 提供“新建作品”入口
|
||||
2. 列出用户历史草稿
|
||||
3. 列出用户已发布作品
|
||||
4. 把用户带到正确的下一步页面
|
||||
|
||||
这个页面不负责:
|
||||
|
||||
1. 直接进行世界锚点编辑
|
||||
2. 直接进行 Agent 长对话创作
|
||||
3. 直接进行结果页细改
|
||||
4. 直接发布作品
|
||||
|
||||
也就是说:
|
||||
|
||||
**它是创作首页,不是创作工作区本体。**
|
||||
|
||||
---
|
||||
|
||||
## 5. 用户流程
|
||||
|
||||
## 5.1 世界选择页进入创作页面
|
||||
|
||||
当前世界选择页里的“创建自定义世界”按钮行为改为:
|
||||
|
||||
```text
|
||||
点击创建自定义世界
|
||||
-> 不再打开旧 modal
|
||||
-> 进入 custom-world-home
|
||||
```
|
||||
|
||||
第一阶段只要求:
|
||||
|
||||
1. 进入专门创作页面
|
||||
2. 能看到新建入口和历史作品
|
||||
|
||||
## 5.2 在创作页面新建作品
|
||||
|
||||
流程:
|
||||
|
||||
```text
|
||||
创作页面
|
||||
-> 点击“新建作品”
|
||||
-> 打开轻量 launcher
|
||||
-> 创建新的 Agent session
|
||||
-> 进入 custom-world-agent
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
- 新建作品依然走 Agent session 主链
|
||||
- 创作页面不自己生成世界
|
||||
|
||||
## 5.3 在创作页面继续草稿
|
||||
|
||||
流程:
|
||||
|
||||
```text
|
||||
创作页面
|
||||
-> 点击草稿卡片的“继续创作”
|
||||
-> 打开该 session
|
||||
-> 进入 custom-world-agent
|
||||
```
|
||||
|
||||
## 5.4 在创作页面查看已发布作品
|
||||
|
||||
已发布作品卡片支持两种动作:
|
||||
|
||||
1. `进入世界`
|
||||
2. `查看作品`
|
||||
|
||||
说明:
|
||||
|
||||
- `进入世界` 直接进入当前已发布世界
|
||||
- `查看作品` 进入只读详情页或结果总览页
|
||||
|
||||
第一版如果不单独做只读详情页,可先只保留:
|
||||
|
||||
1. `进入世界`
|
||||
|
||||
但卡片展示层必须把“它是已发布作品”表达清楚。
|
||||
|
||||
---
|
||||
|
||||
## 6. 信息架构
|
||||
|
||||
## 6.1 页面整体结构
|
||||
|
||||
创作页面必须包含 4 个区域:
|
||||
|
||||
1. 顶部导航区
|
||||
2. 新建作品区
|
||||
3. 历史作品筛选区
|
||||
4. 作品列表区
|
||||
|
||||
## 6.2 顶部导航区
|
||||
|
||||
必须展示:
|
||||
|
||||
1. 页面标题:`自定义世界创作`
|
||||
2. 返回按钮:`返回世界选择`
|
||||
|
||||
可选展示:
|
||||
|
||||
1. 用户作品统计
|
||||
- 草稿数
|
||||
- 已发布数
|
||||
|
||||
## 6.3 新建作品区
|
||||
|
||||
这是页面首屏最高优先级区域。
|
||||
|
||||
必须包含:
|
||||
|
||||
1. `新建作品` 主按钮
|
||||
2. 一段极短说明文案
|
||||
|
||||
说明文案要求:
|
||||
|
||||
1. 只一两句
|
||||
2. 不要写规则说明
|
||||
3. 不要写长解释
|
||||
|
||||
推荐文案方向:
|
||||
|
||||
- `输入一点灵感,开始共创一个新世界。`
|
||||
|
||||
## 6.4 历史作品筛选区
|
||||
|
||||
建议用 3 个 tab:
|
||||
|
||||
1. `全部`
|
||||
2. `草稿`
|
||||
3. `已发布`
|
||||
|
||||
默认:
|
||||
|
||||
- `全部`
|
||||
|
||||
第一版不强制上搜索框,但如果作品数超过 `8` 个,建议补搜索。
|
||||
|
||||
## 6.5 作品列表区
|
||||
|
||||
列表区统一展示作品卡片,但卡片要区分两类:
|
||||
|
||||
1. 草稿卡片
|
||||
2. 已发布卡片
|
||||
|
||||
默认排序:
|
||||
|
||||
- 按 `updatedAt desc`
|
||||
|
||||
---
|
||||
|
||||
## 7. 作品卡片定义
|
||||
|
||||
## 7.1 草稿卡片
|
||||
|
||||
草稿卡片必须展示:
|
||||
|
||||
1. 标题
|
||||
2. 草稿状态标识
|
||||
3. 最近更新时间
|
||||
4. 当前阶段标签
|
||||
5. 简短摘要
|
||||
6. 封面图
|
||||
7. 主要操作按钮
|
||||
|
||||
### 标题规则
|
||||
|
||||
按优先级取:
|
||||
|
||||
1. `draftProfile.name`
|
||||
2. `anchorPack.worldSummary`
|
||||
3. `creatorIntent.worldHook`
|
||||
4. `未命名草稿`
|
||||
|
||||
### 摘要规则
|
||||
|
||||
按优先级取:
|
||||
|
||||
1. `anchorPack.creatorIntentSummary`
|
||||
2. `creatorIntent.rawSettingText`
|
||||
3. 默认摘要占位文本
|
||||
|
||||
### 封面图规则
|
||||
|
||||
按优先级取:
|
||||
|
||||
1. `draftProfile.camp.imageSrc`
|
||||
2. `draftProfile` 中可解析的营地图
|
||||
3. 角色主图或默认创作占位图
|
||||
|
||||
### 草稿卡片主操作
|
||||
|
||||
第一版必须有:
|
||||
|
||||
1. `继续创作`
|
||||
|
||||
可选:
|
||||
|
||||
1. `删除草稿`
|
||||
2. `复制草稿`
|
||||
|
||||
第一版如来不及,可不做删除和复制,但接口结构应预留。
|
||||
|
||||
## 7.2 已发布卡片
|
||||
|
||||
已发布卡片必须展示:
|
||||
|
||||
1. 世界名称
|
||||
2. 已发布标识
|
||||
3. 发布时间或更新时间
|
||||
4. 世界摘要
|
||||
5. 封面图
|
||||
6. 主要操作按钮
|
||||
|
||||
### 标题规则
|
||||
|
||||
直接取:
|
||||
|
||||
1. `CustomWorldProfile.name`
|
||||
|
||||
### 摘要规则
|
||||
|
||||
直接取:
|
||||
|
||||
1. `CustomWorldProfile.summary`
|
||||
|
||||
### 封面图规则
|
||||
|
||||
按优先级取:
|
||||
|
||||
1. 营地图
|
||||
2. 第一可扮演角色立绘
|
||||
3. 默认已发布作品占位图
|
||||
|
||||
### 已发布卡片主操作
|
||||
|
||||
第一版必须有:
|
||||
|
||||
1. `进入世界`
|
||||
|
||||
可选:
|
||||
|
||||
1. `查看作品`
|
||||
2. `基于此作品继续创作`
|
||||
|
||||
第一版不强制做“基于已发布作品继续创作”,避免先把发布后再开草稿链带复杂。
|
||||
|
||||
---
|
||||
|
||||
## 8. 作品摘要数据结构
|
||||
|
||||
## 8.1 新增统一作品摘要结构
|
||||
|
||||
建议新增:
|
||||
|
||||
```ts
|
||||
type CustomWorldWorkStatus = 'draft' | 'published';
|
||||
type CustomWorldWorkSource = 'agent_session' | 'published_profile';
|
||||
|
||||
interface CustomWorldWorkSummary {
|
||||
workId: string;
|
||||
sourceType: CustomWorldWorkSource;
|
||||
status: CustomWorldWorkStatus;
|
||||
title: string;
|
||||
subtitle: string;
|
||||
summary: string;
|
||||
coverImageSrc?: string | null;
|
||||
updatedAt: string;
|
||||
publishedAt?: string | null;
|
||||
stage?: string | null;
|
||||
stageLabel?: string | null;
|
||||
playableNpcCount: number;
|
||||
landmarkCount: number;
|
||||
sessionId?: string | null;
|
||||
profileId?: string | null;
|
||||
canResume: boolean;
|
||||
canEnterWorld: boolean;
|
||||
}
|
||||
```
|
||||
|
||||
## 8.2 字段解释
|
||||
|
||||
### `workId`
|
||||
|
||||
统一主键,用于前端列表渲染。
|
||||
|
||||
建议格式:
|
||||
|
||||
- 草稿:`draft:${sessionId}`
|
||||
- 已发布:`published:${profileId}`
|
||||
|
||||
### `sourceType`
|
||||
|
||||
用于区分:
|
||||
|
||||
1. Agent 草稿 session
|
||||
2. 已发布 profile
|
||||
|
||||
### `status`
|
||||
|
||||
只允许两类:
|
||||
|
||||
1. `draft`
|
||||
2. `published`
|
||||
|
||||
### `stage / stageLabel`
|
||||
|
||||
仅草稿需要。
|
||||
|
||||
已发布作品可为空。
|
||||
|
||||
### `canResume`
|
||||
|
||||
仅草稿为 `true`
|
||||
|
||||
### `canEnterWorld`
|
||||
|
||||
仅已发布作品为 `true`
|
||||
|
||||
---
|
||||
|
||||
## 9. 后端接口设计
|
||||
|
||||
## 9.1 新增作品列表接口
|
||||
|
||||
必须新增:
|
||||
|
||||
`GET /api/runtime/custom-world/works`
|
||||
|
||||
这是创作页面的核心接口。
|
||||
|
||||
它负责返回:
|
||||
|
||||
1. 当前用户的草稿 session 摘要
|
||||
2. 当前用户的已发布世界摘要
|
||||
3. 按统一结构聚合后的作品列表
|
||||
|
||||
## 9.2 接口返回结构
|
||||
|
||||
```ts
|
||||
interface ListCustomWorldWorksResponse {
|
||||
items: CustomWorldWorkSummary[];
|
||||
}
|
||||
```
|
||||
|
||||
### 第一版要求
|
||||
|
||||
1. 后端一次性返回全量列表
|
||||
2. 前端做 tab 过滤
|
||||
3. 不做服务端分页
|
||||
|
||||
原因:
|
||||
|
||||
- 当前用户作品量预计不大
|
||||
- 先把结构做稳,比先做分页更重要
|
||||
|
||||
## 9.3 数据来源
|
||||
|
||||
### 草稿来源
|
||||
|
||||
来自:
|
||||
|
||||
- `customWorldAgentSessionStore`
|
||||
|
||||
筛选规则:
|
||||
|
||||
1. `stage !== published`
|
||||
2. 未被标记为归档 / 删除
|
||||
|
||||
### 已发布来源
|
||||
|
||||
来自:
|
||||
|
||||
- 当前自定义世界库
|
||||
|
||||
即:
|
||||
|
||||
- `runtimeRepository.listCustomWorldProfiles(userId)`
|
||||
|
||||
## 9.4 聚合服务
|
||||
|
||||
建议新增服务:
|
||||
|
||||
`server-node/src/services/customWorldWorkSummaryService.ts`
|
||||
|
||||
职责:
|
||||
|
||||
1. 读取草稿 session
|
||||
2. 读取已发布 profile
|
||||
3. 编译成统一的 `CustomWorldWorkSummary[]`
|
||||
|
||||
### 明确要求
|
||||
|
||||
不允许在 route 里直接拼草稿和已发布数据。
|
||||
|
||||
---
|
||||
|
||||
## 10. 前端页面设计
|
||||
|
||||
## 10.1 页面组件
|
||||
|
||||
建议新增页面组件:
|
||||
|
||||
`src/components/custom-world-home/CustomWorldCreationHub.tsx`
|
||||
|
||||
这是新的创作页面主组件。
|
||||
|
||||
## 10.2 子组件建议
|
||||
|
||||
建议拆成:
|
||||
|
||||
1. `CustomWorldCreationHubHeader.tsx`
|
||||
2. `CustomWorldCreationStartCard.tsx`
|
||||
3. `CustomWorldWorkTabs.tsx`
|
||||
4. `CustomWorldWorkCard.tsx`
|
||||
5. `CustomWorldWorkList.tsx`
|
||||
6. `CustomWorldCreationHubEmptyState.tsx`
|
||||
|
||||
第一版如果不想拆太多,也允许先做成一个主组件加一个作品卡组件。
|
||||
|
||||
## 10.3 页面状态
|
||||
|
||||
页面至少要支持:
|
||||
|
||||
1. `loading`
|
||||
2. `ready`
|
||||
3. `error`
|
||||
4. `empty`
|
||||
|
||||
### `loading`
|
||||
|
||||
展示骨架屏,不展示空白页。
|
||||
|
||||
### `ready`
|
||||
|
||||
正常展示:
|
||||
|
||||
1. 新建作品区
|
||||
2. 筛选 tabs
|
||||
3. 作品列表
|
||||
|
||||
### `error`
|
||||
|
||||
展示:
|
||||
|
||||
1. 错误文案
|
||||
2. `重试` 按钮
|
||||
|
||||
### `empty`
|
||||
|
||||
分两类空态:
|
||||
|
||||
1. `全量空态`
|
||||
- 没有任何草稿,也没有已发布作品
|
||||
|
||||
2. `筛选空态`
|
||||
- 比如只看草稿时为空
|
||||
|
||||
## 10.4 页面交互
|
||||
|
||||
### 新建作品
|
||||
|
||||
点击后:
|
||||
|
||||
1. 打开 Agent launcher
|
||||
2. 创建新 session
|
||||
3. 成功后跳入 Agent workspace
|
||||
|
||||
### 草稿卡片点击
|
||||
|
||||
主按钮:
|
||||
|
||||
1. `继续创作`
|
||||
|
||||
触发:
|
||||
|
||||
1. 进入 `custom-world-agent`
|
||||
2. 带 `sessionId`
|
||||
|
||||
### 已发布卡片点击
|
||||
|
||||
主按钮:
|
||||
|
||||
1. `进入世界`
|
||||
|
||||
触发:
|
||||
|
||||
1. 读取对应 `profile`
|
||||
2. 调用当前进入世界流程
|
||||
|
||||
---
|
||||
|
||||
## 11. 与现有流程的接入方式
|
||||
|
||||
## 11.1 修改 `SelectionStage`
|
||||
|
||||
建议新增:
|
||||
|
||||
```ts
|
||||
type SelectionStage =
|
||||
| 'start'
|
||||
| 'world'
|
||||
| 'custom-world-home'
|
||||
| 'custom-world-agent'
|
||||
| ...
|
||||
```
|
||||
|
||||
## 11.2 世界选择页创建按钮改造
|
||||
|
||||
当前:
|
||||
|
||||
```text
|
||||
点击创建自定义世界
|
||||
-> 打开创建 modal
|
||||
```
|
||||
|
||||
改为:
|
||||
|
||||
```text
|
||||
点击创建自定义世界
|
||||
-> setSelectionStage('custom-world-home')
|
||||
```
|
||||
|
||||
## 11.3 创作页面与 Agent 工作区关系
|
||||
|
||||
关系必须明确:
|
||||
|
||||
1. 创作页面
|
||||
- 管理入口
|
||||
- 新建入口
|
||||
- 历史作品页
|
||||
|
||||
2. Agent 工作区
|
||||
- 具体创作编辑页
|
||||
|
||||
这两个页面不能混成一个组件。
|
||||
|
||||
---
|
||||
|
||||
## 12. UI 与交互约束
|
||||
|
||||
## 12.1 移动端优先
|
||||
|
||||
页面默认以移动端竖屏成立。
|
||||
|
||||
要求:
|
||||
|
||||
1. 新建作品区位于首屏
|
||||
2. tabs 横向可滚
|
||||
3. 作品卡优先单列
|
||||
4. 不使用桌面化大表格
|
||||
|
||||
## 12.2 页面保持清爽
|
||||
|
||||
遵守当前项目约束:
|
||||
|
||||
1. 不在页面中堆规则说明
|
||||
2. 不默认展示很多系统字段
|
||||
3. 不出现“大型表单式管理后台”感
|
||||
|
||||
## 12.3 作品卡信息密度
|
||||
|
||||
每张卡默认最多展示:
|
||||
|
||||
1. 标题
|
||||
2. 标签
|
||||
3. 更新时间
|
||||
4. 一行摘要
|
||||
5. 一张封面
|
||||
6. 一个主按钮
|
||||
|
||||
不要默认堆:
|
||||
|
||||
1. 大量统计字段
|
||||
2. 多排操作按钮
|
||||
3. 技术字段
|
||||
|
||||
---
|
||||
|
||||
## 13. 明确不做什么
|
||||
|
||||
本次创作页面 PRD 不做:
|
||||
|
||||
1. 不做完整 Agent 工作区
|
||||
2. 不做世界底稿生成
|
||||
3. 不做作品删除确认流
|
||||
4. 不做作品搜索排序高级功能
|
||||
5. 不做发布世界管理后台
|
||||
6. 不做已发布作品的二次派生创作
|
||||
|
||||
这些内容后续可接,但不属于本次页面 PRD 核心闭环。
|
||||
|
||||
---
|
||||
|
||||
## 14. 验收标准
|
||||
|
||||
做到以下几点,才算这个创作页面真正成立:
|
||||
|
||||
1. 世界选择页点击“创建自定义世界”后,进入的是独立创作页面,不再是旧弹窗。
|
||||
2. 创作页面能同时展示草稿和已发布作品。
|
||||
3. 草稿作品可以继续创作。
|
||||
4. 已发布作品可以进入世界。
|
||||
5. 新建作品入口可以正确创建 Agent session 并跳转到创作工作区。
|
||||
6. 页面在移动端首屏可用,信息层级清楚。
|
||||
7. 草稿与已发布作品都通过后端聚合接口返回,前端不自己拼数据来源。
|
||||
|
||||
---
|
||||
|
||||
## 15. 推荐落地顺序
|
||||
|
||||
## 阶段 A:先做后端聚合接口
|
||||
|
||||
先做:
|
||||
|
||||
1. `GET /api/runtime/custom-world/works`
|
||||
2. `customWorldWorkSummaryService`
|
||||
|
||||
验收:
|
||||
|
||||
- 能返回统一的作品摘要数组
|
||||
|
||||
## 阶段 B:再做前端创作页面
|
||||
|
||||
先做:
|
||||
|
||||
1. `custom-world-home` stage
|
||||
2. `CustomWorldCreationHub`
|
||||
3. 作品卡片和 tabs
|
||||
|
||||
验收:
|
||||
|
||||
- 能看到新建入口和历史作品
|
||||
|
||||
## 阶段 C:最后接 Agent workspace 跳转
|
||||
|
||||
先做:
|
||||
|
||||
1. 新建作品 -> 创建 session -> 进入 workspace
|
||||
2. 草稿 -> 恢复 session
|
||||
3. 已发布作品 -> 进入世界
|
||||
|
||||
验收:
|
||||
|
||||
- 三条主路径都通
|
||||
|
||||
---
|
||||
|
||||
## 16. 一句话结论
|
||||
|
||||
“创建自定义世界”不应该继续只是一个弹窗动作,而应该升级成一个正式的创作入口。
|
||||
|
||||
这个创作页面的本质价值,不是多做一个页面,而是把:
|
||||
|
||||
- 新建作品
|
||||
- 继续草稿
|
||||
- 查看已发布作品
|
||||
|
||||
这三类本来分散的行为,正式收口到同一个创作中心里。
|
||||
Reference in New Issue
Block a user