80+ AI models in your terminal
One command, one API key, zero dependencies. Generate video, images, music, and speech, or chat with LLMs, without leaving 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 talks to the same Unifically API as the playground: Flux, Veo, Kling, SeeDream, Suno, ElevenLabs, GPT, Claude, and the rest of the catalog. It submits the task, polls it to completion, and downloads the result.
Every key=value argument becomes part of the model's input, so the CLI works with current and future models without updates. New model ids are sent as-is even before your local catalog knows them.
Models
80+
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, /session shows what is active.
/params duration=8 · /unset · /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_urlSame pattern for --videos / --video and --audios / --audio.
--first-image / --last-imagestart_image_url / end_image_urlFirst and last frame. kling-*-video models map to *_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-o <path>--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=--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
--poll-interval <s>--timeout <s>--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 <s>--type <t>--provider <p>--since / --before--page / --page-size--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 the cached catalog, search it, or pull the newest models with refresh.
Syntax
uai models [--type ...] [--search ...] · uai models <provider/model> · uai models refreshFlags & options
--type <t>--search <q>--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 <provider> <resource>Flags & options
--search <q>--all$ 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>$ 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 [set|unset <key> <value>] · uai auth login|status|logoutFlags & options
saveoutputDirpollIntervaltimeoutbaseUrllogologoStyle$ 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 onboard$ uai onboard✓ API key connected✓ output directory ~/ai✓ model catalog loaded (84 models)uai 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 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 session · uai session < script.txtFlags & options
--no-logo$ 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 bash|zsh|fish|powershell$ echo 'eval "$(uai completion bash)"' >> ~/.bashrcuai help / uai version
The built-in reference and the installed version.
Syntax
uai help · uai version$ 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
Global flags
Per-command flags always override config defaults. Set a value once with uai config set instead of repeating a flag.
-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.--openDownload the result and open it in your default app; implies --sync.--save / --no-saveForce 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 / --base-urlPer-call API key and base URL overrides.--no-logoSkip the session logo.--no-color / -qDisable 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 80+ 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.
