Skip to main content

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.

terminal
$ 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

Setup

Install and sign in

Install from npm, then connect the API key from your dashboard.

One package from npm. Node.js 18 or newer:

npm
$ npm install -g @unifically/cli

Interactive

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
$ 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-fast

Session defaults

/params injects defaults into every run; explicit values win. /unset removes one, /session shows what is active.

/params duration=8 · /unset · /session

Paste 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.mp4

Completion 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.txt

Inputs

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=42

Auto-coerced: numbers, true/false, and null become real types.

key==valueversion==3.0

Literal string, never coerced. version==3.0 stays "3.0".

key:=jsonurls:='["a","b"]'

Strict JSON, for arrays and objects.

Upload the file or URL first, then send the hosted URL.

a.0.b=valuemessages.0.role=user

Dot 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_url

Same pattern for --videos / --video and --audios / --audio.

--first-image / --last-imagestart_image_url / end_image_url

First and last frame. kling-*-video models map to *_frame_url automatically.

key=@fileany other file field

Any 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
$ 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
$ 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
$ uai cost google/veo-3.1-quality prompt="test" duration=10est $2.00 · dry run, nothing charged

Tasks & 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 status
$ 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
$ 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 · 3h

Catalog & 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 refresh

Flags & options

--type <t>--search <q>--json
uai models
$ uai models --search flux --type imageblack-forest-labs/flux.2-pro     image · $0.03/imageblack-forest-labs/flux.2-dev     image · $0.01/image

uai 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
$ uai resources elevenlabs voices --search sarahSarah - Mature, Reassuring, Confident   EXAVITQu4vr4xnSDxMaL$ uai run elevenlabs/text-to-speech text="Hello" voice="Sarah"  voice "Sarah"  voice=EXAVITQu4vr4xnSDxMaL

Assets

uai upload

Upload a local file or URL to the CDN and get a file_url back.

Syntax

uai upload <file | url>
uai upload
$ uai upload poster.png uploaded   https://files.unifically.com/u/poster-8c1a.png

Account & setup

uai account

Your identity and live balance.

Syntax

uai account

Flags & options

--json
uai account
$ uai account[email protected] · balance $14.20

uai config / uai auth

Defaults (output directory, polling, saving) and API key management.

Syntax

uai config [set|unset <key> <value>] · uai auth login|status|logout

Flags & options

saveoutputDirpollIntervaltimeoutbaseUrllogologoStyle
uai config
$ uai config set outputDir ~/Downloads/ai outputDir = ~/Downloads/ai$ uai auth status key sk-...9f2 · valid

uai onboard

First-run wizard: connects your API key, picks a default output directory, and loads the live model catalog.

Syntax

uai onboard
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 stdout

Flags & options

--verbose
uai exec
$ 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.txt

Flags & options

--no-logo
uai session
$ 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" --syncEOF

uai completion

Tab-completion scripts for bash, zsh, fish, and PowerShell, covering commands, flags, and cached model ids.

Syntax

uai completion bash|zsh|fish|powershell
bash
$ echo 'eval "$(uai completion bash)"' >> ~/.bashrc

uai help / uai version

The built-in reference and the installed version.

Syntax

uai help · uai version
uai help
$ 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.

paste
# 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.

scripting
$ 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  result

Know 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
$ 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.