Local-first personal AI assistant — CLI, web, and desktop frontends over a shared agent core.
Project description
Evi — personal AI assistant
Local-first personal assistant. Chat with a model on your hardware, let it use tools, generate images, automate scheduled tasks, drive your browser, and reach the same core from a terminal, a web app, or a native desktop window.
One Python core, three frontends, no cloud round-trips.
┌──────────────────────────────┐
│ evi (core library) │
│ Agent · Tools · Memory · │
│ Skills · Hooks · MCP · │
│ Scheduler · Dream · … │
└────┬──────────┬──────────┬───┘
│ │ │
┌───▼──┐ ┌───▼──┐ ┌───▼────┐
│ CLI │ │ Web │ │Desktop │
│ │ │ SSE │ │ Tauri │
└──────┘ └──────┘ └────────┘
Requirements
| Component | Why | Notes |
|---|---|---|
| Python 3.11+ | Core runtime | 3.12 tested |
| Git 2.17+ | Optional — evi worktree |
2.28+ for init -b |
| An LLM backend | One of LM Studio / Ollama / llama-server / any OpenAI-compatible endpoint | LM Studio default |
| NVIDIA GPU | Optional — speeds up local LLMs and ComfyUI image gen | CPU fallback works |
Quickstart
Package name: the project is Evi, but the PyPI distribution is
evi-assistant(the bareeviname was taken). Once published you'llpip install evi-assistant; the import package and CLI command are both stillevi(import evi, runevi). The steps below use an editable install from a clone, which doesn't depend on the published name.
git clone <repo> evi && cd evi
python -m venv .venv
.venv\Scripts\Activate.ps1 # Windows
# source .venv/bin/activate # Linux / macOS
pip install -e .
# Pick a backend. LM Studio + a tool-capable model is the easiest first run.
# In LM Studio: load qwen2.5-7b-instruct → Developer → Start Server.
evi models recommend # honest read on what'll fit
evi chat # off you go
/help inside the REPL lists every slash command (goal tracking, plan
mode, auto-approve, model switching, user-defined templates).
Three-machine setup
Evi is built to span machines. A typical setup:
| Machine | Role | Backend |
|---|---|---|
| AI server (P40) | LLM host + web UI | Ollama or llama-server, evi web on port 8000 |
| Desktop (16 GB) | Full power workstation | Local LM Studio |
| Laptop (2 GB) | Thin client | Profile points at the AI server |
See docs/multi-machine.md for the wiring.
Major commands
evi chat Start the REPL
evi web --host 0.0.0.0 Run the FastAPI + SSE web UI
evi dream Curate long-term memory from yesterday's chats
evi models recommend / list / use Hardware-aware model selection
evi models pull <ref> Pull via Ollama tag or hf:<repo>:<file>
evi schedule add / list / run-now Cron-style scheduled prompts
evi scheduler Foreground daemon for scheduled tasks
evi worktree create <branch> Spin up a git worktree for parallel work
evi profile add home --backend … Per-machine config overlays
evi voice listen / speak STT + TTS
evi mcp list-tools Show MCP server-provided tools
evi mcp serve Run Evi AS an MCP server (other agents use Evi's tools)
What's built
| Phase | Feature | Status |
|---|---|---|
| 1 | Foundation, CLI, agent loop, fs/code tools | ✅ |
| 2 | Gmail / Microsoft 365 email | ⏸ deferred |
| 3 | ComfyUI image generation | ✅ |
| 4 | FastAPI + SSE web UI | ✅ |
| 5 | Tauri desktop shell (local + remote modes) | ✅ |
| 6 | Persistent memory + scoped subagents | ✅ |
| 7 | MCP (Model Context Protocol) integration | ✅ |
| 8 | Skills + scheduled tasks | ✅ |
| 9 | Backends, model registry, hardware recommender, profiles | ✅ |
| 10 | EVI.md, slash commands, /goal, plan mode | ✅ |
| 11 | Hooks, auto mode, git worktrees | ✅ |
| 12 | Transcripts, dreaming, web search, voice TTS, computer use | ✅ |
| 13 | STT, web UI parity, polish | ✅ |
Layout
evi/ core library
agent.py agent loop with permission + hooks
backends/ LM Studio / Ollama / llama.cpp / OpenAI-compat
llm/ client + subagent runner
tools/ built-in tool catalog (fs, code, image, web, voice, …)
mcp/ MCP client bridge + manager
memory.py long-term memory store
skills.py user skill packets
scheduler.py APScheduler driver
dream.py memory-consolidation runner
hardware.py GPU + RAM detection
recommend.py curated model picks per VRAM
…
apps/ frontends that consume the core (shipped in the wheel)
cli/main.py Typer CLI
web/server.py FastAPI + SSE
web/static/ chat UI (vanilla JS)
desktop/ Tauri 2 shell (NOT a Python package; local-spawn or EVI_REMOTE_URL)
tests/ pytest
docs/ deeper guides
scripts/ install + dev helpers
Configuration
Per-user config lives in ~/.evi/. Highlights:
~/.evi/
config.toml primary settings — backend, tools, auto-approve
profiles/*.toml overlay profiles for per-machine config
memory/*.md long-term memory; `.attic/` holds soft-deleted entries
skills/<name>/ installed skill packets (SKILL.md + assets)
commands/<name>.md user-defined slash command templates
scheduled/*.json saved scheduled prompts
hooks.toml before/after_tool_call hooks
mcp.json MCP server list
transcripts/ per-session JSONL (input to dreaming)
logs/ run logs (dreams, scheduled tasks)
See docs/configuration.md for the full reference.
Optional dependency groups
pip install -e '.[web]' # FastAPI + uvicorn for `evi web`
pip install -e '.[mcp]' # Model Context Protocol client
pip install -e '.[scheduler]' # APScheduler for cron-style tasks
pip install -e '.[downloads]' # huggingface_hub for `evi models pull hf:...`
pip install -e '.[web-tools]' # DuckDuckGo search + BeautifulSoup
pip install -e '.[stt]' # faster-whisper + sounddevice
pip install -e '.[computer]' # pyautogui for mouse/keyboard control
pip install -e '.[dev]' # pytest + ruff
Or all at once:
pip install -e '.[dev,web,mcp,scheduler,downloads,web-tools,stt,computer]'
Development
pip install -e '.[dev]'
pytest -q # 183 tests, ~12 s
ruff check evi apps # style + bug-pattern lint
See docs/development.md for architecture notes.
Safety posture
- Default tool toggles lean conservative:
shell,subagent,web,voice,computer,gmail,outlook,image, andmcpare all OFF until you flip them inconfig.toml. auto.auto_approvelists categories that run without prompting. The defaults arefs, code, memory, skills, image.computeris never in this list — every mouse click / keystroke prompts.- Hook vetoes (
~/.evi/hooks.toml) can block any tool by glob match. - Soft-delete memory sends "forgotten" entries to
~/.evi/memory/.attic/so the dreaming engine can't permanently lose anything.
License
MIT (or whatever you prefer — pick when publishing).
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 evi_assistant-0.24.0.tar.gz.
File metadata
- Download URL: evi_assistant-0.24.0.tar.gz
- Upload date:
- Size: 281.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d10c45ac926d89695973525531522f682afb97d3b7d900543021214c3f26bdb3
|
|
| MD5 |
2bd4bae880e466e3629981778e14d36d
|
|
| BLAKE2b-256 |
f1a97d7871cf79b5227709cb8db050db51fb46a609af13b94a8cc4f62eb1d8a9
|
Provenance
The following attestation bundles were made for evi_assistant-0.24.0.tar.gz:
Publisher:
release.yml on dmang-dev/evi-ai
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
evi_assistant-0.24.0.tar.gz -
Subject digest:
d10c45ac926d89695973525531522f682afb97d3b7d900543021214c3f26bdb3 - Sigstore transparency entry: 1744396837
- Sigstore integration time:
-
Permalink:
dmang-dev/evi-ai@d1808756c0f0290788a867746491d9c4e6b38669 -
Branch / Tag:
refs/tags/v0.24.0 - Owner: https://github.com/dmang-dev
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d1808756c0f0290788a867746491d9c4e6b38669 -
Trigger Event:
push
-
Statement type:
File details
Details for the file evi_assistant-0.24.0-py3-none-any.whl.
File metadata
- Download URL: evi_assistant-0.24.0-py3-none-any.whl
- Upload date:
- Size: 231.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4617ccd5041e9a423da2a45b087213885cdbdda9b243d28dba242d3d9c67674b
|
|
| MD5 |
dfd63edc94bcc6b95afc58bd430c0a33
|
|
| BLAKE2b-256 |
c6ac98ef61d036d73d9f37198734bf23a063b64dc72011f888020062838748b9
|
Provenance
The following attestation bundles were made for evi_assistant-0.24.0-py3-none-any.whl:
Publisher:
release.yml on dmang-dev/evi-ai
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
evi_assistant-0.24.0-py3-none-any.whl -
Subject digest:
4617ccd5041e9a423da2a45b087213885cdbdda9b243d28dba242d3d9c67674b - Sigstore transparency entry: 1744396914
- Sigstore integration time:
-
Permalink:
dmang-dev/evi-ai@d1808756c0f0290788a867746491d9c4e6b38669 -
Branch / Tag:
refs/tags/v0.24.0 - Owner: https://github.com/dmang-dev
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d1808756c0f0290788a867746491d9c4e6b38669 -
Trigger Event:
push
-
Statement type: