@starreel/mcp 0.1.71 → 0.1.73

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
@@ -143,8 +143,11 @@ content that will be rejected.
143
143
  3. **`retryable` decides retry-vs-change — never blind-retry.** On failure read
144
144
  the structured `fail_reason` / `retryable` (from `get_storyboards`) or the
145
145
  `message` / `error.type`. `retryable:false` (moderation, copyright, quota,
146
- overdue) → change the content or stop; retrying is useless. `retryable:true`
147
- (KYC-queuing, rate-limit, transient) → back off, then retry.
146
+ overdue, `needs_content_fix`) → change the content or stop; retrying is useless.
147
+ `retryable:true` (KYC-queuing, rate-limit, `transient`) → back off, then retry.
148
+ `contract_rejected` is retryable **but is not a network blip**: it is a content
149
+ or contract conflict that a re-roll clears about a third of the time. Retry once
150
+ or twice, then read `fail_hint` and change the shot — do not keep re-rolling.
148
151
 
149
152
  4. **Content must be compliant.** Do not generate copyrighted characters,
150
153
  trademarks, real-person likenesses, or sensitive content. On a moderation /
@@ -475,8 +478,10 @@ Map the reason to an action:
475
478
  | `quota_full` | false | Platform vendor-asset quota exhausted | Retry won't help — contact ops |
476
479
  | `insufficient_credits` | false | Balance too low for this call | Stop, prompt to recharge (402) |
477
480
  | `authorizing` | true | Face frame queuing for KYC (not a rejection) | Wait ~1 min, retry |
478
- | `transient` | true | BestOfN / quality-gate / rate-limit / network | Back off, retry |
479
- | `repeat_rejected` | false | Same shot rejected for the same reason until the circuit breaker tripped (auto-clears after 24 h) | Change the prompt / references / contract **first**; a blind retry is a full-price repeat of the same rejection |
481
+ | `transient` | true | BestOfN / quality-gate / rate-limit / network, or the audit itself failed to run | Back off, retry |
482
+ | `contract_rejected` | true | A **content/contract** rejection (era, composition, shot size, head-count, readable text…) — **not** a network blip. Measured: a blind re-roll clears it about a third of the time | Retry once or twice; if the same reason keeps coming back, read `fail_hint` and change the shot (see *What you can actually change* below) instead of re-rolling |
483
+ | `needs_content_fix` | false | A content/contract conflict that a re-roll almost never clears (measured ≤10%) — most often the character's wardrobe/accessory record conflicting with the approved portrait | Change the shot description / character record **first**, then regenerate. A blind retry is a full-price repeat |
484
+ | `repeat_rejected` | false | Same shot rejected for the same reason until the circuit breaker tripped (auto-clears after 24 h) | Change the prompt / references / shot design **first** (see *What you can actually change* below); a blind retry is a full-price repeat of the same rejection |
480
485
  | `pair_collateral` | true | The **other** frame of this shot failed its audit; this frame was never judged bad — it was only closed out with the batch | Do **not** edit this frame. If the shot carries `reopen_pair_id`, pass it to `generate_shot_frame` to redo only the faulty side; otherwise regenerate the shot |
481
486
  | `unknown` | false | Unclassified | Read `fail_hint`; don't auto-retry |
482
487
 
@@ -486,6 +491,41 @@ repeatedly** (the verdict is recorded, not enforced) — the URL looks like any
486
491
  frame, but it needs a human look. If it is not acceptable, fix the input the
487
492
  `hint` names and regenerate that frame with `generate_shot_frame`.
488
493
 
