@starreel/mcp 0.1.29 → 0.1.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/SKILL.md CHANGED
@@ -122,6 +122,16 @@ content that will be rejected.
122
122
  reveal), via `generate_frames` with `frame_type=last_frame` or, for a single
123
123
  shot, `generate_shot_frame`. `generate_videos` needs at
124
124
  least one first frame in the episode.
125
+ **Image model**: images use a drama-level model (default **Nano Banana 2** =
126
+ `gemini-3.1-flash-image`), set via `create_drama` / `update_project_settings`
127
+ field `image_model` for one consistent look across the whole drama;
128
+ `generate_frames` / `generate_shot_frame` may override per call. Options:
129
+ `gemini-3-pro-image` (Nano Banana Pro, finer, pricier), `gemini-3.1-flash-lite-image`
130
+ (Lite, cheap), `doubao-seedream-5-0-260128` (Seedream 5.0), `gpt-image-2`.
131
+ **Images are slow** (tens of seconds to minutes each; a whole episode can take
132
+ 10+ min): poll `get_storyboards` and read `frame_status` — `pending` = still
133
+ generating (keep waiting, NEVER re-call generate_frames — that double-charges),
134
+ `ready` = done, `failed` = the only real failure. Never treat a slow image as failed.
125
135
 
126
136
  **Redraw on-platform, never off-platform.** When a shot's image is wrong,
127
137
  fix it with `quote_shot_frame` → `generate_shot_frame` (`frame_type`:
@@ -38,6 +38,9 @@ const WORKFLOW_HINT = '★三档执行策略(别把三档混着问客户):' +
38
38
  '别在出场景图前做场景 Bible。' +
39
39
  '★音频默认用视频原声(use_clip_audio 默认开、跳过 TTS 直接用 AI 视频自带声):' +
40
40
  '建剧/改设定时 AI 应主动告知客户「默认用视频原声,如需 TTS 配音把 use_clip_audio 设 false」,让客户选。' +
41
+ '★图片模型默认香蕉2(Nano Banana 2 = gemini-3.1-flash-image·整剧统一画风):create_drama/update_project_settings 的 image_model 设,不传即默认香蕉2;' +
42
+ '可选 gemini-3-pro-image(香蕉Pro·更精细·175点)/gemini-3.1-flash-lite-image(香蕉2 Lite·便宜·31点)/doubao-seedream-5-0-260128(Seedream5.0)/gpt-image-2(ChatGPT Image2);generate_frames 可临时覆盖某次。' +
43
+ '★图片生成慢≠失败:每张几十秒~数分钟、整集可能十几分钟,轮询 get_storyboards 看 frame_status——pending=还在生成(耐心等、别重复调 generate_frames 白花钱)、ready=完成、failed=才是真失败。' +
41
44
  '③【可选增强·AI 主动提示客户·报价确认才做】美术圣经生成/视觉锁抽取/色彩脚本/动作模板/场景图/场景组/口型/海报/音效/配乐/字幕翻译——' +
42
45
  '这些提升一致性/质量、大多收费。★AI 应主动告知客户这些可做并给报价,客户确认才跑;既不默默跳过、也不擅自扣费。' +
43
46
  '★两条锁定纪律:①**画幅比例**在 create_drama 即定、drama 级锁定,之后所有出图/出视频/成片都用它、**别中途改**' +
@@ -60,6 +63,10 @@ const VIDEO_RESOLUTIONS = ['480p', '720p', '1080p', '4k'];
60
63
  // 后端内部 PUT /dramas 已接受写库,facade 白名单 Wave3 已放行(produce-create-fields.ts)。
61
64
  // 不含内部产线/成本开关(strict_mode/best_of_n/shoppable/budget_points 等,需产品决策)。
62
65
  const PROJECT_SETTINGS_FIELDS = {
66
+ // drama 级图片模型(整剧统一画风):默认 Nano Banana 2(香蕉2)
67
+ image_model: z.string().optional().describe('图片模型(★drama级·整剧统一画风·默认香蕉2 Nano Banana 2)。可选:' +
68
+ 'gemini-3.1-flash-image(香蕉2·默认·71点)/gemini-3-pro-image(香蕉Pro·精细·175点)/gemini-3.1-flash-lite-image(香蕉2 Lite·31点)/' +
69
+ 'doubao-seedream-5-0-260128(Seedream 5.0)/gpt-image-2(ChatGPT Image 2)。建剧即定、整剧统一;generate_frames 可临时覆盖某次出图'),
63
70
  // 整剧视觉一致性锚(注入所有出图/视频 prompt,决定跨镜一致)
64
71
  cinematography_prompt: z.string().optional().describe('摄影DNA:镜头/镜片/光圈/调色一揽子,注入所有出图/视频prompt,整剧镜头一致'),
65
72
  art_bible: z.string().optional().describe('美术圣经:色调/材质/气质,注入所有生图prompt,统一视觉风格'),
@@ -204,12 +211,18 @@ export function registerProduceTools(server, client) {
204
211
  frame_type: FRAME_TYPE_ARG.optional().describe('默认 first_frame;last_frame=补尾帧;both=首尾都补'),
205
212
  }, async ({ episode_id, frame_type }) => jsonResult(await client.producePost(`/episodes/${episode_id}/frames/quote`, { frame_type })));
206
213
  server.tool('generate_frames', '确认后批量出帧:后台异步。用 get_storyboards 轮询,first_frame_image/last_frame_image 逐镜填充即完成。' +
214
+ '★图片生成较慢——每张几十秒到数分钟(尤其高清模型),整集可能十几分钟。轮询看 frame_status:' +
215
+ '**pending=还在生成(继续耐心等,别当失败、别重复调 generate_frames,重复触发=白花钱)**、' +
216
+ 'ready=完成、failed=才是真失败。别因为「等了一会儿还没出」就判定生成失败或重试。' +
207
217
  '出视频前必须先出帧,否则视频会退化成无一致性锚点的画面。' +
208
218
  'frame_type 要与 quote_frames 用的一致(默认 first_frame)。尾帧只在想固定某镜结尾画面时才补,常规只需首帧。' + CONFIRM_HINT, {
209
219
  episode_id: z.number().int().positive(),
210
220
  quote_id: z.string().describe('来自 quote_frames'),
211
221
  frame_type: FRAME_TYPE_ARG.optional().describe('默认 first_frame,须与报价时一致'),
212
- }, async ({ episode_id, quote_id, frame_type }) => jsonResult(await client.producePost(`/episodes/${episode_id}/frames/generate`, { quote_id, frame_type })));
222
+ image_model: z.string().optional().describe('临时覆盖本次出图模型(不传=用 drama 级设定,默认香蕉2)。可选:' +
223
+ 'gemini-3.1-flash-image(Nano Banana 2·默认·71点)/gemini-3-pro-image(Nano Banana Pro·更精细·175点)/' +
224
+ 'gemini-3.1-flash-lite-image(Nano Banana 2 Lite·便宜·31点)/doubao-seedream-5-0-260128(Seedream 5.0)/gpt-image-2(ChatGPT Image 2)'),
225
+ }, async ({ episode_id, quote_id, frame_type, image_model }) => jsonResult(await client.producePost(`/episodes/${episode_id}/frames/generate`, { quote_id, frame_type, image_model })));
213
226
  // ---------- 单镜出帧/重生(改某一镜的画面走这里,别去外部平台出图再传回来) ----------
