@starreel/mcp 0.1.201 → 0.1.206

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/openapi.json CHANGED
@@ -2,8 +2,8 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "StarReel Production API",
5
- "version": "0.1.201",
6
- "description": "Turn a script into a finished, downloadable short-drama episode over REST.\n\nPipeline: script → AI rewrite → cast/scenes/props extraction → storyboards → portraits & sheets + scene plates → keyframes → video shots → TTS → final cut (.mp4).\n\n**Billing is prepaid and agent-safe**: big-ticket stages are quote-then-generate (`quote_*` returns a `quote_id`). For video, quote == actual charge. For images the quote is a *range* — models billed per reference image are priced before those are assembled, so `estimated_points` is the upper bound (size the balance by it and a run never dies half-way) and `typical_points` is the usual cost; fixed-price models return the two equal. Insufficient balance returns 402 — nothing half-runs and the account never goes negative.\n\nAuth: exchange your API key at `POST /v1/agent/token` for a 15-minute bearer token.\n\nGenerated from the @starreel/mcp v0.1.201 tool surface (operationIds match MCP tool names 1:1)."
5
+ "version": "0.1.206",
6
+ "description": "Turn a script into a finished, downloadable short-drama episode over REST.\n\nPipeline: script → AI rewrite → cast/scenes/props extraction → storyboards → portraits & sheets + scene plates → keyframes → video shots → TTS → final cut (.mp4).\n\n**Billing is prepaid and agent-safe**: big-ticket stages are quote-then-generate (`quote_*` returns a `quote_id`). For video, quote == actual charge. For images the quote is a *range* — models billed per reference image are priced before those are assembled, so `estimated_points` is the upper bound (size the balance by it and a run never dies half-way) and `typical_points` is the usual cost; fixed-price models return the two equal. Insufficient balance returns 402 — nothing half-runs and the account never goes negative.\n\nAuth: exchange your API key at `POST /v1/agent/token` for a 15-minute bearer token.\n\nGenerated from the @starreel/mcp v0.1.206 tool surface (operationIds match MCP tool names 1:1)."
7
7
  },
8
8
  "servers": [
9
9
  {
@@ -4012,6 +4012,422 @@
4012
4012
  }
4013
4013
  }
4014
4014
  },
