@mrgoonie/multix 0.0.6 → 0.0.8
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 +36 -0
- package/README.md +77 -3
- package/dist/cli.js +1109 -253
- package/package.json +2 -2
- package/skill/SKILL.md +144 -101
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,42 @@ 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.8] - 2026-05-11
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- `multix openrouter image-to-image` previously failed for any non-Gemini text+image model (e.g. `openai/gpt-5.4-image-2`, `openai/gpt-5-image-mini`, `recraft/recraft-v3`) because the `modalities` heuristic forced `["image"]` for non-Gemini models. The new default is `["image","text"]`, with `["image"]` only emitted for verified image-only families (`black-forest-labs/`, `bytedance-seed/seedream`, `sourceful/`).
|
|
12
|
+
- "No images in response" errors now include the model id, `finish_reason`, the model's text reply (if any), and a hint about modalities — previously a single generic line.
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
- `multix openrouter image-to-image --strength <0..1>` — Recraft init-image strength control.
|
|
16
|
+
- `OPENROUTER_FALLBACK_MODELS` (CSV) now applies to `image-to-image` (previously `generate` only). Sends `models: [primary, ...fallbacks]` so OpenRouter can route on availability.
|
|
17
|
+
- New shared module `src/providers/openrouter/payload.ts` — `resolveModalities`, `buildOpenRouterHeaders`, `extractImagesFromResponse`, `formatNoImagesError`, `buildI2IPayload`. DRY across `generate` + `image-to-image`.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
- README and `skill/SKILL.md` document the OpenRouter model-family matrix (Gemini / OpenAI gpt-image / Recraft → text+image; Flux 2.x / Seedream 4.5 / Sourceful → image-only) and the new flags.
|
|
21
|
+
|
|
22
|
+
### Verified live
|
|
23
|
+
`openai/gpt-5.4-image-2`, `openai/gpt-5-image-mini`, `google/gemini-2.5-flash-image`, `black-forest-labs/flux.2-pro`, `flux.2-max`, `flux.2-flex`, `bytedance-seed/seedream-4.5`.
|
|
24
|
+
|
|
25
|
+
## [0.0.7] - 2026-05-05
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
- **ElevenLabs provider** — full integration with 13 subcommands:
|
|
29
|
+
- `tts` — text-to-speech (sync audio bytes) with voice settings, language code, seed, context continuity, and `--no-speaker-boost` opt-out.
|
|
30
|
+
- `voices list|get|search|design|create-from-preview|delete` — voice library management and prompt-based voice design.
|
|
31
|
+
- `clone` — instant voice cloning via multipart audio sample upload.
|
|
32
|
+
- `voice-changer` — speech-to-speech voice conversion.
|
|
33
|
+
- `transcribe` — Scribe STT with diarization, audio-event tagging, and `text|json|srt|vtt` output.
|
|
34
|
+
- `sfx` — sound effects generation with prompt influence and looping.
|
|
35
|
+
- `music` — music generation (`music_v1`) from prompt or composition plan.
|
|
36
|
+
- `dub` / `dub-status` — async dubbing with `--wait` / `--download` polling and per-language audio download.
|
|
37
|
+
- `isolate` — voice isolator (background noise removal).
|
|
38
|
+
- `align` — forced alignment (transcript ↔ audio timing).
|
|
39
|
+
- `account` / `models` — usage / subscription tier and model catalog.
|
|
40
|
+
- `ELEVENLABS_RECOMMENDED_VOICES` with 11 verified conversational voice IDs (Alexandra default).
|
|
41
|
+
- TTS models: `eleven_multilingual_v2` (default), `eleven_flash_v2_5`, `eleven_flash_v2`, `eleven_turbo_v2_5`, `eleven_turbo_v2`, `eleven_v3`. STT: `scribe_v1`, `scribe_v1_experimental`. Voice changer: `eleven_multilingual_sts_v2`. Output formats: `mp3_*`, `pcm_*`, `ulaw_8000`.
|
|
42
|
+
- `multix check` and `.env.example` document `ELEVENLABS_API_KEY`.
|
|
43
|
+
|
|
8
44
|
## [0.0.6] - 2026-05-05
|
|
9
45
|
|
|
10
46
|
### 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, Flash TTS), **MiniMax** (image, video, speech, music), **OpenRouter** (image generation), **Leonardo.Ai** (image, video, upscale),
|
|
5
|
+
Supports **Gemini** (analyze, transcribe, generate, Veo video, Flash TTS), **MiniMax** (image, video, speech, music), **OpenRouter** (image generation), **Leonardo.Ai** (image, video, upscale), **BytePlus** (Seedream image, Seedance video, Hyper3D / Hitem3d 3D), and **ElevenLabs** (TTS, voice cloning, STT, voice changer, SFX, music, dubbing, isolation, alignment).
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
@@ -47,6 +47,7 @@ Set at least one provider key. Add to `.env` in your project root or `~/.multix/
|
|
|
47
47
|
| `LEONARDO_DEFAULT_MODEL` | No | Default Leonardo image model UUID |
|
|
48
48
|
| `LEONARDO_VIDEO_MODEL` | No | Default Leonardo video model (default `MOTION2`) |
|
|
49
49
|
| `BYTEPLUS_API_KEY` | For BytePlus | [BytePlus](https://console.byteplus.com/auth/api-keys) |
|
|
50
|
+
| `ELEVENLABS_API_KEY` | For ElevenLabs | [ElevenLabs](https://elevenlabs.io/app/settings/api-keys) |
|
|
50
51
|
| `ARK_API_KEY` | No | Fallback for `BYTEPLUS_API_KEY` (Volcengine ARK shared name) |
|
|
51
52
|
| `BYTEPLUS_BASE_URL` | No | Override BytePlus base (default `https://ark.ap-southeast.bytepluses.com/api/v3`) |
|
|
52
53
|
| `BYTEPLUS_IMAGE_MODEL` | No | Default Seedream model (default `seedream-4-0-250828`) |
|
|
@@ -145,7 +146,7 @@ multix minimax generate-music [--lyrics <str>] [--prompt <str>] [--model music-2
|
|
|
145
146
|
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
|
|
|
147
148
|
# 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
|
+
multix openrouter image-to-image --prompt "make it cyberpunk" --ref ./photo.jpg [--ref https://...] [--model google/gemini-2.5-flash-image] [--strength 0.7] [--output <path>] [-v]
|
|
149
150
|
|
|
150
151
|
# Image-to-video (async — returns job id; image input is URL only)
|
|
151
152
|
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]
|
|
@@ -158,7 +159,9 @@ multix openrouter video-status <jobId> [--download] [--output <path>] [-v]
|
|
|
158
159
|
multix openrouter video-models
|
|
159
160
|
```
|
|
160
161
|
|
|
161
|
-
|
|
162
|
+
**Supported i2i model families:** Gemini (default) and OpenAI gpt-image return `text+image` (modalities `["image","text"]`); Recraft accepts `--strength` (init-image strength 0..1); Flux / Sourceful are image-only (`["image"]`). The CLI picks the right `modalities` automatically based on the model id prefix.
|
|
163
|
+
|
|
164
|
+
Fallback models from `OPENROUTER_FALLBACK_MODELS` (CSV) are appended to the chat-image payload automatically — applies to both `generate` and `image-to-image`. Override the default video model with `OPENROUTER_VIDEO_MODEL` (default `google/veo-3.1`).
|
|
162
165
|
|
|
163
166
|
### `multix leonardo`
|
|
164
167
|
|
|
@@ -251,6 +254,77 @@ multix byteplus status <taskId> [--wait] [--wait-timeout 600000] [--download] [-
|
|
|
251
254
|
- `multix byteplus status <taskId> --download` works for both video (`content.video_url`) and 3D (`content.file_url`) tasks.
|
|
252
255
|
- **Task cancellation is not supported** — there is no verified DELETE endpoint on the ARK API. Submitted tasks must run to completion.
|
|
253
256
|
|
|
257
|
+
### `multix elevenlabs`
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
# Text-to-speech (sync, returns audio bytes)
|
|
261
|
+
multix elevenlabs tts --text "Hello world" [--voice <voiceId>] [--model eleven_multilingual_v2] \
|
|
262
|
+
[--format mp3_44100_128] [--stability 0.5] [--similarity-boost 0.75] [--style 0.0] \
|
|
263
|
+
[--no-speaker-boost] [--language-code en] [--seed <n>] [--output out.mp3] [-v]
|
|
264
|
+
|
|
265
|
+
# Voices: list / get / search shared / design / persist / delete
|
|
266
|
+
multix elevenlabs voices list [--category cloned|generated|premade|professional]
|
|
267
|
+
multix elevenlabs voices get <voiceId>
|
|
268
|
+
multix elevenlabs voices search [--search "calm female"] [--language en] [--gender female] [--age young] [--accent american]
|
|
269
|
+
multix elevenlabs voices design --description "friendly female narrator" [--text "sample text"] [--auto-text]
|
|
270
|
+
multix elevenlabs voices create-from-preview --generated-voice-id <id> --name "My Voice" --description "..."
|
|
271
|
+
multix elevenlabs voices delete <voiceId>
|
|
272
|
+
|
|
273
|
+
# Instant voice cloning (multipart upload of 1-3 minutes of samples)
|
|
274
|
+
multix elevenlabs clone --name "My Voice" --files sample1.wav sample2.wav [--description "..."] [--remove-background-noise]
|
|
275
|
+
|
|
276
|
+
# Speech-to-speech voice changer
|
|
277
|
+
multix elevenlabs voice-changer --input source.mp3 --voice <voiceId> [--model eleven_multilingual_sts_v2] \
|
|
278
|
+
[--format mp3_44100_128] [--remove-background-noise] [--output changed.mp3] [-v]
|
|
279
|
+
|
|
280
|
+
# Speech-to-text (Scribe)
|
|
281
|
+
multix elevenlabs transcribe --input audio.mp3 [--model scribe_v1] [--language en] [--diarize] \
|
|
282
|
+
[--num-speakers 2] [--tag-audio-events] [--timestamps-granularity word] [--format text|json|srt|vtt] [--output out.txt]
|
|
283
|
+
|
|
284
|
+
# Sound effects
|
|
285
|
+
multix elevenlabs sfx --text "car engine starting" [--duration-seconds 5] [--prompt-influence 0.3] [--loop] \
|
|
286
|
+
[--format mp3_44100_128] [--output sfx.mp3]
|
|
287
|
+
|
|
288
|
+
# Music generation
|
|
289
|
+
multix elevenlabs music --prompt "dreamy synthwave loop" [--music-length-ms 30000] [--model music_v1] \
|
|
290
|
+
[--format mp3_44100_128] [--output song.mp3]
|
|
291
|
+
# OR with a structured composition plan
|
|
292
|
+
multix elevenlabs music --plan ./plan.json [--output song.mp3]
|
|
293
|
+
|
|
294
|
+
# Dubbing (async — submit and poll, then optionally --download)
|
|
295
|
+
multix elevenlabs dub --input video.mp4 --target-lang es [--source-lang en] [--num-speakers 2] \
|
|
296
|
+
[--watermark] [--start-time 0] [--end-time 60] [--highest-resolution] [--name "My Dub"] \
|
|
297
|
+
[--async] [--wait] [--download] [--poll-interval 10] [--wait-timeout 1800000] [--output dubbed.mp4]
|
|
298
|
+
multix elevenlabs dub-status <dubbingId> [--download <lang>] [--output dubbed.mp4]
|
|
299
|
+
|
|
300
|
+
# Voice isolator (strip background noise)
|
|
301
|
+
multix elevenlabs isolate --input noisy.mp3 [--output clean.mp3]
|
|
302
|
+
|
|
303
|
+
# Forced alignment (transcript ↔ audio timing)
|
|
304
|
+
multix elevenlabs align --input audio.mp3 --text "transcript here" [--output alignment.json]
|
|
305
|
+
# Or read transcript from file:
|
|
306
|
+
multix elevenlabs align --input audio.mp3 --text-file transcript.txt
|
|
307
|
+
|
|
308
|
+
# Account info / available models
|
|
309
|
+
multix elevenlabs account
|
|
310
|
+
multix elevenlabs models
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
**ElevenLabs models:**
|
|
314
|
+
- TTS: `eleven_multilingual_v2` (default), `eleven_flash_v2_5`, `eleven_flash_v2`, `eleven_turbo_v2_5`, `eleven_turbo_v2`, `eleven_v3`
|
|
315
|
+
- STT: `scribe_v1`, `scribe_v1_experimental`
|
|
316
|
+
- Voice changer: `eleven_multilingual_sts_v2` (default)
|
|
317
|
+
- Music: `music_v1`
|
|
318
|
+
|
|
319
|
+
**Recommended voices** (verified from ElevenLabs conversational voice design guide):
|
|
320
|
+
`Alexandra` `kdmDKE6EkgrWrrykO9Qt` (default), `Archer` `L0Dsvb3SLTyegXwtm47J`, `Jessica Anne Bogart` `g6xIsTj2HwM6VR4iXFCw`, `Hope` `OYTbf65OHHFELVut7v2H`, `Eryn` `dj3G1R1ilKoFKhBnWOzG`, `Stuart` `HDA9tsk27wYi3uq0fPcK`, `Mark` `1SM7GgM6IMuvQlz2BwM3`, `Angela` `PT4nqlKZfc06VW1BuClj`, `Finn` `vBKc2FfBKJfcZNyEt1n6`, `Cassidy` `56AoDkrOh6qfVPDXZ7Pt`, `Grandpa Spuds Oxley` `NOpBlnGInO9m6vDvFkFC`. Use `multix elevenlabs voices list` for the full library.
|
|
321
|
+
|
|
322
|
+
**Notes:**
|
|
323
|
+
- Auth header is `xi-api-key`; base URL is `https://api.elevenlabs.io/v1`.
|
|
324
|
+
- Most generation endpoints (TTS, SFX, Music, Voice Changer, Isolation) return audio bytes synchronously.
|
|
325
|
+
- Dubbing is async: submit → poll → download per-language tracks.
|
|
326
|
+
- Output format strings combine codec + sample rate + bitrate, e.g. `mp3_44100_128`, `pcm_24000`, `ulaw_8000`.
|
|
327
|
+
|
|
254
328
|
### `multix media`
|
|
255
329
|
|
|
256
330
|
Requires `ffmpeg` (video/audio) and `magick` (images) on PATH.
|