@starreel/mcp 0.1.248 → 0.1.251

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 CHANGED
@@ -1534,14 +1534,27 @@ to close") tells the vendor to fit that entire sequence into each 3-second shot.
1534
1534
  (LLM, **billed**; `dry_run:true` to preview) adds 1–3 "at second t the frame
1535
1535
  shows …" targets between a shot's first and last frame — wind-up, contact,
1536
1536
  landing — so the video passes those beats instead of skipping them. Only
1537
- shots on `seedance-2.5` (it follows keyframe timing within about ±1 s), ≥5 s,
1537
+ shots on `seedance-2.5` (it follows keyframe timing within about ±1 s) or
1538
+ `kling-4.0` (closed beta; keyframes are kept in order but their timing is not
1539
+ honored, and the first frame stays hard-pinned), ≥5 s,
1538
1540
  marked state-change or key moment. Fills empty shots only. Read with
1539
1541
  `get_shot_keyframes` (returns the allowed window: t in [2, duration−1],
1540
1542
  ≥2 s apart, max 3) or the `keyframes` field of `get_storyboards`; overwrite
1541
1543
  with `set_shot_keyframes`. Prompts must describe a visible pose — no
1542
1544
  "about to / starting to" wording and no "no X" negations (both rejected).
1543
- A 400 "未开启" means the project is not in the beta. This stage only plans;
1544
- rendering the keyframes and feeding them to the video model come later.
1545
+ A 400 "未开启" means the project is not in the beta. Render the keyframe
1546
+ images with `quote_shot_keyframes` (free) → `generate_shot_keyframes`
1547
+ (**billed**, last-frame price tier, one candidate each; needs the shot's first
1548
+ frame). Each image is anchored to the first frame and kept in the same camera
1549
+ setup; poll `get_shot_keyframes`: `ready` frames are used when the shot's video
1550
+ is regenerated, `framing_mismatch` means the framing drifted from the first
1551
+ frame (not sent; rewrite the prompt and regenerate), `failed` means the render
1552
+ failed. Rendering keyframes never touches the shot's first/last frame.
1553
+ On the next `quote_regenerate_shot_video`, `shot_keyframes.mode=keyframes`
1554
+ confirms the video will be sent first frame + ready keyframes (+ last frame)
1555
+ with their timestamps (first frame becomes a soft constraint; ±1 s timing; same
1556
+ price). Shots whose first frame is a copy of the previous shot's last frame keep
1557
+ first-frame mode (`reason: strict-continuity`) so the seam stays exact.
1545
1558
  - **Era contract**: `set_era_contract` / `get_era_contract` — see the project
1546
1559
  settings tier above. Non-contemporary projects must set this before frames.
1547
1560
  - **Lengthen a finished cut**: `quote_extend_final` (free, quote first) →
@@ -611,6 +611,23 @@ export const MODEL_GUIDE = {
611
611
  best_for: '风格化项目赶交付',
612
612
  avoid_for: '同 wan3.0;不赶时间就用 wan3.0',
613
613
  },
614
+ {
615
+ id: 'kling-4.0', name: '可灵 4.0(内测·按剧开放)',
616
+ price: '720p/1080p 约 0.66×/1×(以 seedance-2.5 720p 为 1×,报价 = 实扣已实测,实价以报价为准);无 480p(按 720p 计);单镜 3~30 秒',
617
+ strengths: [
618
+ '大场面动作强:坠击、爆裂一类镜的过程与终态完整(单次样本)',
619
+ '能保持夸张造型(如能量化的巨拳),带立体声',
620
+ '原生支持首帧 + 中间帧 + 尾帧:中间关键帧近乎像素级还原(整帧相似度 0.95~0.97)',
621
+ ],
622
+ weaknesses: [
623
+ '内测:只在开放名单内的剧可选,未开放的剧选它会 400',
624
+ '不守秒数:中间帧落在哪一秒不受控制,只保证顺序',
625
+ '只做图生视频:不进场景组、不续拍、不收参考视频 / 声画锚,单镜编辑与单组重出不可用',
626
+ '单次样本里出现过人物中途消失;关键帧之间机位不一致会镜内硬切',
627
+ ],
628
+ best_for: '动作 / 特效大场面的单镜,配合首帧起势 + 中间关键帧钉住关键一拍',
629
+ avoid_for: '要组视频 / 续拍 / 编辑的剧;要按秒精确对点的镜(用 seedance-2.5)',
630
+ },
614
631
  ],
