feat(contracts): studio.yaml 冻结生命周期 API delta /studio/{create,modify,extend}(C3)

两线开工的临门 M0 契约(前↔后交汇)。additive,零改现 draft/generate/task/
regenerate 两步路。对齐已冻 keystone source-project.schema.json + execution
§5.6 modifyPatch / §12-⑥。

新增:
- 3 端点:create(draft+generate 一步式封装,templateId 缺省 generic)/modify
  (改源不改产物:deterministic 免LLM | regenerate-module 重生成单 behavior,产
  新预览版、不动 currentVersion、走发布审核)/extend(additive 内容扩展)。
- 6 VO:StudioCreateReqVO/StudioModifyReqVO/StudioModifyTarget/StudioModifyPayload/
  StudioExtendReqVO/StudioAssetContextItem(六类素材引用,取代旧 attachments)。
- TaskChainRespVO 加 additive baseVersionId(modify/extend 血缘)。
- 头注补生命周期编排说明 + x-feign seam(aigc.submitGenerate 扩 mode/baseVersionId/
  modifyPatch/idempotency=后端线落地;project 取 base 源项目引用+新预览版落库)。

校验:YAML 解析绿、14 $ref 零悬空、六类与 keystone 逐字对齐、modifyPatch enum 对齐 §5.6。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
zizi 2026-06-17 15:46:23 +00:00
parent 5f9f9f5b32
commit d97d0bae5c

View File

