makaron-cli 0.12.2 → 0.13.0

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/README.md CHANGED
@@ -90,8 +90,13 @@ npx makaron-cli chat --project <id> --json -b "<prompt>"
90
90
  # Auto-create project (with or without images)
91
91
  npx makaron-cli chat --project auto --image photo.jpg --json -b "make it cinematic"
92
92
  npx makaron-cli chat --project auto --image img1.jpg --image img2.jpg --json -b "combine these"
93
+
94
+ # Choose each model role explicitly
95
+ npx makaron-cli chat --project auto --agent-model deepseek-v4-pro --image-model qwen "design a product poster"
93
96
  ```
94
97
 
98
+ Model flags are role-specific: `--agent-model` controls reasoning and tool use, `--image-model` controls image generation/editing, and `--video-model` controls video generation. `--agent-model` accepts `auto|sonnet-4.6|sonnet-5|opus-4.8|grok-4.5|deepseek-v4-pro`. `MAKARON_AGENT_MODEL` can set the default for automation; the command flag takes precedence. The legacy `--model` flag remains temporarily supported with a deprecation warning.
99
+
95
100
  Returns immediately:
96
101
  ```json
97
102
  {"runId": "xxx", "projectId": "...", "projectUrl": "https://www.makaron.app/projects/...", "status": "running"}
@@ -280,7 +285,7 @@ npx makaron-cli edit --image photo.jpg --ref style.jpg "match this style"
280
285
  npx makaron-cli edit --image photo.jpg --out result.jpg "make it dramatic"
281
286
  ```
282
287
 
283
- Options: `--image`, `--model gemini|gemini-lite|qwen|openai|pony|wai`, `--ref <file>` (up to 3), `--aspect <ratio>`, `--out <path>`
288
+ Options: `--image`, `--image-model gemini|gemini-lite|qwen|openai|pony|wai`, `--ref <file>` (up to 3), `--aspect <ratio>`, `--out <path>`
284
289
 
285
290
  ### `video` — Standalone video tools (no project timeline)
286
291
 
@@ -292,13 +297,16 @@ npx makaron-cli video script --image img1.jpg "cinematic story"
292
297
  npx makaron-cli analyze --video input.mp4 "describe the key actions and pacing"
293
298
 
294
299
  # 3a. Submit image-to-video rendering (images must be public URLs from step 1 or uploaded)
295
- npx makaron-cli video create --script "Shot 1 (5s): <<<image_1>>> ..." --image https://...jpg --duration 5 --model kling
296
- npx makaron-cli video create --script "Shot 1 (5s): <<<image_1>>> slow cinematic push-in with native ambience" --image https://...jpg --duration 5 --model grok
297
- npx makaron-cli video create --script "Shot 1 (15s): <<<image_1>>> and <<<image_2>>> build a neon one-person studio" --image https://...jpg --image https://...webp --duration 15 --model seedance-mini --video-resolution 480p --aspect 9:16
300
+ npx makaron-cli video create --script "Shot 1 (5s): <<<image_1>>> ..." --image https://...jpg --duration 5 --video-model kling
301
+ npx makaron-cli video create --script "Shot 1 (5s): <<<image_1>>> slow cinematic push-in with native ambience" --image https://...jpg --duration 5 --video-model grok
302
+ npx makaron-cli video create --script "Shot 1 (15s): <<<image_1>>> and <<<image_2>>> build a neon one-person studio" --image https://...jpg --image https://...webp --duration 15 --video-model seedance-mini --video-resolution 480p --aspect 9:16
303
+
304
+ # 3b. Native SeeDance text-to-video (no image required)
305
+ npx makaron-cli video create --script "Shot 1 (5s): A neon one-person studio wakes at dawn" --duration 5 --video-model seedance-fast --aspect 16:9
298
306
 
299
- # 3b. Edit a video from a local file or public URL
300
- npx makaron-cli video create --script "make it funny" --video input.mp4 --duration 5 --model seedance-fast
301
- npx makaron-cli video create --script "make it warmer and cinematic" --video https://example.com/input.mp4 --duration 5 --model seedance --video-resolution 1080p
307
+ # 3c. Edit a video from a local file or public URL
308
+ npx makaron-cli video create --script "make it funny" --video input.mp4 --duration 5 --video-model seedance-fast
309
+ npx makaron-cli video create --script "make it warmer and cinematic" --video https://example.com/input.mp4 --duration 5 --video-model seedance --video-resolution 1080p
302
310
 
303
311
  # 4. Check status
304
312
  npx makaron-cli video status <taskId>
@@ -310,9 +318,9 @@ For project/timeline video editing, use:
310
318
  npx makaron-cli chat --project <id|auto> --video input.mp4 -b "make it funny"
311
319
  ```
