100+ AI models in your terminal
One command and one API key for video, images, music, speech, and LLM chat from the shell.
Runs on macOS, Linux, and Windows. Requires Node.js 18 or newer.
$ uai run google/veo-3.1-fast prompt="a cat walking on the beach at sunset" duration=8 --sync⠹ google/veo-3.1-fast · processing · 0:12 · est $0.40✓ generated in 0:47 ▸ veo-3.1-fast-b4e1.mp4 (2.1MB)What it is
Every model through one interface
The CLI uses the same Unifically API as the playground: Flux, Veo, Kling, SeeDream, Suno, ElevenLabs, GPT, Claude, and the rest of the catalog. Media runs return a task id by default; --sync polls to completion and downloads the result.
Every key=value argument becomes part of the model's input, so the same command works across the catalog. The CLI refreshes the catalog automatically and rejects unknown provider/model ids before submission.
Models
100+
Install
npm i -g
Commands
uai · unifically
License
MIT
One package from npm. Node.js 18 or newer:
$ npm install -g @unifically/cliInteractive
Run uai bare for a session
Commands without the uai prefix, in a Claude Code-style input box. Pipe a script into uai session and each line runs in order.
$ uai session › model google/veo-3.1-fast✓ session model google/veo-3.1-fast› params duration=8› run prompt="a cat on the beach at sunset" --sync⠹ processing · 0:24 · est $0.40✓ generated in 0:52 ▸ veo-3.1-fast-c81d.mp4 (2.0MB)Sticky model
Pick a model once with model, then just run prompt="..." for the rest of the session (model off clears it).
model google/veo-3.1-fastSession defaults
params injects defaults into every run; explicit values win. unset removes one, and session shows what is active.
params duration=8 · unset duration · sessionPaste images
Paste a file or screenshot and it becomes [Image N], uploaded to the CDN in the background.
[Image 1]Shell escape
Prefix a line with ! to run it in your shell without leaving the session.
!ffprobe out.mp4Completion and history
Tab completes commands, model ids, flags, and config keys. Arrow keys walk persistent history.
Tab · ↑ / ↓Batch mode
Pipe a script in and each line runs in order. Errors do not abort the rest; exit stops early.
uai session < script.txtInputs
How arguments reach the model
Every key=value becomes model input, so new models work without a CLI update. The operators cover types, files, and nesting.
Input operators
httpie-style. Values are coerced by default; the other operators opt out or go deeper.
key=valueseed=42Auto-coerced: numbers, true/false, and null become real types.
key==valueversion==3.0Literal string, never coerced. version==3.0 stays "3.0".
key:=jsonurls:='["a","b"]'Strict JSON, for arrays and objects.
key=@path[email protected]Upload the file or URL first, then send the hosted URL.
a.0.b=valuemessages.0.role=userDot notation nests objects and arrays.
Media references
Local files upload automatically; URLs pass through. A plural flag fills an array field and a singular one fills a string field, so match what the model documents.
--images / --imageimage_urls[] / image_urlPlural fills image_urls[]; singular fills image_url.
--videos / --videovideo_urls[] / video_urlPlural fills video_urls[]; singular fills video_url.
--audios / --audioaudio_urls[] / audio_urlPlural fills audio_urls[]; singular fills audio_url.
--first-image / --start-imagestart_image_urlFirst frame. kling-*-video models use start_frame_url automatically.
--last-image / --end-imageend_image_urlLast frame. kling-*-video models use end_frame_url automatically.
key=@fileany other file fieldAny parameter the flags do not cover takes a file with @.
Reference
Every command
The full command set with syntax, flags, and a real example for each. Copy any example straight into your terminal.
Generate
uai run
Submit a generation task. Add --sync to poll to completion and download in one step.
Syntax
uai run <provider/model> [key=value ...] [flags]Flags & options
-w, --sync--async--url--open / --web-o, --output <path>--save / --no-save--dry-run--confirm--json$ uai run black-forest-labs/flux.2-pro prompt="a fox" aspect_ratio=1:1 --sync✓ generated in 0:06 · $0.03 ▸ flux.2-pro-a1f3.png (1.4MB)uai run <llm>
LLMs go through the same run command — the CLI routes them to chat and streams to your terminal. No task id, no download.
Syntax
uai run <provider/model> "prompt" [key=value ...]Flags & options
system="..."temperature=max_tokens=top_p=stop=seed=response_format:=tools:=tool_choice=--images <file>--stream / --no-stream--json$ uai run openai/gpt-5.5 "explain quantum tunneling in one paragraph"Quantum tunneling is a particle passing through an energybarrier it classically lacks the energy to cross... # stdin becomes the prompt$ cat essay.txt | uai run anthropic/claude-fable-5 system="be terse"uai cost
Estimate a job's cost before running it. Dry run, no charge.
Syntax
uai cost <provider/model> [key=value ...]Flags & options
--json$ uai cost google/veo-3.1-quality prompt="test" duration=10est $2.00 · dry run, nothing chargedTasks & monitoring
uai status / uai wait
Check a task, or block until it finishes and download. No id means your most recent task.
Syntax
uai status [task_id] · uai wait [task_id]Flags & options
status: --url, --jsonwait: --urlwait: --save / --no-savewait: -o, --output <path>wait: --poll-interval <s>wait: --timeout <s>wait: --json$ uai statustask_9f27c1 · google/veo-3.1-fast · processing · 0:31$ uai wait task_9f27c1✓ completed in 1:12 ▸ veo-3.1-fast-9f27.mp4 (2.4MB)uai tasks
List your account's tasks, newest first. Filter by model, status, type, provider, or date.
Syntax
uai tasks [provider/model] [filters]Flags & options
--status processing|completed|failed--type <csv>--provider <csv>--since <date|unix>--before <date|unix>--page <n>--page-size 10|25|50|100--search <q>--json$ uai tasks --status completed --type video --page-size 25task_9f27c1 · google/veo-3.1-fast · completed · $0.40 · 2mtask_b7d2aa · kuaishou/kling-3.0-video · completed · $0.36 · 3hCatalog & discovery
uai models
Browse and search the live catalog when a key is available, with the local cache as an offline fallback. Use refresh to update it explicitly.
Syntax
uai models [--type ...] [--search ...] · uai models <provider/model> · uai models refreshFlags & options
--type image|video|audio|llm--search <q>--refresh--json$ uai models --search flux --type imageblack-forest-labs/flux.2-pro image · $0.03/imageblack-forest-labs/flux.2-dev image · $0.01/imageuai resources
Voice lists and helper endpoints by friendly name. Pass a voice name and the CLI resolves the id the model expects.
Syntax
uai resources <path ...>Flags & options
--search <q>--all--json$ uai resources elevenlabs voices --search sarahSarah - Mature, Reassuring, Confident EXAVITQu4vr4xnSDxMaL$ uai run elevenlabs/text-to-speech text="Hello" voice="Sarah" voice "Sarah" → voice=EXAVITQu4vr4xnSDxMaLAssets
uai upload
Upload a local file or URL to the CDN and get a file_url back.
Syntax
uai upload <file | url> [more ...]Flags & options
--json$ uai upload poster.png✓ uploaded ▸ https://files.unifically.com/u/poster-8c1a.pngAccount & setup
uai account
Your identity and live balance.
Syntax
uai accountFlags & options
--json$ uai account[email protected] · balance $14.20uai config / uai auth
Defaults (output directory, polling, saving) and API key management.
Syntax
uai config list|get|set|unset|path · uai auth login|status|logoutFlags & options
saveoutputDirpollIntervaltimeoutbaseUrllogologoStyle--json$ uai config set outputDir ~/Downloads/ai✓ outputDir = ~/Downloads/ai$ uai auth status✓ key sk-...9f2 · validuai onboard
First-run wizard: connects your API key, picks a default output directory, and loads the live model catalog.
Syntax
uai onboardFlags & options
--force$ uai onboard✓ API key connected✓ output directory ~/ai✓ model catalog loadeduai exec
Machine mode for agents and scripts: runs any API command as a JSONL event stream — one JSON object per stdout line (start, submitted, progress, delta, saved, result, error), silent stderr, same exit codes.
Syntax
uai exec <command ...> → JSONL events on stdoutFlags & options
--verbose$ uai exec run black-forest-labs/flux.2-pro prompt="a fox" --sync -o fox.png{"event":"submitted","task_id":"0c15…","model":"…"}{"event":"progress","status":"processing","elapsed_ms":3401}{"event":"saved","dest":"fox.png","bytes":342502}{"event":"result","data":{"status":"completed", …}}uai / uai session
The classic inline session — commands without the uai prefix. Pipe a script into uai session and each line runs in order; errors do not abort the rest.
Syntax
uai · uai session · uai --resume <session-id> · uai session < script.txtFlags & options
--no-logo--resume <session-id>$ uai session --no-logo <<'EOF'run black-forest-labs/flux.2-pro prompt="a fox" --syncrun google/veo-3.1-fast prompt="a fox walking" --syncEOFuai completion
Tab-completion scripts for bash, zsh, fish, and PowerShell, covering commands, flags, and cached model ids.
Syntax
uai completion install [shell] · uai completion bash|zsh|fish|powershell$ uai completion install✓ bash tab-completion installeduai help / uai version
The built-in reference and the installed version.
Syntax
uai help | --help | -h · uai version | --version | -v$ uai helpUsage: uai <command> [options]Pasted media
Paste an image straight into a session
No uploading by hand or copying URLs around: paste a file or a screenshot, then drop the placeholder wherever the URL belongs.
[Image N]
In an interactive session, paste an image file or screenshot and it becomes [Image N], uploading to the CDN in the background. Drop the placeholder wherever the URL should go.
# in a session, paste an image (Explorer copy, drag-drop, or Ctrl+V):› run google/nano-banana-pro prompt="restyle this" [Image 1]✓ [Image 1] uploaded · generated in 0:09 ▸ nano-banana-pro-e2d4.png (1.1MB)Flags
CLI flags
The command cards above show scoped filters such as --status and --search. Flags override configured defaults where both apply.
-w, --syncBlock: poll to completion and download.--asyncExplicit default: submit and return the task id.-o, --output <path>Save to a specific file or directory.--urlPrint only the output URL on stdout; implies --sync.--open / --webDownload the result and open it in your default app; implies --sync.--save / --no-save / --no-downloadForce downloads on or off.--out-template <t>Filename template: {model} {id} {index} {ext}.--jsonMachine-readable output on stdout.--dry-runCost preview only, nothing submitted.--confirmShow the estimated cost and ask before spending (interactive terminal only; errors in scripts).--webhook <url>POST the completed task to a callback URL.--poll-interval <s>Seconds between polls (default 3).--timeout <s>Max wait for --sync and LLM streams (default 600).--stream / --no-streamForce LLM streaming on or off.--api-key <key> / --base-url <url>Per-call API key and base URL overrides.--resume <session-id>Restore a saved interactive session by id.--no-logoSkip the session logo.--verboseShow human-readable progress on stderr with uai exec.-h, --help / -v, --versionPrint the command reference or installed CLI version.--no-color / -q, --quietDisable colors, or quiet output with -q.Clean pipes for scripts and agents
--json prints structured data on stdout while logs and spinners go to stderr. Prompts are skipped when stdin is not a terminal, and every request has a timeout.
$ URL=$(uai run black-forest-labs/flux.2-pro prompt="a fox" --url)$ uai tasks --status processing --json | jq -r '.tasks[].task_id'task_9f27c1# agents: JSONL event stream — one JSON object per stdout line$ uai exec run google/veo-3.1-fast prompt="a fox" --sync | jq -r .eventstart → submitted → progress → saved → resultKnow the price before you spend
uai cost is a free dry run and --confirm asks before submitting. A real balance rejection is always HTTP 402; provider capacity errors are called out as such.
$ uai cost google/veo-3.1-quality prompt="test" duration=10est $2.00 · dry run, nothing charged$ uai run google/veo-3.1-quality prompt="test" duration=10 --confirmest $2.00 · continue? [Y/n]Design
How it works
One command per task
run submits and prints a task id right away, which suits scripts and agents. Add --sync to poll and download in one step. A timed-out wait is resumable with uai wait <task_id>.
Files become URLs for you
Paste an image into a session and it becomes [Image N], uploaded to the CDN in the background. Local file paths upload automatically wherever a URL is expected; URLs pass through as-is.
Cost before you spend
uai cost prices any job as a dry run, --confirm shows the estimate and asks before submitting, and uai account shows your live balance. A real balance rejection is always HTTP 402; provider capacity errors are called out as such, so you know whether to top up or retry.
Built for scripts and agents
--json prints structured data on stdout while logs and spinners go to stderr, so pipes stay clean. Nothing hangs: every request has a timeout, and prompts are skipped when stdin is not a terminal.
Nested parameters
Beyond flat key=value, dot notation builds nested objects and arrays: messages.0.role=user messages.0.content="..." for multi-turn chat, settings.instrumental=true for nested options, and [email protected] for arrays.
The CLI is free
Pay only for generations, at the same per-task prices as the API, billed to your key. Price any job first with uai cost, or check the pricing page.
FAQ
Frequently asked questions
A command-line tool (npm package @unifically/cli, MIT-licensed) that runs 100+ image, video, audio, and LLM models through the Unifically API. It submits tasks, polls them to completion, and downloads results, with one API key.
npm install -g @unifically/cli with Node.js 18 or newer. That installs two identical commands, uai and unifically. Run uai onboard once to connect your key and load the model catalog.
The CLI is free. You pay only for generations, at the same per-task prices as the Unifically API. uai cost estimates any job before you spend, and --confirm asks before submitting.
Yes. --json puts structured output on stdout and logs on stderr, --url prints just the result URL, prompts are skipped when stdin is not a terminal, and every request has a timeout.
Use flags like --images, --videos, or --first-image. Local files upload to the CDN automatically, URLs pass through as-is, and pasting an image in a session becomes [Image N].
Yes. LLMs go through the same run command: uai run openai/gpt-5.5 "your prompt" streams straight to your terminal. Pass system="..." for a system prompt, --no-stream for one block of text, or pipe stdin in as the prompt.
