@remixmate/cli 0.9.20 → 0.9.21
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/dist/capabilities.d.ts +3 -0
- package/dist/handlers/gen-video.d.ts +3 -1
- package/dist/handlers/gen-video.js +62 -7
- package/dist/manifest.json +48 -22
- package/package.json +1 -1
- package/skills/gen-image/skill.json +7 -7
- package/skills/gen-script/skill.json +6 -7
- package/skills/gen-video/SKILL.md +56 -1
- package/skills/gen-video/skill.json +31 -5
package/dist/capabilities.d.ts
CHANGED
|
@@ -18,6 +18,9 @@ export interface ModelConstraints {
|
|
|
18
18
|
durationMax?: number;
|
|
19
19
|
durationDefault?: number;
|
|
20
20
|
refImageMax?: number;
|
|
21
|
+
/** Omni-modal reference caps (Seedance 2.0): videos and audio clips per request. */
|
|
22
|
+
refVideoMax?: number;
|
|
23
|
+
refAudioMax?: number;
|
|
21
24
|
sizes?: string[];
|
|
22
25
|
/** aspect-ratio → [width, height] pixel preset (Seedream). Per model: the same
|
|
23
26
|
* ratio maps to different pixels on different Seedream variants. */
|
|
@@ -11,7 +11,9 @@
|
|
|
11
11
|
* server-side, so an unknown value still passes through to the backend.
|
|
12
12
|
*
|
|
13
13
|
* Local image paths for first/last/reference frames are read and base64-encoded
|
|
14
|
-
* into a data: URI; https / data: URIs pass through unchanged.
|
|
14
|
+
* into a data: URI; https / data: URIs pass through unchanged. Reference videos
|
|
15
|
+
* and audio are the exception — they must already be public URLs, see
|
|
16
|
+
* `requirePublicUrls`.
|
|
15
17
|
*/
|
|
16
18
|
import type { HandlerContext, HandlerInput } from './index.js';
|
|
17
19
|
export declare function genVideo(input: HandlerInput, ctxIn: HandlerContext): Promise<void>;
|
|
@@ -11,14 +11,16 @@
|
|
|
11
11
|
* server-side, so an unknown value still passes through to the backend.
|
|
12
12
|
*
|
|
13
13
|
* Local image paths for first/last/reference frames are read and base64-encoded
|
|
14
|
-
* into a data: URI; https / data: URIs pass through unchanged.
|
|
14
|
+
* into a data: URI; https / data: URIs pass through unchanged. Reference videos
|
|
15
|
+
* and audio are the exception — they must already be public URLs, see
|
|
16
|
+
* `requirePublicUrls`.
|
|
15
17
|
*/
|
|
16
18
|
import { mmPost, pollUntil, resolveHttpContext, SkillError } from '../http.js';
|
|
17
19
|
import { getCapabilities, matchModel, defaultModel } from '../capabilities.js';
|
|
18
20
|
import { emitProgress } from '../progress.js';
|
|
19
21
|
import { isTrue, resolveImageInput, toNumber, toStringArray } from './shared.js';
|
|
20
22
|
/** Generic, catalog-driven validation. No model names live here. */
|
|
21
|
-
function validateAgainstConstraints(descriptor, duration, ratio, resolution,
|
|
23
|
+
function validateAgainstConstraints(descriptor, duration, ratio, resolution, refs) {
|
|
22
24
|
const c = descriptor.constraints;
|
|
23
25
|
const label = descriptor.label || descriptor.id;
|
|
24
26
|
if (c.durations && c.durations.length > 0) {
|
|
@@ -37,12 +39,35 @@ function validateAgainstConstraints(descriptor, duration, ratio, resolution, ref
|
|
|
37
39
|
if (c.resolutions && c.resolutions.length > 0 && !c.resolutions.includes(resolution)) {
|
|
38
40
|
throw new SkillError(`❌ ${label} resolution must be one of: ${c.resolutions.join(', ')}; got: ${resolution}`);
|
|
39
41
|
}
|
|
40
|
-
if (c.refImageMax !== undefined &&
|
|
42
|
+
if (c.refImageMax !== undefined && refs.images > c.refImageMax) {
|
|
41
43
|
if (c.refImageMax === 0) {
|
|
42
44
|
throw new SkillError(`❌ ${label} does not support a reference-image array; use --first-frame / --last-frame instead`);
|
|
43
45
|
}
|
|
44
|
-
throw new SkillError(`❌ ${label} accepts at most ${c.refImageMax} reference images; got: ${
|
|
46
|
+
throw new SkillError(`❌ ${label} accepts at most ${c.refImageMax} reference images; got: ${refs.images}`);
|
|
45
47
|
}
|
|
48
|
+
if (c.refVideoMax !== undefined && refs.videos > c.refVideoMax) {
|
|
49
|
+
throw new SkillError(`❌ ${label} accepts at most ${c.refVideoMax} reference videos; got: ${refs.videos}`);
|
|
50
|
+
}
|
|
51
|
+
if (c.refAudioMax !== undefined && refs.audios > c.refAudioMax) {
|
|
52
|
+
throw new SkillError(`❌ ${label} accepts at most ${c.refAudioMax} reference audio clips; got: ${refs.audios}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Reference videos / audio must be public https URLs.
|
|
57
|
+
*
|
|
58
|
+
* Unlike images, they are NOT inlined as data URIs: the caps are 50 MB per video
|
|
59
|
+
* and 15 MB per clip, and base64 inflates that by a third before it ever reaches
|
|
60
|
+
* the gateway. Failing here with the offending path beats a truncated upload or
|
|
61
|
+
* an opaque 413 three hops downstream.
|
|
62
|
+
*/
|
|
63
|
+
function requirePublicUrls(values, flag) {
|
|
64
|
+
return values.map((value) => {
|
|
65
|
+
const url = value.trim();
|
|
66
|
+
if (!/^https?:\/\//i.test(url)) {
|
|
67
|
+
throw new SkillError(`❌ ${flag} needs a public http(s) URL (local files are not uploaded), received: ${value}`);
|
|
68
|
+
}
|
|
69
|
+
return url;
|
|
70
|
+
});
|
|
46
71
|
}
|
|
47
72
|
async function pollVideoStatus(ctx, taskId) {
|
|
48
73
|
return pollUntil(async () => {
|
|
@@ -69,10 +94,26 @@ export async function genVideo(input, ctxIn) {
|
|
|
69
94
|
const firstFrame = input.first_frame ? resolveImageInput(String(input.first_frame)) : '';
|
|
70
95
|
const lastFrame = input.last_frame ? resolveImageInput(String(input.last_frame)) : '';
|
|
71
96
|
const references = toStringArray(input.reference).map(resolveImageInput).filter(Boolean);
|
|
97
|
+
const referenceVideos = requirePublicUrls(toStringArray(input.reference_video).filter(Boolean), '--reference-video');
|
|
98
|
+
const referenceAudios = requirePublicUrls(toStringArray(input.reference_audio).filter(Boolean), '--reference-audio');
|
|
72
99
|
const prompt = (input.prompt ?? '').trim();
|
|
73
|
-
const hasVisual = Boolean(firstFrame || lastFrame || references.length > 0);
|
|
100
|
+
const hasVisual = Boolean(firstFrame || lastFrame || references.length > 0 || referenceVideos.length > 0);
|
|
74
101
|
if (!prompt && !hasVisual) {
|
|
75
|
-
throw new SkillError('❌ Provide at least one of: a non-empty --prompt, or --first-frame / --last-frame / --reference');
|
|
102
|
+
throw new SkillError('❌ Provide at least one of: a non-empty --prompt, or --first-frame / --last-frame / --reference / --reference-video');
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Two shapes the backend rejects outright; catching them here saves a round
|
|
106
|
+
* trip and names the flag that caused it.
|
|
107
|
+
*
|
|
108
|
+
* - first/last frame pins exact frames, omni-modal reference lets the model
|
|
109
|
+
* re-cut — the API has no meaning for both at once;
|
|
110
|
+
* - audio-only (or text + audio) input is not a supported modality mix.
|
|
111
|
+
*/
|
|
112
|
+
if ((firstFrame || lastFrame) && (referenceVideos.length > 0 || referenceAudios.length > 0)) {
|
|
113
|
+
throw new SkillError('❌ --reference-video / --reference-audio cannot be combined with --first-frame / --last-frame; use --reference for images instead');
|
|
114
|
+
}
|
|
115
|
+
if (referenceAudios.length > 0 && references.length === 0 && referenceVideos.length === 0) {
|
|
116
|
+
throw new SkillError('❌ --reference-audio needs at least one --reference image or --reference-video alongside it');
|
|
76
117
|
}
|
|
77
118
|
const ratio = input.ratio ?? '16:9';
|
|
78
119
|
const resolution = input.resolution ?? '720p';
|
|
@@ -80,7 +121,11 @@ export async function genVideo(input, ctxIn) {
|
|
|
80
121
|
const seed = toNumber(input.seed, 'seed');
|
|
81
122
|
// Pre-flight validation only when we recognize the model (have its constraints).
|
|
82
123
|
if (descriptor) {
|
|
83
|
-
validateAgainstConstraints(descriptor, duration, ratio, resolution,
|
|
124
|
+
validateAgainstConstraints(descriptor, duration, ratio, resolution, {
|
|
125
|
+
images: references.length,
|
|
126
|
+
videos: referenceVideos.length,
|
|
127
|
+
audios: referenceAudios.length,
|
|
128
|
+
});
|
|
84
129
|
}
|
|
85
130
|
const ctx = await resolveHttpContext(ctxIn.skillName, {
|
|
86
131
|
apiBaseUrl,
|
|
@@ -103,6 +148,16 @@ export async function genVideo(input, ctxIn) {
|
|
|
103
148
|
payload.lastFrameImage = lastFrame;
|
|
104
149
|
if (references.length > 0)
|
|
105
150
|
payload.referenceImages = references;
|
|
151
|
+
if (referenceVideos.length > 0)
|
|
152
|
+
payload.referenceVideos = referenceVideos;
|
|
153
|
+
if (referenceAudios.length > 0)
|
|
154
|
+
payload.referenceAudios = referenceAudios;
|
|
155
|
+
// Web search only fires on text-only input; sending it alongside attachments
|
|
156
|
+
// would be a knob the model silently ignores.
|
|
157
|
+
if (isTrue(input.web_search) && !hasVisual)
|
|
158
|
+
payload.webSearch = true;
|
|
159
|
+
if (isTrue(input.return_last_frame))
|
|
160
|
+
payload.returnLastFrame = true;
|
|
106
161
|
if (input.negative_prompt && String(input.negative_prompt).trim()) {
|
|
107
162
|
payload.negativePrompt = String(input.negative_prompt).trim();
|
|
108
163
|
}
|
package/dist/manifest.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"version": "0.9.
|
|
4
|
-
"generatedAt": "2026-09-
|
|
3
|
+
"version": "0.9.21",
|
|
4
|
+
"generatedAt": "2026-09-05T08:18:35.420Z",
|
|
5
5
|
"skills": [
|
|
6
6
|
{
|
|
7
7
|
"id": "export-jianying",
|
|
@@ -302,21 +302,21 @@
|
|
|
302
302
|
"ui": {
|
|
303
303
|
"primary": [
|
|
304
304
|
"prompt",
|
|
305
|
+
"reference",
|
|
305
306
|
"model",
|
|
306
|
-
"size"
|
|
307
|
+
"size",
|
|
308
|
+
"n"
|
|
307
309
|
],
|
|
308
310
|
"advanced": [
|
|
309
|
-
"
|
|
310
|
-
"reference",
|
|
311
|
-
"negative_prompt",
|
|
312
|
-
"image_strength"
|
|
311
|
+
"negative_prompt"
|
|
313
312
|
],
|
|
314
313
|
"hidden": [
|
|
315
314
|
"json_output",
|
|
315
|
+
"watermark",
|
|
316
|
+
"resolution",
|
|
316
317
|
"seed",
|
|
317
318
|
"guidance_scale",
|
|
318
|
-
"
|
|
319
|
-
"resolution"
|
|
319
|
+
"image_strength"
|
|
320
320
|
]
|
|
321
321
|
}
|
|
322
322
|
},
|
|
@@ -427,11 +427,12 @@
|
|
|
427
427
|
},
|
|
428
428
|
"ui": {
|
|
429
429
|
"primary": [
|
|
430
|
-
"topic"
|
|
431
|
-
"platform",
|
|
432
|
-
"duration"
|
|
430
|
+
"topic"
|
|
433
431
|
],
|
|
434
|
-
"advanced": [
|
|
432
|
+
"advanced": [],
|
|
433
|
+
"hidden": [
|
|
434
|
+
"platform",
|
|
435
|
+
"duration",
|
|
435
436
|
"style",
|
|
436
437
|
"ratio",
|
|
437
438
|
"scenes",
|
|
@@ -440,9 +441,7 @@
|
|
|
440
441
|
"headline",
|
|
441
442
|
"subheadline",
|
|
442
443
|
"carousel_items",
|
|
443
|
-
"caption_lines"
|
|
444
|
-
],
|
|
445
|
-
"hidden": [
|
|
444
|
+
"caption_lines",
|
|
446
445
|
"stub_image_url",
|
|
447
446
|
"stub_video_url",
|
|
448
447
|
"skip_asset_generation"
|
|
@@ -459,7 +458,8 @@
|
|
|
459
458
|
"triggers": [
|
|
460
459
|
"Text-to-video, AI-generated clip, \"make a short video of ...\"",
|
|
461
460
|
"Generate video with Doubao / Seedance",
|
|
462
|
-
"Image-to-video, first-frame / last-frame, reference-image-to-video"
|
|
461
|
+
"Image-to-video, first-frame / last-frame, reference-image-to-video",
|
|
462
|
+
"Reference video / reference audio, \"same camera move as this clip\", \"use this track\""
|
|
463
463
|
],
|
|
464
464
|
"entry": {
|
|
465
465
|
"type": "http",
|
|
@@ -510,6 +510,28 @@
|
|
|
510
510
|
},
|
|
511
511
|
"description": "Reference images: local file path, https URL, or data URI. Up to 9; combinable with first_frame / last_frame."
|
|
512
512
|
},
|
|
513
|
+
"reference_video": {
|
|
514
|
+
"type": "array",
|
|
515
|
+
"items": {
|
|
516
|
+
"type": "string"
|
|
517
|
+
},
|
|
518
|
+
"description": "Reference videos (https URL only, must be publicly reachable). Up to 3. The model borrows their subject, camera work and style. Cannot be combined with first_frame / last_frame."
|
|
519
|
+
},
|
|
520
|
+
"reference_audio": {
|
|
521
|
+
"type": "array",
|
|
522
|
+
"items": {
|
|
523
|
+
"type": "string"
|
|
524
|
+
},
|
|
525
|
+
"description": "Reference audio (https URL only, must be publicly reachable). Up to 3. Borrows timbre, melody or dialogue. Needs at least one reference image or video alongside it; cannot be combined with first_frame / last_frame."
|
|
526
|
+
},
|
|
527
|
+
"web_search": {
|
|
528
|
+
"type": "boolean",
|
|
529
|
+
"description": "Let the model search the web for up-to-date subjects before generating. Text-only input — ignored once any image / video / audio is attached."
|
|
530
|
+
},
|
|
531
|
+
"return_last_frame": {
|
|
532
|
+
"type": "boolean",
|
|
533
|
+
"description": "Also return the generated clip's last frame, to chain it into the next shot"
|
|
534
|
+
},
|
|
513
535
|
"generate_audio": {
|
|
514
536
|
"type": "boolean",
|
|
515
537
|
"description": "Generate native audio"
|
|
@@ -524,7 +546,7 @@
|
|
|
524
546
|
},
|
|
525
547
|
"seed": {
|
|
526
548
|
"type": "number",
|
|
527
|
-
"description": "Random seed. Pass the same seed with the same prompt and model to make a run reproducible."
|
|
549
|
+
"description": "Random seed, -1 for random. Pass the same seed with the same prompt and model to make a run reproducible."
|
|
528
550
|
},
|
|
529
551
|
"person_generation": {
|
|
530
552
|
"type": "string",
|
|
@@ -548,19 +570,23 @@
|
|
|
548
570
|
"prompt",
|
|
549
571
|
"model",
|
|
550
572
|
"duration",
|
|
551
|
-
"ratio"
|
|
573
|
+
"ratio",
|
|
574
|
+
"resolution"
|
|
552
575
|
],
|
|
553
576
|
"advanced": [
|
|
554
|
-
"resolution",
|
|
555
577
|
"first_frame",
|
|
556
578
|
"last_frame",
|
|
557
579
|
"reference",
|
|
580
|
+
"reference_video",
|
|
581
|
+
"reference_audio",
|
|
558
582
|
"generate_audio",
|
|
559
|
-
"camera_fixed"
|
|
583
|
+
"camera_fixed",
|
|
584
|
+
"web_search",
|
|
585
|
+
"return_last_frame",
|
|
586
|
+
"seed"
|
|
560
587
|
],
|
|
561
588
|
"hidden": [
|
|
562
589
|
"json_output",
|
|
563
|
-
"seed",
|
|
564
590
|
"negative_prompt",
|
|
565
591
|
"person_generation"
|
|
566
592
|
]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remixmate/cli",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.21",
|
|
4
4
|
"description": "AI media generation skills for Claude Code / Codex — 12 skills covering image, video, voice, digital human, web screenshot, web recording, script, template registry, rendering, Jianying export, and video deconstruction.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -84,21 +84,21 @@
|
|
|
84
84
|
"ui": {
|
|
85
85
|
"primary": [
|
|
86
86
|
"prompt",
|
|
87
|
+
"reference",
|
|
87
88
|
"model",
|
|
88
|
-
"size"
|
|
89
|
+
"size",
|
|
90
|
+
"n"
|
|
89
91
|
],
|
|
90
92
|
"advanced": [
|
|
91
|
-
"
|
|
92
|
-
"reference",
|
|
93
|
-
"negative_prompt",
|
|
94
|
-
"image_strength"
|
|
93
|
+
"negative_prompt"
|
|
95
94
|
],
|
|
96
95
|
"hidden": [
|
|
97
96
|
"json_output",
|
|
97
|
+
"watermark",
|
|
98
|
+
"resolution",
|
|
98
99
|
"seed",
|
|
99
100
|
"guidance_scale",
|
|
100
|
-
"
|
|
101
|
-
"resolution"
|
|
101
|
+
"image_strength"
|
|
102
102
|
]
|
|
103
103
|
}
|
|
104
104
|
}
|
|
@@ -97,11 +97,12 @@
|
|
|
97
97
|
},
|
|
98
98
|
"ui": {
|
|
99
99
|
"primary": [
|
|
100
|
-
"topic"
|
|
101
|
-
"platform",
|
|
102
|
-
"duration"
|
|
100
|
+
"topic"
|
|
103
101
|
],
|
|
104
|
-
"advanced": [
|
|
102
|
+
"advanced": [],
|
|
103
|
+
"hidden": [
|
|
104
|
+
"platform",
|
|
105
|
+
"duration",
|
|
105
106
|
"style",
|
|
106
107
|
"ratio",
|
|
107
108
|
"scenes",
|
|
@@ -110,9 +111,7 @@
|
|
|
110
111
|
"headline",
|
|
111
112
|
"subheadline",
|
|
112
113
|
"carousel_items",
|
|
113
|
-
"caption_lines"
|
|
114
|
-
],
|
|
115
|
-
"hidden": [
|
|
114
|
+
"caption_lines",
|
|
116
115
|
"stub_image_url",
|
|
117
116
|
"stub_video_url",
|
|
118
117
|
"skip_asset_generation"
|
|
@@ -7,12 +7,14 @@ description: |
|
|
|
7
7
|
- Text-to-video, AI-generated clip, "make a short video of ..."
|
|
8
8
|
- Generate video with Doubao / Seedance
|
|
9
9
|
- Image-to-video, first-frame / last-frame, reference-image-to-video
|
|
10
|
+
- Omni-modal reference: borrow the look of a reference image, the camera work of a reference video, or the voice / music of a reference audio clip
|
|
10
11
|
|
|
11
12
|
Even without an explicit "use AI", any request that turns a description into a moving clip should route here.
|
|
12
13
|
triggers:
|
|
13
14
|
- Text-to-video, AI-generated clip, "make a short video of ..."
|
|
14
15
|
- Generate video with Doubao / Seedance
|
|
15
16
|
- Image-to-video, first-frame / last-frame, reference-image-to-video
|
|
17
|
+
- Reference video / reference audio, "same camera move as this clip", "use this track"
|
|
16
18
|
---
|
|
17
19
|
|
|
18
20
|
# AI Video Generation Skill
|
|
@@ -52,10 +54,34 @@ so they are absent from the catalog and `--model veo` will fail.
|
|
|
52
54
|
| **Duration** | 4–15 seconds (continuous integers) |
|
|
53
55
|
| **First / last frame** | yes |
|
|
54
56
|
| **Reference images** | yes, up to 9 |
|
|
57
|
+
| **Reference videos** | yes, up to 3 (public https URLs) |
|
|
58
|
+
| **Reference audio** | yes, up to 3 (public https URLs) |
|
|
55
59
|
| **Generated audio** | yes |
|
|
56
60
|
| **Fixed camera** | yes |
|
|
61
|
+
| **Web search** | yes, text-only input |
|
|
57
62
|
| **Negative prompt** | ignored (Veo-only parameter) |
|
|
58
63
|
|
|
64
|
+
4k output exists on the standard tier upstream but is **not offered here** — the credit
|
|
65
|
+
pricing table has no 4k row, so a 4k run would be billed at the 720p rate.
|
|
66
|
+
|
|
67
|
+
### Two input modes, and they do not mix
|
|
68
|
+
|
|
69
|
+
- **Pinned frames** — `--first-frame` / `--last-frame` fix the exact opening and closing
|
|
70
|
+
images. Reference images may be added alongside.
|
|
71
|
+
- **Omni-modal reference** — `--reference` (images) / `--reference-video` / `--reference-audio`
|
|
72
|
+
hand the model material to borrow from; it decides the framing.
|
|
73
|
+
|
|
74
|
+
Combining a pinned frame with a reference video or audio is rejected (by the CLI, and by the
|
|
75
|
+
backend). Audio alone is not a valid input either: `--reference-audio` needs at least one
|
|
76
|
+
reference image or video with it.
|
|
77
|
+
|
|
78
|
+
In the prompt, refer to attachments as **"image 1" / "video 2" / "audio 1"**, numbered per
|
|
79
|
+
type in the order you passed them. That is the only way the model can tell them apart —
|
|
80
|
+
file names and asset ids mean nothing to it.
|
|
81
|
+
|
|
82
|
+
Reference images and videos containing **real human faces are rejected upstream** by the
|
|
83
|
+
Seedance 2.0 content filter; the run fails before it charges.
|
|
84
|
+
|
|
59
85
|
## Auth & environment
|
|
60
86
|
|
|
61
87
|
No skill-local env file — the executing process inherits the system environment.
|
|
@@ -123,6 +149,31 @@ remixmate gen-video \
|
|
|
123
149
|
--duration 8
|
|
124
150
|
```
|
|
125
151
|
|
|
152
|
+
### Omni-modal reference (image + video + audio)
|
|
153
|
+
|
|
154
|
+
Videos and audio must be public https URLs — unlike images they are not uploaded.
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
remixmate gen-video \
|
|
158
|
+
--prompt "Keep the first-person framing of video 1 and use audio 1 as the score; the product from image 1 is lifted toward the lens" \
|
|
159
|
+
--reference ./product.png \
|
|
160
|
+
--reference-video https://example.com/handheld.mp4 \
|
|
161
|
+
--reference-audio https://example.com/score.mp3 \
|
|
162
|
+
--duration 8 \
|
|
163
|
+
--generate-audio
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Fresh subjects (web search)
|
|
167
|
+
|
|
168
|
+
Only fires on text-only input; attaching any image / video / audio turns it off.
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
remixmate gen-video \
|
|
172
|
+
--prompt "<a subject the model may not know: a new product, a current event>" \
|
|
173
|
+
--web-search \
|
|
174
|
+
--duration 5
|
|
175
|
+
```
|
|
176
|
+
|
|
126
177
|
## Common CLI flags
|
|
127
178
|
|
|
128
179
|
| Flag | Description | Default |
|
|
@@ -135,10 +186,14 @@ remixmate gen-video \
|
|
|
135
186
|
| `--first-frame` | First-frame image: local path, https URL, or data URI | none |
|
|
136
187
|
| `--last-frame` | Last-frame image | none |
|
|
137
188
|
| `--reference` | Reference image (repeatable, max 9) | none |
|
|
189
|
+
| `--reference-video` | Reference video, public https URL (repeatable, max 3) | none |
|
|
190
|
+
| `--reference-audio` | Reference audio, public https URL (repeatable, max 3) | none |
|
|
138
191
|
| `--generate-audio` | Generate native audio | off |
|
|
139
192
|
| `--camera-fixed` | Fixed camera | off |
|
|
193
|
+
| `--web-search` | Search the web first (text-only input) | off |
|
|
194
|
+
| `--return-last-frame` | Also return the clip's last frame, to chain shots | off |
|
|
140
195
|
| `--negative-prompt` | Negative prompt (Veo only; ignored by Seedance) | none |
|
|
141
|
-
| `--seed` | Random seed | none |
|
|
196
|
+
| `--seed` | Random seed; `-1` = random | none |
|
|
142
197
|
| `--person-generation` | Person policy: `allow_all` / `dont_allow` (Veo) | none |
|
|
143
198
|
| `--api-base-url` | Override API root | see above |
|
|
144
199
|
| `--priv-token` | Override token | see above |
|
|
@@ -55,6 +55,28 @@
|
|
|
55
55
|
},
|
|
56
56
|
"description": "Reference images: local file path, https URL, or data URI. Up to 9; combinable with first_frame / last_frame."
|
|
57
57
|
},
|
|
58
|
+
"reference_video": {
|
|
59
|
+
"type": "array",
|
|
60
|
+
"items": {
|
|
61
|
+
"type": "string"
|
|
62
|
+
},
|
|
63
|
+
"description": "Reference videos (https URL only, must be publicly reachable). Up to 3. The model borrows their subject, camera work and style. Cannot be combined with first_frame / last_frame."
|
|
64
|
+
},
|
|
65
|
+
"reference_audio": {
|
|
66
|
+
"type": "array",
|
|
67
|
+
"items": {
|
|
68
|
+
"type": "string"
|
|
69
|
+
},
|
|
70
|
+
"description": "Reference audio (https URL only, must be publicly reachable). Up to 3. Borrows timbre, melody or dialogue. Needs at least one reference image or video alongside it; cannot be combined with first_frame / last_frame."
|
|
71
|
+
},
|
|
72
|
+
"web_search": {
|
|
73
|
+
"type": "boolean",
|
|
74
|
+
"description": "Let the model search the web for up-to-date subjects before generating. Text-only input — ignored once any image / video / audio is attached."
|
|
75
|
+
},
|
|
76
|
+
"return_last_frame": {
|
|
77
|
+
"type": "boolean",
|
|
78
|
+
"description": "Also return the generated clip's last frame, to chain it into the next shot"
|
|
79
|
+
},
|
|
58
80
|
"generate_audio": {
|
|
59
81
|
"type": "boolean",
|
|
60
82
|
"description": "Generate native audio"
|
|
@@ -69,7 +91,7 @@
|
|
|
69
91
|
},
|
|
70
92
|
"seed": {
|
|
71
93
|
"type": "number",
|
|
72
|
-
"description": "Random seed. Pass the same seed with the same prompt and model to make a run reproducible."
|
|
94
|
+
"description": "Random seed, -1 for random. Pass the same seed with the same prompt and model to make a run reproducible."
|
|
73
95
|
},
|
|
74
96
|
"person_generation": {
|
|
75
97
|
"type": "string",
|
|
@@ -93,19 +115,23 @@
|
|
|
93
115
|
"prompt",
|
|
94
116
|
"model",
|
|
95
117
|
"duration",
|
|
96
|
-
"ratio"
|
|
118
|
+
"ratio",
|
|
119
|
+
"resolution"
|
|
97
120
|
],
|
|
98
121
|
"advanced": [
|
|
99
|
-
"resolution",
|
|
100
122
|
"first_frame",
|
|
101
123
|
"last_frame",
|
|
102
124
|
"reference",
|
|
125
|
+
"reference_video",
|
|
126
|
+
"reference_audio",
|
|
103
127
|
"generate_audio",
|
|
104
|
-
"camera_fixed"
|
|
128
|
+
"camera_fixed",
|
|
129
|
+
"web_search",
|
|
130
|
+
"return_last_frame",
|
|
131
|
+
"seed"
|
|
105
132
|
],
|
|
106
133
|
"hidden": [
|
|
107
134
|
"json_output",
|
|
108
|
-
"seed",
|
|
109
135
|
"negative_prompt",
|
|
110
136
|
"person_generation"
|
|
111
137
|
]
|