@starreel/mcp 0.1.114 → 0.1.116
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/SKILL.md +17 -1
- package/dist/tools/produce.js +16 -4
- package/openapi.json +261 -175
- package/package.json +1 -1
- package/server.json +2 -2
package/SKILL.md
CHANGED
|
@@ -324,6 +324,20 @@ content that will be rejected.
|
|
|
324
324
|
**9.4%** of the time versus **40.2%** with one. `generate_shot_frame` does accept
|
|
325
325
|
`allow_missing_terminal: true` for the rare shot that genuinely should barely change,
|
|
326
326
|
but reach for the text fix first.
|
|
327
|
+
**If an emotional shot comes out with a blank, neutral face**, set the expression
|
|
328
|
+
explicitly: `update_shot` with `expression_hint` (one concrete sentence about the
|
|
329
|
+
face, ≤120 characters, written as what the face *does* — not "don't smile"), then
|
|
330
|
+
regenerate that shot's first frame (and its video). Without it the platform only
|
|
331
|
+
infers an expression from emotion words in the dialogue / atmosphere, which most
|
|
332
|
+
shots do not have — measured on 624 production shots with characters over 30 days,
|
|
333
|
+
**96 rated emotion intensity ≥7 still got no expression at all**. The hint always
|
|
334
|
+
overrides the inference in the **first-frame image** prompt and is read back by
|
|
335
|
+
`get_shot_prompts`. Two enhancements — delivering it as its own block the identity
|
|
336
|
+
locks do not discard, and sending it into the **video** prompt to hold the expression
|
|
337
|
+
through the clip — are **rolled out per drama and not yet on everywhere** (elsewhere the
|
|
338
|
+
video prompt does not carry it; the clip only inherits whatever face the first frame has),
|
|
339
|
+
so on other dramas the face may still come out flat: regenerate one first frame and
|
|
340
|
+
look before paying for more, and do not promise the customer it will take effect.
|
|
327
341
|
**Then join the seams, before `review_frames`.** Each shot's first frame should pick
|
|
328
342
|
up where the previous shot's last frame left off; otherwise the cut is a visible jump.
|
|
329
343
|
The platform joins them automatically only when a batch runs from the website —
|
|
@@ -1166,7 +1180,9 @@ to close") tells the vendor to fit that entire sequence into each 3-second shot.
|
|
|
1166
1180
|
- **Edit**: `edit_video_shot`, `regenerate_shot_video`, `split_shot`,
|
|
1167
1181
|
`trim_shot`, `rerender_episode`. One generation per shot at a time: a **409 with
|
|
1168
1182
|
`in_flight_generation_id`** means that shot is still generating from *different*
|
|
1169
|
-
input (another prompt, an edit,
|
|
1183
|
+
input (another prompt, an edit, a prompt or shot you changed since, a first/last frame
|
|
1184
|
+
regenerated, uploaded or added since, or different frames / references / engine in this
|
|
1185
|
+
request — so it can happen even when the prompt is unchanged) — nothing was
|
|
1170
1186
|
submitted or charged and the quote is spent; wait for that generation, look at it,
|
|
1171
1187
|
then quote and retry. A success carrying `reused_in_flight: true` means the same
|
|
1172
1188
|
input was already generating — follow that generation, don't send it again.
|
package/dist/tools/produce.js
CHANGED
|
@@ -1195,9 +1195,11 @@ export function registerProduceTools(server, client) {
|
|
|
1195
1195
|
server.tool('regenerate_shot_video', '确认后重生某镜视频(可选新 prompt)。' +
|
|
1196
1196
|
'\n★收到 **409「本镜是用户上传的实拍素材」** = 该镜被 upload_shot_footage 登记成实拍素材镜,不是模型问题,换引擎无用;' +
|
|
1197
1197
|
'要用 AI 视频覆盖它就带 replace_user_footage=true,要保留素材就别重生。' +
|
|
1198
|
-
'\n★收到 **409 + `in_flight_generation_id`** =
|
|
1199
|
-
'(你带了新 prompt / 之后用 update_shot 改过该镜
|
|
1200
|
-
'
|
|
1198
|
+
'\n★收到 **409 + `in_flight_generation_id`** = 这一镜还有一条生成没跑完,而且它不是按这次的内容发起的' +
|
|
1199
|
+
'(你带了新 prompt / 之后用 update_shot 改过该镜 / 之后换过该镜的首帧或尾帧——重出、上传、补出尾帧都算 / ' +
|
|
1200
|
+
'这次带的帧、参考素材或引擎等参数与那次不同 / 在途的是一次编辑)。prompt 没变也可能是这个 409。' +
|
|
1201
|
+
'这次重生没提交、没扣费,quote 已作废。' +
|
|
1202
|
+
'先等在途那条完成、看过结果,再重新 quote 并重生——否则拿到的视频是旧内容(旧提示词或旧首尾帧)出的,会误以为改动没效果。' +
|
|
1201
1203
|
'\n★成功但返回里带 **`reused_in_flight: true`** = 同样的内容已经在生成(重发/双击/批量出视频已派发),' +
|
|
1202
1204
|
'这次没有新建、没有新扣费,返回的就是在途那一条,看它的进度即可,不必再发。' +
|
|
1203
1205
|
CONFIRM_HINT, {
|
|
@@ -1274,7 +1276,7 @@ export function registerProduceTools(server, client) {
|
|
|
1274
1276
|
const suffix = qs.toString() ? `?${qs.toString()}` : '';
|
|
1275
1277
|
return jsonResult(await client.produceGet(`/episodes/${episode_id}/dialogue-coverage${suffix}`));
|
|
1276
1278
|
});
|
|
1277
|
-
server.tool('update_shot', '逐镜编辑:改单个分镜的文本内容(景别/动作/台词/画面描述/运镜等)、时长(duration)、成片变速(speed_factor)、角色绑定(character_ids)与画外音标记(character_presence)。只传要改的字段、其余不动。★改镜(成功或被拒)都会作废覆盖本镜的未消费报价,生成时回 409 QUOTE_INVALIDATED——先改成功、回读核对,再报价。' +
|
|
1279
|
+
server.tool('update_shot', '逐镜编辑:改单个分镜的文本内容(景别/动作/台词/画面描述/运镜等)、面部表情(expression_hint)、时长(duration)、成片变速(speed_factor)、角色绑定(character_ids)与画外音标记(character_presence)。只传要改的字段、其余不动。★改镜(成功或被拒)都会作废覆盖本镜的未消费报价,生成时回 409 QUOTE_INVALIDATED——先改成功、回读核对,再报价。' +
|
|
1278
1280
|
'**免费**(纯文本写库)。★改 dialogue 会自动失效本镜已生成的 TTS 配音与字幕(需重出 tts);' +
|
|
1279
1281
|
'改文本不会自动重出图/视频,如需让画面跟上文本改动,改完再 regen 对应镜。用 get_storyboards 查改后结果(每镜带 character_ids / character_bindings / scene_id / prop_ids)。' +
|
|
1280
1282
|
'★★原声镜(厂商原生音频)改 dialogue 后,本镜视频会被标记「待重生」——因为台词是**烤进视频人声**的,' +
|
|
@@ -1322,6 +1324,13 @@ export function registerProduceTools(server, client) {
|
|
|
1322
1324
|
video_prompt: z.string().optional().describe('视频(动态/运镜/表演)提示词**正文**(全量覆盖本镜现值)。★同 image_prompt:先读现值、保留 @char/@scene 标记'),
|
|
1323
1325
|
first_frame_prompt: z.string().optional().describe('本镜**开始时**画面是什么样(首帧目标状态正文,全量覆盖现值)。送达提示词里作为 [START FRAME] 段排在最前,优先级高于 image_prompt——所以 image_prompt 改了不生效时,往往是这条在压着它。★同 image_prompt:先 get_shot_prompts 读现值、原样保留 @char/@scene 标记'),
|
|
1324
1326
|
last_frame_prompt: z.string().optional().describe('本镜**结束时**画面是什么样(尾帧目标状态正文,全量覆盖现值)。送达提示词里作为 [END FRAME] 段。★★出尾帧被 TERMINAL_DESC_GATE 拦下时就是补这一条:写清结束时的状态(什么变了/变成什么样),再重新出尾帧。不补而直接重试必然重复被拒且照常扣费。get_shot_prompts 的 terminal_desc_missing=true 即本镜需要它'),
|
|
1327
|
+
expression_hint: z.string().max(120).nullable().optional().describe('本镜角色的**面部表情/神态**(≤120 字,一句具体的面部描述,如「眼眶泛红、强忍泪水、嘴角紧抿」)。' +
|
|
1328
|
+
'填了就**压过**平台按台词/氛围的反推——反推只有 7 种预设情绪、且台词里没有情绪词时什么都不加,剧本神态写在动作或旁白里的镜常常因此画成平静脸。' +
|
|
1329
|
+
'它总会压过平台反推并送进**出图**提示词;但「作为独立表情块送达、不被身份锁当成五官描述作废」与「送进视频提示词、整段保持首帧表情」两项**目前按剧灰度开放**' +
|
|
1330
|
+
'(未开放的剧,视频提示词里不会出现它,视频只能沿用首帧上的表情),' +
|
|
1331
|
+
'未开放的剧里写了也可能画不出来——花钱重生前先出一张首帧看效果,别向客户承诺一定生效。' +
|
|
1332
|
+
'★写正向的面部状态,别写「不要笑/不要哭」这类否定式(模型会把名词当正向线索)。★改完不会自动重出,要让画面跟上需重生本镜首帧再重生视频。' +
|
|
1333
|
+
'★超 120 字直接拒(不悄悄截断);null 或空串 = 清空,回到平台反推。现值用 get_shot_prompts 读'),
|
|
1325
1334
|
}, async ({ storyboard_id, ...fields }) => {
|
|
1326
1335
|
const payload = Object.fromEntries(Object.entries(fields).filter(([, v]) => v !== undefined));
|
|
1327
1336
|
return jsonResult(await client.producePut(`/storyboards/${storyboard_id}`, payload));
|
|
@@ -1330,6 +1339,9 @@ export function registerProduceTools(server, client) {
|
|
|
1330
1339
|
'first_frame_prompt=开始时什么样 / last_frame_prompt=结束时什么样),供直接微调后用 update_shot 写回。免费。' +
|
|
1331
1340
|
'★回执里的 terminal_desc_missing=true 表示本镜标为「状态改变」却三处都没说终态——' +
|
|
1332
1341
|
'出尾帧会被前置闸拦下,修法是把结束状态写进 last_frame_prompt(别重试出图,重试必然重复被拒且照常扣费)。' +
|
|
1342
|
+
'★同时回 expression_hint(本镜作者指定的面部表情,null=未指定、由平台按台词反推),改它用 update_shot。' +
|
|
1343
|
+
'expression_inferred 是拆镜 AI 在剧本没写神态时按本镜内容推断的表情(只读;null=没推断,或本镜台词/动作/氛围/描述/强度改过、推断已过期不再使用);它优先级低于 expression_hint——' +
|
|
1344
|
+
'推断不合意就用 update_shot 写 expression_hint 覆盖它。' +
|
|
1333
1345
|
'★逐镜按需:改哪镜读哪镜(整集列表 get_storyboards 不含提示词)。' +
|
|
1334
1346
|
'★返回的 asset_tokens 是正文里的补充参考标记(@char:N / @scene:M),改写时原样保留即可:' +
|
|
1335
1347
|
'本镜注入谁的定妆图由绑定决定(get_storyboards 的 character_ids / scene_id),删标记不会让已绑定的人消失;' +
|
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.
|
|
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.
|
|
5
|
+
"version": "0.1.116",
|
|
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.116 tool surface (operationIds match MCP tool names 1:1)."
|
|
7
7
|
},
|
|
8
8
|
"servers": [
|
|
9
9
|
{
|
|
@@ -730,39 +730,46 @@
|
|
|
730
730
|
"type": "string"
|
|
731
731
|
},
|
|
732
732
|
"creative_contract": {
|
|
733
|
-
"
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
"
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
733
|
+
"anyOf": [
|
|
734
|
+
{
|
|
735
|
+
"type": "object",
|
|
736
|
+
"properties": {
|
|
737
|
+
"version": {
|
|
738
|
+
"type": "number",
|
|
739
|
+
"const": 1
|
|
740
|
+
},
|
|
741
|
+
"speech": {
|
|
742
|
+
"type": "string",
|
|
743
|
+
"enum": [
|
|
744
|
+
"unspecified",
|
|
745
|
+
"forbidden",
|
|
746
|
+
"required"
|
|
747
|
+
]
|
|
748
|
+
},
|
|
749
|
+
"music": {
|
|
750
|
+
"type": "string",
|
|
751
|
+
"enum": [
|
|
752
|
+
"unspecified",
|
|
753
|
+
"forbidden"
|
|
754
|
+
]
|
|
755
|
+
},
|
|
756
|
+
"pacing": {
|
|
757
|
+
"type": "string",
|
|
758
|
+
"enum": [
|
|
759
|
+
"unspecified",
|
|
760
|
+
"quiet"
|
|
761
|
+
]
|
|
762
|
+
}
|
|
763
|
+
},
|
|
764
|
+
"required": [
|
|
765
|
+
"version"
|
|
766
|
+
],
|
|
767
|
+
"additionalProperties": false
|
|
753
768
|
},
|
|
754
|
-
|
|
755
|
-
"type": "
|
|
756
|
-
"enum": [
|
|
757
|
-
"unspecified",
|
|
758
|
-
"quiet"
|
|
759
|
-
]
|
|
769
|
+
{
|
|
770
|
+
"type": "null"
|
|
760
771
|
}
|
|
761
|
-
|
|
762
|
-
"required": [
|
|
763
|
-
"version"
|
|
764
|
-
],
|
|
765
|
-
"additionalProperties": false
|
|
772
|
+
]
|
|
766
773
|
},
|
|
767
774
|
"image_model": {
|
|
768
775
|
"type": "string"
|
|
@@ -1070,39 +1077,46 @@
|
|
|
1070
1077
|
"type": "string"
|
|
1071
1078
|
},
|
|
1072
1079
|
"creative_contract": {
|
|
1073
|
-
"
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
"
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1080
|
+
"anyOf": [
|
|
1081
|
+
{
|
|
1082
|
+
"type": "object",
|
|
1083
|
+
"properties": {
|
|
1084
|
+
"version": {
|
|
1085
|
+
"type": "number",
|
|
1086
|
+
"const": 1
|
|
1087
|
+
},
|
|
1088
|
+
"speech": {
|
|
1089
|
+
"type": "string",
|
|
1090
|
+
"enum": [
|
|
1091
|
+
"unspecified",
|
|
1092
|
+
"forbidden",
|
|
1093
|
+
"required"
|
|
1094
|
+
]
|
|
1095
|
+
},
|
|
1096
|
+
"music": {
|
|
1097
|
+
"type": "string",
|
|
1098
|
+
"enum": [
|
|
1099
|
+
"unspecified",
|
|
1100
|
+
"forbidden"
|
|
1101
|
+
]
|
|
1102
|
+
},
|
|
1103
|
+
"pacing": {
|
|
1104
|
+
"type": "string",
|
|
1105
|
+
"enum": [
|
|
1106
|
+
"unspecified",
|
|
1107
|
+
"quiet"
|
|
1108
|
+
]
|
|
1109
|
+
}
|
|
1110
|
+
},
|
|
1111
|
+
"required": [
|
|
1112
|
+
"version"
|
|
1113
|
+
],
|
|
1114
|
+
"additionalProperties": false
|
|
1093
1115
|
},
|
|
1094
|
-
|
|
1095
|
-
"type": "
|
|
1096
|
-
"enum": [
|
|
1097
|
-
"unspecified",
|
|
1098
|
-
"quiet"
|
|
1099
|
-
]
|
|
1116
|
+
{
|
|
1117
|
+
"type": "null"
|
|
1100
1118
|
}
|
|
1101
|
-
|
|
1102
|
-
"required": [
|
|
1103
|
-
"version"
|
|
1104
|
-
],
|
|
1105
|
-
"additionalProperties": false
|
|
1119
|
+
]
|
|
1106
1120
|
},
|
|
1107
1121
|
"image_model": {
|
|
1108
1122
|
"type": "string"
|
|
@@ -3309,9 +3323,16 @@
|
|
|
3309
3323
|
]
|
|
3310
3324
|
},
|
|
3311
3325
|
"bgm_volume_db": {
|
|
3312
|
-
"
|
|
3313
|
-
|
|
3314
|
-
|
|
3326
|
+
"anyOf": [
|
|
3327
|
+
{
|
|
3328
|
+
"type": "number",
|
|
3329
|
+
"minimum": -60,
|
|
3330
|
+
"maximum": 0
|
|
3331
|
+
},
|
|
3332
|
+
{
|
|
3333
|
+
"type": "null"
|
|
3334
|
+
}
|
|
3335
|
+
]
|
|
3315
3336
|
}
|
|
3316
3337
|
}
|
|
3317
3338
|
}
|
|
@@ -3611,9 +3632,16 @@
|
|
|
3611
3632
|
"type": "object",
|
|
3612
3633
|
"properties": {
|
|
3613
3634
|
"gain_db": {
|
|
3614
|
-
"
|
|
3615
|
-
|
|
3616
|
-
|
|
3635
|
+
"anyOf": [
|
|
3636
|
+
{
|
|
3637
|
+
"type": "number",
|
|
3638
|
+
"minimum": -60,
|
|
3639
|
+
"maximum": 0
|
|
3640
|
+
},
|
|
3641
|
+
{
|
|
3642
|
+
"type": "null"
|
|
3643
|
+
}
|
|
3644
|
+
]
|
|
3617
3645
|
},
|
|
3618
3646
|
"fade_in_ms": {
|
|
3619
3647
|
"type": "integer",
|
|
@@ -4053,8 +4081,15 @@
|
|
|
4053
4081
|
"type": "object",
|
|
4054
4082
|
"properties": {
|
|
4055
4083
|
"delivery_id": {
|
|
4056
|
-
"
|
|
4057
|
-
|
|
4084
|
+
"anyOf": [
|
|
4085
|
+
{
|
|
4086
|
+
"type": "integer",
|
|
4087
|
+
"exclusiveMinimum": 0
|
|
4088
|
+
},
|
|
4089
|
+
{
|
|
4090
|
+
"type": "null"
|
|
4091
|
+
}
|
|
4092
|
+
]
|
|
4058
4093
|
},
|
|
4059
4094
|
"client_accepted": {
|
|
4060
4095
|
"type": "boolean"
|
|
@@ -4419,7 +4454,11 @@
|
|
|
4419
4454
|
"type": "object",
|
|
4420
4455
|
"properties": {
|
|
4421
4456
|
"era": {
|
|
4422
|
-
"type":
|
|
4457
|
+
"type": [
|
|
4458
|
+
"string",
|
|
4459
|
+
"null"
|
|
4460
|
+
],
|
|
4461
|
+
"description": "modern / republican / historical / fantasy(也收中文「现代 / 民国 / 古代 / 仙侠」)。传 null 清空本集契约"
|
|
4423
4462
|
},
|
|
4424
4463
|
"positive": {
|
|
4425
4464
|
"type": "array",
|
|
@@ -8185,8 +8224,16 @@
|
|
|
8185
8224
|
"type": "object",
|
|
8186
8225
|
"properties": {
|
|
8187
8226
|
"variant_id": {
|
|
8188
|
-
"
|
|
8189
|
-
|
|
8227
|
+
"anyOf": [
|
|
8228
|
+
{
|
|
8229
|
+
"type": "integer",
|
|
8230
|
+
"exclusiveMinimum": 0
|
|
8231
|
+
},
|
|
8232
|
+
{
|
|
8233
|
+
"type": "null"
|
|
8234
|
+
}
|
|
8235
|
+
],
|
|
8236
|
+
"description": "传 null 解除关联"
|
|
8190
8237
|
}
|
|
8191
8238
|
},
|
|
8192
8239
|
"required": [
|
|
@@ -8955,31 +9002,38 @@
|
|
|
8955
9002
|
"type": "string"
|
|
8956
9003
|
},
|
|
8957
9004
|
"era_contract": {
|
|
8958
|
-
"
|
|
8959
|
-
|
|
8960
|
-
|
|
8961
|
-
"
|
|
8962
|
-
|
|
8963
|
-
|
|
8964
|
-
|
|
8965
|
-
|
|
8966
|
-
|
|
8967
|
-
|
|
9005
|
+
"anyOf": [
|
|
9006
|
+
{
|
|
9007
|
+
"type": "object",
|
|
9008
|
+
"properties": {
|
|
9009
|
+
"era": {
|
|
9010
|
+
"type": "string",
|
|
9011
|
+
"description": "modern / republican / historical / fantasy(也收中文「现代 / 民国 / 古代 / 仙侠」)"
|
|
9012
|
+
},
|
|
9013
|
+
"positive": {
|
|
9014
|
+
"type": "array",
|
|
9015
|
+
"items": {
|
|
9016
|
+
"type": "string"
|
|
9017
|
+
},
|
|
9018
|
+
"description": "本场额外的正向约束(可留空,平台自带该档基线)"
|
|
9019
|
+
},
|
|
9020
|
+
"negative": {
|
|
9021
|
+
"type": "array",
|
|
9022
|
+
"items": {
|
|
9023
|
+
"type": "string"
|
|
9024
|
+
},
|
|
9025
|
+
"description": "本场额外的禁止项(可留空)"
|
|
9026
|
+
}
|
|
8968
9027
|
},
|
|
8969
|
-
"
|
|
9028
|
+
"required": [
|
|
9029
|
+
"era"
|
|
9030
|
+
],
|
|
9031
|
+
"additionalProperties": false
|
|
8970
9032
|
},
|
|
8971
|
-
|
|
8972
|
-
"type": "
|
|
8973
|
-
"items": {
|
|
8974
|
-
"type": "string"
|
|
8975
|
-
},
|
|
8976
|
-
"description": "本场额外的禁止项(可留空)"
|
|
9033
|
+
{
|
|
9034
|
+
"type": "null"
|
|
8977
9035
|
}
|
|
8978
|
-
|
|
8979
|
-
"required": [
|
|
8980
|
-
"era"
|
|
8981
|
-
],
|
|
8982
|
-
"additionalProperties": false
|
|
9036
|
+
]
|
|
8983
9037
|
}
|
|
8984
9038
|
}
|
|
8985
9039
|
}
|
|
@@ -9474,8 +9528,8 @@
|
|
|
9474
9528
|
"/storyboards/{storyboard_id}": {
|
|
9475
9529
|
"put": {
|
|
9476
9530
|
"operationId": "update_shot",
|
|
9477
|
-
"summary": "逐镜编辑:改单个分镜的文本内容(景别/动作/台词/画面描述/运镜等)、时长(duration)、成片变速(speed_factor)、角色绑定(character_ids)与画外音标记(
|
|
9478
|
-
"description": "逐镜编辑:改单个分镜的文本内容(景别/动作/台词/画面描述/运镜等)、时长(duration)、成片变速(speed_factor)、角色绑定(character_ids)与画外音标记(character_presence)。只传要改的字段、其余不动。★改镜(成功或被拒)都会作废覆盖本镜的未消费报价,生成时回 409 QUOTE_INVALIDATED——先改成功、回读核对,再报价。**免费**(纯文本写库)。★改 dialogue 会自动失效本镜已生成的 TTS 配音与字幕(需重出 tts);改文本不会自动重出图/视频,如需让画面跟上文本改动,改完再 regen 对应镜。用 get_storyboards 查改后结果(每镜带 character_ids / character_bindings / scene_id / prop_ids)。★★原声镜(厂商原生音频)改 dialogue 后,本镜视频会被标记「待重生」——因为台词是**烤进视频人声**的,不重生就终拼,成片里念的仍是改动前的台词(典型现象:台词像是跑到了别的镜头上)。compose_episode 会以 advisory `stale_video_after_edit` 列出这些镜;正确处置是先 regenerate_shot_video 再终拼。★也可直接改本镜的四条提示词正文(image_prompt/video_prompt/first_frame_prompt/last_frame_prompt):改前先用 get_shot_prompts 读现值,别凭空覆盖——正文里的 @char:N / @scene:M 是出图时的补充参考标记,照原样保留即可。★注入谁的定妆图由 character_ids 决定、背景由 scene_id 决定:删标记不会让已绑定的人从画面消失,要让某人不出现就改 character_ids,他只有声音(画外音)就用 character_presence 标 voice_only;反过来别给未绑定的角色写 @char 标记——会把他的图注入进来。★★【出尾帧被拦下就是来改这里】出尾帧若报「此镜标为状态改变,但没有任何地方说明结束时是什么样子」(TERMINAL_DESC_GATE),修法是把**结束时画面是什么样**写进本镜 last_frame_prompt,然后重新出尾帧。别去重试出图——这类镜(action_motion_class=state_change 却没写终态)的尾帧历史成功率 9.4%,有终态描述的是 40.2%;不补描述就重生,送厂商的提示词里根本没有终态段,画出来仍和首帧一样、还是会被拒,而每次重生都照常扣费。get_shot_prompts 的 terminal_desc_missing=true 就是这个信号。",
|
|
9531
|
+
"summary": "逐镜编辑:改单个分镜的文本内容(景别/动作/台词/画面描述/运镜等)、面部表情(expression_hint)、时长(duration)、成片变速(speed_factor)、角色绑定(character_ids)与画外音标记(chara",
|
|
9532
|
+
"description": "逐镜编辑:改单个分镜的文本内容(景别/动作/台词/画面描述/运镜等)、面部表情(expression_hint)、时长(duration)、成片变速(speed_factor)、角色绑定(character_ids)与画外音标记(character_presence)。只传要改的字段、其余不动。★改镜(成功或被拒)都会作废覆盖本镜的未消费报价,生成时回 409 QUOTE_INVALIDATED——先改成功、回读核对,再报价。**免费**(纯文本写库)。★改 dialogue 会自动失效本镜已生成的 TTS 配音与字幕(需重出 tts);改文本不会自动重出图/视频,如需让画面跟上文本改动,改完再 regen 对应镜。用 get_storyboards 查改后结果(每镜带 character_ids / character_bindings / scene_id / prop_ids)。★★原声镜(厂商原生音频)改 dialogue 后,本镜视频会被标记「待重生」——因为台词是**烤进视频人声**的,不重生就终拼,成片里念的仍是改动前的台词(典型现象:台词像是跑到了别的镜头上)。compose_episode 会以 advisory `stale_video_after_edit` 列出这些镜;正确处置是先 regenerate_shot_video 再终拼。★也可直接改本镜的四条提示词正文(image_prompt/video_prompt/first_frame_prompt/last_frame_prompt):改前先用 get_shot_prompts 读现值,别凭空覆盖——正文里的 @char:N / @scene:M 是出图时的补充参考标记,照原样保留即可。★注入谁的定妆图由 character_ids 决定、背景由 scene_id 决定:删标记不会让已绑定的人从画面消失,要让某人不出现就改 character_ids,他只有声音(画外音)就用 character_presence 标 voice_only;反过来别给未绑定的角色写 @char 标记——会把他的图注入进来。★★【出尾帧被拦下就是来改这里】出尾帧若报「此镜标为状态改变,但没有任何地方说明结束时是什么样子」(TERMINAL_DESC_GATE),修法是把**结束时画面是什么样**写进本镜 last_frame_prompt,然后重新出尾帧。别去重试出图——这类镜(action_motion_class=state_change 却没写终态)的尾帧历史成功率 9.4%,有终态描述的是 40.2%;不补描述就重生,送厂商的提示词里根本没有终态段,画出来仍和首帧一样、还是会被拒,而每次重生都照常扣费。get_shot_prompts 的 terminal_desc_missing=true 就是这个信号。",
|
|
9479
9533
|
"tags": [
|
|
9480
9534
|
"storyboards"
|
|
9481
9535
|
],
|
|
@@ -9498,89 +9552,96 @@
|
|
|
9498
9552
|
"type": "object",
|
|
9499
9553
|
"properties": {
|
|
9500
9554
|
"product_text_contract": {
|
|
9501
|
-
"
|
|
9502
|
-
|
|
9503
|
-
|
|
9504
|
-
"
|
|
9505
|
-
|
|
9506
|
-
|
|
9507
|
-
|
|
9508
|
-
|
|
9509
|
-
|
|
9510
|
-
|
|
9511
|
-
|
|
9512
|
-
|
|
9513
|
-
|
|
9514
|
-
|
|
9515
|
-
|
|
9516
|
-
|
|
9517
|
-
|
|
9518
|
-
|
|
9519
|
-
|
|
9520
|
-
"asset_kind": {
|
|
9521
|
-
"type": "string",
|
|
9522
|
-
"enum": [
|
|
9523
|
-
"prop",
|
|
9524
|
-
"product"
|
|
9525
|
-
]
|
|
9526
|
-
},
|
|
9527
|
-
"asset_id": {
|
|
9528
|
-
"type": "integer",
|
|
9529
|
-
"exclusiveMinimum": 0
|
|
9530
|
-
},
|
|
9531
|
-
"reference_url": {
|
|
9532
|
-
"type": "string",
|
|
9533
|
-
"format": "uri"
|
|
9534
|
-
},
|
|
9535
|
-
"region": {
|
|
9555
|
+
"anyOf": [
|
|
9556
|
+
{
|
|
9557
|
+
"type": "object",
|
|
9558
|
+
"properties": {
|
|
9559
|
+
"version": {
|
|
9560
|
+
"type": "number",
|
|
9561
|
+
"const": 1
|
|
9562
|
+
},
|
|
9563
|
+
"strategy": {
|
|
9564
|
+
"type": "string",
|
|
9565
|
+
"enum": [
|
|
9566
|
+
"generate_with_review",
|
|
9567
|
+
"original_media",
|
|
9568
|
+
"postproduction"
|
|
9569
|
+
]
|
|
9570
|
+
},
|
|
9571
|
+
"targets": {
|
|
9572
|
+
"type": "array",
|
|
9573
|
+
"items": {
|
|
9536
9574
|
"type": "object",
|
|
9537
9575
|
"properties": {
|
|
9538
|
-
"
|
|
9539
|
-
"type": "
|
|
9576
|
+
"asset_kind": {
|
|
9577
|
+
"type": "string",
|
|
9578
|
+
"enum": [
|
|
9579
|
+
"prop",
|
|
9580
|
+
"product"
|
|
9581
|
+
]
|
|
9582
|
+
},
|
|
9583
|
+
"asset_id": {
|
|
9584
|
+
"type": "integer",
|
|
9585
|
+
"exclusiveMinimum": 0
|
|
9540
9586
|
},
|
|
9541
|
-
"
|
|
9542
|
-
"type": "
|
|
9587
|
+
"reference_url": {
|
|
9588
|
+
"type": "string",
|
|
9589
|
+
"format": "uri"
|
|
9543
9590
|
},
|
|
9544
|
-
"
|
|
9545
|
-
"type": "
|
|
9591
|
+
"region": {
|
|
9592
|
+
"type": "object",
|
|
9593
|
+
"properties": {
|
|
9594
|
+
"x": {
|
|
9595
|
+
"type": "number"
|
|
9596
|
+
},
|
|
9597
|
+
"y": {
|
|
9598
|
+
"type": "number"
|
|
9599
|
+
},
|
|
9600
|
+
"width": {
|
|
9601
|
+
"type": "number"
|
|
9602
|
+
},
|
|
9603
|
+
"height": {
|
|
9604
|
+
"type": "number"
|
|
9605
|
+
}
|
|
9606
|
+
},
|
|
9607
|
+
"required": [
|
|
9608
|
+
"x",
|
|
9609
|
+
"y",
|
|
9610
|
+
"width",
|
|
9611
|
+
"height"
|
|
9612
|
+
],
|
|
9613
|
+
"additionalProperties": false
|
|
9546
9614
|
},
|
|
9547
|
-
"
|
|
9548
|
-
"type": "
|
|
9615
|
+
"exact_text": {
|
|
9616
|
+
"type": "string",
|
|
9617
|
+
"minLength": 1,
|
|
9618
|
+
"maxLength": 256
|
|
9549
9619
|
}
|
|
9550
9620
|
},
|
|
9551
9621
|
"required": [
|
|
9552
|
-
"
|
|
9553
|
-
"
|
|
9554
|
-
"
|
|
9555
|
-
"
|
|
9622
|
+
"asset_kind",
|
|
9623
|
+
"asset_id",
|
|
9624
|
+
"reference_url",
|
|
9625
|
+
"region",
|
|
9626
|
+
"exact_text"
|
|
9556
9627
|
],
|
|
9557
9628
|
"additionalProperties": false
|
|
9558
9629
|
},
|
|
9559
|
-
"
|
|
9560
|
-
|
|
9561
|
-
|
|
9562
|
-
"maxLength": 256
|
|
9563
|
-
}
|
|
9564
|
-
},
|
|
9565
|
-
"required": [
|
|
9566
|
-
"asset_kind",
|
|
9567
|
-
"asset_id",
|
|
9568
|
-
"reference_url",
|
|
9569
|
-
"region",
|
|
9570
|
-
"exact_text"
|
|
9571
|
-
],
|
|
9572
|
-
"additionalProperties": false
|
|
9630
|
+
"minItems": 1,
|
|
9631
|
+
"maxItems": 4
|
|
9632
|
+
}
|
|
9573
9633
|
},
|
|
9574
|
-
"
|
|
9575
|
-
|
|
9634
|
+
"required": [
|
|
9635
|
+
"version",
|
|
9636
|
+
"strategy",
|
|
9637
|
+
"targets"
|
|
9638
|
+
],
|
|
9639
|
+
"additionalProperties": false
|
|
9640
|
+
},
|
|
9641
|
+
{
|
|
9642
|
+
"type": "null"
|
|
9576
9643
|
}
|
|
9577
|
-
|
|
9578
|
-
"required": [
|
|
9579
|
-
"version",
|
|
9580
|
-
"strategy",
|
|
9581
|
-
"targets"
|
|
9582
|
-
],
|
|
9583
|
-
"additionalProperties": false
|
|
9644
|
+
]
|
|
9584
9645
|
},
|
|
9585
9646
|
"continuity_intent": {
|
|
9586
9647
|
"type": "string",
|
|
@@ -9663,8 +9724,15 @@
|
|
|
9663
9724
|
"exclusiveMinimum": 0
|
|
9664
9725
|
},
|
|
9665
9726
|
"speed_factor": {
|
|
9666
|
-
"
|
|
9667
|
-
|
|
9727
|
+
"anyOf": [
|
|
9728
|
+
{
|
|
9729
|
+
"type": "number",
|
|
9730
|
+
"exclusiveMinimum": 0
|
|
9731
|
+
},
|
|
9732
|
+
{
|
|
9733
|
+
"type": "null"
|
|
9734
|
+
}
|
|
9735
|
+
]
|
|
9668
9736
|
},
|
|
9669
9737
|
"image_prompt": {
|
|
9670
9738
|
"type": "string"
|
|
@@ -9677,6 +9745,17 @@
|
|
|
9677
9745
|
},
|
|
9678
9746
|
"last_frame_prompt": {
|
|
9679
9747
|
"type": "string"
|
|
9748
|
+
},
|
|
9749
|
+
"expression_hint": {
|
|
9750
|
+
"anyOf": [
|
|
9751
|
+
{
|
|
9752
|
+
"type": "string",
|
|
9753
|
+
"maxLength": 120
|
|
9754
|
+
},
|
|
9755
|
+
{
|
|
9756
|
+
"type": "null"
|
|
9757
|
+
}
|
|
9758
|
+
]
|
|
9680
9759
|
}
|
|
9681
9760
|
}
|
|
9682
9761
|
}
|
|
@@ -10727,8 +10806,15 @@
|
|
|
10727
10806
|
]
|
|
10728
10807
|
},
|
|
10729
10808
|
"generation_id": {
|
|
10730
|
-
"
|
|
10731
|
-
|
|
10809
|
+
"anyOf": [
|
|
10810
|
+
{
|
|
10811
|
+
"type": "integer",
|
|
10812
|
+
"exclusiveMinimum": 0
|
|
10813
|
+
},
|
|
10814
|
+
{
|
|
10815
|
+
"type": "null"
|
|
10816
|
+
}
|
|
10817
|
+
]
|
|
10732
10818
|
},
|
|
10733
10819
|
"media_version": {
|
|
10734
10820
|
"type": "string"
|
|
@@ -10797,7 +10883,7 @@
|
|
|
10797
10883
|
"get": {
|
|
10798
10884
|
"operationId": "get_shot_prompts",
|
|
10799
10885
|
"summary": "读某一镜的四条提示词**正文**(image_prompt=首帧画面 / video_prompt=动态表演 / first_frame_prompt=开始时什么样 / last_frame_prompt=结束时什么样),供直接微调后用 u",
|
|
10800
|
-
"description": "读某一镜的四条提示词**正文**(image_prompt=首帧画面 / video_prompt=动态表演 / first_frame_prompt=开始时什么样 / last_frame_prompt=结束时什么样),供直接微调后用 update_shot 写回。免费。★回执里的 terminal_desc_missing=true 表示本镜标为「状态改变」却三处都没说终态——出尾帧会被前置闸拦下,修法是把结束状态写进 last_frame_prompt(别重试出图,重试必然重复被拒且照常扣费)
|
|
10886
|
+
"description": "读某一镜的四条提示词**正文**(image_prompt=首帧画面 / video_prompt=动态表演 / first_frame_prompt=开始时什么样 / last_frame_prompt=结束时什么样),供直接微调后用 update_shot 写回。免费。★回执里的 terminal_desc_missing=true 表示本镜标为「状态改变」却三处都没说终态——出尾帧会被前置闸拦下,修法是把结束状态写进 last_frame_prompt(别重试出图,重试必然重复被拒且照常扣费)。★同时回 expression_hint(本镜作者指定的面部表情,null=未指定、由平台按台词反推),改它用 update_shot。expression_inferred 是拆镜 AI 在剧本没写神态时按本镜内容推断的表情(只读;null=没推断,或本镜台词/动作/氛围/描述/强度改过、推断已过期不再使用);它优先级低于 expression_hint——推断不合意就用 update_shot 写 expression_hint 覆盖它。★逐镜按需:改哪镜读哪镜(整集列表 get_storyboards 不含提示词)。★返回的 asset_tokens 是正文里的补充参考标记(@char:N / @scene:M),改写时原样保留即可:本镜注入谁的定妆图由绑定决定(get_storyboards 的 character_ids / scene_id),删标记不会让已绑定的人消失;带 #变体 的标记是那张变体图的唯一来源;给未绑定的角色写标记会把他的图注入进来。★这是分镜表里的正文层;出图/出视频时平台还会在其上拼身份锚、一致性约束与参考图指令(不在此处,也无需你写)。改完提示词不会自动重出图/视频,要让画面跟上得再 regen 对应镜。",
|
|
10801
10887
|
"tags": [
|
|
10802
10888
|
"storyboards"
|
|
10803
10889
|
],
|
|
@@ -10844,7 +10930,7 @@
|
|
|
10844
10930
|
"post": {
|
|
10845
10931
|
"operationId": "regenerate_shot_video",
|
|
10846
10932
|
"summary": "确认后重生某镜视频(可选新 prompt)",
|
|
10847
|
-
"description": "确认后重生某镜视频(可选新 prompt)。\n★收到 **409「本镜是用户上传的实拍素材」** = 该镜被 upload_shot_footage 登记成实拍素材镜,不是模型问题,换引擎无用;要用 AI 视频覆盖它就带 replace_user_footage=true,要保留素材就别重生。\n★收到 **409 + `in_flight_generation_id`** =
|
|
10933
|
+
"description": "确认后重生某镜视频(可选新 prompt)。\n★收到 **409「本镜是用户上传的实拍素材」** = 该镜被 upload_shot_footage 登记成实拍素材镜,不是模型问题,换引擎无用;要用 AI 视频覆盖它就带 replace_user_footage=true,要保留素材就别重生。\n★收到 **409 + `in_flight_generation_id`** = 这一镜还有一条生成没跑完,而且它不是按这次的内容发起的(你带了新 prompt / 之后用 update_shot 改过该镜 / 之后换过该镜的首帧或尾帧——重出、上传、补出尾帧都算 / 这次带的帧、参考素材或引擎等参数与那次不同 / 在途的是一次编辑)。prompt 没变也可能是这个 409。这次重生没提交、没扣费,quote 已作废。先等在途那条完成、看过结果,再重新 quote 并重生——否则拿到的视频是旧内容(旧提示词或旧首尾帧)出的,会误以为改动没效果。\n★成功但返回里带 **`reused_in_flight: true`** = 同样的内容已经在生成(重发/双击/批量出视频已派发),这次没有新建、没有新扣费,返回的就是在途那一条,看它的进度即可,不必再发。⚠️ 批量报价确认流程:先调对应的 quote_* 工具,把返回的 estimated_points 原样告诉用户,用户明确同意后,才用返回的 quote_id 调本工具。不要擅自确认。★**出图类报价(定妆图/场景图/出帧)给的是两个数**:estimated_points 是**上界**(按该模型参考图张数上限估,保证你不会按低了的预算开跑、出到一半 402 中断);同一响应里的 typical_points 是**通常花费**。两个都要告诉客户——只说上界会让人以为贵得多(满参考图的上界可达通常值的 2 倍以上),只说通常值又会让余额准备不足。固定价模型下两者相等,这时说一个数就行。出视频的报价与扣费同函数,不存在这个区间。",
|
|
10848
10934
|
"tags": [
|
|
10849
10935
|
"storyboards"
|
|
10850
10936
|
],
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starreel/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.116",
|
|
4
4
|
"mcpName": "ai.starreel/starreel",
|
|
5
5
|
"description": "StarReel MCP server — drive the AI short-drama production pipeline (script → storyboards → frames → video → final cut) from Claude, Cursor, or any MCP client",
|
|
6
6
|
"license": "MIT",
|
package/server.json
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
|
|
3
3
|
"name": "ai.starreel/starreel",
|
|
4
4
|
"description": "Turn a script into a finished, downloadable short-drama episode — via MCP or REST.",
|
|
5
|
-
"version": "0.1.
|
|
5
|
+
"version": "0.1.116",
|
|
6
6
|
"websiteUrl": "https://starreel.ai",
|
|
7
7
|
"packages": [
|
|
8
8
|
{
|
|
9
9
|
"registryType": "npm",
|
|
10
10
|
"identifier": "@starreel/mcp",
|
|
11
|
-
"version": "0.1.
|
|
11
|
+
"version": "0.1.116",
|
|
12
12
|
"transport": {
|
|
13
13
|
"type": "stdio"
|
|
14
14
|
},
|