@mrgoonie/multix 1.0.5 → 1.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 CHANGED
@@ -5,6 +5,13 @@ 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
+ ## [1.0.6](https://github.com/mrgoonie/multix-cli/compare/v1.0.5...v1.0.6) (2026-10-11)
9
+
10
+
11
+ ### Fixed
12
+
13
+ * **providers:** read model defaults after loading .env files ([#121](https://github.com/mrgoonie/multix-cli/issues/121)) ([5f36dba](https://github.com/mrgoonie/multix-cli/commit/5f36dba0fc7a1ccbe3d904e928c4ef82b3c6ce36))
14
+
8
15
  ## [1.0.5](https://github.com/mrgoonie/multix-cli/compare/v1.0.4...v1.0.5) (2026-10-11)
9
16
 
10
17
 
package/dist/cli.js CHANGED
@@ -3006,6 +3006,11 @@ async function poll(opts) {
3006
3006
  // src/providers/byteplus/client.ts
3007
3007
  init_errors();
3008
3008
 
3009
+ // src/core/env-default.ts
3010
+ function envDefault(name, fallback) {
3011
+ return process.env[name]?.trim() || fallback;
3012
+ }
3013
+
3009
3014
  // src/providers/byteplus/models.ts
3010
3015
  var DEFAULT_BYTEPLUS_BASE_URL = "https://ark.ap-southeast.bytepluses.com/api/v3";
3011
3016
  var BYTEPLUS_ROUTING = {
@@ -3021,9 +3026,15 @@ var BYTEPLUS_3D_MODELS = [
3021
3026
  { id: "hitem3d-2-0-251223", name: "Hitem3d 2.0", family: "hitem3d" }
3022
3027
  ];
3023
3028
  var BYTEPLUS_DEFAULTS = {
3024
- imageModel: process.env.BYTEPLUS_IMAGE_MODEL ?? DEFAULT_BYTEPLUS_IMAGE_MODEL,
3025
- videoModel: process.env.BYTEPLUS_VIDEO_MODEL ?? DEFAULT_BYTEPLUS_VIDEO_MODEL,
3026
- threeDModel: process.env.BYTEPLUS_3D_MODEL ?? DEFAULT_BYTEPLUS_3D_MODEL,
3029
+ get imageModel() {
3030
+ return envDefault("BYTEPLUS_IMAGE_MODEL", DEFAULT_BYTEPLUS_IMAGE_MODEL);
3031
+ },
3032
+ get videoModel() {
3033
+ return envDefault("BYTEPLUS_VIDEO_MODEL", DEFAULT_BYTEPLUS_VIDEO_MODEL);
3034
+ },
3035
+ get threeDModel() {
3036
+ return envDefault("BYTEPLUS_3D_MODEL", DEFAULT_BYTEPLUS_3D_MODEL);
3037
+ },
3027
3038
  videoResolution: "1080p",
3028
3039
  videoDuration: 8,
3029
3040
  videoAspectRatio: "16:9",
@@ -5024,11 +5035,17 @@ var FAL_ROUTING = {
5024
5035
  };
5025
5036
  var FAL_DEFAULTS = {
5026
5037
  // FLUX.1 [schnell] — fast, low-cost default text-to-image model.
5027
- imageModel: process.env.FAL_IMAGE_MODEL ?? "fal-ai/flux/schnell",
5038
+ get imageModel() {
5039
+ return envDefault("FAL_IMAGE_MODEL", "fal-ai/flux/schnell");
5040
+ },
5028
5041
  // Stable, widely available default text-to-video model.
5029
- videoModel: process.env.FAL_VIDEO_MODEL ?? "fal-ai/kling-video/v1.6/standard/text-to-video",
5042
+ get videoModel() {
5043
+ return envDefault("FAL_VIDEO_MODEL", "fal-ai/kling-video/v1.6/standard/text-to-video");
5044
+ },
5030
5045
  // Matching image-to-video model — used when --image-url is passed without -m.
5031
- videoImageModel: process.env.FAL_VIDEO_IMAGE_MODEL ?? "fal-ai/kling-video/v1.6/standard/image-to-video"
5046
+ get videoImageModel() {
5047
+ return envDefault("FAL_VIDEO_IMAGE_MODEL", "fal-ai/kling-video/v1.6/standard/image-to-video");
5048
+ }
5032
5049
  };
5033
5050
 
5034
5051
  // src/providers/fal/run-helpers.ts
@@ -6098,15 +6115,15 @@ var ASPECT_RATIOS = [
6098
6115
  var IMAGE_SIZES = ["1K", "2K", "4K"];
6099
6116
  function getDefaultModel(task) {
6100
6117
  if (task === "generate") {
6101
- return process.env.IMAGE_GEN_MODEL ?? process.env.GEMINI_IMAGE_GEN_MODEL ?? IMAGE_MODEL_DEFAULT;
6118
+ return envDefault("IMAGE_GEN_MODEL", envDefault("GEMINI_IMAGE_GEN_MODEL", IMAGE_MODEL_DEFAULT));
6102
6119
  }
6103
6120
  if (task === "generate-video") {
6104
- return process.env.VIDEO_GEN_MODEL ?? VIDEO_MODEL_DEFAULT;
6121
+ return envDefault("VIDEO_GEN_MODEL", VIDEO_MODEL_DEFAULT);
6105
6122
  }
6106
6123
  if (task === "generate-speech") {
6107
- return process.env.GEMINI_TTS_MODEL ?? process.env.TTS_MODEL ?? TTS_MODEL_DEFAULT;
6124
+ return envDefault("GEMINI_TTS_MODEL", envDefault("TTS_MODEL", TTS_MODEL_DEFAULT));
6108
6125
  }
6109
- return process.env.MULTIMODAL_MODEL ?? process.env.GEMINI_MODEL ?? ANALYSIS_MODEL_DEFAULT;
6126
+ return envDefault("MULTIMODAL_MODEL", envDefault("GEMINI_MODEL", ANALYSIS_MODEL_DEFAULT));
6110
6127
  }
6111
6128
 
6112
6129
  // src/providers/gemini/result-formatter.ts
@@ -8969,8 +8986,12 @@ var LEONARDO_ROUTING = {
8969
8986
  };
8970
8987
  var DEFAULT_LEONARDO_MODEL_ID = "7b592283-e8a7-4c5a-9ba6-d18c31f258b9";
8971
8988
  var LEONARDO_DEFAULTS = {
8972
- modelId: process.env.LEONARDO_DEFAULT_MODEL ?? DEFAULT_LEONARDO_MODEL_ID,
8973
- videoModel: process.env.LEONARDO_VIDEO_MODEL ?? "MOTION2",
8989
+ get modelId() {
8990
+ return envDefault("LEONARDO_DEFAULT_MODEL", DEFAULT_LEONARDO_MODEL_ID);
8991
+ },
8992
+ get videoModel() {
8993
+ return envDefault("LEONARDO_VIDEO_MODEL", "MOTION2");
8994
+ },
8974
8995
  width: 1024,
8975
8996
  height: 1024,
8976
8997
  numImages: 1
@@ -9819,10 +9840,18 @@ var ALL_MINIMAX_MODELS = /* @__PURE__ */ new Set([
9819
9840
  ...MINIMAX_MUSIC_MODELS
9820
9841
  ]);
9821
9842
  var TASK_DEFAULTS2 = {
9822
- image: process.env.MINIMAX_IMAGE_MODEL ?? "image-01",
9823
- video: process.env.MINIMAX_VIDEO_MODEL ?? "MiniMax-Hailuo-2.3",
9824
- speech: process.env.MINIMAX_SPEECH_MODEL ?? "speech-2.8-hd",
9825
- music: process.env.MINIMAX_MUSIC_MODEL ?? "music-2.5"
9843
+ get image() {
9844
+ return envDefault("MINIMAX_IMAGE_MODEL", "image-01");
9845
+ },
9846
+ get video() {
9847
+ return envDefault("MINIMAX_VIDEO_MODEL", "MiniMax-Hailuo-2.3");
9848
+ },
9849
+ get speech() {
9850
+ return envDefault("MINIMAX_SPEECH_MODEL", "speech-2.8-hd");
9851
+ },
9852
+ get music() {
9853
+ return envDefault("MINIMAX_MUSIC_MODEL", "music-2.5");
9854
+ }
9826
9855
  };
9827
9856
  var VIDEO_DURATIONS = [6, 10];
9828
9857
  var VIDEO_RESOLUTIONS = ["720P", "1080P"];
@@ -10548,7 +10577,7 @@ async function transcribeOpenAIAudio(opts) {
10548
10577
 
10549
10578
  // src/providers/openai/commands/generate-speech.ts
10550
10579
  function registerOpenAIGenerateSpeechCommand(parent) {
10551
- parent.command("generate-speech").description("Generate speech with OpenAI TTS").option("--text <str>", "Text to speak").option("--prompt <str>", "Alias for --text").option("--model <id>", "TTS model", process.env.OPENAI_TTS_MODEL ?? DEFAULT_OPENAI_TTS_MODEL).option("--voice <name>", "OpenAI voice", "marin").option("--instructions <text>", "Voice/style instructions").option("--output-format <fmt>", "mp3|opus|aac|flac|wav|pcm", "mp3").option("--output <path>", "Copy generated audio to this path").option("-v, --verbose", "Verbose logging").action(async (opts) => {
10580
+ parent.command("generate-speech").description("Generate speech with OpenAI TTS").option("--text <str>", "Text to speak").option("--prompt <str>", "Alias for --text").option("--model <id>", "TTS model", envDefault("OPENAI_TTS_MODEL", DEFAULT_OPENAI_TTS_MODEL)).option("--voice <name>", "OpenAI voice", "marin").option("--instructions <text>", "Voice/style instructions").option("--output-format <fmt>", "mp3|opus|aac|flac|wav|pcm", "mp3").option("--output <path>", "Copy generated audio to this path").option("-v, --verbose", "Verbose logging").action(async (opts) => {
10552
10581
  const text = opts.text ?? opts.prompt;
10553
10582
  if (!text) throw new ValidationError("Either --text or --prompt is required");
10554
10583
  validateTtsVoice(opts.voice);
@@ -10867,7 +10896,7 @@ function collect6(value, prev) {
10867
10896
 
10868
10897
  // src/providers/openai/commands/transcribe.ts
10869
10898
  function registerOpenAITranscribeCommand(parent) {
10870
- parent.command("transcribe").description("Transcribe audio/video with OpenAI STT").requiredOption("--input <path>", "Audio or video file").option("--model <id>", "STT model", process.env.OPENAI_STT_MODEL ?? DEFAULT_OPENAI_STT_MODEL).option("--format <fmt>", "json|text|diarized_json", "text").option("--language <code>", "ISO language code").option("--chunking-strategy <strategy>", "e.g. auto").option(
10899
+ parent.command("transcribe").description("Transcribe audio/video with OpenAI STT").requiredOption("--input <path>", "Audio or video file").option("--model <id>", "STT model", envDefault("OPENAI_STT_MODEL", DEFAULT_OPENAI_STT_MODEL)).option("--format <fmt>", "json|text|diarized_json", "text").option("--language <code>", "ISO language code").option("--chunking-strategy <strategy>", "e.g. auto").option(
10871
10900
  "--known-speaker-name <name>",
10872
10901
  "Known speaker name; repeatable",
10873
10902
  collect7,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrgoonie/multix",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "AI multimodal CLI — OpenAI, Gemini, MiniMax, OpenRouter, Leonardo, BytePlus, ElevenLabs, fal.ai, Atlas Cloud, Replicate, HeyGen, 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
3
  description: AI multimodal CLI — generate and edit images (OpenAI, Codex driver, Gemini Nano Banana, Imagen, MiniMax, OpenRouter, Leonardo, BytePlus Seedream, Cloudflare Workers AI FLUX.1 Schnell, fal.ai FLUX, Replicate FLUX), generate video (Gemini Veo, MiniMax Hailuo, OpenRouter via Veo/Seedance/Kling, Leonardo via Motion/Veo/Kling/Hailuo/Seedance/LTX, BytePlus Seedance, Cloudflare AI Gateway via Replicate, fal.ai queue models, Replicate direct API models incl. P-Video, HeyGen Video Agent and scripted avatar videos), video translation and lipsync (HeyGen), TTS/STT/music (OpenAI, Gemini Flash TTS incl. Gemini 3.8 with delivery-style control, MiniMax, Cloudflare Workers AI MeloTTS, ElevenLabs), 3D models (BytePlus Hyper3D/Hitem3d), analyze/transcribe media, convert documents to Markdown, optimize media via ffmpeg/ImageMagick, and self-update the CLI. 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, Cloudflare Workers AI, AI Gateway, fal.ai, Atlas Cloud, Replicate, replicate.com models, Replicate predictions, HeyGen, avatar video, talking head, Video Agent, video translation, dubbing, lipsync, video generation, text-to-video, image-to-video, i2v, ElevenLabs voice cloning, updating/upgrading multix, or asks for batch media optimization.
4
- version: 1.0.5 # x-release-please-version
4
+ version: 1.0.6 # x-release-please-version
5
5
  ---
6
6
 
7
7
  # multix — AI Multimodal CLI