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 +17 -9
- package/bin/makaron.mjs +71 -17
- package/package.json +1 -1
- package/skills/makaron/SKILL.md +16 -8
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
|
-
#
|
|
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>
|
|
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
|
|
1556
|
-
MAKARON_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 "..."
|
|
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
|
-
|
|
2308
|
-
|
|
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
package/skills/makaron/SKILL.md
CHANGED
|
@@ -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
|
-
#
|
|
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
|
|