494
+ ### What you can actually change when a shot keeps getting rejected
495
+
496
+ **There is no tool that edits `frame_visual_contract`, and there is not meant to
497
+ be.** It is an internal per-frame contract (subject mode, visible head-count,
498
+ framing) derived by the platform; it drives a dozen downstream judgements, so the
499
+ facade deliberately strips it from every write path. Do not go looking for it,
500
+ and do not tell the customer to "fix the contract" — they cannot, and neither can
501
+ you. What you *can* change, in the order worth trying:
502
+
503
+ 1. **`update_shot`** — `shot_type`, `description`, `action`, and the two prompt
504
+ bodies. This is usually the real fix: a shot whose `image_prompt` describes a
505
+ head-and-shoulders portrait but whose `shot_type` says 特写 will keep failing
506
+ the shot-size gate until one of the two is corrected to match the other.
507
+ 2. **`character_ids`** on that shot — binding is *narrative* attribution, but an
508
+ over-bound shot inflates what the frame audit expects to see.
509
+ 3. **References** — `set_character_portrait` / wardrobe records, when the
510
+ rejection is identity- or costume-shaped.
511
+ 4. **`run_precheck` — and run it *after* the failures too, not only before.**
512
+ Its description sells it as a pre-flight check, but it is just as useful once
513
+ a shot is already stuck: it reports the repeat-rejection circuit breaker and
514
+ contract self-inconsistency for shots that have been failing. Then
515
+ `plan_precheck_fix` → show the customer → `apply_precheck_fix`.
516
+
517
+ Two contract conflicts the platform now resolves **by itself** (v0.9.1868), so
518
+ they are never something to act on: a part/prop/environment shot that also
519
+ declares visible people, and a tight-framing shot that declares more people than
520
+ the frame can hold. Both are silently normalised at read time.
521
+
522
+ If a shot still will not come out, say so plainly and leave it — **do not send
523
+ the customer to an outside image tool.** Frames made elsewhere bypass the
524
+ identity anchor, reference assembly, best-of-N and frame audit, so faces,
525
+ wardrobe and art style drift; the customer will read that drift as *the
526
+ platform's* quality. `upload_shot_frame` exists for genuinely external artwork,
527
+ not as an escape hatch from a rejection loop.
528
+
489
529
  Three action classes, one decision: **moderation / identity / copyright → change
490
530
  content**; **overdue / token → not self-healable (tell user / wait)**; **network
