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 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
+ [![Python](https://img.shields.io/badge/Python-3.9%2B-blue.svg)](https://www.python.org/)
74
+ [![Platform](https://img.shields.io/badge/Platform-Windows-0078D6.svg)](#)
75
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
76
+ [![Dependencies](https://img.shields.io/badge/core%20deps-0-brightgreen.svg)](#-install)
77
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-ff69b4.svg)](#-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
+ [![Python](https://img.shields.io/badge/Python-3.9%2B-blue.svg)](https://www.python.org/)
8
+ [![Platform](https://img.shields.io/badge/Platform-Windows-0078D6.svg)](#)
9
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
10
+ [![Dependencies](https://img.shields.io/badge/core%20deps-0-brightgreen.svg)](#-install)
11
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-ff69b4.svg)](#-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>