ezos 2.0.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.
- ezos-2.0.0/LICENSE +21 -0
- ezos-2.0.0/PKG-INFO +325 -0
- ezos-2.0.0/README.md +259 -0
- ezos-2.0.0/ezos.egg-info/PKG-INFO +325 -0
- ezos-2.0.0/ezos.egg-info/SOURCES.txt +9 -0
- ezos-2.0.0/ezos.egg-info/dependency_links.txt +1 -0
- ezos-2.0.0/ezos.egg-info/requires.txt +24 -0
- ezos-2.0.0/ezos.egg-info/top_level.txt +1 -0
- ezos-2.0.0/ezos.py +1881 -0
- ezos-2.0.0/pyproject.toml +44 -0
- ezos-2.0.0/setup.cfg +4 -0
ezos-2.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Bytovex
|
|
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 all
|
|
13
|
+
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 THE
|
|
21
|
+
SOFTWARE.
|
ezos-2.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ezos
|
|
3
|
+
Version: 2.0.0
|
|
4
|
+
Summary: Easy OS — control your Windows PC with one-line Python. Build your own Jarvis.
|
|
5
|
+
Author: Bytovex
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2026 Bytovex
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
|
27
|
+
|
|
28
|
+
Project-URL: Homepage, https://github.com/Bytovex/ezos
|
|
29
|
+
Project-URL: Repository, https://github.com/Bytovex/ezos
|
|
30
|
+
Keywords: automation,os,windows,jarvis,ai,assistant,voice,control
|
|
31
|
+
Classifier: Development Status :: 4 - Beta
|
|
32
|
+
Classifier: Intended Audience :: Developers
|
|
33
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
34
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
35
|
+
Classifier: Programming Language :: Python :: 3
|
|
36
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
37
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
38
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
39
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
40
|
+
Classifier: Topic :: System :: Operating System
|
|
41
|
+
Classifier: Topic :: Utilities
|
|
42
|
+
Requires-Python: >=3.9
|
|
43
|
+
Description-Content-Type: text/markdown
|
|
44
|
+
License-File: LICENSE
|
|
45
|
+
Provides-Extra: extras
|
|
46
|
+
Requires-Dist: psutil; extra == "extras"
|
|
47
|
+
Requires-Dist: pyautogui; extra == "extras"
|
|
48
|
+
Requires-Dist: Pillow; extra == "extras"
|
|
49
|
+
Requires-Dist: pyperclip; extra == "extras"
|
|
50
|
+
Provides-Extra: web
|
|
51
|
+
Requires-Dist: ddgs; extra == "web"
|
|
52
|
+
Requires-Dist: beautifulsoup4; extra == "web"
|
|
53
|
+
Provides-Extra: audio
|
|
54
|
+
Requires-Dist: pycaw; extra == "audio"
|
|
55
|
+
Requires-Dist: comtypes; extra == "audio"
|
|
56
|
+
Provides-Extra: all
|
|
57
|
+
Requires-Dist: psutil; extra == "all"
|
|
58
|
+
Requires-Dist: pyautogui; extra == "all"
|
|
59
|
+
Requires-Dist: Pillow; extra == "all"
|
|
60
|
+
Requires-Dist: pyperclip; extra == "all"
|
|
61
|
+
Requires-Dist: ddgs; extra == "all"
|
|
62
|
+
Requires-Dist: beautifulsoup4; extra == "all"
|
|
63
|
+
Requires-Dist: pycaw; extra == "all"
|
|
64
|
+
Requires-Dist: comtypes; extra == "all"
|
|
65
|
+
Dynamic: license-file
|
|
66
|
+
|
|
67
|
+
<div align="center">
|
|
68
|
+
|
|
69
|
+
# 🖥️ ezos — Easy OS
|
|
70
|
+
|
|
71
|
+
### Control your Windows PC with one-line Python. Build your own Jarvis.
|
|
72
|
+
|
|
73
|
+
[](https://www.python.org/)
|
|
74
|
+
[](#)
|
|
75
|
+
[](LICENSE)
|
|
76
|
+
[](#-install)
|
|
77
|
+
[](#-contributing)
|
|
78
|
+
|
|
79
|
+
**`ezos`** is a single-file Python library that gives an AI (or you) a simple,
|
|
80
|
+
reliable toolbox to drive the operating system — open apps, control the browser,
|
|
81
|
+
research the web, manage files, control media, and more — with dead-simple
|
|
82
|
+
functions that read like plain English.
|
|
83
|
+
|
|
84
|
+
```python
|
|
85
|
+
import ezos
|
|
86
|
+
|
|
87
|
+
ezos.open_app("spotify") # launches Spotify (Store app!)
|
|
88
|
+
ezos.play_on_youtube("lofi hip hop") # finds + opens the first video
|
|
89
|
+
ezos.search_web("weather", browser="chrome")
|
|
90
|
+
print(ezos.weather("London")) # "London: Overcast +12C, 84% humidity"
|
|
91
|
+
ezos.speak("All systems online, boss.")
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## ✨ Why ezos?
|
|
99
|
+
|
|
100
|
+
When you point an AI at a computer, it needs **simple, predictable verbs** — not
|
|
101
|
+
40 lines of `subprocess` / `ctypes` / Win32 boilerplate per task. `ezos` gives it
|
|
102
|
+
**85 of them**, each named like plain English, each returning a structured result
|
|
103
|
+
so the AI always knows what happened.
|
|
104
|
+
|
|
105
|
+
- 🎯 **It actually works.** App launching uses Windows' own `Get-StartApps`
|
|
106
|
+
resolver, so Store apps (Spotify, ChatGPT) *and* desktop apps (Zoom, Discord)
|
|
107
|
+
really launch — not just the ones on your PATH.
|
|
108
|
+
- 📦 **Zero dependencies for the core.** Launching, browser, media keys, window
|
|
109
|
+
control, volume, weather, clipboard, speak — all work on a plain Python install.
|
|
110
|
+
- 🤖 **Built for AI.** Ships OpenAI-compatible + Claude tool formats, a config
|
|
111
|
+
builder, and a ready-made `Jarvis` agent loop. Works with OpenAI, **Gemini**,
|
|
112
|
+
**Z.ai**, Groq, and any OpenAI-format API.
|
|
113
|
+
- 🔎 **Real web research** with DuckDuckGo + BeautifulSoup — your AI can *find
|
|
114
|
+
things out*, not just open a search page.
|
|
115
|
+
- 😌 **Readable both ways.** `ezos.open_app()` and `ezos.openApp()` both work.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## 📦 Install
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
git clone https://github.com/<your-username>/ezos.git
|
|
123
|
+
cd ezos
|
|
124
|
+
pip install -r requirements.txt # optional extras; the core needs nothing
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Or just drop **`ezos.py`** next to your script and `import ezos`.
|
|
128
|
+
|
|
129
|
+
| Package | Unlocks |
|
|
130
|
+
|---|---|
|
|
131
|
+
| *(nothing)* | app launch, browser, media, windows, volume, weather, clipboard, speak… |
|
|
132
|
+
| `ddgs` + `beautifulsoup4` | `web_search`, `read_webpage`, `research` |
|
|
133
|
+
| `openai` | real-AI Jarvis mode (works with OpenAI/Gemini/Z.ai/Groq) |
|
|
134
|
+
| `psutil` | `cpu_usage`, `ram_usage`, `battery_status` |
|
|
135
|
+
| `pyautogui` | `click`, `move_mouse`, `scroll` |
|
|
136
|
+
| `pycaw` + `comtypes` | `set_volume` to an exact level |
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 🚀 Quick start
|
|
141
|
+
|
|
142
|
+
```python
|
|
143
|
+
import ezos
|
|
144
|
+
|
|
145
|
+
# files
|
|
146
|
+
ezos.create_file("notes.txt", "hello world")
|
|
147
|
+
print(ezos.read_file("notes.txt"))
|
|
148
|
+
|
|
149
|
+
# apps & web
|
|
150
|
+
ezos.open_app("discord")
|
|
151
|
+
ezos.search_web("python tips", browser="chrome")
|
|
152
|
+
|
|
153
|
+
# system
|
|
154
|
+
print(ezos.system_info())
|
|
155
|
+
print(ezos.weather("Tokyo"))
|
|
156
|
+
ezos.volume_up(10)
|
|
157
|
+
|
|
158
|
+
# talk & notify
|
|
159
|
+
ezos.speak("Task complete")
|
|
160
|
+
ezos.reminder(600, "Take a break") # pops + speaks in 10 min
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Every action returns a structured result, so you always know what happened:
|
|
164
|
+
|
|
165
|
+
```python
|
|
166
|
+
ezos.open_app("spotify")
|
|
167
|
+
# -> {"ok": True, "message": "Opened 'Spotify'", "resolved": "Spotify"}
|
|
168
|
+
ezos.open_app("notarealapp")
|
|
169
|
+
# -> {"ok": False, "message": "Could not find an app called 'notarealapp'. ..."}
|
|
170
|
+
# (also prints a visible WARNING ezos: ... so failures aren't silent)
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## 🤖 Build your own Jarvis
|
|
176
|
+
|
|
177
|
+
`ezos` is the **toolbox**; your LLM is the **brain**. It works with any
|
|
178
|
+
**OpenAI-compatible** provider — OpenAI, **Google Gemini**, **Z.ai**, Groq,
|
|
179
|
+
Together, OpenRouter, local servers — just point the client's `base_url` at them.
|
|
180
|
+
|
|
181
|
+
### 1. Configure the AI
|
|
182
|
+
|
|
183
|
+
`aiRead()` makes one instruction block. Stack as many as you like and feed them to
|
|
184
|
+
`configure()`, which also tells the AI *which tools it has, with an instruction for
|
|
185
|
+
each*.
|
|
186
|
+
|
|
187
|
+
```python
|
|
188
|
+
import ezos
|
|
189
|
+
|
|
190
|
+
cfg = ezos.configure(
|
|
191
|
+
ezos.aiRead("Call me 'boss'."),
|
|
192
|
+
ezos.aiRead("Prefer Chrome for browsing."),
|
|
193
|
+
ezos.aiRead("Research before answering factual questions."),
|
|
194
|
+
provider="openai",
|
|
195
|
+
)
|
|
196
|
+
cfg["system_prompt"] # -> system message for your LLM
|
|
197
|
+
cfg["tools"] # -> tools in the OpenAI-compatible format
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### 2. Use the ready-made `Jarvis` loop
|
|
201
|
+
|
|
202
|
+
```python
|
|
203
|
+
from openai import OpenAI
|
|
204
|
+
import ezos
|
|
205
|
+
|
|
206
|
+
# Google Gemini (via the OpenAI-compatible endpoint)
|
|
207
|
+
client = OpenAI(
|
|
208
|
+
api_key="YOUR_GEMINI_KEY",
|
|
209
|
+
base_url="https://generativelanguage.googleapis.com/v1beta/openai/",
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
jarvis = ezos.Jarvis(client, model="gemini-2.0-flash", instructions=[
|
|
213
|
+
ezos.aiRead("Call me boss."),
|
|
214
|
+
ezos.aiRead("Prefer Chrome."),
|
|
215
|
+
])
|
|
216
|
+
|
|
217
|
+
jarvis.chat("open spotify and search lofi on youtube")
|
|
218
|
+
jarvis.chat("what's the weather in Tokyo and who won the last F1 race?")
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### 3. Or do raw tool-calling
|
|
222
|
+
|
|
223
|
+
```python
|
|
224
|
+
tools = ezos.openai_tools() # or ezos.anthropic_tools() for Claude
|
|
225
|
+
resp = client.chat.completions.create(model=..., tools=tools, messages=[...])
|
|
226
|
+
msg = resp.choices[0].message
|
|
227
|
+
if msg.tool_calls:
|
|
228
|
+
messages.append(msg)
|
|
229
|
+
messages += ezos.handle_openai_tool_calls(msg.tool_calls) # ezos runs them
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
> 💡 A complete, runnable chatbot is in **[`test.py`](test.py)** (Gemini) and
|
|
233
|
+
> **[`jarvis_demo.py`](jarvis_demo.py)** (any provider, with an offline keyword
|
|
234
|
+
> fallback that needs no API key).
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## 🔎 Web research (no API key)
|
|
239
|
+
|
|
240
|
+
```python
|
|
241
|
+
ezos.web_search("who won the match today") # -> [{title, url, snippet}, ...]
|
|
242
|
+
ezos.read_webpage("https://en.wikipedia.org/wiki/Mars") # clean text
|
|
243
|
+
info = ezos.research("python 3.13 new features") # search + read top pages
|
|
244
|
+
print(info["summary"]) # feed straight to your AI
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## 📚 The 85 commands
|
|
250
|
+
|
|
251
|
+
Open **[`index.html`](index.html)** in a browser for a searchable reference with
|
|
252
|
+
an example for every function. Categories:
|
|
253
|
+
|
|
254
|
+
| Category | Examples |
|
|
255
|
+
|---|---|
|
|
256
|
+
| **Files & Folders** (17) | `create_file`, `read_file`, `copy_file`, `zip_files`, `find_file`, `open_folder` |
|
|
257
|
+
| **Apps & Processes** (5) | `open_app`, `close_app`, `is_app_running`, `run_command` |
|
|
258
|
+
| **Browser & Web** (9) | `open_browser`, `search_web`, `open_website`, `weather`, `download_file` |
|
|
259
|
+
| **Media** (6) | `play_on_youtube`, `play_on_spotify`, `play_pause_media`, `next_track` |
|
|
260
|
+
| **Web Research** (3) | `web_search`, `read_webpage`, `research` |
|
|
261
|
+
| **System Info** (9) | `system_info`, `cpu_usage`, `ram_usage`, `disk_space`, `wifi_name` |
|
|
262
|
+
| **System Control** (7) | `shutdown`, `restart`, `lock_screen`, `sleep_pc`, `set_brightness` |
|
|
263
|
+
| **Window Management** (6) | `minimize_window`, `maximize_window`, `show_desktop`, `switch_window` |
|
|
264
|
+
| **Clipboard** (2) | `copy_to_clipboard`, `paste_from_clipboard` |
|
|
265
|
+
| **Sound & Wallpaper** (6) | `volume_up`, `mute`, `set_volume`, `screenshot`, `set_wallpaper` |
|
|
266
|
+
| **Keyboard & Mouse** (6) | `type_text`, `press_key`, `hotkey`, `click`, `scroll` |
|
|
267
|
+
| **Extras** (9) | `notify`, `toast`, `speak`, `reminder`, `set_timer`, `whatsapp_message` |
|
|
268
|
+
| **AI Integration** | `aiRead`, `configure`, `openai_tools`, `run`, `Jarvis`, … |
|
|
269
|
+
|
|
270
|
+
See everything at runtime:
|
|
271
|
+
|
|
272
|
+
```python
|
|
273
|
+
ezos.help_me() # printed overview
|
|
274
|
+
ezos.list_commands() # list of names
|
|
275
|
+
ezos.describe_commands() # name + params + doc (great for feeding an LLM)
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## 🛠️ How it works
|
|
281
|
+
|
|
282
|
+
- **App launching** uses `Get-StartApps` + `explorer.exe shell:AppsFolder\<AppID>`,
|
|
283
|
+
which resolves *any* Start-menu app (Store or desktop), not just PATH entries.
|
|
284
|
+
- **Browser** finds the real `chrome.exe` / `msedge.exe` / `firefox.exe` so the
|
|
285
|
+
URL opens in the browser you ask for.
|
|
286
|
+
- **Media keys, window control, volume** use `ctypes` — no third-party deps.
|
|
287
|
+
- **Web/weather** use the standard-library `urllib`; **research** adds DDGS + BS4.
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## ⚠️ Safety
|
|
292
|
+
|
|
293
|
+
- Built and tested on **Windows 11**. File/web helpers also work on macOS/Linux;
|
|
294
|
+
app-launch / volume / window / wallpaper helpers are Windows-first.
|
|
295
|
+
- Destructive verbs (`delete_file`, `delete_folder`, `shutdown`,
|
|
296
|
+
`empty_recycle_bin`) do exactly what they say — have your AI confirm before
|
|
297
|
+
calling them. `whatsapp_message` only *opens* the chat; you press Send.
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## 🤝 Contributing
|
|
302
|
+
|
|
303
|
+
Contributions are welcome! To add a command:
|
|
304
|
+
|
|
305
|
+
1. Write a function in `ezos.py` that returns `_ok(...)` / `_fail(...)`.
|
|
306
|
+
2. Add a `camelCase` alias in the aliases block.
|
|
307
|
+
3. Add an entry to `index.html` so it shows in the docs.
|
|
308
|
+
4. Open a PR. 🎉
|
|
309
|
+
|
|
310
|
+
Found a bug or want a feature? [Open an issue](../../issues).
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
## 📄 License
|
|
315
|
+
|
|
316
|
+
Released under the **MIT License** — see [LICENSE](LICENSE). Free to use, modify,
|
|
317
|
+
and share.
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
<div align="center">
|
|
322
|
+
|
|
323
|
+
**Built for makers who want to build their own Jarvis.** ⭐ Star it if it helped!
|
|
324
|
+
|
|
325
|
+
</div>
|
ezos-2.0.0/README.md
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# 🖥️ ezos — Easy OS
|
|
4
|
+
|
|
5
|
+
### Control your Windows PC with one-line Python. Build your own Jarvis.
|
|
6
|
+
|
|
7
|
+
[](https://www.python.org/)
|
|
8
|
+
[](#)
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](#-install)
|
|
11
|
+
[](#-contributing)
|
|
12
|
+
|
|
13
|
+
**`ezos`** is a single-file Python library that gives an AI (or you) a simple,
|
|
14
|
+
reliable toolbox to drive the operating system — open apps, control the browser,
|
|
15
|
+
research the web, manage files, control media, and more — with dead-simple
|
|
16
|
+
functions that read like plain English.
|
|
17
|
+
|
|
18
|
+
```python
|
|
19
|
+
import ezos
|
|
20
|
+
|
|
21
|
+
ezos.open_app("spotify") # launches Spotify (Store app!)
|
|
22
|
+
ezos.play_on_youtube("lofi hip hop") # finds + opens the first video
|
|
23
|
+
ezos.search_web("weather", browser="chrome")
|
|
24
|
+
print(ezos.weather("London")) # "London: Overcast +12C, 84% humidity"
|
|
25
|
+
ezos.speak("All systems online, boss.")
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## ✨ Why ezos?
|
|
33
|
+
|
|
34
|
+
When you point an AI at a computer, it needs **simple, predictable verbs** — not
|
|
35
|
+
40 lines of `subprocess` / `ctypes` / Win32 boilerplate per task. `ezos` gives it
|
|
36
|
+
**85 of them**, each named like plain English, each returning a structured result
|
|
37
|
+
so the AI always knows what happened.
|
|
38
|
+
|
|
39
|
+
- 🎯 **It actually works.** App launching uses Windows' own `Get-StartApps`
|
|
40
|
+
resolver, so Store apps (Spotify, ChatGPT) *and* desktop apps (Zoom, Discord)
|
|
41
|
+
really launch — not just the ones on your PATH.
|
|
42
|
+
- 📦 **Zero dependencies for the core.** Launching, browser, media keys, window
|
|
43
|
+
control, volume, weather, clipboard, speak — all work on a plain Python install.
|
|
44
|
+
- 🤖 **Built for AI.** Ships OpenAI-compatible + Claude tool formats, a config
|
|
45
|
+
builder, and a ready-made `Jarvis` agent loop. Works with OpenAI, **Gemini**,
|
|
46
|
+
**Z.ai**, Groq, and any OpenAI-format API.
|
|
47
|
+
- 🔎 **Real web research** with DuckDuckGo + BeautifulSoup — your AI can *find
|
|
48
|
+
things out*, not just open a search page.
|
|
49
|
+
- 😌 **Readable both ways.** `ezos.open_app()` and `ezos.openApp()` both work.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 📦 Install
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
git clone https://github.com/<your-username>/ezos.git
|
|
57
|
+
cd ezos
|
|
58
|
+
pip install -r requirements.txt # optional extras; the core needs nothing
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Or just drop **`ezos.py`** next to your script and `import ezos`.
|
|
62
|
+
|
|
63
|
+
| Package | Unlocks |
|
|
64
|
+
|---|---|
|
|
65
|
+
| *(nothing)* | app launch, browser, media, windows, volume, weather, clipboard, speak… |
|
|
66
|
+
| `ddgs` + `beautifulsoup4` | `web_search`, `read_webpage`, `research` |
|
|
67
|
+
| `openai` | real-AI Jarvis mode (works with OpenAI/Gemini/Z.ai/Groq) |
|
|
68
|
+
| `psutil` | `cpu_usage`, `ram_usage`, `battery_status` |
|
|
69
|
+
| `pyautogui` | `click`, `move_mouse`, `scroll` |
|
|
70
|
+
| `pycaw` + `comtypes` | `set_volume` to an exact level |
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## 🚀 Quick start
|
|
75
|
+
|
|
76
|
+
```python
|
|
77
|
+
import ezos
|
|
78
|
+
|
|
79
|
+
# files
|
|
80
|
+
ezos.create_file("notes.txt", "hello world")
|
|
81
|
+
print(ezos.read_file("notes.txt"))
|
|
82
|
+
|
|
83
|
+
# apps & web
|
|
84
|
+
ezos.open_app("discord")
|
|
85
|
+
ezos.search_web("python tips", browser="chrome")
|
|
86
|
+
|
|
87
|
+
# system
|
|
88
|
+
print(ezos.system_info())
|
|
89
|
+
print(ezos.weather("Tokyo"))
|
|
90
|
+
ezos.volume_up(10)
|
|
91
|
+
|
|
92
|
+
# talk & notify
|
|
93
|
+
ezos.speak("Task complete")
|
|
94
|
+
ezos.reminder(600, "Take a break") # pops + speaks in 10 min
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Every action returns a structured result, so you always know what happened:
|
|
98
|
+
|
|
99
|
+
```python
|
|
100
|
+
ezos.open_app("spotify")
|
|
101
|
+
# -> {"ok": True, "message": "Opened 'Spotify'", "resolved": "Spotify"}
|
|
102
|
+
ezos.open_app("notarealapp")
|
|
103
|
+
# -> {"ok": False, "message": "Could not find an app called 'notarealapp'. ..."}
|
|
104
|
+
# (also prints a visible WARNING ezos: ... so failures aren't silent)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 🤖 Build your own Jarvis
|
|
110
|
+
|
|
111
|
+
`ezos` is the **toolbox**; your LLM is the **brain**. It works with any
|
|
112
|
+
**OpenAI-compatible** provider — OpenAI, **Google Gemini**, **Z.ai**, Groq,
|
|
113
|
+
Together, OpenRouter, local servers — just point the client's `base_url` at them.
|
|
114
|
+
|
|
115
|
+
### 1. Configure the AI
|
|
116
|
+
|
|
117
|
+
`aiRead()` makes one instruction block. Stack as many as you like and feed them to
|
|
118
|
+
`configure()`, which also tells the AI *which tools it has, with an instruction for
|
|
119
|
+
each*.
|
|
120
|
+
|
|
121
|
+
```python
|
|
122
|
+
import ezos
|
|
123
|
+
|
|
124
|
+
cfg = ezos.configure(
|
|
125
|
+
ezos.aiRead("Call me 'boss'."),
|
|
126
|
+
ezos.aiRead("Prefer Chrome for browsing."),
|
|
127
|
+
ezos.aiRead("Research before answering factual questions."),
|
|
128
|
+
provider="openai",
|
|
129
|
+
)
|
|
130
|
+
cfg["system_prompt"] # -> system message for your LLM
|
|
131
|
+
cfg["tools"] # -> tools in the OpenAI-compatible format
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### 2. Use the ready-made `Jarvis` loop
|
|
135
|
+
|
|
136
|
+
```python
|
|
137
|
+
from openai import OpenAI
|
|
138
|
+
import ezos
|
|
139
|
+
|
|
140
|
+
# Google Gemini (via the OpenAI-compatible endpoint)
|
|
141
|
+
client = OpenAI(
|
|
142
|
+
api_key="YOUR_GEMINI_KEY",
|
|
143
|
+
base_url="https://generativelanguage.googleapis.com/v1beta/openai/",
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
jarvis = ezos.Jarvis(client, model="gemini-2.0-flash", instructions=[
|
|
147
|
+
ezos.aiRead("Call me boss."),
|
|
148
|
+
ezos.aiRead("Prefer Chrome."),
|
|
149
|
+
])
|
|
150
|
+
|
|
151
|
+
jarvis.chat("open spotify and search lofi on youtube")
|
|
152
|
+
jarvis.chat("what's the weather in Tokyo and who won the last F1 race?")
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### 3. Or do raw tool-calling
|
|
156
|
+
|
|
157
|
+
```python
|
|
158
|
+
tools = ezos.openai_tools() # or ezos.anthropic_tools() for Claude
|
|
159
|
+
resp = client.chat.completions.create(model=..., tools=tools, messages=[...])
|
|
160
|
+
msg = resp.choices[0].message
|
|
161
|
+
if msg.tool_calls:
|
|
162
|
+
messages.append(msg)
|
|
163
|
+
messages += ezos.handle_openai_tool_calls(msg.tool_calls) # ezos runs them
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
> 💡 A complete, runnable chatbot is in **[`test.py`](test.py)** (Gemini) and
|
|
167
|
+
> **[`jarvis_demo.py`](jarvis_demo.py)** (any provider, with an offline keyword
|
|
168
|
+
> fallback that needs no API key).
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## 🔎 Web research (no API key)
|
|
173
|
+
|
|
174
|
+
```python
|
|
175
|
+
ezos.web_search("who won the match today") # -> [{title, url, snippet}, ...]
|
|
176
|
+
ezos.read_webpage("https://en.wikipedia.org/wiki/Mars") # clean text
|
|
177
|
+
info = ezos.research("python 3.13 new features") # search + read top pages
|
|
178
|
+
print(info["summary"]) # feed straight to your AI
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 📚 The 85 commands
|
|
184
|
+
|
|
185
|
+
Open **[`index.html`](index.html)** in a browser for a searchable reference with
|
|
186
|
+
an example for every function. Categories:
|
|
187
|
+
|
|
188
|
+
| Category | Examples |
|
|
189
|
+
|---|---|
|
|
190
|
+
| **Files & Folders** (17) | `create_file`, `read_file`, `copy_file`, `zip_files`, `find_file`, `open_folder` |
|
|
191
|
+
| **Apps & Processes** (5) | `open_app`, `close_app`, `is_app_running`, `run_command` |
|
|
192
|
+
| **Browser & Web** (9) | `open_browser`, `search_web`, `open_website`, `weather`, `download_file` |
|
|
193
|
+
| **Media** (6) | `play_on_youtube`, `play_on_spotify`, `play_pause_media`, `next_track` |
|
|
194
|
+
| **Web Research** (3) | `web_search`, `read_webpage`, `research` |
|
|
195
|
+
| **System Info** (9) | `system_info`, `cpu_usage`, `ram_usage`, `disk_space`, `wifi_name` |
|
|
196
|
+
| **System Control** (7) | `shutdown`, `restart`, `lock_screen`, `sleep_pc`, `set_brightness` |
|
|
197
|
+
| **Window Management** (6) | `minimize_window`, `maximize_window`, `show_desktop`, `switch_window` |
|
|
198
|
+
| **Clipboard** (2) | `copy_to_clipboard`, `paste_from_clipboard` |
|
|
199
|
+
| **Sound & Wallpaper** (6) | `volume_up`, `mute`, `set_volume`, `screenshot`, `set_wallpaper` |
|
|
200
|
+
| **Keyboard & Mouse** (6) | `type_text`, `press_key`, `hotkey`, `click`, `scroll` |
|
|
201
|
+
| **Extras** (9) | `notify`, `toast`, `speak`, `reminder`, `set_timer`, `whatsapp_message` |
|
|
202
|
+
| **AI Integration** | `aiRead`, `configure`, `openai_tools`, `run`, `Jarvis`, … |
|
|
203
|
+
|
|
204
|
+
See everything at runtime:
|
|
205
|
+
|
|
206
|
+
```python
|
|
207
|
+
ezos.help_me() # printed overview
|
|
208
|
+
ezos.list_commands() # list of names
|
|
209
|
+
ezos.describe_commands() # name + params + doc (great for feeding an LLM)
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## 🛠️ How it works
|
|
215
|
+
|
|
216
|
+
- **App launching** uses `Get-StartApps` + `explorer.exe shell:AppsFolder\<AppID>`,
|
|
217
|
+
which resolves *any* Start-menu app (Store or desktop), not just PATH entries.
|
|
218
|
+
- **Browser** finds the real `chrome.exe` / `msedge.exe` / `firefox.exe` so the
|
|
219
|
+
URL opens in the browser you ask for.
|
|
220
|
+
- **Media keys, window control, volume** use `ctypes` — no third-party deps.
|
|
221
|
+
- **Web/weather** use the standard-library `urllib`; **research** adds DDGS + BS4.
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## ⚠️ Safety
|
|
226
|
+
|
|
227
|
+
- Built and tested on **Windows 11**. File/web helpers also work on macOS/Linux;
|
|
228
|
+
app-launch / volume / window / wallpaper helpers are Windows-first.
|
|
229
|
+
- Destructive verbs (`delete_file`, `delete_folder`, `shutdown`,
|
|
230
|
+
`empty_recycle_bin`) do exactly what they say — have your AI confirm before
|
|
231
|
+
calling them. `whatsapp_message` only *opens* the chat; you press Send.
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## 🤝 Contributing
|
|
236
|
+
|
|
237
|
+
Contributions are welcome! To add a command:
|
|
238
|
+
|
|
239
|
+
1. Write a function in `ezos.py` that returns `_ok(...)` / `_fail(...)`.
|
|
240
|
+
2. Add a `camelCase` alias in the aliases block.
|
|
241
|
+
3. Add an entry to `index.html` so it shows in the docs.
|
|
242
|
+
4. Open a PR. 🎉
|
|
243
|
+
|
|
244
|
+
Found a bug or want a feature? [Open an issue](../../issues).
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## 📄 License
|
|
249
|
+
|
|
250
|
+
Released under the **MIT License** — see [LICENSE](LICENSE). Free to use, modify,
|
|
251
|
+
and share.
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
<div align="center">
|
|
256
|
+
|
|
257
|
+
**Built for makers who want to build their own Jarvis.** ⭐ Star it if it helped!
|
|
258
|
+
|
|
259
|
+
</div>
|