evi-assistant 0.24.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- evi_assistant-0.24.0/LICENSE +21 -0
- evi_assistant-0.24.0/PKG-INFO +302 -0
- evi_assistant-0.24.0/README.md +195 -0
- evi_assistant-0.24.0/evi/__init__.py +3 -0
- evi_assistant-0.24.0/evi/__main__.py +11 -0
- evi_assistant-0.24.0/evi/apps/__init__.py +0 -0
- evi_assistant-0.24.0/evi/apps/cli/__init__.py +0 -0
- evi_assistant-0.24.0/evi/apps/cli/main.py +3386 -0
- evi_assistant-0.24.0/evi/apps/web/__init__.py +0 -0
- evi_assistant-0.24.0/evi/apps/web/server.py +1054 -0
- evi_assistant-0.24.0/evi/apps/web/static/index.html +1727 -0
- evi_assistant-0.24.0/evi/apps/web/static/manifest.json +18 -0
- evi_assistant-0.24.0/evi/audio_input.py +113 -0
- evi_assistant-0.24.0/evi/backends/__init__.py +34 -0
- evi_assistant-0.24.0/evi/backends/base.py +125 -0
- evi_assistant-0.24.0/evi/backends/factory.py +45 -0
- evi_assistant-0.24.0/evi/backends/llamacpp.py +75 -0
- evi_assistant-0.24.0/evi/backends/lmstudio.py +34 -0
- evi_assistant-0.24.0/evi/backends/ollama.py +135 -0
- evi_assistant-0.24.0/evi/backends/openai_compat.py +34 -0
- evi_assistant-0.24.0/evi/backup.py +181 -0
- evi_assistant-0.24.0/evi/calendar.py +472 -0
- evi_assistant-0.24.0/evi/citations.py +71 -0
- evi_assistant-0.24.0/evi/commands.py +87 -0
- evi_assistant-0.24.0/evi/config.py +313 -0
- evi_assistant-0.24.0/evi/debug.py +57 -0
- evi_assistant-0.24.0/evi/doctor.py +186 -0
- evi_assistant-0.24.0/evi/downloads.py +87 -0
- evi_assistant-0.24.0/evi/dream.py +196 -0
- evi_assistant-0.24.0/evi/embeddings.py +34 -0
- evi_assistant-0.24.0/evi/firstrun.py +165 -0
- evi_assistant-0.24.0/evi/guardrails.py +145 -0
- evi_assistant-0.24.0/evi/hardware.py +168 -0
- evi_assistant-0.24.0/evi/hooks.py +224 -0
- evi_assistant-0.24.0/evi/index.py +280 -0
- evi_assistant-0.24.0/evi/llm/__init__.py +0 -0
- evi_assistant-0.24.0/evi/llm/agent.py +1319 -0
- evi_assistant-0.24.0/evi/llm/client.py +24 -0
- evi_assistant-0.24.0/evi/llm/responses.py +189 -0
- evi_assistant-0.24.0/evi/llm/subagent.py +97 -0
- evi_assistant-0.24.0/evi/mcp/__init__.py +21 -0
- evi_assistant-0.24.0/evi/mcp/bridge.py +83 -0
- evi_assistant-0.24.0/evi/mcp/manager.py +189 -0
- evi_assistant-0.24.0/evi/mcp/publish.py +288 -0
- evi_assistant-0.24.0/evi/mcp/servers.py +88 -0
- evi_assistant-0.24.0/evi/memory.py +178 -0
- evi_assistant-0.24.0/evi/obsidian.py +309 -0
- evi_assistant-0.24.0/evi/portprobe.py +133 -0
- evi_assistant-0.24.0/evi/profiles.py +83 -0
- evi_assistant-0.24.0/evi/project.py +70 -0
- evi_assistant-0.24.0/evi/py.typed +0 -0
- evi_assistant-0.24.0/evi/recommend.py +277 -0
- evi_assistant-0.24.0/evi/repl_input.py +265 -0
- evi_assistant-0.24.0/evi/reporting.py +182 -0
- evi_assistant-0.24.0/evi/review.py +121 -0
- evi_assistant-0.24.0/evi/routing.py +244 -0
- evi_assistant-0.24.0/evi/scheduled.py +135 -0
- evi_assistant-0.24.0/evi/scheduler.py +207 -0
- evi_assistant-0.24.0/evi/search.py +173 -0
- evi_assistant-0.24.0/evi/sessions.py +308 -0
- evi_assistant-0.24.0/evi/skills.py +137 -0
- evi_assistant-0.24.0/evi/tools/__init__.py +7 -0
- evi_assistant-0.24.0/evi/tools/base.py +154 -0
- evi_assistant-0.24.0/evi/tools/calendar.py +132 -0
- evi_assistant-0.24.0/evi/tools/code.py +46 -0
- evi_assistant-0.24.0/evi/tools/computer.py +159 -0
- evi_assistant-0.24.0/evi/tools/fs.py +97 -0
- evi_assistant-0.24.0/evi/tools/git.py +178 -0
- evi_assistant-0.24.0/evi/tools/image_comfy.py +217 -0
- evi_assistant-0.24.0/evi/tools/index.py +110 -0
- evi_assistant-0.24.0/evi/tools/memory.py +62 -0
- evi_assistant-0.24.0/evi/tools/ocr.py +142 -0
- evi_assistant-0.24.0/evi/tools/pdf.py +97 -0
- evi_assistant-0.24.0/evi/tools/rerank.py +141 -0
- evi_assistant-0.24.0/evi/tools/skills.py +39 -0
- evi_assistant-0.24.0/evi/tools/sqlite.py +140 -0
- evi_assistant-0.24.0/evi/tools/subagent.py +46 -0
- evi_assistant-0.24.0/evi/tools/voice.py +40 -0
- evi_assistant-0.24.0/evi/tools/websearch.py +135 -0
- evi_assistant-0.24.0/evi/transcripts.py +140 -0
- evi_assistant-0.24.0/evi/update.py +505 -0
- evi_assistant-0.24.0/evi/vision.py +101 -0
- evi_assistant-0.24.0/evi/voice.py +562 -0
- evi_assistant-0.24.0/evi/worktree.py +152 -0
- evi_assistant-0.24.0/evi_assistant.egg-info/PKG-INFO +302 -0
- evi_assistant-0.24.0/evi_assistant.egg-info/SOURCES.txt +147 -0
- evi_assistant-0.24.0/evi_assistant.egg-info/dependency_links.txt +1 -0
- evi_assistant-0.24.0/evi_assistant.egg-info/entry_points.txt +2 -0
- evi_assistant-0.24.0/evi_assistant.egg-info/requires.txt +71 -0
- evi_assistant-0.24.0/evi_assistant.egg-info/top_level.txt +1 -0
- evi_assistant-0.24.0/pyproject.toml +143 -0
- evi_assistant-0.24.0/setup.cfg +4 -0
- evi_assistant-0.24.0/tests/test_agent.py +623 -0
- evi_assistant-0.24.0/tests/test_autospeaker.py +123 -0
- evi_assistant-0.24.0/tests/test_backend_status.py +199 -0
- evi_assistant-0.24.0/tests/test_backends.py +262 -0
- evi_assistant-0.24.0/tests/test_backup.py +112 -0
- evi_assistant-0.24.0/tests/test_calendar.py +332 -0
- evi_assistant-0.24.0/tests/test_citations.py +211 -0
- evi_assistant-0.24.0/tests/test_commands.py +47 -0
- evi_assistant-0.24.0/tests/test_debug.py +68 -0
- evi_assistant-0.24.0/tests/test_downloads.py +138 -0
- evi_assistant-0.24.0/tests/test_dream.py +118 -0
- evi_assistant-0.24.0/tests/test_evi_tools.py +96 -0
- evi_assistant-0.24.0/tests/test_export.py +89 -0
- evi_assistant-0.24.0/tests/test_firstrun.py +161 -0
- evi_assistant-0.24.0/tests/test_git_tools.py +90 -0
- evi_assistant-0.24.0/tests/test_history_ops.py +235 -0
- evi_assistant-0.24.0/tests/test_hooks.py +168 -0
- evi_assistant-0.24.0/tests/test_image_comfy.py +143 -0
- evi_assistant-0.24.0/tests/test_index.py +129 -0
- evi_assistant-0.24.0/tests/test_mcp.py +257 -0
- evi_assistant-0.24.0/tests/test_mcp_publish.py +183 -0
- evi_assistant-0.24.0/tests/test_memory.py +125 -0
- evi_assistant-0.24.0/tests/test_obsidian.py +189 -0
- evi_assistant-0.24.0/tests/test_ocr.py +162 -0
- evi_assistant-0.24.0/tests/test_openai_features.py +211 -0
- evi_assistant-0.24.0/tests/test_phase37.py +316 -0
- evi_assistant-0.24.0/tests/test_picker.py +226 -0
- evi_assistant-0.24.0/tests/test_portprobe.py +103 -0
- evi_assistant-0.24.0/tests/test_prediction.py +253 -0
- evi_assistant-0.24.0/tests/test_profiles.py +123 -0
- evi_assistant-0.24.0/tests/test_project.py +52 -0
- evi_assistant-0.24.0/tests/test_qol.py +314 -0
- evi_assistant-0.24.0/tests/test_recommend.py +127 -0
- evi_assistant-0.24.0/tests/test_repl_input.py +180 -0
- evi_assistant-0.24.0/tests/test_reporting.py +159 -0
- evi_assistant-0.24.0/tests/test_rerank.py +166 -0
- evi_assistant-0.24.0/tests/test_responses_api.py +140 -0
- evi_assistant-0.24.0/tests/test_review.py +207 -0
- evi_assistant-0.24.0/tests/test_routing.py +235 -0
- evi_assistant-0.24.0/tests/test_scheduled.py +172 -0
- evi_assistant-0.24.0/tests/test_sdk_params.py +244 -0
- evi_assistant-0.24.0/tests/test_search.py +192 -0
- evi_assistant-0.24.0/tests/test_sessions.py +95 -0
- evi_assistant-0.24.0/tests/test_skills.py +117 -0
- evi_assistant-0.24.0/tests/test_sqlite_tool.py +114 -0
- evi_assistant-0.24.0/tests/test_subagent.py +82 -0
- evi_assistant-0.24.0/tests/test_tail.py +70 -0
- evi_assistant-0.24.0/tests/test_think_parser.py +68 -0
- evi_assistant-0.24.0/tests/test_tools.py +64 -0
- evi_assistant-0.24.0/tests/test_transcripts.py +86 -0
- evi_assistant-0.24.0/tests/test_update.py +415 -0
- evi_assistant-0.24.0/tests/test_vision.py +57 -0
- evi_assistant-0.24.0/tests/test_voice.py +146 -0
- evi_assistant-0.24.0/tests/test_web.py +344 -0
- evi_assistant-0.24.0/tests/test_web_auth.py +193 -0
- evi_assistant-0.24.0/tests/test_websearch.py +108 -0
- evi_assistant-0.24.0/tests/test_worktree.py +81 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Evi contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: evi-assistant
|
|
3
|
+
Version: 0.24.0
|
|
4
|
+
Summary: Local-first personal AI assistant — CLI, web, and desktop frontends over a shared agent core.
|
|
5
|
+
License: MIT License
|
|
6
|
+
|
|
7
|
+
Copyright (c) 2026 Evi contributors
|
|
8
|
+
|
|
9
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
10
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
11
|
+
in the Software without restriction, including without limitation the rights
|
|
12
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
13
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
14
|
+
furnished to do so, subject to the following conditions:
|
|
15
|
+
|
|
16
|
+
The above copyright notice and this permission notice shall be included in
|
|
17
|
+
all copies or substantial portions of the Software.
|
|
18
|
+
|
|
19
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
20
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
21
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
22
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
23
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
24
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
25
|
+
THE SOFTWARE.
|
|
26
|
+
|
|
27
|
+
Project-URL: Homepage, https://github.com/your-user/evi
|
|
28
|
+
Project-URL: Source, https://github.com/your-user/evi
|
|
29
|
+
Project-URL: Changelog, https://github.com/your-user/evi/blob/main/CHANGELOG.md
|
|
30
|
+
Project-URL: Issues, https://github.com/your-user/evi/issues
|
|
31
|
+
Project-URL: Documentation, https://github.com/your-user/evi/tree/main/docs
|
|
32
|
+
Keywords: ai,assistant,llm,agent,local,ollama,lm-studio
|
|
33
|
+
Classifier: Development Status :: 4 - Beta
|
|
34
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
35
|
+
Classifier: Intended Audience :: Developers
|
|
36
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
37
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
38
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
39
|
+
Classifier: Operating System :: MacOS
|
|
40
|
+
Classifier: Programming Language :: Python :: 3
|
|
41
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
42
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
43
|
+
Classifier: Topic :: Communications :: Chat
|
|
44
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
45
|
+
Classifier: Topic :: Utilities
|
|
46
|
+
Classifier: Typing :: Typed
|
|
47
|
+
Classifier: Environment :: Console
|
|
48
|
+
Classifier: Environment :: Web Environment
|
|
49
|
+
Requires-Python: >=3.11
|
|
50
|
+
Description-Content-Type: text/markdown
|
|
51
|
+
License-File: LICENSE
|
|
52
|
+
Requires-Dist: openai>=1.40.0
|
|
53
|
+
Requires-Dist: httpx>=0.27.0
|
|
54
|
+
Requires-Dist: pydantic>=2.7
|
|
55
|
+
Requires-Dist: typer>=0.12
|
|
56
|
+
Requires-Dist: rich>=13.7
|
|
57
|
+
Requires-Dist: prompt_toolkit>=3.0
|
|
58
|
+
Requires-Dist: python-dotenv>=1.0
|
|
59
|
+
Requires-Dist: psutil>=5.9
|
|
60
|
+
Requires-Dist: tomli; python_version < "3.11"
|
|
61
|
+
Provides-Extra: email
|
|
62
|
+
Requires-Dist: google-auth-oauthlib>=1.2; extra == "email"
|
|
63
|
+
Requires-Dist: google-api-python-client>=2.130; extra == "email"
|
|
64
|
+
Requires-Dist: msal>=1.28; extra == "email"
|
|
65
|
+
Provides-Extra: web
|
|
66
|
+
Requires-Dist: fastapi>=0.110; extra == "web"
|
|
67
|
+
Requires-Dist: uvicorn[standard]>=0.29; extra == "web"
|
|
68
|
+
Requires-Dist: sse-starlette>=2.1; extra == "web"
|
|
69
|
+
Requires-Dist: httpx>=0.27.0; extra == "web"
|
|
70
|
+
Requires-Dist: python-multipart>=0.0.9; extra == "web"
|
|
71
|
+
Provides-Extra: mcp
|
|
72
|
+
Requires-Dist: mcp>=1.0; extra == "mcp"
|
|
73
|
+
Provides-Extra: scheduler
|
|
74
|
+
Requires-Dist: apscheduler>=3.10; extra == "scheduler"
|
|
75
|
+
Provides-Extra: downloads
|
|
76
|
+
Requires-Dist: huggingface_hub>=0.24; extra == "downloads"
|
|
77
|
+
Provides-Extra: web-tools
|
|
78
|
+
Requires-Dist: duckduckgo_search>=6.0; extra == "web-tools"
|
|
79
|
+
Requires-Dist: beautifulsoup4>=4.12; extra == "web-tools"
|
|
80
|
+
Provides-Extra: computer
|
|
81
|
+
Requires-Dist: pyautogui>=0.9.54; extra == "computer"
|
|
82
|
+
Requires-Dist: pillow>=10.0; extra == "computer"
|
|
83
|
+
Provides-Extra: stt
|
|
84
|
+
Requires-Dist: faster-whisper>=1.0; extra == "stt"
|
|
85
|
+
Requires-Dist: sounddevice>=0.4.6; extra == "stt"
|
|
86
|
+
Requires-Dist: numpy>=1.26; extra == "stt"
|
|
87
|
+
Provides-Extra: pdf
|
|
88
|
+
Requires-Dist: PyMuPDF>=1.24; extra == "pdf"
|
|
89
|
+
Provides-Extra: index
|
|
90
|
+
Requires-Dist: numpy>=1.26; extra == "index"
|
|
91
|
+
Provides-Extra: calendar
|
|
92
|
+
Requires-Dist: icalendar>=5.0; extra == "calendar"
|
|
93
|
+
Requires-Dist: recurring-ical-events>=2.1; extra == "calendar"
|
|
94
|
+
Requires-Dist: caldav>=1.3; extra == "calendar"
|
|
95
|
+
Provides-Extra: rerank
|
|
96
|
+
Requires-Dist: sentence-transformers>=3.0; extra == "rerank"
|
|
97
|
+
Provides-Extra: telemetry
|
|
98
|
+
Requires-Dist: sentry-sdk>=2.0; extra == "telemetry"
|
|
99
|
+
Provides-Extra: build-desktop
|
|
100
|
+
Requires-Dist: pyinstaller>=6.0; extra == "build-desktop"
|
|
101
|
+
Provides-Extra: dev
|
|
102
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
103
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
|
|
104
|
+
Requires-Dist: pytest-timeout>=2.3; extra == "dev"
|
|
105
|
+
Requires-Dist: ruff>=0.4; extra == "dev"
|
|
106
|
+
Dynamic: license-file
|
|
107
|
+
|
|
108
|
+
# Evi — personal AI assistant
|
|
109
|
+
|
|
110
|
+
Local-first personal assistant. Chat with a model on **your** hardware,
|
|
111
|
+
let it use tools, generate images, automate scheduled tasks, drive your
|
|
112
|
+
browser, and reach the same core from a terminal, a web app, or a
|
|
113
|
+
native desktop window.
|
|
114
|
+
|
|
115
|
+
> One Python core, three frontends, no cloud round-trips.
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
┌──────────────────────────────┐
|
|
119
|
+
│ evi (core library) │
|
|
120
|
+
│ Agent · Tools · Memory · │
|
|
121
|
+
│ Skills · Hooks · MCP · │
|
|
122
|
+
│ Scheduler · Dream · … │
|
|
123
|
+
└────┬──────────┬──────────┬───┘
|
|
124
|
+
│ │ │
|
|
125
|
+
┌───▼──┐ ┌───▼──┐ ┌───▼────┐
|
|
126
|
+
│ CLI │ │ Web │ │Desktop │
|
|
127
|
+
│ │ │ SSE │ │ Tauri │
|
|
128
|
+
└──────┘ └──────┘ └────────┘
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Requirements
|
|
132
|
+
|
|
133
|
+
| Component | Why | Notes |
|
|
134
|
+
|-----------------|----------------------------------|------------------------|
|
|
135
|
+
| **Python 3.11+** | Core runtime | 3.12 tested |
|
|
136
|
+
| **Git 2.17+** | Optional — `evi worktree` | 2.28+ for `init -b` |
|
|
137
|
+
| **An LLM backend** | One of LM Studio / Ollama / llama-server / any OpenAI-compatible endpoint | LM Studio default |
|
|
138
|
+
| **NVIDIA GPU** | Optional — speeds up local LLMs and ComfyUI image gen | CPU fallback works |
|
|
139
|
+
|
|
140
|
+
## Quickstart
|
|
141
|
+
|
|
142
|
+
> **Package name:** the project is **Evi**, but the PyPI distribution is
|
|
143
|
+
> **`evi-assistant`** (the bare `evi` name was taken). Once published you'll
|
|
144
|
+
> `pip install evi-assistant`; the import package and CLI command are both still
|
|
145
|
+
> `evi` (`import evi`, run `evi`). The steps below use an editable install
|
|
146
|
+
> from a clone, which doesn't depend on the published name.
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
git clone <repo> evi && cd evi
|
|
150
|
+
python -m venv .venv
|
|
151
|
+
.venv\Scripts\Activate.ps1 # Windows
|
|
152
|
+
# source .venv/bin/activate # Linux / macOS
|
|
153
|
+
|
|
154
|
+
pip install -e .
|
|
155
|
+
|
|
156
|
+
# Pick a backend. LM Studio + a tool-capable model is the easiest first run.
|
|
157
|
+
# In LM Studio: load qwen2.5-7b-instruct → Developer → Start Server.
|
|
158
|
+
|
|
159
|
+
evi models recommend # honest read on what'll fit
|
|
160
|
+
evi chat # off you go
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
`/help` inside the REPL lists every slash command (goal tracking, plan
|
|
164
|
+
mode, auto-approve, model switching, user-defined templates).
|
|
165
|
+
|
|
166
|
+
## Three-machine setup
|
|
167
|
+
|
|
168
|
+
Evi is built to span machines. A typical setup:
|
|
169
|
+
|
|
170
|
+
| Machine | Role | Backend |
|
|
171
|
+
|------------------|---------------------|-------------------|
|
|
172
|
+
| AI server (P40) | LLM host + web UI | Ollama or llama-server, `evi web` on port 8000 |
|
|
173
|
+
| Desktop (16 GB) | Full power workstation | Local LM Studio |
|
|
174
|
+
| Laptop (2 GB) | Thin client | Profile points at the AI server |
|
|
175
|
+
|
|
176
|
+
See [docs/multi-machine.md](docs/multi-machine.md) for the wiring.
|
|
177
|
+
|
|
178
|
+
## Major commands
|
|
179
|
+
|
|
180
|
+
```text
|
|
181
|
+
evi chat Start the REPL
|
|
182
|
+
evi web --host 0.0.0.0 Run the FastAPI + SSE web UI
|
|
183
|
+
evi dream Curate long-term memory from yesterday's chats
|
|
184
|
+
evi models recommend / list / use Hardware-aware model selection
|
|
185
|
+
evi models pull <ref> Pull via Ollama tag or hf:<repo>:<file>
|
|
186
|
+
evi schedule add / list / run-now Cron-style scheduled prompts
|
|
187
|
+
evi scheduler Foreground daemon for scheduled tasks
|
|
188
|
+
evi worktree create <branch> Spin up a git worktree for parallel work
|
|
189
|
+
evi profile add home --backend … Per-machine config overlays
|
|
190
|
+
evi voice listen / speak STT + TTS
|
|
191
|
+
evi mcp list-tools Show MCP server-provided tools
|
|
192
|
+
evi mcp serve Run Evi AS an MCP server (other agents use Evi's tools)
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## What's built
|
|
196
|
+
|
|
197
|
+
| Phase | Feature | Status |
|
|
198
|
+
|-------|--------------------------------------------------|--------|
|
|
199
|
+
| 1 | Foundation, CLI, agent loop, fs/code tools | ✅ |
|
|
200
|
+
| 2 | Gmail / Microsoft 365 email | ⏸ deferred |
|
|
201
|
+
| 3 | ComfyUI image generation | ✅ |
|
|
202
|
+
| 4 | FastAPI + SSE web UI | ✅ |
|
|
203
|
+
| 5 | Tauri desktop shell (local + remote modes) | ✅ |
|
|
204
|
+
| 6 | Persistent memory + scoped subagents | ✅ |
|
|
205
|
+
| 7 | MCP (Model Context Protocol) integration | ✅ |
|
|
206
|
+
| 8 | Skills + scheduled tasks | ✅ |
|
|
207
|
+
| 9 | Backends, model registry, hardware recommender, profiles | ✅ |
|
|
208
|
+
| 10 | EVI.md, slash commands, /goal, plan mode | ✅ |
|
|
209
|
+
| 11 | Hooks, auto mode, git worktrees | ✅ |
|
|
210
|
+
| 12 | Transcripts, dreaming, web search, voice TTS, computer use | ✅ |
|
|
211
|
+
| 13 | STT, web UI parity, polish | ✅ |
|
|
212
|
+
|
|
213
|
+
## Layout
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
evi/ core library
|
|
217
|
+
agent.py agent loop with permission + hooks
|
|
218
|
+
backends/ LM Studio / Ollama / llama.cpp / OpenAI-compat
|
|
219
|
+
llm/ client + subagent runner
|
|
220
|
+
tools/ built-in tool catalog (fs, code, image, web, voice, …)
|
|
221
|
+
mcp/ MCP client bridge + manager
|
|
222
|
+
memory.py long-term memory store
|
|
223
|
+
skills.py user skill packets
|
|
224
|
+
scheduler.py APScheduler driver
|
|
225
|
+
dream.py memory-consolidation runner
|
|
226
|
+
hardware.py GPU + RAM detection
|
|
227
|
+
recommend.py curated model picks per VRAM
|
|
228
|
+
…
|
|
229
|
+
apps/ frontends that consume the core (shipped in the wheel)
|
|
230
|
+
cli/main.py Typer CLI
|
|
231
|
+
web/server.py FastAPI + SSE
|
|
232
|
+
web/static/ chat UI (vanilla JS)
|
|
233
|
+
desktop/ Tauri 2 shell (NOT a Python package; local-spawn or EVI_REMOTE_URL)
|
|
234
|
+
tests/ pytest
|
|
235
|
+
docs/ deeper guides
|
|
236
|
+
scripts/ install + dev helpers
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Configuration
|
|
240
|
+
|
|
241
|
+
Per-user config lives in `~/.evi/`. Highlights:
|
|
242
|
+
|
|
243
|
+
```
|
|
244
|
+
~/.evi/
|
|
245
|
+
config.toml primary settings — backend, tools, auto-approve
|
|
246
|
+
profiles/*.toml overlay profiles for per-machine config
|
|
247
|
+
memory/*.md long-term memory; `.attic/` holds soft-deleted entries
|
|
248
|
+
skills/<name>/ installed skill packets (SKILL.md + assets)
|
|
249
|
+
commands/<name>.md user-defined slash command templates
|
|
250
|
+
scheduled/*.json saved scheduled prompts
|
|
251
|
+
hooks.toml before/after_tool_call hooks
|
|
252
|
+
mcp.json MCP server list
|
|
253
|
+
transcripts/ per-session JSONL (input to dreaming)
|
|
254
|
+
logs/ run logs (dreams, scheduled tasks)
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
See [docs/configuration.md](docs/configuration.md) for the full reference.
|
|
258
|
+
|
|
259
|
+
## Optional dependency groups
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
pip install -e '.[web]' # FastAPI + uvicorn for `evi web`
|
|
263
|
+
pip install -e '.[mcp]' # Model Context Protocol client
|
|
264
|
+
pip install -e '.[scheduler]' # APScheduler for cron-style tasks
|
|
265
|
+
pip install -e '.[downloads]' # huggingface_hub for `evi models pull hf:...`
|
|
266
|
+
pip install -e '.[web-tools]' # DuckDuckGo search + BeautifulSoup
|
|
267
|
+
pip install -e '.[stt]' # faster-whisper + sounddevice
|
|
268
|
+
pip install -e '.[computer]' # pyautogui for mouse/keyboard control
|
|
269
|
+
pip install -e '.[dev]' # pytest + ruff
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Or all at once:
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
pip install -e '.[dev,web,mcp,scheduler,downloads,web-tools,stt,computer]'
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
## Development
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
pip install -e '.[dev]'
|
|
282
|
+
pytest -q # 183 tests, ~12 s
|
|
283
|
+
ruff check evi apps # style + bug-pattern lint
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
See [docs/development.md](docs/development.md) for architecture notes.
|
|
287
|
+
|
|
288
|
+
## Safety posture
|
|
289
|
+
|
|
290
|
+
- **Default tool toggles** lean conservative: `shell`, `subagent`, `web`,
|
|
291
|
+
`voice`, `computer`, `gmail`, `outlook`, `image`, and `mcp` are all OFF
|
|
292
|
+
until you flip them in `config.toml`.
|
|
293
|
+
- **`auto.auto_approve`** lists categories that run without prompting.
|
|
294
|
+
The defaults are `fs, code, memory, skills, image`. `computer` is never
|
|
295
|
+
in this list — every mouse click / keystroke prompts.
|
|
296
|
+
- **Hook vetoes** (`~/.evi/hooks.toml`) can block any tool by glob match.
|
|
297
|
+
- **Soft-delete memory** sends "forgotten" entries to `~/.evi/memory/.attic/`
|
|
298
|
+
so the dreaming engine can't permanently lose anything.
|
|
299
|
+
|
|
300
|
+
## License
|
|
301
|
+
|
|
302
|
+
MIT (or whatever you prefer — pick when publishing).
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# Evi — personal AI assistant
|
|
2
|
+
|
|
3
|
+
Local-first personal assistant. Chat with a model on **your** hardware,
|
|
4
|
+
let it use tools, generate images, automate scheduled tasks, drive your
|
|
5
|
+
browser, and reach the same core from a terminal, a web app, or a
|
|
6
|
+
native desktop window.
|
|
7
|
+
|
|
8
|
+
> One Python core, three frontends, no cloud round-trips.
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
┌──────────────────────────────┐
|
|
12
|
+
│ evi (core library) │
|
|
13
|
+
│ Agent · Tools · Memory · │
|
|
14
|
+
│ Skills · Hooks · MCP · │
|
|
15
|
+
│ Scheduler · Dream · … │
|
|
16
|
+
└────┬──────────┬──────────┬───┘
|
|
17
|
+
│ │ │
|
|
18
|
+
┌───▼──┐ ┌───▼──┐ ┌───▼────┐
|
|
19
|
+
│ CLI │ │ Web │ │Desktop │
|
|
20
|
+
│ │ │ SSE │ │ Tauri │
|
|
21
|
+
└──────┘ └──────┘ └────────┘
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Requirements
|
|
25
|
+
|
|
26
|
+
| Component | Why | Notes |
|
|
27
|
+
|-----------------|----------------------------------|------------------------|
|
|
28
|
+
| **Python 3.11+** | Core runtime | 3.12 tested |
|
|
29
|
+
| **Git 2.17+** | Optional — `evi worktree` | 2.28+ for `init -b` |
|
|
30
|
+
| **An LLM backend** | One of LM Studio / Ollama / llama-server / any OpenAI-compatible endpoint | LM Studio default |
|
|
31
|
+
| **NVIDIA GPU** | Optional — speeds up local LLMs and ComfyUI image gen | CPU fallback works |
|
|
32
|
+
|
|
33
|
+
## Quickstart
|
|
34
|
+
|
|
35
|
+
> **Package name:** the project is **Evi**, but the PyPI distribution is
|
|
36
|
+
> **`evi-assistant`** (the bare `evi` name was taken). Once published you'll
|
|
37
|
+
> `pip install evi-assistant`; the import package and CLI command are both still
|
|
38
|
+
> `evi` (`import evi`, run `evi`). The steps below use an editable install
|
|
39
|
+
> from a clone, which doesn't depend on the published name.
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
git clone <repo> evi && cd evi
|
|
43
|
+
python -m venv .venv
|
|
44
|
+
.venv\Scripts\Activate.ps1 # Windows
|
|
45
|
+
# source .venv/bin/activate # Linux / macOS
|
|
46
|
+
|
|
47
|
+
pip install -e .
|
|
48
|
+
|
|
49
|
+
# Pick a backend. LM Studio + a tool-capable model is the easiest first run.
|
|
50
|
+
# In LM Studio: load qwen2.5-7b-instruct → Developer → Start Server.
|
|
51
|
+
|
|
52
|
+
evi models recommend # honest read on what'll fit
|
|
53
|
+
evi chat # off you go
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
`/help` inside the REPL lists every slash command (goal tracking, plan
|
|
57
|
+
mode, auto-approve, model switching, user-defined templates).
|
|
58
|
+
|
|
59
|
+
## Three-machine setup
|
|
60
|
+
|
|
61
|
+
Evi is built to span machines. A typical setup:
|
|
62
|
+
|
|
63
|
+
| Machine | Role | Backend |
|
|
64
|
+
|------------------|---------------------|-------------------|
|
|
65
|
+
| AI server (P40) | LLM host + web UI | Ollama or llama-server, `evi web` on port 8000 |
|
|
66
|
+
| Desktop (16 GB) | Full power workstation | Local LM Studio |
|
|
67
|
+
| Laptop (2 GB) | Thin client | Profile points at the AI server |
|
|
68
|
+
|
|
69
|
+
See [docs/multi-machine.md](docs/multi-machine.md) for the wiring.
|
|
70
|
+
|
|
71
|
+
## Major commands
|
|
72
|
+
|
|
73
|
+
```text
|
|
74
|
+
evi chat Start the REPL
|
|
75
|
+
evi web --host 0.0.0.0 Run the FastAPI + SSE web UI
|
|
76
|
+
evi dream Curate long-term memory from yesterday's chats
|
|
77
|
+
evi models recommend / list / use Hardware-aware model selection
|
|
78
|
+
evi models pull <ref> Pull via Ollama tag or hf:<repo>:<file>
|
|
79
|
+
evi schedule add / list / run-now Cron-style scheduled prompts
|
|
80
|
+
evi scheduler Foreground daemon for scheduled tasks
|
|
81
|
+
evi worktree create <branch> Spin up a git worktree for parallel work
|
|
82
|
+
evi profile add home --backend … Per-machine config overlays
|
|
83
|
+
evi voice listen / speak STT + TTS
|
|
84
|
+
evi mcp list-tools Show MCP server-provided tools
|
|
85
|
+
evi mcp serve Run Evi AS an MCP server (other agents use Evi's tools)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## What's built
|
|
89
|
+
|
|
90
|
+
| Phase | Feature | Status |
|
|
91
|
+
|-------|--------------------------------------------------|--------|
|
|
92
|
+
| 1 | Foundation, CLI, agent loop, fs/code tools | ✅ |
|
|
93
|
+
| 2 | Gmail / Microsoft 365 email | ⏸ deferred |
|
|
94
|
+
| 3 | ComfyUI image generation | ✅ |
|
|
95
|
+
| 4 | FastAPI + SSE web UI | ✅ |
|
|
96
|
+
| 5 | Tauri desktop shell (local + remote modes) | ✅ |
|
|
97
|
+
| 6 | Persistent memory + scoped subagents | ✅ |
|
|
98
|
+
| 7 | MCP (Model Context Protocol) integration | ✅ |
|
|
99
|
+
| 8 | Skills + scheduled tasks | ✅ |
|
|
100
|
+
| 9 | Backends, model registry, hardware recommender, profiles | ✅ |
|
|
101
|
+
| 10 | EVI.md, slash commands, /goal, plan mode | ✅ |
|
|
102
|
+
| 11 | Hooks, auto mode, git worktrees | ✅ |
|
|
103
|
+
| 12 | Transcripts, dreaming, web search, voice TTS, computer use | ✅ |
|
|
104
|
+
| 13 | STT, web UI parity, polish | ✅ |
|
|
105
|
+
|
|
106
|
+
## Layout
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
evi/ core library
|
|
110
|
+
agent.py agent loop with permission + hooks
|
|
111
|
+
backends/ LM Studio / Ollama / llama.cpp / OpenAI-compat
|
|
112
|
+
llm/ client + subagent runner
|
|
113
|
+
tools/ built-in tool catalog (fs, code, image, web, voice, …)
|
|
114
|
+
mcp/ MCP client bridge + manager
|
|
115
|
+
memory.py long-term memory store
|
|
116
|
+
skills.py user skill packets
|
|
117
|
+
scheduler.py APScheduler driver
|
|
118
|
+
dream.py memory-consolidation runner
|
|
119
|
+
hardware.py GPU + RAM detection
|
|
120
|
+
recommend.py curated model picks per VRAM
|
|
121
|
+
…
|
|
122
|
+
apps/ frontends that consume the core (shipped in the wheel)
|
|
123
|
+
cli/main.py Typer CLI
|
|
124
|
+
web/server.py FastAPI + SSE
|
|
125
|
+
web/static/ chat UI (vanilla JS)
|
|
126
|
+
desktop/ Tauri 2 shell (NOT a Python package; local-spawn or EVI_REMOTE_URL)
|
|
127
|
+
tests/ pytest
|
|
128
|
+
docs/ deeper guides
|
|
129
|
+
scripts/ install + dev helpers
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Configuration
|
|
133
|
+
|
|
134
|
+
Per-user config lives in `~/.evi/`. Highlights:
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
~/.evi/
|
|
138
|
+
config.toml primary settings — backend, tools, auto-approve
|
|
139
|
+
profiles/*.toml overlay profiles for per-machine config
|
|
140
|
+
memory/*.md long-term memory; `.attic/` holds soft-deleted entries
|
|
141
|
+
skills/<name>/ installed skill packets (SKILL.md + assets)
|
|
142
|
+
commands/<name>.md user-defined slash command templates
|
|
143
|
+
scheduled/*.json saved scheduled prompts
|
|
144
|
+
hooks.toml before/after_tool_call hooks
|
|
145
|
+
mcp.json MCP server list
|
|
146
|
+
transcripts/ per-session JSONL (input to dreaming)
|
|
147
|
+
logs/ run logs (dreams, scheduled tasks)
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
See [docs/configuration.md](docs/configuration.md) for the full reference.
|
|
151
|
+
|
|
152
|
+
## Optional dependency groups
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
pip install -e '.[web]' # FastAPI + uvicorn for `evi web`
|
|
156
|
+
pip install -e '.[mcp]' # Model Context Protocol client
|
|
157
|
+
pip install -e '.[scheduler]' # APScheduler for cron-style tasks
|
|
158
|
+
pip install -e '.[downloads]' # huggingface_hub for `evi models pull hf:...`
|
|
159
|
+
pip install -e '.[web-tools]' # DuckDuckGo search + BeautifulSoup
|
|
160
|
+
pip install -e '.[stt]' # faster-whisper + sounddevice
|
|
161
|
+
pip install -e '.[computer]' # pyautogui for mouse/keyboard control
|
|
162
|
+
pip install -e '.[dev]' # pytest + ruff
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Or all at once:
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
pip install -e '.[dev,web,mcp,scheduler,downloads,web-tools,stt,computer]'
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Development
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
pip install -e '.[dev]'
|
|
175
|
+
pytest -q # 183 tests, ~12 s
|
|
176
|
+
ruff check evi apps # style + bug-pattern lint
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
See [docs/development.md](docs/development.md) for architecture notes.
|
|
180
|
+
|
|
181
|
+
## Safety posture
|
|
182
|
+
|
|
183
|
+
- **Default tool toggles** lean conservative: `shell`, `subagent`, `web`,
|
|
184
|
+
`voice`, `computer`, `gmail`, `outlook`, `image`, and `mcp` are all OFF
|
|
185
|
+
until you flip them in `config.toml`.
|
|
186
|
+
- **`auto.auto_approve`** lists categories that run without prompting.
|
|
187
|
+
The defaults are `fs, code, memory, skills, image`. `computer` is never
|
|
188
|
+
in this list — every mouse click / keystroke prompts.
|
|
189
|
+
- **Hook vetoes** (`~/.evi/hooks.toml`) can block any tool by glob match.
|
|
190
|
+
- **Soft-delete memory** sends "forgotten" entries to `~/.evi/memory/.attic/`
|
|
191
|
+
so the dreaming engine can't permanently lose anything.
|
|
192
|
+
|
|
193
|
+
## License
|
|
194
|
+
|
|
195
|
+
MIT (or whatever you prefer — pick when publishing).
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Run the Evi CLI as `python -m evi`.
|
|
2
|
+
|
|
3
|
+
Handy when the `evi` console script isn't on PATH — notably for MCP clients
|
|
4
|
+
(Claude Desktop / Cursor / Cline) that spawn Evi as a server subprocess by
|
|
5
|
+
interpreter path, e.g. `python -m evi mcp serve`.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from evi.apps.cli.main import app
|
|
9
|
+
|
|
10
|
+
if __name__ == "__main__":
|
|
11
|
+
app()
|
|
File without changes
|
|
File without changes
|