A terminal AI CLI (fork of Ollama's client) backed by our own API. No local GPU or model download required — every request goes to api.sprapp.com, which routes to whichever GPU box is currently serving the model you asked for.
macOS / Linux
curl -fsSL https://oaica.com/install.sh | bash
Detects your architecture automatically.
Windows (PowerShell)
irm https://oaica.com/install.ps1 | iex
Installs to %LOCALAPPDATA%\Programs\OAICA and adds oaica to your session PATH. Set $env:OAICA_INSTALL_DIR first for a custom location.
Same command as install — it overwrites the existing copy cleanly, no separate upgrade command needed:
curl -fsSL https://oaica.com/install.sh | bash # macOS/Linux
irm https://oaica.com/install.ps1 | iex # Windows
curl -fsSL https://oaica.com/install.sh | OAICA_UNINSTALL=1 bash # macOS/Linux
$env:OAICA_UNINSTALL=1; irm https://oaica.com/install.ps1 | iex # Windows
Removes the binary and its lib directory. Doesn't touch OAICA_API_KEY or any shell profile export you added yourself.
There's no self-serve signup yet — get a key from whoever manages prism-api-router's Cloudflare secrets (wrangler secret put API_KEY).
Recommended: sign in once, it's saved for you — no need to export anything every session:
oaica signin
Enter your OAICA API key (from api.sprapp.com): <paste your key>
Verifying...
Signed in. Key saved — future sessions won't need OAICA_API_KEY set.
Saved to ~/.oaica/api_key (mode 0600, your user only). oaica signout removes it. An OAICA_API_KEY environment variable, if set, always takes priority over the saved key.
Or set it directly via environment variable instead, if you prefer:
export OAICA_API_KEY=<your-key> # macOS/Linux
$env:OAICA_API_KEY="<your-key>" # Windows PowerShell
Add the export line to your shell profile (~/.bashrc, ~/.zshrc) or Windows profile so it persists across sessions.
Once set, list what's live right now — the roster changes as boxes come and go, so check this instead of hardcoding a name:
oaica run kat-coder-i-compact
> /model list
Available models:
flashplan
kat-coder-i-compact
oaica-v4-flash-i-compact
oaica-v4-flash-mm
openrouter-gpt4o-mini
sfc6-i-compact
> /model flashplan
Switched to model 'flashplan'
Same list from the shell without opening a session: curl -s https://api.sprapp.com/v1/models -H "Authorization: Bearer $OAICA_API_KEY". Also works piped/non-interactively — printf '/model list\n' | oaica run kat-coder-i-compact.
By default oaica talks to api.sprapp.com, which routes to whichever GPU box is currently live. To bypass the router and hit a specific backend directly (debugging, or a box not yet registered with the router):
export OAICA_HOST=http://<bitdeer-host>:<port> # e.g. the bitdeer tunnel URL for a model's port
oaica run kat-coder-i-compact
Direct-to-box mode usually has no auth of its own (the router is what enforces OAICA_API_KEY) — only point at a box you trust on a network you trust.
oaica run flashplan # recommended — auto-picks fast vs strong-reasoning per prompt
oaica run kat-coder-i-compact # fast, general-purpose
oaica run oaica-v4-flash-i-compact # stronger reasoning, slower
| Command | What it does |
|---|---|
/model <name> | Switch the active model for the rest of the session |
/model list | List models currently available |
/lora add <name> | Activate a LoRA adapter globally on its backend model |
/lora remove <name> | Deactivate it globally |
/lora list | List configured adapters |
/lora use <name> [name2 ...] | Use adapter(s) for this session only — per-request, doesn't touch other users |
/lora stack <name> | Add one more adapter to the current session's active set (compose multiple) |
/lora off | Clear this session's per-request adapter(s) |
/lora add/remove is a global toggle: it flips the adapter on/off for every concurrent caller of that model, everywhere. Use this only when you actually want a shared, server-wide change (e.g. you administer the box).
/lora use/stack/off is per-request: the adapter choice rides along in your own request only, isolated from every other user hitting the same model at the same time. This is what almost everyone wants. Verified concurrently: 3 simultaneous sessions, one using a LoRA, two not — correct/independent output on all 3, zero cross-talk.
oaica run fitness_en
> /lora list
Configured LoRA adapters:
fitness_en (model: fitness_en, slot: 0)
nutrition_en (model: fitness_en, slot: 1)
> /lora use fitness_en
Using LoRA(s) [fitness_en] for this session only (per-request — doesn't affect other users)
> What should I eat before a morning workout?
...
> /lora stack nutrition_en
Stacked LoRA(s) [nutrition_en] for this session only (per-request — doesn't affect other users)
> What should I eat before a morning workout?
...(blended answer — both adapters' influence, not just the last one)
> /lora off
Per-request LoRA disabled for this session.
Stacked LoRA composes multiple adapters in one request (e.g. a fitness adapter + a nutrition adapter together) — real weighted composition, verified to produce a blended response distinct from either adapter alone. All stacked adapters must share the same backend model (they need to already be loaded together on one server via multiple --lora flags at launch — this is a private/local-deployment feature, not something the CLI provisions on the fly). Adapters can be toggled/scaled/stacked freely at runtime; loading a brand-new adapter file not already on the server requires a restart — that's a real llama.cpp limitation, not ours.
curl -X POST https://api.sprapp.com/v1/chat/completions \
-H "Authorization: Bearer $OAICA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"flashplan","messages":[{"role":"user","content":"..."}],"max_tokens":256}'
Standard OpenAI-compatible shape. GET /v1/models lists what's live right now — always check this instead of hardcoding a name, the backend roster changes as boxes come and go.
Full contract + JS example (for browser/PWA use): see API_BACKEND.md in the prism-mobile repo.