Free, private, async CLI AI tool with multi-provider failover
Project description
aicli-maxmux
A free, private, terminal-native AI CLI with multi-provider failover, persistent memory, web search, vision support, and autonomous agent mode.
No vendor lock-in. No single point of failure. All keys stored encrypted locally.
Features
| Feature | Command |
|---|---|
| Multi-provider failover (Groq → OpenRouter → Gemini → Mistral → Ollama) | aicli ask "..." |
| Persistent encrypted conversation memory (SQLite + Fernet) | aicli chat --session myproject |
| Web search with current results | aicli ask --web "latest news" |
| Vision / image analysis | aicli ask --image screenshot.png "what error?" |
| Shell command generation + execution | aicli ask --shell "find large files" |
| Autonomous multi-step agent | aicli agent "set up a Python project" |
| Semantic RAG over chat history | aicli chat --context |
| Session export (Markdown / JSON) | aicli export mysession > out.md |
| Encrypted key storage, no shell exports | aicli config set TAVILY_API_KEY tvly-xxxx |
| Tor / proxy support | aicli config set AICLI_PROXY socks5://127.0.0.1:9050 |
Install
pip install aicli-maxmux
Quick Start
# Set at least one API key
aicli config set-key groq # fastest — free at console.groq.com
aicli config set-key openrouter # vision support — free at openrouter.ai
# Ask something
aicli ask "explain async/await in Python"
# Web search (current results)
aicli config set TAVILY_API_KEY tvly-xxxx # free at app.tavily.com
aicli ask --web "latest Python version"
# Vision
aicli ask --image screenshot.png "what does this error mean?"
# Persistent session
aicli chat --session myproject
# Agent mode
aicli agent "create a Flask API with tests"
Provider Setup
| Provider | Get Key | Env Var | Notes |
|---|---|---|---|
| Groq | https://console.groq.com/keys | GROQ_API_KEY |
Fastest, free |
| OpenRouter | https://openrouter.ai/keys | OPENROUTER_API_KEY |
Vision, free tier |
| Gemini | https://aistudio.google.com/app/apikey | GEMINI_API_KEY |
Vision, free tier |
| Mistral | https://console.mistral.ai/api-keys | MISTRAL_API_KEY |
Fallback |
| Ollama | (local) | — | Run ollama serve locally |
| Tavily | https://app.tavily.com | TAVILY_API_KEY |
Web search, 1000/mo free |
Store keys securely (OS keychain, no shell exports needed):
aicli config set GROQ_API_KEY gsk-xxxx
aicli config set OPENROUTER_API_KEY sk-or-xxxx
Architecture
aicli-maxmux uses a 3-layer CMA (Contextual Memory Architecture):
🔥 Hot Layer — in-memory context for current session
🌡️ Warm Layer — SQLite + Fernet encrypted persistent history
❄️ Cold Layer — ChromaDB vector embeddings for semantic RAG
Provider failover chain: Groq → OpenRouter → Gemini → Mistral → Ollama
Adaptive cooldowns: 429 → 5min, 401/403 → 1hr, 5xx → 10-15s
All Commands
aicli ask "prompt" # single shot
aicli ask --shell "prompt" # generate + execute shell commands
aicli ask --code "prompt" # code only output
aicli ask --image file.png "prompt" # vision (OpenRouter/Gemini)
aicli ask --web "prompt" # web search + answer
aicli ask --web-debug "prompt" # debug web backends (clean output)
aicli ask --web-debug --web-verbose # debug web backends (full output)
aicli ask --context "prompt" # inject semantic context from history
aicli chat --session NAME # persistent conversation
aicli repl # interactive REPL
aicli agent "task" # autonomous multi-step execution
aicli agent --dry-run "task" # show plan without executing
aicli export SESSION > out.md # export to markdown
aicli export SESSION --format json # export to JSON
aicli config set KEY VALUE # store any key encrypted
aicli config get KEY # read stored key (masked)
aicli config set-key PROVIDER # interactive key entry
aicli config show # show all config + env vars
aicli config keys # show which providers have keys
aicli provider status # show provider availability
aicli provider test groq # test a specific provider
aicli session list # list all sessions
aicli session show NAME # show session messages
aicli session delete NAME # delete a session
aicli index PATH # index files for RAG
Web Search
--web uses a 6-backend chain — no API key required for the free tier:
- Tavily — AI-optimised, most accurate (set
TAVILY_API_KEYfor best results) - SearXNG — public instances, rotated (skipped automatically over Tor)
- DuckDuckGo — Instant Answer JSON API
- DuckDuckGo lite — HTML scrape with cookie jar
- Bing — scrape with rotating User-Agent
- Mojeek — independent engine, scrape-friendly fallback
Tor/proxy support works out of the box — Tavily is used as the primary backend over SOCKS5.
Privacy & Security
- All conversation history encrypted with Fernet (AES-128-CBC)
- Keys derived from machine fingerprint (hostname + username) — no master password needed
- API keys stored in OS keychain (libsecret / keychain) and encrypted Fernet file as fallback
- No telemetry, no cloud sync, no ads
- Tor/proxy support:
aicli config set AICLI_PROXY socks5://127.0.0.1:9050
Requirements
- Python 3.10+
- Optional:
pip install pysocksfor Tor/SOCKS5 support
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file aicli_maxmux-1.2.1.tar.gz.
File metadata
- Download URL: aicli_maxmux-1.2.1.tar.gz
- Upload date:
- Size: 667.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eac4a0a1d622426a2c9a2d8bcfb480f993981473bd17ee0505923b70e26ba582
|
|
| MD5 |
2765d8fae8ae75e5047861da55739a7c
|
|
| BLAKE2b-256 |
3b47e28e9a073cb82beb733403e81a5d7ca61a1c680f83aa894af3593b9c10f3
|
File details
Details for the file aicli_maxmux-1.2.1-py3-none-any.whl.
File metadata
- Download URL: aicli_maxmux-1.2.1-py3-none-any.whl
- Upload date:
- Size: 66.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8235e6ce3845b949ee5a7ce6562bf501cbf806f9b1645e9b81d3c58863cd07e0
|
|
| MD5 |
9493b96f1f80c896f9daa0040984a015
|
|
| BLAKE2b-256 |
be23d08ad4c99f64715c5cd63de3a7d719b72f3c7c25fad2caf870c6367f94ef
|