@starreel/mcp 0.1.88 → 0.1.89
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 +39 -1
- package/dist/tools/guide-data.js +176 -2
- package/dist/tools/guide.js +2 -1
- package/dist/tools/produce.js +29 -2
- package/openapi.json +172 -3
- package/package.json +1 -1
- package/server.json +2 -2
package/SKILL.md
CHANGED
|
@@ -87,7 +87,7 @@ announces a condensed version as MCP `instructions` at connect time.
|
|
|
87
87
|
| A song + lyrics | `create_drama` (`project_type: "mv"`) → `set_mv_lyrics` → `generate_mv_story` → `generate_mv_script` | `rewrite_script` (blocked for MV) |
|
|
88
88
|
| A product / brand | `create_drama` (`project_type: "ad"` or `"brand_film"`) → `add_product` → `generate_product_sheet` | writing brand copy as dialogue (it gets spoken) |
|
|
89
89
|
| Generated shots / a cut that needs changes | `scan_dialogue_coverage` / `scan_intra_shot_cuts` first, then `get_shot_prompts` · `update_shot` · `replace_shot_dialogue` · `repair_episode_dialogue` · `split_shot` · `trim_shot` · `regenerate_shot_video` · `edit_video_shot` → `rerender_episode` | re-composing to fix what a clip *says* |
|
|
90
|
-
| Wants to assemble the cut themselves | `export_handoff_pack` → `get_handoff_toolchain` | `compose_episode` (pick one) |
|
|
90
|
+
| Wants to assemble the cut themselves | `export_handoff_pack` → `get_handoff_toolchain` → **`register_external_delivery`** when the cut is final | `compose_episode` (pick one); delivering a cut the platform has no record of |
|
|
91
91
|
| A multi-language release | `translate_subtitles` · `subtitle_secondary_lang` in project settings | — |
|
|
92
92
|
|
|
93
93
|
### Customer-supplied images
|
|
@@ -325,6 +325,19 @@ content that will be rejected.
|
|
|
325
325
|
seedance stays 720p (HD tiers off sale), hailuo-3 → 1080p (= 2K, 112 pts/s),
|
|
326
326
|
WAN → 1080p (168 pts/s). hailuo-3 has no separate 480p tier (a 480p request
|
|
327
327
|
still bills at 768P).
|
|
328
|
+
**Model strengths & weaknesses — ask `get_capabilities_guide` with
|
|
329
|
+
`section=model_guide`** before proposing a model: it carries measured data
|
|
330
|
+
per image model and video engine, a step-by-step choice list and ready-made
|
|
331
|
+
combos. The short version for images: `gpt-image-2.5-flare` has by far the
|
|
332
|
+
best first-try rate (60% vs 5% for Nano Banana 2 in the same period) and much
|
|
333
|
+
better hands / hand-held objects, so despite the higher unit price it costs
|
|
334
|
+
roughly 1/3 as much per *usable* image; its weak spots are a ~3× higher vendor
|
|
335
|
+
safety-refusal rate on violent scenes (the platform auto-retries once on
|
|
336
|
+
`gemini-3.1-flash-image`) and occasional drift toward an anime look on
|
|
337
|
+
photoreal dramas — redraw those single shots on `gemini-3.1-flash-image`.
|
|
338
|
+
Use `gpt-image-2.5-sunburst` for shots with readable Chinese text, the 31-pt
|
|
339
|
+
models (Lite / Seedream 5.0) only for drafts, and Nano Banana Pro for a few
|
|
340
|
+
key images. Compare models by cost per usable image, never by unit price.
|
|
328
341
|
**Set the drama engine before generating any video**:
|
|
329
342
|
switching never re-renders existing shots, and mixing engines inside one
|
|
330
343
|
drama risks style/identity drift.
|
|
@@ -630,6 +643,22 @@ The table above is for **generation failures**. A different class of report is
|
|
|
630
643
|
"the video generated fine, but the cut is wrong." These never surface as a
|
|
631
644
|
`fail_reason` — nothing failed. Diagnose by symptom:
|
|
632
645
|
|
|
646
|
+
### "成片里有两层字幕" / extra text burned into the picture
|
|
647
|
+
|
|
648
|
+
On native-audio projects (the clip carries the voices) the video vendor sometimes
|
|
649
|
+
ignores the "no subtitles" constraint and burns the spoken line into the picture —
|
|
650
|
+
small, usually in the lower half, and **only for the second or two while that line
|
|
651
|
+
is spoken**, so spot-checking a frame or two easily misses it. The platform then
|
|
652
|
+
renders its own subtitles on top, and the viewer sees the line twice.
|
|
653
|
+
|
|
654
|
+
Run **`scan_burned_subtitles`** before the final compose (or as soon as someone
|
|
655
|
+
reports doubled text). It samples 12 frames per shot and makes one small vision
|
|
656
|
+
call per shot (billed by usage). `matches_dialogue: true` means the text it read
|
|
657
|
+
*is* that shot's line — treat that as confirmed. Text that physically exists in
|
|
658
|
+
the scene (signs, book pages, screens) is not reported. Re-composing cannot remove
|
|
659
|
+
burned-in text; `regenerate_shot_video` the flagged shots. After a non-dry-run scan,
|
|
660
|
+
`compose_episode` lists them as advisory `vendor_burned_text`.
|
|
661
|
+
|
|
633
662
|
### "话没说完就切" / a line gets cut off mid-word
|
|
634
663
|
|
|
635
664
|
**By far the most common cause is #2 — the vendor's clip never said the whole
|
|
@@ -855,6 +884,15 @@ to close") tells the vendor to fit that entire sequence into each 3-second shot.
|
|
|
855
884
|
`get_bgm_prompt_guide`, `replace_shot_dialogue`
|
|
856
885
|
- **Finish**: `compose_episode`, `get_final_cut`, `get_export`,
|
|
857
886
|
`generate_episode_poster`, `generate_cover`
|
|
887
|
+
- **Delivered a cut you finished outside the platform** (re-voiced lines, trims,
|
|
888
|
+
an ending card, music): `register_external_delivery` the exact file you hand to
|
|
889
|
+
the customer — **every time**, including revisions. Otherwise the platform's
|
|
890
|
+
records describe a cut the customer never received, and nobody can later tell
|
|
891
|
+
which version shipped or which generation each shot came from. The platform
|
|
892
|
+
re-hashes the file itself and snapshots every shot's source clip; put what you
|
|
893
|
+
changed outside in `manifest`. `get_final_cut` then returns it as `delivery`
|
|
894
|
+
next to the platform's own `download_url`; `list_deliveries` /
|
|
895
|
+
`set_current_delivery` manage versions.
|
|
858
896
|
- **Assemble it yourself**: `export_handoff_pack`, `get_handoff_toolchain` —
|
|
859
897
|
download the per-shot raw clips, dialogue tracks, SFX, BGM and subtitles, then
|
|
860
898
|
decide transitions and assemble the cut on your own side. Use this instead of
|
package/dist/tools/guide-data.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* ★列表字段(use / tools / run / fix)里每一项以**工具名开头**,括号里写关键参数;
|
|
15
15
|
* 散文字段里的工具名用反引号包住——referencedTools() 靠这两条约定抽名字。
|
|
16
16
|
*/
|
|
17
|
-
export const GUIDE_VERSION = '2026-09-
|
|
17
|
+
export const GUIDE_VERSION = '2026-09-25';
|
|
18
18
|
/** 按客户手上的材料选入口——这是 agent 最常缺的那张表。 */
|
|
19
19
|
export const ENTRY_POINTS = [
|
|
20
20
|
{
|
|
@@ -378,6 +378,174 @@ export const LOCAL_POSTPRODUCTION = {
|
|
|
378
378
|
'平台侧成片用 `get_final_cut` 取。',
|
|
379
379
|
],
|
|
380
380
|
};
|
|
381
|
+
/**
|
|
382
|
+
* v0.9.2018 — 模型选型指南。工具参数描述只列「型号 + 价格」,这里回答「哪个好、好在哪、坑在哪、该怎么配」。
|
|
383
|
+
* ★数字全部来自平台生产实测(带样本量),样本不足的维度如实写「未系统实测」,别替它补结论。
|
|
384
|
+
* ★型号集合与工具参数可选值由 test/mcp-model-guide.test.ts 双向钉住——新增/下架型号两处一起改。
|
|
385
|
+
*/
|
|
386
|
+
export const MODEL_GUIDE = {
|
|
387
|
+
principle: '模型是 drama 级设置(create_drama / update_project_settings 的 image_model、video_engine),整剧统一画风与身份;' +
|
|
388
|
+
'单镜可临时覆盖(图:`generate_shot_frame` 传 image_model,且须与 `quote_shot_frame` 传的同一个;视频编辑:`edit_video_shot` 传 model)。' +
|
|
389
|
+
'选型要主动讲给客户:把价差与优劣摆出来,让客户定,别默默用默认值。' +
|
|
390
|
+
'比较模型「贵不贵」要按**每张可用图/每条可用镜头**算,不是按单张单价——重抽次数差几倍时,单价低的反而更贵。',
|
|
391
|
+
image_models: [
|
|
392
|
+
{
|
|
393
|
+
id: 'gpt-image-2.5-flare', name: 'ChatGPT Image 2.5 Flare', is_default: true,
|
|
394
|
+
price: '基础 11 点 + 每张参考图 18 点(按实际送出的参考图计;常见 4~6 张 ≈ 80~120 点/张);报价是区间,按 estimated_points 备余额',
|
|
395
|
+
strengths: [
|
|
396
|
+
'一次过率最高:同期实测 60.1%(223 个镜位),中位 1 张就出可用图;Nano Banana 2 同口径 4.9%',
|
|
397
|
+
'手部、手持器物、接触关系结构明显更稳(同镜同参考图配对比较,6 对里 4 对明显胜出)',
|
|
398
|
+
'参考图最多 16 张:多人同框时每个角色的身份锚都送得到',
|
|
399
|
+
'竖屏出图 1088×1920,最贴近 9:16',
|
|
400
|
+
'算上重抽,每张可用图的实际花费约为 Nano Banana 2 的 1/3~1/4',
|
|
401
|
+
],
|
|
402
|
+
weaknesses: [
|
|
403
|
+
'厂商安全拒绝率最高:约 2.61%(Nano Banana 2 约 0.83%),打斗/流血/武器场景更容易触发;平台会自动换 gemini-3.1-flash-image 重出一次',
|
|
404
|
+
'写实电影感剧偶发画风漂成日式动漫 CG(配对样本 6 对里 1 对)',
|
|
405
|
+
'单价随参考图张数浮动,报价只能给区间',
|
|
406
|
+
],
|
|
407
|
+
best_for: '绝大多数剧的默认选择;近景/特写、手部动作、手持道具、多人同框镜尤其该用它',
|
|
408
|
+
avoid_for: '暴力场面密集且反复被安全拒的镜(那几镜单独换 gemini-3.1-flash-image)',
|
|
409
|
+
},
|
|
410
|
+
{
|
|
411
|
+
id: 'gpt-image-2.5-sunburst', name: 'ChatGPT Image 2.5 Sunburst',
|
|
412
|
+
price: '与 flare 同价(11 + 18/参考图)',
|
|
413
|
+
strengths: ['编辑精度优先,中文字形与细部更准', '其余能力同 flare(16 张参考图、1088×1920)'],
|
|
414
|
+
weaknesses: ['比 flare 慢约 5 秒/张', '平台内样本少,一次过率未单独实测;安全拒绝特性按同厂商同代推定与 flare 相近'],
|
|
415
|
+
best_for: '画面里要出现可读中文(招牌、字卡、屏幕、文件、海报)或细部特写要求高的镜',
|
|
416
|
+
avoid_for: '没有文字需求的整集批量——多等时间、无额外收益',
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
id: 'gemini-3.1-flash-image', name: 'Nano Banana 2',
|
|
420
|
+
price: '一口价:镜头帧 71 点/张(1K);定妆照、设定图等身份锚 119 点/张(2K);参考图不另收(最多 14 张)',
|
|
421
|
+
strengths: [
|
|
422
|
+
'画风锚定稳:写实电影感剧不容易漂成动漫风',
|
|
423
|
+
'安全拒绝率低(约 0.83%),GPT 2.5 被拒的镜换它通常能过',
|
|
424
|
+
'固定价,预算好算',
|
|
425
|
+
],
|
|
426
|
+
weaknesses: [
|
|
427
|
+
'一次过率低:实测 4.9%(123 个镜位),中位要烧 6 张才出一张可用图——单价便宜但总花费反而高',
|
|
428
|
+
'手指、手持器物容易融合或崩坏,且平台的解剖审计对手部覆盖不足,坏手可能被放行,要人工看',
|
|
429
|
+
'≤720p 剧的镜头帧按 1K 档出(768×1376),细节上限低于 GPT 2.5',
|
|
430
|
+
],
|
|
431
|
+
best_for: '群像/远景/氛围镜、需要稳住写实画风的镜;GPT 2.5 被安全拒的镜的替补',
|
|
432
|
+
avoid_for: '手部特写、手持道具、器物密集(托盘、线缆、算盘、卷轴一类)的近景',
|
|
433
|
+
},
|
|
434
|
+
{
|
|
435
|
+
id: 'gemini-3-pro-image', name: 'Nano Banana Pro',
|
|
436
|
+
price: '175 点/张一口价(2K)',
|
|
437
|
+
strengths: ['画面最精细', '安全拒绝实测 0 次(145 张)', '早期同口径成功率 88.2%,每镜位平均 2.4 张候选'],
|
|
438
|
+
weaknesses: ['最贵,是 flare 常见单价的约 1.5~2 倍', '样本量小(34 个镜位),与 GPT 2.5 的一次过率未做同窗口对比'],
|
|
439
|
+
best_for: '封面、海报、定妆锚这类少量关键图',
|
|
440
|
+
avoid_for: '整集批量出镜头帧',
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
id: 'gemini-3.1-flash-lite-image', name: 'Nano Banana 2 Lite',
|
|
444
|
+
price: '31 点/张(经济档,厂商恒 1K)',
|
|
445
|
+
strengths: ['最便宜档之一', '出图快,适合快速看构图'],
|
|
446
|
+
weaknesses: ['分辨率固定 1K,细节上限最低', '平台内未系统实测质量,不建议作交付帧'],
|
|
447
|
+
best_for: '草稿、试风格、分镜预览',
|
|
448
|
+
avoid_for: '交付用的镜头帧与定妆锚——交付前切回 flare',
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
id: 'doubao-seedream-5-0-260128', name: 'Seedream 5.0',
|
|
452
|
+
price: '31 点/张(经济档)',
|
|
453
|
+
strengths: ['经济档价格', '出图像素高(厂商最低约 1920×1920 级)', '安全拒绝实测 0 次(170 张)', '参考图最多 10 张'],
|
|
454
|
+
weaknesses: ['平台内样本少,一次过率与手部结构未系统实测', '与 GPT 2.5 / Nano Banana 画风差异明显,整剧中途换它会跳风格'],
|
|
455
|
+
best_for: '预算敏感、想低价试另一种画风的项目(从第一张图就用它,别中途换)',
|
|
456
|
+
avoid_for: '已经用别的模型出过大半集的剧',
|
|
457
|
+
},
|
|
458
|
+
],
|
|
459
|
+
image_decision: [
|
|
460
|
+
'① 默认 gpt-image-2.5-flare,建剧时就定,整集统一。中途换模型会让同一集里出现两种画风和两种画幅。',
|
|
461
|
+
'② 画面里要出现可读中文(招牌/字卡/屏幕/海报)→ 这些镜用 gpt-image-2.5-sunburst。',
|
|
462
|
+
'③ 某镜反复被安全拒(打斗、流血、武器)→ 平台已自动换 Nano Banana 2 重出一次;仍不行就对那一镜 `quote_shot_frame` → `generate_shot_frame` 显式传 image_model=gemini-3.1-flash-image(两次必须同值,否则 400 IMAGE_MODEL_MISMATCH),同时把措辞中性化。',
|
|
463
|
+
'④ 写实电影感剧里某镜画风漂成动漫 → 这一镜换 gemini-3.1-flash-image 重画。',
|
|
464
|
+
'⑤ 手部/持物/多人同框镜出现坏手、手物融合 → 用(或换回) gpt-image-2.5-flare 重画;Nano Banana 系列在这类镜上明显更差。',
|
|
465
|
+
'⑥ 只是试风格、看构图 → gemini-3.1-flash-lite-image 或 Seedream 5.0(31 点),交付前切回主模型重出。',
|
|
466
|
+
'⑦ 封面/海报/定妆锚要最精细 → gemini-3-pro-image(175 点),只用在少量关键图上。',
|
|
467
|
+
],
|
|
468
|
+
video_engines: [
|
|
469
|
+
{
|
|
470
|
+
id: 'seedance-2.5', name: 'Seedance 2.5', is_default: true,
|
|
471
|
+
price: '720p 约 212 点/秒(在售 480p/720p,高清档停售);单镜 2~30 秒',
|
|
472
|
+
strengths: [
|
|
473
|
+
'指令遵循与人脸细节最强,写实真人剧首选',
|
|
474
|
+
'能力最全:首尾帧链、场景组、关键帧组(组内每镜都送自己的首帧,只有它支持)、就地编辑含时间区间、延长、参考图锚',
|
|
475
|
+
'镜内自行跳切少(实测 1/6 镜),单镜叙事稳',
|
|
476
|
+
'台词念不全的比例最低:23%(294 镜)',
|
|
477
|
+
],
|
|
478
|
+
weaknesses: [
|
|
479
|
+
'最贵:约为 hailuo-3 的 3 倍、wan3.0 的 2.5 倍',
|
|
480
|
+
'文本审核最严:打斗、流血一类措辞容易直接被拒,要中性化描述',
|
|
481
|
+
'写实角色要做一次虚拟人像核验(每个人物锁 200 点,只有本引擎收)',
|
|
482
|
+
],
|
|
483
|
+
best_for: '写实真人剧、对白多的剧、要逐镜精确控制画面的剧',
|
|
484
|
+
},
|
|
485
|
+
{
|
|
486
|
+
id: 'hailuo-3', name: 'MiniMax H3',
|
|
487
|
+
price: '720p(=768P)70 点/秒、1080p(=2K)112 点/秒;无独立 480p 档(选了也按 768P 计);单镜 4~15 秒',
|
|
488
|
+
strengths: [
|
|
489
|
+
'约 1/3 成本,还能出 2K',
|
|
490
|
+
'就地编辑保真度高(改色调/改局部时人物服装构图保持得最好),可在 Seedance 剧里单镜借用它做编辑',
|
|
491
|
+
'镜内自行跳切最少(实测 0/5 镜)',
|
|
492
|
+
'原生对白与音效',
|
|
493
|
+
],
|
|
494
|
+
weaknesses: [
|
|
495
|
+
'慢:单镜约 6 分钟',
|
|
496
|
+
'台词念不全的比例高:50%(26 镜),对白密集剧慎用',
|
|
497
|
+
'不支持关键帧组与时间区间编辑',
|
|
498
|
+
'提示词上限 7000 字符,平台会自动剥掉软性描述块,极长的镜头描述会丢细节',
|
|
499
|
+
],
|
|
500
|
+
best_for: '写实真人剧但预算紧、对白不密集;单镜编辑(配合 `edit_video_shot` 的 model 参数)',
|
|
501
|
+
avoid_for: '对白密集、赶交付时间的项目',
|
|
502
|
+
},
|
|
503
|
+
{
|
|
504
|
+
id: 'wan3.0', name: 'WAN 3.0',
|
|
505
|
+
price: '480p 42 / 720p 84 / 1080p 168 点/秒;单镜 2~30 秒(2 秒起计费,无 4 秒地板)',
|
|
506
|
+
strengths: [
|
|
507
|
+
'约 4 折成本,2~3 秒短镜更省',
|
|
508
|
+
'快:单镜约 2 分钟,并发好',
|
|
509
|
+
'文本审核宽松,动作/打斗措辞基本能过',
|
|
510
|
+
'有首尾帧双锚或参考图时,风格化角色的风格、服装、道具都跟得住',
|
|
511
|
+
],
|
|
512
|
+
weaknesses: [
|
|
513
|
+
'输出侧真人脸审核:写实人脸在 720p 及以上一致被拒,重试救不回',
|
|
514
|
+
'会在单个镜头内自行换机位硬切(实测 11/12 镜),叙事镜观感是「画面跳来跳去」,提示词拦不住',
|
|
515
|
+
'只有单张首帧时,强场景描述会把风格化角色拉向写实(漂移)',
|
|
516
|
+
'道具形状锁不住;台词完整度样本不足未测',
|
|
517
|
+
],
|
|
518
|
+
best_for: '动画/3D 卡通/风格化剧、空镜、产品镜、短平快的剪辑节奏',
|
|
519
|
+
avoid_for: '写实真人剧(绝不选);对白多、要单镜稳定叙事的剧',
|
|
520
|
+
},
|
|
521
|
+
{
|
|
522
|
+
id: 'wan3.0-prime', name: 'WAN 3.0 Prime(高速版)',
|
|
523
|
+
price: '480p 63 / 720p 126 / 1080p 252 点/秒(wan3.0 的 1.5 倍)',
|
|
524
|
+
strengths: ['能力同 wan3.0,出片快约一倍(单镜约 1 分钟)'],
|
|
525
|
+
weaknesses: ['同 wan3.0:写实人脸 720p+ 被拒、镜内自剪', '价格是 wan3.0 的 1.5 倍'],
|
|
526
|
+
best_for: '风格化项目赶交付',
|
|
527
|
+
avoid_for: '同 wan3.0;不赶时间就用 wan3.0',
|
|
528
|
+
},
|
|
529
|
+
],
|
|
530
|
+
video_decision: [
|
|
531
|
+
'① 先定「是不是写实真人」:是 → seedance-2.5(默认)或降本 hailuo-3;绝不选 wan3.0 / wan3.0-prime。',
|
|
532
|
+
'② 写实真人 + 对白密集 → seedance-2.5(台词念不全 23% vs hailuo-3 50%)。',
|
|
533
|
+
'③ 风格化/动画/3D/空镜/产品镜 → wan3.0,赶交付用 wan3.0-prime;但讲连贯故事、要单镜稳定的叙事剧仍优先 seedance-2.5(WAN 镜内自剪 11/12)。',
|
|
534
|
+
'④ 想让每一镜的首帧都进组视频(关键帧组)→ 只有 seedance-2.5 支持;其他引擎的场景组只送组首镜首帧。',
|
|
535
|
+
'⑤ 出视频前就把引擎定好:切换不会重做已生成的镜头,同一剧混用引擎会有风格/身份跳变。',
|
|
536
|
+
'⑥ 分辨率:草稿迭代用低档(WAN 剧 480p,其余 720p);交付 seedance-2.5 维持 720p、hailuo-3 用 1080p(=2K)、WAN 用 1080p。',
|
|
537
|
+
'⑦ 单镜保持 3~5 秒:镜头越长模型自由发挥越多,所有引擎通用,WAN 上最明显。生成后可用 `scan_intra_shot_cuts` 查镜内跳切。',
|
|
538
|
+
'⑧ 只想改一镜的色调/局部 → `edit_video_shot` 可以单独选 model=hailuo-3(保真、便宜),不用改剧引擎;但它不支持 start_sec/end_sec 区间。',
|
|
539
|
+
],
|
|
540
|
+
combos: [
|
|
541
|
+
{ scenario: '写实真人短剧(标准配置)', image_model: 'gpt-image-2.5-flare', video_engine: 'seedance-2.5', resolution: '720p', why: '出图一次过率最高 + 视频人脸与指令遵循最强,返工最少' },
|
|
542
|
+
{ scenario: '写实真人短剧 · 预算紧、对白不多', image_model: 'gpt-image-2.5-flare', video_engine: 'hailuo-3', resolution: '草稿 720p / 交付 1080p', why: '视频成本约 1/3;对白多就回到 seedance-2.5' },
|
|
543
|
+
{ scenario: '动画 / 3D 卡通 / 风格化剧', image_model: 'gpt-image-2.5-flare', video_engine: 'wan3.0', resolution: '草稿 480p / 交付 1080p', why: '视频约 4 折且快;记得出尾帧给双锚,风格才锁得住' },
|
|
544
|
+
{ scenario: '广告 / 产品片 / 空镜为主', image_model: 'gpt-image-2.5-flare', video_engine: 'wan3.0', resolution: '480p 试片 / 1080p 交付', why: '无真人脸审核问题,短镜 2 秒起计费最省;赶工换 wan3.0-prime' },
|
|
545
|
+
{ scenario: '画面文字多(招牌、屏幕、文件、字卡)', image_model: 'gpt-image-2.5-sunburst', video_engine: 'seedance-2.5', resolution: '720p', why: '中文字形更准;视频按剧的真人/风格化再按上面选' },
|
|
546
|
+
{ scenario: '打斗、流血场面多的写实剧', image_model: 'gpt-image-2.5-flare', video_engine: 'seedance-2.5', resolution: '720p', why: '图被安全拒的镜平台自动换 Nano Banana 2;视频侧把血腥措辞改成中性描述(Seedance 文本审核严)。不要为了过审换 WAN——写实人脸会被拒' },
|
|
547
|
+
],
|
|
548
|
+
};
|
|
381
549
|
export const HOW_TO_READ = '先按 entry_points 判客户手上的材料该走哪条通道(这是最常被跳过的一步),再按 pipeline 顺序推进、每道 review_gates 必过;' +
|
|
382
550
|
'收费步按 billing.quote_flow 报价确认;遇到质量投诉按 qa_tools 的 symptom 选检测工具先定病因。';
|
|
383
551
|
export function buildGuide() {
|
|
@@ -392,9 +560,10 @@ export function buildGuide() {
|
|
|
392
560
|
billing: BILLING,
|
|
393
561
|
common_requests: COMMON_REQUESTS,
|
|
394
562
|
local_postproduction: LOCAL_POSTPRODUCTION,
|
|
563
|
+
model_guide: MODEL_GUIDE,
|
|
395
564
|
};
|
|
396
565
|
}
|
|
397
|
-
export const GUIDE_SECTIONS = ['entry_points', 'pipeline', 'review_gates', 'qa_tools', 'optional_boosts', 'billing', 'common_requests', 'local_postproduction'];
|
|
566
|
+
export const GUIDE_SECTIONS = ['entry_points', 'pipeline', 'review_gates', 'qa_tools', 'optional_boosts', 'billing', 'common_requests', 'local_postproduction', 'model_guide'];
|
|
398
567
|
const head = (s) => /^[a-z][a-z0-9_]*/.exec(s.trim())?.[0] ?? null;
|
|
399
568
|
const inProse = (s) => [...(s ?? '').matchAll(/`([a-z][a-z0-9_]*)`/g)].map((m) => m[1]);
|
|
400
569
|
/** 引导里引用到的全部工具名(去重)——哨兵测试用:每一个都必须真的注册了。 */
|
|
@@ -437,6 +606,10 @@ export function referencedTools() {
|
|
|
437
606
|
}
|
|
438
607
|
for (const r of [...LOCAL_POSTPRODUCTION.voice_rules, ...LOCAL_POSTPRODUCTION.not_verified_until])
|
|
439
608
|
inProse(r).forEach(add);
|
|
609
|
+
[MODEL_GUIDE.principle, ...MODEL_GUIDE.image_decision, ...MODEL_GUIDE.video_decision].forEach((s) => inProse(s).forEach(add));
|
|
610
|
+
for (const m of [...MODEL_GUIDE.image_models, ...MODEL_GUIDE.video_engines]) {
|
|
611
|
+
[...m.strengths, ...m.weaknesses, m.best_for, m.avoid_for].forEach((s) => inProse(s).forEach(add));
|
|
612
|
+
}
|
|
440
613
|
return [...out].sort();
|
|
441
614
|
}
|
|
442
615
|
/**
|
|
@@ -458,6 +631,7 @@ export function buildInstructions() {
|
|
|
458
631
|
'文本步按 token 后付;402 就停下让客户充值,别重试。',
|
|
459
632
|
'长任务异步:generate_* 立即返回,用 get_pipeline_status / get_storyboards / get_run_status 轮询;图片 pending = 还在生成,别重复调(重复扣费)。',
|
|
460
633
|
'改写成功后只 edit_rewritten_script 点改,别重跑 rewrite_script;角色外观唯一真相源是人物档案(update_character),别写进 visual_lock/art_bible。',
|
|
634
|
+
'选图片模型/视频引擎、客户问「哪个模型好 / 怎么更省」→ get_capabilities_guide(section=model_guide):各模型实测优劣、价格、决策步骤与推荐组合;建剧时就主动讲给客户定。',
|
|
461
635
|
'不确定该用哪个工具、客户问「你们能做什么」→ 先调 get_capabilities_guide(免费、本地、不联网)。',
|
|
462
636
|
].join('\n');
|
|
463
637
|
}
|
package/dist/tools/guide.js
CHANGED
|
@@ -12,7 +12,8 @@ export function registerGuideTools(server) {
|
|
|
12
12
|
'qa_tools(按客户描述的症状选检测工具与修法)、optional_boosts(可选增强及何时做)、billing(报价确认与免费族)、' +
|
|
13
13
|
'common_requests(客户常见原话 → 该做什么)、' +
|
|
14
14
|
'local_postproduction(★客户要把镜头下载到**自己电脑**上剪 / 配乐 / 烧字幕 / 优化转场 / 补旁白时的完整流程:' +
|
|
15
|
-
'阶段顺序、执行位置、逐镜逐句怎么核对声音、什么才算验收完成)
|
|
15
|
+
'阶段顺序、执行位置、逐镜逐句怎么核对声音、什么才算验收完成)、' +
|
|
16
|
+
'model_guide(★图片模型与视频引擎的实测优劣势、价格、选型决策步骤与推荐组合——建剧选型、客户问「哪个模型好 / 为什么手画坏了 / 怎么省钱」时先看)。传 section 只取一段。' +
|
|
16
17
|
'★工具描述回答"这个工具做什么",本工具回答"什么情况下该用哪个"——客户交来的是成品分镜表却被 set_script→rewrite_script 改写成散文,就是没先看这张表。', {
|
|
17
18
|
section: z.enum(GUIDE_SECTIONS).optional().describe('只取某一段;不传返回全部'),
|
|
18
19
|
}, async ({ section }) => {
|
package/dist/tools/produce.js
CHANGED
|
@@ -219,7 +219,7 @@ const PROJECT_SETTINGS_FIELDS = {
|
|
|
219
219
|
image_model: z.string().optional().describe('图片模型(★drama级·整剧统一画风·默认 ChatGPT Image 2.5 Flare)。可选:' +
|
|
220
220
|
'gpt-image-2.5-flare(默认·基础11点+每张参考图18点)/gpt-image-2.5-sunburst(同价·中文字形与细节更准·慢约5秒)/' +
|
|
221
221
|
'gemini-3.1-flash-image(香蕉2·71点)/gemini-3-pro-image(香蕉Pro·精细·175点)/gemini-3.1-flash-lite-image(香蕉2 Lite·31点)/' +
|
|
222
|
-
'doubao-seedream-5-0-260128(Seedream 5.0)。建剧即定、整剧统一;generate_frames
|
|
222
|
+
'doubao-seedream-5-0-260128(Seedream 5.0)。建剧即定、整剧统一;generate_frames 可临时覆盖某次出图。★各模型实测优劣(一次过率/手部结构/安全拒绝率/画风稳定度)与选型步骤见 get_capabilities_guide(section=model_guide)'),
|
|
223
223
|
// drama 级视频引擎(整剧统一,单镜/批量/场景组/重生全走它)
|
|
224
224
|
video_engine: z.enum(VIDEO_ENGINES).optional().describe('视频引擎(★drama级·整剧统一·AI必须按剧选型主动引导:写实真人剧→seedance-2.5 或降本 hailuo-3;风格化/动画/3D卡通/空镜/产品镜→wan3.0(赶交付 wan3.0-prime);写实真人剧绝不选 wan——720p+ 真人脸被厂商审核一致拒):' +
|
|
225
225
|
'seedance-2.5(默认·全能力:帧链/场景组/就地编辑/延长/参考图锚·720p约212点/秒) / ' +
|
|
@@ -739,7 +739,8 @@ export function registerProduceTools(server, client) {
|
|
|
739
739
|
force: z.boolean().optional().describe('true=预检有硬阻断也强制照拼(默认拦截)。缺视频的镜会被静默跳过,成片为部分'),
|
|
740
740
|
}, async ({ episode_id, force }) => jsonResult(await client.producePost(`/episodes/${episode_id}/compose`, force ? { force: true } : {})));
|
|
741
741
|
server.tool('get_final_cut', '查某一集成片状态与下载链接。status=completed 时返回 download_url(我方 COS 直链,可直接下载)。免费。' +
|
|
742
|
-
'★bgm_stale=true 表示配乐在成片之后生成/改动、尚未进成片:重新 compose_episode(免费)即可,别用 re-render。'
|
|
742
|
+
'★bgm_stale=true 表示配乐在成片之后生成/改动、尚未进成片:重新 compose_episode(免费)即可,别用 re-render。' +
|
|
743
|
+
'★若登记过外部交付版本(register_external_delivery),另返回 delivery——那才是客户实际收到的一版;download_url 仍是平台自己拼的成片。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/final-cut`)));
|
|
743
744
|
server.tool('get_export', '查某一集导出/母版状态(成片终拼后的可下载母版)。免费。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/export`)));
|
|
744
745
|
server.tool('review_final_cut', '**成片体检**:导出前把整集过一遍——没出图的镜、字幕一屏放不下、人物没有身份锚、'
|
|
745
746
|
+ '镜头连续性(跳轴)、以及一次错别字通读。'
|
|
@@ -1039,6 +1040,25 @@ export function registerProduceTools(server, client) {
|
|
|
1039
1040
|
const image_url = await client.uploadLocalFile(file_path, 'image');
|
|
1040
1041
|
return jsonResult(await client.producePost(`/storyboards/${storyboard_id}/frame`, { image_url, frame_type: frame_type ?? 'first_frame' }));
|
|
1041
1042
|
});
|
|
1043
|
+
server.tool('register_external_delivery', '★后期在平台外完成(本地换旁白/裁剪/加片尾/配乐)后,把**最终交给客户的那一版成片**登记回平台。免费。' +
|
|
1044
|
+
'不登记的话,平台里的成片记录并不代表客户实际收到的版本,事后无法追溯「交付的是哪一版、每镜用的哪次生成」。' +
|
|
1045
|
+
'平台会自己下载复核 sha256/大小/时长(不采信你报的值),并自动快照每镜此刻的来源素材(当前视频、采用的生成 id 及其哈希、裁剪窗口)' +
|
|
1046
|
+
'和最近一次平台成片;你可在 manifest 里附上外部后期做了什么(例如 {audio:{narration:"本地替换",music:"..."}, trims:[...], ending:"..."})。' +
|
|
1047
|
+
'新登记即为当前交付版,版本号每集递增;不改平台成片(get_final_cut 的 download_url 不变,另返回 delivery)。' +
|
|
1048
|
+
'传 file_path(本地视频,≤300MB,自动上传)或已用 upload-url(kind=footage)上传得到的 file_url,二选一。', {
|
|
1049
|
+
episode_id: z.number().int().positive(),
|
|
1050
|
+
file_path: z.string().optional().describe('本地成片路径(mp4/mov/webm/m4v,≤300MB)'),
|
|
1051
|
+
file_url: z.string().optional().describe('已上传到本平台的 public_url(与 file_path 二选一)'),
|
|
1052
|
+
note: z.string().max(500).optional(),
|
|
1053
|
+
manifest: z.record(z.unknown()).optional().describe('外部后期做了什么(≤64KB),原样存进交付清单的 client 段'),
|
|
1054
|
+
}, async ({ episode_id, file_path, file_url, note, manifest }) => {
|
|
1055
|
+
const url = file_path ? await client.uploadLocalFile(file_path, 'footage') : file_url;
|
|
1056
|
+
if (!url)
|
|
1057
|
+
throw new Error('file_path 与 file_url 必须给一个');
|
|
1058
|
+
return jsonResult(await client.producePost(`/episodes/${episode_id}/deliveries`, { file_url: url, note, manifest }));
|
|
1059
|
+
});
|
|
1060
|
+
server.tool('list_deliveries', '列本集已登记的外部交付版本(新→旧),每条含 sha256、时长、is_current 与完整交付清单(每镜来源 + 外部后期说明)。免费。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/deliveries`)));
|
|
1061
|
+
server.tool('set_current_delivery', '把本集的某个已登记交付版本设为当前(例如客户最终选了较早的一版)。免费。只影响 get_final_cut 的 delivery,不改平台成片。', { episode_id: z.number().int().positive(), delivery_id: z.number().int().positive() }, async ({ episode_id, delivery_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/deliveries/${delivery_id}/current`)));
|
|
1042
1062
|
server.tool('upload_shot_footage', '用**客户自有的整段视频**(录屏 / 产品实拍 / 第三方成片)直接当某镜的视频——实拍素材镜。' +
|
|
1043
1063
|
'登记后该镜不再 AI 出图/出视频(generate_videos 会跳过它,单镜重生会被拒),终拼原样使用,镜头时长按素材真实长度回写,' +
|
|
1044
1064
|
'首/尾帧从素材抽帧供帧链与预览用。免费。适用:宣传片里的到账界面录屏、后台大屏实录、产品实拍、客户已有的成片片段。' +
|
|
@@ -1132,6 +1152,13 @@ export function registerProduceTools(server, client) {
|
|
|
1132
1152
|
+ '实测 WAN 11/12 镜有镜内跳切、Seedance 1/6、H3 0/5,且提示词层拦不住(负向约束已在其中)——'
|
|
1133
1153
|
+ '要根治只能 regenerate_shot_video 这些镜并换 seedance-2.5 或 hailuo-3。'
|
|
1134
1154
|
+ '组模式镜与显式快剪蒙太奇镜天然多机位,已自动排除(detail 里标 skipped)。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/intra-shot-cuts`)));
|
|
1155
|
+
server.tool('scan_burned_subtitles', '★原声剧(视频自带人声)终拼前建议跑一次;客户报「成片里有两层字幕 / 画面里多出一行字」时先跑这个。'
|
|
1156
|
+
+ '视频厂商有时会无视「不要字幕」的约束,把台词烧进画面——字小、通常只在说出那句台词的一两秒内出现,'
|
|
1157
|
+
+ '而平台成片还会再叠一层字幕,于是变成双字幕。重新拼接去不掉它,只能 regenerate_shot_video 重出该镜。'
|
|
1158
|
+
+ '每镜抽 12 帧、一次视觉审计,**按用量计费**(每镜一次小额 vision 调用)。'
|
|
1159
|
+
+ '返回 flagged[{shot, texts, matches_dialogue, frames}] / clean / errors。'
|
|
1160
|
+
+ 'matches_dialogue=true 表示读出来的字就是本镜台词,基本可确认是厂商字幕;招牌、书页、屏幕等画面里本来就有的字不算。'
|
|
1161
|
+
+ 'dry_run=true 只报告不写回;否则结果写回,compose_episode 的终拼预检会以 vendor_burned_text 列出这些镜。', { episode_id: z.number().int().positive(), dry_run: z.boolean().optional() }, async ({ episode_id, dry_run }) => jsonResult(await client.producePost(`/episodes/${episode_id}/video-text-scan`, { dry_run: dry_run === true })));
|
|
1135
1162
|
server.tool('scan_dialogue_coverage', '★客户报「话没说完就切 / 台词只念了一半」时先跑这个。默认**免费零扣费**(只读已落库的转录审计结果)。'
|
|
1136
1163
|
+ '把该集每个原声镜的视频音轨与台词做词级比对,按族给出结论:'
|
|
1137
1164
|
+ 'truncated(念到一半就停) / off_script(念的大半不是台词:自说自话、重复上一镜、只有环境音) / '
|
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.89",
|
|
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.89 tool surface (operationIds match MCP tool names 1:1)."
|
|
7
7
|
},
|
|
8
8
|
"servers": [
|
|
9
9
|
{
|
|
@@ -3248,6 +3248,109 @@
|
|
|
3248
3248
|
}
|
|
3249
3249
|
}
|
|
3250
3250
|
},
|
|
3251
|
+
"/episodes/{episode_id}/deliveries": {
|
|
3252
|
+
"get": {
|
|
3253
|
+
"operationId": "list_deliveries",
|
|
3254
|
+
"summary": "列本集已登记的外部交付版本(新→旧),每条含 sha256、时长、is_current 与完整交付清单(每镜来源 + 外部后期说明)",
|
|
3255
|
+
"description": "列本集已登记的外部交付版本(新→旧),每条含 sha256、时长、is_current 与完整交付清单(每镜来源 + 外部后期说明)。免费。",
|
|
3256
|
+
"tags": [
|
|
3257
|
+
"episodes"
|
|
3258
|
+
],
|
|
3259
|
+
"parameters": [
|
|
3260
|
+
{
|
|
3261
|
+
"name": "episode_id",
|
|
3262
|
+
"in": "path",
|
|
3263
|
+
"required": true,
|
|
3264
|
+
"schema": {
|
|
3265
|
+
"type": "integer",
|
|
3266
|
+
"exclusiveMinimum": 0
|
|
3267
|
+
}
|
|
3268
|
+
}
|
|
3269
|
+
],
|
|
3270
|
+
"responses": {
|
|
3271
|
+
"200": {
|
|
3272
|
+
"description": "StarReel envelope",
|
|
3273
|
+
"content": {
|
|
3274
|
+
"application/json": {
|
|
3275
|
+
"schema": {
|
|
3276
|
+
"type": "object",
|
|
3277
|
+
"properties": {
|
|
3278
|
+
"code": {
|
|
3279
|
+
"type": "integer"
|
|
3280
|
+
},
|
|
3281
|
+
"message": {
|
|
3282
|
+
"type": "string"
|
|
3283
|
+
},
|
|
3284
|
+
"data": {
|
|
3285
|
+
"description": "Operation result payload"
|
|
3286
|
+
}
|
|
3287
|
+
}
|
|
3288
|
+
}
|
|
3289
|
+
}
|
|
3290
|
+
}
|
|
3291
|
+
},
|
|
3292
|
+
"402": {
|
|
3293
|
+
"description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
|
|
3294
|
+
}
|
|
3295
|
+
}
|
|
3296
|
+
}
|
|
3297
|
+
},
|
|
3298
|
+
"/episodes/{episode_id}/deliveries/{delivery_id}/current": {
|
|
3299
|
+
"post": {
|
|
3300
|
+
"operationId": "set_current_delivery",
|
|
3301
|
+
"summary": "把本集的某个已登记交付版本设为当前(例如客户最终选了较早的一版)",
|
|
3302
|
+
"description": "把本集的某个已登记交付版本设为当前(例如客户最终选了较早的一版)。免费。只影响 get_final_cut 的 delivery,不改平台成片。",
|
|
3303
|
+
"tags": [
|
|
3304
|
+
"episodes"
|
|
3305
|
+
],
|
|
3306
|
+
"parameters": [
|
|
3307
|
+
{
|
|
3308
|
+
"name": "episode_id",
|
|
3309
|
+
"in": "path",
|
|
3310
|
+
"required": true,
|
|
3311
|
+
"schema": {
|
|
3312
|
+
"type": "integer",
|
|
3313
|
+
"exclusiveMinimum": 0
|
|
3314
|
+
}
|
|
3315
|
+
},
|
|
3316
|
+
{
|
|
3317
|
+
"name": "delivery_id",
|
|
3318
|
+
"in": "path",
|
|
3319
|
+
"required": true,
|
|
3320
|
+
"schema": {
|
|
3321
|
+
"type": "integer",
|
|
3322
|
+
"exclusiveMinimum": 0
|
|
3323
|
+
}
|
|
3324
|
+
}
|
|
3325
|
+
],
|
|
3326
|
+
"responses": {
|
|
3327
|
+
"200": {
|
|
3328
|
+
"description": "StarReel envelope",
|
|
3329
|
+
"content": {
|
|
3330
|
+
"application/json": {
|
|
3331
|
+
"schema": {
|
|
3332
|
+
"type": "object",
|
|
3333
|
+
"properties": {
|
|
3334
|
+
"code": {
|
|
3335
|
+
"type": "integer"
|
|
3336
|
+
},
|
|
3337
|
+
"message": {
|
|
3338
|
+
"type": "string"
|
|
3339
|
+
},
|
|
3340
|
+
"data": {
|
|
3341
|
+
"description": "Operation result payload"
|
|
3342
|
+
}
|
|
3343
|
+
}
|
|
3344
|
+
}
|
|
3345
|
+
}
|
|
3346
|
+
}
|
|
3347
|
+
},
|
|
3348
|
+
"402": {
|
|
3349
|
+
"description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
|
|
3350
|
+
}
|
|
3351
|
+
}
|
|
3352
|
+
}
|
|
3353
|
+
},
|
|
3251
3354
|
"/episodes/{episode_id}/derive-pose-chain": {
|
|
3252
3355
|
"post": {
|
|
3253
3356
|
"operationId": "derive_pose_chain",
|
|
@@ -4138,7 +4241,7 @@
|
|
|
4138
4241
|
"get": {
|
|
4139
4242
|
"operationId": "get_final_cut",
|
|
4140
4243
|
"summary": "查某一集成片状态与下载链接",
|
|
4141
|
-
"description": "查某一集成片状态与下载链接。status=completed 时返回 download_url(我方 COS 直链,可直接下载)。免费。★bgm_stale=true 表示配乐在成片之后生成/改动、尚未进成片:重新 compose_episode(免费)即可,别用 re-render
|
|
4244
|
+
"description": "查某一集成片状态与下载链接。status=completed 时返回 download_url(我方 COS 直链,可直接下载)。免费。★bgm_stale=true 表示配乐在成片之后生成/改动、尚未进成片:重新 compose_episode(免费)即可,别用 re-render。★若登记过外部交付版本(register_external_delivery),另返回 delivery——那才是客户实际收到的一版;download_url 仍是平台自己拼的成片。",
|
|
4142
4245
|
"tags": [
|
|
4143
4246
|
"episodes"
|
|
4144
4247
|
],
|
|
@@ -6642,6 +6745,68 @@
|
|
|
6642
6745
|
}
|
|
6643
6746
|
}
|
|
6644
6747
|
},
|
|
6748
|
+
"/episodes/{episode_id}/video-text-scan": {
|
|
6749
|
+
"post": {
|
|
6750
|
+
"operationId": "scan_burned_subtitles",
|
|
6751
|
+
"summary": "★原声剧(视频自带人声)终拼前建议跑一次;客户报「成片里有两层字幕 / 画面里多出一行字」时先跑这个",
|
|
6752
|
+
"description": "★原声剧(视频自带人声)终拼前建议跑一次;客户报「成片里有两层字幕 / 画面里多出一行字」时先跑这个。视频厂商有时会无视「不要字幕」的约束,把台词烧进画面——字小、通常只在说出那句台词的一两秒内出现,而平台成片还会再叠一层字幕,于是变成双字幕。重新拼接去不掉它,只能 regenerate_shot_video 重出该镜。每镜抽 12 帧、一次视觉审计,**按用量计费**(每镜一次小额 vision 调用)。返回 flagged[{shot, texts, matches_dialogue, frames}] / clean / errors。matches_dialogue=true 表示读出来的字就是本镜台词,基本可确认是厂商字幕;招牌、书页、屏幕等画面里本来就有的字不算。dry_run=true 只报告不写回;否则结果写回,compose_episode 的终拼预检会以 vendor_burned_text 列出这些镜。",
|
|
6753
|
+
"tags": [
|
|
6754
|
+
"episodes"
|
|
6755
|
+
],
|
|
6756
|
+
"parameters": [
|
|
6757
|
+
{
|
|
6758
|
+
"name": "episode_id",
|
|
6759
|
+
"in": "path",
|
|
6760
|
+
"required": true,
|
|
6761
|
+
"schema": {
|
|
6762
|
+
"type": "integer",
|
|
6763
|
+
"exclusiveMinimum": 0
|
|
6764
|
+
}
|
|
6765
|
+
}
|
|
6766
|
+
],
|
|
6767
|
+
"requestBody": {
|
|
6768
|
+
"required": false,
|
|
6769
|
+
"content": {
|
|
6770
|
+
"application/json": {
|
|
6771
|
+
"schema": {
|
|
6772
|
+
"type": "object",
|
|
6773
|
+
"properties": {
|
|
6774
|
+
"dry_run": {
|
|
6775
|
+
"type": "boolean"
|
|
6776
|
+
}
|
|
6777
|
+
}
|
|
6778
|
+
}
|
|
6779
|
+
}
|
|
6780
|
+
}
|
|
6781
|
+
},
|
|
6782
|
+
"responses": {
|
|
6783
|
+
"200": {
|
|
6784
|
+
"description": "StarReel envelope",
|
|
6785
|
+
"content": {
|
|
6786
|
+
"application/json": {
|
|
6787
|
+
"schema": {
|
|
6788
|
+
"type": "object",
|
|
6789
|
+
"properties": {
|
|
6790
|
+
"code": {
|
|
6791
|
+
"type": "integer"
|
|
6792
|
+
},
|
|
6793
|
+
"message": {
|
|
6794
|
+
"type": "string"
|
|
6795
|
+
},
|
|
6796
|
+
"data": {
|
|
6797
|
+
"description": "Operation result payload"
|
|
6798
|
+
}
|
|
6799
|
+
}
|
|
6800
|
+
}
|
|
6801
|
+
}
|
|
6802
|
+
}
|
|
6803
|
+
},
|
|
6804
|
+
"402": {
|
|
6805
|
+
"description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
|
|
6806
|
+
}
|
|
6807
|
+
}
|
|
6808
|
+
}
|
|
6809
|
+
},
|
|
6645
6810
|
"/episodes/{episode_id}/videos/generate": {
|
|
6646
6811
|
"post": {
|
|
6647
6812
|
"operationId": "generate_videos",
|
|
@@ -10104,6 +10269,10 @@
|
|
|
10104
10269
|
"tool": "upload_shot_frame",
|
|
10105
10270
|
"reason": "unmappable: local file upload flow"
|
|
10106
10271
|
},
|
|
10272
|
+
{
|
|
10273
|
+
"tool": "register_external_delivery",
|
|
10274
|
+
"reason": "unmappable: local file upload flow"
|
|
10275
|
+
},
|
|
10107
10276
|
{
|
|
10108
10277
|
"tool": "upload_shot_footage",
|
|
10109
10278
|
"reason": "unmappable: local file upload flow"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starreel/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.89",
|
|
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.89",
|
|
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.89",
|
|
12
12
|
"transport": {
|
|
13
13
|
"type": "stdio"
|
|
14
14
|
},
|