@mrgoonie/multix 0.0.2 → 0.0.6
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/CHANGELOG.md +29 -0
- package/README.md +154 -2
- package/dist/cli.js +3161 -602
- package/package.json +11 -3
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,35 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.0.6] - 2026-05-05
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- `multix byteplus generate-3d` (alias `3d`) — BytePlus Hyper3D / Hitem3d 3D generation on the ARK async tasks endpoint. Models: `hyper3d-gen2-260112` (text-to-3D + image-to-3D, 1–5 refs), `hitem3d-2-0-251223` (image-to-3D). Provider-specific knobs (`--mesh_mode`, `--hd_texture`, `--material`, `--ff`, `--resolution`, …) passed via `--flags <raw>` pass-through. Auto-detects output extension (`.glb` / `.gltf` / `.zip` …) from response URL.
|
|
12
|
+
- `multix byteplus status --download` extended to also fetch `content.file_url` for 3D tasks alongside `content.video_url` for video.
|
|
13
|
+
- New env override: `BYTEPLUS_3D_MODEL` (default `hyper3d-gen2-260112`).
|
|
14
|
+
|
|
15
|
+
## [0.0.5] - 2026-05-05
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
- `multix <provider> image-to-image` (alias `i2i`) for all five providers — BytePlus (Seedream multi-ref), Gemini (Nano Banana edit/compose), OpenRouter (chat-image with `image_url` parts), Leonardo (init image via existing imageId), MiniMax (subject_reference; CAVEAT: not free-form editing — preserves character identity in a new prompt).
|
|
19
|
+
- Promoted `src/core/image-input.ts` (URL / local-file resolver, base64 inlining with configurable size caps) so all providers share one resolver.
|
|
20
|
+
|
|
21
|
+
## [0.0.4] - 2026-05-04
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
- `--wait` / `--wait-timeout` / `--download` / `--output` / `--no-thumb` flags across all video commands (BytePlus, Gemini, Leonardo, MiniMax, OpenRouter) for unified poll-and-download UX.
|
|
25
|
+
- Auto-detection and download of video thumbnails (`cover_image_url`, `thumbnail_url`, `first_frame_url`, etc.) saved beside the video as `<base>_thumb.<ext>`.
|
|
26
|
+
- `multix leonardo status` now supports `--wait` / `--download`; `multix openrouter video-status` now polls properly instead of single GET.
|
|
27
|
+
- `.env.example` documenting all supported environment variables (provider keys, model overrides, CLI behavior).
|
|
28
|
+
- Core helper `src/core/video-thumb.ts` with `detectThumbUrl`, `downloadThumbBeside`, `maybeDownloadThumb`.
|
|
29
|
+
|
|
30
|
+
## [0.0.3] - 2026-05-03
|
|
31
|
+
|
|
32
|
+
### Added
|
|
33
|
+
- `multix gemini generate-speech` — Gemini 3.1 Flash TTS with single- and multi-speaker (max 2) modes, 30 prebuilt voices, WAV (default) or raw PCM output. Models: `gemini-3.1-flash-tts-preview` (default), `gemini-2.5-flash-preview-tts`, `gemini-2.5-pro-preview-tts`. Env: `GEMINI_TTS_MODEL` / `TTS_MODEL`.
|
|
34
|
+
- `multix byteplus` — BytePlus provider: Seedream 4.0 image generation (`generate`), Seedance 2.0 text-to-video (`video`), image-to-video (`image-to-video` / `i2v`), reference-to-video with up to 9 image + 3 video + 3 audio refs (`reference-to-video` / `r2v`), task polling (`status`). Env: `BYTEPLUS_API_KEY` (or `ARK_API_KEY`), plus model + base-url overrides.
|
|
35
|
+
- `multix check` now reports BytePlus key status alongside the other providers.
|
|
36
|
+
|
|
8
37
|
## [0.0.1] - 2026-05-02
|
|
9
38
|
|
|
10
39
|
### Added
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
AI multimodal CLI — generate images/video/speech/music, analyze and transcribe media files, convert documents to Markdown, and optimize media with ffmpeg/ImageMagick.
|
|
4
4
|
|
|
5
|
-
Supports **Gemini** (analyze, transcribe, generate, Veo video), **MiniMax** (image, video, speech, music),
|
|
5
|
+
Supports **Gemini** (analyze, transcribe, generate, Veo video, Flash TTS), **MiniMax** (image, video, speech, music), **OpenRouter** (image generation), **Leonardo.Ai** (image, video, upscale), and **BytePlus** (Seedream image, Seedance video, Hyper3D / Hitem3d 3D).
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
@@ -42,12 +42,24 @@ Set at least one provider key. Add to `.env` in your project root or `~/.multix/
|
|
|
42
42
|
| `GEMINI_API_KEY` | For Gemini | [AI Studio](https://aistudio.google.com/apikey) |
|
|
43
43
|
| `OPENROUTER_API_KEY` | For OpenRouter | [OpenRouter](https://openrouter.ai/settings/keys) |
|
|
44
44
|
| `MINIMAX_API_KEY` | For MiniMax | [MiniMax](https://platform.minimax.io/user-center/basic-information/interface-key) |
|
|
45
|
+
| `LEONARDO_API_KEY` | For Leonardo | [Leonardo](https://app.leonardo.ai/settings/api-keys) |
|
|
46
|
+
| `LEONARDO_BASE_URL` | No | Override Leonardo API base (default `https://cloud.leonardo.ai/api/rest/v1`) |
|
|
47
|
+
| `LEONARDO_DEFAULT_MODEL` | No | Default Leonardo image model UUID |
|
|
48
|
+
| `LEONARDO_VIDEO_MODEL` | No | Default Leonardo video model (default `MOTION2`) |
|
|
49
|
+
| `BYTEPLUS_API_KEY` | For BytePlus | [BytePlus](https://console.byteplus.com/auth/api-keys) |
|
|
50
|
+
| `ARK_API_KEY` | No | Fallback for `BYTEPLUS_API_KEY` (Volcengine ARK shared name) |
|
|
51
|
+
| `BYTEPLUS_BASE_URL` | No | Override BytePlus base (default `https://ark.ap-southeast.bytepluses.com/api/v3`) |
|
|
52
|
+
| `BYTEPLUS_IMAGE_MODEL` | No | Default Seedream model (default `seedream-4-0-250828`) |
|
|
53
|
+
| `BYTEPLUS_VIDEO_MODEL` | No | Default Seedance model (default `seedance-2.0`) |
|
|
54
|
+
| `BYTEPLUS_VIDEO_PARAMS_MODE` | No | `flags` (default) or `structured` — how video params are encoded |
|
|
55
|
+
| `BYTEPLUS_3D_MODEL` | No | Default 3D model (default `hyper3d-gen2-260112`) |
|
|
45
56
|
| `MULTIX_OUTPUT_DIR` | No | Override default output dir (`./multix-output`) |
|
|
46
57
|
| `OPENROUTER_IMAGE_MODEL` | No | Default OpenRouter model |
|
|
47
58
|
| `OPENROUTER_FALLBACK_MODELS` | No | Comma-separated fallback model ids |
|
|
48
59
|
| `IMAGE_GEN_MODEL` | No | Override Gemini image generation model |
|
|
49
60
|
| `VIDEO_GEN_MODEL` | No | Override Gemini video generation model |
|
|
50
61
|
| `MULTIMODAL_MODEL` | No | Override Gemini analysis model |
|
|
62
|
+
| `GEMINI_TTS_MODEL` / `TTS_MODEL` | No | Override Gemini TTS model (default `gemini-3.1-flash-tts-preview`) |
|
|
51
63
|
|
|
52
64
|
Priority: `process.env` > `cwd/.env` > `~/.multix/.env`.
|
|
53
65
|
|
|
@@ -78,23 +90,43 @@ multix gemini extract --files report.pdf --prompt "Extract tables as JSON" [--fo
|
|
|
78
90
|
# Generate images
|
|
79
91
|
multix gemini generate --prompt "A mountain lake" [--model <id>] [--aspect-ratio 16:9] [--num-images 1] [--size 1K|2K|4K] [--output <path>] [-v]
|
|
80
92
|
|
|
93
|
+
# Image-to-image (Nano Banana — edit/compose from refs, alias: i2i)
|
|
94
|
+
multix gemini image-to-image --prompt "make it watercolor" --ref ./photo.jpg [--ref ./style.png] [--model gemini-2.5-flash-image] [--output <path>] [-v]
|
|
95
|
+
|
|
81
96
|
# Generate video [EXPERIMENTAL — requires billing]
|
|
82
97
|
multix gemini generate-video --prompt "Ocean waves" [--model veo-3.1-generate-preview] [--resolution 720p|1080p] [--aspect-ratio 16:9] [--reference-images first.png last.png] [-v]
|
|
98
|
+
|
|
99
|
+
# Image-to-video with Veo (alias: i2v) [EXPERIMENTAL]
|
|
100
|
+
multix gemini image-to-video <imagePath> --prompt "camera pans left" [--last-frame <path>] [--model veo-3.1-generate-preview] [--resolution 1080p] [--aspect-ratio 16:9] [--output <path>] [-v]
|
|
101
|
+
|
|
102
|
+
# Text-to-speech (Gemini 3.1 Flash TTS — single & multi-speaker)
|
|
103
|
+
multix gemini generate-speech (--text|--prompt) "Say cheerfully: Have a wonderful day!" [--model gemini-3.1-flash-tts-preview] [--voice Kore] [--output-format wav|pcm] [--output <path>] [-v]
|
|
104
|
+
|
|
105
|
+
# Multi-speaker (max 2): repeat --speaker name:voice; prompt should prefix lines with "<name>:"
|
|
106
|
+
multix gemini generate-speech --text "Joe: How's it going? Jane: Not too bad!" \
|
|
107
|
+
--speaker Joe:Kore --speaker Jane:Puck
|
|
83
108
|
```
|
|
84
109
|
|
|
85
110
|
**Gemini models:**
|
|
86
111
|
- Analysis: `gemini-2.5-flash` (default)
|
|
87
112
|
- Image gen: `gemini-3.1-flash-image-preview` (Nano Banana 2, fastest), `gemini-3-pro-image-preview` (4K text), `imagen-4.0-generate-001` (production)
|
|
88
113
|
- Video: `veo-3.1-generate-preview` (requires billing)
|
|
114
|
+
- TTS: `gemini-3.1-flash-tts-preview` (default), `gemini-2.5-flash-preview-tts`, `gemini-2.5-pro-preview-tts`
|
|
89
115
|
|
|
90
116
|
**Aspect ratios:** `1:1 2:3 3:2 3:4 4:3 4:5 5:4 9:16 16:9 21:9`
|
|
91
117
|
|
|
118
|
+
**TTS voices (30 prebuilt):** Zephyr, Puck, Charon, Kore, Fenrir, Leda, Orus, Aoede, Callirrhoe, Autonoe, Enceladus, Iapetus, Umbriel, Algieba, Despina, Erinome, Algenib, Rasalgethi, Laomedeia, Achernar, Alnilam, Schedar, Gacrux, Pulcherrima, Achird, Zubenelgenubi, Vindemiatrix, Sadachbia, Sadaltager, Sulafat. Audio is PCM s16le @ 24 kHz mono — saved as WAV (default) or raw PCM. Style is controlled via natural language in the prompt (`[whispers]`, `Say excitedly:`, etc.). No streaming; max 2 speakers; ~32k token context.
|
|
119
|
+
|
|
92
120
|
### `multix minimax`
|
|
93
121
|
|
|
94
122
|
```bash
|
|
95
123
|
# Generate image
|
|
96
124
|
multix minimax generate --prompt "A cat in space" [--model image-01] [--aspect-ratio 1:1] [--num-images 1] [-v]
|
|
97
125
|
|
|
126
|
+
# Image-to-image (alias: i2i) — CAVEAT: subject_reference only, NOT free-form editing
|
|
127
|
+
# Preserves a character/subject's identity in a NEW scene described by --prompt.
|
|
128
|
+
multix minimax image-to-image --prompt "the same character on a beach" --ref ./hero.jpg [--model image-01] [-v]
|
|
129
|
+
|
|
98
130
|
# Generate video (async, polls until done)
|
|
99
131
|
multix minimax generate-video --prompt "A dancer" [--model MiniMax-Hailuo-2.3] [--duration 6|10] [--resolution 720P|1080P] [--first-frame <url>] [-v]
|
|
100
132
|
|
|
@@ -111,9 +143,113 @@ multix minimax generate-music [--lyrics <str>] [--prompt <str>] [--model music-2
|
|
|
111
143
|
|
|
112
144
|
```bash
|
|
113
145
|
multix openrouter generate --prompt "Retro robot" [--model google/gemini-3.1-flash-image-preview] [--aspect-ratio 1:1] [--image-size <sz>] [--num-images 1] [-v]
|
|
146
|
+
|
|
147
|
+
# Image-to-image (alias: i2i) — refs accept URL or local path
|
|
148
|
+
multix openrouter image-to-image --prompt "make it cyberpunk" --ref ./photo.jpg [--ref https://...] [--model google/gemini-2.5-flash-image] [--output <path>] [-v]
|
|
149
|
+
|
|
150
|
+
# Image-to-video (async — returns job id; image input is URL only)
|
|
151
|
+
multix openrouter image-to-video --prompt "camera pans left" --image-url https://... [--last-frame-url <url>] [--model google/veo-3.1] [--resolution 720p] [--aspect-ratio 16:9] [--duration <n>] [--seed <n>] [-v]
|
|
152
|
+
# alias: multix openrouter i2v --prompt "..." --image-url https://...
|
|
153
|
+
|
|
154
|
+
# Poll a video job (use --download to fetch when completed)
|
|
155
|
+
multix openrouter video-status <jobId> [--download] [--output <path>] [-v]
|
|
156
|
+
|
|
157
|
+
# List available video models
|
|
158
|
+
multix openrouter video-models
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Fallback models from `OPENROUTER_FALLBACK_MODELS` (CSV) are appended to the chat-image payload automatically. Override the default video model with `OPENROUTER_VIDEO_MODEL` (default `google/veo-3.1`).
|
|
162
|
+
|
|
163
|
+
### `multix leonardo`
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
# Account info / remaining credits
|
|
167
|
+
multix leonardo me
|
|
168
|
+
|
|
169
|
+
# List image platform models
|
|
170
|
+
multix leonardo models [--limit <n>]
|
|
171
|
+
|
|
172
|
+
# List video models (static enum)
|
|
173
|
+
multix leonardo video-models
|
|
174
|
+
|
|
175
|
+
# Generate images (polls until COMPLETE, downloads to MULTIX_OUTPUT_DIR)
|
|
176
|
+
multix leonardo generate "a cyberpunk cat" [-m <modelId>] [-w 1024] [-h 1024] [-n 1] [--alchemy] [--ultra] [--style <uuid>] [--seed <n>] [--negative <text>] [--enhance] [--quality HIGH] [--output <path>] [--no-download] [--wait-timeout 480000] [-v]
|
|
177
|
+
|
|
178
|
+
# Image-to-image (alias: i2i) — uses an existing Leonardo image id as init image
|
|
179
|
+
# Direct upload from local path is not yet supported; pass an existing imageId.
|
|
180
|
+
multix leonardo image-to-image --prompt "make it watercolor" --ref <imageId> [--image-type GENERATED|UPLOADED] [--init-strength 0.5] [-m <modelId>] [-w 1024] [-h 1024] [-n 1] [--seed <n>] [--negative <text>] [--output <path>] [--no-download] [-v]
|
|
181
|
+
|
|
182
|
+
# Generate text-to-video (async — returns generationId)
|
|
183
|
+
multix leonardo video "a dancer" [--model MOTION2|VEO3|kling-2.6|...] [--resolution RESOLUTION_720] [--enhance] [--frame-interpolation] [-v]
|
|
184
|
+
|
|
185
|
+
# Generate image-to-video (async — returns generationId)
|
|
186
|
+
multix leonardo image-to-video <imageId> --prompt "camera pans left" [--image-type GENERATED|UPLOADED] [--model MOTION2] [--resolution RESOLUTION_720] [--duration 6] [--seed <n>] [--negative <text>] [--enhance] [--frame-interpolation] [-v]
|
|
187
|
+
# alias: multix leonardo i2v <imageId> --prompt "..."
|
|
188
|
+
|
|
189
|
+
# Check a generation
|
|
190
|
+
multix leonardo status <generationId>
|
|
191
|
+
|
|
192
|
+
# Universal Upscaler (async)
|
|
193
|
+
multix leonardo upscale <generatedImageId> [--style GENERAL] [--strength 0.35] [--multiplier 1.5]
|
|
194
|
+
multix leonardo variation <variationId>
|
|
114
195
|
```
|
|
115
196
|
|
|
116
|
-
|
|
197
|
+
GPT Image models (`gpt-image-*`) and v2 video models (kling/hailuo/ltxv/seedance) are dispatched to Leonardo's `/api/rest/v2` endpoint automatically.
|
|
198
|
+
|
|
199
|
+
### `multix byteplus`
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# Image generation (Seedream 4.0, sync)
|
|
203
|
+
multix byteplus generate --prompt "a cyberpunk cat" [--model seedream-4-0-250828] [--size 2K|1024x1024] [--aspect-ratio 16:9] [-n 1] [--seed <n>] [--no-watermark] [--input-image <path|url>] [--output <path>] [-v]
|
|
204
|
+
|
|
205
|
+
# Image-to-image (alias: i2i) — Seedream with one or more reference images
|
|
206
|
+
multix byteplus image-to-image --prompt "make it cyberpunk" --ref ./photo.jpg [--ref https://...] [--model seedream-4-0-250828] [--size 2K] [--aspect-ratio 16:9] [-n 1] [--seed <n>] [--no-watermark] [--output <path>] [-v]
|
|
207
|
+
|
|
208
|
+
# Text-to-video (Seedance 2.0, async with auto-poll)
|
|
209
|
+
multix byteplus video --prompt "ocean waves" [--model seedance-2.0|seedance-2.0-fast|seedance-2.0-pro] [--resolution 1080p] [--duration 8] [--aspect-ratio 16:9] [--audio|--no-audio] [--seed <n>] [--negative <text>] [--camera-fixed] [--async] [--wait-timeout 600000] [--output <path>] [-v]
|
|
210
|
+
|
|
211
|
+
# Image-to-video (alias: i2v)
|
|
212
|
+
multix byteplus image-to-video <imagePath|url> --prompt "camera pans left" [--last-frame <path|url>] [--model ...] [video flags] [-v]
|
|
213
|
+
multix byteplus i2v ./photo.jpg --prompt "..."
|
|
214
|
+
|
|
215
|
+
# Reference-to-video (alias: r2v) — up to 9 images + 3 videos + 3 audio refs (total ≤12)
|
|
216
|
+
multix byteplus reference-to-video --prompt "..." \
|
|
217
|
+
--ref-image ./hero.jpg:subject \
|
|
218
|
+
--ref-image ./bg.jpg:environment \
|
|
219
|
+
--ref-video ./style.mp4:style \
|
|
220
|
+
--ref-audio ./music.mp3:audio \
|
|
221
|
+
[video flags] [-v]
|
|
222
|
+
# On Windows, escape literal colons in paths with `\:` or use URLs.
|
|
223
|
+
|
|
224
|
+
# 3D model generation (alias: 3d) — Hyper3D / Hitem3d, async with auto-poll + download
|
|
225
|
+
multix byteplus generate-3d --prompt "Quadrupedal mech robot" \
|
|
226
|
+
--flags "--mesh_mode Raw --hd_texture true --material PBR" \
|
|
227
|
+
[--model hyper3d-gen2-260112] [--seed 8648] [--async] [--output model.glb] [-v]
|
|
228
|
+
|
|
229
|
+
# Image-to-3D (1–5 reference images, path or URL)
|
|
230
|
+
multix byteplus 3d --input-image ./front.png ./side.png ./back.png \
|
|
231
|
+
--prompt "Generate from these views" [--model hyper3d-gen2-260112]
|
|
232
|
+
|
|
233
|
+
# Hitem3d uses different flags
|
|
234
|
+
multix byteplus 3d --input-image ./cat.png --model hitem3d-2-0-251223 \
|
|
235
|
+
--flags "--ff 2 --resolution 1536pro"
|
|
236
|
+
|
|
237
|
+
# Poll a task / download MP4
|
|
238
|
+
multix byteplus status <taskId> [--wait] [--wait-timeout 600000] [--download] [--output <path>] [-v]
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
**BytePlus models:**
|
|
242
|
+
- Image: `seedream-4-0-250828`
|
|
243
|
+
- Video: `seedance-2.0-fast`, `seedance-2.0` (default), `seedance-2.0-pro`
|
|
244
|
+
- 3D: `hyper3d-gen2-260112` (Hyper3D Gen2, default — text-to-3D + image-to-3D), `hitem3d-2-0-251223` (Hitem3d 2.0 — image-to-3D)
|
|
245
|
+
|
|
246
|
+
**Notes:**
|
|
247
|
+
- Auth: `BYTEPLUS_API_KEY` is preferred; `ARK_API_KEY` is accepted as a fallback for compatibility with the Volcengine ARK SDK ecosystem.
|
|
248
|
+
- Video params can be encoded as flags inside the prompt text (default, e.g. `--rs 1080p --dur 8 --rt 16:9`) or as a top-level `parameters` object — set `BYTEPLUS_VIDEO_PARAMS_MODE=structured` to switch.
|
|
249
|
+
- 3D model knobs are passed via `--flags <raw>`, appended to the prompt text. Hyper3D supports `--mesh_mode`, `--hd_texture`, `--material`, `--addons`, `--quality_override`, `--use_original_alpha`, `--bbox_condition`, `--TAPose`. Hitem3d supports `--ff`, `--resolution`. See [BytePlus 3D docs](https://docs.byteplus.com/en/docs/ModelArk/2279947).
|
|
250
|
+
- 3D output is a textured model file (`.glb`/`.gltf`/`.zip` depending on flags). The CLI auto-detects the extension from the response URL.
|
|
251
|
+
- `multix byteplus status <taskId> --download` works for both video (`content.video_url`) and 3D (`content.file_url`) tasks.
|
|
252
|
+
- **Task cancellation is not supported** — there is no verified DELETE endpoint on the ARK API. Submitted tasks must run to completion.
|
|
117
253
|
|
|
118
254
|
### `multix media`
|
|
119
255
|
|
|
@@ -148,6 +284,22 @@ Multiple inputs are concatenated with `---` separators into a single output.
|
|
|
148
284
|
|
|
149
285
|
All generated files are saved to `./multix-output/` by default. Override with `MULTIX_OUTPUT_DIR`.
|
|
150
286
|
|
|
287
|
+
### Polling and downloading videos
|
|
288
|
+
|
|
289
|
+
Every video-generating subcommand accepts a uniform set of polling/download flags:
|
|
290
|
+
|
|
291
|
+
| Flag | Description |
|
|
292
|
+
|------|-------------|
|
|
293
|
+
| `--wait` | Poll the provider until the job reaches a terminal status (skip with the provider's `--async` flag where present). |
|
|
294
|
+
| `--wait-timeout <ms>` | Polling timeout (default `600000` = 10 min). |
|
|
295
|
+
| `--download` | Stream the resulting MP4 to disk on success — implies `--wait`. |
|
|
296
|
+
| `--output <path>` | Copy the saved MP4 to a custom path. The thumbnail is copied beside it as `<base>_thumb.<ext>`. |
|
|
297
|
+
| `--no-thumb` | Skip thumbnail download. |
|
|
298
|
+
|
|
299
|
+
Thumbnail detection is automatic: if the provider response includes any of `cover_image_url`, `thumbnail_url`, `thumb_url`, `preview_url`, `first_frame_url`, `poster_url`, or `image_url` (and the value is an `https://…(.jpg|.png|.webp|.gif|.bmp)` URL), the file is downloaded next to the video as `<basename>_thumb.<ext>`. Providers that don't expose a thumbnail simply skip this step.
|
|
300
|
+
|
|
301
|
+
`leonardo video`, `leonardo image-to-video`, and `openrouter image-to-video` are async-by-default for backward compatibility — pass `--wait` (or `--download`) to opt into the synchronous flow.
|
|
302
|
+
|
|
151
303
|
## Troubleshooting
|
|
152
304
|
|
|
153
305
|
**No API key found:** Run `multix check` — it prints setup instructions.
|