@starreel/mcp 0.1.49 → 0.1.50

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
@@ -351,7 +351,19 @@ The table above is for **generation failures**. A different class of report is
351
351
 
352
352
  ### "话没说完就切" / a line gets cut off mid-word
353
353
 
354
- Three distinct causes; check in this order, they need opposite fixes.
354
+ **By far the most common cause is #2 — the vendor's clip never said the whole
355
+ line.** Measured across the whole platform (2026-09-01, 282 audited shots with
356
+ dialogue): 28% have a real defect, and *half of those shots were long enough for
357
+ the line*. So do not start by lengthening shots.
358
+
359
+ Run **`scan_dialogue_coverage`** (free) first — it tells you which of the causes
360
+ below you actually have, per shot. `compose_episode` also reports the affected
361
+ shots as advisory `dialogue_truncated`. Both read the same measurement: a
362
+ word-level comparison of what the clip's audio says against the shot's line.
363
+ Note `never_audited` in the report — those shots have never been measured, which
364
+ is not the same as passing; `rescan: true` measures them (costs ASR time).
365
+
366
+ Four distinct causes; they need **opposite** fixes, so identify the family first.
355
367
 
356
368
  1. **The line moved after the video was made.** If you edited `dialogue` on a
357
369
  shot whose video already existed, the video still speaks the *old* line —
@@ -360,11 +372,21 @@ Three distinct causes; check in this order, they need opposite fixes.
360
372
  `compose_episode` reports these as advisory `stale_video_after_edit`.
361
373
  **Fix:** `regenerate_shot_video` those shots, then compose. Never just
362
374
  re-compose — no amount of re-cutting can change what the video says.
363
- 2. **The vendor never said the whole line.** When a shot is too short for the
364
- line, native-audio engines just stop where they stop. Check the shot's own
365
- clip, not the final cut. **Fix:** lengthen the shot (`update_shot.duration`)
366
- and regenerate, or split it (`split_shot`).
367
- 3. **The transition ate the tail.** A cross-fade pulls the *next* shot's start
375
+ 2. **The vendor stopped partway through the line** (family `truncated` — the
376
+ audio *is* the line, just not all of it). **Fix:** `regenerate_shot_video`;
377
+ vendors are non-deterministic about how much they say, so a re-roll often
378
+ lands the full line. Lengthening (`update_shot.duration`) is a second resort,
379
+ not the first move: the platform already raises a shot's duration to fit its
380
+ line whenever the shot is saved, so "too short for the line" is rarely what
381
+ actually happened.
382
+ 3. **The vendor said something other than the line** (family `off_script` — most
383
+ of the audio does not match the script at all: invented lines, repeats of the
384
+ previous shot, or just room tone). Lengthening does nothing here. **Fix:**
385
+ `regenerate_shot_video`; if the same drama keeps producing this, switch
386
+ engine. Measured per-engine rate of shots whose line was not delivered in
387
+ full: `seedance-2.5` 23% · `wan3.0` 44% · `hailuo-3` 50% (30 shots, small
388
+ sample). For dialogue-heavy work prefer `seedance-2.5`.
389
+ 4. **The transition ate the tail.** A cross-fade pulls the *next* shot's start
368
390
  backwards, covering the end of the current one. The platform now shortens or
369
391
  drops that transition automatically so it can never cover a spoken word, so
370
392
  you should not see this any more — if you do, report it.
@@ -602,6 +602,31 @@ export function registerProduceTools(server, client) {
602
602
  + '实测 WAN 11/12 镜有镜内跳切、Seedance 1/6、H3 0/5,且提示词层拦不住(负向约束已在其中)——'
603
603
  + '要根治只能 regenerate_shot_video 这些镜并换 seedance-2.5 或 hailuo-3。'
604
604
  + '组模式镜与显式快剪蒙太奇镜天然多机位,已自动排除(detail 里标 skipped)。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/intra-shot-cuts`)));
605
+ server.tool('scan_dialogue_coverage', '★客户报「话没说完就切 / 台词只念了一半」时先跑这个。默认**免费零扣费**(只读已落库的转录审计结果)。'
606
+ + '把该集每个原声镜的视频音轨与台词做词级比对,按族给出结论:'
607
+ + 'truncated(念到一半就停) / off_script(念的大半不是台词:自说自话、重复上一镜、只有环境音) / '
608
+ + 'extra_speech(台词念全了但还多念) / minor_gap(零星缺词,属转写误差,不必管) / ok。'
609
+ + '★判读:三个可上报的族**处置方向不同**,别一律加长镜头——实测镜长够的镜里仍有 21% 没念全,'
610
+ + '「太短」很少是真因(平台保存分镜时已按台词自动抬时长)。truncated/off_script 的正解都是'
611
+ + ' regenerate_shot_video(厂商每次说多少是随机的,重掷常能拿到整句);同一剧反复 off_script 则换引擎。'
612
+ + '★never_audited 是本报告最重要的一栏:那些镜从没被检测过,「没测过」不等于「没问题」。'
613
+ + 'rescan=true 会对它们补跑 ASR 比对(耗算力、非瞬时,limit 控制单次上限),默认不跑。'
614
+ + 'TTS 配音镜不在范围内(TTS 必然念全,低覆盖率只会是转写误差)。'
615
+ + '同一集若还伴随「切太快」,那是另一回事,跑 scan_intra_shot_cuts。', {
616
+ episode_id: z.number().int().positive(),
617
+ rescan: z.boolean().optional()
618
+ .describe('对从未检测过的镜补跑转写比对(耗算力,非瞬时)。默认 false = 只读已有结果'),
619
+ limit: z.number().int().positive().max(60).optional()
620
+ .describe('rescan 单次补测镜数上限,默认 20、最大 60;被上限截掉的镜数在响应 rescan_skipped_by_limit 里明说'),
621
+ }, async ({ episode_id, rescan, limit }) => {
622
+ const qs = new URLSearchParams();
623
+ if (rescan)
624
+ qs.set('rescan', '1');
625
+ if (limit != null)
626
+ qs.set('limit', String(limit));
627
+ const suffix = qs.toString() ? `?${qs.toString()}` : '';
628
+ return jsonResult(await client.produceGet(`/episodes/${episode_id}/dialogue-coverage${suffix}`));
629
+ });
605
630
  server.tool('update_shot', '逐镜编辑:改单个分镜的文本内容(景别/动作/台词/画面描述/运镜等)与角色绑定(character_ids)。只传要改的字段、其余不动。' +
606
631
  '**免费**(纯文本写库)。★改 dialogue 会自动失效本镜已生成的 TTS 配音与字幕(需重出 tts);' +
607
632
  '改文本不会自动重出图/视频,如需让画面跟上文本改动,改完再 regen 对应镜。用 get_storyboards 查改后结果。' +
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.49",
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.49 tool surface (operationIds match MCP tool names 1:1)."
5
+ "version": "0.1.50",
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.50 tool surface (operationIds match MCP tool names 1:1)."
7
7
  },
8
8
  "servers": [
9
9
  {
@@ -2645,6 +2645,71 @@
2645
2645
  }
2646
2646
  }
2647
2647
  },
