@starreel/mcp 0.1.64 → 0.1.66
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 +22 -1
- package/dist/tools/produce.js +108 -7
- package/openapi.json +431 -9
- package/package.json +1 -1
- package/server.json +2 -2
package/SKILL.md
CHANGED
|
@@ -91,6 +91,18 @@ Don't ask the user at every step. Sort work into three tiers:
|
|
|
91
91
|
`video_style_prompt`) are all free and the foundation that steers every later
|
|
92
92
|
generation. Set them up front via `create_drama` / `update_project_settings`
|
|
93
93
|
— don't build an empty shell, or all downstream generation drifts.
|
|
94
|
+
**Set the structured era contract for anything non-contemporary.**
|
|
95
|
+
`setting_brief` is free text: it supplies background but cannot hold the
|
|
96
|
+
frame. The one mechanism that outranks the visual lock is the structured
|
|
97
|
+
contract — `set_era_contract` per episode (`get_era_contract` reads it back),
|
|
98
|
+
one of `modern` / `republican` / `historical` / `fantasy`. Leave it empty and
|
|
99
|
+
the platform can only fight drift with prose in the prompt body; contemporary
|
|
100
|
+
objects bleeding into period frames almost always traces back to an empty
|
|
101
|
+
contract. **Xianxia / mythic-otherworld projects must use `fantasy`, not
|
|
102
|
+
`historical`** — the latter demands period-accurate realism and will judge
|
|
103
|
+
glowing energy, floating landforms and non-human forms as "wrong era",
|
|
104
|
+
dragging the look toward literal historical drama. A single scene can break
|
|
105
|
+
away via `update_scene`'s `era_contract` (scene level outranks episode level).
|
|
94
106
|
**Never pin a specific character's wardrobe / hair / look inside
|
|
95
107
|
`visual_lock` or `art_bible`** — those hold scene-level and world-level locks
|
|
96
108
|
only. The **single source of truth** for a character's appearance is the
|
|
@@ -276,7 +288,16 @@ content that will be rejected.
|
|
|
276
288
|
|
|
277
289
|
**Soft checkpoints** (not enforced, also free, still expected): `run_precheck`
|
|
278
290
|
before any image or video generation (it catches shots the vendor will
|
|
279
|
-
reject — pure wasted spend otherwise)
|
|
291
|
+
reject — pure wasted spend otherwise). **When it flags contradictory
|
|
292
|
+
instructions, don't patch them blind with `update_shot`.** Call
|
|
293
|
+
`plan_precheck_fix` to have the platform work out what to change, walk the
|
|
294
|
+
proposals through with the user shot by shot, and apply the ones they accept
|
|
295
|
+
with `apply_precheck_fix`. That path keeps the optimistic lock and the
|
|
296
|
+
pre-write re-checks; editing by hand skips both. The platform deliberately
|
|
297
|
+
offers no one-click auto-fix — these heuristics carry false positives, and a
|
|
298
|
+
silent rewrite would damage shots that were already correct. Categories the
|
|
299
|
+
platform will *not* touch come back under `blocked`; those are the ones that
|
|
300
|
+
genuinely need a human. `get_health_report` after
|
|
280
301
|
storyboards; `get_characters` after portraits to confirm every on-screen
|
|
281
302
|
character has an image and a sheet; `get_storyboards` after frames and after
|
|
282
303
|
videos to read `frame_status` / `video_status` / `fail_reason` / `fail_hint`
|
package/dist/tools/produce.js
CHANGED
|
@@ -63,13 +63,21 @@ const WORKFLOW_HINT = '★三档执行策略(别把三档混着问客户):' +
|
|
|
63
63
|
'★visual_lock/art_bible 只写画面级/世界级锁(镜头语言·环境·美术基调·禁入元素),**绝不为具体角色钉服装/发型/外观细节**——' +
|
|
64
64
|
'角色外观的唯一真相源是 extract_assets 产出的人物档案(要改走 update_character);两处都写必然互相矛盾,' +
|
|
65
65
|
'定妆图跟档案、设定图跟视觉锁,一致性闸按定妆图拒收 → 设定图/镜头帧**结构性连拒**,重掷多少次都过不了、纯白花钱。' +
|
|
66
|
+
'★★【时代契约·免费·非现代题材出图前必设】setting_brief 里的世界观是**自由文本**,只能提供背景、压不住画面;' +
|
|
67
|
+
'真正能压过视觉锁的是**结构化时代契约**:用 set_era_contract 设本集档位' +
|
|
68
|
+
'(modern/republican/historical/fantasy),get_era_contract 读现值。**不设就是空着**——' +
|
|
69
|
+
'平台只能靠提示词正文堆字对抗,现代物件混进古代画面、场景图画成别的时代,基本都由这里空着导致。' +
|
|
70
|
+
'★仙侠/奇幻/仙境类**必须填 fantasy,别填 historical**:后者要求考据写实,会把发光灵气、悬浮地貌、' +
|
|
71
|
+
'非人化形一并判成「不合时代」,把画面往写实古代拽。某一场要破例(如奇幻世界里一场现代回忆)' +
|
|
72
|
+
'用 update_scene 的 era_contract 单独覆写,场级压过集级。' +
|
|
66
73
|
'★★【逐环节审查协议·全部免费·这是防废片的主线,不是可选项】每个环节产出后先审查、把结论原样告诉客户,再进下一步。' +
|
|
67
74
|
'**三道硬闸(不过会被 400 拒)**:①改写稿产出后 → review_script(在 extract_assets / generate_storyboards 之前);' +
|
|
68
75
|
'②分镜产出后 → review_storyboards(在 generate_frames 之前);③镜头图片产出后 → review_frames(在 generate_videos 之前)。' +
|
|
69
76
|
'每次审查返回 review_token,把它随下游收费工具一起传;findings 逐条讲给客户(code=问题类型·shots=命中镜号·action=该调哪个工具修),' +
|
|
70
77
|
'按 action 修完后**复审**再走。审查后又改了内容 → token 自动失效,复审一次即可(免费)。' +
|
|
71
78
|
'有 error 时默认拦截,只有客户明确知情并坚持才带 acknowledge_review:true——别替客户做这个决定。' +
|
|
72
|
-
'**软引导(不阻断但强烈建议,同样免费)**:出图/出视频前跑 run_precheck(揪出必被厂商拒的镜,防白花钱)
|
|
79
|
+
'**软引导(不阻断但强烈建议,同样免费)**:出图/出视频前跑 run_precheck(揪出必被厂商拒的镜,防白花钱)——' +
|
|
80
|
+
'★揪出来之后别自己盲改:plan_precheck_fix 让平台算出提案 → 逐条讲给客户 → 客户点头后 apply_precheck_fix 落库;' +
|
|
73
81
|
'分镜后跑 get_health_report;定妆图出完用 get_characters 核对每个出场角色都有 image/sheet;' +
|
|
74
82
|
'出帧后用 get_storyboards 看 frame_status 与 fail_reason/fail_hint(failed 的镜先修再往下,别带着废帧出视频);' +
|
|
75
83
|
'出视频后同样看 video_status;成片前用 get_pipeline_status 确认没有缺镜。' +
|
|
@@ -485,7 +493,40 @@ export function registerProduceTools(server, client) {
|
|
|
485
493
|
'④**指令自相矛盾(kind=prompt-conflict)**——同一镜里互斥的要求(如宽景别却标了特写主体、' +
|
|
486
494
|
'既要站立又要坐姿),这类镜**任何正确的图都满足不了**,不改就会反复被拒并反复扣费,' +
|
|
487
495
|
'出现时应先按提示改分镜再出图,而不是重试。\n' +
|
|
496
|
+
'★**怎么改不用你猜**:调 plan_precheck_fix 让平台算出提案(哪一镜、把什么改成什么),' +
|
|
497
|
+
'讲给客户、客户点头后用 apply_precheck_fix 落库——比你自己用 update_shot 盲改稳,' +
|
|
498
|
+
'那条路绕开了乐观锁与落库前复核。部分类别系统不替你改(提案里的 blocked),那些才需要人工调。\n' +
|
|
488
499
|
'⚠️ 它**不**检查首帧是否处在"动作发生前"(平台暂无该契约字段),也不替代 get_health_report。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/precheck`)));
|
|
500
|
+
server.tool('plan_precheck_fix', '让平台**算出**该怎么改 run_precheck 揪出的「指令自相矛盾」类问题(第①步,只算不改)。'
|
|
501
|
+
+ '按文本用量计费(很小),不走报价确认。\n'
|
|
502
|
+
+ '★两段式,这一步不动任何数据:拿到提案后**逐条讲给客户**(哪一镜、把什么改成什么、为什么),'
|
|
503
|
+
+ '客户点头后再把采纳的那几条**原样**传给 apply_precheck_fix 落库。\n'
|
|
504
|
+
+ '★**不要替客户决定**:这些判据有假阳,平台刻意不做「一键自动修」——'
|
|
505
|
+
+ '曾实测同一批提案里近半是判据误报,静默改会把本来正确的分镜改坏。\n'
|
|
506
|
+
+ '★返回的 blocked 列出「系统不替你改」的类别:那些要人工按 run_precheck 的提示调整分镜。'
|
|
507
|
+
+ '看到 blocked 不等于没问题,反而是**必须人工处理**的那部分。\n'
|
|
508
|
+
+ '不传 shot_id 就算整集;只想修某一镜就传它。', {
|
|
509
|
+
episode_id: z.number().int().positive(),
|
|
510
|
+
shot_id: z.number().int().positive().optional()
|
|
511
|
+
.describe('只算这一镜的提案;不传则整集。注意首帧类判据始终要看上一镜,所以上下文仍取整集'),
|
|
512
|
+
}, async ({ episode_id, shot_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/precheck-fix/plan`, shot_id ? { shot_id } : {})));
|
|
513
|
+
server.tool('apply_precheck_fix', '把客户**确认过**的提案落库(第②步)。免费(纯文本写库)。'
|
|
514
|
+
+ '入参就是 plan_precheck_fix 回的提案对象,**原样传回**即可——只传客户勾选采纳的那几条。\n'
|
|
515
|
+
+ '★落库前平台还会再过三道闸:乐观锁(库里的值变了就跳过,绝不覆盖别人的改动)、'
|
|
516
|
+
+ '准入复判、自净闸(改完判据没转绿也跳过)。所以部分条目进 skipped 是正常的,不是失败。\n'
|
|
517
|
+
+ '★返回的 remaining = 本集**还剩几条**预检问题,不是「改了几个字段」。'
|
|
518
|
+
+ '改完重跑 run_precheck 确认,再往下出图。', {
|
|
519
|
+
episode_id: z.number().int().positive(),
|
|
520
|
+
proposals: z.array(z.object({
|
|
521
|
+
shot_id: z.number().int().positive(),
|
|
522
|
+
task: z.string().optional(),
|
|
523
|
+
changes: z.array(z.object({
|
|
524
|
+
field: z.string(),
|
|
525
|
+
old_value: z.string().nullable().optional().describe('★必须是 plan 给的原值:落库时做乐观锁,库里已经不是它了就跳过'),
|
|
526
|
+
new_value: z.string().nullable().optional(),
|
|
527
|
+
})),
|
|
528
|
+
})).describe('plan_precheck_fix 回的提案,原样传回;只放客户点头采纳的那几条'),
|
|
529
|
+
}, async ({ episode_id, proposals }) => jsonResult(await client.producePost(`/episodes/${episode_id}/precheck-fix/apply`, { proposals })));
|
|
489
530
|
server.tool('get_health_report', '(★推荐·免费诊断)读分镜出体检报告:时长超标/母题覆盖不足/问题镜。纯读、免费。出图前查,识别问题先改再出、别出了片才发现。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/health-report`)));
|
|
490
531
|
// ---------- 分阶段审查(三道硬闸的凭据来源;全部免费) ----------
|
|
491
532
|
// 每层审查返回 { pass, error_count, warning_count, findings[], review_token }。
|
|
@@ -801,7 +842,7 @@ export function registerProduceTools(server, client) {
|
|
|
801
842
|
atmosphere: z.string().optional().describe('氛围'),
|
|
802
843
|
director_note: z.string().optional().describe('导演注释'),
|
|
803
844
|
shot_intent: z.string().optional().describe('这镜为什么存在(叙事意图)'),
|
|
804
|
-
image_prompt: z.string().optional().describe('首帧画面提示词**正文**(全量覆盖本镜现值)。★先 get_shot_prompts 读现值再改;★原样保留其中的 @char:N / @scene:M
|
|
845
|
+
image_prompt: z.string().optional().describe('首帧画面提示词**正文**(全量覆盖本镜现值)。★先 get_shot_prompts 读现值再改;★原样保留其中的 @char:N / @scene:M 引用标记,删了就不注入对应定妆图/场景图。出图时平台会在正文之上再拼身份锚与一致性约束,不必你写。★写法坑:别写「no X / without X / 不要 X / 没有 X」这类否定式约束——图像模型把名词当正向线索,反而把 X 画出来;要正向写出那块画面该有什么(材质/形状/颜色/远近)。保存响应带 image_prompt_negation_advisory 即命中,按其 note 改写'),
|
|
805
846
|
video_prompt: z.string().optional().describe('视频(动态/运镜/表演)提示词**正文**(全量覆盖本镜现值)。★同 image_prompt:先读现值、保留 @char/@scene 标记'),
|
|
806
847
|
}, async ({ storyboard_id, ...fields }) => {
|
|
807
848
|
const payload = Object.fromEntries(Object.entries(fields).filter(([, v]) => v !== undefined));
|
|
@@ -857,17 +898,46 @@ export function registerProduceTools(server, client) {
|
|
|
857
898
|
'哪些是写了也不会生效的硬限制(纯器乐/时长/不做音效/不复刻具体曲目)、常见写坏的方式。' +
|
|
858
899
|
'免费,纯静态,与具体剧目无关——写 generate_bgm 的 prompt 之前先读它,别自己猜。' +
|
|
859
900
|
'也适合直接把要点转述给客户看。', {}, async () => jsonResult(await client.produceGet('/bgm-prompt-guide')));
|
|
860
|
-
server.tool('set_shot_name_card', '
|
|
861
|
-
'name
|
|
901
|
+
server.tool('set_shot_name_card', '给某一镜加/改/清「版式字卡」(终拼时烧进成片,含预览一致的书法字体与朱红印章)。' +
|
|
902
|
+
'name 传空字符串=清除本镜字卡。免费(纯数据,填了就显示)。' +
|
|
903
|
+
'两种用法:①不填 orient/placement/font_size = 角色名卡(画面侧边单列竖排人物名,适合群像出场镜);' +
|
|
904
|
+
'②填了其中任意一个 = 通用版式字卡,name 可以是**整句台词或旁白**(按标点自动切列、按最高列拟合字号)。' +
|
|
905
|
+
'placement="auto" 会按背景亮度与粗糙度自动挑位置(躲开人脸/亮部);orient="auto" 在背景太花时自动回退横排。' +
|
|
862
906
|
'★别自己下载视频叠字再上传——那会绕开渲染机字体与印章素材,预览/成片不一致。', {
|
|
863
907
|
storyboard_id: z.number().int().positive(),
|
|
864
|
-
name: z.string().describe('
|
|
908
|
+
name: z.string().describe('字卡正文(人物名,或版式模式下的任意文案/整句台词);空字符串=清除字卡'),
|
|
865
909
|
seal: z.string().optional().describe('印章文字(默认取名字末字)'),
|
|
866
|
-
side: z.enum(['left', 'right']).optional().describe('名卡在画面哪一侧,默认 right'),
|
|
910
|
+
side: z.enum(['left', 'right']).optional().describe('名卡在画面哪一侧,默认 right;placement="auto" 时仅作兜底'),
|
|
867
911
|
duration_ms: z.number().int().positive().optional().describe('显示时长毫秒,默认 3000'),
|
|
868
|
-
|
|
912
|
+
orient: z.enum(['vertical', 'horizontal', 'auto']).optional()
|
|
913
|
+
.describe('排版方向。不填=单列竖排(旧行为);auto=背景太花时自动回退横排'),
|
|
914
|
+
placement: z.enum(['fixed', 'auto']).optional()
|
|
915
|
+
.describe('选位方式。不填=贴 side 那一边的固定位;auto=按背景亮度/粗糙度滑窗选位,躲开人和亮部'),
|
|
916
|
+
font_size: z.number().int().positive().optional()
|
|
917
|
+
.describe('字号上限(默认 72);实际字号按最高列拟合,不会超过它'),
|
|
918
|
+
}, async ({ storyboard_id, name, seal, side, duration_ms, orient, placement, font_size }) => jsonResult(await client.producePut(`/storyboards/${storyboard_id}/name-card`, {
|
|
869
919
|
name, ...(seal !== undefined ? { seal } : {}), ...(side !== undefined ? { side } : {}),
|
|
870
920
|
...(duration_ms !== undefined ? { duration_ms } : {}),
|
|
921
|
+
...(orient !== undefined ? { orient } : {}),
|
|
922
|
+
...(placement !== undefined ? { placement } : {}),
|
|
923
|
+
...(font_size !== undefined ? { font_size } : {}),
|
|
924
|
+
})));
|
|
925
|
+
server.tool('extract_segment_to_library', '把某一镜(或某集成片)的某个时间区间抽出来,存成可复用的素材,进我的素材库。免费(纯剪切,不走厂商)。' +
|
|
926
|
+
'典型用法:闪回/回忆蒙太奇——画面全用已有镜头,边际成本为 0。' +
|
|
927
|
+
'区间是相对**该来源视频**的秒数;末端超出片长会自动夹回来并在 span 里回显实际区间。' +
|
|
928
|
+
'同源同区间重复调用会命中内容哈希、复用已有素材(reused=true),不会在库里堆重复行。' +
|
|
929
|
+
'★别自己下载视频再用本地 ffmpeg 切——厂商产物的 GOP 长达 10s,按关键帧切必然偏,' +
|
|
930
|
+
'这里走的是平台已经趟平的精确切点。', {
|
|
931
|
+
source_kind: z.enum(['storyboard', 'episode']).describe('从某一镜抽,还是从某集成片抽'),
|
|
932
|
+
source_id: z.number().int().positive().describe('storyboard_id 或 episode_id,与 source_kind 对应'),
|
|
933
|
+
start_sec: z.number().nonnegative().describe('区间起点(秒,相对该来源视频)'),
|
|
934
|
+
end_sec: z.number().positive().describe('区间终点(秒);超出片长会被夹回来'),
|
|
935
|
+
name: z.string().optional().describe('素材名;不填自动生成(剧名·来源·区间)'),
|
|
936
|
+
tags: z.string().optional().describe('逗号分隔的标签,会与自动标签合并'),
|
|
937
|
+
}, async ({ source_kind, source_id, start_sec, end_sec, name, tags }) => jsonResult(await client.producePost(`/${source_kind === 'episode' ? 'episodes' : 'storyboards'}/${source_id}/extract-segment`, {
|
|
938
|
+
start_sec, end_sec,
|
|
939
|
+
...(name !== undefined ? { name } : {}),
|
|
940
|
+
...(tags !== undefined ? { tags } : {}),
|
|
871
941
|
})));
|
|
872
942
|
server.tool('get_bgm_status', '查某集 AI 配乐生成状态:running(是否在生成)+已入库的配乐轨列表(track/覆盖镜段/淡入淡出)+cue 数。免费。' +
|
|
873
943
|
'配乐 done 后需重新 compose_episode 才进成片。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/bgm-status`)));
|
|
@@ -926,7 +996,38 @@ export function registerProduceTools(server, client) {
|
|
|
926
996
|
mood: z.string().optional(),
|
|
927
997
|
image_prompt: z.string().optional()
|
|
928
998
|
.describe('这一场**空景图**的提示词正文(全量覆盖本场现值)。★先 get_scene_prompt 读现值再改;★写空景——这张是场景基板,画面里不该有人物(人物由镜头帧那层注入)。出图时平台会在正文之上再拼画风块、空景约束与时代锁,不必你写'),
|
|
999
|
+
era_contract: z.object({
|
|
1000
|
+
era: z.string().describe('modern / republican / historical / fantasy(也收中文「现代 / 民国 / 古代 / 仙侠」)'),
|
|
1001
|
+
positive: z.array(z.string()).optional().describe('本场额外的正向约束(可留空,平台自带该档基线)'),
|
|
1002
|
+
negative: z.array(z.string()).optional().describe('本场额外的禁止项(可留空)'),
|
|
1003
|
+
}).nullable().optional()
|
|
1004
|
+
.describe('**本场**的时代契约,非空时**压过**集级契约(set_era_contract 设的那条)。'
|
|
1005
|
+
+ '只在这一场要破例时才填——例如奇幻世界里插一场现代回忆。'
|
|
1006
|
+
+ '传 null 清空本场覆写、回到跟随集级。整集统一的时代**不要**逐场填,用 set_era_contract 设一次即可'),
|
|
929
1007
|
}, async ({ scene_id, ...fields }) => jsonResult(await client.producePut(`/scenes/${scene_id}`, fields)));
|
|
1008
|
+
server.tool('set_era_contract', '设**本集**的时代契约(免费,纯文本写库)。★这是唯一压得过视觉锁的时代机制——'
|
|
1009
|
+
+ '古装/民国/仙侠类项目**出图前必设**,不设的话平台只能靠提示词正文堆字对抗,'
|
|
1010
|
+
+ '时代错乱(现代物件混进古代画面、仙境被画成写实古代)基本都是这里空着导致的。\n'
|
|
1011
|
+
+ '四档怎么选:\n'
|
|
1012
|
+
+ '· modern —— 现代/当代都市。不确定时用这档。\n'
|
|
1013
|
+
+ '· republican —— 民国、二十世纪早期。\n'
|
|
1014
|
+
+ '· historical —— 可考据的历史朝代;这档会要求画面向**考据写实**靠拢。\n'
|
|
1015
|
+
+ '· fantasy —— ★仙侠/奇幻/仙境:修真世界、妖灵化形一类**非写实**的东方奇幻。'
|
|
1016
|
+
+ '这类项目**别填 historical**——那档要求考据写实,会把发光灵气、悬浮地貌、非人化形'
|
|
1017
|
+
+ '一并判成「不合时代」,把画面往写实古代拽。\n'
|
|
1018
|
+
+ '★设完不会自动重出已生成的图:要让画面跟上,得再调 generate_frames / regenerate_scene_image。'
|
|
1019
|
+
+ '★某一场要破例,用 update_scene 的 era_contract 单独覆写(场级压过集级)。', {
|
|
1020
|
+
episode_id: z.number().int().positive(),
|
|
1021
|
+
era: z.string().nullable()
|
|
1022
|
+
.describe('modern / republican / historical / fantasy(也收中文「现代 / 民国 / 古代 / 仙侠」)。传 null 清空本集契约'),
|
|
1023
|
+
positive: z.array(z.string()).optional()
|
|
1024
|
+
.describe('额外的正向约束(可留空,平台自带该档基线)。写世界观独有的东西,别重复该档已有的常识'),
|
|
1025
|
+
negative: z.array(z.string()).optional()
|
|
1026
|
+
.describe('额外的禁止项(可留空)。写该档基线没覆盖、但本项目必须禁的东西'),
|
|
1027
|
+
}, async ({ episode_id, ...rest }) => jsonResult(await client.producePut(`/episodes/${episode_id}/era-contract`, rest)));
|
|
1028
|
+
server.tool('get_era_contract', '读本集的时代契约现值 + 各场的场级覆写清单 + 四个可选档位的用途说明。免费。'
|
|
1029
|
+
+ '改之前先读一次:能看清「集级设的是哪档、哪几场被单独覆写过」,避免整集统一的时代被逐场填乱。'
|
|
1030
|
+
+ '★era_contract 为 null 就是**没设**——古装/仙侠项目看到 null 应当先 set_era_contract 再出图。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/era-contract`)));
|
|
930
1031
|
server.tool('get_scene_prompt', '读某一场**场景图(空景基板)**的提示词正文,供直接微调后用 update_scene 的 image_prompt 写回。免费。' +
|
|
931
1032
|
'★逐场按需:改哪场读哪场(整集列表 get_scenes 是纯资产视图,不含提示词)。' +
|
|
932
1033
|
'★这是场景表里的正文层;出图时平台还会在其上拼画风块、空景约束与时代锁(不在此处,也无需你写)。' +
|
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 → 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.
|
|
5
|
+
"version": "0.1.66",
|
|
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.66 tool surface (operationIds match MCP tool names 1:1)."
|
|
7
7
|
},
|
|
8
8
|
"servers": [
|
|
9
9
|
{
|
|
@@ -3042,6 +3042,128 @@
|
|
|
3042
3042
|
}
|
|
3043
3043
|
}
|
|
3044
3044
|
},
|
|
3045
|
+
"/episodes/{episode_id}/era-contract": {
|
|
3046
|
+
"put": {
|
|
3047
|
+
"operationId": "set_era_contract",
|
|
3048
|
+
"summary": "设**本集**的时代契约(免费,纯文本写库)",
|
|
3049
|
+
"description": "设**本集**的时代契约(免费,纯文本写库)。★这是唯一压得过视觉锁的时代机制——古装/民国/仙侠类项目**出图前必设**,不设的话平台只能靠提示词正文堆字对抗,时代错乱(现代物件混进古代画面、仙境被画成写实古代)基本都是这里空着导致的。\n四档怎么选:\n· modern —— 现代/当代都市。不确定时用这档。\n· republican —— 民国、二十世纪早期。\n· historical —— 可考据的历史朝代;这档会要求画面向**考据写实**靠拢。\n· fantasy —— ★仙侠/奇幻/仙境:修真世界、妖灵化形一类**非写实**的东方奇幻。这类项目**别填 historical**——那档要求考据写实,会把发光灵气、悬浮地貌、非人化形一并判成「不合时代」,把画面往写实古代拽。\n★设完不会自动重出已生成的图:要让画面跟上,得再调 generate_frames / regenerate_scene_image。★某一场要破例,用 update_scene 的 era_contract 单独覆写(场级压过集级)。",
|
|
3050
|
+
"tags": [
|
|
3051
|
+
"episodes"
|
|
3052
|
+
],
|
|
3053
|
+
"parameters": [
|
|
3054
|
+
{
|
|
3055
|
+
"name": "episode_id",
|
|
3056
|
+
"in": "path",
|
|
3057
|
+
"required": true,
|
|
3058
|
+
"schema": {
|
|
3059
|
+
"type": "integer",
|
|
3060
|
+
"exclusiveMinimum": 0
|
|
3061
|
+
}
|
|
3062
|
+
}
|
|
3063
|
+
],
|
|
3064
|
+
"requestBody": {
|
|
3065
|
+
"required": true,
|
|
3066
|
+
"content": {
|
|
3067
|
+
"application/json": {
|
|
3068
|
+
"schema": {
|
|
3069
|
+
"type": "object",
|
|
3070
|
+
"properties": {
|
|
3071
|
+
"era": {
|
|
3072
|
+
"type": "string"
|
|
3073
|
+
},
|
|
3074
|
+
"positive": {
|
|
3075
|
+
"type": "array",
|
|
3076
|
+
"items": {
|
|
3077
|
+
"type": "string"
|
|
3078
|
+
}
|
|
3079
|
+
},
|
|
3080
|
+
"negative": {
|
|
3081
|
+
"type": "array",
|
|
3082
|
+
"items": {
|
|
3083
|
+
"type": "string"
|
|
3084
|
+
}
|
|
3085
|
+
}
|
|
3086
|
+
},
|
|
3087
|
+
"required": [
|
|
3088
|
+
"era"
|
|
3089
|
+
]
|
|
3090
|
+
}
|
|
3091
|
+
}
|
|
3092
|
+
}
|
|
3093
|
+
},
|
|
3094
|
+
"responses": {
|
|
3095
|
+
"200": {
|
|
3096
|
+
"description": "StarReel envelope",
|
|
3097
|
+
"content": {
|
|
3098
|
+
"application/json": {
|
|
3099
|
+
"schema": {
|
|
3100
|
+
"type": "object",
|
|
3101
|
+
"properties": {
|
|
3102
|
+
"code": {
|
|
3103
|
+
"type": "integer"
|
|
3104
|
+
},
|
|
3105
|
+
"message": {
|
|
3106
|
+
"type": "string"
|
|
3107
|
+
},
|
|
3108
|
+
"data": {
|
|
3109
|
+
"description": "Operation result payload"
|
|
3110
|
+
}
|
|
3111
|
+
}
|
|
3112
|
+
}
|
|
3113
|
+
}
|
|
3114
|
+
}
|
|
3115
|
+
},
|
|
3116
|
+
"402": {
|
|
3117
|
+
"description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
|
|
3118
|
+
}
|
|
3119
|
+
}
|
|
3120
|
+
},
|
|
3121
|
+
"get": {
|
|
3122
|
+
"operationId": "get_era_contract",
|
|
3123
|
+
"summary": "读本集的时代契约现值 + 各场的场级覆写清单 + 四个可选档位的用途说明",
|
|
3124
|
+
"description": "读本集的时代契约现值 + 各场的场级覆写清单 + 四个可选档位的用途说明。免费。改之前先读一次:能看清「集级设的是哪档、哪几场被单独覆写过」,避免整集统一的时代被逐场填乱。★era_contract 为 null 就是**没设**——古装/仙侠项目看到 null 应当先 set_era_contract 再出图。",
|
|
3125
|
+
"tags": [
|
|
3126
|
+
"episodes"
|
|
3127
|
+
],
|
|
3128
|
+
"parameters": [
|
|
3129
|
+
{
|
|
3130
|
+
"name": "episode_id",
|
|
3131
|
+
"in": "path",
|
|
3132
|
+
"required": true,
|
|
3133
|
+
"schema": {
|
|
3134
|
+
"type": "integer",
|
|
3135
|
+
"exclusiveMinimum": 0
|
|
3136
|
+
}
|
|
3137
|
+
}
|
|
3138
|
+
],
|
|
3139
|
+
"responses": {
|
|
3140
|
+
"200": {
|
|
3141
|
+
"description": "StarReel envelope",
|
|
3142
|
+
"content": {
|
|
3143
|
+
"application/json": {
|
|
3144
|
+
"schema": {
|
|
3145
|
+
"type": "object",
|
|
3146
|
+
"properties": {
|
|
3147
|
+
"code": {
|
|
3148
|
+
"type": "integer"
|
|
3149
|
+
},
|
|
3150
|
+
"message": {
|
|
3151
|
+
"type": "string"
|
|
3152
|
+
},
|
|
3153
|
+
"data": {
|
|
3154
|
+
"description": "Operation result payload"
|
|
3155
|
+
}
|
|
3156
|
+
}
|
|
3157
|
+
}
|
|
3158
|
+
}
|
|
3159
|
+
}
|
|
3160
|
+
},
|
|
3161
|
+
"402": {
|
|
3162
|
+
"description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
|
|
3163
|
+
}
|
|
3164
|
+
}
|
|
3165
|
+
}
|
|
3166
|
+
},
|
|
3045
3167
|
"/episodes/{episode_id}/export": {
|
|
3046
3168
|
"get": {
|
|
3047
3169
|
"operationId": "get_export",
|
|
@@ -3093,7 +3215,7 @@
|
|
|
3093
3215
|
"post": {
|
|
3094
3216
|
"operationId": "extract_assets",
|
|
3095
3217
|
"summary": "从可拍稿提取角色/场景/道具(一次写三表,是下游一致性的地基)",
|
|
3096
|
-
"description": "从可拍稿提取角色/场景/道具(一次写三表,是下游一致性的地基)。后台异步,文本步后付不欠费。前置:已 rewrite_script 产出改写稿(新项目强制;人物档案从改写稿提取才与剧本、分镜自洽)。★分钟级后台任务;用 get_run_status 判断是否还在跑,别拿 60 秒当失败判据。\n★【改写稿审查硬闸·免费】本步前必须先调 review_script:把返回的 findings 逐条原样告诉客户(每条带 code=问题类型、shots=命中镜号、action=该调哪个工具修),再把 review_token 传进本工具。未审查会被 400 拒。审查后又改了内容 → token 自动失效,复审一次即可(仍免费)。有 error 时默认拦截;客户知情并坚持照现状继续,才带 acknowledge_review:true——带病推进大概率产出废片且照常扣费,不要替客户做这个决定。★三档执行策略(别把三档混着问客户):①【基础项目设定·免费·必做地基·建剧即设好,别建空壳】project_type/setting_brief(世界观·ERA LOCK)/ethnicity(族裔)/画幅分辨率,以及一致性锚 cinematography_prompt(摄影DNA)·art_bible(美术圣经)·visual_lock(视觉锁定)——全免费,是驱动全链一致性的地基;不设好,后续所有生成都跑偏、返工重花钱。用 create_drama/update_project_settings 直接设。★visual_lock/art_bible 只写画面级/世界级锁(镜头语言·环境·美术基调·禁入元素),**绝不为具体角色钉服装/发型/外观细节**——角色外观的唯一真相源是 extract_assets 产出的人物档案(要改走 update_character);两处都写必然互相矛盾,定妆图跟档案、设定图跟视觉锁,一致性闸按定妆图拒收 →
|
|
3218
|
+
"description": "从可拍稿提取角色/场景/道具(一次写三表,是下游一致性的地基)。后台异步,文本步后付不欠费。前置:已 rewrite_script 产出改写稿(新项目强制;人物档案从改写稿提取才与剧本、分镜自洽)。★分钟级后台任务;用 get_run_status 判断是否还在跑,别拿 60 秒当失败判据。\n★【改写稿审查硬闸·免费】本步前必须先调 review_script:把返回的 findings 逐条原样告诉客户(每条带 code=问题类型、shots=命中镜号、action=该调哪个工具修),再把 review_token 传进本工具。未审查会被 400 拒。审查后又改了内容 → token 自动失效,复审一次即可(仍免费)。有 error 时默认拦截;客户知情并坚持照现状继续,才带 acknowledge_review:true——带病推进大概率产出废片且照常扣费,不要替客户做这个决定。★三档执行策略(别把三档混着问客户):①【基础项目设定·免费·必做地基·建剧即设好,别建空壳】project_type/setting_brief(世界观·ERA LOCK)/ethnicity(族裔)/画幅分辨率,以及一致性锚 cinematography_prompt(摄影DNA)·art_bible(美术圣经)·visual_lock(视觉锁定)——全免费,是驱动全链一致性的地基;不设好,后续所有生成都跑偏、返工重花钱。用 create_drama/update_project_settings 直接设。★visual_lock/art_bible 只写画面级/世界级锁(镜头语言·环境·美术基调·禁入元素),**绝不为具体角色钉服装/发型/外观细节**——角色外观的唯一真相源是 extract_assets 产出的人物档案(要改走 update_character);两处都写必然互相矛盾,定妆图跟档案、设定图跟视觉锁,一致性闸按定妆图拒收 → 设定图/镜头帧**结构性连拒**,重掷多少次都过不了、纯白花钱。★★【时代契约·免费·非现代题材出图前必设】setting_brief 里的世界观是**自由文本**,只能提供背景、压不住画面;真正能压过视觉锁的是**结构化时代契约**:用 set_era_contract 设本集档位(modern/republican/historical/fantasy),get_era_contract 读现值。**不设就是空着**——平台只能靠提示词正文堆字对抗,现代物件混进古代画面、场景图画成别的时代,基本都由这里空着导致。★仙侠/奇幻/仙境类**必须填 fantasy,别填 historical**:后者要求考据写实,会把发光灵气、悬浮地貌、非人化形一并判成「不合时代」,把画面往写实古代拽。某一场要破例(如奇幻世界里一场现代回忆)用 update_scene 的 era_contract 单独覆写,场级压过集级。★★【逐环节审查协议·全部免费·这是防废片的主线,不是可选项】每个环节产出后先审查、把结论原样告诉客户,再进下一步。**三道硬闸(不过会被 400 拒)**:①改写稿产出后 → review_script(在 extract_assets / generate_storyboards 之前);②分镜产出后 → review_storyboards(在 generate_frames 之前);③镜头图片产出后 → review_frames(在 generate_videos 之前)。每次审查返回 review_token,把它随下游收费工具一起传;findings 逐条讲给客户(code=问题类型·shots=命中镜号·action=该调哪个工具修),按 action 修完后**复审**再走。审查后又改了内容 → token 自动失效,复审一次即可(免费)。有 error 时默认拦截,只有客户明确知情并坚持才带 acknowledge_review:true——别替客户做这个决定。**软引导(不阻断但强烈建议,同样免费)**:出图/出视频前跑 run_precheck(揪出必被厂商拒的镜,防白花钱)——★揪出来之后别自己盲改:plan_precheck_fix 让平台算出提案 → 逐条讲给客户 → 客户点头后 apply_precheck_fix 落库;分镜后跑 get_health_report;定妆图出完用 get_characters 核对每个出场角色都有 image/sheet;出帧后用 get_storyboards 看 frame_status 与 fail_reason/fail_hint(failed 的镜先修再往下,别带着废帧出视频);出视频后同样看 video_status;成片前用 get_pipeline_status 确认没有缺镜。★**禁止一路 generate 到底**:不审查就连推的做法,问题会在每一层被放大,最后整集废掉重来——而重来的每一次出图/出视频都是真扣费。审查全部免费,拦下来一分钱不花。②【产线主干·按序不跳步·★先分镜再建资产】set_script→rewrite_script→★review_script→extract_assets→storyboards(先分镜·纯文本拆镜)→★review_storyboards→★剧本纪律(端点强制,绕不过):原始素材(梗概/大纲/成品稿都算)一律放 set_script,**必须经 rewrite_script 产出 AI 改写稿**——把自己写好的剧本直接贴进 edit_rewritten_script 绕过改写会被 400 拒(没有改写稿就没有可改的对象),extract_assets 同样要求基于改写稿。改写后的所有修改按 AI 产物的结构化格式做:改稿 edit_rewritten_script(润色/纠正)、人物档案 update_character、分镜 update_shot/replace_shot_dialogue——别回头整篇替换剧本或在设定字段里另写一套,两套真相源打架是一致性事故的头号根源。★★**改写成功一次后就别再重跑 rewrite_script**:它是从原稿整篇重来,当前稿的所有修正全丢,且新版不保证保留旧版已改好的地方(三版实测会来回摆)。要修就 edit_rewritten_script 点改(get_script 取全文 → 只改那几场、其余逐字照抄 → 提交整篇),免费秒级、结果确定;误重跑用 get_script(include_previous=1) 回捞上一版。generate_portraits_and_sheets(定妆图+设定图·分镜后建只给出场角色出图更省)→assign_voices(分配音色)→frames→★review_frames→videos→generate_tts→compose;★别先建角色形象/道具设定图/动作模板再分镜——分镜是纯文本步、不依赖任何图;资产在分镜后建更省更准(动作模板本就必须分镜后)。收费步照现有 quote 报价确认流程。广告另需 add_product+generate_product_sheet;MV 走 set_mv_lyrics→generate_mv_story→generate_mv_script。★世界观概念图=默认必做(提升整剧一致性、很多第三方平台漏做这步):分镜后默认调 generate_world_concept,仍走报价确认流程(告知客户预估点数、确认再扣)——不静默扣费、也别跳过。★分镜后的剧目级资产别漏——尤其 generate_motion_templates(动作模板:从分镜抽取统一全片运动语言,漏了动作会散乱)与 generate_color_script(色彩脚本:统一色调);分镜后、出图前一并做,仍走报价确认。★场景 Bible(每场景详细设定)顺序在**场景图片出图之后**——据出好的场景图完善(MCP 暂无此工具、在官网做);别在出场景图前做场景 Bible。★音频默认用视频原声(use_clip_audio 默认开、跳过 TTS 直接用 AI 视频自带声):建剧/改设定时 AI 应主动告知客户「默认用视频原声,如需 TTS 配音把 use_clip_audio 设 false」,让客户选。★图片模型默认 ChatGPT Image 2.5 Flare(gpt-image-2.5-flare·整剧统一画风):create_drama/update_project_settings 的 image_model 设,不传即默认它;可选 gpt-image-2.5-sunburst(同价·中文字形与细节更准)/gemini-3.1-flash-image(香蕉2·71点)/gemini-3-pro-image(香蕉Pro·更精细·175点)/gemini-3.1-flash-lite-image(香蕉2 Lite·便宜·31点)/doubao-seedream-5-0-260128(Seedream5.0);generate_frames 可临时覆盖某次。★2.5 按输入量计费(基础11点+每张参考图18点),香蕉/Seedream 是一口价——参考图多的镜头要把这笔算进预算。★视频引擎四选一(drama级·AI 建剧时必须主动按剧选型引导并给价差让客户定):【选型决策树】①写实真人剧→seedance-2.5(默认·指令遵循/人脸细节最强·720p 212点/秒),预算敏感可 hailuo-3(约1/3成本70点/秒·强保真编辑·但单镜约6分钟);②风格化/动画/3D卡通剧·空镜·产品镜→wan3.0(约4折84点/秒·最长30秒·最短2秒计费·单镜约2分钟),赶交付用 wan3.0-prime(126点/秒·约1分钟);③★写实真人剧绝不选 wan3.0/prime——WAN 输出侧真人脸审核在 720p+ 一致拒、重试救不回;④★★叙事剧(有对白、讲连贯故事、镜头节奏要稳的)慎选 wan3.0/prime:WAN 会在**单个分镜片内自行换机位硬切**(实测 11/12 镜有镜内跳切,对照 seedance-2.5 仅 1/6、hailuo-3 为 0/5),成片观感是「一个镜头里画面跳来跳去、切太快」;这是厂商指令遵循弱、提示词层拦不住(我方负向约束早已在其中且实测无效),事后只能换引擎重生。WAN 适合镜头本就短平快的风格化/空镜/产品镜;要稳定单镜叙事请选 seedance-2.5 或 hailuo-3。生成后可用 scan_intra_shot_cuts 核查;④b★★对白密集剧慎选 hailuo-3(与上一条的「镜内自剪」是两回事,这条讲**说不说得全台词**):原生音频引擎会念到镜头结束就停、也会自说自话,实测「台词没念完整」占比 hailuo-3 **50%**(26 镜,均为 8-30 原生音频修复之后所生成,故是引擎本身)、seedance-2.5 **23%**(294 镜);wan3.0 该维度**样本不足未测**(26 个样本全在同一修复之前,修复后仅 2 镜)——不要据此认为 WAN 差。客户报「话没说完」时先跑 scan_dialogue_coverage 分族,别默认去加长镜头(实测镜长够的镜里仍有 32% 没念全);⑤★镜长控制(所有引擎通用,WAN 上尤其明显):单镜保持 3~5 秒。镜头越长模型自由发挥空间越大——实测一个 16 秒单镜(邻镜都是 3~5 秒)在片内换了 4 次场景、人物中途消失 4 秒后又从画面边缘长出来,客户看到的就是「凭空多出一个人」。要长表演请拆成多个短镜再靠帧链衔接,别写 15 秒以上的单镜;【分辨率决策】草稿/迭代期:WAN 剧 480p(42点/秒最省)、其余 720p;成片交付:seedance 剧 720p(高清档停售)、hailuo-3 剧 1080p(=2K·112点/秒)、WAN 剧 1080p(168点/秒);hailuo-3 无独立 480p 档(选了也按 768P 计费);create_drama/update_project_settings 的 video_engine/video_resolution 设,★都必须在出视频前定——切换不回溯已生成镜头,同剧混用会画风/身份漂移。★图片生成慢≠失败:每张几十秒~数分钟、整集可能十几分钟,轮询 get_storyboards 看 frame_status——pending=还在生成(耐心等、别重复调 generate_frames 白花钱)、ready=完成、failed=才是真失败。★改某一镜画面 / 换定妆图后要让新图生效,走**单镜重生 generate_shot_frame**(平台自动带该镜身份锚·场景道具参考·画风锚,保全片一致);generate_frames 只批量补「缺帧」的镜、已有首帧的镜跳过(正常、不是\"拒绝\"),尾帧用 frame_type=last_frame 可批量补。换定妆图(set_character_portrait)后响应里的 stale_frames 就是被旧图污染、需逐镜重生的镜。★绝不用外部工具自制首尾帧再 upload_shot_frame 来\"改画面\"——外部图无身份锚/画风锚,人物·服装·画风必漂,那才是废片根源;upload_shot_frame 只用于客户自有真实素材。③【可选增强·AI 主动提示客户·报价确认才做】美术圣经生成/视觉锁抽取/色彩脚本/动作模板/场景图/场景组/口型/海报/音效/配乐/字幕翻译——这些提升一致性/质量、大多收费。★AI 应主动告知客户这些可做并给报价,客户确认才跑;既不默默跳过、也不擅自扣费。★两条锁定纪律:①**画幅比例**在 create_drama 即定、drama 级锁定,之后所有出图/出视频/成片都用它、**别中途改**(改了已生成内容画幅会不一致、漂移);不设默认 9:16。②**拆镜每镜 5-7 秒是对 AI 出视频优化的正常时长**,别因「镜偏长」误判就重拆——generate_storyboards 会**替换整集所有分镜**、已出图白费,已有分镜后端会拦、需 confirm_replace。★改写保真(默认 auto 智能路由):set_script 的原稿**本身已是剧本形态**(场景头/对白行结构)时,rewrite_script 自动走两步保真——客户台词逐句由机器闸锁定(丢一句即内部拒收重做)、AI 绝不加戏;剧作缺口(钩子/情感锚点)不自动补,写进 get_script 返回的 dramaturgy_suggestions 由客户决定采纳。原稿是小说/大纲则自动走创作型改写(AI 铺钩子造情感点),两种客户各得其所、无需手动切换。要覆盖默认用 update_project_settings 的 rewrite_pipeline(auto/two_pass/single_forced)与 fidelity_enforce(1=保真硬闸)。客户说「AI 把我的剧本改偏了」时的处置:①确认完整原稿已进 set_script;②rewrite_pipeline 设 two_pass 强制保真后重跑 rewrite_script;③客户确认角色外观后用 update_character 的 profile_locked=1 锁定档案,防后续提取覆盖外貌导致定妆图换脸。★客户想在**别的 AI 平台**改写剧本(常见诉求:第三方模型评估我方改写\"改动太大\",客户想自己掌控改动幅度):先调 get_script_format_spec 拿平台认可的格式契约(markdown 范本 + 可直接转发给外部模型的 external_prompt + 空白骨架),把 external_prompt+范本+客户原稿一起交给那个平台;拿回整理稿后**先调 check_script_format 自查**(免费·纯规则·不调模型),errors 清零后有两条出口:【A】adopt_external_script 直接落为可拍稿(我方 AI 不介入·秒级·不计费,前提是外部稿含制作层标注);【B】set_script 灌回原稿位 + rewrite_script 走保真两步(外部只做剧情层时选这条,标注由平台补;客户自写的标注在这条路上会被剥掉重写)。★别把外部整理稿塞进 edit_rewritten_script(未跑过改写会被 400 拒),也别跳过 check_script_format 直接灌——格式不合规的稿子进来照样被闸拦,白跑一轮。★★客户交来的**已经是成品分镜表**(逐镜写了秒数/景别/运镜)时,以上两条都不适用——直接用 import_storyboard_table 建分镜,跳过改写与拆镜。走改写那条路会把秒数/景别/运镜/STYLE/文字卡当非剧情内容剥掉(生产实测 8 镜 36 秒→20 镜 109 秒)。★两条导入通道都是确定性的——写错了也会原样建进去,所以**先取契约再自检再导**:分镜表走 get_storyboard_table_spec → check_storyboard_table → import_storyboard_table;客户自己的工具/表格能导出结构化数据、或让外部 AI 直接产 JSON 时走 get_bulk_import_spec → check_bulk_import → bulk_import_storyboards(只建分镜;角色/场景/道具由 extract_assets 从剧本提取,导入按名字绑定已有的——先 extract 再导)。两条导入默认带 auto_complete(后台 AI 补专业字段 + 出图/视频提示词,文本步后付,调用前告知客户):回执 started=true 就用 get_autofill_status 轮询到 done 再 review_storyboards——补全会改镜,先审的 token 会失效。用 get_pipeline_status 查进度(按项目类型返回专属步骤)。",
|
|
3097
3219
|
"tags": [
|
|
3098
3220
|
"episodes"
|
|
3099
3221
|
],
|
|
@@ -3847,7 +3969,7 @@
|
|
|
3847
3969
|
"get": {
|
|
3848
3970
|
"operationId": "run_precheck",
|
|
3849
3971
|
"summary": "(★推荐·免费质量闸)出图/出视频前跑生成前预检,把会被拒的镜提前揪出",
|
|
3850
|
-
"description": "(★推荐·免费质量闸)出图/出视频前跑生成前预检,把会被拒的镜提前揪出。免费、不扣费。强烈建议 generate_frames/generate_videos 前调,防白花钱被拒。\n查这几类:①真人肖像/克隆音色授权 ②图像审核高危词 ③配音覆盖与大空档 ④**指令自相矛盾(kind=prompt-conflict)**——同一镜里互斥的要求(如宽景别却标了特写主体、既要站立又要坐姿),这类镜**任何正确的图都满足不了**,不改就会反复被拒并反复扣费,出现时应先按提示改分镜再出图,而不是重试。\n⚠️ 它**不**检查首帧是否处在\"动作发生前\"(平台暂无该契约字段),也不替代 get_health_report。",
|
|
3972
|
+
"description": "(★推荐·免费质量闸)出图/出视频前跑生成前预检,把会被拒的镜提前揪出。免费、不扣费。强烈建议 generate_frames/generate_videos 前调,防白花钱被拒。\n查这几类:①真人肖像/克隆音色授权 ②图像审核高危词 ③配音覆盖与大空档 ④**指令自相矛盾(kind=prompt-conflict)**——同一镜里互斥的要求(如宽景别却标了特写主体、既要站立又要坐姿),这类镜**任何正确的图都满足不了**,不改就会反复被拒并反复扣费,出现时应先按提示改分镜再出图,而不是重试。\n★**怎么改不用你猜**:调 plan_precheck_fix 让平台算出提案(哪一镜、把什么改成什么),讲给客户、客户点头后用 apply_precheck_fix 落库——比你自己用 update_shot 盲改稳,那条路绕开了乐观锁与落库前复核。部分类别系统不替你改(提案里的 blocked),那些才需要人工调。\n⚠️ 它**不**检查首帧是否处在\"动作发生前\"(平台暂无该契约字段),也不替代 get_health_report。",
|
|
3851
3973
|
"tags": [
|
|
3852
3974
|
"episodes"
|
|
3853
3975
|
],
|
|
@@ -3890,6 +4012,180 @@
|
|
|
3890
4012
|
}
|
|
3891
4013
|
}
|
|
3892
4014
|
},
|
|
4015
|
+
"/episodes/{episode_id}/precheck-fix/apply": {
|
|
4016
|
+
"post": {
|
|
4017
|
+
"operationId": "apply_precheck_fix",
|
|
4018
|
+
"summary": "把客户**确认过**的提案落库(第②步)",
|
|
4019
|
+
"description": "把客户**确认过**的提案落库(第②步)。免费(纯文本写库)。入参就是 plan_precheck_fix 回的提案对象,**原样传回**即可——只传客户勾选采纳的那几条。\n★落库前平台还会再过三道闸:乐观锁(库里的值变了就跳过,绝不覆盖别人的改动)、准入复判、自净闸(改完判据没转绿也跳过)。所以部分条目进 skipped 是正常的,不是失败。\n★返回的 remaining = 本集**还剩几条**预检问题,不是「改了几个字段」。改完重跑 run_precheck 确认,再往下出图。",
|
|
4020
|
+
"tags": [
|
|
4021
|
+
"episodes"
|
|
4022
|
+
],
|
|
4023
|
+
"parameters": [
|
|
4024
|
+
{
|
|
4025
|
+
"name": "episode_id",
|
|
4026
|
+
"in": "path",
|
|
4027
|
+
"required": true,
|
|
4028
|
+
"schema": {
|
|
4029
|
+
"type": "integer",
|
|
4030
|
+
"exclusiveMinimum": 0
|
|
4031
|
+
}
|
|
4032
|
+
}
|
|
4033
|
+
],
|
|
4034
|
+
"requestBody": {
|
|
4035
|
+
"required": true,
|
|
4036
|
+
"content": {
|
|
4037
|
+
"application/json": {
|
|
4038
|
+
"schema": {
|
|
4039
|
+
"type": "object",
|
|
4040
|
+
"properties": {
|
|
4041
|
+
"proposals": {
|
|
4042
|
+
"type": "array",
|
|
4043
|
+
"items": {
|
|
4044
|
+
"type": "object",
|
|
4045
|
+
"properties": {
|
|
4046
|
+
"shot_id": {
|
|
4047
|
+
"type": "integer",
|
|
4048
|
+
"exclusiveMinimum": 0
|
|
4049
|
+
},
|
|
4050
|
+
"task": {
|
|
4051
|
+
"type": "string"
|
|
4052
|
+
},
|
|
4053
|
+
"changes": {
|
|
4054
|
+
"type": "array",
|
|
4055
|
+
"items": {
|
|
4056
|
+
"type": "object",
|
|
4057
|
+
"properties": {
|
|
4058
|
+
"field": {
|
|
4059
|
+
"type": "string"
|
|
4060
|
+
},
|
|
4061
|
+
"old_value": {
|
|
4062
|
+
"type": [
|
|
4063
|
+
"string",
|
|
4064
|
+
"null"
|
|
4065
|
+
],
|
|
4066
|
+
"description": "★必须是 plan 给的原值:落库时做乐观锁,库里已经不是它了就跳过"
|
|
4067
|
+
},
|
|
4068
|
+
"new_value": {
|
|
4069
|
+
"type": [
|
|
4070
|
+
"string",
|
|
4071
|
+
"null"
|
|
4072
|
+
]
|
|
4073
|
+
}
|
|
4074
|
+
},
|
|
4075
|
+
"required": [
|
|
4076
|
+
"field"
|
|
4077
|
+
],
|
|
4078
|
+
"additionalProperties": false
|
|
4079
|
+
}
|
|
4080
|
+
}
|
|
4081
|
+
},
|
|
4082
|
+
"required": [
|
|
4083
|
+
"shot_id",
|
|
4084
|
+
"changes"
|
|
4085
|
+
],
|
|
4086
|
+
"additionalProperties": false
|
|
4087
|
+
},
|
|
4088
|
+
"description": "plan_precheck_fix 回的提案,原样传回;只放客户点头采纳的那几条"
|
|
4089
|
+
}
|
|
4090
|
+
},
|
|
4091
|
+
"required": [
|
|
4092
|
+
"proposals"
|
|
4093
|
+
]
|
|
4094
|
+
}
|
|
4095
|
+
}
|
|
4096
|
+
}
|
|
4097
|
+
},
|
|
4098
|
+
"responses": {
|
|
4099
|
+
"200": {
|
|
4100
|
+
"description": "StarReel envelope",
|
|
4101
|
+
"content": {
|
|
4102
|
+
"application/json": {
|
|
4103
|
+
"schema": {
|
|
4104
|
+
"type": "object",
|
|
4105
|
+
"properties": {
|
|
4106
|
+
"code": {
|
|
4107
|
+
"type": "integer"
|
|
4108
|
+
},
|
|
4109
|
+
"message": {
|
|
4110
|
+
"type": "string"
|
|
4111
|
+
},
|
|
4112
|
+
"data": {
|
|
4113
|
+
"description": "Operation result payload"
|
|
4114
|
+
}
|
|
4115
|
+
}
|
|
4116
|
+
}
|
|
4117
|
+
}
|
|
4118
|
+
}
|
|
4119
|
+
},
|
|
4120
|
+
"402": {
|
|
4121
|
+
"description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
|
|
4122
|
+
}
|
|
4123
|
+
}
|
|
4124
|
+
}
|
|
4125
|
+
},
|
|
4126
|
+
"/episodes/{episode_id}/precheck-fix/plan": {
|
|
4127
|
+
"post": {
|
|
4128
|
+
"operationId": "plan_precheck_fix",
|
|
4129
|
+
"summary": "让平台**算出**该怎么改 run_precheck 揪出的「指令自相矛盾」类问题(第①步,只算不改)",
|
|
4130
|
+
"description": "让平台**算出**该怎么改 run_precheck 揪出的「指令自相矛盾」类问题(第①步,只算不改)。按文本用量计费(很小),不走报价确认。\n★两段式,这一步不动任何数据:拿到提案后**逐条讲给客户**(哪一镜、把什么改成什么、为什么),客户点头后再把采纳的那几条**原样**传给 apply_precheck_fix 落库。\n★**不要替客户决定**:这些判据有假阳,平台刻意不做「一键自动修」——曾实测同一批提案里近半是判据误报,静默改会把本来正确的分镜改坏。\n★返回的 blocked 列出「系统不替你改」的类别:那些要人工按 run_precheck 的提示调整分镜。看到 blocked 不等于没问题,反而是**必须人工处理**的那部分。\n不传 shot_id 就算整集;只想修某一镜就传它。",
|
|
4131
|
+
"tags": [
|
|
4132
|
+
"episodes"
|
|
4133
|
+
],
|
|
4134
|
+
"parameters": [
|
|
4135
|
+
{
|
|
4136
|
+
"name": "episode_id",
|
|
4137
|
+
"in": "path",
|
|
4138
|
+
"required": true,
|
|
4139
|
+
"schema": {
|
|
4140
|
+
"type": "integer",
|
|
4141
|
+
"exclusiveMinimum": 0
|
|
4142
|
+
}
|
|
4143
|
+
}
|
|
4144
|
+
],
|
|
4145
|
+
"requestBody": {
|
|
4146
|
+
"required": false,
|
|
4147
|
+
"content": {
|
|
4148
|
+
"application/json": {
|
|
4149
|
+
"schema": {
|
|
4150
|
+
"type": "object",
|
|
4151
|
+
"properties": {
|
|
4152
|
+
"shot_id": {
|
|
4153
|
+
"type": "integer",
|
|
4154
|
+
"exclusiveMinimum": 0
|
|
4155
|
+
}
|
|
4156
|
+
}
|
|
4157
|
+
}
|
|
4158
|
+
}
|
|
4159
|
+
}
|
|
4160
|
+
},
|
|
4161
|
+
"responses": {
|
|
4162
|
+
"200": {
|
|
4163
|
+
"description": "StarReel envelope",
|
|
4164
|
+
"content": {
|
|
4165
|
+
"application/json": {
|
|
4166
|
+
"schema": {
|
|
4167
|
+
"type": "object",
|
|
4168
|
+
"properties": {
|
|
4169
|
+
"code": {
|
|
4170
|
+
"type": "integer"
|
|
4171
|
+
},
|
|
4172
|
+
"message": {
|
|
4173
|
+
"type": "string"
|
|
4174
|
+
},
|
|
4175
|
+
"data": {
|
|
4176
|
+
"description": "Operation result payload"
|
|
4177
|
+
}
|
|
4178
|
+
}
|
|
4179
|
+
}
|
|
4180
|
+
}
|
|
4181
|
+
}
|
|
4182
|
+
},
|
|
4183
|
+
"402": {
|
|
4184
|
+
"description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
|
|
4185
|
+
}
|
|
4186
|
+
}
|
|
4187
|
+
}
|
|
4188
|
+
},
|
|
3893
4189
|
"/episodes/{episode_id}/re-render": {
|
|
3894
4190
|
"post": {
|
|
3895
4191
|
"operationId": "rerender_episode",
|
|
@@ -4200,7 +4496,7 @@
|
|
|
4200
4496
|
"post": {
|
|
4201
4497
|
"operationId": "rewrite_script",
|
|
4202
4498
|
"summary": "AI 改写:把原始剧本改写成可拍稿(读 content → 写 script_content)",
|
|
4203
|
-
"description": "AI 改写:把原始剧本改写成可拍稿(读 content → 写 script_content)。按项目类型自动选改写 agent★保真自动路由:原稿已是剧本形态时自动走两步保真(台词逐句机器锁定、AI 不加戏,剧作缺口进 dramaturgy_suggestions 由客户决定);原稿是小说/大纲则走创作型改写。(广告走 ad 改写;MV 不走标准改写会被拦)。后台异步(分钟级),文本步按 token 后付、不欠费,无需报价。完成后用 get_script 审阅、edit_rewritten_script 改稿。★典型耗时 2~4 分钟(生产实测 ≈169 秒)。**60 秒内查不到结果是正常的,不是失败**——用 get_run_status 判断还在不在跑,别急着重发。★★**本工具是\"从原稿整篇重来\",不是\"再改一版\"**:已有可拍稿时重跑会把当前稿连同已做的所有修正一起覆盖,而且新一版**不保证保留旧版已经改好的地方**(生产三版实测:上一版拆好的长旁白段下一版又合回去、上一版正确的年代服装下一版漂走)。响应里的 overwrites_existing_script=true 就是这个意思。所以**首次改写成功之后,后续所有修改一律用 edit_rewritten_script 点改**——免费、秒级、只动指定的那几场,其余逐字不变,结果确定不抽卡;只有\"要一个完全不同的版本\"才重跑本工具。误重跑后用 get_script(include_previous=1) 取回上一版。★三档执行策略(别把三档混着问客户):①【基础项目设定·免费·必做地基·建剧即设好,别建空壳】project_type/setting_brief(世界观·ERA LOCK)/ethnicity(族裔)/画幅分辨率,以及一致性锚 cinematography_prompt(摄影DNA)·art_bible(美术圣经)·visual_lock(视觉锁定)——全免费,是驱动全链一致性的地基;不设好,后续所有生成都跑偏、返工重花钱。用 create_drama/update_project_settings 直接设。★visual_lock/art_bible 只写画面级/世界级锁(镜头语言·环境·美术基调·禁入元素),**绝不为具体角色钉服装/发型/外观细节**——角色外观的唯一真相源是 extract_assets 产出的人物档案(要改走 update_character);两处都写必然互相矛盾,定妆图跟档案、设定图跟视觉锁,一致性闸按定妆图拒收 →
|
|
4499
|
+
"description": "AI 改写:把原始剧本改写成可拍稿(读 content → 写 script_content)。按项目类型自动选改写 agent★保真自动路由:原稿已是剧本形态时自动走两步保真(台词逐句机器锁定、AI 不加戏,剧作缺口进 dramaturgy_suggestions 由客户决定);原稿是小说/大纲则走创作型改写。(广告走 ad 改写;MV 不走标准改写会被拦)。后台异步(分钟级),文本步按 token 后付、不欠费,无需报价。完成后用 get_script 审阅、edit_rewritten_script 改稿。★典型耗时 2~4 分钟(生产实测 ≈169 秒)。**60 秒内查不到结果是正常的,不是失败**——用 get_run_status 判断还在不在跑,别急着重发。★★**本工具是\"从原稿整篇重来\",不是\"再改一版\"**:已有可拍稿时重跑会把当前稿连同已做的所有修正一起覆盖,而且新一版**不保证保留旧版已经改好的地方**(生产三版实测:上一版拆好的长旁白段下一版又合回去、上一版正确的年代服装下一版漂走)。响应里的 overwrites_existing_script=true 就是这个意思。所以**首次改写成功之后,后续所有修改一律用 edit_rewritten_script 点改**——免费、秒级、只动指定的那几场,其余逐字不变,结果确定不抽卡;只有\"要一个完全不同的版本\"才重跑本工具。误重跑后用 get_script(include_previous=1) 取回上一版。★三档执行策略(别把三档混着问客户):①【基础项目设定·免费·必做地基·建剧即设好,别建空壳】project_type/setting_brief(世界观·ERA LOCK)/ethnicity(族裔)/画幅分辨率,以及一致性锚 cinematography_prompt(摄影DNA)·art_bible(美术圣经)·visual_lock(视觉锁定)——全免费,是驱动全链一致性的地基;不设好,后续所有生成都跑偏、返工重花钱。用 create_drama/update_project_settings 直接设。★visual_lock/art_bible 只写画面级/世界级锁(镜头语言·环境·美术基调·禁入元素),**绝不为具体角色钉服装/发型/外观细节**——角色外观的唯一真相源是 extract_assets 产出的人物档案(要改走 update_character);两处都写必然互相矛盾,定妆图跟档案、设定图跟视觉锁,一致性闸按定妆图拒收 → 设定图/镜头帧**结构性连拒**,重掷多少次都过不了、纯白花钱。★★【时代契约·免费·非现代题材出图前必设】setting_brief 里的世界观是**自由文本**,只能提供背景、压不住画面;真正能压过视觉锁的是**结构化时代契约**:用 set_era_contract 设本集档位(modern/republican/historical/fantasy),get_era_contract 读现值。**不设就是空着**——平台只能靠提示词正文堆字对抗,现代物件混进古代画面、场景图画成别的时代,基本都由这里空着导致。★仙侠/奇幻/仙境类**必须填 fantasy,别填 historical**:后者要求考据写实,会把发光灵气、悬浮地貌、非人化形一并判成「不合时代」,把画面往写实古代拽。某一场要破例(如奇幻世界里一场现代回忆)用 update_scene 的 era_contract 单独覆写,场级压过集级。★★【逐环节审查协议·全部免费·这是防废片的主线,不是可选项】每个环节产出后先审查、把结论原样告诉客户,再进下一步。**三道硬闸(不过会被 400 拒)**:①改写稿产出后 → review_script(在 extract_assets / generate_storyboards 之前);②分镜产出后 → review_storyboards(在 generate_frames 之前);③镜头图片产出后 → review_frames(在 generate_videos 之前)。每次审查返回 review_token,把它随下游收费工具一起传;findings 逐条讲给客户(code=问题类型·shots=命中镜号·action=该调哪个工具修),按 action 修完后**复审**再走。审查后又改了内容 → token 自动失效,复审一次即可(免费)。有 error 时默认拦截,只有客户明确知情并坚持才带 acknowledge_review:true——别替客户做这个决定。**软引导(不阻断但强烈建议,同样免费)**:出图/出视频前跑 run_precheck(揪出必被厂商拒的镜,防白花钱)——★揪出来之后别自己盲改:plan_precheck_fix 让平台算出提案 → 逐条讲给客户 → 客户点头后 apply_precheck_fix 落库;分镜后跑 get_health_report;定妆图出完用 get_characters 核对每个出场角色都有 image/sheet;出帧后用 get_storyboards 看 frame_status 与 fail_reason/fail_hint(failed 的镜先修再往下,别带着废帧出视频);出视频后同样看 video_status;成片前用 get_pipeline_status 确认没有缺镜。★**禁止一路 generate 到底**:不审查就连推的做法,问题会在每一层被放大,最后整集废掉重来——而重来的每一次出图/出视频都是真扣费。审查全部免费,拦下来一分钱不花。②【产线主干·按序不跳步·★先分镜再建资产】set_script→rewrite_script→★review_script→extract_assets→storyboards(先分镜·纯文本拆镜)→★review_storyboards→★剧本纪律(端点强制,绕不过):原始素材(梗概/大纲/成品稿都算)一律放 set_script,**必须经 rewrite_script 产出 AI 改写稿**——把自己写好的剧本直接贴进 edit_rewritten_script 绕过改写会被 400 拒(没有改写稿就没有可改的对象),extract_assets 同样要求基于改写稿。改写后的所有修改按 AI 产物的结构化格式做:改稿 edit_rewritten_script(润色/纠正)、人物档案 update_character、分镜 update_shot/replace_shot_dialogue——别回头整篇替换剧本或在设定字段里另写一套,两套真相源打架是一致性事故的头号根源。★★**改写成功一次后就别再重跑 rewrite_script**:它是从原稿整篇重来,当前稿的所有修正全丢,且新版不保证保留旧版已改好的地方(三版实测会来回摆)。要修就 edit_rewritten_script 点改(get_script 取全文 → 只改那几场、其余逐字照抄 → 提交整篇),免费秒级、结果确定;误重跑用 get_script(include_previous=1) 回捞上一版。generate_portraits_and_sheets(定妆图+设定图·分镜后建只给出场角色出图更省)→assign_voices(分配音色)→frames→★review_frames→videos→generate_tts→compose;★别先建角色形象/道具设定图/动作模板再分镜——分镜是纯文本步、不依赖任何图;资产在分镜后建更省更准(动作模板本就必须分镜后)。收费步照现有 quote 报价确认流程。广告另需 add_product+generate_product_sheet;MV 走 set_mv_lyrics→generate_mv_story→generate_mv_script。★世界观概念图=默认必做(提升整剧一致性、很多第三方平台漏做这步):分镜后默认调 generate_world_concept,仍走报价确认流程(告知客户预估点数、确认再扣)——不静默扣费、也别跳过。★分镜后的剧目级资产别漏——尤其 generate_motion_templates(动作模板:从分镜抽取统一全片运动语言,漏了动作会散乱)与 generate_color_script(色彩脚本:统一色调);分镜后、出图前一并做,仍走报价确认。★场景 Bible(每场景详细设定)顺序在**场景图片出图之后**——据出好的场景图完善(MCP 暂无此工具、在官网做);别在出场景图前做场景 Bible。★音频默认用视频原声(use_clip_audio 默认开、跳过 TTS 直接用 AI 视频自带声):建剧/改设定时 AI 应主动告知客户「默认用视频原声,如需 TTS 配音把 use_clip_audio 设 false」,让客户选。★图片模型默认 ChatGPT Image 2.5 Flare(gpt-image-2.5-flare·整剧统一画风):create_drama/update_project_settings 的 image_model 设,不传即默认它;可选 gpt-image-2.5-sunburst(同价·中文字形与细节更准)/gemini-3.1-flash-image(香蕉2·71点)/gemini-3-pro-image(香蕉Pro·更精细·175点)/gemini-3.1-flash-lite-image(香蕉2 Lite·便宜·31点)/doubao-seedream-5-0-260128(Seedream5.0);generate_frames 可临时覆盖某次。★2.5 按输入量计费(基础11点+每张参考图18点),香蕉/Seedream 是一口价——参考图多的镜头要把这笔算进预算。★视频引擎四选一(drama级·AI 建剧时必须主动按剧选型引导并给价差让客户定):【选型决策树】①写实真人剧→seedance-2.5(默认·指令遵循/人脸细节最强·720p 212点/秒),预算敏感可 hailuo-3(约1/3成本70点/秒·强保真编辑·但单镜约6分钟);②风格化/动画/3D卡通剧·空镜·产品镜→wan3.0(约4折84点/秒·最长30秒·最短2秒计费·单镜约2分钟),赶交付用 wan3.0-prime(126点/秒·约1分钟);③★写实真人剧绝不选 wan3.0/prime——WAN 输出侧真人脸审核在 720p+ 一致拒、重试救不回;④★★叙事剧(有对白、讲连贯故事、镜头节奏要稳的)慎选 wan3.0/prime:WAN 会在**单个分镜片内自行换机位硬切**(实测 11/12 镜有镜内跳切,对照 seedance-2.5 仅 1/6、hailuo-3 为 0/5),成片观感是「一个镜头里画面跳来跳去、切太快」;这是厂商指令遵循弱、提示词层拦不住(我方负向约束早已在其中且实测无效),事后只能换引擎重生。WAN 适合镜头本就短平快的风格化/空镜/产品镜;要稳定单镜叙事请选 seedance-2.5 或 hailuo-3。生成后可用 scan_intra_shot_cuts 核查;④b★★对白密集剧慎选 hailuo-3(与上一条的「镜内自剪」是两回事,这条讲**说不说得全台词**):原生音频引擎会念到镜头结束就停、也会自说自话,实测「台词没念完整」占比 hailuo-3 **50%**(26 镜,均为 8-30 原生音频修复之后所生成,故是引擎本身)、seedance-2.5 **23%**(294 镜);wan3.0 该维度**样本不足未测**(26 个样本全在同一修复之前,修复后仅 2 镜)——不要据此认为 WAN 差。客户报「话没说完」时先跑 scan_dialogue_coverage 分族,别默认去加长镜头(实测镜长够的镜里仍有 32% 没念全);⑤★镜长控制(所有引擎通用,WAN 上尤其明显):单镜保持 3~5 秒。镜头越长模型自由发挥空间越大——实测一个 16 秒单镜(邻镜都是 3~5 秒)在片内换了 4 次场景、人物中途消失 4 秒后又从画面边缘长出来,客户看到的就是「凭空多出一个人」。要长表演请拆成多个短镜再靠帧链衔接,别写 15 秒以上的单镜;【分辨率决策】草稿/迭代期:WAN 剧 480p(42点/秒最省)、其余 720p;成片交付:seedance 剧 720p(高清档停售)、hailuo-3 剧 1080p(=2K·112点/秒)、WAN 剧 1080p(168点/秒);hailuo-3 无独立 480p 档(选了也按 768P 计费);create_drama/update_project_settings 的 video_engine/video_resolution 设,★都必须在出视频前定——切换不回溯已生成镜头,同剧混用会画风/身份漂移。★图片生成慢≠失败:每张几十秒~数分钟、整集可能十几分钟,轮询 get_storyboards 看 frame_status——pending=还在生成(耐心等、别重复调 generate_frames 白花钱)、ready=完成、failed=才是真失败。★改某一镜画面 / 换定妆图后要让新图生效,走**单镜重生 generate_shot_frame**(平台自动带该镜身份锚·场景道具参考·画风锚,保全片一致);generate_frames 只批量补「缺帧」的镜、已有首帧的镜跳过(正常、不是\"拒绝\"),尾帧用 frame_type=last_frame 可批量补。换定妆图(set_character_portrait)后响应里的 stale_frames 就是被旧图污染、需逐镜重生的镜。★绝不用外部工具自制首尾帧再 upload_shot_frame 来\"改画面\"——外部图无身份锚/画风锚,人物·服装·画风必漂,那才是废片根源;upload_shot_frame 只用于客户自有真实素材。③【可选增强·AI 主动提示客户·报价确认才做】美术圣经生成/视觉锁抽取/色彩脚本/动作模板/场景图/场景组/口型/海报/音效/配乐/字幕翻译——这些提升一致性/质量、大多收费。★AI 应主动告知客户这些可做并给报价,客户确认才跑;既不默默跳过、也不擅自扣费。★两条锁定纪律:①**画幅比例**在 create_drama 即定、drama 级锁定,之后所有出图/出视频/成片都用它、**别中途改**(改了已生成内容画幅会不一致、漂移);不设默认 9:16。②**拆镜每镜 5-7 秒是对 AI 出视频优化的正常时长**,别因「镜偏长」误判就重拆——generate_storyboards 会**替换整集所有分镜**、已出图白费,已有分镜后端会拦、需 confirm_replace。★改写保真(默认 auto 智能路由):set_script 的原稿**本身已是剧本形态**(场景头/对白行结构)时,rewrite_script 自动走两步保真——客户台词逐句由机器闸锁定(丢一句即内部拒收重做)、AI 绝不加戏;剧作缺口(钩子/情感锚点)不自动补,写进 get_script 返回的 dramaturgy_suggestions 由客户决定采纳。原稿是小说/大纲则自动走创作型改写(AI 铺钩子造情感点),两种客户各得其所、无需手动切换。要覆盖默认用 update_project_settings 的 rewrite_pipeline(auto/two_pass/single_forced)与 fidelity_enforce(1=保真硬闸)。客户说「AI 把我的剧本改偏了」时的处置:①确认完整原稿已进 set_script;②rewrite_pipeline 设 two_pass 强制保真后重跑 rewrite_script;③客户确认角色外观后用 update_character 的 profile_locked=1 锁定档案,防后续提取覆盖外貌导致定妆图换脸。★客户想在**别的 AI 平台**改写剧本(常见诉求:第三方模型评估我方改写\"改动太大\",客户想自己掌控改动幅度):先调 get_script_format_spec 拿平台认可的格式契约(markdown 范本 + 可直接转发给外部模型的 external_prompt + 空白骨架),把 external_prompt+范本+客户原稿一起交给那个平台;拿回整理稿后**先调 check_script_format 自查**(免费·纯规则·不调模型),errors 清零后有两条出口:【A】adopt_external_script 直接落为可拍稿(我方 AI 不介入·秒级·不计费,前提是外部稿含制作层标注);【B】set_script 灌回原稿位 + rewrite_script 走保真两步(外部只做剧情层时选这条,标注由平台补;客户自写的标注在这条路上会被剥掉重写)。★别把外部整理稿塞进 edit_rewritten_script(未跑过改写会被 400 拒),也别跳过 check_script_format 直接灌——格式不合规的稿子进来照样被闸拦,白跑一轮。★★客户交来的**已经是成品分镜表**(逐镜写了秒数/景别/运镜)时,以上两条都不适用——直接用 import_storyboard_table 建分镜,跳过改写与拆镜。走改写那条路会把秒数/景别/运镜/STYLE/文字卡当非剧情内容剥掉(生产实测 8 镜 36 秒→20 镜 109 秒)。★两条导入通道都是确定性的——写错了也会原样建进去,所以**先取契约再自检再导**:分镜表走 get_storyboard_table_spec → check_storyboard_table → import_storyboard_table;客户自己的工具/表格能导出结构化数据、或让外部 AI 直接产 JSON 时走 get_bulk_import_spec → check_bulk_import → bulk_import_storyboards(只建分镜;角色/场景/道具由 extract_assets 从剧本提取,导入按名字绑定已有的——先 extract 再导)。两条导入默认带 auto_complete(后台 AI 补专业字段 + 出图/视频提示词,文本步后付,调用前告知客户):回执 started=true 就用 get_autofill_status 轮询到 done 再 review_storyboards——补全会改镜,先审的 token 会失效。用 get_pipeline_status 查进度(按项目类型返回专属步骤)。",
|
|
4204
4500
|
"tags": [
|
|
4205
4501
|
"episodes"
|
|
4206
4502
|
],
|
|
@@ -4498,7 +4794,7 @@
|
|
|
4498
4794
|
"put": {
|
|
4499
4795
|
"operationId": "set_script",
|
|
4500
4796
|
"summary": "给某一集设置**原始剧本**(content)",
|
|
4501
|
-
"description": "给某一集设置**原始剧本**(content)。这是 AI 改写的输入,不是最终可拍稿。免费。梗概/大纲/自己写好的成品稿都放这里,设完**必须调 rewrite_script 做 AI 改写**——不能跳过改写直接把稿子贴进 edit_rewritten_script(会被拒)。★三档执行策略(别把三档混着问客户):①【基础项目设定·免费·必做地基·建剧即设好,别建空壳】project_type/setting_brief(世界观·ERA LOCK)/ethnicity(族裔)/画幅分辨率,以及一致性锚 cinematography_prompt(摄影DNA)·art_bible(美术圣经)·visual_lock(视觉锁定)——全免费,是驱动全链一致性的地基;不设好,后续所有生成都跑偏、返工重花钱。用 create_drama/update_project_settings 直接设。★visual_lock/art_bible 只写画面级/世界级锁(镜头语言·环境·美术基调·禁入元素),**绝不为具体角色钉服装/发型/外观细节**——角色外观的唯一真相源是 extract_assets 产出的人物档案(要改走 update_character);两处都写必然互相矛盾,定妆图跟档案、设定图跟视觉锁,一致性闸按定妆图拒收 →
|
|
4797
|
+
"description": "给某一集设置**原始剧本**(content)。这是 AI 改写的输入,不是最终可拍稿。免费。梗概/大纲/自己写好的成品稿都放这里,设完**必须调 rewrite_script 做 AI 改写**——不能跳过改写直接把稿子贴进 edit_rewritten_script(会被拒)。★三档执行策略(别把三档混着问客户):①【基础项目设定·免费·必做地基·建剧即设好,别建空壳】project_type/setting_brief(世界观·ERA LOCK)/ethnicity(族裔)/画幅分辨率,以及一致性锚 cinematography_prompt(摄影DNA)·art_bible(美术圣经)·visual_lock(视觉锁定)——全免费,是驱动全链一致性的地基;不设好,后续所有生成都跑偏、返工重花钱。用 create_drama/update_project_settings 直接设。★visual_lock/art_bible 只写画面级/世界级锁(镜头语言·环境·美术基调·禁入元素),**绝不为具体角色钉服装/发型/外观细节**——角色外观的唯一真相源是 extract_assets 产出的人物档案(要改走 update_character);两处都写必然互相矛盾,定妆图跟档案、设定图跟视觉锁,一致性闸按定妆图拒收 → 设定图/镜头帧**结构性连拒**,重掷多少次都过不了、纯白花钱。★★【时代契约·免费·非现代题材出图前必设】setting_brief 里的世界观是**自由文本**,只能提供背景、压不住画面;真正能压过视觉锁的是**结构化时代契约**:用 set_era_contract 设本集档位(modern/republican/historical/fantasy),get_era_contract 读现值。**不设就是空着**——平台只能靠提示词正文堆字对抗,现代物件混进古代画面、场景图画成别的时代,基本都由这里空着导致。★仙侠/奇幻/仙境类**必须填 fantasy,别填 historical**:后者要求考据写实,会把发光灵气、悬浮地貌、非人化形一并判成「不合时代」,把画面往写实古代拽。某一场要破例(如奇幻世界里一场现代回忆)用 update_scene 的 era_contract 单独覆写,场级压过集级。★★【逐环节审查协议·全部免费·这是防废片的主线,不是可选项】每个环节产出后先审查、把结论原样告诉客户,再进下一步。**三道硬闸(不过会被 400 拒)**:①改写稿产出后 → review_script(在 extract_assets / generate_storyboards 之前);②分镜产出后 → review_storyboards(在 generate_frames 之前);③镜头图片产出后 → review_frames(在 generate_videos 之前)。每次审查返回 review_token,把它随下游收费工具一起传;findings 逐条讲给客户(code=问题类型·shots=命中镜号·action=该调哪个工具修),按 action 修完后**复审**再走。审查后又改了内容 → token 自动失效,复审一次即可(免费)。有 error 时默认拦截,只有客户明确知情并坚持才带 acknowledge_review:true——别替客户做这个决定。**软引导(不阻断但强烈建议,同样免费)**:出图/出视频前跑 run_precheck(揪出必被厂商拒的镜,防白花钱)——★揪出来之后别自己盲改:plan_precheck_fix 让平台算出提案 → 逐条讲给客户 → 客户点头后 apply_precheck_fix 落库;分镜后跑 get_health_report;定妆图出完用 get_characters 核对每个出场角色都有 image/sheet;出帧后用 get_storyboards 看 frame_status 与 fail_reason/fail_hint(failed 的镜先修再往下,别带着废帧出视频);出视频后同样看 video_status;成片前用 get_pipeline_status 确认没有缺镜。★**禁止一路 generate 到底**:不审查就连推的做法,问题会在每一层被放大,最后整集废掉重来——而重来的每一次出图/出视频都是真扣费。审查全部免费,拦下来一分钱不花。②【产线主干·按序不跳步·★先分镜再建资产】set_script→rewrite_script→★review_script→extract_assets→storyboards(先分镜·纯文本拆镜)→★review_storyboards→★剧本纪律(端点强制,绕不过):原始素材(梗概/大纲/成品稿都算)一律放 set_script,**必须经 rewrite_script 产出 AI 改写稿**——把自己写好的剧本直接贴进 edit_rewritten_script 绕过改写会被 400 拒(没有改写稿就没有可改的对象),extract_assets 同样要求基于改写稿。改写后的所有修改按 AI 产物的结构化格式做:改稿 edit_rewritten_script(润色/纠正)、人物档案 update_character、分镜 update_shot/replace_shot_dialogue——别回头整篇替换剧本或在设定字段里另写一套,两套真相源打架是一致性事故的头号根源。★★**改写成功一次后就别再重跑 rewrite_script**:它是从原稿整篇重来,当前稿的所有修正全丢,且新版不保证保留旧版已改好的地方(三版实测会来回摆)。要修就 edit_rewritten_script 点改(get_script 取全文 → 只改那几场、其余逐字照抄 → 提交整篇),免费秒级、结果确定;误重跑用 get_script(include_previous=1) 回捞上一版。generate_portraits_and_sheets(定妆图+设定图·分镜后建只给出场角色出图更省)→assign_voices(分配音色)→frames→★review_frames→videos→generate_tts→compose;★别先建角色形象/道具设定图/动作模板再分镜——分镜是纯文本步、不依赖任何图;资产在分镜后建更省更准(动作模板本就必须分镜后)。收费步照现有 quote 报价确认流程。广告另需 add_product+generate_product_sheet;MV 走 set_mv_lyrics→generate_mv_story→generate_mv_script。★世界观概念图=默认必做(提升整剧一致性、很多第三方平台漏做这步):分镜后默认调 generate_world_concept,仍走报价确认流程(告知客户预估点数、确认再扣)——不静默扣费、也别跳过。★分镜后的剧目级资产别漏——尤其 generate_motion_templates(动作模板:从分镜抽取统一全片运动语言,漏了动作会散乱)与 generate_color_script(色彩脚本:统一色调);分镜后、出图前一并做,仍走报价确认。★场景 Bible(每场景详细设定)顺序在**场景图片出图之后**——据出好的场景图完善(MCP 暂无此工具、在官网做);别在出场景图前做场景 Bible。★音频默认用视频原声(use_clip_audio 默认开、跳过 TTS 直接用 AI 视频自带声):建剧/改设定时 AI 应主动告知客户「默认用视频原声,如需 TTS 配音把 use_clip_audio 设 false」,让客户选。★图片模型默认 ChatGPT Image 2.5 Flare(gpt-image-2.5-flare·整剧统一画风):create_drama/update_project_settings 的 image_model 设,不传即默认它;可选 gpt-image-2.5-sunburst(同价·中文字形与细节更准)/gemini-3.1-flash-image(香蕉2·71点)/gemini-3-pro-image(香蕉Pro·更精细·175点)/gemini-3.1-flash-lite-image(香蕉2 Lite·便宜·31点)/doubao-seedream-5-0-260128(Seedream5.0);generate_frames 可临时覆盖某次。★2.5 按输入量计费(基础11点+每张参考图18点),香蕉/Seedream 是一口价——参考图多的镜头要把这笔算进预算。★视频引擎四选一(drama级·AI 建剧时必须主动按剧选型引导并给价差让客户定):【选型决策树】①写实真人剧→seedance-2.5(默认·指令遵循/人脸细节最强·720p 212点/秒),预算敏感可 hailuo-3(约1/3成本70点/秒·强保真编辑·但单镜约6分钟);②风格化/动画/3D卡通剧·空镜·产品镜→wan3.0(约4折84点/秒·最长30秒·最短2秒计费·单镜约2分钟),赶交付用 wan3.0-prime(126点/秒·约1分钟);③★写实真人剧绝不选 wan3.0/prime——WAN 输出侧真人脸审核在 720p+ 一致拒、重试救不回;④★★叙事剧(有对白、讲连贯故事、镜头节奏要稳的)慎选 wan3.0/prime:WAN 会在**单个分镜片内自行换机位硬切**(实测 11/12 镜有镜内跳切,对照 seedance-2.5 仅 1/6、hailuo-3 为 0/5),成片观感是「一个镜头里画面跳来跳去、切太快」;这是厂商指令遵循弱、提示词层拦不住(我方负向约束早已在其中且实测无效),事后只能换引擎重生。WAN 适合镜头本就短平快的风格化/空镜/产品镜;要稳定单镜叙事请选 seedance-2.5 或 hailuo-3。生成后可用 scan_intra_shot_cuts 核查;④b★★对白密集剧慎选 hailuo-3(与上一条的「镜内自剪」是两回事,这条讲**说不说得全台词**):原生音频引擎会念到镜头结束就停、也会自说自话,实测「台词没念完整」占比 hailuo-3 **50%**(26 镜,均为 8-30 原生音频修复之后所生成,故是引擎本身)、seedance-2.5 **23%**(294 镜);wan3.0 该维度**样本不足未测**(26 个样本全在同一修复之前,修复后仅 2 镜)——不要据此认为 WAN 差。客户报「话没说完」时先跑 scan_dialogue_coverage 分族,别默认去加长镜头(实测镜长够的镜里仍有 32% 没念全);⑤★镜长控制(所有引擎通用,WAN 上尤其明显):单镜保持 3~5 秒。镜头越长模型自由发挥空间越大——实测一个 16 秒单镜(邻镜都是 3~5 秒)在片内换了 4 次场景、人物中途消失 4 秒后又从画面边缘长出来,客户看到的就是「凭空多出一个人」。要长表演请拆成多个短镜再靠帧链衔接,别写 15 秒以上的单镜;【分辨率决策】草稿/迭代期:WAN 剧 480p(42点/秒最省)、其余 720p;成片交付:seedance 剧 720p(高清档停售)、hailuo-3 剧 1080p(=2K·112点/秒)、WAN 剧 1080p(168点/秒);hailuo-3 无独立 480p 档(选了也按 768P 计费);create_drama/update_project_settings 的 video_engine/video_resolution 设,★都必须在出视频前定——切换不回溯已生成镜头,同剧混用会画风/身份漂移。★图片生成慢≠失败:每张几十秒~数分钟、整集可能十几分钟,轮询 get_storyboards 看 frame_status——pending=还在生成(耐心等、别重复调 generate_frames 白花钱)、ready=完成、failed=才是真失败。★改某一镜画面 / 换定妆图后要让新图生效,走**单镜重生 generate_shot_frame**(平台自动带该镜身份锚·场景道具参考·画风锚,保全片一致);generate_frames 只批量补「缺帧」的镜、已有首帧的镜跳过(正常、不是\"拒绝\"),尾帧用 frame_type=last_frame 可批量补。换定妆图(set_character_portrait)后响应里的 stale_frames 就是被旧图污染、需逐镜重生的镜。★绝不用外部工具自制首尾帧再 upload_shot_frame 来\"改画面\"——外部图无身份锚/画风锚,人物·服装·画风必漂,那才是废片根源;upload_shot_frame 只用于客户自有真实素材。③【可选增强·AI 主动提示客户·报价确认才做】美术圣经生成/视觉锁抽取/色彩脚本/动作模板/场景图/场景组/口型/海报/音效/配乐/字幕翻译——这些提升一致性/质量、大多收费。★AI 应主动告知客户这些可做并给报价,客户确认才跑;既不默默跳过、也不擅自扣费。★两条锁定纪律:①**画幅比例**在 create_drama 即定、drama 级锁定,之后所有出图/出视频/成片都用它、**别中途改**(改了已生成内容画幅会不一致、漂移);不设默认 9:16。②**拆镜每镜 5-7 秒是对 AI 出视频优化的正常时长**,别因「镜偏长」误判就重拆——generate_storyboards 会**替换整集所有分镜**、已出图白费,已有分镜后端会拦、需 confirm_replace。★改写保真(默认 auto 智能路由):set_script 的原稿**本身已是剧本形态**(场景头/对白行结构)时,rewrite_script 自动走两步保真——客户台词逐句由机器闸锁定(丢一句即内部拒收重做)、AI 绝不加戏;剧作缺口(钩子/情感锚点)不自动补,写进 get_script 返回的 dramaturgy_suggestions 由客户决定采纳。原稿是小说/大纲则自动走创作型改写(AI 铺钩子造情感点),两种客户各得其所、无需手动切换。要覆盖默认用 update_project_settings 的 rewrite_pipeline(auto/two_pass/single_forced)与 fidelity_enforce(1=保真硬闸)。客户说「AI 把我的剧本改偏了」时的处置:①确认完整原稿已进 set_script;②rewrite_pipeline 设 two_pass 强制保真后重跑 rewrite_script;③客户确认角色外观后用 update_character 的 profile_locked=1 锁定档案,防后续提取覆盖外貌导致定妆图换脸。★客户想在**别的 AI 平台**改写剧本(常见诉求:第三方模型评估我方改写\"改动太大\",客户想自己掌控改动幅度):先调 get_script_format_spec 拿平台认可的格式契约(markdown 范本 + 可直接转发给外部模型的 external_prompt + 空白骨架),把 external_prompt+范本+客户原稿一起交给那个平台;拿回整理稿后**先调 check_script_format 自查**(免费·纯规则·不调模型),errors 清零后有两条出口:【A】adopt_external_script 直接落为可拍稿(我方 AI 不介入·秒级·不计费,前提是外部稿含制作层标注);【B】set_script 灌回原稿位 + rewrite_script 走保真两步(外部只做剧情层时选这条,标注由平台补;客户自写的标注在这条路上会被剥掉重写)。★别把外部整理稿塞进 edit_rewritten_script(未跑过改写会被 400 拒),也别跳过 check_script_format 直接灌——格式不合规的稿子进来照样被闸拦,白跑一轮。★★客户交来的**已经是成品分镜表**(逐镜写了秒数/景别/运镜)时,以上两条都不适用——直接用 import_storyboard_table 建分镜,跳过改写与拆镜。走改写那条路会把秒数/景别/运镜/STYLE/文字卡当非剧情内容剥掉(生产实测 8 镜 36 秒→20 镜 109 秒)。★两条导入通道都是确定性的——写错了也会原样建进去,所以**先取契约再自检再导**:分镜表走 get_storyboard_table_spec → check_storyboard_table → import_storyboard_table;客户自己的工具/表格能导出结构化数据、或让外部 AI 直接产 JSON 时走 get_bulk_import_spec → check_bulk_import → bulk_import_storyboards(只建分镜;角色/场景/道具由 extract_assets 从剧本提取,导入按名字绑定已有的——先 extract 再导)。两条导入默认带 auto_complete(后台 AI 补专业字段 + 出图/视频提示词,文本步后付,调用前告知客户):回执 started=true 就用 get_autofill_status 轮询到 done 再 review_storyboards——补全会改镜,先审的 token 会失效。用 get_pipeline_status 查进度(按项目类型返回专属步骤)。",
|
|
4502
4798
|
"tags": [
|
|
4503
4799
|
"episodes"
|
|
4504
4800
|
],
|
|
@@ -5908,6 +6204,33 @@
|
|
|
5908
6204
|
},
|
|
5909
6205
|
"image_prompt": {
|
|
5910
6206
|
"type": "string"
|
|
6207
|
+
},
|
|
6208
|
+
"era_contract": {
|
|
6209
|
+
"type": "object",
|
|
6210
|
+
"properties": {
|
|
6211
|
+
"era": {
|
|
6212
|
+
"type": "string",
|
|
6213
|
+
"description": "modern / republican / historical / fantasy(也收中文「现代 / 民国 / 古代 / 仙侠」)"
|
|
6214
|
+
},
|
|
6215
|
+
"positive": {
|
|
6216
|
+
"type": "array",
|
|
6217
|
+
"items": {
|
|
6218
|
+
"type": "string"
|
|
6219
|
+
},
|
|
6220
|
+
"description": "本场额外的正向约束(可留空,平台自带该档基线)"
|
|
6221
|
+
},
|
|
6222
|
+
"negative": {
|
|
6223
|
+
"type": "array",
|
|
6224
|
+
"items": {
|
|
6225
|
+
"type": "string"
|
|
6226
|
+
},
|
|
6227
|
+
"description": "本场额外的禁止项(可留空)"
|
|
6228
|
+
}
|
|
6229
|
+
},
|
|
6230
|
+
"required": [
|
|
6231
|
+
"era"
|
|
6232
|
+
],
|
|
6233
|
+
"additionalProperties": false
|
|
5911
6234
|
}
|
|
5912
6235
|
}
|
|
5913
6236
|
}
|
|
@@ -6303,6 +6626,86 @@
|
|
|
6303
6626
|
}
|
|
6304
6627
|
}
|
|
6305
6628
|
},
|
|
6629
|
+
"/storyboards/{source_id}/extract-segment": {
|
|
6630
|
+
"post": {
|
|
6631
|
+
"operationId": "extract_segment_to_library",
|
|
6632
|
+
"summary": "把某一镜(或某集成片)的某个时间区间抽出来,存成可复用的素材,进我的素材库",
|
|
6633
|
+
"description": "把某一镜(或某集成片)的某个时间区间抽出来,存成可复用的素材,进我的素材库。免费(纯剪切,不走厂商)。典型用法:闪回/回忆蒙太奇——画面全用已有镜头,边际成本为 0。区间是相对**该来源视频**的秒数;末端超出片长会自动夹回来并在 span 里回显实际区间。同源同区间重复调用会命中内容哈希、复用已有素材(reused=true),不会在库里堆重复行。★别自己下载视频再用本地 ffmpeg 切——厂商产物的 GOP 长达 10s,按关键帧切必然偏,这里走的是平台已经趟平的精确切点。",
|
|
6634
|
+
"tags": [
|
|
6635
|
+
"storyboards"
|
|
6636
|
+
],
|
|
6637
|
+
"parameters": [
|
|
6638
|
+
{
|
|
6639
|
+
"name": "source_id",
|
|
6640
|
+
"in": "path",
|
|
6641
|
+
"required": true,
|
|
6642
|
+
"schema": {
|
|
6643
|
+
"type": "integer",
|
|
6644
|
+
"exclusiveMinimum": 0,
|
|
6645
|
+
"description": "storyboard_id 或 episode_id,与 source_kind 对应"
|
|
6646
|
+
}
|
|
6647
|
+
}
|
|
6648
|
+
],
|
|
6649
|
+
"requestBody": {
|
|
6650
|
+
"required": true,
|
|
6651
|
+
"content": {
|
|
6652
|
+
"application/json": {
|
|
6653
|
+
"schema": {
|
|
6654
|
+
"type": "object",
|
|
6655
|
+
"properties": {
|
|
6656
|
+
"start_sec": {
|
|
6657
|
+
"type": "number",
|
|
6658
|
+
"minimum": 0,
|
|
6659
|
+
"description": "区间起点(秒,相对该来源视频)"
|
|
6660
|
+
},
|
|
6661
|
+
"end_sec": {
|
|
6662
|
+
"type": "number",
|
|
6663
|
+
"exclusiveMinimum": 0,
|
|
6664
|
+
"description": "区间终点(秒);超出片长会被夹回来"
|
|
6665
|
+
},
|
|
6666
|
+
"name": {
|
|
6667
|
+
"type": "string"
|
|
6668
|
+
},
|
|
6669
|
+
"tags": {
|
|
6670
|
+
"type": "string"
|
|
6671
|
+
}
|
|
6672
|
+
},
|
|
6673
|
+
"required": [
|
|
6674
|
+
"start_sec",
|
|
6675
|
+
"end_sec"
|
|
6676
|
+
]
|
|
6677
|
+
}
|
|
6678
|
+
}
|
|
6679
|
+
}
|
|
6680
|
+
},
|
|
6681
|
+
"responses": {
|
|
6682
|
+
"200": {
|
|
6683
|
+
"description": "StarReel envelope",
|
|
6684
|
+
"content": {
|
|
6685
|
+
"application/json": {
|
|
6686
|
+
"schema": {
|
|
6687
|
+
"type": "object",
|
|
6688
|
+
"properties": {
|
|
6689
|
+
"code": {
|
|
6690
|
+
"type": "integer"
|
|
6691
|
+
},
|
|
6692
|
+
"message": {
|
|
6693
|
+
"type": "string"
|
|
6694
|
+
},
|
|
6695
|
+
"data": {
|
|
6696
|
+
"description": "Operation result payload"
|
|
6697
|
+
}
|
|
6698
|
+
}
|
|
6699
|
+
}
|
|
6700
|
+
}
|
|
6701
|
+
}
|
|
6702
|
+
},
|
|
6703
|
+
"402": {
|
|
6704
|
+
"description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
|
|
6705
|
+
}
|
|
6706
|
+
}
|
|
6707
|
+
}
|
|
6708
|
+
},
|
|
6306
6709
|
"/storyboards/{storyboard_id}": {
|
|
6307
6710
|
"put": {
|
|
6308
6711
|
"operationId": "update_shot",
|
|
@@ -6862,8 +7265,8 @@
|
|
|
6862
7265
|
"/storyboards/{storyboard_id}/name-card": {
|
|
6863
7266
|
"put": {
|
|
6864
7267
|
"operationId": "set_shot_name_card",
|
|
6865
|
-
"summary": "
|
|
6866
|
-
"description": "
|
|
7268
|
+
"summary": "给某一镜加/改/清「版式字卡」(终拼时烧进成片,含预览一致的书法字体与朱红印章)",
|
|
7269
|
+
"description": "给某一镜加/改/清「版式字卡」(终拼时烧进成片,含预览一致的书法字体与朱红印章)。name 传空字符串=清除本镜字卡。免费(纯数据,填了就显示)。两种用法:①不填 orient/placement/font_size = 角色名卡(画面侧边单列竖排人物名,适合群像出场镜);②填了其中任意一个 = 通用版式字卡,name 可以是**整句台词或旁白**(按标点自动切列、按最高列拟合字号)。placement=\"auto\" 会按背景亮度与粗糙度自动挑位置(躲开人脸/亮部);orient=\"auto\" 在背景太花时自动回退横排。★别自己下载视频叠字再上传——那会绕开渲染机字体与印章素材,预览/成片不一致。",
|
|
6867
7270
|
"tags": [
|
|
6868
7271
|
"storyboards"
|
|
6869
7272
|
],
|
|
@@ -6887,7 +7290,7 @@
|
|
|
6887
7290
|
"properties": {
|
|
6888
7291
|
"name": {
|
|
6889
7292
|
"type": "string",
|
|
6890
|
-
"description": "
|
|
7293
|
+
"description": "字卡正文(人物名,或版式模式下的任意文案/整句台词);空字符串=清除字卡"
|
|
6891
7294
|
},
|
|
6892
7295
|
"seal": {
|
|
6893
7296
|
"type": "string"
|
|
@@ -6902,6 +7305,25 @@
|
|
|
6902
7305
|
"duration_ms": {
|
|
6903
7306
|
"type": "integer",
|
|
6904
7307
|
"exclusiveMinimum": 0
|
|
7308
|
+
},
|
|
7309
|
+
"orient": {
|
|
7310
|
+
"type": "string",
|
|
7311
|
+
"enum": [
|
|
7312
|
+
"vertical",
|
|
7313
|
+
"horizontal",
|
|
7314
|
+
"auto"
|
|
7315
|
+
]
|
|
7316
|
+
},
|
|
7317
|
+
"placement": {
|
|
7318
|
+
"type": "string",
|
|
7319
|
+
"enum": [
|
|
7320
|
+
"fixed",
|
|
7321
|
+
"auto"
|
|
7322
|
+
]
|
|
7323
|
+
},
|
|
7324
|
+
"font_size": {
|
|
7325
|
+
"type": "integer",
|
|
7326
|
+
"exclusiveMinimum": 0
|
|
6905
7327
|
}
|
|
6906
7328
|
},
|
|
6907
7329
|
"required": [
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starreel/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.66",
|
|
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.66",
|
|
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.66",
|
|
12
12
|
"transport": {
|
|
13
13
|
"type": "stdio"
|
|
14
14
|
},
|