491
531
  / timeout / transient → retry**. Failed spends are auto-refunded (pre-hold →
@@ -496,6 +496,9 @@ export function registerProduceTools(server, client) {
496
496
  '★**怎么改不用你猜**:调 plan_precheck_fix 让平台算出提案(哪一镜、把什么改成什么),' +
497
497
  '讲给客户、客户点头后用 apply_precheck_fix 落库——比你自己用 update_shot 盲改稳,' +
498
498
  '那条路绕开了乐观锁与落库前复核。部分类别系统不替你改(提案里的 blocked),那些才需要人工调。\n' +
499
+ '★★**镜已经反复出不来时也回来跑这个**——本工具不只是事前预检。' +
500
+ '它同时报「同镜同因连拒已熔断(repeat-reject,24h 自动解除)」与「帧契约自相矛盾」,' +
501
+ '那正是"这一镜怎么重掷都出不来"的答案。**别盲重掷**:熔断在档时每次重掷都是全价重复同一个拒绝。\n' +
499
502
  '⚠️ 它**不**检查首帧是否处在"动作发生前"(平台暂无该契约字段),也不替代 get_health_report。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/precheck`)));
500
503
  server.tool('plan_precheck_fix', '让平台**算出**该怎么改 run_precheck 揪出的「指令自相矛盾」类问题(第①步,只算不改)。'
501
504
  + '按文本用量计费(很小),不走报价确认。\n'
@@ -538,7 +541,10 @@ export function registerProduceTools(server, client) {
538
541
  '把 findings 逐条告诉客户、按 action 修完(改稿走 edit_rewritten_script)后复审,再拿 review_token 往下走。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/review/script`)));
539
542
  server.tool('review_storyboards', '【第②道硬闸·免费】审查分镜:禁区词(会被厂商审核拒、白扣费)、镜头时长分布、相邻构图重复、' +
540
543
  '同场景角色站位漂移、情绪曲线峰谷、关键镜标记。★generate_frames 之前必须先跑本工具——' +
541
- '分镜里的问题一旦整集出图就变成整集废图,单镜修不回来。按 findings.action 用 update_shot/split_shot 修完再复审。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/review/storyboards`)));
544
+ '分镜里的问题一旦整集出图就变成整集废图,单镜修不回来。按 findings.action 用 update_shot/split_shot 修完再复审。' +
545
+ '★code=forbidden_term 的 finding 带 `terms` 字段(命中的具体词,如「背景音乐」「强光」)与 `shots`(镜号),' +
546
+ '照着这两个去 update_shot 改掉即可,不用逐字猜。' +
547
+ '★禁区词判**否定语义**:写「无背景音乐」「不要配乐」不算违规(那是在遵守约束),不必为此改稿。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/review/storyboards`)));
542
548
  server.tool('review_frames', '【第③道硬闸·免费】审查镜头图片层:角色身份锚覆盖(缺定妆图的角色在镜头里必漂)、出图失败率、' +
543
549
  '孤儿角色变体、场景图被人物污染。★generate_videos 之前必须先跑本工具——出视频是全链最贵的一步,' +
544
550
  '拿着漂移的首帧整集出视频是最典型的废片形态。按 findings.action 修完(多为 generate_character_portraits / ' +
@@ -572,6 +578,10 @@ export function registerProduceTools(server, client) {
572
578
  '★响应里的 frames_planned 是**计划数,不是已成功数**——本接口在后台派发循环开跑之前就返回了。' +
573
579
  '真实进度只看 get_storyboards 的 first_frame_image / get_jobs 的逐条生成记录;' +
574
580
  '余额不足(402)会中止整批,此时轮询再久也不会有结果,应去查余额而不是继续等。' +
581
+ '★★**个别镜反复出不来、其余镜都好了**:那不是等得不够久,是这几镜被内容闸连拒。' +
582
+ '看 get_storyboards 的 fail_reason(repeat_rejected / needs_content_fix / contract_rejected),' +
583
+ '然后**跑 run_precheck**(事后也能跑,会告诉你是哪种矛盾),按它的提示用 update_shot 改景别/描述/绑定角色再重生。' +
584
+ '别继续 generate_frames 空转,也别把客户支去外部工具做图——外部图绕开身份锚与帧审计,人脸服装画风必漂。' +
575
585
  REVIEW_GATE_HINT('review_storyboards', '分镜') + CONFIRM_HINT, {
576
586
  episode_id: z.number().int().positive(),
577
587
  quote_id: z.string().describe('来自 quote_frames'),
@@ -1229,7 +1239,14 @@ export function registerProduceTools(server, client) {
1229
1239
  '★覆盖式:出好后本场旧图被换掉(要留档先 get_scene_prompt/资产列表拿旧图 URL)。' +
1230
1240
  '★已生成的镜头帧不会自动跟着重出——它们仍拿旧场景图当背景锚,要跟上得逐镜重出。' +
1231
1241
  '★与 generate_scene_images 的区别:那个是整剧批量、只补**缺图**的场景,已有图的一律跳过;' +
1232
- '这个是单场景强制重出。客户自己上传过的场景图也会被覆盖,先确认是不是要保留。', { scene_id: z.number().int().positive() }, async ({ scene_id }) => jsonResult(await client.producePost(`/scenes/${scene_id}/image/regenerate`)));
1242
+ '这个是单场景强制重出。客户自己上传过的场景图也会被覆盖,先确认是不是要保留。' +
1243
+ '★episode_id 通常不必传(平台按场景归属、再按引用它的分镜自动推导)。' +
1244
+ '只有回执报「本场景被多集分镜共用」时才需要点名:那说明同一地点跨集复用,' +
1245
+ '平台不猜该按哪一集的时代/世界观出图——猜错就是画面年代静默错掉。', {
1246
+ scene_id: z.number().int().positive(),
1247
+ episode_id: z.number().int().positive().optional()
1248
+ .describe('按哪一集的时代/世界观 brief 出图。通常不必传;跨集共用的场景被要求时才传'),
1249
+ }, async ({ scene_id, episode_id }) => jsonResult(await client.producePost(`/scenes/${scene_id}/image/regenerate`, episode_id ? { episode_id } : {})));
1233
1250
  server.tool('delete_scene', '删除一个场景。免费。', { scene_id: z.number().int().positive() }, async ({ scene_id }) => jsonResult(await client.produceDelete(`/scenes/${scene_id}`)));
1234
1251
  server.tool('generate_character_sheet', '给**单个**角色出三视图设定图(镜头一致性根锚,所有镜头帧都会引用;比定妆图更完整)。整集批量用 generate_character_sheets。' +
1235
1252
  '前置:该角色已有定妆图。图片步,按用量后付不欠费。', { character_id: z.number().int().positive(), episode_id: z.number().int().positive().optional() }, async ({ character_id, episode_id }) => jsonResult(await client.producePost(`/characters/${character_id}/sheet`, episode_id ? { episode_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.71",
6
- "description": "Turn a script into a finished, downloadable short-drama episode over REST.\n\nPipeline: script → AI rewrite → cast/scenes/props extraction → portraits & sheets → storyboards → 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). 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.71 tool surface (operationIds match MCP tool names 1:1)."
5
+ "version": "0.1.73",
6
+ "description": "Turn a script into a finished, downloadable short-drama episode over REST.\n\nPipeline: script → AI rewrite → cast/scenes/props extraction → portraits & sheets → storyboards → 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). 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.73 tool surface (operationIds match MCP tool names 1:1)."
7
7
  },
8
8
  "servers": [
9
9
  {
@@ -4113,7 +4113,7 @@
4113
4113
  "post": {
4114
4114
  "operationId": "generate_frames",
4115
4115
  "summary": "确认后批量出帧:后台异步",
4116
- "description": "确认后批量出帧:后台异步。用 get_storyboards 轮询,first_frame_image/last_frame_image 逐镜填充即完成。★图片生成较慢——每张几十秒到数分钟(尤其高清模型),整集可能十几分钟。轮询看 frame_status:**pending=还在生成(继续耐心等,别当失败、别重复调 generate_frames,重复触发=白花钱)**、ready=完成、failed=才是真失败。别因为「等了一会儿还没出」就判定生成失败或重试。出视频前必须先出帧,否则视频会退化成无一致性锚点的画面。frame_type 要与 quote_frames 用的一致(默认 first_frame)。★这是**批量补缺帧**:只给「缺该帧」的镜出图,已有首帧的镜会跳过——这是正常设计、不是\"系统拒绝重出\"。要**重出/重画某一镜已有的帧**(如换了定妆图要让新图生效),用 generate_shot_frame(单镜重生,平台带身份锚),不是这个工具、更不是自制图 upload_shot_frame。★尾帧能批量出:frame_type=last_frame 会给「已有首帧且缺尾帧」的镜批量补尾帧(尾帧只在想固定某镜结尾画面/大运镜时才需,常规只出首帧)。★响应里的 frames_planned 是**计划数,不是已成功数**——本接口在后台派发循环开跑之前就返回了。真实进度只看 get_storyboards 的 first_frame_image / get_jobs 的逐条生成记录;余额不足(402)会中止整批,此时轮询再久也不会有结果,应去查余额而不是继续等。\n★【分镜审查硬闸·免费】本步前必须先调 review_storyboards:把返回的 findings 逐条原样告诉客户(每条带 code=问题类型、shots=命中镜号、action=该调哪个工具修),再把 review_token 传进本工具。未审查会被 400 拒。审查后又改了内容 → token 自动失效,复审一次即可(仍免费)。有 error 时默认拦截;客户知情并坚持照现状继续,才带 acknowledge_review:true——带病推进大概率产出废片且照常扣费,不要替客户做这个决定。⚠️ 批量报价确认流程:先调对应的 quote_* 工具,把返回的 estimated_points 原样告诉用户,用户明确同意后,才用返回的 quote_id 调本工具。不要擅自确认。",
4116
+ "description": "确认后批量出帧:后台异步。用 get_storyboards 轮询,first_frame_image/last_frame_image 逐镜填充即完成。★图片生成较慢——每张几十秒到数分钟(尤其高清模型),整集可能十几分钟。轮询看 frame_status:**pending=还在生成(继续耐心等,别当失败、别重复调 generate_frames,重复触发=白花钱)**、ready=完成、failed=才是真失败。别因为「等了一会儿还没出」就判定生成失败或重试。出视频前必须先出帧,否则视频会退化成无一致性锚点的画面。frame_type 要与 quote_frames 用的一致(默认 first_frame)。★这是**批量补缺帧**:只给「缺该帧」的镜出图,已有首帧的镜会跳过——这是正常设计、不是\"系统拒绝重出\"。要**重出/重画某一镜已有的帧**(如换了定妆图要让新图生效),用 generate_shot_frame(单镜重生,平台带身份锚),不是这个工具、更不是自制图 upload_shot_frame。★尾帧能批量出:frame_type=last_frame 会给「已有首帧且缺尾帧」的镜批量补尾帧(尾帧只在想固定某镜结尾画面/大运镜时才需,常规只出首帧)。★响应里的 frames_planned 是**计划数,不是已成功数**——本接口在后台派发循环开跑之前就返回了。真实进度只看 get_storyboards 的 first_frame_image / get_jobs 的逐条生成记录;余额不足(402)会中止整批,此时轮询再久也不会有结果,应去查余额而不是继续等。★★**个别镜反复出不来、其余镜都好了**:那不是等得不够久,是这几镜被内容闸连拒。看 get_storyboards 的 fail_reason(repeat_rejected / needs_content_fix / contract_rejected),然后**跑 run_precheck**(事后也能跑,会告诉你是哪种矛盾),按它的提示用 update_shot 改景别/描述/绑定角色再重生。别继续 generate_frames 空转,也别把客户支去外部工具做图——外部图绕开身份锚与帧审计,人脸服装画风必漂。\n★【分镜审查硬闸·免费】本步前必须先调 review_storyboards:把返回的 findings 逐条原样告诉客户(每条带 code=问题类型、shots=命中镜号、action=该调哪个工具修),再把 review_token 传进本工具。未审查会被 400 拒。审查后又改了内容 → token 自动失效,复审一次即可(仍免费)。有 error 时默认拦截;客户知情并坚持照现状继续,才带 acknowledge_review:true——带病推进大概率产出废片且照常扣费,不要替客户做这个决定。⚠️ 批量报价确认流程:先调对应的 quote_* 工具,把返回的 estimated_points 原样告诉用户,用户明确同意后,才用返回的 quote_id 调本工具。不要擅自确认。",
4117
4117
  "tags": [
4118
4118
  "episodes"
4119
4119
  ],
@@ -4755,7 +4755,7 @@
4755
4755
  "get": {
4756
4756
  "operationId": "run_precheck",
4757
4757
  "summary": "(★推荐·免费质量闸)出图/出视频前跑生成前预检,把会被拒的镜提前揪出",
4758
- "description": "(★推荐·免费质量闸)出图/出视频前跑生成前预检,把会被拒的镜提前揪出。免费、不扣费。强烈建议 generate_frames/generate_videos 前调,防白花钱被拒。\n查这几类:①真人肖像/克隆音色授权 ②图像审核高危词 ③配音覆盖与大空档 ④**指令自相矛盾(kind=prompt-conflict)**——同一镜里互斥的要求(如宽景别却标了特写主体、既要站立又要坐姿),这类镜**任何正确的图都满足不了**,不改就会反复被拒并反复扣费,出现时应先按提示改分镜再出图,而不是重试。\n★**怎么改不用你猜**:调 plan_precheck_fix 让平台算出提案(哪一镜、把什么改成什么),讲给客户、客户点头后用 apply_precheck_fix 落库——比你自己用 update_shot 盲改稳,那条路绕开了乐观锁与落库前复核。部分类别系统不替你改(提案里的 blocked),那些才需要人工调。\n⚠️ 它**不**检查首帧是否处在\"动作发生前\"(平台暂无该契约字段),也不替代 get_health_report。",
4758
+ "description": "(★推荐·免费质量闸)出图/出视频前跑生成前预检,把会被拒的镜提前揪出。免费、不扣费。强烈建议 generate_frames/generate_videos 前调,防白花钱被拒。\n查这几类:①真人肖像/克隆音色授权 ②图像审核高危词 ③配音覆盖与大空档 ④**指令自相矛盾(kind=prompt-conflict)**——同一镜里互斥的要求(如宽景别却标了特写主体、既要站立又要坐姿),这类镜**任何正确的图都满足不了**,不改就会反复被拒并反复扣费,出现时应先按提示改分镜再出图,而不是重试。\n★**怎么改不用你猜**:调 plan_precheck_fix 让平台算出提案(哪一镜、把什么改成什么),讲给客户、客户点头后用 apply_precheck_fix 落库——比你自己用 update_shot 盲改稳,那条路绕开了乐观锁与落库前复核。部分类别系统不替你改(提案里的 blocked),那些才需要人工调。\n★★**镜已经反复出不来时也回来跑这个**——本工具不只是事前预检。它同时报「同镜同因连拒已熔断(repeat-reject,24h 自动解除)」与「帧契约自相矛盾」,那正是\"这一镜怎么重掷都出不来\"的答案。**别盲重掷**:熔断在档时每次重掷都是全价重复同一个拒绝。\n⚠️ 它**不**检查首帧是否处在\"动作发生前\"(平台暂无该契约字段),也不替代 get_health_report。",
4759
4759
  "tags": [
4760
4760
  "episodes"
4761
4761
  ],
@@ -5282,7 +5282,7 @@
5282
5282
  "post": {
5283
5283
  "operationId": "review_storyboards",
5284
5284
  "summary": "【第②道硬闸·免费】审查分镜:禁区词(会被厂商审核拒、白扣费)、镜头时长分布、相邻构图重复、同场景角色站位漂移、情绪曲线峰谷、关键镜标记",
5285
- "description": "【第②道硬闸·免费】审查分镜:禁区词(会被厂商审核拒、白扣费)、镜头时长分布、相邻构图重复、同场景角色站位漂移、情绪曲线峰谷、关键镜标记。★generate_frames 之前必须先跑本工具——分镜里的问题一旦整集出图就变成整集废图,单镜修不回来。按 findings.action 用 update_shot/split_shot 修完再复审。",
5285
+ "description": "【第②道硬闸·免费】审查分镜:禁区词(会被厂商审核拒、白扣费)、镜头时长分布、相邻构图重复、同场景角色站位漂移、情绪曲线峰谷、关键镜标记。★generate_frames 之前必须先跑本工具——分镜里的问题一旦整集出图就变成整集废图,单镜修不回来。按 findings.action 用 update_shot/split_shot 修完再复审。★code=forbidden_term 的 finding 带 `terms` 字段(命中的具体词,如「背景音乐」「强光」)与 `shots`(镜号),照着这两个去 update_shot 改掉即可,不用逐字猜。★禁区词判**否定语义**:写「无背景音乐」「不要配乐」不算违规(那是在遵守约束),不必为此改稿。",
5286
5286
  "tags": [
5287
5287
  "episodes"
5288
5288
  ],
@@ -7693,7 +7693,7 @@
7693
7693
  "post": {
7694
7694
  "operationId": "regenerate_scene_image",
7695
7695
  "summary": "按当前提示词重出**这一场**的场景图(改完 image_prompt 让画面跟上)",
7696
- "description": "按当前提示词重出**这一场**的场景图(改完 image_prompt 让画面跟上)。图片步,按用量后付不欠费。★覆盖式:出好后本场旧图被换掉(要留档先 get_scene_prompt/资产列表拿旧图 URL)。★已生成的镜头帧不会自动跟着重出——它们仍拿旧场景图当背景锚,要跟上得逐镜重出。★与 generate_scene_images 的区别:那个是整剧批量、只补**缺图**的场景,已有图的一律跳过;这个是单场景强制重出。客户自己上传过的场景图也会被覆盖,先确认是不是要保留。",
7696
+ "description": "按当前提示词重出**这一场**的场景图(改完 image_prompt 让画面跟上)。图片步,按用量后付不欠费。★覆盖式:出好后本场旧图被换掉(要留档先 get_scene_prompt/资产列表拿旧图 URL)。★已生成的镜头帧不会自动跟着重出——它们仍拿旧场景图当背景锚,要跟上得逐镜重出。★与 generate_scene_images 的区别:那个是整剧批量、只补**缺图**的场景,已有图的一律跳过;这个是单场景强制重出。客户自己上传过的场景图也会被覆盖,先确认是不是要保留。★episode_id 通常不必传(平台按场景归属、再按引用它的分镜自动推导)。只有回执报「本场景被多集分镜共用」时才需要点名:那说明同一地点跨集复用,平台不猜该按哪一集的时代/世界观出图——猜错就是画面年代静默错掉。",
7697
7697
  "tags": [
7698
7698
  "scenes"
7699
7699
  ],
@@ -7708,6 +7708,22 @@
7708
7708
  }
7709
7709
  }
7710
7710
  ],
7711
+ "requestBody": {
7712
+ "required": false,
7713
+ "content": {
7714
+ "application/json": {
7715
+ "schema": {
7716
+ "type": "object",
7717
+ "properties": {
7718
+ "episode_id": {
7719
+ "type": "integer",
7720
+ "exclusiveMinimum": 0
7721
+ }
7722
+ }
7723
+ }
7724
+ }
7725
+ }
7726
+ },
7711
7727
  "responses": {
7712
7728
  "200": {
7713
7729
  "description": "StarReel envelope",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starreel/mcp",
3
- "version": "0.1.71",
3
+ "version": "0.1.73",
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.71",
5
+ "version": "0.1.73",
6
6
  "websiteUrl": "https://starreel.ai",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "@starreel/mcp",
11
- "version": "0.1.71",
11
+ "version": "0.1.73",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  },