A lightweight CLI for managing API keys and running Claude Code, Codex, Gemini, OpenCode, and Pi CLI across providers.
- Securely manages multiple API keys for different providers.
- Runs
claude,codex,gemini,opencode, andpiCLI tools seamlessly. - Provides a simple chat TUI and a one-shot
-xmode. - Can expose the active provider as a local OpenAI-compatible server.
Homebrew:
brew install yuanchuan/tap/aivoInstall script:
curl -fsSL https://yuanchuan.dev/aivo/install.sh | shVia npm (only recommended for windows users):
npm install -g @yuanchuan/aivoOr download a binary from GitHub Releases.
# 1) Add a provider key (OpenRouter, Vercel AI Gateway, etc.)
aivo keys add
# 2) Launch your tool
aivo claude
# 3) Optionally pin a model
aivo claude --model moonshotai/kimi-k2.5Use your GitHub Copilot subscription.
aivo keys add copilot
aivo claudeUse local models via Ollama.
aivo keys add ollama
# auto pull the model if not present
aivo claude --model llama3.2| Command | Description |
|---|---|
| run | Launch an AI tool (claude, codex, gemini, opencode, pi) |
| chat | Interactive chat TUI or one-shot -x mode |
| serve | Local OpenAI-compatible API server |
| keys | Manage API keys (add, use, rm, cat, edit, ping) |
| models | List available models from the active provider |
| alias | Create short names for models |
| info | Show system info, keys, tools, and directory state |
| stats | Show usage statistics |
| update | Update to the latest version |
Launch an AI tool with the active provider key. All extra arguments are passed through to the underlying tool.
Supported tools:
claudeClaude CodecodexCodexgeminiGemini CLIopencodeOpenCodepiPi Coding Agent
The run keyword is optional — tool names work directly as shortcuts, so aivo claude is equivalent to aivo run claude.
aivo run claude
aivo claude --dangerously-skip-permissions
aivo claude --resume 16354407-050e-4447-a068-4db222ff841Pick a model for one run, or omit the value to open the model picker:
aivo claude --model moonshotai/kimi-k2.5
aivo claude --model # opens model picker
aivo claude -m # short formUse a different saved key without changing the active one:
aivo claude --key openrouter
aivo claude --key copilot
aivo claude --key # opens key pickerPreview the resolved command and environment without launching:
aivo claude --dry-runInject extra environment variables into the child process:
aivo claude --env BASH_DEFAULT_TIMEOUT_MS=60000Without a tool name, aivo run uses the interactive start flow, which remembers your key + tool selection per directory,
so next time you run aivo run in the same directory, it will skip the selection step and go straight to launching the tool.
aivo runaivo chat starts the full-screen chat UI.
aivo chatSpecify or change the chat model. Omit the value to open the model picker. The selected model is remembered per saved key.
aivo chat --model gpt-4o
aivo chat -m claude-sonnet-4-5
aivo chat --model # opens model pickerUse a different saved key for this chat session:
aivo chat --key openrouter
aivo chat -k # opens key pickerSend a single prompt and exit. When -x has a message, piped stdin is appended as context. When -x has no message, the entire stdin becomes the prompt.
aivo chat -x "Summarize this repository"
git diff | aivo -x "Write a one-line commit message"
cat error.log | aivo -x
aivo -x # type interactively, Ctrl-D to sendaivo -x is a shortcut for aivo chat -x.
Attach text files or images to the next message (repeatable):
aivo chat --attach README.md --attach screenshot.pngaivo serve exposes the active provider as a local OpenAI-compatible endpoint. Handy for scripts and tools that already speak the OpenAI API.
aivo serve # http://127.0.0.1:24860Listen on a custom port (default: 24860):
aivo serve --port 8080
aivo serve -p 8080Bind to a specific address (default: 127.0.0.1):
aivo serve --host 0.0.0.0 # expose on all interfacesUse a different saved key:
aivo serve --key openrouter
aivo serve -k # opens key pickerEnable request logging. Logs to stdout by default, or to a file if a path is given:
aivo serve --log | jq . # JSONL to stdout
aivo serve --log /tmp/requests.jsonl # JSONL to fileEnable multi-key failover on 429/5xx errors. Automatically retries with other saved keys:
aivo serve --failoverEnable CORS headers for browser-based clients:
aivo serve --corsUpstream request timeout in seconds (default: 300, 0 = no timeout):
aivo serve --timeout 60Require a bearer token. Auto-generated if no value given:
aivo serve --auth-token # auto-generated token
aivo serve --auth-token my-secret # specific tokenManage saved API keys. Keys are stored locally and encrypted in the user config directory.
aivo keys # list all keysAdd a new provider key. Interactive by default, or pass --name, --base-url, and --key for scripted setup:
aivo keys add
aivo keys add --name openrouter --base-url https://openrouter.ai/api/v1 --key sk-xxx
aivo keys add --name groq --base-url https://api.groq.com/openai/v1 --key sk-xxx
aivo keys add --name deepseek --base-url https://api.deepseek.com/v1 --key sk-xxxAny endpoint that speaks a supported protocol can be saved — you are not limited to the providers above.
Two special names skip the base-url/key prompts:
copilot— uses your GitHub Copilot subscription via OAuth device flowollama— connects to a local Ollama instance (auto-starts if needed)
aivo keys add copilot
aivo keys add ollamaSwitch the active key by name or ID:
aivo keys use openrouter
aivo keys use # opens key picker
aivo use openrouter # shortcutPrint the decrypted key details:
aivo keys cat
aivo keys cat openrouterEdit a saved key interactively:
aivo keys edit
aivo keys edit openrouterRemove a saved key:
aivo keys rm openrouterHealth-check the active key, or all keys:
aivo keys ping
aivo keys ping --all
aivo ping # shortcutList models available from the active provider. Model lists are cached for one hour.
aivo modelsBypass the cache and fetch a fresh model list:
aivo models --refreshList models for a different saved key:
aivo models --key openrouterFilter models by substring:
aivo models -s sonnetCreate short names for models. Aliases work anywhere a model name is accepted.
aivo alias # list all aliasesaivo alias fast=claude-haiku-4-5
aivo alias best claude-sonnet-4-6 # alternative syntaxThen use it in place of the full model name:
aivo claude -m fast
aivo chat -m bestaivo alias rm fastShow a compact overview of saved keys, installed tools, the remembered tool/model for the current directory, and the cached model count for the active key. (ls is accepted as an alias.)
aivo infoAlso health-check all keys:
aivo info --pingShow usage statistics across all tools. Aggregates token counts from aivo chat, Claude Code, Codex, Gemini, OpenCode, and Pi by reading each tool's native data files. Per-file caching makes subsequent runs fast.
OpenCode stats are read via the sqlite3 CLI (preinstalled on macOS/Linux). If sqlite3 is not available, OpenCode stats are silently skipped.
aivo statsShow stats for a single tool:
aivo stats claude
aivo stats chatShow exact numbers instead of human-readable approximations:
aivo stats -nFilter by key, model, or tool name:
aivo stats -s openrouterBypass cache and re-read all data files:
aivo stats -rShow all models (default: top 20, rest grouped as "others"):
aivo stats -aUpdate to the latest version. Delegates to Homebrew or npm when installed by those package managers.
aivo updateForce update even if installed via a package manager:
aivo update --forcemake build
make build-debug
make check
make test
make clippy
make build-releaseMIT