615
632
  video_decision: [
616
633
  '① 先定「是不是写实真人」:是 → seedance-2.5 或降本 hailuo-3(' + MODEL_AVAILABILITY_NOTE + ';菜单里不可用的别推荐);绝不选 wan3.0 / wan3.0-prime。',
@@ -345,7 +345,8 @@ const FRAME_TYPE_ARG = z.enum(['first_frame', 'last_frame', 'both']);
345
345
  const ASPECT_RATIOS = ['9:16', '16:9', '1:1', '4:5', '4:3', '21:9'];
346
346
  const VIDEO_RESOLUTIONS = ['480p', '720p', '1080p', '4k'];
347
347
  // 剧级视频引擎(与后端 video-engine-policy 白名单同源;短 id,后端归一化)。
348
- const VIDEO_ENGINES = ['seedance-2.5', 'hailuo-3', 'wan3.0', 'wan3.0-prime'];
348
+ // kling-4.0 为内测引擎:后端按剧灰度(KLING_VIDEO_DRAMAS),未开放的剧传它会 400——那不是调用错误,换回其它引擎即可。
349
+ const VIDEO_ENGINES = ['seedance-2.5', 'hailuo-3', 'wan3.0', 'wan3.0-prime', 'kling-4.0'];
349
350
  // 「项目设定页」通用视觉/音频/字幕/转场设定 —— create_drama 与 update_project_settings 共用。
350
351
  // 后端内部 PUT /dramas 已接受写库,facade 白名单 Wave3 已放行(produce-create-fields.ts)。
351
352
  // 不含内部产线/成本开关(strict_mode/best_of_n/shoppable/budget_points 等,需产品决策)。
@@ -368,7 +369,7 @@ const PROJECT_SETTINGS_FIELDS = {
368
369
  'gemini-3.1-flash-image(香蕉2·71点)/gemini-3-pro-image(香蕉Pro·精细·175点)/gemini-3.1-flash-lite-image(香蕉2 Lite·31点)/' +
369
370
  'doubao-seedream-5-0-260128(Seedream 5.0)。建剧即定、整剧统一;generate_frames 可临时覆盖某次出图。★各模型实测优劣(一次过率/手部结构/安全拒绝率/画风稳定度)与选型步骤见 get_capabilities_guide(section=model_guide)'),
370
371
  // drama 级视频引擎(整剧统一,单镜/批量/场景组/重生全走它;按镜例外入口:quote_videos 的 shot_engines / quote_regenerate_shot_video 的 model / edit_video_shot 的 model)
371
- video_engine: z.enum(VIDEO_ENGINES).optional().describe('视频引擎(★drama级·整剧统一·AI必须按剧选型主动引导:写实真人剧→seedance-2.5 或降本 hailuo-3(' + MODEL_AVAILABILITY_NOTE + ');风格化/动画/3D卡通/空镜/产品镜→wan3.0(赶交付 wan3.0-prime);写实真人剧绝不选 wan——720p+ 真人脸被厂商审核一致拒):' +
372
+ video_engine: z.enum(VIDEO_ENGINES).optional().describe('视频引擎(★drama级·整剧统一·AI必须按剧选型主动引导:写实真人剧→seedance-2.5 或降本 hailuo-3(' + MODEL_AVAILABILITY_NOTE + ');风格化/动画/3D卡通/空镜/产品镜→wan3.0(赶交付 wan3.0-prime);写实真人剧绝不选 wan——720p+ 真人脸被厂商审核一致拒;kling-4.0 为内测引擎,只在开放名单内的剧可选,未开放回 400,动作大场面单镜可试):' +
372
373
  'seedance-2.5(动漫/风格化剧默认·写实真人剧在该题材可用时也默认它·全能力:帧链/场景组/就地编辑/延长/参考图锚·价格基准 720p=1×) / ' +
373
374
  '★不传时平台按画风兜底:动漫/风格化→seedance-2.5;写实/未定画风→seedance-2.5 写实开关开着用它,否则 hailuo-3——这只是兜底盖章,不查菜单的题材可用性,所以按 get_production_menu 选定后要显式传。' +
374
375
  'hailuo-3(MiniMax H3:约1/3成本 720p 约0.33×·原生对白与音效·支持2K·单镜约6分钟·支持就地编辑(强保真)与成片续写·关键帧组/时间戳区间暂不可用;编辑/续写输入视频另按秒计费) / ' +
@@ -1327,7 +1328,7 @@ export function registerProduceTools(server, client) {
1327
1328
  + '\n★只规划视频引擎为 seedance-2.5 的镜(只有它按秒对齐关键帧,误差约 ±1 秒);时长 ≥5 秒、标为状态变化或关键镜的才会规划。'
1328
1329
  + '\n★只填**空着**的镜:已经有中间关键帧的(含客户自己写的)一律不动。dry_run:true 只返回规划不写库,先给客户看。'
1329
1330
  + '\n★结果用 get_storyboards 每镜的 keyframes 字段读;要改用 set_shot_keyframes。'
1330
- + '\n★回 400「本剧未开启」= 本剧不在内测名单,不是调用错误,别重试。本期只规划、不出图,出中间帧与送进视频是后续功能。', {
1331
+ + '\n★回 400「本剧未开启」= 本剧不在内测名单,不是调用错误,别重试。规划完用 quote_shot_keyframes → generate_shot_keyframes 出中间帧图。', {
1331
1332
  episode_id: z.number().int().positive(),
1332
1333
  dry_run: z.boolean().optional().describe('true = 只返回规划结果、不写库'),
1333
1334
  }, async ({ episode_id, dry_run }) => jsonResult(await client.producePost(`/episodes/${episode_id}/keyframes/plan`, { dry_run: dry_run === true })));
@@ -1346,6 +1347,25 @@ export function registerProduceTools(server, client) {
1346
1347
  prompt: z.string().min(2).max(600).describe('这一刻看得见的画面'),
1347
1348
  })).max(3),
1348
1349
  }, async ({ storyboard_id, keyframes }) => jsonResult(await client.producePut(`/storyboards/${storyboard_id}/keyframes`, { keyframes })));
