Skip to main content
mulerun studio is the multimodal generation surface of the CLI. It bundles 40+ image, video, speech, and music model endpoints behind a single subcommand — all reachable with your existing MuleRun login, no extra API key.
Every command supports --json for machine-readable output. Long-running endpoints (video, music) can be submitted with --no-wait and resumed later via status — useful for CI, batches, or LLM-agent workflows.

Authentication

Run mulerun login once and every studio invocation picks up the cached credential automatically. The CLI exchanges your OAuth token for a short-lived per-call key before each request, so no manual API-key management is required. See Configuration for non-interactive setups (MULERUN_TOKEN). mulerun studio --help and mulerun studio <subcommand> --help are safe to run while logged out — they don’t touch the network.

Endpoint identifier

The <endpoint> argument used by params, run, and the catalog uses this shape: Examples: alibaba/wan2.6-t2v, openai/gpt-image-2/edit, google/nano-banana-2/generation.

Subcommands

studio list

Browse the catalog. With no flags, every registered endpoint is printed grouped by provider; with flags, the list is narrowed.
Text output groups endpoints by provider and shows the canonical identifier, a one-line description, output type, and any tags:

studio params <endpoint>

Inspect every parameter an endpoint accepts — name, type, required flag, default value, and enum choices when applicable.
Text output:
The trailing metadata tells you the upstream API path (used by status) and the JSON key under which result URLs appear (videos, images, audios). Parameter naming. Parameters are documented in snake_case (matching the wire format) and exposed as --kebab-case flags. The CLI converts between the two automatically.

studio run <endpoint>

The workhorse. Submits a generation task, polls until it completes, and prints the result URLs. Model parameters are passed as flags using the kebab-case form. Both --key value and --key=value syntax are accepted. Values are type-coerced and enum-validated before any HTTP call is made: Missing required parameters and empty strings for required string parameters produce a friendly error before the request is sent. Recipes:
Output (text, default):
Output (--json):
The result-key (videos, images, audios) matches the Result Key field shown by studio params.

Local image inputs

Any parameter that takes an image (--image, --images, --first-frame, --last-frame, --mask, --mask-image-url, --ref-images-url, --reference-images, …) accepts three kinds of values: Supported formats: PNG, JPG, JPEG, GIF, BMP, WebP, TIFF, SVG, ICO, HEIC, HEIF, AVIF. Files are capped at 20 MB; paths inside sensitive directories (/etc, ~/.ssh, ~/.aws, …) are blocked. If you pass a path that doesn’t exist, the CLI prints a yellow warning to stderr and still attempts the request (treating the string as a URL). This makes typos loud while still allowing intentional pass-through of URL-shaped strings.

studio status <api-path> <task-id>

Check on an async task submitted with run --no-wait (or via the HTTP API directly).
The api-path argument is printed by run --no-wait, and also shows up as api_path in studio list --json and as API Path in studio params. Status values: Snapshot calls (without --wait) only exit non-zero on the explicit failed state; other statuses simply mean “not done yet.”

studio config

Print the resolved configuration (base URL, request timeout, retry budget). No network call, no secrets revealed. Run this when you suspect the wrong host is being contacted.

studio upgrade / studio reset

Wrapper-only commands that operate on the local install of the studio engine:
upgrade is safe to run on a schedule; reset is the escape hatch when a stale install is misbehaving.

Async workflow

For long jobs (video, music, high-effort image generation), submit without waiting and resume polling later:
If the poller in step 2 hits its --max-wait budget, the task itself keeps running on the server — re-run the same status --wait to resume.

Fan-out / fan-in

Submit many prompts in parallel, then wait on the whole batch:

Scripting

Every studio command supports --json. Pair with jq for clean shell pipelines:
Stdout vs stderr. Stdout carries the JSON / text result and is safe to pipe. Stderr carries per-poll progress lines, warnings, and real errors. Use --quiet to suppress progress while keeping real errors.

Exit codes

When scripting against the CLI, always check $? before parsing the JSON — a failed call may still emit JSON, but the shape will contain an error field instead of results.

Common errors

Tips

  • The first mulerun studio invocation downloads the studio engine into ~/.mulerun/vendor/; subsequent calls reuse it.
  • For fast endpoints (text-to-image), shrinking --poll-interval 5 makes the experience feel snappier.
  • For very long videos, bump --max-wait 1800 or 3600. The task does not get cancelled when the poller stops — status can pick it back up.
  • --debug prints the resolved engine path and the exact arguments forwarded to it; handy when an option doesn’t seem to take effect.