312
320
 
313
- Options for `video create`: `--script "..."`, `--script-file <path>`, `--image <url>` (repeatable, up to 7), `--video <file|url>`, `--duration <seconds>`, `--aspect 9:16|16:9|1:1`, `--model seedance-fast|seedance-mini|seedance|kling|grok|google-omni`, `--video-resolution auto|480p|720p|1080p|4k`. Default model is `seedance-fast`. SeeDance accepts integer output duration 4-15s (default 5s); `seedance-mini` supports 480p/720p and is best for cheaper drafts/multi-size tests; Kling supports 5-15s; Grok 1.5 supports 1-15s single-image-to-video only; Gemini Omni supports 3-10s fast 720p image/video generation and editing with native generated audio. For `--model grok`, forced `--aspect` is ignored to avoid xAI stretching the source image; pad/create the image at the target shape first or use another model.
321
+ Options for `video create`: `--script "..."`, `--script-file <path>`, `--image <url>` (repeatable, up to 7), `--video <file|url>`, `--duration <seconds>`, `--aspect 9:16|16:9|1:1`, `--video-model seedance-fast|seedance-mini|seedance|kling|grok|google-omni`, `--video-resolution auto|480p|720p|1080p|4k`. Default model is `seedance-fast`. SeeDance accepts native text-to-video with no image and integer output duration 4-15s (default 5s); `seedance-mini` supports 480p/720p and is best for cheaper drafts/multi-size tests; Kling supports 5-15s; Grok 1.5 supports 1-15s single-image-to-video only; Gemini Omni supports 3-10s fast 720p image/video generation and editing with native generated audio, including up to 6 image references when no video reference is provided. For `--video-model grok`, forced `--aspect` is ignored to avoid xAI stretching the source image; pad/create the image at the target shape first or use another model.
314
322
 
315
- Video edit model behavior: `--model kling --video` uses Kling base/direct edit internally; `--model seedance-fast --video`, `--model seedance-mini --video`, or `--model seedance --video` uses the SeeDance video-reference path and requires target <=15s, <=50MB, width/height 300-6000px, aspect ratio 0.4-2.5, and frame pixels 409,600-2,086,876. `--model google-omni --video` uses Gemini Omni direct video editing and accepts one reference video in Makaron. Output duration is clamped to 3-10s. Grok does not support video references.
323
+ Video edit model behavior: `--video-model kling --video` uses Kling base/direct edit internally; `--video-model seedance-fast --video`, `--video-model seedance-mini --video`, or `--video-model seedance --video` uses the SeeDance video-reference path and requires target <=15s, <=50MB, width/height 300-6000px, aspect ratio 0.4-2.5, and frame pixels 409,600-2,086,876. `--video-model google-omni --video` uses Gemini Omni direct video editing and accepts one reference video in Makaron. Output duration is clamped to 3-10s. Grok does not support video references.
316
324
 
317
325
  ### `music` — Music generation
318
326
 
package/bin/makaron.mjs CHANGED
@@ -27,6 +27,7 @@ const APP_URL = process.env.MAKARON_APP_URL || DEFAULT_URL;
27
27
  const NPM_PACKAGE_NAME = 'makaron-cli';
28
28
  const UPDATE_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;
29
29
  const UPDATE_CHECK_TIMEOUT_MS = 400;
30
+ const AGENT_MODELS = ['auto', 'sonnet-4.6', 'sonnet-5', 'opus-4.8', 'grok-4.5', 'deepseek-v4-pro'];
30
31
 
31
32
  // Public anon key (safe to embed — only enables auth, not data access)