1350
+ server.tool('quote_shot_keyframes', '★**内测**·中间关键帧出图**报价**(免费·无副作用)。默认报本镜所有还没就绪的中间帧(planned / failed / framing_mismatch),'
1351
+ + 'keyframe_ids 可点名重出。回 estimated_points / typical_points、要出的 keyframes 与 quote_id。'
1352
+ + '\n★前提:本镜视频引擎是 Seedance 2.5、首帧已就绪、已用 plan_shot_keyframes / set_shot_keyframes 写好中间帧。'
1353
+ + '把 estimated_points 原样告诉客户,同意后再调 generate_shot_keyframes。回 400「本剧未开启」= 不在内测名单,别重试。', {
1354
+ storyboard_id: z.number().int().positive(),
1355
+ keyframe_ids: z.array(z.number().int().positive()).max(3).optional().describe('只重出这几张(默认:所有未就绪的)'),
1356
+ image_model: z.string().optional().describe('临时换图片模型(报价与出图要传同一个)'),
1357
+ }, async ({ storyboard_id, keyframe_ids, image_model }) => jsonResult(await client.producePost(`/storyboards/${storyboard_id}/keyframes/quote`, { keyframe_ids, image_model })));
1358
+ server.tool('generate_shot_keyframes', '★**内测**·按报价出本镜中间关键帧图(**真扣费**)。每张以本镜首帧为锚、保持同一机位取景,只画到 prompt 描述的那一刻;'
1359
+ + '不改本镜首尾帧、不把已有视频标陈旧。异步:立即返回 dispatched,用 get_shot_keyframes 轮询每张 status——'
1360
+ + 'ready 才会在重出本镜视频时送进 Seedance 2.5;framing_mismatch = 取景与首帧对不上(不送),改 prompt 后报价重出;failed = 出图失败。'
1361
+ + '\n★报价后改过关键帧会 409,重新报价(免费)即可。' + REVIEW_GATE_HINT('review_storyboards', '分镜') + ASSET_GATE_HINT + CONFIRM_HINT, {
1362
+ storyboard_id: z.number().int().positive(),
1363
+ quote_id: z.string().describe('来自 quote_shot_keyframes'),
1364
+ keyframe_ids: z.array(z.number().int().positive()).max(3).optional().describe('与报价时一致'),
1365
+ image_model: z.string().optional().describe('与报价时一致'),
1366
+ ...REVIEW_ARGS,
1367
+ ...ASSET_REVIEW_ARG,
1368
+ }, async ({ storyboard_id, quote_id, keyframe_ids, image_model, review_token, asset_review_token, acknowledge_review, auto_acknowledge }) => jsonResult(await client.producePost(`/storyboards/${storyboard_id}/keyframes/generate`, { quote_id, keyframe_ids, image_model, review_token, asset_review_token, acknowledge_review, auto_acknowledge })));
1349
1369
  server.tool('quote_extend_final', '★成片续写**报价**(免费·无副作用):在已有成片后面再接几轮 AI 生成的片段,把片子拉长。'
1350
1370
  + '回 rounds(轮数)/duration_per_round(每轮秒数)/max_rounds(上限)/estimated_points(预估点数)。'
1351
1371
  + '\n★**必须先 quote_extend_final 报价,再调 extend_final**' + MODE_DECIDES('报价确认') + '(派发前平台按同参整单报价过预算预检,超出硬上限回 402 BUDGET_WOULD_EXCEED、未扣费,那就停下问客户)' + '——每轮都真扣厂商的钱。'
@@ -1673,7 +1693,7 @@ export function registerProduceTools(server, client) {
1673
1693
  storyboard_id: z.number().int().positive(),
1674
1694
  quote_id: z.string().describe('来自 quote_edit_video_shot'),
1675
1695
  instruction: z.string().describe('编辑指令(如"把背景换成夜晚")'),
1676
- model: z.enum(VIDEO_ENGINES).optional().describe('本次编辑的引擎(缺省=跟随剧 video_engine);hailuo-3/wan3.0/wan3.0-prime 不支持区间编辑'),
1696
+ model: z.enum(VIDEO_ENGINES).optional().describe('本次编辑的引擎(缺省=跟随剧 video_engine);hailuo-3/wan3.0/wan3.0-prime 不支持区间编辑;kling-4.0 不支持编辑'),
1677
1697
  reference_image_urls: z.array(z.string()).max(9).optional().describe('参考图 URL(先 upload_image 拿)'),
1678
1698
  reference_video_urls: z.array(z.string()).max(2).optional(),
1679
1699
  reference_audio_urls: z.array(z.string()).max(3).optional(),
@@ -1744,6 +1764,8 @@ export function registerProduceTools(server, client) {
1744
1764
  '\n★**按镜指定视频引擎**:传 model 即只为这一镜这一次重生换引擎(不改剧级 video_engine,其它镜照旧);' +
1745
1765
  '报价按该引擎计价,quote_id 把引擎钉死,regenerate_shot_video 派发的就是它——要换引擎必须重新报价,生成时再传引擎无效。' +
1746
1766
  '回执 video_engine = 实际派发的引擎,engine_overridden=true 表示盖过了剧引擎。' +
1767
+ '\n★**内测·单镜中间关键帧**:回执带 shot_keyframes(只在内测剧)时,mode=keyframes 表示本次会把首帧 + ready 的中间帧(+尾帧)按秒数一起送给 Seedance 2.5' +
1768
+ '(首帧变软约束、秒数误差约 ±1 秒、点数不变);mode=first_frame 时 reason 说明为什么没走(如 strict-continuity = 首帧是上一镜尾帧拷贝,接缝优先)。' +
1747
1769
  '★所选引擎必须支持本剧分辨率(seedance-2.5 只有 480p/720p;hailuo-3 只有 720p/1080p;wan3.0/wan3.0-prime 480p~1080p),不支持则 400 并列出可选引擎——不会悄悄换成别的引擎出片;' +
1748
1770
  '本镜时长也不能超过该引擎单镜上限(seedance-2.5/wan3.0 30s,hailuo-3 15s),超了 400(厂商会截断)。' +
1749
1771
  '适用:某镜在本剧引擎上反复失败/被厂商审核拒/镜内自剪,单独换一个引擎试。' +
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.248",
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.248 tool surface (operationIds match MCP tool names 1:1)."
5
+ "version": "0.1.251",
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.251 tool surface (operationIds match MCP tool names 1:1)."
7
7
  },
8
8
  "servers": [
9
9
  {
@@ -1261,7 +1261,8 @@
1261
1261
  "seedance-2.5",
1262
1262
  "hailuo-3",
1263
1263
  "wan3.0",
1264
- "wan3.0-prime"
1264
+ "wan3.0-prime",
1265
+ "kling-4.0"
1265
1266
  ]
1266
1267
  },
1267
1268
  "cinematography_prompt": {
@@ -1643,7 +1644,8 @@
1643
1644
  "seedance-2.5",
1644
1645
  "hailuo-3",
1645
1646
  "wan3.0",
1646
- "wan3.0-prime"
1647
+ "wan3.0-prime",
1648
+ "kling-4.0"
1647
1649
  ]
1648
1650
  },
1649
1651
  "cinematography_prompt": {
@@ -8138,7 +8140,7 @@
8138
8140
  "post": {
8139
8141
  "operationId": "plan_shot_keyframes",
8140
8142
  "summary": "★**内测**·规划**单镜中间关键帧**:给动作复杂的镜头在首帧与尾帧之间加 1~3 个「第 t 秒该是什么画面」的目标(蓄力、命中、落地等节点),让视频动作按节点走、不跳过过程",
8141
- "description": "★**内测**·规划**单镜中间关键帧**:给动作复杂的镜头在首帧与尾帧之间加 1~3 个「第 t 秒该是什么画面」的目标(蓄力、命中、落地等节点),让视频动作按节点走、不跳过过程。**要花钱**(走 LLM,文本按 token 后付)。\n★只规划视频引擎为 seedance-2.5 的镜(只有它按秒对齐关键帧,误差约 ±1 秒);时长 ≥5 秒、标为状态变化或关键镜的才会规划。\n★只填**空着**的镜:已经有中间关键帧的(含客户自己写的)一律不动。dry_run:true 只返回规划不写库,先给客户看。\n★结果用 get_storyboards 每镜的 keyframes 字段读;要改用 set_shot_keyframes。\n★回 400「本剧未开启」= 本剧不在内测名单,不是调用错误,别重试。本期只规划、不出图,出中间帧与送进视频是后续功能。",
8143
+ "description": "★**内测**·规划**单镜中间关键帧**:给动作复杂的镜头在首帧与尾帧之间加 1~3 个「第 t 秒该是什么画面」的目标(蓄力、命中、落地等节点),让视频动作按节点走、不跳过过程。**要花钱**(走 LLM,文本按 token 后付)。\n★只规划视频引擎为 seedance-2.5 的镜(只有它按秒对齐关键帧,误差约 ±1 秒);时长 ≥5 秒、标为状态变化或关键镜的才会规划。\n★只填**空着**的镜:已经有中间关键帧的(含客户自己写的)一律不动。dry_run:true 只返回规划不写库,先给客户看。\n★结果用 get_storyboards 每镜的 keyframes 字段读;要改用 set_shot_keyframes。\n★回 400「本剧未开启」= 本剧不在内测名单,不是调用错误,别重试。规划完用 quote_shot_keyframes → generate_shot_keyframes 出中间帧图。",
8142
8144
  "tags": [
8143
8145
  "episodes"
8144
8146
  ],
@@ -9926,7 +9928,8 @@
9926
9928
  "seedance-2.5",
9927
9929
  "hailuo-3",
9928
9930
  "wan3.0",
9929
- "wan3.0-prime"
9931
+ "wan3.0-prime",
9932
+ "kling-4.0"
9930
9933
  ]
9931
9934
  }
9932
9935
  },
