文档:定稿BGM提示词优化规则

融合画板音乐权威设计,固定BGM原样Prompt、预设、补全、简化、撤销和提交锁口径。
追加长期决策,明确SFX、字段名、External v1和LLM日志策略保持不变。
This commit is contained in:
2026-08-04 06:31:14 +00:00
parent e6b3199490
commit 8daf85df6c
2 changed files with 190 additions and 4 deletions
@@ -5935,3 +5935,11 @@
- Agent 发现:新增公开 `agent-integration.json``skill/SKILL.md``skill.zip`。manifest 同时声明 MCP、OpenAPI、完整 Skill archive、SHA-256 和包内清单;archive 必须包含 `SKILL.md`、上述四篇 references、stdlib Python helper 和 `agents/openai.yaml` 七个声明文件,不能只提供 OpenAPI JSON,也不能包含 API Key、本机路径或个人配置。完整 `skill.zip` 只供不支持 MCP 或需要本地文件上传编排的 Agent 使用,不作为 MCP resource。
- 兼容边界:这是基于「截至 2026-07-31 尚无外部第三方存量调用方」接受的 v1 原地 breaking change;一旦出现外部活跃 Key、公开契约或联调方,后续破坏性变更必须保留兼容、经过弃用期或升级 `/api/external/v2`
- 关联文档:`docs/【后端架构】外部OpenAPI与APIKey接入方案-2026-06-19.md``docs/technical/【后端架构】外部生成Worker化方案-2026-06-03.md``.codex/skills/genarrative-external-editor-api/SKILL.md`
## 2026-08-04 图片画布 BGM Prompt 采用单一原文与面板级同步提交锁
- 背景:图片画布背景音乐链路原先会在前端、BFF 和 Suno body 构造阶段清理 Prompt,并为空值提供默认回退,无法保证用户输入、正式请求和生成记录完全等值;新增预设和 AI 助手后,还需要明确与现有 SFX、请求字段和生成生命周期的边界。
- 决策:本规则只适用于 `audio-background-music`,并在该模式内取代 2026-08-03「编辑器持久化的 `prompt` 统一表示规范化用户意图」的泛化表述;其它图片、角色和图标生成语义不变。输入框当前完整原文是唯一最终 BGM Prompt,预设可见文本写入后属于该 Prompt,预设 ID、分组、颜色和内部引导不得进入正式请求。全链路不得 `trim`、规范化、合并换行、删除零宽字符、替换标点或静默截断,200 字上限按 Unicode code point 计算;0 个非 Unicode 空白字符不能生成,1 个可正式生成,至少 2 个且不超限时可 AI 补全。请求字段继续使用 `gptDescriptionPrompt` / `gpt_description_prompt`,不得改名为 `actualPrompt``actual_prompt` 继续是资源 / 素材审计字段,但当前 BGM 链路中的输入框、BFF、Suno body、生成记录 `prompt` / `actual_prompt` 和结果最终文本必须等值。AI 补全与 `180 -> 170`、最多两次的一键简化只走登录态内部 BFF,不调用 Suno、不创建任务、不扣正式音乐生成泥点;程序不截断,也不硬编码内容保留规则,成功后只保存一层 Prompt 交换快照。正式生成在点击事件内、任何 `await` 前同步锁定当前 BGM generation dialog,后续重复点击忽略;拒绝时恢复原 Prompt 和既有快照,接受后进入现有 `queued/generating` 占位,不锁整个画布或其它 dialog。
- 影响范围:画板音乐权威设计、BGM composer 与临时状态模型、`editorProjectClient``shared-contracts` 内部助手 DTO、`api-server` 登录态 Prompt 助手与正式 BGM BFF、`platform-audio` Suno body builder,以及 BGM 提交与端到端测试。SFX 继续使用 Vidu `audio1.0`、现有规范化和默认 Prompt;不修改 SpacetimeDB schema、External v1 / OpenAPI、Suno 三字段 body、固定模型 / 泥点展示或现有 LLM 原文日志策略。
- 验证方式:TypeScript 与 Rust 对空白、换行、零宽字符、组合字符、ZWJ emoji 和 199 / 200 / 201 code point 得出一致计数;端到端断言输入框、BFF、Suno body、记录和响应原文等值;状态测试覆盖预设追加、补全 / 简化失败不覆盖、单层交换撤销、迟到响应和同 dialog 双击只产生一次任务与一次扣费;SFX 请求体、1500 字限制、时长和默认 Prompt 回归不变。文档阶段运行 `npm run check:encoding``git diff --check`
- 关联文档:`docs/【编辑器】画板音乐生成入口设计-2026-06-18.md``docs/technical/【前端架构】图片画布编辑器MVP接入方案-2026-06-11.md`
@@ -2,10 +2,14 @@
日期:`2026-06-18`
更新时间:`2026-08-04`
## 范围
本次只在 `/editor/canvas` 图片画布编辑器内新增底部 `生成音乐` 入口,用于生成完整游戏音效或游戏背景音乐。该入口属于画板生成类工具,不新增平台玩法入口、不进入作品发布链路,也不修改现有视觉小说音频生成开关。
2026-08-04 起,本文增加 BGM Prompt 优化 V1.0 口径。该切片只修改 `audio-background-music``audio-sound-effect` 的 UI、Prompt 回退、Vidu `audio1.0` 请求、`2-10` 秒时长和 1500 字限制全部保持不变。共用组件若需要调整,必须按生成器模式隔离行为,不得把 BGM 规则扩散到 SFX。
## 入口与交互
1. 底部 AI 画布工具栏新增 `生成音乐`
@@ -13,7 +17,7 @@
- `生成游戏音效`
- `生成游戏背景音乐`
3. 选择某一项后创建独立 `generation-dialog` 画布生成对象,并通过现有 placement 模型避让已有图层和占位。
4. 面板 UI 复用 `生成角色形象` 的紧凑结构:上方为字段区,底部为参数 / 模型 / 生成按钮区,不写规则说明类文案。音效参数按钮靠左下角,固定模型胶囊紧贴生成按钮;背景音乐同样在右下角显示固定模型胶囊并紧贴生成按钮。
4. 面板 UI 复用 `生成角色形象` 的紧凑结构:上方为字段区,底部为参数 / 模型 / 生成按钮区,不写规则说明类文案。音效参数按钮靠左下角,固定模型胶囊紧贴生成按钮;背景音乐字段区增加字符计数、可展开预设词条、AI 补全、一键简化和单层撤销,底部仍保留现有动态泥点价格、固定 `Suno` 模型胶囊生成按钮。
5. 生成中隐藏设置面板,只保留画布中的音频生成占位;失败后恢复面板并展示短错误。
## 面板字段
@@ -27,10 +31,135 @@
### 生成游戏背景音乐
- `gpt_description_prompt`:用户输入的背景音乐提示词
- `gpt_description_prompt`:用户输入框当前显示的完整背景音乐提示词,是正式 BGM 生成的唯一最终 Prompt
- `make_instrumental`:固定传 `true`,不在 UI 中展示为可改字段。
- 提交到 VectorEngine 时映射为 Suno 纯音乐模式字段:`mv``gpt_description_prompt``make_instrumental: true``mv` 后端固定使用默认 Suno 模型,UI 以禁用态模型胶囊显示 `Suno`
- `gpt_description_prompt` 按 Apifox 契约限制 200 字,超出时由 BFF 返回参数错误
- 前端请求继续使用 `gptDescriptionPrompt`Rust DTO 继续使用 `gpt_description_prompt`;不得因“唯一最终 Prompt”语义把请求字段改名为 `actualPrompt`。响应中的 `actualPrompt` / `actual_prompt` 继续保留既有生成审计语义
- `gpt_description_prompt` 按 Apifox 契约限制 200 个 Unicode code point。前端、BFF 和 `platform-audio` 只校验,不执行 `trim`、Unicode 规范化、空白折叠、换行转换、标点替换或静默截断。
## BGM Prompt 优化 V1.0
### 唯一最终 Prompt 与字符口径
- 预设和 AI 助手都只修改同一个 BGM 输入框。输入框当前显示的完整字符串是唯一最终 Prompt,不维护另一份“实际 Prompt”、选中预设集合或内部拼接结果。
- 正式生成时,输入框、前端 BFF 请求、Suno body、生成记录 `prompt`、生成记录 `actual_prompt` 和结果响应中的最终文本必须逐 code point 完全一致。
- 用户 Prompt 原样处理:不执行 `trim`,不转换或合并换行,不删除零宽字符,不执行 NFC 或其它 Unicode 规范化,不折叠空格,不替换标点,不静默截断。
- 总字符数按输入框实际字符串的 Unicode code point 数计算。TypeScript 使用 `Array.from(prompt).length`Rust 使用 `prompt.chars().count()`
- “有效字符”只用于动作可用性和参数校验,定义为非 Unicode 空白 code point;它不改变原字符串。标点、数字、字母、空格、换行和不可见 code point 都计入 200 字总数。
| 当前输入 | AI 补全 | 一键简化 | 正式生成 |
| --- | --- | --- | --- |
| 0 个有效字符 | 禁止 | 禁止 | 禁止 |
| 1 个有效字符且总数不超过 200 | 禁止 | 禁止 | 允许 |
| 至少 2 个有效字符且总数不超过 200 | 允许 | 禁止 | 允许 |
| 总数超过 200 | 禁止 | 允许 | 禁止 |
### 预设库与追加规则
预设分为三组,仅用于颜色和滚动组织;分组、ID、颜色等隐藏元数据不进入 Prompt、Suno 请求或生成记录。写入输入框的是下表右列完整可见文本。
| 分组 | 预设 | 写入输入框的文本 |
| --- | --- | --- |
| 用途 | 菜单待机 | 低干扰、适合菜单待机的背景音乐 |
| 用途 | 休闲消除 | 轻快可爱的休闲消除背景音乐 |
| 用途 | 解谜思考 | 安静专注的解谜思考背景音乐 |
| 用途 | 探索冒险 | 温和推进的探索冒险背景音乐 |
| 用途 | 对白场景 | 克制柔和、留出对白空间的背景音乐 |
| 用途 | 战斗前 | 蓄势待发的战斗前背景音乐 |
| 用途 | 胜利结算 | 明亮满足的胜利结算背景音乐 |
| 用途 | 失败结算 | 克制低落的失败结算背景音乐 |
| 用途 | 日常经营 | 轻松有序的日常经营背景音乐 |
| 用途 | 农场经营 | 自然温暖的农场经营背景音乐 |
| 用途 | 校园日常 | 青春轻松的校园日常背景音乐 |
| 用途 | 美食厨房 | 温暖活泼的美食厨房背景音乐 |
| 氛围 | 温暖治愈 | 柔和明亮的治愈背景音乐 |
| 氛围 | 神秘悬疑 | 克制神秘的悬疑背景音乐 |
| 氛围 | 紧张推进 | 稳定推进、逐渐紧张的背景音乐 |
| 场景 | 森林自然 | 清新自然的森林背景音乐 |
| 场景 | 雨夜静谧 | 雨夜静谧、略带神秘感的背景音乐 |
| 场景 | 海洋漂流 | 开阔舒缓的海洋漂流背景音乐 |
| 场景 | 山野远行 | 自由舒展的山野远行背景音乐 |
| 场景 | 糖果乐园 | 甜美活泼的糖果乐园背景音乐 |
| 场景 | 温馨小屋 | 温暖安静的温馨小屋背景音乐 |
| 场景 | 城市夜晚 | 克制迷人的城市夜晚背景音乐 |
| 场景 | 太空科幻 | 空灵未来感的太空科幻背景音乐 |
| 场景 | 赛博街区 | 冷静律动的赛博街区背景音乐 |
| 场景 | 古风幻想 | 空灵雅致的古风幻想背景音乐 |
| 场景 | 童话花园 | 梦幻轻盈的童话花园背景音乐 |
| 场景 | 海底遗迹 | 深邃神秘的海底遗迹背景音乐 |
| 场景 | 沙漠遗迹 | 苍茫神秘的沙漠遗迹背景音乐 |
| 场景 | 熔岩洞穴 | 炽热压迫的熔岩洞穴背景音乐 |
| 场景 | 奇妙博物馆 | 好奇灵动的奇妙博物馆背景音乐 |
点击预设时:
1. 输入框原始字符串为空,直接写入该预设的完整可见文本。
2. 输入框原始字符串非空,检查原文最后一个 Unicode code point。
3. 最后一个字符属于 Unicode 标点类别时,直接追加预设文本;否则先追加中文句号 `。`,再追加预设文本。
4. 不对原文执行 `trim`。原文以空格或换行结尾时,句号追加在这些原始字符之后。
5. 允许重复点击同一预设,每次都按同一规则追加。
6. 点击任意预设后清除旧撤销快照并隐藏撤销按钮。
7. 追加后允许超过 200 字,完整文本必须保留;超限只复用现有通用 Prompt 过长状态,不增加预设专用警告。
预设滚动交互:
- 展开后全部词条横向、连续、缓慢循环;收起后隐藏词条并停止可见滚动。
- 桌面端左侧 15% 悬停区快速向左滚动,中间 70% 立即暂停并稳定展示至少 5 个词条,右侧 15% 快速向右滚动;鼠标移出后恢复默认慢速循环。
- 左右箭头所在区域也必须触发对应方向的加速滚动,避免箭头可见但悬停无反馈。
- 循环使用多份词条队列无缝衔接,末端不跳回、不留白,也不提供“换一批”。
- 三组词条使用协调但可区分的颜色;底部细线标记当前悬停控制区。
- 组件在触摸环境被渲染时支持横向滚动和箭头操作,不依赖 hover 才能选择预设;本需求不恢复移动端图片画布入口。
- AI 处理或正式提交期间暂停滚动并禁用展开、收起、箭头和词条点击。
### AI 补全
- 至少 2 个有效字符且总字符数不超过 200 时允许调用。前端把输入框原始字符串传给登录态内部 BFF,不做前置清理。
- 默认模型使用现有编辑器 Agent LLM 配置中的 `gpt-5.4-mini`Prompt 助手复用现有 `LlmClient`,不建立新的平台 LLM 能力。
- 服务端模板必须要求:保留用户明确的主题、场景、风格、情绪、乐器、能量、韵律、时长、循环和避免项;按场景选择性补足场景、氛围、能量、韵律、乐器、旋律、声音设计、循环和避免项,不为凑全方向堆砌形容词。
- 用户描述已足够完整时,只补充一至两个与主题匹配的具体声音细节。发现冲突时,优先级为“明确避免项和限制 > 明确玩法用途与场景 > 风格、情绪、能量与韵律 > AI 补充细节”。
- 输出只允许一条可直接写回输入框的中文 BGM Prompt;不得包含解释、标题、Markdown、JSON、代码块、具体艺人或歌曲模仿要求。
- 结果必须包含有效字符且不超过 200 个 Unicode code point。校验通过后整段替换输入框;调用失败、结果为空、格式非法或超限时保留原文,不写回部分结果。
- 补全过程不调用 Suno、不创建正式生成任务、不触发正式音乐生成扣费。
### 一键简化
- 只在当前 Prompt 总字符数超过 200 时允许调用。点击前保存完整原文,AI 处理中保持输入框原文不变。
- 第一次简化目标为 180 字;180 不是硬门槛,只要候选不超过 200 字、格式合法且 LLM 判断内容完整即可通过。
- 第一次候选超过 200 字、格式非法、LLM 判断内容不完整或存在明显残句时,自动进行唯一一次重试,目标为 170 字。
- 第二次仍不合格时返回失败并保留原文,提示用户手动精简;最多两次 LLM 调用,任何情况下都不得由程序截断到 200 字。
- 简化模板必须优先保留明确限制、场景与用途、情绪与风格、核心乐器与速度、能量/韵律/旋律、循环结构、区分度较高的声音设计,再删除次要修饰细节;不得改变专有名词、BPM、调性、时长、数值、乐器和明确限制。
- 程序不抽取关键词,不对原文与候选执行内容硬编码逐项比对。是否保留重要信息、内容是否完整、是否形成明显残句由 LLM 在同一次调用的内部结构化结果中判断。
- 内部结构化结果同时包含候选 Prompt 与完整性判断;BFF 对外只返回已通过校验的 Prompt 和程序计算的字符数,不暴露内部判断字段。
- 程序只负责确定性校验:结构可解析、候选包含有效字符、格式合法、实际字符数不超过 200。字符数必须由程序计算,不采信模型报告。
- 一键简化不维护或恢复“已选预设”元数据;预设已写入输入框的文本只是当前最终 Prompt 的一部分。
### 单层撤销
- AI 补全和一键简化成功都必须产生一层 Prompt 快照。发起 AI 操作前,以当时的当前 Prompt 建立本次临时快照。
- AI 成功写回后,该快照成为可撤销版本;AI 失败且原文未变时清除本次临时快照,不生成新的可撤销版本。
- 用户手动编辑 AI 结果后,撤销仍可用。再次发起 AI 操作时,以当时的当前 Prompt 替换旧快照。
- 点击预设清除旧快照;正式提交被后端拒绝时,恢复并保留提交前已有快照。
- 点击撤销时,当前 Prompt 与快照互换;按钮继续可用,允许用户在两个版本间来回切换。
- 只保存一层,快照只包含 Prompt,不包含预设滚动位置、展开状态、模型、时长或其它参数。
### AI 操作与方案 A 提交锁
当前 BGM generation dialog 的 Prompt 助手状态为:
```text
idle
├─ completing
├─ simplifying
└─ submitting
```
- `completing` / `simplifying` 开始时以同步 operation ID 取得当前 dialog 操作权;同一操作的后续双击无效。新操作使旧 operation ID 失效,关闭 dialog 时中止请求,dialog ID 或 operation ID 不匹配的迟到响应必须丢弃。
- AI 处理中输入框只读,禁用预设展开/收起、预设词条、滚动箭头、AI 补全、一键简化、撤销和生成。
- 点击生成的同步事件内必须在任何 `await` 前把当前 BGM dialog 切换到 `submitting`。提交中锁定该 dialog 的输入框、预设、展开/收起、滚动箭头、AI 操作、撤销、参数控件和生成按钮,忽略后续重复点击。
- 锁只作用于当前 BGM dialog,不锁整个画布、其它 generation dialog、画布拖动、缩放、图层操作或其它编辑能力。
- 后端拒绝正式提交时,解除锁,恢复当前面板并保留用户原始 Prompt 与提交前已有撤销快照,继续使用现有正式生成错误展示。
- 后端接受请求并创建正式生成任务后,`submitting` 结束,当前 dialog 进入现有 `queued/generating` 占位;输入 composer 继续隐藏,同一任务不得再次提交。
- “提交成功”仅表示后端已接受请求并创建正式任务,不表示 Suno 已完成音乐生成。
## 画布数据
@@ -54,7 +183,7 @@
- 元数据弹窗按音频显示 `音频信息` / `音频类型` / `时长`,生成输入快照只展示用户面板字段。
- 音频图层上方浮动工具栏只保留 `改造``下载按钮`。点击 `改造` 后打开对应的音效或背景音乐生成面板,不展示参考图组件;面板底部模型与参数位置和原生成入口一致,并允许继续修改后再次生成,新结果落在原音频旁边。
## 前端提交契约
## 前端与 BFF 契约
前端新增两个 BFF client
@@ -77,6 +206,35 @@ POST /api/editor/audios/background-music/generations
}
```
BGM Prompt 助手新增两个登录态内部 BFF:
```ts
POST /api/editor/audios/background-music/prompts/completions
{
currentPrompt: string
}
```
```ts
POST /api/editor/audios/background-music/prompts/simplifications
{
currentPrompt: string
}
```
统一 Prompt 助手响应:
```ts
{
prompt: string,
charCount: number
}
```
- 客户端不得提交 `maxChars``targetChars`、模型名、预设 ID、分组、颜色、内部模板或完整性判断;这些由服务端固定。
- 两个助手 BFF 不调用 Suno、钱包扣费、正式 generation queue、OSS、素材库或 SpacetimeDB。
- BGM 正式提交必须使用输入框当前原始 Prompt,不再调用 `dialog.prompt.trim()`,也不再把空 Prompt 回退为“游戏背景音乐”。
统一响应:
```ts
@@ -102,8 +260,10 @@ POST /api/editor/audios/background-music/generations
## 后端实现
-`shared-contracts/src/assets.rs` 增加编辑器音频请求 / 响应 DTO。
-`shared-contracts` 增加最小 BGM Prompt 助手请求 / 响应 DTO;前后端共享 `currentPrompt``prompt``charCount` 字段,不把内部 LLM 判断暴露给客户端。
-`platform-audio` 增加编辑器专用 body builder 和 submit 函数:
- 背景音乐 body 使用 `mv``gpt_description_prompt``make_instrumental`
- 背景音乐增加“只校验、不清理”的 Prompt 校验:检查至少一个有效字符和最多 200 个 Unicode code point,校验通过后原样构造 Suno body。不得继续复用会执行 `trim``normalize_limited_text`
- Suno 音乐接口路径固定为 `/suno/submit/music``VECTOR_ENGINE_BASE_URL` 即使配置为带 `/v1` 的图片接口根,也要在 `platform-audio` 中归一为根路径后再拼接,避免误请求 `/v1/suno/submit/music`
- 音效 body 使用 Vidu 文生音频契约:提交 `/ent/v2/text2audio`,请求体包含 `model: "audio1.0"``prompt``sound: prompt``duration` 和可选 `seed``model``prompt` 为文档必填,`sound` 用于兼容线上网关实际校验,`prompt` 最长 1500 字符,`duration` 按 Vidu 文档限制在 `2-10` 秒。
- 编辑器音效轮询使用 Vidu 路径 `/ent/v2/tasks/{taskId}/creations`,不再使用 Suno `/suno/fetch/{taskId}`Suno 文生音效 `task: "sound"` 暂不从编辑器入口暴露。
@@ -112,8 +272,15 @@ POST /api/editor/audios/background-music/generations
-`api-server` 增加编辑器音频 BFF
- `/api/editor/audios/sound-effects/generations`
- `/api/editor/audios/background-music/generations`
-`api-server` 增加登录态内部 BGM Prompt 助手 BFF
- `POST /api/editor/audios/background-music/prompts/completions`
- `POST /api/editor/audios/background-music/prompts/simplifications`
- Prompt 助手 BFF 使用现有编辑器专用 LLM client 和 `gpt-5.4-mini` 默认配置;补全固定执行一次,简化按 `180 -> 170` 最多两次。服务端负责模板组装、原始字符校验、内部结构化完整性判断和现有 API 错误 envelope。
- Prompt 助手继续复用 `LlmClient` 现有失败原文日志行为。本需求不增加请求级日志开关、脱敏、metadata-only 模式或相关上线门禁。
- BGM generation BFF 必须改用“只校验、不清理”的原始 Prompt 校验,删除空 Prompt 默认回退;SFX 继续使用现有规范化、回退、Vidu body 和 1500 字限制。
- BFF 复用现有 `vector_engine_audio_generation` 的任务轮询、下载、OSS 持久化和计费包装;音效 10 泥点,背景音乐 5 泥点。
- 生成音频持久化后返回 OSS `objectKey``assetObjectId`;前端保存素材库时继续使用 `audioSrc` 作为兼容路径,并把 OSS 身份写入素材记录。
- 本切片不修改 SpacetimeDB schema,不新增 Prompt 助手持久化表,不向 `/api/external/v1` 暴露助手,也不修改 External v1 OpenAPI 或 `platform-llm` 日志策略。
## 验收
@@ -134,3 +301,14 @@ POST /api/editor/audios/background-music/generations
- 音频素材浮动工具栏只显示 `改造``下载按钮``改造` 复用对应生成面板且没有参考图组件。
- 私有 generated 音频能先换签再预览播放,不出现播放条一直为 `0:00` 的裸路径失败状态。
- 刷新后 layout 能恢复音频生成器和音频图层。
- BGM 输入框按 Unicode code point 显示 `0 / 200` 计数;0 个有效字符不能生成,1 个有效字符可以生成但不能 AI 补全,至少 2 个有效字符且不超限时可以 AI 补全,201 个 code point 时只能一键简化。
- 三组 30 个 BGM 预设按本文固定文案写入或追加;重复点击、Unicode 标点结尾、空格 / 换行结尾和追加后超限都不清理或丢失原文。
- 预设展开后默认无缝慢速循环,桌面端左 / 中 / 右区域分别加速向左、暂停、加速向右,左右箭头同步加速;组件在触摸环境被渲染时可横向滚动并选择词条,本需求不恢复移动端图片画布入口。
- AI 补全成功后只写回一条不超过 200 字的中文 Prompt,失败、空值、格式错误或超限结果不修改输入框,也不调用 Suno 或扣除正式音乐生成泥点。
- 一键简化只处理超过 200 字的 BGM Prompt,按 180 字目标尝试一次,必要时按 170 字目标重试一次;第二次仍失败时保留原文,程序不得截断。
- AI 补全和简化成功均产生一层交换式撤销快照;手动编辑后仍可撤销,点击预设清除快照,点击撤销可在两个版本间反复互换。
- AI 操作的旧响应、关闭 dialog 后的响应或其它 dialog 的响应不得覆盖当前 Prompt;同一按钮双击只产生一个有效助手请求。
- BGM 点击生成后在首个 `await` 前同步锁定当前 dialog;同一 dialog 快速重复点击只产生一次正式请求、一个生成任务和一次扣费,不锁整个画布或其它 dialog。
- BGM 正式提交不再 `trim` 或回退默认 Prompt;包含首尾空格、LF / CRLF、零宽字符、组合字符或 ZWJ emoji 的合法 Prompt 在输入框、BFF、Suno body、生成记录和结果响应中完全一致。
- BGM Suno body 仍只包含 `mv``gpt_description_prompt``make_instrumental`,固定 `Suno` 胶囊和动态泥点价格不变;SFX 的 Vidu body、默认 Prompt、时长与 1500 字限制无回归。
- 本切片的定向前端、shared-contracts、`api-server``platform-audio` 和端到端 Prompt 等值测试通过,并执行 `npm run typecheck`、对应 Rust 定向测试、`npm run check:encoding``git diff --check`