32
33
  const SUPABASE_URL = 'https://sdyrtztrjgmmpnirswxt.supabase.co';
@@ -50,6 +51,18 @@ const SEEDANCE_MAX_VIDEO_SIDE = 6000;
50
51
  const SEEDANCE_MIN_VIDEO_ASPECT = 0.4;
51
52
  const SEEDANCE_MAX_VIDEO_ASPECT = 2.5;
52
53
 
54
+ function warnLegacyModelFlag(replacement) {
55
+ process.stderr.write(`⚠️ --model is deprecated here; use ${replacement}.\n`);
56
+ }
57
+
58
+ function validateAgentModel(value) {
59
+ if (!AGENT_MODELS.includes(value)) {
60
+ process.stderr.write(`❌ Unknown agent model: ${value}\nChoose one of: ${AGENT_MODELS.join(', ')}\n`);
61
+ process.exit(1);
62
+ }
63
+ return value;
64
+ }
65
+
53
66
  function getCliVersion() {
54
67
  try {
55
68
  const pkg = JSON.parse(fs.readFileSync(new URL('../package.json', import.meta.url), 'utf-8'));
@@ -277,8 +290,9 @@ Options:
277
290
  --video <file|url> Attach a video to the project timeline. Repeatable.
278
291
  --audio <file|url> Attach a song, beat, or voice reference. MP3/WAV, repeatable.
279
292
  --skill <id|label|name> Use an installed skill or auto-install a matched marketplace skill.
280
- --model <name> Preferred image/model route.
293
+ --image-model <name> Image model: gemini, gemini-lite, qwen, openai, pony, or wai.
281
294
  --video-model <name> Preferred video model: seedance-fast, seedance-mini, seedance, kling, grok, or google-omni.
295
+ --agent-model <name> Agent model: auto, sonnet-4.6, sonnet-5, opus-4.8, grok-4.5, or deepseek-v4-pro.
282
296
  --video-resolution <res> Video resolution: auto, 480p, 720p, 1080p, or 4k.
283
297
  --background, -b Submit and print a runId.
284
298
  --json Output structured JSON.
@@ -333,7 +347,7 @@ async function abortRun(baseUrl, headers, runId) {
333
347
  } catch { /* best effort */ }
334
348
  }
335
349
 
336
- async function streamAgent(baseUrl, headers, projectId, prompt) {
350
+ async function streamAgent(baseUrl, headers, projectId, prompt, opts = {}) {
337
351
  const controller = new AbortController();
338
352
  const res = await fetch(`${baseUrl}/api/agent`, {
339
353
  method: 'POST',
@@ -345,6 +359,10 @@ async function streamAgent(baseUrl, headers, projectId, prompt) {
345
359
  projectId,
346
360
  prompt,
347
361
  headless: true,
362
+ ...(opts.preferredModel ? { preferredModel: opts.preferredModel } : {}),
363
+ ...(opts.videoModel ? { videoModel: opts.videoModel } : {}),
364
+ ...(opts.videoResolution ? { videoResolution: opts.videoResolution } : {}),
365
+ ...(opts.agentModel && opts.agentModel !== 'auto' ? { agentModel: opts.agentModel } : {}),
348
366
  }),
349
367
  signal: controller.signal,
350
368
  });
@@ -452,6 +470,7 @@ async function streamAgent(baseUrl, headers, projectId, prompt) {
452
470
  async function submitRun(baseUrl, headers, projectId, prompt, opts = {}) {
453
471
  const body = { projectId, prompt };
454
472
  if (opts.preferredModel) body.preferredModel = opts.preferredModel;
473
+ if (opts.agentModel && opts.agentModel !== 'auto') body.agentModel = opts.agentModel;
455
474
  if (opts.videoModel) body.videoModel = opts.videoModel;
456
475
  if (opts.videoResolution) body.videoResolution = opts.videoResolution;
457
476
  if (opts.currentSnapshotIndex != null) body.currentSnapshotIndex = opts.currentSnapshotIndex;
@@ -1551,9 +1570,26 @@ Commands:
1551
1570
 
1552
1571
  admin Admin commands (skills, upload, set-admin)
1553
1572
 
1573
+ Model selection:
1574
+ --agent-model <name> Reasoning/tool model: auto, sonnet-4.6, sonnet-5,
1575
+ opus-4.8, grok-4.5, or deepseek-v4-pro
1576
+ --image-model <name> Image model: gemini, gemini-lite, qwen, openai,
1577
+ pony, or wai
1578
+ --video-model <name> Video model: seedance-fast, seedance-mini, seedance,
1579
+ kling, grok, or google-omni
1580
+
1581
+ Examples:
1582
+ makaron chat --project auto --agent-model deepseek-v4-pro "plan a launch poster"
1583
+ makaron chat --project <id> --agent-model sonnet-5 --image-model qwen "make it cinematic"
1584
+ makaron chat --project <id> --video-model seedance-fast "turn this into a short video"
1585
+
1586
+ Run makaron <command> --help for command-specific options.
1587
+ The legacy --model flag is deprecated; use the role-specific flags above.
1588
+
1554
1589
  Environment:
1555
- MAKARON_API_KEY API key (mk_live_xxx) — recommended for agents
1556
- MAKARON_URL API base (default: ${DEFAULT_URL})
1590
+ MAKARON_API_KEY API key (mk_live_xxx) — recommended for agents
1591
+ MAKARON_URL API base (default: ${DEFAULT_URL})
1592
+ MAKARON_AGENT_MODEL Default Agent model; --agent-model takes precedence
1557
1593
  `);
1558
1594
  }
1559
1595
 
@@ -1660,17 +1696,18 @@ Use with chat:
1660
1696
  composition status <jobId> [--wait] [--json]
1661
1697
  `);
1662
1698
  } else if (topic === 'edit') {
1663
- console.log('Usage: makaron edit [--image <file|url>] [--model gemini|gemini-lite|qwen|openai|pony|wai] [--skill enhance|creative|wild|captions] [--ref <file>] [--out <file>] "prompt"');
1699
+ console.log('Usage: makaron edit [--image <file|url>] [--image-model gemini|gemini-lite|qwen|openai|pony|wai] [--skill enhance|creative|wild|captions] [--ref <file>] [--out <file>] "prompt"');
1664
1700
  } else if (topic === 'analyze') {
1665
1701
  console.log('Usage: makaron analyze --video <file|url> ["question"]');
1666
1702
  } else if (topic === 'video') {
1667
1703
  if (subtopic === 'script') console.log('Usage: makaron video script --image <file> [--image <file>] [--lang en|zh] "direction"');
1668
- else if (subtopic === 'create') console.log('Usage: makaron video create --script "..." (--image <url> | --video <public-url>) [--duration 10] [--aspect 9:16] [--model seedance-fast|seedance-mini|seedance|kling|grok|google-omni] [--video-resolution auto|480p|720p|1080p|4k] [--keep-original-sound]');
1704
+ else if (subtopic === 'create') console.log('Usage: makaron video create --script "..." [--image <url> | --video <public-url>] [--duration 10] [--aspect 9:16] [--video-model seedance-fast|seedance-mini|seedance|kling|grok|google-omni] [--video-resolution auto|480p|720p|1080p|4k] [--keep-original-sound]');
1669
1705
  else if (subtopic === 'status') console.log('Usage: makaron video status <taskId> | --snapshot <snapshotId> [--wait]');
1670
1706
  else console.log(`Video commands:
1671
1707
  video script --image <file> [--image <file>] "direction" Write video script
1708
+ video create --script "..." --video-model seedance-fast Native text-to-video (no image required)
1672
1709
  video create --script "..." --image <url> [--duration 10] Submit video task
1673
- video create --script "..." --video <public-url> [--model seedance-fast|seedance-mini|seedance|kling|google-omni] Edit a video (standalone; Grok does not support video refs)
1710
+ video create --script "..." --video <public-url> [--video-model seedance-fast|seedance-mini|seedance|kling|google-omni] Edit a video (standalone; Grok does not support video refs)
1674
1711
  video status <taskId> Check video status
1675
1712
  video status --snapshot <snapshotId> [--wait] Check v2 video snapshot
1676
1713
  `);
@@ -1756,6 +1793,7 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
1756
1793
  let videoModel = undefined;
1757
1794
  let videoResolution = undefined;
1758
1795
  let preferredModel = undefined;
1796
+ let agentModel = process.env.MAKARON_AGENT_MODEL || 'auto';
1759
1797
  for (let i = 1; i < args.length; i++) {
1760
1798
  if (args[i] === '--project' && args[i + 1]) projectId = args[++i];
1761
1799
  else if (args[i] === '--image' && args[i + 1]) chatImages.push(args[++i]);
@@ -1768,7 +1806,12 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
1768
1806
  else if (args[i] === '--json') jsonOutput = true;
1769
1807
  else if (args[i] === '--video-model' && args[i + 1]) videoModel = args[++i];
1770
1808
  else if (args[i] === '--video-resolution' && args[i + 1]) videoResolution = args[++i];
1771
- else if (args[i] === '--model' && args[i + 1]) preferredModel = args[++i];
1809
+ else if (args[i] === '--image-model' && args[i + 1]) preferredModel = args[++i];
1810
+ else if (args[i] === '--agent-model' && args[i + 1]) agentModel = args[++i];
1811
+ else if (args[i] === '--model' && args[i + 1]) {
1812
+ warnLegacyModelFlag('--image-model');
1813
+ preferredModel = args[++i];
1814
+ }
1772
1815
  else promptParts.push(args[i]);
1773
1816
  }
1774
1817
  const prompt = promptParts.join(' ');
@@ -1777,6 +1820,7 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
1777
1820
  console.error('Run: makaron chat --help');
1778
1821
  process.exit(1);
1779
1822
  }
1823
+ agentModel = validateAgentModel(agentModel);
1780
1824
  const { headers, baseUrl } = getAuth();
1781
1825
  // Split images into URLs vs local files
1782
1826
  const imageUrlList = chatImages.filter(p => p.startsWith('http://') || p.startsWith('https://'));
@@ -1962,7 +2006,7 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
1962
2006
 
1963
2007
  if (useStream) {
1964
2008
  // Legacy SSE mode
1965
- const { results } = await streamAgent(baseUrl, headers, projectId, finalPrompt);
2009
+ const { results } = await streamAgent(baseUrl, headers, projectId, finalPrompt, { videoModel, videoResolution, preferredModel, agentModel });
1966
2010
  process.stderr.write('\n━━━ Results ━━━\n');
1967
2011
  for (const img of results.images) process.stderr.write(`🖼️ Image: ${img.imageUrl}\n`);
1968
2012
  for (const d of results.designs) process.stderr.write(`🎨 ${d.desc}\n`);
@@ -1971,7 +2015,7 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
1971
2015
  for (const task of results.musicTasks) await pollMusic(baseUrl, headers, task.taskId);
1972
2016
  } else {
1973
2017
  // Default: fire-and-forget + poll
1974
- const { runId } = await submitRun(baseUrl, headers, projectId, finalPrompt, { videoModel, videoResolution, preferredModel, audioAttachments });
2018
+ const { runId } = await submitRun(baseUrl, headers, projectId, finalPrompt, { videoModel, videoResolution, preferredModel, agentModel, audioAttachments });
1975
2019
  if (background) {
1976
2020
  // Just print runId and exit
1977
2021
  if (jsonOutput) {
@@ -2238,7 +2282,11 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
2238
2282
  let outputPath = null;
2239
2283
  for (let i = 1; i < args.length; i++) {
2240
2284
  if (args[i] === '--image' && args[i + 1]) editArgs.image = imageToArg(args[++i]);
2241
- else if (args[i] === '--model' && args[i + 1]) editArgs.model = args[++i];
2285
+ else if (args[i] === '--image-model' && args[i + 1]) editArgs.model = args[++i];
2286
+ else if (args[i] === '--model' && args[i + 1]) {
2287
+ warnLegacyModelFlag('--image-model');
2288
+ editArgs.model = args[++i];
2289
+ }
2242
2290
  else if (args[i] === '--skill' && args[i + 1]) editArgs.skill = args[++i];
2243
2291
  else if (args[i] === '--ref' && args[i + 1]) {
2244
2292
  editArgs.referenceImages = editArgs.referenceImages || [];
@@ -2249,7 +2297,7 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
2249
2297
  else promptParts.push(args[i]);
2250
2298
  }
2251
2299
  editArgs.editPrompt = promptParts.join(' ');
2252
- if (!editArgs.editPrompt) { console.error('Usage: makaron edit [--image <file|url>] [--model gemini|gemini-lite|qwen|openai|pony|wai] [--ref <file>] [--out <file>] "prompt"'); process.exit(1); }
2300
+ if (!editArgs.editPrompt) { console.error('Usage: makaron edit [--image <file|url>] [--image-model gemini|gemini-lite|qwen|openai|pony|wai] [--ref <file>] [--out <file>] "prompt"'); process.exit(1); }
2253
2301
  process.stderr.write('🎨 Generating...\n');
2254
2302
  const result = await callMcpTool(baseUrl, headers, 'makaron_edit_image', editArgs);
2255
2303
  saveMcpImage(result, outputPath);
@@ -2294,7 +2342,11 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
2294
2342
  else if (args[i] === '--script-file' && args[i + 1]) script = fs.readFileSync(args[++i], 'utf-8');
2295
2343
  else if (args[i] === '--duration' && args[i + 1]) duration = Number(args[++i]);
2296
2344
  else if (args[i] === '--aspect' && args[i + 1]) aspectRatio = args[++i];
2297
- else if (args[i] === '--model' && args[i + 1]) videoModel = args[++i];
2345
+ else if (args[i] === '--video-model' && args[i + 1]) videoModel = args[++i];
2346
+ else if (args[i] === '--model' && args[i + 1]) {
2347
+ warnLegacyModelFlag('--video-model');
2348
+ videoModel = args[++i];
2349
+ }
2298
2350
  else if (args[i] === '--video-resolution' && args[i + 1]) videoResolution = args[++i];
2299
2351
  else if (args[i] === '--resolution' && args[i + 1]) videoResolution = args[++i];
2300
2352
  else if (args[i] === '--keep-original-sound') keepOriginalSound = true;
@@ -2304,8 +2356,10 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
2304
2356
  }
2305
2357
  else if (args[i] === '--wait') wait = true;
2306
2358
  }
2307
- if ((!images.length && !video) || !script) {
2308
- console.error('Usage: makaron video create --script "..." (--image <url> | --video <public-url>) [--duration 10] [--aspect 9:16] [--model seedance-fast|seedance-mini|seedance|kling|grok|google-omni] [--video-resolution auto|480p|720p|1080p|4k] [--keep-original-sound]');
2359
+ const selectedVideoModel = videoModel || 'seedance-fast';
2360
+ const isSeedanceModel = selectedVideoModel === 'seedance-fast' || selectedVideoModel === 'seedance-mini' || selectedVideoModel === 'seedance';
2361
+ if (!script || (!images.length && !video && !isSeedanceModel)) {
2362
+ console.error('Usage: makaron video create --script "..." [--image <url> | --video <public-url>] [--duration 10] [--aspect 9:16] [--video-model seedance-fast|seedance-mini|seedance|kling|grok|google-omni] [--video-resolution auto|480p|720p|1080p|4k] [--keep-original-sound]');
2309
2363
  process.exit(1);
2310
2364
  }
2311
2365
 
@@ -2316,7 +2370,6 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
2316
2370
 
2317
2371
  let videoUrl = isHttpUrl(video) ? video : null;
2318
2372
  let inputVideoMeta = null;
2319
- const selectedVideoModel = videoModel || 'seedance-fast';
2320
2373
  if (videoUrl) {
2321
2374
  process.stderr.write(`📹 Assuming public video URL already matches provider reference limits. Seedance requires ≤${MAX_VIDEO_PROVIDER_REFERENCE_DURATION}s, ≤50MB, sides 300-6000px, frame pixels 409,600-${MAX_VIDEO_FRAME_PIXELS}; Kling requires ≤200MB and ≤2K; Google Omni accepts one reference video in Makaron; Grok does not support video references.\n`);
2322
2375
  }
@@ -2391,8 +2444,9 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
2391
2444
  } else {
2392
2445
  console.log(`Video commands:
2393
2446
  video script --image <file> [--image <file>] "direction" Write video script
2447
+ video create --script "..." --video-model seedance-fast Native text-to-video (no image required)
2394
2448
  video create --script "..." --image <url> [--duration 10] Submit video task
2395
- video create --script "..." --video <public-url> [--model seedance-fast|seedance-mini|seedance|kling|google-omni] Edit a video (standalone; Grok does not support video refs)
2449
+ video create --script "..." --video <public-url> [--video-model seedance-fast|seedance-mini|seedance|kling|google-omni] Edit a video (standalone; Grok does not support video refs)
2396
2450
  video status <taskId> Check video status
2397
2451
  video status --snapshot <snapshotId> [--wait] Check v2 video snapshot
2398
2452
  `);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "makaron-cli",
3
- "version": "0.12.2",
3
+ "version": "0.13.0",
4
4
  "description": "Talk to Makaron Agent from the terminal — create projects, edit images, generate videos",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -77,8 +77,13 @@ npx makaron-cli chat --project <id> --json -b "<prompt>"
77
77
  # Auto-create project (with or without images)
78
78
  npx makaron-cli chat --project auto --image photo.jpg --json -b "make it cinematic"
79
79
  npx makaron-cli chat --project auto --image img1.jpg --image img2.jpg --json -b "combine these"
80
+
81
+ # Choose each model role explicitly
82
+ npx makaron-cli chat --project auto --agent-model deepseek-v4-pro --image-model qwen "design a product poster"
80
83
  ```
81
84
 
85
+ Model flags are role-specific: `--agent-model` controls reasoning and tool use, `--image-model` controls image generation/editing, and `--video-model` controls video generation. `--agent-model` accepts `auto|sonnet-4.6|sonnet-5|opus-4.8|grok-4.5|deepseek-v4-pro`. `MAKARON_AGENT_MODEL` can set the default for automation; the command flag takes precedence. The legacy `--model` flag remains temporarily supported with a deprecation warning.
86
+
82
87
  Returns immediately:
83
88
  ```json
84
89
  {"runId": "xxx", "projectId": "...", "projectUrl": "https://www.makaron.app/projects/...", "status": "running"}
@@ -238,7 +243,7 @@ npx makaron-cli edit --image photo.jpg --ref style.jpg "match this style"
238
243
  npx makaron-cli edit --image photo.jpg --out result.jpg "make it dramatic"
239
244
  ```
240
245
 
241
- Options: `--image`, `--model gemini|gemini-lite|qwen|openai|pony|wai`, `--ref <file>` (up to 3), `--aspect <ratio>`, `--out <path>`
246
+ Options: `--image`, `--image-model gemini|gemini-lite|qwen|openai|pony|wai`, `--ref <file>` (up to 3), `--aspect <ratio>`, `--out <path>`
242
247
 
243
248
  ### `video` — Standalone video tools (no project timeline)
244
249
 
@@ -250,12 +255,15 @@ npx makaron-cli video script --image img1.jpg "cinematic story"
250
255
  npx makaron-cli analyze --video input.mp4 "describe the key actions and pacing"
251
256
 
252
257
  # 3a. Submit image-to-video rendering (images must be public URLs from step 1 or uploaded)
253
- npx makaron-cli video create --script "Shot 1 (5s): <<<image_1>>> ..." --image https://...jpg --duration 5 --model kling
254
- npx makaron-cli video create --script "Shot 1 (15s): <<<image_1>>> and <<<image_2>>> build a neon one-person studio" --image https://...jpg --image https://...webp --duration 15 --model seedance-mini --video-resolution 480p --aspect 9:16
258
+ npx makaron-cli video create --script "Shot 1 (5s): <<<image_1>>> ..." --image https://...jpg --duration 5 --video-model kling
259
+ npx makaron-cli video create --script "Shot 1 (15s): <<<image_1>>> and <<<image_2>>> build a neon one-person studio" --image https://...jpg --image https://...webp --duration 15 --video-model seedance-mini --video-resolution 480p --aspect 9:16
260
+
261
+ # 3b. Native SeeDance text-to-video (no image required)
262
+ npx makaron-cli video create --script "Shot 1 (5s): A neon one-person studio wakes at dawn" --duration 5 --video-model seedance-fast --aspect 16:9
255
263
 
256
- # 3b. Edit a video from a local file or public URL
257
- npx makaron-cli video create --script "make it funny" --video input.mp4 --duration 5 --model seedance-fast
258
- npx makaron-cli video create --script "make it warmer and cinematic" --video https://example.com/input.mp4 --duration 5 --model seedance --video-resolution 1080p
264
+ # 3c. Edit a video from a local file or public URL
265
+ npx makaron-cli video create --script "make it funny" --video input.mp4 --duration 5 --video-model seedance-fast
266
+ npx makaron-cli video create --script "make it warmer and cinematic" --video https://example.com/input.mp4 --duration 5 --video-model seedance --video-resolution 1080p
259
267
 
260
268
  # 4. Check status
261
269
  npx makaron-cli video status <taskId>
@@ -267,9 +275,9 @@ npx makaron-cli video status <taskId>
267
275
  npx makaron-cli chat --project <id|auto> --video input.mp4 -b "make it funny"
268
276
  ```
269
277
 
270
- Options for `video create`: `--script "..."`, `--script-file <path>`, `--image <url>` (repeatable, up to 7), `--video <file|url>`, `--duration <seconds>`, `--aspect 9:16|16:9|1:1`, `--model seedance-fast|seedance-mini|seedance|kling|grok|google-omni`, `--video-resolution auto|480p|720p|1080p|4k`. Default model is `seedance-fast`. SeeDance accepts integer output duration 4-15s (default 5s); `seedance-mini` supports 480p/720p and is best for cheaper drafts/multi-size tests; Kling supports 5-15s; Grok 1.5 supports 1-15s single-image-to-video only; Gemini Omni supports 3-10s fast 720p image/video generation and editing with native generated audio. For `--model grok`, forced `--aspect` is ignored to avoid xAI stretching the source image; pad/create the image at the target shape first or use another model.
278
+ Options for `video create`: `--script "..."`, `--script-file <path>`, `--image <url>` (repeatable, up to 7), `--video <file|url>`, `--duration <seconds>`, `--aspect 9:16|16:9|1:1`, `--video-model seedance-fast|seedance-mini|seedance|kling|grok|google-omni`, `--video-resolution auto|480p|720p|1080p|4k`. Default model is `seedance-fast`. SeeDance accepts native text-to-video with no image and integer output duration 4-15s (default 5s); `seedance-mini` supports 480p/720p and is best for cheaper drafts/multi-size tests; Kling supports 5-15s; Grok 1.5 supports 1-15s single-image-to-video only; Gemini Omni supports 3-10s fast 720p image/video generation and editing with native generated audio, including up to 6 image references when no video reference is provided. For `--video-model grok`, forced `--aspect` is ignored to avoid xAI stretching the source image; pad/create the image at the target shape first or use another model.
271
279
 
272
- Video edit model behavior: `--model kling --video` uses Kling base/direct edit internally; `--model seedance-fast --video`, `--model seedance-mini --video`, or `--model seedance --video` uses the SeeDance video-reference path and requires target <=15s, <=50MB, width/height 300-6000px, aspect ratio 0.4-2.5, and frame pixels 409,600-2,086,876. `--model google-omni --video` uses Gemini Omni direct video editing and accepts one reference video in Makaron. Output duration is clamped to 3-10s. Grok does not support video references.
280
+ Video edit model behavior: `--video-model kling --video` uses Kling base/direct edit internally; `--video-model seedance-fast --video`, `--video-model seedance-mini --video`, or `--video-model seedance --video` uses the SeeDance video-reference path and requires target <=15s, <=50MB, width/height 300-6000px, aspect ratio 0.4-2.5, and frame pixels 409,600-2,086,876. `--video-model google-omni --video` uses Gemini Omni direct video editing and accepts one reference video in Makaron. Output duration is clamped to 3-10s. Grok does not support video references.
273
281
 
274
282
  ### `music` — Music generation
275
283