@starreel/mcp 0.1.94 → 0.1.96
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 +27 -0
- package/dist/tools/guide-data.js +1 -0
- package/dist/tools/produce.js +22 -3
- package/openapi.json +55 -8
- package/package.json +1 -1
- package/server.json +2 -2
package/SKILL.md
CHANGED
|
@@ -558,6 +558,14 @@ props in the wardrobe segment, missing `[SFX]`/`[BGM]`, group-shot head counts.
|
|
|
558
558
|
Storyboard-level issues do **not** need a script edit at all: use
|
|
559
559
|
`update_shot` / `replace_shot_dialogue`.
|
|
560
560
|
|
|
561
|
+
To audit a generated storyboard against the script (lines dropped? who says
|
|
562
|
+
what? which shots are key moments? where is the emotional valley?),
|
|
563
|
+
`get_storyboards` returns, per shot, `dialogue` (verbatim), `dialogue_lines`
|
|
564
|
+
(`{speaker, text}` per line — parsed by the same parser subtitles and voice-over
|
|
565
|
+
use, so the speaker you see is the one that will be voiced), `is_key_moment` and
|
|
566
|
+
`emotion_intensity`. One call covers the whole episode; the prompt bodies stay
|
|
567
|
+
per shot via `get_shot_prompts`.
|
|
568
|
+
|
|
561
569
|
When the frame or the motion is off in a way the business text cannot express,
|
|
562
570
|
edit the shot's prompt bodies directly: `get_shot_prompts` reads the current
|
|
563
571
|
`image_prompt` / `video_prompt` for one shot, `update_shot` writes them back.
|
|
@@ -959,6 +967,25 @@ to close") tells the vendor to fit that entire sequence into each 3-second shot.
|
|
|
959
967
|
`get_bgm_prompt_guide`, `replace_shot_dialogue`
|
|
960
968
|
- **Finish**: `compose_episode`, `get_final_cut`, `get_export`,
|
|
961
969
|
`generate_episode_poster`, `generate_cover`
|
|
970
|
+
- **What did this drama cost?** `get_drama_bill` — per kind `charged` / `refunded`
|
|
971
|
+
/ `net`. **`net` is the spend** (same number as the web "spent on this drama"
|
|
972
|
+
and `get_budget_status`); `charged` includes failed calls that were refunded
|
|
973
|
+
automatically, so never report it as cost. `in_flight` = charged, result not
|
|
974
|
+
out yet (the platform charges on submit and refunds on failure — there is no
|
|
975
|
+
separate hold). `rework.video` = second-and-later successful videos of the
|
|
976
|
+
same shot. `account_level` = voice clones / designs / auditions that belong to
|
|
977
|
+
no drama — listed separately, **not** in the drama's total. Build a cost
|
|
978
|
+
write-up from this, not from your own tally.
|
|
979
|
+
- **Every platform cut is versioned automatically.** Each `compose_episode` /
|
|
980
|
+
`rerender_episode` / multi-aspect render registers a `source=platform` entry in
|
|
981
|
+
`list_deliveries`: file sha256, and a manifest of what that render actually
|
|
982
|
+
used — per shot whether it was the raw clip, the composed clip, the re-voiced
|
|
983
|
+
clip or the lip-synced one (`source_kind`), which dialogue / music / SFX files,
|
|
984
|
+
subtitle count and text hash, plus the dialogue-audit tally at that moment.
|
|
985
|
+
Write delivery notes and "which version did we ship" answers **from that
|
|
986
|
+
manifest**, not from memory — notes written for v1 silently go stale by v4.
|
|
987
|
+
Platform entries never become the current delivery on their own;
|
|
988
|
+
`set_current_delivery` the one the customer actually gets.
|
|
962
989
|
- **Delivered a cut you finished outside the platform** (re-voiced lines, trims,
|
|
963
990
|
an ending card, music): `register_external_delivery` the exact file you hand to
|
|
964
991
|
the customer — **every time**, including revisions. Otherwise the platform's
|
package/dist/tools/guide-data.js
CHANGED
|
@@ -274,6 +274,7 @@ export const QA_TOOLS = [
|
|
|
274
274
|
{ symptom: '要跑全集 / 想知道整部剧有多少问题、该先修哪几集', run: 'run_drama_precheck', then: ['run_precheck(对 attention 里那几集拿逐条明细)', 'plan_precheck_fix', 'update_shot'] },
|
|
275
275
|
{ symptom: '场景图(空景基板)不对 / 重出还是同一类图', run: 'get_scene_prompt', then: ['update_scene(改 image_prompt 正文——只改地点/时段是让平台重拼,拧不过来)', 'regenerate_scene_image(单场重出,覆盖旧图)', 'upload_scene_image(客户自有实拍/外部精修图)', 'generate_shot_frame(下游镜头帧不会自动跟着重出)'] },
|
|
276
276
|
{ symptom: '整集健康度 / 缺镜 / 进度', run: 'get_pipeline_status', then: ['get_health_report', 'review_all', 'get_storyboards', 'get_jobs', 'get_run_status', 'get_autofill_status(导入/一键填空的后台补全进度)'] },
|
|
277
|
+
{ symptom: '拆完分镜想核对台词有没有丢 / 谁说的 / 哪几镜是关键镜 / 情绪曲线', run: 'get_storyboards(每镜 dialogue_lines/is_key_moment/emotion_intensity,整集一次拿)', then: ['review_storyboards', 'update_shot(补漏句/改台词,改完回 get_storyboards 核对)', 'get_shot_prompts(看某镜画面与首尾帧提示词)'] },
|
|
277
278
|
{ symptom: '预算 / 余额', run: 'get_budget_status', then: ['get_cost_estimate'] },
|
|
278
279
|
];
|
|
279
280
|
export const OPTIONAL_BOOSTS = [
|
package/dist/tools/produce.js
CHANGED
|
@@ -514,6 +514,11 @@ export function registerProduceTools(server, client) {
|
|
|
514
514
|
quote_id, review_token, acknowledge_review, ...(confirm_replace ? { confirm_replace } : {}),
|
|
515
515
|
})));
|
|
516
516
|
server.tool('get_storyboards', '读某一集的分镜列表(供审阅/查进度)。含每镜首帧(first_frame_image)与视频(video_url)是否就绪。' +
|
|
517
|
+
'★每镜带**台词与说话人**:dialogue(原文,无台词为 null)、dialogue_lines([{speaker,text}] 逐行,' +
|
|
518
|
+
'与字幕/配音同一个解析器拆的——这里的 speaker 就是成片里被配音的那个;舞台提示已剥),' +
|
|
519
|
+
'以及 is_key_moment(1=关键镜,走高端图模)与 emotion_intensity(1-10)。' +
|
|
520
|
+
'核对「台词有没有丢/谁说的/关键镜是哪几镜/情绪曲线」用这一次调用即可,不用逐镜拉;update_shot 改完台词也在这里核对。' +
|
|
521
|
+
'画面/视频/首尾帧提示词仍只在 get_shot_prompts 逐镜读。' +
|
|
517
522
|
'★每镜还带**结构化状态**:frame_status/video_status(ready/pending/authorizing/rejected/failed/none/not_required)、' +
|
|
518
523
|
'★not_required=旁白/片尾卡镜:帧与视频由成片层渲染,本镜不需要生成——数补齐进度时把它当已完成,别重试。' +
|
|
519
524
|
'fail_reason(sensitive/text_sensitive/copyright/face_mismatch/account_overdue/quota_full/authorizing/' +
|
|
@@ -745,7 +750,8 @@ export function registerProduceTools(server, client) {
|
|
|
745
750
|
}, async ({ episode_id, force }) => jsonResult(await client.producePost(`/episodes/${episode_id}/compose`, force ? { force: true } : {})));
|
|
746
751
|
server.tool('get_final_cut', '查某一集成片状态与下载链接。status=completed 时返回 download_url(我方 COS 直链,可直接下载)。免费。' +
|
|
747
752
|
'★bgm_stale=true 表示配乐在成片之后生成/改动、尚未进成片:重新 compose_episode(免费)即可,别用 re-render。' +
|
|
748
|
-
'
|
|
753
|
+
'★若设过当前交付版(register_external_delivery 登记的外部版,或 set_current_delivery 指定的平台版),另返回 delivery——那才是客户实际收到的一版;download_url 仍是平台最新一次拼的成片。' +
|
|
754
|
+
'要看每一版成片用了什么、哈希是多少,用 list_deliveries。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/final-cut`)));
|
|
749
755
|
server.tool('get_export', '查某一集导出/母版状态(成片终拼后的可下载母版)。免费。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/export`)));
|
|
750
756
|
server.tool('review_final_cut', '**成片体检**:导出前把整集过一遍——没出图的镜、字幕一屏放不下、人物没有身份锚、'
|
|
751
757
|
+ '镜头连续性(跳轴)、以及一次错别字通读。'
|
|
@@ -1062,8 +1068,14 @@ export function registerProduceTools(server, client) {
|
|
|
1062
1068
|
throw new Error('file_path 与 file_url 必须给一个');
|
|
1063
1069
|
return jsonResult(await client.producePost(`/episodes/${episode_id}/deliveries`, { file_url: url, note, manifest }));
|
|
1064
1070
|
});
|
|
1065
|
-
server.tool('list_deliveries', '
|
|
1066
|
-
|
|
1071
|
+
server.tool('list_deliveries', '列本集**所有成片版本**(新→旧,平台成片与外部交付共用一条版本号),每条含 sha256、时长、is_current 与完整清单。免费。' +
|
|
1072
|
+
'\n★source=platform:平台每出一版成片(compose_episode / rerender_episode / 多画幅)都会**自动登记**,清单记的是**渲染用的那份时间线**——' +
|
|
1073
|
+
'每镜用的是原片/合成片/换轨产物/口型产物(source_kind)、对白/配乐/音效各用了哪些文件、字幕条数与文本哈希、文件 sha256,' +
|
|
1074
|
+
'以及登记时刻的台词审计分族计数。写交付说明、核对「交出去的是哪一版」以它为准,别凭记忆。' +
|
|
1075
|
+
'平台版本**不会自动成为当前交付版**;客户选定哪一版,用 set_current_delivery 指过去。' +
|
|
1076
|
+
'\n★source=external:register_external_delivery 登记的外部后期成片。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/deliveries`)));
|
|
1077
|
+
server.tool('set_current_delivery', '把本集的某个成片版本设为当前交付版(例如客户最终选了较早的一版)。免费。平台版本(source=platform)与外部版本都可以设。' +
|
|
1078
|
+
'只影响 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`)));
|
|
1067
1079
|
server.tool('upload_shot_footage', '用**客户自有的整段视频**(录屏 / 产品实拍 / 第三方成片)直接当某镜的视频——实拍素材镜。' +
|
|
1068
1080
|
'登记后该镜不再 AI 出图/出视频(generate_videos 会跳过它,单镜重生会被拒),终拼原样使用,镜头时长按素材真实长度回写,' +
|
|
1069
1081
|
'首/尾帧从素材抽帧供帧链与预览用。免费。适用:宣传片里的到账界面录屏、后台大屏实录、产品实拍、客户已有的成片片段。' +
|
|
@@ -1370,6 +1382,13 @@ export function registerProduceTools(server, client) {
|
|
|
1370
1382
|
// ========== P1 · 任务进度 + 成本/预算 ==========
|
|
1371
1383
|
server.tool('get_jobs', '查一部剧的任务队列进度(出图/出视频/合成各阶段的 pending/processing/done/failed)。' +
|
|
1372
1384
|
'异步生成后用它看进度。免费。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/jobs`)));
|
|
1385
|
+
server.tool('get_drama_bill', '本剧净费用账单(免费)。核账、回答「到底花了多少、钱花在哪、退了多少」时用它,别自己拼流水。' +
|
|
1386
|
+
'\n· totals / by_kind:每类 charged(扣费)、refunded(已退回)、net(净额)、charges/refunds(笔数)。' +
|
|
1387
|
+
'**net 才是花费**,与网页「本剧已花费」、get_budget_status 同源;charged 含失败后自动退回的空转,只用于核账。' +
|
|
1388
|
+
'\n· in_flight:已扣费、结果还没出的任务(平台是提交即扣、失败再退,没有单独的预扣)。' +
|
|
1389
|
+
'\n· rework.video:同一镜第 2 次起的成功出片(返工);出图不计(首帧/尾帧/best-of-N 候选本来就是同镜多张)。' +
|
|
1390
|
+
'\n· account_level:音色库克隆/设计/试听等**不属于任何一部剧**的语音扣费,单列、counted_in_drama=false,不计入本剧。' +
|
|
1391
|
+
'\n· available=false:账本暂时不可达,不给数字(不拿估算冒充),稍后重试。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/bill`)));
|
|
1373
1392
|
server.tool('get_cost_estimate', '查一部剧的整体成本预估(点数)。免费。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/cost-estimate`)));
|
|
1374
1393
|
server.tool('get_budget_status', '查一部剧的预算状态(预算/已花费/剩余)。免费。' +
|
|
1375
1394
|
'spent 与网页「本剧已花费」同源(平台扣费账本净额,已减退款),by_kind 为按类分项(ai_image/ai_video/ai_text/ai_music/tts_local…)。' +
|
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.96",
|
|
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.96 tool surface (operationIds match MCP tool names 1:1)."
|
|
7
7
|
},
|
|
8
8
|
"servers": [
|
|
9
9
|
{
|
|
@@ -1301,6 +1301,53 @@
|
|
|
1301
1301
|
}
|
|
1302
1302
|
}
|
|
1303
1303
|
},
|
|
1304
|
+
"/dramas/{drama_id}/bill": {
|
|
1305
|
+
"get": {
|
|
1306
|
+
"operationId": "get_drama_bill",
|
|
1307
|
+
"summary": "本剧净费用账单(免费)",
|
|
1308
|
+
"description": "本剧净费用账单(免费)。核账、回答「到底花了多少、钱花在哪、退了多少」时用它,别自己拼流水。\n· totals / by_kind:每类 charged(扣费)、refunded(已退回)、net(净额)、charges/refunds(笔数)。**net 才是花费**,与网页「本剧已花费」、get_budget_status 同源;charged 含失败后自动退回的空转,只用于核账。\n· in_flight:已扣费、结果还没出的任务(平台是提交即扣、失败再退,没有单独的预扣)。\n· rework.video:同一镜第 2 次起的成功出片(返工);出图不计(首帧/尾帧/best-of-N 候选本来就是同镜多张)。\n· account_level:音色库克隆/设计/试听等**不属于任何一部剧**的语音扣费,单列、counted_in_drama=false,不计入本剧。\n· available=false:账本暂时不可达,不给数字(不拿估算冒充),稍后重试。",
|
|
1309
|
+
"tags": [
|
|
1310
|
+
"dramas"
|
|
1311
|
+
],
|
|
1312
|
+
"parameters": [
|
|
1313
|
+
{
|
|
1314
|
+
"name": "drama_id",
|
|
1315
|
+
"in": "path",
|
|
1316
|
+
"required": true,
|
|
1317
|
+
"schema": {
|
|
1318
|
+
"type": "integer",
|
|
1319
|
+
"exclusiveMinimum": 0
|
|
1320
|
+
}
|
|
1321
|
+
}
|
|
1322
|
+
],
|
|
1323
|
+
"responses": {
|
|
1324
|
+
"200": {
|
|
1325
|
+
"description": "StarReel envelope",
|
|
1326
|
+
"content": {
|
|
1327
|
+
"application/json": {
|
|
1328
|
+
"schema": {
|
|
1329
|
+
"type": "object",
|
|
1330
|
+
"properties": {
|
|
1331
|
+
"code": {
|
|
1332
|
+
"type": "integer"
|
|
1333
|
+
},
|
|
1334
|
+
"message": {
|
|
1335
|
+
"type": "string"
|
|
1336
|
+
},
|
|
1337
|
+
"data": {
|
|
1338
|
+
"description": "Operation result payload"
|
|
1339
|
+
}
|
|
1340
|
+
}
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
}
|
|
1344
|
+
},
|
|
1345
|
+
"402": {
|
|
1346
|
+
"description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
|
|
1347
|
+
}
|
|
1348
|
+
}
|
|
1349
|
+
}
|
|
1350
|
+
},
|
|
1304
1351
|
"/dramas/{drama_id}/budget-status": {
|
|
1305
1352
|
"get": {
|
|
1306
1353
|
"operationId": "get_budget_status",
|
|
@@ -3326,8 +3373,8 @@
|
|
|
3326
3373
|
"/episodes/{episode_id}/deliveries": {
|
|
3327
3374
|
"get": {
|
|
3328
3375
|
"operationId": "list_deliveries",
|
|
3329
|
-
"summary": "
|
|
3330
|
-
"description": "
|
|
3376
|
+
"summary": "列本集**所有成片版本**(新→旧,平台成片与外部交付共用一条版本号),每条含 sha256、时长、is_current 与完整清单",
|
|
3377
|
+
"description": "列本集**所有成片版本**(新→旧,平台成片与外部交付共用一条版本号),每条含 sha256、时长、is_current 与完整清单。免费。\n★source=platform:平台每出一版成片(compose_episode / rerender_episode / 多画幅)都会**自动登记**,清单记的是**渲染用的那份时间线**——每镜用的是原片/合成片/换轨产物/口型产物(source_kind)、对白/配乐/音效各用了哪些文件、字幕条数与文本哈希、文件 sha256,以及登记时刻的台词审计分族计数。写交付说明、核对「交出去的是哪一版」以它为准,别凭记忆。平台版本**不会自动成为当前交付版**;客户选定哪一版,用 set_current_delivery 指过去。\n★source=external:register_external_delivery 登记的外部后期成片。",
|
|
3331
3378
|
"tags": [
|
|
3332
3379
|
"episodes"
|
|
3333
3380
|
],
|
|
@@ -3373,8 +3420,8 @@
|
|
|
3373
3420
|
"/episodes/{episode_id}/deliveries/{delivery_id}/current": {
|
|
3374
3421
|
"post": {
|
|
3375
3422
|
"operationId": "set_current_delivery",
|
|
3376
|
-
"summary": "
|
|
3377
|
-
"description": "
|
|
3423
|
+
"summary": "把本集的某个成片版本设为当前交付版(例如客户最终选了较早的一版)",
|
|
3424
|
+
"description": "把本集的某个成片版本设为当前交付版(例如客户最终选了较早的一版)。免费。平台版本(source=platform)与外部版本都可以设。只影响 get_final_cut 的 delivery,不改平台成片。",
|
|
3378
3425
|
"tags": [
|
|
3379
3426
|
"episodes"
|
|
3380
3427
|
],
|
|
@@ -4316,7 +4363,7 @@
|
|
|
4316
4363
|
"get": {
|
|
4317
4364
|
"operationId": "get_final_cut",
|
|
4318
4365
|
"summary": "查某一集成片状态与下载链接",
|
|
4319
|
-
"description": "查某一集成片状态与下载链接。status=completed 时返回 download_url(我方 COS 直链,可直接下载)。免费。★bgm_stale=true 表示配乐在成片之后生成/改动、尚未进成片:重新 compose_episode(免费)即可,别用 re-render
|
|
4366
|
+
"description": "查某一集成片状态与下载链接。status=completed 时返回 download_url(我方 COS 直链,可直接下载)。免费。★bgm_stale=true 表示配乐在成片之后生成/改动、尚未进成片:重新 compose_episode(免费)即可,别用 re-render。★若设过当前交付版(register_external_delivery 登记的外部版,或 set_current_delivery 指定的平台版),另返回 delivery——那才是客户实际收到的一版;download_url 仍是平台最新一次拼的成片。要看每一版成片用了什么、哈希是多少,用 list_deliveries。",
|
|
4320
4367
|
"tags": [
|
|
4321
4368
|
"episodes"
|
|
4322
4369
|
],
|
|
@@ -6201,7 +6248,7 @@
|
|
|
6201
6248
|
"get": {
|
|
6202
6249
|
"operationId": "get_storyboards",
|
|
6203
6250
|
"summary": "读某一集的分镜列表(供审阅/查进度)",
|
|
6204
|
-
"description": "读某一集的分镜列表(供审阅/查进度)。含每镜首帧(first_frame_image)与视频(video_url)
|
|
6251
|
+
"description": "读某一集的分镜列表(供审阅/查进度)。含每镜首帧(first_frame_image)与视频(video_url)是否就绪。★每镜带**台词与说话人**:dialogue(原文,无台词为 null)、dialogue_lines([{speaker,text}] 逐行,与字幕/配音同一个解析器拆的——这里的 speaker 就是成片里被配音的那个;舞台提示已剥),以及 is_key_moment(1=关键镜,走高端图模)与 emotion_intensity(1-10)。核对「台词有没有丢/谁说的/关键镜是哪几镜/情绪曲线」用这一次调用即可,不用逐镜拉;update_shot 改完台词也在这里核对。画面/视频/首尾帧提示词仍只在 get_shot_prompts 逐镜读。★每镜还带**结构化状态**:frame_status/video_status(ready/pending/authorizing/rejected/failed/none/not_required)、★not_required=旁白/片尾卡镜:帧与视频由成片层渲染,本镜不需要生成——数补齐进度时把它当已完成,别重试。fail_reason(sensitive/text_sensitive/copyright/face_mismatch/account_overdue/quota_full/authorizing/insufficient_credits/transient/repeat_rejected/pair_collateral)、retryable(true=可重试;false=改内容换图,重试无效)、fail_hint(人读文案)。照 retryable 判该重试还是该改内容,别解析中文。★pair_collateral=同镜另一帧未通过、本帧随批结束——**本帧自身没被判不合格,别去改它**:有 reopen_pair_id 就用它只重掷有过错的一侧,否则直接重生本镜。★若某镜带 degraded_frames:[{frame_type,reason,reason_label,since,hint}],表示该帧是系统在同因连拒熔断后**放行**的(判据照记未拒),URL 上与干净帧无区别但需人工复核;不满意按 hint 修正输入后 generate_shot_frame 重生该帧。★terminal_desc_missing=true:该镜标为「状态改变」却三处都没说结束时什么样——**出尾帧前**就能看出来,现在整集一次拿到(此前只有 get_shot_prompts 能逐镜问,一集几十次没人会去问)。先 update_shot 把结束状态写进 last_frame_prompt 再出尾帧:照现状硬出的历史成功率 9.4%,写了终态的 40.2%,而每次被拒都照常扣费。确实该「几乎不变」的镜才用 generate_shot_frame 的 allow_missing_terminal 放行。★first_frame_source/last_frame_source='upload' 表示该帧是**外部上传图**(绕开了身份锚/画风锚/best-of-N/帧审计整条质量链路)——人物·服装·画风漂移排查先看这些镜;外部图导致的漂移不是平台生成质量问题,修复正路是删掉外部图改走 generate_shot_frame 平台重生。★若某镜带 reopen_pair_id:该镜首尾帧同时生成时只有一侧真的有问题、另一侧是无辜陪拒,原样传给 generate_shot_frame 的 reopen_pair_id 参数可以只重掷有问题的那一侧(省一半算力/费用,不会拿去生成一张这次根本没打算重做的图)。没有这个字段就按 fail_reason/retryable 走常规重试。免费。",
|
|
6205
6252
|
"tags": [
|
|
6206
6253
|
"episodes"
|
|
6207
6254
|
],
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starreel/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.96",
|
|
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.96",
|
|
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.96",
|
|
12
12
|
"transport": {
|
|
13
13
|
"type": "stdio"
|
|
14
14
|
},
|