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.
Files changed (149) hide show
  1. evi_assistant-0.24.0/LICENSE +21 -0
  2. evi_assistant-0.24.0/PKG-INFO +302 -0
  3. evi_assistant-0.24.0/README.md +195 -0
  4. evi_assistant-0.24.0/evi/__init__.py +3 -0
  5. evi_assistant-0.24.0/evi/__main__.py +11 -0
  6. evi_assistant-0.24.0/evi/apps/__init__.py +0 -0
  7. evi_assistant-0.24.0/evi/apps/cli/__init__.py +0 -0
  8. evi_assistant-0.24.0/evi/apps/cli/main.py +3386 -0
  9. evi_assistant-0.24.0/evi/apps/web/__init__.py +0 -0
  10. evi_assistant-0.24.0/evi/apps/web/server.py +1054 -0
  11. evi_assistant-0.24.0/evi/apps/web/static/index.html +1727 -0
  12. evi_assistant-0.24.0/evi/apps/web/static/manifest.json +18 -0
  13. evi_assistant-0.24.0/evi/audio_input.py +113 -0
  14. evi_assistant-0.24.0/evi/backends/__init__.py +34 -0
  15. evi_assistant-0.24.0/evi/backends/base.py +125 -0
  16. evi_assistant-0.24.0/evi/backends/factory.py +45 -0
  17. evi_assistant-0.24.0/evi/backends/llamacpp.py +75 -0
  18. evi_assistant-0.24.0/evi/backends/lmstudio.py +34 -0
  19. evi_assistant-0.24.0/evi/backends/ollama.py +135 -0
  20. evi_assistant-0.24.0/evi/backends/openai_compat.py +34 -0
  21. evi_assistant-0.24.0/evi/backup.py +181 -0
  22. evi_assistant-0.24.0/evi/calendar.py +472 -0
  23. evi_assistant-0.24.0/evi/citations.py +71 -0
  24. evi_assistant-0.24.0/evi/commands.py +87 -0
  25. evi_assistant-0.24.0/evi/config.py +313 -0
  26. evi_assistant-0.24.0/evi/debug.py +57 -0
  27. evi_assistant-0.24.0/evi/doctor.py +186 -0
  28. evi_assistant-0.24.0/evi/downloads.py +87 -0
  29. evi_assistant-0.24.0/evi/dream.py +196 -0
  30. evi_assistant-0.24.0/evi/embeddings.py +34 -0
  31. evi_assistant-0.24.0/evi/firstrun.py +165 -0
  32. evi_assistant-0.24.0/evi/guardrails.py +145 -0
  33. evi_assistant-0.24.0/evi/hardware.py +168 -0
  34. evi_assistant-0.24.0/evi/hooks.py +224 -0
  35. evi_assistant-0.24.0/evi/index.py +280 -0
  36. evi_assistant-0.24.0/evi/llm/__init__.py +0 -0
  37. evi_assistant-0.24.0/evi/llm/agent.py +1319 -0
  38. evi_assistant-0.24.0/evi/llm/client.py +24 -0
  39. evi_assistant-0.24.0/evi/llm/responses.py +189 -0
  40. evi_assistant-0.24.0/evi/llm/subagent.py +97 -0
  41. evi_assistant-0.24.0/evi/mcp/__init__.py +21 -0
  42. evi_assistant-0.24.0/evi/mcp/bridge.py +83 -0
  43. evi_assistant-0.24.0/evi/mcp/manager.py +189 -0
  44. evi_assistant-0.24.0/evi/mcp/publish.py +288 -0
  45. evi_assistant-0.24.0/evi/mcp/servers.py +88 -0
  46. evi_assistant-0.24.0/evi/memory.py +178 -0
  47. evi_assistant-0.24.0/evi/obsidian.py +309 -0
  48. evi_assistant-0.24.0/evi/portprobe.py +133 -0
  49. evi_assistant-0.24.0/evi/profiles.py +83 -0
  50. evi_assistant-0.24.0/evi/project.py +70 -0
  51. evi_assistant-0.24.0/evi/py.typed +0 -0
  52. evi_assistant-0.24.0/evi/recommend.py +277 -0
  53. evi_assistant-0.24.0/evi/repl_input.py +265 -0
  54. evi_assistant-0.24.0/evi/reporting.py +182 -0
  55. evi_assistant-0.24.0/evi/review.py +121 -0
  56. evi_assistant-0.24.0/evi/routing.py +244 -0
  57. evi_assistant-0.24.0/evi/scheduled.py +135 -0
  58. evi_assistant-0.24.0/evi/scheduler.py +207 -0
  59. evi_assistant-0.24.0/evi/search.py +173 -0
  60. evi_assistant-0.24.0/evi/sessions.py +308 -0
  61. evi_assistant-0.24.0/evi/skills.py +137 -0
  62. evi_assistant-0.24.0/evi/tools/__init__.py +7 -0
  63. evi_assistant-0.24.0/evi/tools/base.py +154 -0
  64. evi_assistant-0.24.0/evi/tools/calendar.py +132 -0
  65. evi_assistant-0.24.0/evi/tools/code.py +46 -0
  66. evi_assistant-0.24.0/evi/tools/computer.py +159 -0
  67. evi_assistant-0.24.0/evi/tools/fs.py +97 -0
  68. evi_assistant-0.24.0/evi/tools/git.py +178 -0
  69. evi_assistant-0.24.0/evi/tools/image_comfy.py +217 -0
  70. evi_assistant-0.24.0/evi/tools/index.py +110 -0
  71. evi_assistant-0.24.0/evi/tools/memory.py +62 -0
  72. evi_assistant-0.24.0/evi/tools/ocr.py +142 -0
  73. evi_assistant-0.24.0/evi/tools/pdf.py +97 -0
  74. evi_assistant-0.24.0/evi/tools/rerank.py +141 -0
  75. evi_assistant-0.24.0/evi/tools/skills.py +39 -0
  76. evi_assistant-0.24.0/evi/tools/sqlite.py +140 -0
  77. evi_assistant-0.24.0/evi/tools/subagent.py +46 -0
  78. evi_assistant-0.24.0/evi/tools/voice.py +40 -0
  79. evi_assistant-0.24.0/evi/tools/websearch.py +135 -0
  80. evi_assistant-0.24.0/evi/transcripts.py +140 -0
  81. evi_assistant-0.24.0/evi/update.py +505 -0
  82. evi_assistant-0.24.0/evi/vision.py +101 -0
  83. evi_assistant-0.24.0/evi/voice.py +562 -0
  84. evi_assistant-0.24.0/evi/worktree.py +152 -0
  85. evi_assistant-0.24.0/evi_assistant.egg-info/PKG-INFO +302 -0
  86. evi_assistant-0.24.0/evi_assistant.egg-info/SOURCES.txt +147 -0
  87. evi_assistant-0.24.0/evi_assistant.egg-info/dependency_links.txt +1 -0
  88. evi_assistant-0.24.0/evi_assistant.egg-info/entry_points.txt +2 -0
  89. evi_assistant-0.24.0/evi_assistant.egg-info/requires.txt +71 -0
  90. evi_assistant-0.24.0/evi_assistant.egg-info/top_level.txt +1 -0
  91. evi_assistant-0.24.0/pyproject.toml +143 -0
  92. evi_assistant-0.24.0/setup.cfg +4 -0
  93. evi_assistant-0.24.0/tests/test_agent.py +623 -0
  94. evi_assistant-0.24.0/tests/test_autospeaker.py +123 -0
  95. evi_assistant-0.24.0/tests/test_backend_status.py +199 -0
  96. evi_assistant-0.24.0/tests/test_backends.py +262 -0
  97. evi_assistant-0.24.0/tests/test_backup.py +112 -0
  98. evi_assistant-0.24.0/tests/test_calendar.py +332 -0
  99. evi_assistant-0.24.0/tests/test_citations.py +211 -0
  100. evi_assistant-0.24.0/tests/test_commands.py +47 -0
  101. evi_assistant-0.24.0/tests/test_debug.py +68 -0
  102. evi_assistant-0.24.0/tests/test_downloads.py +138 -0
  103. evi_assistant-0.24.0/tests/test_dream.py +118 -0
  104. evi_assistant-0.24.0/tests/test_evi_tools.py +96 -0
  105. evi_assistant-0.24.0/tests/test_export.py +89 -0
  106. evi_assistant-0.24.0/tests/test_firstrun.py +161 -0
  107. evi_assistant-0.24.0/tests/test_git_tools.py +90 -0
  108. evi_assistant-0.24.0/tests/test_history_ops.py +235 -0
  109. evi_assistant-0.24.0/tests/test_hooks.py +168 -0
  110. evi_assistant-0.24.0/tests/test_image_comfy.py +143 -0
  111. evi_assistant-0.24.0/tests/test_index.py +129 -0
  112. evi_assistant-0.24.0/tests/test_mcp.py +257 -0
  113. evi_assistant-0.24.0/tests/test_mcp_publish.py +183 -0
  114. evi_assistant-0.24.0/tests/test_memory.py +125 -0
  115. evi_assistant-0.24.0/tests/test_obsidian.py +189 -0
  116. evi_assistant-0.24.0/tests/test_ocr.py +162 -0
  117. evi_assistant-0.24.0/tests/test_openai_features.py +211 -0
  118. evi_assistant-0.24.0/tests/test_phase37.py +316 -0
  119. evi_assistant-0.24.0/tests/test_picker.py +226 -0
  120. evi_assistant-0.24.0/tests/test_portprobe.py +103 -0
  121. evi_assistant-0.24.0/tests/test_prediction.py +253 -0
  122. evi_assistant-0.24.0/tests/test_profiles.py +123 -0
  123. evi_assistant-0.24.0/tests/test_project.py +52 -0
  124. evi_assistant-0.24.0/tests/test_qol.py +314 -0
  125. evi_assistant-0.24.0/tests/test_recommend.py +127 -0
  126. evi_assistant-0.24.0/tests/test_repl_input.py +180 -0
  127. evi_assistant-0.24.0/tests/test_reporting.py +159 -0
  128. evi_assistant-0.24.0/tests/test_rerank.py +166 -0
  129. evi_assistant-0.24.0/tests/test_responses_api.py +140 -0
  130. evi_assistant-0.24.0/tests/test_review.py +207 -0
  131. evi_assistant-0.24.0/tests/test_routing.py +235 -0
  132. evi_assistant-0.24.0/tests/test_scheduled.py +172 -0
  133. evi_assistant-0.24.0/tests/test_sdk_params.py +244 -0
  134. evi_assistant-0.24.0/tests/test_search.py +192 -0
  135. evi_assistant-0.24.0/tests/test_sessions.py +95 -0
  136. evi_assistant-0.24.0/tests/test_skills.py +117 -0
  137. evi_assistant-0.24.0/tests/test_sqlite_tool.py +114 -0
  138. evi_assistant-0.24.0/tests/test_subagent.py +82 -0
  139. evi_assistant-0.24.0/tests/test_tail.py +70 -0
  140. evi_assistant-0.24.0/tests/test_think_parser.py +68 -0
  141. evi_assistant-0.24.0/tests/test_tools.py +64 -0
  142. evi_assistant-0.24.0/tests/test_transcripts.py +86 -0
  143. evi_assistant-0.24.0/tests/test_update.py +415 -0
  144. evi_assistant-0.24.0/tests/test_vision.py +57 -0
  145. evi_assistant-0.24.0/tests/test_voice.py +146 -0
  146. evi_assistant-0.24.0/tests/test_web.py +344 -0
  147. evi_assistant-0.24.0/tests/test_web_auth.py +193 -0
  148. evi_assistant-0.24.0/tests/test_websearch.py +108 -0
  149. 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,3 @@
1
+ """Evi — local-first personal AI assistant core library."""
2
+
3
+ __version__ = "0.24.0"
@@ -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