makaron-cli 0.14.0 → 0.14.1
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/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/README.md +12 -6
- package/bin/makaron.mjs +62 -19
- package/package.json +1 -1
- package/skills/makaron/SKILL.md +11 -6
package/README.md
CHANGED
|
@@ -98,11 +98,12 @@ npx makaron-cli chat --project auto --image photo.jpg --json -b "make it cinemat
|
|
|
98
98
|
npx makaron-cli chat --project auto --image img1.jpg --image img2.jpg --json -b "combine these"
|
|
99
99
|
```
|
|
100
100
|
|
|
101
|
-
`chat` routes image and video models automatically, but you may select the Agent LLM with `--agent-model`. Accepted values are
|
|
101
|
+
`chat` routes image and video models automatically, but you may select the Agent LLM with `--agent-model`. Accepted values are `auto`, the base model IDs (`gpt-5.6-terra`, `gpt-5.6-sol`, `gpt-5.6-luna`, `grok-4.6`, `deepseek-v4-pro`), and the personal-plan routes (`gpt-5.6-terra-codex-subscription`, `gpt-5.6-sol-codex-subscription`, `gpt-5.6-luna-codex-subscription`). For the configured owner, `auto` resolves to GPT-5.6 Terra through the personal Codex plan. Base GPT-5.6 IDs select Azure API; the suffixed IDs select the personal plan explicitly. This flag changes only the reasoning/tool-calling Agent LLM.
|
|
102
102
|
|
|
103
103
|
```bash
|
|
104
104
|
# Explicit lower-cost Agent LLM for a controlled comparison
|
|
105
105
|
npx makaron-cli chat --project auto --agent-model deepseek-v4-pro --json -b "make a 20s badminton video"
|
|
106
|
+
npx makaron-cli chat --project auto --agent-model gpt-5.6-sol-codex-subscription --json -b "reply with the active model"
|
|
106
107
|
```
|
|
107
108
|
|
|
108
109
|
Returns immediately:
|
|
@@ -368,18 +369,21 @@ npx makaron-cli video script --image img1.jpg "cinematic story"
|
|
|
368
369
|
# 2. Analyze a video (standalone, no timeline write)
|
|
369
370
|
npx makaron-cli analyze --video input.mp4 "describe the key actions and pacing"
|
|
370
371
|
|
|
371
|
-
# 3a. Submit
|
|
372
|
+
# 3a. Submit reference-to-video rendering (images must be public URLs from step 1 or uploaded)
|
|
372
373
|
npx makaron-cli video create --script "Shot 1 (5s): <<<image_1>>> ..." --image https://...jpg --duration 5 --video-model kling
|
|
373
374
|
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
|
|
375
|
+
npx makaron-cli video create --script "Keep both subjects recognizable as they enter the same studio" --image https://...jpg --image https://...webp --duration 5 --video-model grok --video-resolution 720p
|
|
374
376
|
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
|
|
375
377
|
|
|
376
|
-
# 3b. Native SeeDance or MiniMax H3 text-to-video (no image required)
|
|
378
|
+
# 3b. Native SeeDance, Wan 3.0, or MiniMax H3 text-to-video (no image required)
|
|
377
379
|
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
|
|
378
380
|
npx makaron-cli video create --script "Shot 1 (15s): A premium creative editor comes alive" --duration 15 --video-model minimax-h3 --aspect 16:9
|
|
379
381
|
|
|
380
382
|
# 3c. Edit a video from a local file or public URL
|
|
381
383
|
npx makaron-cli video create --script "make it funny" --video input.mp4 --duration 5 --video-model seedance-fast
|
|
382
384
|
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
|
|
385
|
+
npx makaron-cli video create --script "turn the light warm gold but preserve the action" --video input.mp4 --video-model grok --operation edit
|
|
386
|
+
npx makaron-cli video create --script "continue the camera move into the next beat" --video input.mp4 --video-model grok --operation extend --duration 4
|
|
383
387
|
|
|
384
388
|
# 4. Check status
|
|
385
389
|
npx makaron-cli video status <taskId>
|
|
@@ -391,11 +395,13 @@ For project/timeline video editing, use:
|
|
|
391
395
|
npx makaron-cli chat --project <id|auto> --video input.mp4 -b "make it funny"
|
|
392
396
|
```
|
|
393
397
|
|
|
394
|
-
Options for `video create`: `--script "..."`, `--script-file <path>`, `--image <url>` (repeatable, up to the selected model limit), `--video <file|url>` and `--audio <file|url>` (repeatable where supported), `--duration <seconds>`, `--aspect 9:16|16:9|1:1`, `--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|kling|grok|google-omni|minimax-h3|sync-lipsync-v3`, `--video-resolution auto|480p|720p|768p|1080p|2k|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
|
|
398
|
+
Options for `video create`: `--script "..."`, `--script-file <path>`, `--image <url>` (repeatable, up to the selected model limit), `--video <file|url>` and `--audio <file|url>` (repeatable where supported), `--voice <xai-preset-id>` (repeatable, Grok only), `--duration <seconds>`, `--aspect 9:16|16:9|1:1`, `--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|wan-3.0|wan-3.0-pro|kling|grok|google-omni|minimax-h3|sync-lipsync-v3`, `--video-resolution auto|480p|720p|768p|1080p|2k|4k`. Default model is `seedance-fast`. SeeDance accepts native text-to-video with no image and integer output duration 4-15s (default 5s); every Seedance image input is submitted through reference-to-video, including one image. `seedance-mini` supports 480p/720p and is best for cheaper drafts/multi-size tests. Wan 3.0 Standard supports 480p/720p/1080p and Wan 3.0 Pro supports 1080p/2K/4K through MuleRouter. MiniMax H3 accepts native text-to-video, 4-15s output, public 768p/2k resolution, and up to 9 image, up to 3 video, and up to 3 audio feature references through Makaron Agent/chat; a single image keeps the `reference_image` role. `sync-lipsync-v3` requires exactly one video plus one MP3/WAV and preserves that replacement audio while aligning the mouth. H3 defaults to 768p; request 2k explicitly for maximum/final quality. Kling supports 5-15s. Grok generation uses `grok-imagine-video-1.5`: text-only generation supports 480p/720p/1080p, while any 1-7 image or preset voice input uses reference-to-video and is capped at 720p. Grok edit/extend uses `grok-imagine-video` internally under the same `grok` selector. Gemini Omni supports 3-10s fast image/video generation and editing with native generated audio; every image-only generation request uses `reference_to_video`, including a single image, with up to 6 images when no video reference is provided.
|
|
395
399
|
|
|
396
400
|
Seedance 2.5: use `--video-model seedance-2.5` for 4-30 second output at 480p/720p. `--image` accepts local files or URLs (up to 30), while repeatable `--video` and `--audio` accept up to 10 each. Use `--video-operation generate|edit|extend`, `--extend-direction forward|backward`, `--output-format mp4|mov`, `--web-search`, `--generated-audio` / `--no-generated-audio`, and `--relaxed-content-filter`. Edit/extend require a video reference. The Evolink route does not currently expose 4K output.
|
|
397
401
|
|
|
398
|
-
|
|
402
|
+
Wan 3.0: use `--video-model wan-3.0` for MuleRouter Standard at 480p/720p/1080p, or `--video-model wan-3.0-pro` for MuleRouter Pro super-resolution at 1080p/2K/4K. Both support 2-30 second generation with up to 10 images, 5 videos, and 5 audio references. Use generation mode with feature references; typed edit/extend and `--relaxed-content-filter` are not supported.
|
|
403
|
+
|
|
404
|
+
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 minimax-h3 --video` uses H3 feature/reference mode: up to 3 video references totaling <=15s, each <=50MB with width/height 256-5760px and aspect ratio 0.4-2.5. `--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. `--video-model grok --video --operation edit` accepts one MP4 up to 8.7s, retains duration/aspect, and caps output at 720p. `--operation extend` accepts one 2-15s MP4 and adds 2-10s (default 6s); the returned result includes the original plus extension.
|
|
399
405
|
|
|
400
406
|
### `music` — Music generation
|
|
401
407
|
|
|
@@ -511,7 +517,7 @@ send_message "All done!"
|
|
|
511
517
|
- One project = one conversation thread. All history is preserved.
|
|
512
518
|
- One active Agent Run at a time per project. A new message received while it is active is appended to that same Agent Run and processed at a durable work-unit boundary; it does not interrupt the execution or create a second owner for an in-progress Studio workflow.
|
|
513
519
|
- Multi-image: `create --image a.jpg --image b.jpg` or `chat --image ref.jpg`.
|
|
514
|
-
- Provider-generated videos can take 3-5 minutes; Grok
|
|
520
|
+
- Provider-generated videos can take 3-5 minutes; current Grok generation/edit probes are usually around 15-60 seconds; Gemini Omni is usually around 30-70 seconds plus Storage handoff. Remotion compositions should be converted with `materialize` / `responses get --materialize`, and timing should be read from `duration_seconds`, `render_seconds`, and `realtime_ratio`.
|
|
515
521
|
- Music takes ~60 seconds. Appears in output when done.
|
|
516
522
|
- Images are typically ready in 15-30 seconds.
|
|
517
523
|
- stdout is always machine-readable JSON/text. Human-friendly logs go to stderr.
|
package/bin/makaron.mjs
CHANGED
|
@@ -33,7 +33,10 @@ const CHAT_AGENT_MODELS = [
|
|
|
33
33
|
'gpt-5.6-terra',
|
|
34
34
|
'gpt-5.6-sol',
|
|
35
35
|
'gpt-5.6-luna',
|
|
36
|
-
'
|
|
36
|
+
'gpt-5.6-terra-codex-subscription',
|
|
37
|
+
'gpt-5.6-sol-codex-subscription',
|
|
38
|
+
'gpt-5.6-luna-codex-subscription',
|
|
39
|
+
'grok-4.6',
|
|
37
40
|
'deepseek-v4-pro',
|
|
38
41
|
];
|
|
39
42
|
|
|
@@ -62,6 +65,8 @@ const SEEDANCE_MIN_VIDEO_ASPECT = 0.4;
|
|
|
62
65
|
const SEEDANCE_MAX_VIDEO_ASPECT = 2.5;
|
|
63
66
|
const MINIMAX_H3_MIN_VIDEO_SIDE = 256;
|
|
64
67
|
const MINIMAX_H3_MAX_VIDEO_SIDE = 5760;
|
|
68
|
+
const MULEROUTER_WAN_MAX_VIDEO_SIDE = 4096;
|
|
69
|
+
const MULEROUTER_WAN_MAX_VIDEO_FILE_SIZE = 100 * 1024 * 1024;
|
|
65
70
|
|
|
66
71
|
function warnLegacyModelFlag(replacement) {
|
|
67
72
|
process.stderr.write(`⚠️ --model is deprecated here; use ${replacement}.\n`);
|
|
@@ -456,14 +461,16 @@ Options:
|
|
|
456
461
|
--media-manifest <file|-> Import typed image/video media before this run.
|
|
457
462
|
--skill <id|label|name> Use an installed skill or auto-install a matched marketplace skill.
|
|
458
463
|
--agent-model <id> Agent LLM only: auto, gpt-5.6-terra, gpt-5.6-sol,
|
|
459
|
-
gpt-5.6-luna, grok-4.
|
|
464
|
+
gpt-5.6-luna, grok-4.6, deepseek-v4-pro, or a
|
|
465
|
+
gpt-5.6-*-codex-subscription personal-plan route.
|
|
460
466
|
--background, -b Submit and print a runId.
|
|
461
467
|
--json Output structured JSON.
|
|
462
468
|
--stream Legacy live SSE stream.
|
|
463
469
|
--help, -h Show this help.
|
|
464
470
|
|
|
465
|
-
Agent LLM defaults to auto (
|
|
466
|
-
|
|
471
|
+
Agent LLM defaults to auto (GPT-5.6 Terra; the account owner uses the personal
|
|
472
|
+
Codex plan). Base GPT-5.6 ids select Azure API; append -codex-subscription to
|
|
473
|
+
select the personal plan explicitly. Image/video model routing stays automatic in chat.
|
|
467
474
|
|
|
468
475
|
What you can ask:
|
|
469
476
|
Image edit
|
|
@@ -495,6 +502,9 @@ What you can ask:
|
|
|
495
502
|
Compare Agent LLMs with identical inputs
|
|
496
503
|
makaron chat --project auto --agent-model deepseek-v4-pro -b --json "make a 20s badminton video"
|
|
497
504
|
|
|
505
|
+
Force the personal Codex plan
|
|
506
|
+
makaron chat --project auto --agent-model gpt-5.6-sol-codex-subscription -b --json "reply with the active model"
|
|
507
|
+
|
|
498
508
|
Music
|
|
499
509
|
makaron chat --project <id> "add calm piano background music"
|
|
500
510
|
|
|
@@ -2037,14 +2047,16 @@ Not sure which built-in skill to use? Start with:
|
|
|
2037
2047
|
console.log('Usage: makaron analyze --video <file|url> ["question"]');
|
|
2038
2048
|
} else if (topic === 'video') {
|
|
2039
2049
|
if (subtopic === 'script') console.log('Usage: makaron video script --image <file> [--image <file>] [--lang en|zh] "direction"');
|
|
2040
|
-
else if (subtopic === 'create') console.log('Usage: makaron video create --script "..." [--image <url> ...] [--video <url> ...] [--audio <url> ...] [--duration 10] [--aspect 9:16] [--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|kling|grok|google-omni|minimax-h3|sync-lipsync-v3] [--operation generate|edit|extend] [--video-resolution auto|480p|720p|768p|1080p|2k|4k] [--keep-original-sound]');
|
|
2050
|
+
else if (subtopic === 'create') console.log('Usage: makaron video create --script "..." [--image <url> ...] [--video <url> ...] [--audio <url> ...] [--voice <xai-preset-id> ...] [--duration 10] [--aspect 9:16] [--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|wan-3.0|wan-3.0-pro|kling|grok|google-omni|minimax-h3|sync-lipsync-v3] [--operation generate|edit|extend] [--video-resolution auto|480p|720p|768p|1080p|2k|4k] [--keep-original-sound]');
|
|
2041
2051
|
else if (subtopic === 'status') console.log('Usage: makaron video status <taskId> | --snapshot <snapshotId> [--wait]');
|
|
2042
2052
|
else console.log(`Video commands:
|
|
2043
2053
|
video script --image <file> [--image <file>] "direction" Write video script
|
|
2044
2054
|
video create --script "..." --video-model seedance-fast Native text-to-video (no image required)
|
|
2055
|
+
video create --script "..." --video-model wan-3.0 Wan 3.0 Standard via MuleRouter
|
|
2056
|
+
video create --script "..." --video-model wan-3.0-pro Wan 3.0 Pro super-resolution via MuleRouter
|
|
2045
2057
|
video create --script "..." --video-model minimax-h3 MiniMax H3 text-to-video (default 768P)
|
|
2046
2058
|
video create --script "..." --image <url> [--duration 10] Submit video task
|
|
2047
|
-
video create --script "..." --video <
|
|
2059
|
+
video create --script "..." --video <file|url> --video-model grok [--operation edit|extend] Edit or extend one MP4 with Grok
|
|
2048
2060
|
video create --script "Use the supplied audio" --video <url> --audio <url> --video-model sync-lipsync-v3 Lip-sync exact replacement audio
|
|
2049
2061
|
video status <taskId> Check video status
|
|
2050
2062
|
video status --snapshot <snapshotId> [--wait] Check v2 video snapshot
|
|
@@ -2851,9 +2863,10 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
|
|
|
2851
2863
|
if (text) console.log(text);
|
|
2852
2864
|
|
|
2853
2865
|
} else if (sub === 'create') {
|
|
2854
|
-
|
|
2866
|
+
let images = [];
|
|
2855
2867
|
const videos = [];
|
|
2856
2868
|
const audios = [];
|
|
2869
|
+
const referenceVoices = [];
|
|
2857
2870
|
let script = '', duration = undefined, aspectRatio = undefined, videoModel = undefined, videoResolution = undefined, wait = false;
|
|
2858
2871
|
let keepOriginalSound = false, videoOperation = undefined, extendDirection = undefined, outputFormat = undefined;
|
|
2859
2872
|
let generateAudio = undefined, contentFilter = undefined, webSearch = false;
|
|
@@ -2861,6 +2874,7 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
|
|
|
2861
2874
|
if (args[i] === '--image' && args[i + 1]) images.push(args[++i]);
|
|
2862
2875
|
else if (args[i] === '--video' && args[i + 1]) videos.push(args[++i]);
|
|
2863
2876
|
else if (args[i] === '--audio' && args[i + 1]) audios.push(args[++i]);
|
|
2877
|
+
else if (args[i] === '--voice' && args[i + 1]) referenceVoices.push(args[++i]);
|
|
2864
2878
|
else if (args[i] === '--script' && args[i + 1]) script = args[++i];
|
|
2865
2879
|
else if (args[i] === '--script-file' && args[i + 1]) script = fs.readFileSync(args[++i], 'utf-8');
|
|
2866
2880
|
else if (args[i] === '--duration' && args[i + 1]) duration = Number(args[++i]);
|
|
@@ -2886,27 +2900,43 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
|
|
|
2886
2900
|
}
|
|
2887
2901
|
else if (args[i] === '--wait') wait = true;
|
|
2888
2902
|
}
|
|
2889
|
-
const selectedVideoModel =
|
|
2903
|
+
const selectedVideoModel = ['wan3', 'wan3.0', 'wan30', 'wan-3'].includes(videoModel)
|
|
2904
|
+
? 'wan-3.0'
|
|
2905
|
+
: ['wan3-pro', 'wan3.0-pro', 'wan30-pro', 'wan-3-pro', 'berry-1.0-pro'].includes(videoModel)
|
|
2906
|
+
? 'wan-3.0-pro'
|
|
2907
|
+
: (videoModel || 'seedance-fast');
|
|
2890
2908
|
const isSeedance25 = selectedVideoModel === 'seedance-2.5';
|
|
2909
|
+
const isWan30 = selectedVideoModel === 'wan-3.0' || selectedVideoModel === 'wan-3.0-pro';
|
|
2891
2910
|
const isSeedanceModel = selectedVideoModel === 'seedance-fast' || selectedVideoModel === 'seedance-mini' || selectedVideoModel === 'seedance' || isSeedance25;
|
|
2892
2911
|
const isMinimaxH3 = selectedVideoModel === 'minimax-h3';
|
|
2912
|
+
const isGrok = selectedVideoModel === 'grok';
|
|
2913
|
+
const isGoogleOmni = selectedVideoModel === 'google-omni';
|
|
2893
2914
|
const isSyncLipsync = selectedVideoModel === 'sync-lipsync-v3';
|
|
2894
|
-
const supportsNativeTextToVideo = isSeedanceModel || isMinimaxH3;
|
|
2895
|
-
if (!script || (!images.length && !videos.length && !audios.length && !supportsNativeTextToVideo)) {
|
|
2896
|
-
console.error('Usage: makaron video create --script "..." [--image <url>] [--video <file|url>] [--audio <file|url>] [--duration 30] [--video-model seedance-2.5|minimax-h3]');
|
|
2915
|
+
const supportsNativeTextToVideo = isSeedanceModel || isWan30 || isMinimaxH3 || isGrok || isGoogleOmni;
|
|
2916
|
+
if (!script || (!images.length && !videos.length && !audios.length && !referenceVoices.length && !supportsNativeTextToVideo)) {
|
|
2917
|
+
console.error('Usage: makaron video create --script "..." [--image <url>] [--video <file|url>] [--audio <file|url>] [--duration 30] [--video-model seedance-2.5|wan-3.0|wan-3.0-pro|minimax-h3]');
|
|
2897
2918
|
process.exit(1);
|
|
2898
2919
|
}
|
|
2899
2920
|
if (isSeedance25 && images.length > 30) { console.error('Seedance 2.5 supports at most 30 image references.'); process.exit(1); }
|
|
2900
2921
|
if (isSeedance25 && videos.length > 10) { console.error('Seedance 2.5 supports at most 10 video references.'); process.exit(1); }
|
|
2901
2922
|
if (isSeedance25 && audios.length > 10) { console.error('Seedance 2.5 supports at most 10 audio references.'); process.exit(1); }
|
|
2923
|
+
if (isWan30 && images.length > 10) { console.error('Wan 3.0 supports at most 10 image references.'); process.exit(1); }
|
|
2924
|
+
if (isWan30 && videos.length > 5) { console.error('Wan 3.0 supports at most 5 video references.'); process.exit(1); }
|
|
2925
|
+
if (isWan30 && audios.length > 5) { console.error('Wan 3.0 supports at most 5 audio references.'); process.exit(1); }
|
|
2902
2926
|
if (isMinimaxH3 && images.length > 9) { console.error('MiniMax H3 supports at most 9 image references.'); process.exit(1); }
|
|
2903
2927
|
if (isMinimaxH3 && videos.length > 3) { console.error('MiniMax H3 supports at most 3 video references.'); process.exit(1); }
|
|
2904
2928
|
if (isMinimaxH3 && audios.length > 3) { console.error('MiniMax H3 supports at most 3 audio references.'); process.exit(1); }
|
|
2929
|
+
if (isGrok && images.length > 7) { console.error('Grok Imagine Video 1.5 supports at most 7 image references.'); process.exit(1); }
|
|
2930
|
+
if (isGrok && videos.length > 1) { console.error('Grok video edit/extend accepts exactly one source video.'); process.exit(1); }
|
|
2931
|
+
if (isGrok && referenceVoices.length > 3) { console.error('Grok Imagine Video 1.5 supports at most 3 preset voices.'); process.exit(1); }
|
|
2932
|
+
if (!isGrok && referenceVoices.length) { console.error('--voice is currently supported only with --video-model grok.'); process.exit(1); }
|
|
2905
2933
|
if (isSyncLipsync && (images.length !== 0 || videos.length !== 1 || audios.length !== 1)) { console.error('Sync Lipsync v3 requires exactly one --video and one --audio, with no --image.'); process.exit(1); }
|
|
2906
2934
|
if (isSyncLipsync && !/<<<audio_1>>>/i.test(script)) {
|
|
2907
2935
|
script += '\nUse <<<audio_1>>> as the exact replacement soundtrack.';
|
|
2908
2936
|
}
|
|
2909
2937
|
if (videoOperation && !['generate', 'edit', 'extend'].includes(videoOperation)) { console.error('--video-operation must be generate, edit, or extend.'); process.exit(1); }
|
|
2938
|
+
if (isWan30 && videoOperation && videoOperation !== 'generate') { console.error('Wan 3.0 supports generation with feature references, not typed edit or extend.'); process.exit(1); }
|
|
2939
|
+
if (!isSeedance25 && contentFilter === false) { console.error('--relaxed-content-filter is only supported with --video-model seedance-2.5.'); process.exit(1); }
|
|
2910
2940
|
if (extendDirection && !['forward', 'backward'].includes(extendDirection)) { console.error('--extend-direction must be forward or backward.'); process.exit(1); }
|
|
2911
2941
|
if (outputFormat && !['mp4', 'mov'].includes(outputFormat)) { console.error('--output-format must be mp4 or mov.'); process.exit(1); }
|
|
2912
2942
|
|
|
@@ -2915,9 +2945,11 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
|
|
|
2915
2945
|
process.exit(1);
|
|
2916
2946
|
}
|
|
2917
2947
|
|
|
2948
|
+
const inferredOperation = videoOperation || ((isSeedance25 || isGrok) && videos.length ? 'edit' : 'generate');
|
|
2918
2949
|
let providerMaxDuration = isSeedance25 ? SEEDANCE25_MAX_VIDEO_REFERENCE_DURATION : MAX_VIDEO_PROVIDER_REFERENCE_DURATION;
|
|
2950
|
+
if (isGrok) providerMaxDuration = inferredOperation === 'edit' ? 8.7 : 15;
|
|
2919
2951
|
if (isSyncLipsync) providerMaxDuration = 60;
|
|
2920
|
-
const providerMaxPixels = isSyncLipsync || isMinimaxH3 ? Infinity : isSeedance25 ? SEEDANCE25_MAX_VIDEO_FRAME_PIXELS : MAX_VIDEO_FRAME_PIXELS;
|
|
2952
|
+
const providerMaxPixels = isSyncLipsync || isMinimaxH3 || isWan30 ? Infinity : isSeedance25 ? SEEDANCE25_MAX_VIDEO_FRAME_PIXELS : MAX_VIDEO_FRAME_PIXELS;
|
|
2921
2953
|
const localImages = images.filter(image => !isHttpUrl(image));
|
|
2922
2954
|
if (localImages.length) {
|
|
2923
2955
|
const uploadedImages = await uploadImageFilesViaSignedUrl(baseUrl, headers, undefined, localImages);
|
|
@@ -2932,13 +2964,21 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
|
|
|
2932
2964
|
maxDuration: providerMaxDuration,
|
|
2933
2965
|
durationTolerance: MAX_VIDEO_PROVIDER_REFERENCE_DURATION_TOLERANCE,
|
|
2934
2966
|
maxFramePixels: providerMaxPixels,
|
|
2935
|
-
maxFileSize: isSeedance25 || isSyncLipsync ? 200 * 1024 * 1024 : MAX_VIDEO_UPLOAD_FILE_SIZE,
|
|
2936
|
-
...(
|
|
2967
|
+
maxFileSize: isWan30 ? MULEROUTER_WAN_MAX_VIDEO_FILE_SIZE : isSeedance25 || isSyncLipsync ? 200 * 1024 * 1024 : MAX_VIDEO_UPLOAD_FILE_SIZE,
|
|
2968
|
+
...(isGrok ? {
|
|
2969
|
+
allowedExtensions: ['mp4'],
|
|
2970
|
+
} : selectedVideoModel === 'minimax-h3' ? {
|
|
2937
2971
|
allowedExtensions: ['mp4', 'mov'],
|
|
2938
2972
|
minSide: MINIMAX_H3_MIN_VIDEO_SIDE,
|
|
2939
2973
|
maxSide: MINIMAX_H3_MAX_VIDEO_SIDE,
|
|
2940
2974
|
minAspect: SEEDANCE_MIN_VIDEO_ASPECT,
|
|
2941
2975
|
maxAspect: SEEDANCE_MAX_VIDEO_ASPECT,
|
|
2976
|
+
} : isWan30 ? {
|
|
2977
|
+
minSide: 240,
|
|
2978
|
+
maxSide: MULEROUTER_WAN_MAX_VIDEO_SIDE,
|
|
2979
|
+
minAspect: 0.125,
|
|
2980
|
+
maxAspect: 8,
|
|
2981
|
+
allowedExtensions: ['mp4', 'mov'],
|
|
2942
2982
|
} : isSeedanceModel ? {
|
|
2943
2983
|
minFramePixels: SEEDANCE_MIN_VIDEO_FRAME_PIXELS,
|
|
2944
2984
|
minSide: SEEDANCE_MIN_VIDEO_SIDE,
|
|
@@ -2967,21 +3007,22 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
|
|
|
2967
3007
|
}
|
|
2968
3008
|
// Standalone MCP tool (no project timeline write)
|
|
2969
3009
|
process.stderr.write('🎬 Submitting video...\n');
|
|
2970
|
-
const resolvedOperation =
|
|
3010
|
+
const resolvedOperation = inferredOperation;
|
|
2971
3011
|
const vArgs = isSyncLipsync
|
|
2972
3012
|
? { script, images, videoUrls, audioUrls, videoModel: selectedVideoModel, videoResolution }
|
|
2973
|
-
: isSeedance25
|
|
2974
|
-
? { script, images, videoUrls, audioUrls, videoModel: selectedVideoModel, videoResolution, operation: resolvedOperation, extendDirection, outputFormat, generateAudio, contentFilter, webSearch }
|
|
3013
|
+
: isSeedance25 || isWan30 || isGrok
|
|
3014
|
+
? { script, images, videoUrls, audioUrls, referenceVoiceIds: referenceVoices, videoModel: selectedVideoModel, videoResolution, operation: resolvedOperation, extendDirection, outputFormat, generateAudio, contentFilter, webSearch }
|
|
2975
3015
|
: isMinimaxH3
|
|
2976
3016
|
? { script, images, videoUrls, audioUrls, videoModel: selectedVideoModel, videoResolution }
|
|
2977
3017
|
: videoUrls[0]
|
|
2978
3018
|
? { videoUrl: videoUrls[0], editPrompt: script, images, videoModel: selectedVideoModel, videoResolution, referType: isSeedanceModel ? 'feature' : 'base' }
|
|
2979
3019
|
: { script, images, videoModel: selectedVideoModel, videoResolution };
|
|
3020
|
+
if (inputVideoMeta?.duration) vArgs.referenceVideoDuration = inputVideoMeta.duration;
|
|
2980
3021
|
const effectiveDuration = resolvedOperation === 'edit' ? undefined : duration || (inputVideoMeta?.duration ? Math.min(providerMaxDuration, Math.round(inputVideoMeta.duration)) : undefined);
|
|
2981
3022
|
if (effectiveDuration) vArgs.duration = effectiveDuration;
|
|
2982
3023
|
if (aspectRatio) vArgs.aspectRatio = aspectRatio;
|
|
2983
3024
|
if (keepOriginalSound && videoUrls.length && !isSeedance25) vArgs.keepOriginalSound = true;
|
|
2984
|
-
const result = await callMcpTool(baseUrl, headers, videoUrls.length && !isSeedance25 && !isMinimaxH3 && !isSyncLipsync ? 'makaron_edit_video' : 'makaron_create_video', vArgs);
|
|
3025
|
+
const result = await callMcpTool(baseUrl, headers, videoUrls.length && !isSeedance25 && !isWan30 && !isGrok && !isMinimaxH3 && !isSyncLipsync ? 'makaron_edit_video' : 'makaron_create_video', vArgs);
|
|
2985
3026
|
const text = result?.content?.find(c => c.type === 'text')?.text;
|
|
2986
3027
|
if (text) {
|
|
2987
3028
|
console.log(text);
|
|
@@ -3025,9 +3066,11 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
|
|
|
3025
3066
|
console.log(`Video commands:
|
|
3026
3067
|
video script --image <file> [--image <file>] "direction" Write video script
|
|
3027
3068
|
video create --script "..." --video-model seedance-fast Native text-to-video (no image required)
|
|
3069
|
+
video create --script "..." --video-model wan-3.0 Wan 3.0 Standard via MuleRouter
|
|
3070
|
+
video create --script "..." --video-model wan-3.0-pro Wan 3.0 Pro super-resolution via MuleRouter
|
|
3028
3071
|
video create --script "..." --video-model minimax-h3 MiniMax H3 text-to-video (default 768P)
|
|
3029
3072
|
video create --script "..." --image <url> [--duration 10] Submit video task
|
|
3030
|
-
video create --script "..." --video <
|
|
3073
|
+
video create --script "..." --video <file|url> --video-model grok [--operation edit|extend] Edit or extend one MP4 with Grok
|
|
3031
3074
|
video create --script "Use the supplied audio" --video <url> --audio <url> --video-model sync-lipsync-v3 Lip-sync exact replacement audio
|
|
3032
3075
|
video status <taskId> Check video status
|
|
3033
3076
|
video status --snapshot <snapshotId> [--wait] Check v2 video snapshot
|
package/package.json
CHANGED
package/skills/makaron/SKILL.md
CHANGED
|
@@ -85,10 +85,11 @@ npx makaron-cli chat --project auto --image photo.jpg --json -b "make it cinemat
|
|
|
85
85
|
npx makaron-cli chat --project auto --image img1.jpg --image img2.jpg --json -b "combine these"
|
|
86
86
|
```
|
|
87
87
|
|
|
88
|
-
`chat` routes image and video models automatically. Use `--agent-model` only when the user explicitly asks to select or compare the reasoning/tool-calling Agent LLM. Accepted values are
|
|
88
|
+
`chat` routes image and video models automatically. Use `--agent-model` only when the user explicitly asks to select or compare the reasoning/tool-calling Agent LLM. Accepted values are `auto`, the base model IDs (`gpt-5.6-terra`, `gpt-5.6-sol`, `gpt-5.6-luna`, `grok-4.6`, `deepseek-v4-pro`), and the personal-plan routes (`gpt-5.6-terra-codex-subscription`, `gpt-5.6-sol-codex-subscription`, `gpt-5.6-luna-codex-subscription`). For the configured owner, `auto` uses GPT-5.6 Terra through the personal Codex plan; base GPT-5.6 IDs select Azure API, while suffixed IDs explicitly select the personal plan. Never put an image or video model ID in `--agent-model`.
|
|
89
89
|
|
|
90
90
|
```bash
|
|
91
91
|
npx makaron-cli chat --project auto --agent-model deepseek-v4-pro --json -b "make a 20s badminton video"
|
|
92
|
+
npx makaron-cli chat --project auto --agent-model gpt-5.6-sol-codex-subscription --json -b "reply with the active model"
|
|
92
93
|
```
|
|
93
94
|
|
|
94
95
|
Returns immediately:
|
|
@@ -309,11 +310,11 @@ npx makaron-cli video script --image img1.jpg "cinematic story"
|
|
|
309
310
|
# 2. Analyze a video (standalone, no timeline write)
|
|
310
311
|
npx makaron-cli analyze --video input.mp4 "describe the key actions and pacing"
|
|
311
312
|
|
|
312
|
-
# 3a. Submit
|
|
313
|
+
# 3a. Submit reference-to-video rendering (images must be public URLs from step 1 or uploaded)
|
|
313
314
|
npx makaron-cli video create --script "Shot 1 (5s): <<<image_1>>> ..." --image https://...jpg --duration 5 --video-model kling
|
|
314
315
|
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
|
|
315
316
|
|
|
316
|
-
# 3b. Native SeeDance or MiniMax H3 text-to-video (no image required)
|
|
317
|
+
# 3b. Native SeeDance, Wan 3.0, or MiniMax H3 text-to-video (no image required)
|
|
317
318
|
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
|
|
318
319
|
npx makaron-cli video create --script "Shot 1 (15s): A premium creative editor comes alive" --duration 15 --video-model minimax-h3 --aspect 16:9
|
|
319
320
|
|
|
@@ -331,11 +332,15 @@ npx makaron-cli video status <taskId>
|
|
|
331
332
|
npx makaron-cli chat --project <id|auto> --video input.mp4 -b "make it funny"
|
|
332
333
|
```
|
|
333
334
|
|
|
334
|
-
Options for `video create`: `--script "..."`, `--script-file <path>`, `--image <url>` (repeatable, up to the selected model limit), `--video <file|url>` and `--audio <file|url>` (repeatable where supported), `--duration <seconds>`, `--aspect 9:16|16:9|1:1`, `--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|kling|grok|google-omni|minimax-h3|sync-lipsync-v3`, `--video-resolution auto|480p|720p|768p|1080p|2k|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
|
|
335
|
+
Options for `video create`: `--script "..."`, `--script-file <path>`, `--image <url>` (repeatable, up to the selected model limit), `--video <file|url>` and `--audio <file|url>` (repeatable where supported), `--voice <xai-preset-id>` (repeatable, Grok only), `--duration <seconds>`, `--aspect 9:16|16:9|1:1`, `--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|wan-3.0|wan-3.0-pro|kling|grok|google-omni|minimax-h3|sync-lipsync-v3`, `--video-resolution auto|480p|720p|768p|1080p|2k|4k`. Default model is `seedance-fast`. SeeDance accepts native text-to-video with no image and integer output duration 4-15s (default 5s); every Seedance image input uses reference-to-video, including one image. `seedance-mini` supports 480p/720p and is best for cheaper drafts/multi-size tests. Wan 3.0 Standard supports 480p/720p/1080p and Wan 3.0 Pro supports 1080p/2K/4K through MuleRouter. MiniMax H3 accepts native text-to-video, 4-15s output, public 768p/2k resolution, and up to 9 image, up to 3 video, and up to 3 audio feature references through Makaron Agent/chat; a single image keeps the `reference_image` role. `sync-lipsync-v3` requires exactly one video plus one MP3/WAV and preserves that replacement audio while aligning the mouth. H3 defaults to 768p; request 2k explicitly for maximum/final quality. Kling supports 5-15s. Grok text-only generation supports 480p/720p/1080p; any 1-7 image or preset voice input uses reference-to-video and is capped at 720p. Grok edit/extend uses `grok-imagine-video` internally. Gemini Omni image-only generation always uses `reference_to_video`, including one image, with up to 6 images when no video reference is provided.
|
|
336
|
+
|
|
337
|
+
Provider integration contract: every image passed to video generation is a feature reference by default, even when there is exactly one image. Never infer image-to-video/first-frame mode from image count. A first-frame workflow may be added only as a separately declared model capability and an explicit caller request.
|
|
335
338
|
|
|
336
339
|
Seedance 2.5 uses `--video-model seedance-2.5` and supports 4-30s at 480p/720p, up to 30 images + 10 videos + 10 audios, repeatable local/URL references, `--video-operation generate|edit|extend`, `--extend-direction`, `--output-format mp4|mov`, and `--web-search`. The Evolink route does not currently expose 4K output.
|
|
337
340
|
|
|
338
|
-
|
|
341
|
+
Wan 3.0 uses `--video-model wan-3.0` for MuleRouter Standard at 480p/720p/1080p, or `--video-model wan-3.0-pro` for MuleRouter Pro super-resolution at 1080p/2K/4K. Both support 2-30s generation, up to 10 images + 5 videos + 5 audios, and native audio. Use generation mode with feature references; typed edit/extend and the relaxed content-filter flag are not supported.
|
|
342
|
+
|
|
343
|
+
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 minimax-h3 --video` uses H3 feature/reference mode: up to 3 video references totaling <=15s, each <=50MB with width/height 256-5760px and aspect ratio 0.4-2.5. `--video-model google-omni --video` uses Gemini Omni direct video editing and accepts one reference video in Makaron. `--video-model grok --video --operation edit` accepts one MP4 up to 8.7s and caps output at 720p; `--operation extend` accepts one 2-15s MP4 and adds 2-10s.
|
|
339
344
|
|
|
340
345
|
### `music` — Music generation
|
|
341
346
|
|
|
@@ -469,7 +474,7 @@ send_message "All done!"
|
|
|
469
474
|
- One project = one conversation thread. All history is preserved.
|
|
470
475
|
- One active Agent Run at a time per project. A new message received while it is active is appended to that same Agent Run and processed at a durable work-unit boundary; it does not interrupt the execution or create a second owner for an in-progress Studio workflow.
|
|
471
476
|
- Multi-image: `create --image a.jpg --image b.jpg` or `chat --image ref.jpg`.
|
|
472
|
-
- Provider-generated videos can take 3-5 minutes; Grok
|
|
477
|
+
- Provider-generated videos can take 3-5 minutes; current Grok generation/edit probes are usually around 15-60 seconds; Gemini Omni is usually around 30-70 seconds plus Storage handoff. Remotion compositions should be converted with `materialize` / `responses get --materialize`, and timing should be read from `duration_seconds`, `render_seconds`, and `realtime_ratio`.
|
|
473
478
|
- Music takes ~60 seconds. Appears in output when done.
|
|
474
479
|
- Images are typically ready in 15-30 seconds.
|
|
475
480
|
- stdout is always machine-readable JSON/text. Human-friendly logs go to stderr.
|