2648
+ "/episodes/{episode_id}/dialogue-coverage": {
2649
+ "get": {
2650
+ "operationId": "scan_dialogue_coverage",
2651
+ "summary": "★客户报「话没说完就切 / 台词只念了一半」时先跑这个",
2652
+ "description": "★客户报「话没说完就切 / 台词只念了一半」时先跑这个。默认**免费零扣费**(只读已落库的转录审计结果)。把该集每个原声镜的视频音轨与台词做词级比对,按族给出结论:truncated(念到一半就停) / off_script(念的大半不是台词:自说自话、重复上一镜、只有环境音) / extra_speech(台词念全了但还多念) / minor_gap(零星缺词,属转写误差,不必管) / ok。★判读:三个可上报的族**处置方向不同**,别一律加长镜头——实测镜长够的镜里仍有 21% 没念全,「太短」很少是真因(平台保存分镜时已按台词自动抬时长)。truncated/off_script 的正解都是 regenerate_shot_video(厂商每次说多少是随机的,重掷常能拿到整句);同一剧反复 off_script 则换引擎。★never_audited 是本报告最重要的一栏:那些镜从没被检测过,「没测过」不等于「没问题」。rescan=true 会对它们补跑 ASR 比对(耗算力、非瞬时,limit 控制单次上限),默认不跑。TTS 配音镜不在范围内(TTS 必然念全,低覆盖率只会是转写误差)。同一集若还伴随「切太快」,那是另一回事,跑 scan_intra_shot_cuts。",
2653
+ "tags": [
2654
+ "episodes"
2655
+ ],
2656
+ "parameters": [
2657
+ {
2658
+ "name": "episode_id",
2659
+ "in": "path",
2660
+ "required": true,
2661
+ "schema": {
2662
+ "type": "integer",
2663
+ "exclusiveMinimum": 0
2664
+ }
2665
+ },
2666
+ {
2667
+ "name": "rescan",
2668
+ "in": "query",
2669
+ "required": false,
2670
+ "schema": {
2671
+ "type": "string"
2672
+ }
2673
+ },
2674
+ {
2675
+ "name": "limit",
2676
+ "in": "query",
2677
+ "required": false,
2678
+ "schema": {
2679
+ "type": "integer",
2680
+ "exclusiveMinimum": 0,
2681
+ "maximum": 60
2682
+ }
2683
+ }
2684
+ ],
2685
+ "responses": {
2686
+ "200": {
2687
+ "description": "StarReel envelope",
2688
+ "content": {
2689
+ "application/json": {
2690
+ "schema": {
2691
+ "type": "object",
2692
+ "properties": {
2693
+ "code": {
2694
+ "type": "integer"
2695
+ },
2696
+ "message": {
2697
+ "type": "string"
2698
+ },
2699
+ "data": {
2700
+ "description": "Operation result payload"
2701
+ }
2702
+ }
2703
+ }
2704
+ }
2705
+ }
2706
+ },
2707
+ "402": {
2708
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
2709
+ }
2710
+ }
2711
+ }
2712
+ },
2648
2713
  "/episodes/{episode_id}/effects": {
2649
2714
  "post": {
2650
2715
  "operationId": "generate_effects",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starreel/mcp",
3
- "version": "0.1.49",
3
+ "version": "0.1.50",
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.49",
5
+ "version": "0.1.50",
6
6
  "websiteUrl": "https://starreel.ai",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "@starreel/mcp",
11
- "version": "0.1.49",
11
+ "version": "0.1.50",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  },