@ -16,6 +16,19 @@ openapi: 3.0.3
# - aigc-api AigcApi.submitGenerate / getTask / retryTask / getTemplateList(Wave3 新增 seam,纯暴露层委托 AigcTaskService) # - aigc-api AigcApi.submitGenerate / getTask / retryTask / getTemplateList(Wave3 新增 seam,纯暴露层委托 AigcTaskService)
# attachments(R7):StudioGenerateReqVO.attachments 本波仅持久化(studio 侧落库),不透传 aigc(aigc reqDTO 无 attachments 字段);P1 再透传。 # attachments(R7):StudioGenerateReqVO.attachments 本波仅持久化(studio 侧落库),不透传 aigc(aigc reqDTO 无 attachments 字段);P1 再透传。
# 狠切留 seam 不实现(P1):rig/对白树/可视化批量;资产图仅槽位表(game_studio_asset)+ 单步调度,不六路并发。 # 狠切留 seam 不实现(P1):rig/对白树/可视化批量;资产图仅槽位表(game_studio_asset)+ 单步调度,不六路并发。
# ---------------------------------------------------------------------------
# 生命周期编排扩展(契约 C3 | 2026-06-17 固定架构+SAA studio execution §5.6/§12-⑥):
# 范式:游戏 = 长生命周期源项目(LLM as 工作室)。新增 create/modify/extend 三生命周期操作(additive,不破现 draft/generate/regenerate 两步路)。
# - POST /create = draft+generate 一步式封装(templateId 缺省 generic,一句话直生免选模板,对齐 generic 桥接 7534bdf9)。
# - POST /modify = 改源不改打包产物:在 baseVersion 源项目上改一处(换美术/调参/改关卡=确定性免 LLM;改玩法=LLM 重生成单 behavior)→ 重构建出新预览版;
# 不动 currentVersion、不自动入 feed,仍走发布审核(B1 链);失败=不建新版、base 不动。
# - POST /extend = additive 内容扩展(加关卡/机制/内容,不重写既有部件)→ 新预览版。
# 三者均委托 aigc(job 模型 mode/baseVersionId/modifyPatch/idempotency)→ SAA 固定架构图产源项目 → 唯一确定性构建 → handleCallback 唯一写入路径落包;
# 产物均经 taskChain 轮询(复用 /task/{id}),完成后 versionId=新(预览)版。
# 关联冻结契约:contracts/agent-loop/source-project.schema.json(源项目工件)、modifyPatch(execution §5.6)、六类 assetContext(取代旧 attachments,additive)。
# x-feign-contracts(新增 seam,studio 为调用方,本契约不对外暴露 Feign):
# - aigc-api AigcApi.submitGenerate 扩 mode/baseVersionId/modifyPatch/idempotencyKey(生命周期编排参数,additive;后端线落地)。
# - project-api ProjectApi 取 baseVersion 源项目引用 + 新预览版落库(version 产物权威仍在 project;源项目独立 game_source_project 表存 V18)。
info: info:
title: 造梦AI studio 模块 API title: 造梦AI studio 模块 API
version: 1.0.0 version: 1.0.0
@ -112,6 +125,68 @@ paths:
application/json: application/json:
schema: { $ref: '#/components/schemas/CommonResultStudioTaskChain' } schema: { $ref: '#/components/schemas/CommonResultStudioTaskChain' }
# ---------------------------------------------------------------------------
# 生命周期操作(契约 C3,execution §5.6/§12-⑥;additive,不破现两步路)
# ---------------------------------------------------------------------------
/app-api/studio/create:
post:
tags: [app-studio]
summary: 一步式创作(C3;draft+generate 封装,P-CRT-01/10)
description: >-
编排:建草稿(委托 project createProject,templateId 缺省 generic)→ 立即委托 aigc submitGenerate → 落任务链(status=1)
→ 返回任务链句柄供前端轮询(复用 /task/{id})。一步式封装,不破现 draft+generate 两步路(additive)。
六类 assetContext 透传生成上下文(取代旧 attachments)。
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/StudioCreateReqVO' }
responses:
'200':
description: 成功(任务链句柄,含 aigc_task_id)
content:
application/json:
schema: { $ref: '#/components/schemas/CommonResultStudioTaskChain' }
/app-api/studio/modify:
post:
tags: [app-studio]
summary: 修改(C3;改源不改产物,P-CRT-09 进阶)
description: >-
编排:取 baseVersion 源项目 → 应用 modifyPatch(mode=deterministic 确定性编辑免 LLM / regenerate-module LLM 只重生成单 behavior)
→ 唯一确定性构建出新预览版 → 落任务链供轮询。产物=新预览版(不动 currentVersion、不自动入 feed,仍走发布审核);
失败=不建新版、base 不动。modifyPatch 字段见 execution §5.6。
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/StudioModifyReqVO' }
responses:
'200':
description: 成功(新预览版任务链句柄,完成后 versionId=新预览版、baseVersionId=被改版本)
content:
application/json:
schema: { $ref: '#/components/schemas/CommonResultStudioTaskChain' }
/app-api/studio/extend:
post:
tags: [app-studio]
summary: 扩展(C3;additive 内容扩展)
description: >-
编排:在 baseVersion 源项目上做 additive 内容扩展(加关卡/机制/内容)→ 重构建出新预览版 → 落任务链供轮询。
语义=additive(不重写既有部件);产物处置同 modify(新预览版、不动 currentVersion、走发布审核)。
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/StudioExtendReqVO' }
responses:
'200':
description: 成功(新预览版任务链句柄)
content:
application/json:
schema: { $ref: '#/components/schemas/CommonResultStudioTaskChain' }
components: components:
schemas: schemas:
# ========== 请求 VO ========== # ========== 请求 VO ==========
@ -132,6 +207,64 @@ components:
prompt: { type: string, maxLength: 1000, description: '一句话 Prompt(透传 aigc submitGenerate)', example: '做一个躲避陨石的小游戏' } prompt: { type: string, maxLength: 1000, description: '一句话 Prompt(透传 aigc submitGenerate)', example: '做一个躲避陨石的小游戏' }
attachments: { type: string, description: '附件上下文 JSON(P-CRT-04);【本波仅持久化,P1 透传 aigc】——studio 侧落库持久化,本波不透传 aigc' } attachments: { type: string, description: '附件上下文 JSON(P-CRT-04);【本波仅持久化,P1 透传 aigc】——studio 侧落库持久化,本波不透传 aigc' }
# ---- 生命周期操作请求 VO(契约 C3,execution §5.6)----
StudioCreateReqVO:
type: object
required: [title, prompt]
description: 一步式创作(draft+generate 封装);templateId 缺省 generic,assetContext 取代旧 attachments
properties:
title: { type: string, maxLength: 128, description: '作品标题(透传 project createProject)', example: '我的放置小镇' }
prompt: { type: string, maxLength: 1000, description: '一句话 Prompt(一步式必填,透传 aigc)', example: '做一个躲避陨石的小游戏' }
templateId: { type: string, description: '玩法模板/品类引导 ID;缺省 generic(一句话直生免选模板,对齐 7534bdf9)', example: 'generic' }
assetContext: { type: array, items: { $ref: '#/components/schemas/StudioAssetContextItem' }, description: '六类素材引用(取代旧 attachments,additive);空=纯一句话生成' }
idempotencyKey: { type: string, maxLength: 64, description: '幂等键(C3;防重复提交触发重复生成,可空)' }
StudioModifyReqVO:
type: object
required: [baseVersionId, mode, target]
description: 改源不改产物(execution §5.6 modifyPatch);产新预览版,不动 currentVersion,走发布审核
properties:
baseVersionId: { type: integer, format: int64, description: '被改的 base 产物版本 ID(project.game_version.id)', example: 4096 }
mode: { type: string, enum: [deterministic, regenerate-module], description: 'deterministic=确定性编辑源文件免 LLM;regenerate-module=LLM 只重生成单 behavior 模块', example: 'deterministic' }
target: { $ref: '#/components/schemas/StudioModifyTarget' }
payload: { $ref: '#/components/schemas/StudioModifyPayload' }
idempotencyKey: { type: string, maxLength: 64, description: '幂等键(C3,可空)' }
StudioModifyTarget:
type: object
required: [kind]
description: 寻址源项目部件(path 与 id 二选一)
properties:
kind: { type: string, enum: [asset, config, level, behavior], description: '换美术=asset / 调参=config / 改关卡=level(scene) / 改玩法=behavior' }
path: { type: string, description: '源项目内 JSON 指针(如 /config/speed、/assets/0、/gameDefinition/scenes/2)', example: '/config/speed' }
id: { type: string, description: '或按部件 id 寻址(behaviors[].id / assets[].id)' }
StudioModifyPayload:
type: object
description: mode=deterministic 用 value(直接覆写免 LLM);mode=regenerate-module 用 intent(喂 LLM 重生成意图)
properties:
value: { type: object, additionalProperties: true, description: 'deterministic 新值(确定性覆写)' }
intent: { type: string, maxLength: 1000, description: 'regenerate-module 改玩法逻辑的自然语言意图(只重生成那一个 behavior)', example: '把陨石下落改成会左右摇摆' }
StudioExtendReqVO:
type: object
required: [baseVersionId, intent]
description: additive 内容扩展(加关卡/机制/内容),不重写既有部件
properties:
baseVersionId: { type: integer, format: int64, description: '在哪个产物版本上扩展', example: 4096 }
intent: { type: string, maxLength: 1000, description: '扩展意图(加关卡/机制/内容)', example: '再加一个 boss 关卡' }
assetContext: { type: array, items: { $ref: '#/components/schemas/StudioAssetContextItem' }, description: '扩展用的新增六类素材引用(可空)' }
idempotencyKey: { type: string, maxLength: 64, description: '幂等键(C3,可空)' }
StudioAssetContextItem:
type: object
required: [category, ref]
description: 六类素材引用(对齐 source-project.schema.json assetSpec.category;取代旧 attachments)
properties:
category: { type: string, enum: [sprite, character, effect, scene, ui, music], description: '六类:图元/角色/特效/场景/界面/音乐' }
ref: { type: string, description: '平台 assetId/ref(主)', example: 'asset_88231' }
url: { type: string, format: uri, description: '只读镜像 URL(可空)' }
# ========== 响应 VO ========== # ========== 响应 VO ==========
StudioTemplateRespVO: StudioTemplateRespVO:
type: object type: object
@ -164,6 +297,7 @@ components:
status: { type: integer, description: '任务链状态:0初始 1生成中 2完成 3失败', example: 1 } status: { type: integer, description: '任务链状态:0初始 1生成中 2完成 3失败', example: 1 }
progress: { type: integer, description: '进度百分比 0-100(透传 aigc)', example: 60 } progress: { type: integer, description: '进度百分比 0-100(透传 aigc)', example: 60 }
retryOf: { type: integer, format: int64, description: '若为重生成,指向原任务链 ID(P-CRT-09 血缘)', example: 1000 } retryOf: { type: integer, format: int64, description: '若为重生成,指向原任务链 ID(P-CRT-09 血缘)', example: 1000 }
baseVersionId: { type: integer, format: int64, description: 'modify/extend 血缘:本预览版派生自的 base 版本(create/generate 为空,additive)', example: 4096 }
# ========== CommonResult 信封 ========== # ========== CommonResult 信封 ==========
CommonResultStudioTemplateList: CommonResultStudioTemplateList: