Skip to main content

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.

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

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, and session shows what is active.

params duration=8 · unset duration · 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

Plural fills image_urls[]; singular fills image_url.

--videos / --videovideo_urls[] / video_url

Plural fills video_urls[]; singular fills video_url.

--audios / --audioaudio_urls[] / audio_url

Plural fills audio_urls[]; singular fills audio_url.

--first-image / --start-imagestart_image_url

First frame. kling-*-video models use start_frame_url automatically.

--last-image / --end-imageend_image_url

Last frame. kling-*-video models use end_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 / --web-o, --output <path>--save / --no-save--dry-run--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=top_p=stop=seed=response_format:=tools:=tool_choice=--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

status: --url, --jsonwait: --urlwait: --save / --no-savewait: -o, --output <path>wait: --poll-interval <s>wait: --timeout <s>wait: --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 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
$ 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 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 refresh

Flags & options

--type image|video|audio|llm--search <q>--refresh--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 <path ...>

Flags & options

--search <q>--all--json
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> [more ...]

Flags & options

--json
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 list|get|set|unset|path · uai auth login|status|logout

Flags & options

saveoutputDirpollIntervaltimeoutbaseUrllogologoStyle--json
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

Flags & options

--force
uai onboard
$ uai onboard API key connected output directory ~/ai model catalog loaded

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

Flags & options

--no-logo--resume <session-id>
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 install [shell] · uai completion bash|zsh|fish|powershell
uai completion
$ uai completion install bash tab-completion installed

uai help / uai version

The built-in reference and the installed version.

Syntax

uai help | --help | -h · uai version | --version | -v
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

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.

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