@starreel/mcp 0.1.150 → 0.1.153
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 +24 -0
- package/dist/i18n/tools.zh-CN.json +8 -7
- package/dist/tools/produce.js +51 -8
- package/openapi.json +160 -12
- package/package.json +1 -1
- package/server.json +2 -2
package/dist/tools/produce.js
CHANGED
|
@@ -131,6 +131,8 @@ export const WORKFLOW_HINT = '★三档执行策略(别把三档混着问客户)
|
|
|
131
131
|
'出视频后同样看 video_status;成片前用 get_pipeline_status 确认没有缺镜。' +
|
|
132
132
|
'★**禁止一路 generate 到底**:不审查就连推的做法,问题会在每一层被放大,最后整集废掉重来——' +
|
|
133
133
|
'而重来的每一次出图/出视频都是真扣费。审查全部免费,拦下来一分钱不花。' +
|
|
134
|
+
'★换服装改的是结构化绑定:update_shot 的 active_wardrobe_id(整镜)/ appearance_wardrobes(多人逐角色),可覆盖、可清空——' +
|
|
135
|
+
'改文字描述不换衣服,也不用让客户去网页改。' +
|
|
134
136
|
'②【产线主干·按序不跳步·★先分镜再建资产】set_script→rewrite_script→★review_script→extract_assets→storyboards(先分镜·纯文本拆镜)→★review_storyboards→' +
|
|
135
137
|
'★剧本纪律(端点强制,绕不过):原始素材(梗概/大纲/成品稿都算)一律放 set_script,**必须经 rewrite_script 产出 AI 改写稿**——' +
|
|
136
138
|
'把自己写好的剧本直接贴进 edit_rewritten_script 绕过改写会被 400 拒(没有改写稿就没有可改的对象),extract_assets 同样要求基于改写稿。' +
|
|
@@ -619,9 +621,11 @@ export function registerProduceTools(server, client) {
|
|
|
619
621
|
'原样传给 generate_shot_frame 的 reopen_pair_id 参数可以只重掷有问题的那一侧(省一半算力/费用,' +
|
|
620
622
|
'不会拿去生成一张这次根本没打算重做的图)。没有这个字段就按 fail_reason/retryable 走常规重试。免费。' +
|
|
621
623
|
'★每镜还带**绑定**(只有 ID):character_ids(本镜绑定的角色)、character_bindings[{character_id,presence}]' +
|
|
622
|
-
'(presence=on_screen 在画面 / voice_only 只有声音、不进画面)、scene_id、prop_ids、active_wardrobe_id
|
|
624
|
+
'(presence=on_screen 在画面 / voice_only 只有声音、不进画面)、scene_id、prop_ids、active_wardrobe_id(整镜服装)、' +
|
|
625
|
+
'appearance_wardrobes[{character_id,wardrobe_id}](逐角色服装锚,只列声明了服装的角色)。' +
|
|
623
626
|
'出图注入谁的定妆图/哪张场景图/哪些道具图由这几项决定;角色名对照 get_characters、道具名对照 get_props。' +
|
|
624
627
|
'改绑用 update_shot 的 character_ids(★全量覆盖,先从这里读现值再改,漏传即解绑)与 character_presence;' +
|
|
628
|
+
'改服装用 update_shot 的 active_wardrobe_id / appearance_wardrobes(可覆盖、可传 null 清空);' +
|
|
625
629
|
'改完再读一次本工具核对。character_bindings 缺席 = 这次没读到(不是没绑),空数组才是没绑。' +
|
|
626
630
|
'★启用双边版本审核时,seam_review.status 为 passed/failed/not_checked/stale;stale 是证据过期,不是画面失败,不据此付费重生。continuity_intent 可用 update_shot 明确。' +
|
|
627
631
|
'★每镜带 **seam_state**(本镜与上一镜的镜间接缝,与官网帧时间线同一判据):' +
|
|
@@ -1021,16 +1025,28 @@ export function registerProduceTools(server, client) {
|
|
|
1021
1025
|
+ '只改文字、不改绑定,出图照旧穿原来那身。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/wardrobe-timeline`, {})));
|
|
1022
1026
|
server.tool('apply_wardrobe_timeline', '把客户勾选的换装建议落库(第②步,免费)。改的是每镜的 **active_wardrobe_id 结构化绑定**,'
|
|
1023
1027
|
+ '不是文字描述——这正是「改了 update_shot 的文字却不生效」那个坑的正解。\n'
|
|
1024
|
-
+ '
|
|
1025
|
-
+ '
|
|
1028
|
+
+ '★items 只要 {storyboard_id, wardrobe_id}:可以传 build 给的建议(只传客户点头的),'
|
|
1029
|
+
+ '也可以**不跑 build、手工指定**(客户点名「这几镜换成这件」时直接传,免得为一次指定花 LLM 的钱)。一次最多 200 条。\n'
|
|
1030
|
+
+ '★改单镜、或要**清空**绑定,用 update_shot 的 active_wardrobe_id(传 null 清空);本工具只能设、不能清。\n'
|
|
1031
|
+
+ '★多角色同框的镜头单列装不下,那些走 update_shot 的 appearance_wardrobes(或本工具的多角色版 apply_wardrobe_appearances)。', {
|
|
1026
1032
|
episode_id: z.number().int().positive(),
|
|
1027
|
-
items: z.array(z.
|
|
1033
|
+
items: z.array(z.object({
|
|
1034
|
+
storyboard_id: z.number().int().positive().describe('本集里的镜头 id'),
|
|
1035
|
+
wardrobe_id: z.number().int().positive().describe('服装资产 id(list_wardrobe 查;必须是本剧的)'),
|
|
1036
|
+
})).min(1).max(200).describe('[{storyboard_id, wardrobe_id}]。build 的建议或手工指定都行'),
|
|
1028
1037
|
}, async ({ episode_id, items }) => jsonResult(await client.producePost(`/episodes/${episode_id}/wardrobe-timeline/apply`, { items })));
|
|
1029
1038
|
server.tool('apply_wardrobe_appearances', '逐角色回填 appearances 的服装绑定(第②步的多角色版,免费)。'
|
|
1030
1039
|
+ '用于**多角色同框**的镜头:单个 active_wardrobe_id 装不下几个人各穿各的,'
|
|
1031
|
-
+ '
|
|
1040
|
+
+ '这条按角色逐个绑。items 可以是 build 的建议,也可以手工指定;一次最多 200 条。\n'
|
|
1041
|
+
+ '★它是**补空位**:该角色在这一镜已有服装选择的会被跳过(绝不覆盖);角色在这一镜必须已有出场条目,'
|
|
1042
|
+
+ '同一角色在一镜出现两次(同源分身)也跳过。要**覆盖改错的、清空、或给还没有出场条目的已绑定角色设服装**,'
|
|
1043
|
+
+ '用 update_shot 的 appearance_wardrobes(逐镜,显式覆盖,wardrobe_id:null 清空)。回执的 skipped/errors 要看。', {
|
|
1032
1044
|
episode_id: z.number().int().positive(),
|
|
1033
|
-
items: z.array(z.
|
|
1045
|
+
items: z.array(z.object({
|
|
1046
|
+
storyboard_id: z.number().int().positive().describe('本集里的镜头 id'),
|
|
1047
|
+
character_id: z.number().int().positive().describe('该镜里的角色 id'),
|
|
1048
|
+
wardrobe_id: z.number().int().positive().describe('该角色自己的服装资产 id(list_wardrobe 查)'),
|
|
1049
|
+
})).min(1).max(200).describe('[{storyboard_id, character_id, wardrobe_id}]。build 的建议或手工指定都行'),
|
|
1034
1050
|
}, async ({ episode_id, items }) => jsonResult(await client.producePost(`/episodes/${episode_id}/wardrobe-timeline/apply-appearances`, { items })));
|
|
1035
1051
|
server.tool('get_world_state', '读本集的**世界状态账本**:被追踪的实体(道具/服装/伤痕一类)在各镜之间的状态,'
|
|
1036
1052
|
+ '以及对不上的地方(conflicts,带命中的两个镜号)。免费。'
|
|
@@ -1512,9 +1528,12 @@ export function registerProduceTools(server, client) {
|
|
|
1512
1528
|
const suffix = qs.toString() ? `?${qs.toString()}` : '';
|
|
1513
1529
|
return jsonResult(await client.produceGet(`/episodes/${episode_id}/dialogue-coverage${suffix}`));
|
|
1514
1530
|
});
|
|
1515
|
-
server.tool('update_shot', '逐镜编辑:改单个分镜的文本内容(景别/动作/台词/画面描述/运镜等)、面部表情(expression_hint)、时长(duration)、成片变速(speed_factor)、角色绑定(character_ids)
|
|
1531
|
+
server.tool('update_shot', '逐镜编辑:改单个分镜的文本内容(景别/动作/台词/画面描述/运镜等)、面部表情(expression_hint)、时长(duration)、成片变速(speed_factor)、角色绑定(character_ids)、画外音标记(character_presence)与服装绑定(active_wardrobe_id / appearance_wardrobes)。只传要改的字段、其余不动。★改镜(成功或被拒)都会作废覆盖本镜的未消费报价,生成时回 409 QUOTE_INVALIDATED——先改成功、回读核对,再报价。' +
|
|
1516
1532
|
'**免费**(纯文本写库)。★改 dialogue 会自动失效本镜已生成的 TTS 配音与字幕(需重出 tts);' +
|
|
1517
|
-
'改文本不会自动重出图/视频,如需让画面跟上文本改动,改完再 regen 对应镜。用 get_storyboards 查改后结果(每镜带 character_ids / character_bindings / scene_id / prop_ids)。' +
|
|
1533
|
+
'改文本不会自动重出图/视频,如需让画面跟上文本改动,改完再 regen 对应镜。用 get_storyboards 查改后结果(每镜带 character_ids / character_bindings / scene_id / prop_ids / active_wardrobe_id / appearance_wardrobes)。' +
|
|
1534
|
+
'★★【换衣服改这里,不是改文字】出图穿什么由**服装绑定**决定:单人镜用 active_wardrobe_id(整镜一件),' +
|
|
1535
|
+
'多人同框各穿各的用 appearance_wardrobes(逐角色)。把「穿某某衣服」写进 description/action 不会换衣服。' +
|
|
1536
|
+
'服装 id 用 list_wardrobe 查;改完不会自动重出图,要让画面跟上需重生本镜首帧再重生视频。' +
|
|
1518
1537
|
'★★原声镜(厂商原生音频)改 dialogue 后,本镜视频会被标记「待重生」——因为台词是**烤进视频人声**的,' +
|
|
1519
1538
|
'不重生就终拼,成片里念的仍是改动前的台词(典型现象:台词像是跑到了别的镜头上)。' +
|
|
1520
1539
|
'compose_episode 会以 advisory `stale_video_after_edit` 列出这些镜;正确处置是先 regenerate_shot_video 再终拼。' +
|
|
@@ -1542,6 +1561,19 @@ export function registerProduceTools(server, client) {
|
|
|
1542
1561
|
'出图时他的定妆图、人脸锁、站位、主体脸锚全部跳过,台词与配音不受影响;on_screen = 恢复在画面。' +
|
|
1543
1562
|
'角色必须在本镜绑定里(可与 character_ids 同一请求,先改绑再标)。只列要改的角色,没列的不动(空数组 = 不改任何标记)。' +
|
|
1544
1563
|
'★完全没出现在画面、台词也不是他说的 → 直接从 character_ids 去掉,不用标 voice_only'),
|
|
1564
|
+
active_wardrobe_id: z.number().int().positive().nullable().optional()
|
|
1565
|
+
.describe('整镜服装绑定(服装资产 id,list_wardrobe 查,必须是本剧的);null = 清空(回到按角色自动匹配)。' +
|
|
1566
|
+
'单人镜换衣服用它;直接覆盖现值。多人同框它只装得下一件(会被当成那件服装所属角色的),各穿各的用 appearance_wardrobes'),
|
|
1567
|
+
appearance_wardrobes: z.array(z.object({
|
|
1568
|
+
character_id: z.number().int().positive(),
|
|
1569
|
+
wardrobe_id: z.number().int().positive().nullable(),
|
|
1570
|
+
})).min(1).optional()
|
|
1571
|
+
.describe('逐角色服装绑定:[{character_id, wardrobe_id}],wardrobe_id=null 清空该角色的服装锚。' +
|
|
1572
|
+
'**显式覆盖**已有选择(apply_wardrobe_appearances 只补空位、改不回改错的,改错了用这里)。只列要改的角色,没列的不动。' +
|
|
1573
|
+
'角色必须在本镜绑定里(可与 character_ids 同一请求);服装必须是本剧里**该角色自己的**(别集专属的不行),否则 400 且本请求一个字段都不写。' +
|
|
1574
|
+
'同一角色在本镜出现两次(同源分身)不猜,400。★本镜的整镜绑定 active_wardrobe_id 若是你点名角色的另一件,出图时它优先、会遮住逐角色服装 ⇒ 409 WARDROBE_SHADOWED_BY_ACTIVE,同一请求加 active_wardrobe_id:null 即可。' +
|
|
1575
|
+
'出场数据是旧格式时 409 APPEARANCES_NONCANONICAL(一字不写),单人镜改用 active_wardrobe_id。回执带 appearance_wardrobes(现值)与 appearance_wardrobes_effective:' +
|
|
1576
|
+
'false = 已落库但本剧尚未开启逐角色服装读取(灰度),出图暂不按它选——单人镜请改用 active_wardrobe_id'),
|
|
1545
1577
|
title: z.string().optional().describe('镜头标题'),
|
|
1546
1578
|
description: z.string().optional().describe('画面描述'),
|
|
1547
1579
|
shot_type: z.string().optional().describe('景别(如 特写/中景/全景/远景)'),
|
|
@@ -1575,6 +1607,17 @@ export function registerProduceTools(server, client) {
|
|
|
1575
1607
|
const payload = Object.fromEntries(Object.entries(fields).filter(([, v]) => v !== undefined));
|
|
1576
1608
|
return jsonResult(await client.producePut(`/storyboards/${storyboard_id}`, payload));
|
|
1577
1609
|
});
|
|
1610
|
+
server.tool('rederive_shot_contract', '按本镜**当前**的正文与角色绑定,让平台重新推导构图契约(画面里可见几人、主体是人物还是局部/道具、景别)。' +
|
|
1611
|
+
'契约本身不对外,读不到也改不了;本工具只回结论 outcome:updated(已改并生效)/ unchanged(推出来和原来一样)/ ' +
|
|
1612
|
+
'rejected(推出来自相矛盾,未采用,原契约保留)/ no_candidate(没拿到可用结果,原契约保留)/ ' +
|
|
1613
|
+
'stale(推导期间本镜又被改过,结果未写入,改完再调一次),附 note 说下一步。点数不足回 402。' +
|
|
1614
|
+
'★什么时候用:出图/预检/审核反复说人数不对、局部镜(手部/道具特写)被当成完整人物出图或审核,' +
|
|
1615
|
+
'而你已经改过正文或绑定——补全器只填空、不覆盖已有契约,不调本工具改动不会进契约。' +
|
|
1616
|
+
'★正确顺序:先 update_shot 把画面写对(谁在画面里、谁只出声音用 character_presence 标 voice_only、' +
|
|
1617
|
+
'不该出现的人从 character_ids 解绑),再调本工具;不改正文直接调多半回 unchanged。' +
|
|
1618
|
+
'★一次文本 AI 调用,按 token 后付(与 autofill_storyboards 同链路),调用前告知客户。' +
|
|
1619
|
+
'★只改契约这一个字段,不碰台词/提示词/其它专业字段;已出的首尾帧不会自动重出,要让画面跟上需对本镜重新出帧(先报价)。' +
|
|
1620
|
+
'★updated 会作废本镜及同集未消费的出帧/出视频报价,之后要重新报价。', { storyboard_id: z.number().int().positive() }, async ({ storyboard_id }) => jsonResult(await client.producePost(`/storyboards/${storyboard_id}/rederive-contract`, {})));
|
|
1578
1621
|
server.tool('get_shot_prompts', '读某一镜的四条提示词**正文**(image_prompt=首帧画面 / video_prompt=动态表演 / ' +
|
|
1579
1622
|
'first_frame_prompt=开始时什么样 / last_frame_prompt=结束时什么样),供直接微调后用 update_shot 写回。免费。' +
|
|
1580
1623
|
'★回执里的 terminal_desc_missing=true 表示本镜标为「状态改变」却三处都没说终态——' +
|