@@ -11619,7 +11622,8 @@
11619
11622
  "seedance-2.5",
11620
11623
  "hailuo-3",
11621
11624
  "wan3.0",
11622
- "wan3.0-prime"
11625
+ "wan3.0-prime",
11626
+ "kling-4.0"
11623
11627
  ]
11624
11628
  },
11625
11629
  "propertyNames": {
@@ -14255,7 +14259,8 @@
14255
14259
  "seedance-2.5",
14256
14260
  "hailuo-3",
14257
14261
  "wan3.0",
14258
- "wan3.0-prime"
14262
+ "wan3.0-prime",
14263
+ "kling-4.0"
14259
14264
  ]
14260
14265
  },
14261
14266
  {
@@ -14882,7 +14887,8 @@
14882
14887
  "seedance-2.5",
14883
14888
  "hailuo-3",
14884
14889
  "wan3.0",
14885
- "wan3.0-prime"
14890
+ "wan3.0-prime",
14891
+ "kling-4.0"
14886
14892
  ]
14887
14893
  },
14888
14894
  "reference_image_urls": {
@@ -15981,6 +15987,165 @@
15981
15987
  }
15982
15988
  }
15983
15989
  },
15990
+ "/storyboards/{storyboard_id}/keyframes/generate": {
15991
+ "post": {
15992
+ "operationId": "generate_shot_keyframes",
15993
+ "summary": "★**内测**·按报价出本镜中间关键帧图(**真扣费**)",
15994
+ "description": "★**内测**·按报价出本镜中间关键帧图(**真扣费**)。每张以本镜首帧为锚、保持同一机位取景,只画到 prompt 描述的那一刻;不改本镜首尾帧、不把已有视频标陈旧。异步:立即返回 dispatched,用 get_shot_keyframes 轮询每张 status——ready 才会在重出本镜视频时送进 Seedance 2.5;framing_mismatch = 取景与首帧对不上(不送),改 prompt 后报价重出;failed = 出图失败。\n★报价后改过关键帧会 409,重新报价(免费)即可。\n★【分镜审查硬闸·免费】本步前必须先调 review_storyboards:把返回的 findings 逐条原样告诉客户(每条带 code=问题类型、shots=命中镜号、action=该调哪个工具修),再把 review_token 传进本工具。未审查会被 400 拒。审查后又改了内容 → token 自动失效,复审一次即可(仍免费)。单镜工具(generate_shot_frame / regenerate_shot_video)只核本镜与相邻镜:改了别的镜不用复审;本镜、相邻镜或共享资产变了才 400——这时带 base_review_token=<旧 token> 调审查工具做增量复审,只重审变更镜,质检也只看变更镜。有 error 时默认拦截;客户知情并坚持照现状继续,才带 acknowledge_review:true——带病推进大概率产出废片且照常扣费(acknowledge_review 只代表客户本人同意,任何执行模式都须客户明确同意,托管也不例外);托管环节只有白名单内的启发式 error 能带 auto_acknowledge:true 放行(平台判,不在白名单回 400 AUTOPILOT_MUST_ASK:must_ask_customer=true 才暂停问客户,false = 按 action 自修复审)。★灰度剧还要你(agent)亲自质检:按 review_storyboards 返回的 agent_qc 逐件看素材、逐条答清单,调 submit_qc_report 提交后这张 token 才能用(没交 → 400 agent_qc_required;报告有问题 → 与 error 同样默认拦)。\n★【资产层硬闸·免费】还要先跑 review_assets(角色形象图/场景图/道具图),把它的 review_token 作为 asset_review_token 传进来(与分镜层的 review_token 并存,两张都要;灰度剧缺了会 400 并点名 review_assets)。出完帧不会让资产 token 失效。⚠️ 批量报价确认流程:先调对应的 quote_* 工具拿 estimated_points 与 quote_id,再用 quote_id 调本工具(报价确认按执行模式:专业模式 / 未确认方案 / 本环节由客户把控 → 讲给客户、客户同意才做,别替客户决定;本环节托管 → 不问客户,照 get_production_plan 的 autopilot.default_decisions 执行,平台记进 get_autopilot_log)。托管环节报价须在预算硬上限内,被 402 BUDGET_WOULD_EXCEED 拦下就停下问客户。★**出图类报价(定妆图/场景图/出帧)给的是两个数**:estimated_points 是**上界**(按该模型参考图张数上限估,保证你不会按低了的预算开跑、出到一半 402 中断);同一响应里的 typical_points 是**通常花费**。两个都要告诉客户——只说上界会让人以为贵得多(满参考图的上界可达通常值的 2 倍以上),只说通常值又会让余额准备不足。固定价模型下两者相等,这时说一个数就行。出视频的报价与扣费同函数,不存在这个区间。",
15995
+ "tags": [
15996
+ "storyboards"
15997
+ ],
15998
+ "parameters": [
15999
+ {
16000
+ "name": "storyboard_id",
16001
+ "in": "path",
16002
+ "required": true,
16003
+ "schema": {
16004
+ "type": "integer",
16005
+ "exclusiveMinimum": 0
16006
+ }
16007
+ }
16008
+ ],
16009
+ "requestBody": {
16010
+ "required": true,
16011
+ "content": {
16012
+ "application/json": {
16013
+ "schema": {
16014
+ "type": "object",
16015
+ "properties": {
16016
+ "quote_id": {
16017
+ "type": "string",
16018
+ "description": "来自 quote_shot_keyframes"
16019
+ },
16020
+ "keyframe_ids": {
16021
+ "type": "array",
16022
+ "items": {
16023
+ "type": "integer",
16024
+ "exclusiveMinimum": 0
16025
+ },
16026
+ "maxItems": 3
16027
+ },
16028
+ "image_model": {
16029
+ "type": "string"
16030
+ },
16031
+ "review_token": {
16032
+ "type": "string"
16033
+ },
16034
+ "asset_review_token": {
16035
+ "type": "string"
16036
+ },
16037
+ "acknowledge_review": {
16038
+ "type": "boolean"
16039
+ },
16040
+ "auto_acknowledge": {
16041
+ "type": "boolean"
16042
+ }
16043
+ },
16044
+ "required": [
16045
+ "quote_id"
16046
+ ]
16047
+ }
16048
+ }
16049
+ }
16050
+ },
16051
+ "responses": {
16052
+ "200": {
16053
+ "description": "StarReel envelope",
16054
+ "content": {
16055
+ "application/json": {
16056
+ "schema": {
16057
+ "type": "object",
16058
+ "properties": {
16059
+ "code": {
16060
+ "type": "integer"
16061
+ },
16062
+ "message": {
16063
+ "type": "string"
16064
+ },
16065
+ "data": {
16066
+ "description": "Operation result payload"
16067
+ }
16068
+ }
16069
+ }
16070
+ }
16071
+ }
16072
+ },
16073
+ "402": {
16074
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
16075
+ }
16076
+ }
16077
+ }
16078
+ },
16079
+ "/storyboards/{storyboard_id}/keyframes/quote": {
16080
+ "post": {
16081
+ "operationId": "quote_shot_keyframes",
16082
+ "summary": "★**内测**·中间关键帧出图**报价**(免费·无副作用)",
16083
+ "description": "★**内测**·中间关键帧出图**报价**(免费·无副作用)。默认报本镜所有还没就绪的中间帧(planned / failed / framing_mismatch),keyframe_ids 可点名重出。回 estimated_points / typical_points、要出的 keyframes 与 quote_id。\n★前提:本镜视频引擎是 Seedance 2.5、首帧已就绪、已用 plan_shot_keyframes / set_shot_keyframes 写好中间帧。把 estimated_points 原样告诉客户,同意后再调 generate_shot_keyframes。回 400「本剧未开启」= 不在内测名单,别重试。",
16084
+ "tags": [
16085
+ "storyboards"
16086
+ ],
16087
+ "parameters": [
16088
+ {
16089
+ "name": "storyboard_id",
16090
+ "in": "path",
16091
+ "required": true,
16092
+ "schema": {
16093
+ "type": "integer",
16094
+ "exclusiveMinimum": 0
16095
+ }
16096
+ }
16097
+ ],
16098
+ "requestBody": {
16099
+ "required": false,
16100
+ "content": {
16101
+ "application/json": {
16102
+ "schema": {
16103
+ "type": "object",
16104
+ "properties": {
16105
+ "keyframe_ids": {
16106
+ "type": "array",
16107
+ "items": {
16108
+ "type": "integer",
16109
+ "exclusiveMinimum": 0
16110
+ },
16111
+ "maxItems": 3
16112
+ },
16113
+ "image_model": {
16114
+ "type": "string"
16115
+ }
16116
+ }
16117
+ }
16118
+ }
16119
+ }
16120
+ },
16121
+ "responses": {
16122
+ "200": {
16123
+ "description": "StarReel envelope",
16124
+ "content": {
16125
+ "application/json": {
16126
+ "schema": {
16127
+ "type": "object",
16128
+ "properties": {
16129
+ "code": {
16130
+ "type": "integer"
16131
+ },
16132
+ "message": {
16133
+ "type": "string"
16134
+ },
16135
+ "data": {
16136
+ "description": "Operation result payload"
16137
+ }
16138
+ }
16139
+ }
16140
+ }
16141
+ }
16142
+ },
16143
+ "402": {
16144
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
16145
+ }
16146
+ }
16147
+ }
16148
+ },
15984
16149
  "/storyboards/{storyboard_id}/lipsync": {
15985
16150
  "post": {
15986
16151
  "operationId": "lipsync_shot",
@@ -16498,7 +16663,7 @@
16498
16663
  "post": {
16499
16664
  "operationId": "quote_regenerate_shot_video",
16500
16665
  "summary": "报价:重生某镜视频要多少点",
16501
- "description": "报价:重生某镜视频要多少点。返回 quote_id。零扣费。\n★**按镜指定视频引擎**:传 model 即只为这一镜这一次重生换引擎(不改剧级 video_engine,其它镜照旧);报价按该引擎计价,quote_id 把引擎钉死,regenerate_shot_video 派发的就是它——要换引擎必须重新报价,生成时再传引擎无效。回执 video_engine = 实际派发的引擎,engine_overridden=true 表示盖过了剧引擎。★所选引擎必须支持本剧分辨率(seedance-2.5 只有 480p/720p;hailuo-3 只有 720p/1080p;wan3.0/wan3.0-prime 480p~1080p),不支持则 400 并列出可选引擎——不会悄悄换成别的引擎出片;本镜时长也不能超过该引擎单镜上限(seedance-2.5/wan3.0 30s,hailuo-3 15s),超了 400(厂商会截断)。适用:某镜在本剧引擎上反复失败/被厂商审核拒/镜内自剪,单独换一个引擎试。★同剧混用引擎有画风/身份漂移风险,换完先看这一镜再决定要不要推广;写实真人镜别换 wan3.0/wan3.0-prime(真人脸 720p+ 常被厂商拒)。",
16666
+ "description": "报价:重生某镜视频要多少点。返回 quote_id。零扣费。\n★**按镜指定视频引擎**:传 model 即只为这一镜这一次重生换引擎(不改剧级 video_engine,其它镜照旧);报价按该引擎计价,quote_id 把引擎钉死,regenerate_shot_video 派发的就是它——要换引擎必须重新报价,生成时再传引擎无效。回执 video_engine = 实际派发的引擎,engine_overridden=true 表示盖过了剧引擎。\n★**内测·单镜中间关键帧**:回执带 shot_keyframes(只在内测剧)时,mode=keyframes 表示本次会把首帧 + ready 的中间帧(+尾帧)按秒数一起送给 Seedance 2.5(首帧变软约束、秒数误差约 ±1 秒、点数不变);mode=first_frame 时 reason 说明为什么没走(如 strict-continuity = 首帧是上一镜尾帧拷贝,接缝优先)。★所选引擎必须支持本剧分辨率(seedance-2.5 只有 480p/720p;hailuo-3 只有 720p/1080p;wan3.0/wan3.0-prime 480p~1080p),不支持则 400 并列出可选引擎——不会悄悄换成别的引擎出片;本镜时长也不能超过该引擎单镜上限(seedance-2.5/wan3.0 30s,hailuo-3 15s),超了 400(厂商会截断)。适用:某镜在本剧引擎上反复失败/被厂商审核拒/镜内自剪,单独换一个引擎试。★同剧混用引擎有画风/身份漂移风险,换完先看这一镜再决定要不要推广;写实真人镜别换 wan3.0/wan3.0-prime(真人脸 720p+ 常被厂商拒)。",
16502
16667
  "tags": [
16503
16668
  "storyboards"
16504
16669
  ],
@@ -16526,7 +16691,8 @@
16526
16691
  "seedance-2.5",
16527
16692
  "hailuo-3",
16528
16693
  "wan3.0",
16529
- "wan3.0-prime"
16694
+ "wan3.0-prime",
16695
+ "kling-4.0"
16530
16696
  ]
16531
16697
  }
16532
16698
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starreel/mcp",
3
- "version": "0.1.248",
3
+ "version": "0.1.251",
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.248",
5
+ "version": "0.1.251",
6
6
  "websiteUrl": "https://starreel.ai",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "@starreel/mcp",
11
- "version": "0.1.248",
11
+ "version": "0.1.251",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  },