4015
+ "/episodes/{episode_id}/acceptance-criteria": {
4016
+ "get": {
4017
+ "operationId": "get_acceptance_criteria",
4018
+ "summary": "读本集的**客户验收项**(免费):客户对某一镜或整集提的具体要求,每项三个状态分开存——auto_review(平台自动审查,按层;not_covered=平台没有能判这一类的判据,no_related_finding 不等于满足要求)、",
4019
+ "description": "读本集的**客户验收项**(免费):客户对某一镜或整集提的具体要求,每项三个状态分开存——auto_review(平台自动审查,按层;not_covered=平台没有能判这一类的判据,no_related_finding 不等于满足要求)、agent_qc(你在 submit_qc_report 里逐条核对的结论,按层)、client(客户本人确认)。★平台审查通过、你的通用质检通过,都不代表客户的具体要求通过——交付前对照这里逐条讲给客户。orphan=true 表示绑的镜已删除(改绑或删除)。",
4020
+ "tags": [
4021
+ "episodes"
4022
+ ],
4023
+ "parameters": [
4024
+ {
4025
+ "name": "episode_id",
4026
+ "in": "path",
4027
+ "required": true,
4028
+ "schema": {
4029
+ "type": "integer",
4030
+ "exclusiveMinimum": 0
4031
+ }
4032
+ }
4033
+ ],
4034
+ "responses": {
4035
+ "200": {
4036
+ "description": "StarReel envelope",
4037
+ "content": {
4038
+ "application/json": {
4039
+ "schema": {
4040
+ "type": "object",
4041
+ "properties": {
4042
+ "code": {
4043
+ "type": "integer"
4044
+ },
4045
+ "message": {
4046
+ "type": "string"
4047
+ },
4048
+ "data": {
4049
+ "description": "Operation result payload"
4050
+ }
4051
+ }
4052
+ }
4053
+ }
4054
+ }
4055
+ },
4056
+ "402": {
4057
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
4058
+ }
4059
+ }
4060
+ },
4061
+ "post": {
4062
+ "operationId": "add_acceptance_criteria",
4063
+ "summary": "登记客户验收项(免费):客户对某一镜或整集提出**具体要求**(身份、服装、道具颜色、嘴型、画面瑕疵等)时,按客户原话登记成一条,之后 review_frames / review_videos 会把它追加进 agent_qc",
4064
+ "description": "登记客户验收项(免费):客户对某一镜或整集提出**具体要求**(身份、服装、道具颜色、嘴型、画面瑕疵等)时,按客户原话登记成一条,之后 review_frames / review_videos 会把它追加进 agent_qc.checklist(id 以 req: 开头)让你逐条核对,结论单独记账。★一条只写一项要求;镜头级用 shot_number(当前镜号)或 storyboard_id,不填 = 整集。登记后已拿到的本层 review_token 会失效,需复审。★只登记客户说过的要求,别替客户编。",
4065
+ "tags": [
4066
+ "episodes"
4067
+ ],
4068
+ "parameters": [
4069
+ {
4070
+ "name": "episode_id",
4071
+ "in": "path",
4072
+ "required": true,
4073
+ "schema": {
4074
+ "type": "integer",
4075
+ "exclusiveMinimum": 0
4076
+ }
4077
+ }
4078
+ ],
4079
+ "requestBody": {
4080
+ "required": true,
4081
+ "content": {
4082
+ "application/json": {
4083
+ "schema": {
4084
+ "type": "object",
4085
+ "properties": {
4086
+ "items": {
4087
+ "type": "array",
4088
+ "items": {
4089
+ "type": "object",
4090
+ "properties": {
4091
+ "text": {
4092
+ "type": "string",
4093
+ "minLength": 2,
4094
+ "maxLength": 500,
4095
+ "description": "客户的具体要求(尽量用客户原话)"
4096
+ },
4097
+ "category": {
4098
+ "type": "string",
4099
+ "enum": [
4100
+ "identity",
4101
+ "wardrobe",
4102
+ "prop_color",
4103
+ "lip_sync",
4104
+ "artifact"
4105
+ ],
4106
+ "description": "可选类别:identity 身份(脸像不像)/ wardrobe 服装 / prop_color 道具颜色 / lip_sync 嘴型 / artifact 画面瑕疵(毛边、穿帮等)"
4107
+ },
4108
+ "shot_number": {
4109
+ "type": "integer",
4110
+ "exclusiveMinimum": 0,
4111
+ "description": "镜头级:当前镜号"
4112
+ },
4113
+ "storyboard_id": {
4114
+ "type": "integer",
4115
+ "exclusiveMinimum": 0,
4116
+ "description": "镜头级:分镜 id(与 shot_number 二选一)"
4117
+ },
4118
+ "stages": {
4119
+ "type": "array",
4120
+ "items": {
4121
+ "type": "string",
4122
+ "enum": [
4123
+ "frames",
4124
+ "videos"
4125
+ ]
4126
+ },
4127
+ "minItems": 1,
4128
+ "description": "在哪一层核对:frames 镜头图片层(review_frames)/ videos 视频层(review_videos);不填 = 两层都核对"
4129
+ }
4130
+ },
4131
+ "required": [
4132
+ "text"
4133
+ ],
4134
+ "additionalProperties": false
4135
+ },
4136
+ "minItems": 1,
4137
+ "maxItems": 100
4138
+ }
4139
+ },
4140
+ "required": [
4141
+ "items"
4142
+ ]
4143
+ }
4144
+ }
4145
+ }
4146
+ },
4147
+ "responses": {
4148
+ "200": {
4149
+ "description": "StarReel envelope",
4150
+ "content": {
4151
+ "application/json": {
4152
+ "schema": {
4153
+ "type": "object",
4154
+ "properties": {
4155
+ "code": {
4156
+ "type": "integer"
4157
+ },
4158
+ "message": {
4159
+ "type": "string"
4160
+ },
4161
+ "data": {
4162
+ "description": "Operation result payload"
4163
+ }
4164
+ }
4165
+ }
4166
+ }
4167
+ }
4168
+ },
4169
+ "402": {
4170
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
4171
+ }
4172
+ }
4173
+ }
4174
+ },
4175
+ "/episodes/{episode_id}/acceptance-criteria/{item_id}": {
4176
+ "put": {
4177
+ "operationId": "update_acceptance_criterion",
4178
+ "summary": "改一条客户验收项(免费)",
4179
+ "description": "改一条客户验收项(免费)。改文字 / 类别 / 镜头 / 适用层后,这条的三个状态清回初始(要求变了,旧结论不算数),需重新 review 核对。删除用 delete_acceptance_criterion。item_id 取自 get_acceptance_criteria。(修改客户验收项任何执行模式都须客户明确同意,托管也不例外)",
4180
+ "tags": [
4181
+ "episodes"
4182
+ ],
4183
+ "parameters": [
4184
+ {
4185
+ "name": "episode_id",
4186
+ "in": "path",
4187
+ "required": true,
4188
+ "schema": {
4189
+ "type": "integer",
4190
+ "exclusiveMinimum": 0
4191
+ }
4192
+ },
4193
+ {
4194
+ "name": "item_id",
4195
+ "in": "path",
4196
+ "required": true,
4197
+ "schema": {
4198
+ "type": "string",
4199
+ "minLength": 1
4200
+ }
4201
+ }
4202
+ ],
4203
+ "requestBody": {
4204
+ "required": false,
4205
+ "content": {
4206
+ "application/json": {
4207
+ "schema": {
4208
+ "type": "object",
4209
+ "properties": {
4210
+ "text": {
4211
+ "type": "string",
4212
+ "minLength": 2,
4213
+ "maxLength": 500
4214
+ },
4215
+ "category": {
4216
+ "anyOf": [
4217
+ {
4218
+ "type": "string",
4219
+ "enum": [
4220
+ "identity",
4221
+ "wardrobe",
4222
+ "prop_color",
4223
+ "lip_sync",
4224
+ "artifact"
4225
+ ],
4226
+ "description": "可选类别:identity 身份(脸像不像)/ wardrobe 服装 / prop_color 道具颜色 / lip_sync 嘴型 / artifact 画面瑕疵(毛边、穿帮等)"
4227
+ },
4228
+ {
4229
+ "type": "null"
4230
+ }
4231
+ ],
4232
+ "description": "可选类别:identity 身份(脸像不像)/ wardrobe 服装 / prop_color 道具颜色 / lip_sync 嘴型 / artifact 画面瑕疵(毛边、穿帮等)"
4233
+ },
4234
+ "shot_number": {
4235
+ "type": "integer",
4236
+ "exclusiveMinimum": 0
4237
+ },
4238
+ "storyboard_id": {
4239
+ "type": "integer",
4240
+ "exclusiveMinimum": 0
4241
+ },
4242
+ "scope": {
4243
+ "type": "string",
4244
+ "const": "episode"
4245
+ },
4246
+ "stages": {
4247
+ "type": "array",
4248
+ "items": {
4249
+ "type": "string",
4250
+ "enum": [
4251
+ "frames",
4252
+ "videos"
4253
+ ]
4254
+ },
4255
+ "minItems": 1,
4256
+ "description": "在哪一层核对:frames 镜头图片层(review_frames)/ videos 视频层(review_videos);不填 = 两层都核对"
4257
+ }
4258
+ }
4259
+ }
4260
+ }
4261
+ }
4262
+ },
4263
+ "responses": {
4264
+ "200": {
4265
+ "description": "StarReel envelope",
4266
+ "content": {
4267
+ "application/json": {
4268
+ "schema": {
4269
+ "type": "object",
4270
+ "properties": {
4271
+ "code": {
4272
+ "type": "integer"
4273
+ },
4274
+ "message": {
4275
+ "type": "string"
4276
+ },
4277
+ "data": {
4278
+ "description": "Operation result payload"
4279
+ }
4280
+ }
4281
+ }
4282
+ }
4283
+ }
4284
+ },
4285
+ "402": {
4286
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
4287
+ }
4288
+ }
4289
+ },
4290
+ "delete": {
4291
+ "operationId": "delete_acceptance_criterion",
4292
+ "summary": "删除一条客户验收项(免费,删了这条的三个状态一并没了)",
4293
+ "description": "删除一条客户验收项(免费,删了这条的三个状态一并没了)。item_id 取自 get_acceptance_criteria。(删除客户验收项任何执行模式都须客户明确同意,托管也不例外)",
4294
+ "tags": [
4295
+ "episodes"
4296
+ ],
4297
+ "parameters": [
4298
+ {
4299
+ "name": "episode_id",
4300
+ "in": "path",
4301
+ "required": true,
4302
+ "schema": {
4303
+ "type": "integer",
4304
+ "exclusiveMinimum": 0
4305
+ }
4306
+ },
4307
+ {
4308
+ "name": "item_id",
4309
+ "in": "path",
4310
+ "required": true,
4311
+ "schema": {
4312
+ "type": "string",
4313
+ "minLength": 1
4314
+ }
4315
+ }
4316
+ ],
4317
+ "responses": {
4318
+ "200": {
4319
+ "description": "StarReel envelope",
4320
+ "content": {
4321
+ "application/json": {
4322
+ "schema": {
4323
+ "type": "object",
4324
+ "properties": {
4325
+ "code": {
4326
+ "type": "integer"
4327
+ },
4328
+ "message": {
4329
+ "type": "string"
4330
+ },
4331
+ "data": {
4332
+ "description": "Operation result payload"
4333
+ }
4334
+ }
4335
+ }
4336
+ }
4337
+ }
4338
+ },
4339
+ "402": {
4340
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
4341
+ }
4342
+ }
4343
+ }
4344
+ },
4345
+ "/episodes/{episode_id}/acceptance-criteria/{item_id}/client-verdict": {
4346
+ "post": {
4347
+ "operationId": "confirm_acceptance_criterion",
4348
+ "summary": "记录**客户本人**对一条验收项的确认(免费):accepted 满足 / rejected 不满足 / pending 撤销",
4349
+ "description": "记录**客户本人**对一条验收项的确认(免费):accepted 满足 / rejected 不满足 / pending 撤销。只写客户确认,不改平台自动审查与你的质检结论。★必须是客户明确表态之后才调,并带 confirm_client_statement:true;你不能替客户确认,托管也不例外。",
4350
+ "tags": [
4351
+ "episodes"
4352
+ ],
4353
+ "parameters": [
4354
+ {
4355
+ "name": "episode_id",
4356
+ "in": "path",
4357
+ "required": true,
4358
+ "schema": {
4359
+ "type": "integer",
4360
+ "exclusiveMinimum": 0
4361
+ }
4362
+ },
4363
+ {
4364
+ "name": "item_id",
4365
+ "in": "path",
4366
+ "required": true,
4367
+ "schema": {
4368
+ "type": "string",
4369
+ "minLength": 1
4370
+ }
4371
+ }
4372
+ ],
4373
+ "requestBody": {
4374
+ "required": true,
4375
+ "content": {
4376
+ "application/json": {
4377
+ "schema": {
4378
+ "type": "object",
4379
+ "properties": {
4380
+ "status": {
4381
+ "type": "string",
4382
+ "enum": [
4383
+ "accepted",
4384
+ "rejected",
4385
+ "pending"
4386
+ ]
4387
+ },
4388
+ "confirm_client_statement": {
4389
+ "type": "boolean"
4390
+ },
4391
+ "note": {
4392
+ "type": "string",
4393
+ "maxLength": 500
4394
+ }
4395
+ },
4396
+ "required": [
4397
+ "status"
4398
+ ]
4399
+ }
4400
+ }
4401
+ }
4402
+ },
4403
+ "responses": {
4404
+ "200": {
4405
+ "description": "StarReel envelope",
4406
+ "content": {
4407
+ "application/json": {
4408
+ "schema": {
4409
+ "type": "object",
4410
+ "properties": {
4411
+ "code": {
4412
+ "type": "integer"
4413
+ },
4414
+ "message": {
4415
+ "type": "string"
4416
+ },
4417
+ "data": {
4418
+ "description": "Operation result payload"
4419
+ }
4420
+ }
4421
+ }
4422
+ }
4423
+ }
4424
+ },
4425
+ "402": {
4426
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
4427
+ }
4428
+ }
4429
+ }
4430
+ },
4015
4431
  "/episodes/{episode_id}/asset-binding-repair-plan": {
4016
4432
  "get": {
4017
4433
  "operationId": "get_asset_binding_repair_plan",
@@ -7767,7 +8183,7 @@
7767
8183
  "post": {
7768
8184
  "operationId": "review_assets",
7769
8185
  "summary": "【资产层硬闸·免费】审查本集**出镜**用到的角色形象图、场景图、道具图——覆盖与质量:出镜角色缺定妆图 / 缺设定图 / 还在生成 / 生成失败 / 设定图被一致性闸拒收(hint 带拒收理由);场景缺空景基板;分镜引用的道具缺道具图 /",
7770
- "description": "【资产层硬闸·免费】审查本集**出镜**用到的角色形象图、场景图、道具图——覆盖与质量:出镜角色缺定妆图 / 缺设定图 / 还在生成 / 生成失败 / 设定图被一致性闸拒收(hint 带拒收理由);场景缺空景基板;分镜引用的道具缺道具图 / 被拒;道具图与本镜时代形制冲突;缺色彩脚本(warning)。★出完定妆图、设定图、场景图、道具图后都调一次;generate_frames / generate_shot_frame 之前必须审过——把返回的 review_token 作为 **asset_review_token**,连同分镜层的 review_token 一起传(两张都要)。只看资产本身:出完镜头图不会让它失效;换了定妆图/场景图/道具图会失效,复审即可(免费、秒级)。findings 逐条讲给客户(code=问题类型、names=哪个角色/场景/道具、shots=影响的镜号、action=该调哪个工具修)。\n★【增量复审·省时省量】review_storyboards / review_frames / review_assets 可带 base_review_token(上一张已交质检且 verdict=pass 的本层 token):只把变更镜及其相邻镜列进 agent_qc.materials、findings 只回这些镜(incremental.applied=true,另有 findings_hidden 计数),质检报告只需覆盖它们;共享资产变了、base 没质检通过时自动退回整集(incremental.reason 说明原因)。改一两镜后别整集重审。\n★【agent 亲自质检·免费】返回的 agent_qc 里有本层清单(checklist)和本集要看的素材(materials,每件一个 ref,图/视频给链接)。平台只判「有没有、在不在、被没被拒」,「像不像、对不对、好不好」要你自己看:图片下载打开看、视频至少抽开头/中间/结尾帧、文本用 tool 通读。逐条回答清单(ok / issue / na,issue 写明哪件什么问题),看过的每个 ref 都列进 inspected,调 submit_qc_report 提交;质检结论原样讲给客户。agent_qc.required=true 时没提交报告这张 review_token 进不了下一步(400 agent_qc_required),报告有问题与平台 error 同样默认拦。",
8186
+ "description": "【资产层硬闸·免费】审查本集**出镜**用到的角色形象图、场景图、道具图——覆盖与质量:出镜角色缺定妆图 / 缺设定图 / 还在生成 / 生成失败 / 设定图被一致性闸拒收(hint 带拒收理由);场景缺空景基板;分镜引用的道具缺道具图 / 被拒;道具图与本镜时代形制冲突;缺色彩脚本(warning)。★出完定妆图、设定图、场景图、道具图后都调一次;generate_frames / generate_shot_frame 之前必须审过——把返回的 review_token 作为 **asset_review_token**,连同分镜层的 review_token 一起传(两张都要)。只看资产本身:出完镜头图不会让它失效;换了定妆图/场景图/道具图会失效,复审即可(免费、秒级)。findings 逐条讲给客户(code=问题类型、names=哪个角色/场景/道具、shots=影响的镜号、action=该调哪个工具修)。\n★【增量复审·省时省量】review_storyboards / review_frames / review_assets 可带 base_review_token(上一张已交质检且 verdict=pass 的本层 token):只把变更镜及其相邻镜列进 agent_qc.materials、findings 只回这些镜(incremental.applied=true,另有 findings_hidden 计数),质检报告只需覆盖它们;共享资产变了、base 没质检通过时自动退回整集(incremental.reason 说明原因)。改一两镜后别整集重审。\n★【agent 亲自质检·免费】返回的 agent_qc 里有本层清单(checklist)和本集要看的素材(materials,每件一个 ref,图/视频给链接)。平台只判「有没有、在不在、被没被拒」,「像不像、对不对、好不好」要你自己看:图片下载打开看、视频至少抽开头/中间/结尾帧、文本用 tool 通读。逐条回答清单(ok / issue / na,issue 写明哪件什么问题),看过的每个 ref 都列进 inspected,调 submit_qc_report 提交;质检结论原样讲给客户。agent_qc.required=true 时没提交报告这张 review_token 进不了下一步(400 agent_qc_required),报告有问题与平台 error 同样默认拦。\n★【客户验收项】review_frames / review_videos 会把客户登记的具体要求(add_acceptance_criteria)追加进 checklist(id 以 req: 开头),附 acceptance_criteria:平台通用审查不知道这些要求,通过了不代表满足——逐条亲眼核对后在 submit_qc_report 里答,结论讲给客户,由客户 confirm_acceptance_criterion 确认。",
7771
8187
  "tags": [
7772
8188
  "episodes"
7773
8189
  ],
@@ -7829,7 +8245,7 @@
7829
8245
  "post": {
7830
8246
  "operationId": "review_frames",
7831
8247
  "summary": "【第③道硬闸·免费】审查镜头图片层:角色身份锚覆盖(缺定妆图的角色在镜头里必漂)、出图失败率、孤儿角色变体、场景图被人物污染",
7832
- "description": "【第③道硬闸·免费】审查镜头图片层:角色身份锚覆盖(缺定妆图的角色在镜头里必漂)、出图失败率、孤儿角色变体、场景图被人物污染。★generate_videos 之前必须先跑本工具——出视频是全链最贵的一步,拿着漂移的首帧整集出视频是最典型的废片形态。按 findings.action 修完(多为 generate_character_portraits / generate_shot_frame 单镜重生)再复审。★还会报**镜间接缝**(warning,不拦):code=seam_unchained(标了连续却从没做过首尾帧衔接,或发起的衔接重生没落地 / 衔接后首帧又被重生)/seam_broken(接过但没接上,或上一镜尾帧在衔接之后又重生过),shots 是「与上一镜的缝有问题」的那一镜。出视频前修最便宜——视频按首帧生成,首帧与上镜尾帧对不上,成片就是一次跳切。修法看 action(整集 chain_frames 先 dry_run;单道 chain_shot_from_prev / chain_shot_from)。\n★【增量复审·省时省量】review_storyboards / review_frames / review_assets 可带 base_review_token(上一张已交质检且 verdict=pass 的本层 token):只把变更镜及其相邻镜列进 agent_qc.materials、findings 只回这些镜(incremental.applied=true,另有 findings_hidden 计数),质检报告只需覆盖它们;共享资产变了、base 没质检通过时自动退回整集(incremental.reason 说明原因)。改一两镜后别整集重审。\n★【agent 亲自质检·免费】返回的 agent_qc 里有本层清单(checklist)和本集要看的素材(materials,每件一个 ref,图/视频给链接)。平台只判「有没有、在不在、被没被拒」,「像不像、对不对、好不好」要你自己看:图片下载打开看、视频至少抽开头/中间/结尾帧、文本用 tool 通读。逐条回答清单(ok / issue / na,issue 写明哪件什么问题),看过的每个 ref 都列进 inspected,调 submit_qc_report 提交;质检结论原样讲给客户。agent_qc.required=true 时没提交报告这张 review_token 进不了下一步(400 agent_qc_required),报告有问题与平台 error 同样默认拦。",
8248
+ "description": "【第③道硬闸·免费】审查镜头图片层:角色身份锚覆盖(缺定妆图的角色在镜头里必漂)、出图失败率、孤儿角色变体、场景图被人物污染。★generate_videos 之前必须先跑本工具——出视频是全链最贵的一步,拿着漂移的首帧整集出视频是最典型的废片形态。按 findings.action 修完(多为 generate_character_portraits / generate_shot_frame 单镜重生)再复审。★还会报**镜间接缝**(warning,不拦):code=seam_unchained(标了连续却从没做过首尾帧衔接,或发起的衔接重生没落地 / 衔接后首帧又被重生)/seam_broken(接过但没接上,或上一镜尾帧在衔接之后又重生过),shots 是「与上一镜的缝有问题」的那一镜。出视频前修最便宜——视频按首帧生成,首帧与上镜尾帧对不上,成片就是一次跳切。修法看 action(整集 chain_frames 先 dry_run;单道 chain_shot_from_prev / chain_shot_from)。\n★【增量复审·省时省量】review_storyboards / review_frames / review_assets 可带 base_review_token(上一张已交质检且 verdict=pass 的本层 token):只把变更镜及其相邻镜列进 agent_qc.materials、findings 只回这些镜(incremental.applied=true,另有 findings_hidden 计数),质检报告只需覆盖它们;共享资产变了、base 没质检通过时自动退回整集(incremental.reason 说明原因)。改一两镜后别整集重审。\n★【agent 亲自质检·免费】返回的 agent_qc 里有本层清单(checklist)和本集要看的素材(materials,每件一个 ref,图/视频给链接)。平台只判「有没有、在不在、被没被拒」,「像不像、对不对、好不好」要你自己看:图片下载打开看、视频至少抽开头/中间/结尾帧、文本用 tool 通读。逐条回答清单(ok / issue / na,issue 写明哪件什么问题),看过的每个 ref 都列进 inspected,调 submit_qc_report 提交;质检结论原样讲给客户。agent_qc.required=true 时没提交报告这张 review_token 进不了下一步(400 agent_qc_required),报告有问题与平台 error 同样默认拦。\n★【客户验收项】review_frames / review_videos 会把客户登记的具体要求(add_acceptance_criteria)追加进 checklist(id 以 req: 开头),附 acceptance_criteria:平台通用审查不知道这些要求,通过了不代表满足——逐条亲眼核对后在 submit_qc_report 里答,结论讲给客户,由客户 confirm_acceptance_criterion 确认。",
7833
8249
  "tags": [
7834
8250
  "episodes"
7835
8251
  ],
@@ -8075,7 +8491,7 @@
8075
8491
  "post": {
8076
8492
  "operationId": "review_script",
8077
8493
  "summary": "【第①道硬闸·免费】审查 AI 改写稿:对白行长度、情绪转折完整性、开场钩子、末场悬念",
8078
- "description": "【第①道硬闸·免费】审查 AI 改写稿:对白行长度、情绪转折完整性、开场钩子、末场悬念。★extract_assets 与 generate_storyboards 之前必须先跑本工具——人物档案和分镜都从改写稿派生,稿子里的问题会被逐层放大到定妆图/出图/出视频,等成片才发现就是整集重来。把 findings 逐条告诉客户、按 action 修完(改稿走 edit_rewritten_script)后复审,再拿 review_token 往下走。\n★【增量复审·省时省量】review_storyboards / review_frames / review_assets 可带 base_review_token(上一张已交质检且 verdict=pass 的本层 token):只把变更镜及其相邻镜列进 agent_qc.materials、findings 只回这些镜(incremental.applied=true,另有 findings_hidden 计数),质检报告只需覆盖它们;共享资产变了、base 没质检通过时自动退回整集(incremental.reason 说明原因)。改一两镜后别整集重审。\n★【agent 亲自质检·免费】返回的 agent_qc 里有本层清单(checklist)和本集要看的素材(materials,每件一个 ref,图/视频给链接)。平台只判「有没有、在不在、被没被拒」,「像不像、对不对、好不好」要你自己看:图片下载打开看、视频至少抽开头/中间/结尾帧、文本用 tool 通读。逐条回答清单(ok / issue / na,issue 写明哪件什么问题),看过的每个 ref 都列进 inspected,调 submit_qc_report 提交;质检结论原样讲给客户。agent_qc.required=true 时没提交报告这张 review_token 进不了下一步(400 agent_qc_required),报告有问题与平台 error 同样默认拦。\n★【剧本评估与建议】materials 里有客户原稿(script:original)和改写稿(script):先评估客户给的稿子本身(主线、动机、冲突、节奏、漏洞、能不能拍),再核对改写稿;每个问题在 submit_qc_report 的 suggestions 里给出具体改法(能直接改字的给 before/after)。提交后把评估和建议逐条讲给客户,让客户选:采纳其中几条 / 全部直接执行 / 不改直接往下做(选哪条路按执行模式:专业模式 / 未确认方案 / 本环节由客户把控 → 讲给客户、客户同意才做,别替客户决定;本环节托管 → 不问客户,照 get_production_plan 的 autopilot.default_decisions 执行,平台记进 get_autopilot_log);托管环节默认只执行 priority=must 且不改客户原台词的,其余写进交付报告。",
8494
+ "description": "【第①道硬闸·免费】审查 AI 改写稿:对白行长度、情绪转折完整性、开场钩子、末场悬念。★extract_assets 与 generate_storyboards 之前必须先跑本工具——人物档案和分镜都从改写稿派生,稿子里的问题会被逐层放大到定妆图/出图/出视频,等成片才发现就是整集重来。把 findings 逐条告诉客户、按 action 修完(改稿走 edit_rewritten_script)后复审,再拿 review_token 往下走。\n★【增量复审·省时省量】review_storyboards / review_frames / review_assets 可带 base_review_token(上一张已交质检且 verdict=pass 的本层 token):只把变更镜及其相邻镜列进 agent_qc.materials、findings 只回这些镜(incremental.applied=true,另有 findings_hidden 计数),质检报告只需覆盖它们;共享资产变了、base 没质检通过时自动退回整集(incremental.reason 说明原因)。改一两镜后别整集重审。\n★【agent 亲自质检·免费】返回的 agent_qc 里有本层清单(checklist)和本集要看的素材(materials,每件一个 ref,图/视频给链接)。平台只判「有没有、在不在、被没被拒」,「像不像、对不对、好不好」要你自己看:图片下载打开看、视频至少抽开头/中间/结尾帧、文本用 tool 通读。逐条回答清单(ok / issue / na,issue 写明哪件什么问题),看过的每个 ref 都列进 inspected,调 submit_qc_report 提交;质检结论原样讲给客户。agent_qc.required=true 时没提交报告这张 review_token 进不了下一步(400 agent_qc_required),报告有问题与平台 error 同样默认拦。\n★【客户验收项】review_frames / review_videos 会把客户登记的具体要求(add_acceptance_criteria)追加进 checklist(id 以 req: 开头),附 acceptance_criteria:平台通用审查不知道这些要求,通过了不代表满足——逐条亲眼核对后在 submit_qc_report 里答,结论讲给客户,由客户 confirm_acceptance_criterion 确认。\n★【剧本评估与建议】materials 里有客户原稿(script:original)和改写稿(script):先评估客户给的稿子本身(主线、动机、冲突、节奏、漏洞、能不能拍),再核对改写稿;每个问题在 submit_qc_report 的 suggestions 里给出具体改法(能直接改字的给 before/after)。提交后把评估和建议逐条讲给客户,让客户选:采纳其中几条 / 全部直接执行 / 不改直接往下做(选哪条路按执行模式:专业模式 / 未确认方案 / 本环节由客户把控 → 讲给客户、客户同意才做,别替客户决定;本环节托管 → 不问客户,照 get_production_plan 的 autopilot.default_decisions 执行,平台记进 get_autopilot_log);托管环节默认只执行 priority=must 且不改客户原台词的,其余写进交付报告。",
8079
8495
  "tags": [
8080
8496
  "episodes"
8081
8497
  ],
@@ -8122,7 +8538,7 @@
8122
8538
  "post": {
8123
8539
  "operationId": "review_storyboards",
8124
8540
  "summary": "【第②道硬闸·免费】审查分镜:禁区词(会被厂商审核拒、白扣费)、镜头时长分布、相邻构图重复、同场景角色站位漂移、情绪曲线峰谷、关键镜标记",
8125
- "description": "【第②道硬闸·免费】审查分镜:禁区词(会被厂商审核拒、白扣费)、镜头时长分布、相邻构图重复、同场景角色站位漂移、情绪曲线峰谷、关键镜标记。★generate_frames 之前必须先跑本工具——分镜里的问题一旦整集出图就变成整集废图,单镜修不回来。按 findings.action 用 update_shot/split_shot 修完再复审。★code=forbidden_term 的 finding 带 `terms` 字段(命中的具体词,如「背景音乐」「强光」)与 `shots`(镜号),照着这两个去 update_shot 改掉即可,不用逐字猜。★禁区词判**否定语义**:写「无背景音乐」「不要配乐」不算违规(那是在遵守约束),不必为此改稿。★warnings 里的「动作过载」(action_overload,advisory 不拦):一镜塞了超过时长承载量的独立动作,出视频前用 split_shot 拆开或删动作——成片后靠慢放/叠化补救不了。多人各做一件事或本身连贯的一串可忽略。\n★【增量复审·省时省量】review_storyboards / review_frames / review_assets 可带 base_review_token(上一张已交质检且 verdict=pass 的本层 token):只把变更镜及其相邻镜列进 agent_qc.materials、findings 只回这些镜(incremental.applied=true,另有 findings_hidden 计数),质检报告只需覆盖它们;共享资产变了、base 没质检通过时自动退回整集(incremental.reason 说明原因)。改一两镜后别整集重审。\n★【agent 亲自质检·免费】返回的 agent_qc 里有本层清单(checklist)和本集要看的素材(materials,每件一个 ref,图/视频给链接)。平台只判「有没有、在不在、被没被拒」,「像不像、对不对、好不好」要你自己看:图片下载打开看、视频至少抽开头/中间/结尾帧、文本用 tool 通读。逐条回答清单(ok / issue / na,issue 写明哪件什么问题),看过的每个 ref 都列进 inspected,调 submit_qc_report 提交;质检结论原样讲给客户。agent_qc.required=true 时没提交报告这张 review_token 进不了下一步(400 agent_qc_required),报告有问题与平台 error 同样默认拦。",
8541
+ "description": "【第②道硬闸·免费】审查分镜:禁区词(会被厂商审核拒、白扣费)、镜头时长分布、相邻构图重复、同场景角色站位漂移、情绪曲线峰谷、关键镜标记。★generate_frames 之前必须先跑本工具——分镜里的问题一旦整集出图就变成整集废图,单镜修不回来。按 findings.action 用 update_shot/split_shot 修完再复审。★code=forbidden_term 的 finding 带 `terms` 字段(命中的具体词,如「背景音乐」「强光」)与 `shots`(镜号),照着这两个去 update_shot 改掉即可,不用逐字猜。★禁区词判**否定语义**:写「无背景音乐」「不要配乐」不算违规(那是在遵守约束),不必为此改稿。★warnings 里的「动作过载」(action_overload,advisory 不拦):一镜塞了超过时长承载量的独立动作,出视频前用 split_shot 拆开或删动作——成片后靠慢放/叠化补救不了。多人各做一件事或本身连贯的一串可忽略。\n★【增量复审·省时省量】review_storyboards / review_frames / review_assets 可带 base_review_token(上一张已交质检且 verdict=pass 的本层 token):只把变更镜及其相邻镜列进 agent_qc.materials、findings 只回这些镜(incremental.applied=true,另有 findings_hidden 计数),质检报告只需覆盖它们;共享资产变了、base 没质检通过时自动退回整集(incremental.reason 说明原因)。改一两镜后别整集重审。\n★【agent 亲自质检·免费】返回的 agent_qc 里有本层清单(checklist)和本集要看的素材(materials,每件一个 ref,图/视频给链接)。平台只判「有没有、在不在、被没被拒」,「像不像、对不对、好不好」要你自己看:图片下载打开看、视频至少抽开头/中间/结尾帧、文本用 tool 通读。逐条回答清单(ok / issue / na,issue 写明哪件什么问题),看过的每个 ref 都列进 inspected,调 submit_qc_report 提交;质检结论原样讲给客户。agent_qc.required=true 时没提交报告这张 review_token 进不了下一步(400 agent_qc_required),报告有问题与平台 error 同样默认拦。\n★【客户验收项】review_frames / review_videos 会把客户登记的具体要求(add_acceptance_criteria)追加进 checklist(id 以 req: 开头),附 acceptance_criteria:平台通用审查不知道这些要求,通过了不代表满足——逐条亲眼核对后在 submit_qc_report 里答,结论讲给客户,由客户 confirm_acceptance_criterion 确认。",
8126
8542
  "tags": [
8127
8543
  "episodes"
8128
8544
  ],
@@ -8184,7 +8600,7 @@
8184
8600
  "post": {
8185
8601
  "operationId": "review_videos",
8186
8602
  "summary": "【视频与配音层硬闸·免费】审查本集视频与配音——覆盖与质量:缺视频 / 还在生成 / 生成失败 / 被厂商拒;首帧换过而视频还是旧帧出的(video_stale);疑似片尾硬切、无台词镜意外人声(warning);配音剧:台词镜缺配音、会开",
8187
- "description": "【视频与配音层硬闸·免费】审查本集视频与配音——覆盖与质量:缺视频 / 还在生成 / 生成失败 / 被厂商拒;首帧换过而视频还是旧帧出的(video_stale);疑似片尾硬切、无台词镜意外人声(warning);配音剧:台词镜缺配音、会开口的角色没音色、缺旁白角色;原声剧:出片时没挂上当前声线的镜、没锁声线的角色;缺配乐(warning)。★出完视频、配音(generate_tts)、配乐后都调一次;compose_episode 之前必须审过,带返回的 review_token。\n★★【成片前自检·review_videos 通过后、compose_episode 之前】别靠反复导出整片、手工试转场来找问题——逐镜与接缝的问题有专门工具,拼之前按序过一遍:①这一集换过定妆图 / 设定图 / 场景图 / 镜头帧 → 先 get_stale_portrait_frames(episode_id,免费)看哪些镜的在用帧还基于旧资产,拿不准该用哪一版的镜再 get_asset_versions(storyboard_id,免费)逐镜看版本与依赖(unknown 是证据不足、不是已过期;重出要付费,清单讲给客户由客户定);②scan_intra_shot_cuts(episode_id,免费)查厂商在单镜内自行硬切的镜;③逐镜 recommend_trim_window(storyboard_id,免费)看冻结尾段与有效动作区间(组内镜返回 applicable=false,跳过),有推荐就 trim_shot 应用(免费);④audit_seams(episode_id)查相邻镜接缝的剪辑连续性:默认 dry_run 只列待审范围(免费),真执行按实际文本 token 计费,讲给客户、客户明确接受后才带 dry_run:false + confirm_usage_billing:true,结果看 get_storyboards 的 seam_review;⑤再 compose_episode。拼完成片发现跳切 / 拖尾 / 接不上,回到这几个工具按镜定位后只修那几镜,别整片反复导出试错。这些都是提示性检查,不过闸;裁剪与接缝审核不让 review_videos 的 token 失效。返回体的 pre_compose_checks 是同一份清单(结构化,逐项 tool/scope/when/cost)。\n更细的检查(要解码画面/音轨)另有 scan_intra_shot_cuts / scan_dialogue_coverage / audit_silent_shot_audio;拼完成片再跑 review_final_cut。★返回带 post_production_advisory = 剧本标注「后期」的叙事必需特效还没处理(平台不会合成):原样告诉客户,用 get_post_production_checklist 看清单。\n★【增量复审·省时省量】review_storyboards / review_frames / review_assets 可带 base_review_token(上一张已交质检且 verdict=pass 的本层 token):只把变更镜及其相邻镜列进 agent_qc.materials、findings 只回这些镜(incremental.applied=true,另有 findings_hidden 计数),质检报告只需覆盖它们;共享资产变了、base 没质检通过时自动退回整集(incremental.reason 说明原因)。改一两镜后别整集重审。\n★【agent 亲自质检·免费】返回的 agent_qc 里有本层清单(checklist)和本集要看的素材(materials,每件一个 ref,图/视频给链接)。平台只判「有没有、在不在、被没被拒」,「像不像、对不对、好不好」要你自己看:图片下载打开看、视频至少抽开头/中间/结尾帧、文本用 tool 通读。逐条回答清单(ok / issue / na,issue 写明哪件什么问题),看过的每个 ref 都列进 inspected,调 submit_qc_report 提交;质检结论原样讲给客户。agent_qc.required=true 时没提交报告这张 review_token 进不了下一步(400 agent_qc_required),报告有问题与平台 error 同样默认拦。",
8603
+ "description": "【视频与配音层硬闸·免费】审查本集视频与配音——覆盖与质量:缺视频 / 还在生成 / 生成失败 / 被厂商拒;首帧换过而视频还是旧帧出的(video_stale);疑似片尾硬切、无台词镜意外人声(warning);配音剧:台词镜缺配音、会开口的角色没音色、缺旁白角色;原声剧:出片时没挂上当前声线的镜、没锁声线的角色;缺配乐(warning)。★出完视频、配音(generate_tts)、配乐后都调一次;compose_episode 之前必须审过,带返回的 review_token。\n★★【成片前自检·review_videos 通过后、compose_episode 之前】别靠反复导出整片、手工试转场来找问题——逐镜与接缝的问题有专门工具,拼之前按序过一遍:①这一集换过定妆图 / 设定图 / 场景图 / 镜头帧 → 先 get_stale_portrait_frames(episode_id,免费)看哪些镜的在用帧还基于旧资产,拿不准该用哪一版的镜再 get_asset_versions(storyboard_id,免费)逐镜看版本与依赖(unknown 是证据不足、不是已过期;重出要付费,清单讲给客户由客户定);②scan_intra_shot_cuts(episode_id,免费)查厂商在单镜内自行硬切的镜;③逐镜 recommend_trim_window(storyboard_id,免费)看冻结尾段与有效动作区间(组内镜返回 applicable=false,跳过),有推荐就 trim_shot 应用(免费);④audit_seams(episode_id)查相邻镜接缝的剪辑连续性:默认 dry_run 只列待审范围(免费),真执行按实际文本 token 计费,讲给客户、客户明确接受后才带 dry_run:false + confirm_usage_billing:true,结果看 get_storyboards 的 seam_review;⑤再 compose_episode。拼完成片发现跳切 / 拖尾 / 接不上,回到这几个工具按镜定位后只修那几镜,别整片反复导出试错。这些都是提示性检查,不过闸;裁剪与接缝审核不让 review_videos 的 token 失效。返回体的 pre_compose_checks 是同一份清单(结构化,逐项 tool/scope/when/cost)。\n更细的检查(要解码画面/音轨)另有 scan_intra_shot_cuts / scan_dialogue_coverage / audit_silent_shot_audio;拼完成片再跑 review_final_cut。★返回带 post_production_advisory = 剧本标注「后期」的叙事必需特效还没处理(平台不会合成):原样告诉客户,用 get_post_production_checklist 看清单。\n★【增量复审·省时省量】review_storyboards / review_frames / review_assets 可带 base_review_token(上一张已交质检且 verdict=pass 的本层 token):只把变更镜及其相邻镜列进 agent_qc.materials、findings 只回这些镜(incremental.applied=true,另有 findings_hidden 计数),质检报告只需覆盖它们;共享资产变了、base 没质检通过时自动退回整集(incremental.reason 说明原因)。改一两镜后别整集重审。\n★【agent 亲自质检·免费】返回的 agent_qc 里有本层清单(checklist)和本集要看的素材(materials,每件一个 ref,图/视频给链接)。平台只判「有没有、在不在、被没被拒」,「像不像、对不对、好不好」要你自己看:图片下载打开看、视频至少抽开头/中间/结尾帧、文本用 tool 通读。逐条回答清单(ok / issue / na,issue 写明哪件什么问题),看过的每个 ref 都列进 inspected,调 submit_qc_report 提交;质检结论原样讲给客户。agent_qc.required=true 时没提交报告这张 review_token 进不了下一步(400 agent_qc_required),报告有问题与平台 error 同样默认拦。\n★【客户验收项】review_frames / review_videos 会把客户登记的具体要求(add_acceptance_criteria)追加进 checklist(id 以 req: 开头),附 acceptance_criteria:平台通用审查不知道这些要求,通过了不代表满足——逐条亲眼核对后在 submit_qc_report 里答,结论讲给客户,由客户 confirm_acceptance_criterion 确认。",
8188
8604
  "tags": [
8189
8605
  "episodes"
8190
8606
  ],
@@ -8854,6 +9270,117 @@
8854
9270
  }
8855
9271
  }
8856
9272
  },
9273
+ "/episodes/{episode_id}/seam-previews": {
9274
+ "post": {
9275
+ "operationId": "preview_seams",
9276
+ "summary": "★查转场/接缝问题先跑这个,不要反复导出整片",
9277
+ "description": "★查转场/接缝问题先跑这个,不要反复导出整片。免费零扣费(纯 ffmpeg,不调厂商,也不现场合成配音)。按集为每处相邻镜接缝渲染一段短片:前镜出点前 1 秒 + 后镜入点后 1 秒(转场长于 0.5 秒时两侧各取 2×转场),套用当前 trim 窗口与转场设置,与终拼同一套建轴和渲染逻辑,看到的就是 compose_episode 重拼会得到的接缝(只缩小画幅;不含配乐与字幕)。同时给出两侧边缘帧对照图,并附上 audit_seams 的现有结论。异步:本工具只起任务,用 get_seam_previews 轮询到 status=done。seams 可选,只重渲指定序号的缝(改了某处 trim/转场后复查用)。★看完再决定怎么修:动作没接上先 recommend_trim_window → trim_shot;转场不合适改转场;叠化重影、放大插镜、遮挡这类补救手法本身常引入新问题,改完务必再跑一次本工具复查那道缝。",
9278
+ "tags": [
9279
+ "episodes"
9280
+ ],
9281
+ "parameters": [
9282
+ {
9283
+ "name": "episode_id",
9284
+ "in": "path",
9285
+ "required": true,
9286
+ "schema": {
9287
+ "type": "integer",
9288
+ "exclusiveMinimum": 0
9289
+ }
9290
+ }
9291
+ ],
9292
+ "requestBody": {
9293
+ "required": false,
9294
+ "content": {
9295
+ "application/json": {
9296
+ "schema": {
9297
+ "type": "object",
9298
+ "properties": {
9299
+ "seams": {
9300
+ "type": "array",
9301
+ "items": {
9302
+ "type": "integer",
9303
+ "minimum": 0
9304
+ }
9305
+ }
9306
+ }
9307
+ }
9308
+ }
9309
+ }
9310
+ },
9311
+ "responses": {
9312
+ "200": {
9313
+ "description": "StarReel envelope",
9314
+ "content": {
9315
+ "application/json": {
9316
+ "schema": {
9317
+ "type": "object",
9318
+ "properties": {
9319
+ "code": {
9320
+ "type": "integer"
9321
+ },
9322
+ "message": {
9323
+ "type": "string"
9324
+ },
9325
+ "data": {
9326
+ "description": "Operation result payload"
9327
+ }
9328
+ }
9329
+ }
9330
+ }
9331
+ }
9332
+ },
9333
+ "402": {
9334
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
9335
+ }
9336
+ }
9337
+ },
9338
+ "get": {
9339
+ "operationId": "get_seam_previews",
9340
+ "summary": "查 preview_seams 的进度与结果",
9341
+ "description": "查 preview_seams 的进度与结果。免费。status=running 时看 progress.done/total;status=done 时 result.seams[] 每道缝给出:from_shot_id/to_shot_id、transition(有效转场)、left/right(两侧在源视频上的入出点 src_in_ms/src_out_ms,已含 trim)、preview_url(短片)、compare_image_url(左=前镜转场开始前最后一帧,右=后镜转场结束后第一帧)、audit(audit_seams 结论;not_enabled=本剧未开启)。result.synth_skipped_shot_ids 非空表示这些镜配音尚未合成,预览按无配音处理。单镜集 seam_count=0。",
9342
+ "tags": [
9343
+ "episodes"
9344
+ ],
9345
+ "parameters": [
9346
+ {
9347
+ "name": "episode_id",
9348
+ "in": "path",
9349
+ "required": true,
9350
+ "schema": {
9351
+ "type": "integer",
9352
+ "exclusiveMinimum": 0
9353
+ }
9354
+ }
9355
+ ],
9356
+ "responses": {
9357
+ "200": {
9358
+ "description": "StarReel envelope",
9359
+ "content": {
9360
+ "application/json": {
9361
+ "schema": {
9362
+ "type": "object",
9363
+ "properties": {
9364
+ "code": {
9365
+ "type": "integer"
9366
+ },
9367
+ "message": {
9368
+ "type": "string"
9369
+ },
9370
+ "data": {
9371
+ "description": "Operation result payload"
9372
+ }
9373
+ }
9374
+ }
9375
+ }
9376
+ }
9377
+ },
9378
+ "402": {
9379
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
9380
+ }
9381
+ }
9382
+ }
9383
+ },
8857
9384
  "/episodes/{episode_id}/sfx": {
8858
9385
  "post": {
8859
9386
  "operationId": "generate_sfx",
@@ -12449,7 +12976,7 @@
12449
12976
  "get": {
12450
12977
  "operationId": "get_asset_versions",
12451
12978
  "summary": "只读查询一个镜头的全部图片/视频版本、历史查看链接、依赖 ID 与版本哈希,以及已生成→与当前输入一致→审核有效→已采用四项独立事实",
12452
- "description": "只读查询一个镜头的全部图片/视频版本、历史查看链接、依赖 ID 与版本哈希,以及已生成→与当前输入一致→审核有效→已采用四项独立事实。历史缺少依赖记录时显示未知,不补造快照。免费。",
12979
+ "description": "只读查询一个镜头的全部图片/视频版本、历史查看链接、依赖 ID 与版本哈希,以及已生成→与当前输入一致→审核有效→已采用四项独立事实。历史缺少依赖记录时显示未知,不补造快照。免费。video_lock 是客户锁定的已验收视频(lock_shot_video):locked=true 时这条按沿用算有效,frames_changed_since_lock=true 表示锁定后帧又改过但不需要重出。",
12453
12980
  "tags": [
12454
12981
  "storyboards"
12455
12982
  ],
@@ -14465,6 +14992,118 @@
14465
14992
  }
14466
14993
  }
14467
14994
  },
14995
+ "/storyboards/{storyboard_id}/video-lock": {
14996
+ "post": {
14997
+ "operationId": "lock_shot_video",
14998
+ "summary": "锁定某镜当前在用的视频为客户已验收版本(免费,不生成、不改素材)",
14999
+ "description": "锁定某镜当前在用的视频为客户已验收版本(免费,不生成、不改素材)。用于客户明确说「这一镜就用这条」之后,首尾帧/场景/角色又被改过的情形:锁定后资产变动不再把这镜判过期——review_videos 不报 video_stale(改报 warning video_locked_frames_changed)、get_asset_versions 里这条 acceptance_locked=true 仍算当前有效(漂移原因照实列在 drift_while_locked)、原声剧声线 stale_shots 不列它、终拼预检不报编辑后未重生;regenerate_shot_video / edit_video_shot / repaint / reskin / 上传或清除实拍 / 整集 generate_videos 会替换它时一律 409 VIDEO_LOCKED。锁里冻结视频行 id 与它当时的生成输入(首尾帧 URL、prompt、参考清单)。只能锁当前在用的那条(传 generation_id 时必须正好是它,否则 409 NOT_CURRENT_VIDEO;本镜没视频 409 NO_VIDEO)。视频被别的路径换掉后锁自动失效(get_asset_versions 的 video_lock.broken=true)。★只有客户明确确认沿用才锁,不得把生成完成或模型判断当客户验收;要重出须客户同意后先 unlock_shot_video。",
15000
+ "tags": [
15001
+ "storyboards"
15002
+ ],
15003
+ "parameters": [
15004
+ {
15005
+ "name": "storyboard_id",
15006
+ "in": "path",
15007
+ "required": true,
15008
+ "schema": {
15009
+ "type": "integer",
15010
+ "exclusiveMinimum": 0
15011
+ }
15012
+ }
15013
+ ],
15014
+ "requestBody": {
15015
+ "required": false,
15016
+ "content": {
15017
+ "application/json": {
15018
+ "schema": {
15019
+ "type": "object",
15020
+ "properties": {
15021
+ "generation_id": {
15022
+ "type": "integer",
15023
+ "exclusiveMinimum": 0
15024
+ },
15025
+ "note": {
15026
+ "type": "string",
15027
+ "maxLength": 500
15028
+ }
15029
+ }
15030
+ }
15031
+ }
15032
+ }
15033
+ },
15034
+ "responses": {
15035
+ "200": {
15036
+ "description": "StarReel envelope",
15037
+ "content": {
15038
+ "application/json": {
15039
+ "schema": {
15040
+ "type": "object",
15041
+ "properties": {
15042
+ "code": {
15043
+ "type": "integer"
15044
+ },
15045
+ "message": {
15046
+ "type": "string"
15047
+ },
15048
+ "data": {
15049
+ "description": "Operation result payload"
15050
+ }
15051
+ }
15052
+ }
15053
+ }
15054
+ }
15055
+ },
15056
+ "402": {
15057
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
15058
+ }
15059
+ }
15060
+ },
15061
+ "delete": {
15062
+ "operationId": "unlock_shot_video",
15063
+ "summary": "解除某镜的已验收视频锁(免费)",
15064
+ "description": "解除某镜的已验收视频锁(免费)。解锁后立刻恢复原判:帧改过的镜重新报 video_stale,可以 regenerate_shot_video 重出。★只在客户同意放弃锁定版本、要换新视频时调用。返回 was_locked。",
15065
+ "tags": [
15066
+ "storyboards"
15067
+ ],
15068
+ "parameters": [
15069
+ {
15070
+ "name": "storyboard_id",
15071
+ "in": "path",
15072
+ "required": true,
15073
+ "schema": {
15074
+ "type": "integer",
15075
+ "exclusiveMinimum": 0
15076
+ }
15077
+ }
15078
+ ],
15079
+ "responses": {
15080
+ "200": {
15081
+ "description": "StarReel envelope",
15082
+ "content": {
15083
+ "application/json": {
15084
+ "schema": {
15085
+ "type": "object",
15086
+ "properties": {
15087
+ "code": {
15088
+ "type": "integer"
15089
+ },
15090
+ "message": {
15091
+ "type": "string"
15092
+ },
15093
+ "data": {
15094
+ "description": "Operation result payload"
15095
+ }
15096
+ }
15097
+ }
15098
+ }
15099
+ }
15100
+ },
15101
+ "402": {
15102
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
15103
+ }
15104
+ }
15105
+ }
15106
+ },
14468
15107
  "/videos/edit-capabilities": {
14469
15108
  "get": {
14470
15109
  "operationId": "get_edit_capabilities",