214
227
  server.tool('quote_shot_frame', '报价:重画/补出**某一镜的某一帧**要多少点(一帧=一张图)。返回 estimated_points、quote_id。零扣费。' +
215
228
  '客户说「第 N 镜画错了/要改」时用它,而不是拿别的图像平台出图再 upload_shot_frame。', {
@@ -230,7 +243,8 @@ export function registerProduceTools(server, client) {
230
243
  frame_type: FRAME_TYPE_ARG.optional().describe('默认 first_frame,须与报价时一致;传了 reopen_pair_id 时会被忽略'),
231
244
  replace_user_frame: z.boolean().optional().describe('默认 true(显式重生允许覆盖已上传帧);传 false 则保护已上传帧'),
232
245
  reopen_pair_id: z.string().optional().describe('来自 get_storyboards 该镜的同名字段;只重掷有问题的那一侧,不必再传 frame_type'),
233
- }, async ({ storyboard_id, quote_id, frame_type, replace_user_frame, reopen_pair_id }) => jsonResult(await client.producePost(`/storyboards/${storyboard_id}/frame/generate`, { quote_id, frame_type, replace_user_frame, reopen_pair_id })));
246
+ image_model: z.string().optional().describe('临时覆盖本次重画的图片模型(不传=用 drama 级设定,默认香蕉2);取值同 generate_frames'),
247
+ }, async ({ storyboard_id, quote_id, frame_type, replace_user_frame, reopen_pair_id, image_model }) => jsonResult(await client.producePost(`/storyboards/${storyboard_id}/frame/generate`, { quote_id, frame_type, replace_user_frame, reopen_pair_id, image_model })));
234
248
  // ---------- 出视频(videos,大额) ----------
235
249
  server.tool('quote_videos', '报价:给某一集所有分镜批量出视频要多少点(与实际扣费同函数,较准)。返回 estimated_points、quote_id。零扣费。' +
236
250
  '⚠️ 视频是大额花费,务必把点数清楚告诉用户并等其确认。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/videos/quote`)));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starreel/mcp",
3
- "version": "0.1.29",
3
+ "version": "0.1.30",
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.29",
5
+ "version": "0.1.30",
6
6
  "websiteUrl": "https://starreel.ai",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "@starreel/mcp",
11
- "version": "0.1.29",
11
+ "version": "0.1.30",
12
12
  "transport": { "type": "stdio" },
13
13
  "environmentVariables": [
14
14
  {