@mrgoonie/multix 0.1.0-beta → 0.2.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/CHANGELOG.md CHANGED
@@ -5,12 +5,32 @@ 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.1.0-beta](https://github.com/mrgoonie/multix-cli/compare/v0.0.8...v0.1.0-beta) (2026-05-19)
8
+ ## [0.2.0](https://github.com/mrgoonie/multix-cli/compare/v0.1.1...v0.2.0) (2026-05-27)
9
9
 
10
10
 
11
11
  ### Added
12
12
 
13
- * **openai:** add provider media commands ([#9](https://github.com/mrgoonie/multix-cli/issues/9)) ([4622102](https://github.com/mrgoonie/multix-cli/commit/46221029ac98f6da03653397d20e2e604f7f39c1))
13
+ * improve agent-facing command and skill descriptions ([#19](https://github.com/mrgoonie/multix-cli/issues/19)) ([a0f1dab](https://github.com/mrgoonie/multix-cli/commit/a0f1dab7e76295d5eb6a9d6dff237d28d2832596)), closes [#18](https://github.com/mrgoonie/multix-cli/issues/18)
14
+
15
+ ## [0.1.1](https://github.com/mrgoonie/multix-cli/compare/v0.1.0...v0.1.1) (2026-05-20)
16
+
17
+
18
+ ### Fixed
19
+
20
+ * **release:** merge release PR with explicit repo ([#15](https://github.com/mrgoonie/multix-cli/issues/15)) ([4695e3b](https://github.com/mrgoonie/multix-cli/commit/4695e3b5f6d66e59e5bb34db265beb78ae72c667))
21
+
22
+ ## [0.1.0](https://github.com/mrgoonie/multix-cli/compare/v0.0.8...v0.1.0) (2026-05-20)
23
+
24
+
25
+ ### Added
26
+
27
+ * **openai:** add provider media commands ([#9](https://github.com/mrgoonie/multix-cli/issues/9)) ([#11](https://github.com/mrgoonie/multix-cli/issues/11)) ([512d689](https://github.com/mrgoonie/multix-cli/commit/512d689f3fa5dcb2fb7ccce26a7d8d33b0091564))
28
+
29
+
30
+ ### Fixed
31
+
32
+ * **release:** auto-complete stable releases ([#13](https://github.com/mrgoonie/multix-cli/issues/13)) ([20d65d4](https://github.com/mrgoonie/multix-cli/commit/20d65d46cbacacf28008996f7d13c0a17a00b540))
33
+ * **release:** resolve release PR without checkout ([#14](https://github.com/mrgoonie/multix-cli/issues/14)) ([64632ad](https://github.com/mrgoonie/multix-cli/commit/64632ad08e71a3ed94ac3b12f136403cd9c15651))
14
34
 
15
35
  ## [0.0.8] - 2026-05-11
16
36
 
package/README.md CHANGED
@@ -16,7 +16,7 @@ npx -p @mrgoonie/multix multix --help
16
16
 
17
17
  ## Release channels
18
18
 
19
- - `main` uses Release Please for stable releases. It creates release PRs from conventional commits, bumps semver, updates `CHANGELOG.md`, tags `vX.Y.Z`, and publishes npm with dist-tag `latest`.
19
+ - `main` uses Release Please for stable releases. On a main push it creates and validates a release PR from conventional commits, merges it, tags `vX.Y.Z`, and publishes npm with dist-tag `latest`.
20
20
  - `dev` uses Release Please for beta releases. It creates prerelease PRs like `vX.Y.Z-beta.N` from conventional commits and publishes npm with dist-tag `beta`.
21
21
 
22
22
  ## Quick start
package/dist/cli.js CHANGED
@@ -1240,7 +1240,7 @@ Task: ${taskId}`);
1240
1240
  // src/providers/byteplus/commands/index.ts
1241
1241
  function registerBytePlusCommands(program2) {
1242
1242
  const byteplus = program2.command("byteplus").description(
1243
- "BytePlus ModelArk: Seedream image, Seedance video, Hyper3D / Hitem3d 3D generation"
1243
+ "BytePlus ModelArk: image (Seedream 4.0), video (Seedance 2.0 text/image/reference-to-video), and 3D (Hyper3D / Hitem3d)"
1244
1244
  );
1245
1245
  registerBytePlusGenerateCommand(byteplus);
1246
1246
  registerBytePlusImageToImageCommand(byteplus);
@@ -1998,7 +1998,7 @@ ${data.voices.length} voices${data.has_more ? " (more available)" : ""}`);
1998
1998
  // src/providers/elevenlabs/commands/index.ts
1999
1999
  function registerElevenLabsCommands(program2) {
2000
2000
  const el = program2.command("elevenlabs").description(
2001
- "ElevenLabs: TTS, voices, cloning, STT, voice changer, SFX, music, dubbing, isolation, alignment"
2001
+ "ElevenLabs: text-to-speech, voice cloning, speech-to-text, voice changer, sound effects, music, dubbing, voice isolation, forced alignment"
2002
2002
  );
2003
2003
  registerTtsCommand(el);
2004
2004
  registerVoicesCommand(el);
@@ -3037,7 +3037,7 @@ function registerTranscribeCommand2(parent) {
3037
3037
  // src/providers/gemini/commands/index.ts
3038
3038
  function registerGeminiCommands(program2) {
3039
3039
  const gemini = program2.command("gemini").description(
3040
- "Gemini AI operations: analyze, transcribe, extract, generate images/video/speech"
3040
+ "Gemini: analyze, transcribe, extract data, generate images (Imagen/Nano Banana), video (Veo), and speech (Flash TTS)"
3041
3041
  );
3042
3042
  registerAnalyzeCommand(gemini);
3043
3043
  registerTranscribeCommand2(gemini);
@@ -3722,7 +3722,9 @@ Resolutions: ${LEONARDO_VIDEO_RESOLUTIONS.join(", ")}`);
3722
3722
 
3723
3723
  // src/providers/leonardo/commands/index.ts
3724
3724
  function registerLeonardoCommands(program2) {
3725
- const leonardo = program2.command("leonardo").description("Leonardo.Ai: image/video generation, upscaling, account info");
3725
+ const leonardo = program2.command("leonardo").description(
3726
+ "Leonardo: image generation, video (Motion, Veo, Kling, Hailuo, Seedance, LTX), upscaling, and account info"
3727
+ );
3726
3728
  registerLeonardoGenerateCommand(leonardo);
3727
3729
  registerLeonardoImageToImageCommand(leonardo);
3728
3730
  registerLeonardoVideoCommand(leonardo);
@@ -4348,7 +4350,7 @@ Generated ${saved.length} image(s):`);
4348
4350
 
4349
4351
  // src/providers/minimax/commands/index.ts
4350
4352
  function registerMinimaxCommands(program2) {
4351
- const minimax = program2.command("minimax").description("MiniMax generation: images, video, speech, and music");
4353
+ const minimax = program2.command("minimax").description("MiniMax: generate images, video (Hailuo), speech (TTS), and music");
4352
4354
  registerMinimaxGenerateCommand(minimax);
4353
4355
  registerMinimaxImageToImageCommand(minimax);
4354
4356
  registerMinimaxGenerateVideoCommand(minimax);
@@ -4976,7 +4978,9 @@ function collect6(value, prev) {
4976
4978
 
4977
4979
  // src/providers/openai/commands/index.ts
4978
4980
  function registerOpenAICommands(program2) {
4979
- const openai = program2.command("openai").description("OpenAI image generation/editing, TTS, STT, and experimental Codex image driver");
4981
+ const openai = program2.command("openai").description(
4982
+ "OpenAI: image generation/editing (GPT-Image, Codex driver), text-to-speech (TTS), speech-to-text (STT)"
4983
+ );
4980
4984
  registerOpenAIGenerateCommand(openai);
4981
4985
  registerOpenAIImageToImageCommand(openai);
4982
4986
  registerOpenAIGenerateSpeechCommand(openai);
@@ -5170,7 +5174,9 @@ async function generateOpenRouterImage(opts) {
5170
5174
 
5171
5175
  // src/providers/openrouter/commands/generate.ts
5172
5176
  function registerOpenRouterGenerateCommand(parent) {
5173
- parent.command("generate").description("Generate images via OpenRouter (uses chat completions API)").requiredOption("--prompt <text>", "Image generation prompt").option("--model <id>", "OpenRouter model id (e.g. google/gemini-3.1-flash-image-preview)").option("--aspect-ratio <ratio>", "Aspect ratio (e.g. 1:1, 16:9)", "1:1").option("--image-size <size>", "Image size hint (e.g. 1K, 2K)").option("--num-images <n>", "Number of images to generate", "1").option("--output <path>", "Copy first image to this path").option("-v, --verbose", "Verbose logging").action(
5177
+ parent.command("generate").description(
5178
+ "Generate images via OpenRouter (text-to-image); models: Gemini, GPT-Image, Flux, Recraft, Seedream"
5179
+ ).requiredOption("--prompt <text>", "Image generation prompt").option("--model <id>", "OpenRouter model id (e.g. google/gemini-3.1-flash-image-preview)").option("--aspect-ratio <ratio>", "Aspect ratio (e.g. 1:1, 16:9)", "1:1").option("--image-size <size>", "Image size hint (e.g. 1K, 2K)").option("--num-images <n>", "Number of images to generate", "1").option("--output <path>", "Copy first image to this path").option("-v, --verbose", "Verbose logging").action(
5174
5180
  async (opts) => {
5175
5181
  const logger = createLogger({ verbose: opts.verbose ?? false });
5176
5182
  const model = opts.model ?? resolveKey("OPENROUTER_IMAGE_MODEL") ?? DEFAULT_OPENROUTER_MODEL;
@@ -5206,7 +5212,9 @@ var DEFAULT_MODEL = "google/gemini-2.5-flash-image";
5206
5212
  var SOFT_LIMIT_BYTES2 = 5 * 1024 * 1024;
5207
5213
  var HARD_LIMIT_BYTES2 = 8 * 1024 * 1024;
5208
5214
  function registerOpenRouterImageToImageCommand(parent) {
5209
- parent.command("image-to-image").alias("i2i").description("Edit/transform images via OpenRouter (default: google/gemini-2.5-flash-image)").requiredOption("--prompt <text>", "Text prompt describing the edit").requiredOption(
5215
+ parent.command("image-to-image").alias("i2i").description(
5216
+ "Edit/transform images via OpenRouter (image-to-image); models: Gemini, GPT-Image, Flux, Recraft, Seedream"
5217
+ ).requiredOption("--prompt <text>", "Text prompt describing the edit").requiredOption(
5210
5218
  "--ref <path>",
5211
5219
  "Reference image (URL or local path); repeatable (most models accept 1)",
5212
5220
  collect7,
@@ -5376,7 +5384,7 @@ async function downloadOpenRouterVideo(opts) {
5376
5384
  return dest;
5377
5385
  }
5378
5386
  function registerOpenRouterVideoStatusCommand(parent) {
5379
- parent.command("video-status <jobId>").description("Poll an OpenRouter video generation job").option("--wait", "Poll until status is 'completed' or 'failed'").option("--wait-timeout <ms>", "Poll timeout in ms (with --wait)", "600000").option("--download", "If completed, download the video (implies --wait)").option("--output <path>", "Copy downloaded video to this path").option("--no-thumb", "Skip downloading the thumbnail if the API returns one").option("-v, --verbose", "Verbose logging").action(
5387
+ parent.command("video-status <jobId>").description("Poll or download an OpenRouter video generation job by job ID").option("--wait", "Poll until status is 'completed' or 'failed'").option("--wait-timeout <ms>", "Poll timeout in ms (with --wait)", "600000").option("--download", "If completed, download the video (implies --wait)").option("--output <path>", "Copy downloaded video to this path").option("--no-thumb", "Skip downloading the thumbnail if the API returns one").option("-v, --verbose", "Verbose logging").action(
5380
5388
  async (jobId, opts) => {
5381
5389
  const logger = createLogger({ verbose: opts.verbose ?? false });
5382
5390
  const shouldWait = !!(opts.wait || opts.download);
@@ -5426,7 +5434,9 @@ function registerOpenRouterVideoStatusCommand(parent) {
5426
5434
 
5427
5435
  // src/providers/openrouter/commands/image-to-video.ts
5428
5436
  function registerOpenRouterImageToVideoCommand(parent) {
5429
- parent.command("image-to-video").alias("i2v").description("Submit an image-to-video job to OpenRouter (async, returns job id)").requiredOption("--prompt <text>", "Motion/scene prompt").requiredOption("--image-url <url>", "First-frame image URL (https)").option("--last-frame-url <url>", "Optional last-frame image URL").option("--model <id>", "OpenRouter video model id (e.g. google/veo-3.1)").option("--resolution <r>", "Resolution hint (e.g. 720p, 1080p)").option("--aspect-ratio <r>", "Aspect ratio hint (e.g. 16:9, 9:16)").option("--duration <n>", "Duration seconds").option("--seed <n>", "Fixed seed").option("--wait", "Poll until status is 'completed' or 'failed'").option("--wait-timeout <ms>", "Poll timeout in ms (with --wait)", "600000").option("--download", "Download the generated video on success (implies --wait)").option("--output <path>", "Copy downloaded video to this path").option("--no-thumb", "Skip downloading the thumbnail if the API returns one").option("-v, --verbose", "Verbose logging").action(
5437
+ parent.command("image-to-video").alias("i2v").description(
5438
+ "Generate video from an image via OpenRouter (image-to-video, async); models: Veo, Seedance, Kling \u2014 use video-models to list all"
5439
+ ).requiredOption("--prompt <text>", "Motion/scene prompt").requiredOption("--image-url <url>", "First-frame image URL (https)").option("--last-frame-url <url>", "Optional last-frame image URL").option("--model <id>", "OpenRouter video model id (e.g. google/veo-3.1)").option("--resolution <r>", "Resolution hint (e.g. 720p, 1080p)").option("--aspect-ratio <r>", "Aspect ratio hint (e.g. 16:9, 9:16)").option("--duration <n>", "Duration seconds").option("--seed <n>", "Fixed seed").option("--wait", "Poll until status is 'completed' or 'failed'").option("--wait-timeout <ms>", "Poll timeout in ms (with --wait)", "600000").option("--download", "Download the generated video on success (implies --wait)").option("--output <path>", "Copy downloaded video to this path").option("--no-thumb", "Skip downloading the thumbnail if the API returns one").option("-v, --verbose", "Verbose logging").action(
5430
5440
  async (opts) => {
5431
5441
  const logger = createLogger({ verbose: opts.verbose ?? false });
5432
5442
  const model = opts.model ?? resolveKey("OPENROUTER_VIDEO_MODEL") ?? "google/veo-3.1";
@@ -5503,7 +5513,9 @@ function registerOpenRouterImageToVideoCommand(parent) {
5503
5513
 
5504
5514
  // src/providers/openrouter/commands/video-models.ts
5505
5515
  function registerOpenRouterVideoModelsCommand(parent) {
5506
- parent.command("video-models").description("List available OpenRouter video models").option("-v, --verbose", "Verbose logging").action(async (opts) => {
5516
+ parent.command("video-models").description(
5517
+ "List available OpenRouter video-generation models (Veo, Seedance, Kling, and others)"
5518
+ ).option("-v, --verbose", "Verbose logging").action(async (opts) => {
5507
5519
  const logger = createLogger({ verbose: opts.verbose ?? false });
5508
5520
  const res = await listVideoModels();
5509
5521
  const list = res.data ?? res.models ?? [];
@@ -5516,7 +5528,9 @@ function registerOpenRouterVideoModelsCommand(parent) {
5516
5528
 
5517
5529
  // src/providers/openrouter/commands/index.ts
5518
5530
  function registerOpenRouterCommands(program2) {
5519
- const openrouter = program2.command("openrouter").description("OpenRouter image + video generation");
5531
+ const openrouter = program2.command("openrouter").description(
5532
+ "OpenRouter: text-to-image, image-to-image, and video generation (image-to-video) via routed models \u2014 Veo, Seedance, Kling, and others"
5533
+ );
5520
5534
  registerOpenRouterGenerateCommand(openrouter);
5521
5535
  registerOpenRouterImageToImageCommand(openrouter);
5522
5536
  registerOpenRouterImageToVideoCommand(openrouter);
@@ -5865,7 +5879,9 @@ function sleep5(ms) {
5865
5879
 
5866
5880
  // src/commands/doc/index.ts
5867
5881
  function registerDocCommands(program2) {
5868
- const doc = program2.command("doc").description("Document operations: convert PDFs, images, Office docs to Markdown via Gemini");
5882
+ const doc = program2.command("doc").description(
5883
+ "Document-to-Markdown: convert PDFs, images, DOCX, PPTX, and other docs to Markdown via Gemini"
5884
+ );
5869
5885
  doc.command("convert").description("Convert documents to Markdown using Gemini Files API").requiredOption(
5870
5886
  "--input <files...>",
5871
5887
  "Input file(s) to convert",
@@ -6187,7 +6203,7 @@ async function splitVideo(opts) {
6187
6203
  // src/commands/media/index.ts
6188
6204
  function registerMediaCommands(program2) {
6189
6205
  const media = program2.command("media").description(
6190
- "Media optimization: compress video/audio/images, split long videos, batch process"
6206
+ "Media processing via ffmpeg/ImageMagick: compress video/audio/images, split long videos, batch optimize directories"
6191
6207
  );
6192
6208
  media.command("optimize").description("Optimize a single media file (video, audio, or image)").requiredOption("--input <file>", "Input media file").requiredOption("--output <file>", "Output file path").option("--target-size <MB>", "Target file size in MB").option("--quality <n>", "Quality: video CRF (0-51) or image (1-100)", "85").option("--max-width <px>", "Max image/video width in pixels", "1920").option("--bitrate <rate>", "Audio bitrate (e.g. 64k)", "64k").option("--resolution <WxH>", "Force video resolution (e.g. 1920x1080)").option("-v, --verbose", "Verbose logging").action(
6193
6209
  async (opts) => {
@@ -6294,7 +6310,7 @@ loadEnv();
6294
6310
  var require2 = createRequire(import.meta.url);
6295
6311
  var pkg = require2("../package.json");
6296
6312
  var program = new Command().name("multix").description(
6297
- "AI multimodal CLI \u2014 Gemini \xB7 MiniMax \xB7 OpenRouter \xB7 ffmpeg \xB7 ImageMagick \xB7 doc-to-md"
6313
+ "AI multimodal CLI \u2014 image/video/audio/3D generation, editing, transcription, and media processing via OpenAI, Gemini, MiniMax, OpenRouter, Leonardo, BytePlus, ElevenLabs, ffmpeg, and ImageMagick"
6298
6314
  ).version(pkg.version);
6299
6315
  registerCommands(program);
6300
6316
  program.parseAsync(process.argv).catch((err2) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrgoonie/multix",
3
- "version": "0.1.0-beta",
3
+ "version": "0.2.0",
4
4
  "description": "AI multimodal CLI — OpenAI, Gemini, MiniMax, OpenRouter, Leonardo, BytePlus, ElevenLabs, ffmpeg, ImageMagick, doc-to-md",
5
5
  "type": "module",
6
6
  "bin": {
package/skill/SKILL.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: multix
3
- description: AI multimodal CLI — generate and edit images (OpenAI, Codex driver, Gemini Nano Banana, Imagen, MiniMax, OpenRouter, Leonardo, BytePlus Seedream), generate video (Veo, Hailuo, Seedance, Leonardo), TTS/STT/music (OpenAI, Gemini Flash TTS, MiniMax, ElevenLabs), 3D models (Hyper3D), analyze/transcribe media, convert documents to Markdown, optimize media via ffmpeg/ImageMagick. Use whenever the user wants to create, edit, or transform images/video/audio/documents from a CLI, mentions any of: OpenAI, Codex image driver, image-to-image, i2i, image edit, watercolor/cyberpunk style transfer, reference image, OpenRouter, Nano Banana, Flux, Seedream, Veo, Hailuo, ElevenLabs voice cloning, or asks for batch media optimization.
4
- version: 0.1.0-beta # x-release-please-version
3
+ description: AI multimodal CLI — generate and edit images (OpenAI, Codex driver, Gemini Nano Banana, Imagen, MiniMax, OpenRouter, Leonardo, BytePlus Seedream), generate video (Gemini Veo, MiniMax Hailuo, OpenRouter via Veo/Seedance/Kling, Leonardo via Motion/Veo/Kling/Hailuo/Seedance/LTX, BytePlus Seedance), TTS/STT/music (OpenAI, Gemini Flash TTS, MiniMax, ElevenLabs), 3D models (BytePlus Hyper3D/Hitem3d), analyze/transcribe media, convert documents to Markdown, optimize media via ffmpeg/ImageMagick. Use whenever the user wants to create, edit, or transform images/video/audio/3D/documents from a CLI, mentions any of: OpenAI, Codex image driver, image-to-image, i2i, image edit, watercolor/cyberpunk style transfer, reference image, OpenRouter, Nano Banana, Flux, Seedream, Veo, Hailuo, Seedance, Kling, video generation, text-to-video, image-to-video, i2v, ElevenLabs voice cloning, or asks for batch media optimization.
4
+ version: 0.2.0 # x-release-please-version
5
5
  ---
6
6
 
7
7
  # multix — AI Multimodal CLI
@@ -12,8 +12,11 @@ Activate this skill when the user asks to:
12
12
  - Generate images from a text prompt (any provider)
13
13
  - **Edit/transform an existing image with a prompt** (image-to-image, alias `i2i`)
14
14
  - Generate video from text or from a reference image (image-to-video, alias `i2v`)
15
+ - **Generate video via OpenRouter routed models** (Veo, Seedance, Kling — use `multix openrouter video-models` to list)
16
+ - **Generate video via BytePlus Seedance** directly (text-to-video, image-to-video, reference-to-video)
17
+ - **Generate video via Leonardo** (Motion, Veo, Kling, Hailuo, Seedance, LTX models)
15
18
  - Generate or clone a voice, run STT, generate music or sound effects
16
- - Generate 3D models (Hyper3D / Hitem3d)
19
+ - Generate 3D models (BytePlus Hyper3D / Hitem3d)
17
20
  - Analyze, transcribe, or extract structured data from media/docs
18
21
  - Convert PDFs / DOCX / images to Markdown
19
22
  - Optimize, resize, batch-convert, or split video/audio/image files
@@ -23,7 +26,7 @@ Activate this skill when the user asks to:
23
26
  ```
24
27
  GEMINI_API_KEY # Google AI Studio
25
28
  OPENAI_API_KEY # OpenAI API (image, image edit, TTS, STT)
26
- OPENROUTER_API_KEY # OpenRouter (multi-model gateway)
29
+ OPENROUTER_API_KEY # OpenRouter (multi-model gateway: image + video via Veo, Seedance, Kling)
27
30
  MINIMAX_API_KEY # MiniMax (image/video/speech/music)
28
31
  LEONARDO_API_KEY # Leonardo.Ai (image/video/upscale)
29
32
  BYTEPLUS_API_KEY # BytePlus / Volcengine ARK (Seedream/Seedance/Hyper3D)
@@ -138,8 +141,9 @@ multix gemini i2v ./photo.jpg --prompt "camera pans left" [--last-frame <path>]
138
141
  # MiniMax Hailuo — async with auto-poll
139
142
  multix minimax generate-video --prompt "A dancer" --duration 6 --resolution 1080P [--first-frame <url>]
140
143
 
141
- # OpenRouter Veo — async, returns jobId; image input is URL only
142
- multix openrouter i2v --prompt "<text>" --image-url https://... [--last-frame-url <url>] [--resolution 720p]
144
+ # OpenRouter — video via routed models (Veo, Seedance, Kling); async, URL input only
145
+ multix openrouter i2v --prompt "<text>" --image-url https://... [--model google/veo-3.1] [--resolution 720p]
146
+ multix openrouter video-models # list all available video models
143
147
  multix openrouter video-status <jobId> [--download] [--output <path>]
144
148
 
145
149
  # Leonardo MOTION2 / VEO3 / kling
@@ -154,6 +158,30 @@ multix byteplus reference-to-video --prompt "<text>" --ref-image ./hero.jpg:subj
154
158
 
155
159
  All video commands accept `--wait`, `--wait-timeout <ms>`, `--download`, `--output <path>`, `--no-thumb`.
156
160
 
161
+ ### Decision tree — which provider to pick for video generation
162
+
163
+ ```
164
+ User wants to generate a video?
165
+ ├── Text-to-video?
166
+ │ ├── Gemini Veo (experimental, Google billing) → multix gemini generate-video
167
+ │ ├── MiniMax Hailuo (async, auto-poll) → multix minimax generate-video
168
+ │ ├── Leonardo (Motion/Veo/Kling/Hailuo/Seedance/LTX) → multix leonardo video
169
+ │ └── BytePlus Seedance 2.0 (direct) → multix byteplus video
170
+ ├── Image-to-video?
171
+ │ ├── Gemini Veo (experimental) → multix gemini i2v
172
+ │ ├── OpenRouter (Veo, Seedance, Kling — URL input) → multix openrouter i2v --image-url <url>
173
+ │ ├── Leonardo (needs imageId from Leonardo upload) → multix leonardo i2v
174
+ │ └── BytePlus Seedance 2.0 (local file or URL) → multix byteplus i2v
175
+ └── Multi-reference video (images + videos + audio)? → multix byteplus reference-to-video
176
+ ```
177
+
178
+ ### Provider selection hints for agents
179
+
180
+ - **OpenRouter video** supports Veo, Seedance, Kling, and more via model routing. Image input must be a URL (not a local file). Run `multix openrouter video-models` to discover available models.
181
+ - **BytePlus Seedance** is the best choice when `BYTEPLUS_API_KEY` is available and you need text-to-video, image-to-video (local file or URL), or multi-reference video.
182
+ - **Leonardo** offers the widest model selection (Motion, Veo, Kling, Hailuo, Seedance, LTX) but requires a Leonardo API key.
183
+ - If one provider's key is unavailable, fall back to another that supports the same capability.
184
+
157
185
  ## Speech, music, voice, 3D, docs, media
158
186
 
159
187
  ```bash
@@ -205,6 +233,41 @@ Files saved under `./multix-output/` by default. Override with `MULTIX_OUTPUT_DI
205
233
  | `BYTEPLUS_VIDEO_PARAMS_MODE` | `flags` (default) or `structured` |
206
234
  | `MULTIX_DISABLE_HOME_ENV` | `1` to skip `~/.multix/.env` |
207
235
 
236
+ ## Quick examples for agents
237
+
238
+ ```bash
239
+ # Text-to-image
240
+ multix openai generate --prompt "A sunset over mountains"
241
+ multix gemini generate --prompt "A sunset over mountains" --aspect-ratio 16:9
242
+ multix openrouter generate --prompt "A sunset over mountains" --num-images 2
243
+ multix byteplus generate --prompt "A sunset over mountains" --size 2K
244
+
245
+ # Image-to-image (edit an existing image)
246
+ multix gemini i2i --prompt "make it watercolor" --ref ./photo.jpg
247
+ multix openrouter i2i --prompt "make it cyberpunk" --ref ./photo.jpg
248
+
249
+ # Text-to-video
250
+ multix byteplus video --prompt "Ocean waves crashing on rocks" --duration 8
251
+ multix leonardo video "Ocean waves crashing on rocks" --model kling-2.6
252
+ multix gemini generate-video --prompt "Ocean waves crashing on rocks"
253
+
254
+ # Image-to-video
255
+ multix openrouter i2v --prompt "camera slowly pans left" --image-url https://example.com/photo.jpg
256
+ multix byteplus i2v ./photo.jpg --prompt "camera slowly pans left"
257
+
258
+ # Transcribe / analyze media
259
+ multix gemini analyze --files ./video.mp4 --prompt "Summarize this video"
260
+ multix gemini transcribe --files ./audio.mp3
261
+ multix elevenlabs transcribe --input ./audio.mp3 --diarize
262
+
263
+ # Compress / split media
264
+ multix media optimize --input large.mp4 --output small.mp4 --target-size 50
265
+ multix media split --input long-video.mp4 --chunk-duration 600
266
+
267
+ # Convert document to markdown
268
+ multix doc convert --input report.pdf --auto-name
269
+ ```
270
+
208
271
  ## Security & scope
209
272
 
210
273
  This skill produces shell commands for the local `multix` CLI. It does NOT execute the commands itself, exfiltrate API keys, or modify provider accounts.