oagi-core 0.12.0__tar.gz → 0.13.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 (129) hide show
  1. {oagi_core-0.12.0 → oagi_core-0.13.0}/PKG-INFO +42 -1
  2. {oagi_core-0.12.0 → oagi_core-0.13.0}/README.md +40 -0
  3. {oagi_core-0.12.0 → oagi_core-0.13.0}/metapackage/pyproject.toml +2 -2
  4. {oagi_core-0.12.0 → oagi_core-0.13.0}/metapackage/uv.lock +143 -5
  5. {oagi_core-0.12.0 → oagi_core-0.13.0}/pyproject.toml +2 -1
  6. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/__init__.py +27 -0
  7. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/agent/default.py +1 -1
  8. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/agent/tasker/taskee_agent.py +1 -1
  9. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/agent/tasker/tasker_agent.py +1 -1
  10. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/cli/agent.py +17 -7
  11. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/client/async_.py +6 -1
  12. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/client/base.py +2 -1
  13. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/client/sync.py +8 -1
  14. oagi_core-0.13.0/src/oagi/handler/__init__.py +63 -0
  15. oagi_core-0.13.0/src/oagi/handler/_ydotool.py +158 -0
  16. oagi_core-0.13.0/src/oagi/handler/async_ydotool_action_handler.py +52 -0
  17. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/handler/pil_image.py +6 -0
  18. oagi_core-0.12.0/src/oagi/handler/__init__.py → oagi_core-0.13.0/src/oagi/handler/utils.py +0 -19
  19. oagi_core-0.13.0/src/oagi/handler/wayland_support.py +219 -0
  20. oagi_core-0.13.0/src/oagi/handler/ydotool_action_handler.py +226 -0
  21. oagi_core-0.13.0/src/oagi/platform_info.py +51 -0
  22. {oagi_core-0.12.0 → oagi_core-0.13.0}/uv.lock +31 -1
  23. {oagi_core-0.12.0 → oagi_core-0.13.0}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  24. {oagi_core-0.12.0 → oagi_core-0.13.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  25. {oagi_core-0.12.0 → oagi_core-0.13.0}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
  26. {oagi_core-0.12.0 → oagi_core-0.13.0}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  27. {oagi_core-0.12.0 → oagi_core-0.13.0}/.github/workflows/ci.yml +0 -0
  28. {oagi_core-0.12.0 → oagi_core-0.13.0}/.github/workflows/release.yml +0 -0
  29. {oagi_core-0.12.0 → oagi_core-0.13.0}/.gitignore +0 -0
  30. {oagi_core-0.12.0 → oagi_core-0.13.0}/.python-version +0 -0
  31. {oagi_core-0.12.0 → oagi_core-0.13.0}/CONTRIBUTING.md +0 -0
  32. {oagi_core-0.12.0 → oagi_core-0.13.0}/LICENSE +0 -0
  33. {oagi_core-0.12.0 → oagi_core-0.13.0}/Makefile +0 -0
  34. {oagi_core-0.12.0 → oagi_core-0.13.0}/examples/async_google_weather.py +0 -0
  35. {oagi_core-0.12.0 → oagi_core-0.13.0}/examples/execute_task_auto.py +0 -0
  36. {oagi_core-0.12.0 → oagi_core-0.13.0}/examples/execute_task_manual.py +0 -0
  37. {oagi_core-0.12.0 → oagi_core-0.13.0}/examples/google_weather.py +0 -0
  38. {oagi_core-0.12.0 → oagi_core-0.13.0}/examples/openai_agent_loop_example.py +0 -0
  39. {oagi_core-0.12.0 → oagi_core-0.13.0}/examples/screenshot_with_config.py +0 -0
  40. {oagi_core-0.12.0 → oagi_core-0.13.0}/examples/tasker_agent_example.py +0 -0
  41. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/actor/__init__.py +0 -0
  42. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/actor/async_.py +0 -0
  43. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/actor/async_short.py +0 -0
  44. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/actor/base.py +0 -0
  45. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/actor/short.py +0 -0
  46. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/actor/sync.py +0 -0
  47. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/agent/__init__.py +0 -0
  48. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/agent/factories.py +0 -0
  49. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/agent/observer/__init__.py +0 -0
  50. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/agent/observer/agent_observer.py +0 -0
  51. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/agent/observer/events.py +0 -0
  52. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/agent/observer/exporters.py +0 -0
  53. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/agent/observer/protocol.py +0 -0
  54. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/agent/observer/report_template.html +0 -0
  55. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/agent/protocol.py +0 -0
  56. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/agent/registry.py +0 -0
  57. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/agent/tasker/__init__.py +0 -0
  58. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/agent/tasker/memory.py +0 -0
  59. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/agent/tasker/models.py +0 -0
  60. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/agent/tasker/planner.py +0 -0
  61. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/cli/__init__.py +0 -0
  62. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/cli/display.py +0 -0
  63. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/cli/main.py +0 -0
  64. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/cli/server.py +0 -0
  65. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/cli/tracking.py +0 -0
  66. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/cli/utils.py +0 -0
  67. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/client/__init__.py +0 -0
  68. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/constants.py +0 -0
  69. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/exceptions.py +0 -0
  70. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/handler/_macos.py +0 -0
  71. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/handler/_windows.py +0 -0
  72. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/handler/async_pyautogui_action_handler.py +0 -0
  73. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/handler/async_screenshot_maker.py +0 -0
  74. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/handler/capslock_manager.py +0 -0
  75. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/handler/pyautogui_action_handler.py +0 -0
  76. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/handler/screenshot_maker.py +0 -0
  77. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/logging.py +0 -0
  78. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/server/__init__.py +0 -0
  79. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/server/agent_wrappers.py +0 -0
  80. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/server/config.py +0 -0
  81. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/server/main.py +0 -0
  82. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/server/models.py +0 -0
  83. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/server/session_store.py +0 -0
  84. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/server/socketio_server.py +0 -0
  85. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/task/__init__.py +0 -0
  86. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/types/__init__.py +0 -0
  87. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/types/action_handler.py +0 -0
  88. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/types/async_action_handler.py +0 -0
  89. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/types/async_image_provider.py +0 -0
  90. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/types/image.py +0 -0
  91. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/types/image_provider.py +0 -0
  92. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/types/models/__init__.py +0 -0
  93. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/types/models/action.py +0 -0
  94. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/types/models/client.py +0 -0
  95. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/types/models/image_config.py +0 -0
  96. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/types/models/step.py +0 -0
  97. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/types/step_observer.py +0 -0
  98. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/types/url.py +0 -0
  99. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/utils/__init__.py +0 -0
  100. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/utils/output_parser.py +0 -0
  101. {oagi_core-0.12.0 → oagi_core-0.13.0}/src/oagi/utils/prompt_builder.py +0 -0
  102. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/__init__.py +0 -0
  103. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/conftest.py +0 -0
  104. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_action_parsing.py +0 -0
  105. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_actor.py +0 -0
  106. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_agent/test_agent_wrappers.py +0 -0
  107. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_agent/test_default_agent.py +0 -0
  108. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_agent_registry.py +0 -0
  109. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_async_actor.py +0 -0
  110. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_async_client.py +0 -0
  111. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_async_handlers.py +0 -0
  112. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_cli.py +0 -0
  113. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_logging.py +0 -0
  114. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_mac_double_click.py +0 -0
  115. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_observer.py +0 -0
  116. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_pil_image.py +0 -0
  117. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_planner.py +0 -0
  118. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_planner_memory.py +0 -0
  119. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_pyautogui_action_handler.py +0 -0
  120. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_screenshot_maker.py +0 -0
  121. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_server/__init__.py +0 -0
  122. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_server/test_config.py +0 -0
  123. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_server/test_session_store.py +0 -0
  124. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_server/test_socketio_integration.py +0 -0
  125. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_sync_client.py +0 -0
  126. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_taskee_agent.py +0 -0
  127. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/test_tasker_agent.py +0 -0
  128. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/utils/__init__.py +0 -0
  129. {oagi_core-0.12.0 → oagi_core-0.13.0}/tests/utils/test_output_parser.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: oagi-core
3
- Version: 0.12.0
3
+ Version: 0.13.0
4
4
  Summary: Official API of OpenAGI Foundation
5
5
  Project-URL: Homepage, https://github.com/agiopen-org/oagi
6
6
  Author-email: OpenAGI Foundation <contact@agiopen.org>
@@ -35,6 +35,7 @@ Requires-Dist: pillow>=9.0.0; extra == 'desktop'
35
35
  Requires-Dist: pyautogui>=0.9.54; extra == 'desktop'
36
36
  Requires-Dist: pyobjc-framework-applicationservices>=8.0; (sys_platform == 'darwin') and extra == 'desktop'
37
37
  Requires-Dist: pyobjc-framework-quartz>=8.0; (sys_platform == 'darwin') and extra == 'desktop'
38
+ Requires-Dist: screeninfo>=0.8.1; extra == 'desktop'
38
39
  Provides-Extra: server
39
40
  Requires-Dist: fastapi[standard]>=0.100.0; extra == 'server'
40
41
  Requires-Dist: pydantic-settings>=2.0.0; extra == 'server'
@@ -82,6 +83,7 @@ With Lux, possibilities are endless. Here are a few examples:
82
83
  - [Command Line Interface](#command-line-interface)
83
84
  - [Image Processing](#image-processing)
84
85
  - [Manual Control with Actor](#manual-control-with-actor)
86
+ - [Run On System With Wayland](#run-on-system-with-wayland)
85
87
  - [Examples](#examples)
86
88
  - [Socket.IO Server (Optional)](#socketio-server-optional)
87
89
  - [Installation](#installation-1)
@@ -239,6 +241,45 @@ async def main():
239
241
  asyncio.run(main())
240
242
  ```
241
243
 
244
+ ### Run On System With Wayland
245
+ The SDK includes support for desktop automation on systems with Wayland display, such as Ubuntu/Debain. It leverages `ydotool` and `flameshot` for mouse/keyboard actions and screenshot capture respectively. Please install these two tools on your system in advance and ensure `ydotoold` server is running in the background when running the script.
246
+
247
+ Refer to [ydotool](https://github.com/ReimuNotMoe/ydotool) and [flameshot](https://flameshot.org/#download) for installation instructions. Disable mouse acceleration for more precise mouse control. (In GNOME, run `gsettings set org.gnome.desktop.peripherals.mouse accel-profile 'flat'`)
248
+
249
+ Run tasks automatically with screenshot capture and action execution:
250
+ ```python
251
+ import asyncio
252
+ from oagi import AsyncDefaultAgent, AsyncYdotoolActionHandler, AsyncScreenshotMaker
253
+
254
+ async def main():
255
+ agent = AsyncDefaultAgent(max_steps=10)
256
+ completed = await agent.execute(
257
+ "Search weather on Google",
258
+ action_handler=AsyncYdotoolActionHandler(), # Executes mouse/keyboard actions, based on 'ydotool'
259
+ image_provider=AsyncScreenshotMaker(), # Captures screenshots, based on 'flameshot'
260
+ )
261
+ return completed
262
+
263
+ asyncio.run(main())
264
+ ```
265
+
266
+ Configure Ydotool behavior with custom settings:
267
+
268
+ ```python
269
+ from oagi import AsyncYdotoolActionHandler, YdotoolConfig
270
+
271
+ # Customize action behavior
272
+ config = YdotoolConfig(
273
+ scroll_amount=50, # Larger scroll steps (default: 20)
274
+ wait_duration=2.0, # Longer waits (default: 1.0)
275
+ action_pause=1.0, # More pause between actions (default: 0.5)
276
+ capslock_mode="session", # Caps lock mode: 'session' or 'system' (default: 'session')
277
+ socket_address="/tmp/ydotool.sock" # Customized Socket address for ydotool (ydotool uses 'YDOTOOL_SOCKET' environment variable by default)
278
+ )
279
+
280
+ action_handler = AsyncYdotoolActionHandler(config=config)
281
+ ```
282
+
242
283
  ## Examples
243
284
 
244
285
  See the [`examples/`](examples/) directory for more usage patterns:
@@ -38,6 +38,7 @@ With Lux, possibilities are endless. Here are a few examples:
38
38
  - [Command Line Interface](#command-line-interface)
39
39
  - [Image Processing](#image-processing)
40
40
  - [Manual Control with Actor](#manual-control-with-actor)
41
+ - [Run On System With Wayland](#run-on-system-with-wayland)
41
42
  - [Examples](#examples)
42
43
  - [Socket.IO Server (Optional)](#socketio-server-optional)
43
44
  - [Installation](#installation-1)
@@ -195,6 +196,45 @@ async def main():
195
196
  asyncio.run(main())
196
197
  ```
197
198
 
199
+ ### Run On System With Wayland
200
+ The SDK includes support for desktop automation on systems with Wayland display, such as Ubuntu/Debain. It leverages `ydotool` and `flameshot` for mouse/keyboard actions and screenshot capture respectively. Please install these two tools on your system in advance and ensure `ydotoold` server is running in the background when running the script.
201
+
202
+ Refer to [ydotool](https://github.com/ReimuNotMoe/ydotool) and [flameshot](https://flameshot.org/#download) for installation instructions. Disable mouse acceleration for more precise mouse control. (In GNOME, run `gsettings set org.gnome.desktop.peripherals.mouse accel-profile 'flat'`)
203
+
204
+ Run tasks automatically with screenshot capture and action execution:
205
+ ```python
206
+ import asyncio
207
+ from oagi import AsyncDefaultAgent, AsyncYdotoolActionHandler, AsyncScreenshotMaker
208
+
209
+ async def main():
210
+ agent = AsyncDefaultAgent(max_steps=10)
211
+ completed = await agent.execute(
212
+ "Search weather on Google",
213
+ action_handler=AsyncYdotoolActionHandler(), # Executes mouse/keyboard actions, based on 'ydotool'
214
+ image_provider=AsyncScreenshotMaker(), # Captures screenshots, based on 'flameshot'
215
+ )
216
+ return completed
217
+
218
+ asyncio.run(main())
219
+ ```
220
+
221
+ Configure Ydotool behavior with custom settings:
222
+
223
+ ```python
224
+ from oagi import AsyncYdotoolActionHandler, YdotoolConfig
225
+
226
+ # Customize action behavior
227
+ config = YdotoolConfig(
228
+ scroll_amount=50, # Larger scroll steps (default: 20)
229
+ wait_duration=2.0, # Longer waits (default: 1.0)
230
+ action_pause=1.0, # More pause between actions (default: 0.5)
231
+ capslock_mode="session", # Caps lock mode: 'session' or 'system' (default: 'session')
232
+ socket_address="/tmp/ydotool.sock" # Customized Socket address for ydotool (ydotool uses 'YDOTOOL_SOCKET' environment variable by default)
233
+ )
234
+
235
+ action_handler = AsyncYdotoolActionHandler(config=config)
236
+ ```
237
+
198
238
  ## Examples
199
239
 
200
240
  See the [`examples/`](examples/) directory for more usage patterns:
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "oagi"
7
- version = "0.12.0"
7
+ version = "0.13.0"
8
8
  description = "Official API of OpenAGI Foundation (metapackage with all features)"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -16,7 +16,7 @@ authors = [
16
16
  requires-python = ">= 3.10"
17
17
 
18
18
  dependencies = [
19
- "oagi-core[desktop,server]==0.12.0",
19
+ "oagi-core[desktop,server]==0.13.0",
20
20
  ]
21
21
 
22
22
  [project.urls]
@@ -79,6 +79,15 @@ wheels = [
79
79
  { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
80
80
  ]
81
81
 
82
+ [[package]]
83
+ name = "distro"
84
+ version = "1.9.0"
85
+ source = { registry = "https://pypi.org/simple" }
86
+ sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" }
87
+ wheels = [
88
+ { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" },
89
+ ]
90
+
82
91
  [[package]]
83
92
  name = "dnspython"
84
93
  version = "2.8.0"
@@ -278,6 +287,103 @@ wheels = [
278
287
  { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" },
279
288
  ]
280
289
 
290
+ [[package]]
291
+ name = "jiter"
292
+ version = "0.12.0"
293
+ source = { registry = "https://pypi.org/simple" }
294
+ sdist = { url = "https://files.pythonhosted.org/packages/45/9d/e0660989c1370e25848bb4c52d061c71837239738ad937e83edca174c273/jiter-0.12.0.tar.gz", hash = "sha256:64dfcd7d5c168b38d3f9f8bba7fc639edb3418abcc74f22fdbe6b8938293f30b", size = 168294, upload-time = "2025-11-09T20:49:23.302Z" }
295
+ wheels = [
296
+ { url = "https://files.pythonhosted.org/packages/3b/91/13cb9505f7be74a933f37da3af22e029f6ba64f5669416cb8b2774bc9682/jiter-0.12.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e7acbaba9703d5de82a2c98ae6a0f59ab9770ab5af5fa35e43a303aee962cf65", size = 316652, upload-time = "2025-11-09T20:46:41.021Z" },
297
+ { url = "https://files.pythonhosted.org/packages/4e/76/4e9185e5d9bb4e482cf6dec6410d5f78dfeb374cfcecbbe9888d07c52daa/jiter-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:364f1a7294c91281260364222f535bc427f56d4de1d8ffd718162d21fbbd602e", size = 319829, upload-time = "2025-11-09T20:46:43.281Z" },
298
+ { url = "https://files.pythonhosted.org/packages/86/af/727de50995d3a153138139f259baae2379d8cb0522c0c00419957bc478a6/jiter-0.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ee4d25805d4fb23f0a5167a962ef8e002dbfb29c0989378488e32cf2744b62", size = 350568, upload-time = "2025-11-09T20:46:45.075Z" },
299
+ { url = "https://files.pythonhosted.org/packages/6a/c1/d6e9f4b7a3d5ac63bcbdfddeb50b2dcfbdc512c86cffc008584fdc350233/jiter-0.12.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:796f466b7942107eb889c08433b6e31b9a7ed31daceaecf8af1be26fb26c0ca8", size = 369052, upload-time = "2025-11-09T20:46:46.818Z" },
300
+ { url = "https://files.pythonhosted.org/packages/eb/be/00824cd530f30ed73fa8a4f9f3890a705519e31ccb9e929f1e22062e7c76/jiter-0.12.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35506cb71f47dba416694e67af996bbdefb8e3608f1f78799c2e1f9058b01ceb", size = 481585, upload-time = "2025-11-09T20:46:48.319Z" },
301
+ { url = "https://files.pythonhosted.org/packages/74/b6/2ad7990dff9504d4b5052eef64aa9574bd03d722dc7edced97aad0d47be7/jiter-0.12.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:726c764a90c9218ec9e4f99a33d6bf5ec169163f2ca0fc21b654e88c2abc0abc", size = 380541, upload-time = "2025-11-09T20:46:49.643Z" },
302
+ { url = "https://files.pythonhosted.org/packages/b5/c7/f3c26ecbc1adbf1db0d6bba99192143d8fe8504729d9594542ecc4445784/jiter-0.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa47810c5565274810b726b0dc86d18dce5fd17b190ebdc3890851d7b2a0e74", size = 364423, upload-time = "2025-11-09T20:46:51.731Z" },
303
+ { url = "https://files.pythonhosted.org/packages/18/51/eac547bf3a2d7f7e556927278e14c56a0604b8cddae75815d5739f65f81d/jiter-0.12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8ec0259d3f26c62aed4d73b198c53e316ae11f0f69c8fbe6682c6dcfa0fcce2", size = 389958, upload-time = "2025-11-09T20:46:53.432Z" },
304
+ { url = "https://files.pythonhosted.org/packages/2c/1f/9ca592e67175f2db156cff035e0d817d6004e293ee0c1d73692d38fcb596/jiter-0.12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:79307d74ea83465b0152fa23e5e297149506435535282f979f18b9033c0bb025", size = 522084, upload-time = "2025-11-09T20:46:54.848Z" },
305
+ { url = "https://files.pythonhosted.org/packages/83/ff/597d9cdc3028f28224f53e1a9d063628e28b7a5601433e3196edda578cdd/jiter-0.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cf6e6dd18927121fec86739f1a8906944703941d000f0639f3eb6281cc601dca", size = 513054, upload-time = "2025-11-09T20:46:56.487Z" },
306
+ { url = "https://files.pythonhosted.org/packages/24/6d/1970bce1351bd02e3afcc5f49e4f7ef3dabd7fb688f42be7e8091a5b809a/jiter-0.12.0-cp310-cp310-win32.whl", hash = "sha256:b6ae2aec8217327d872cbfb2c1694489057b9433afce447955763e6ab015b4c4", size = 206368, upload-time = "2025-11-09T20:46:58.638Z" },
307
+ { url = "https://files.pythonhosted.org/packages/e3/6b/eb1eb505b2d86709b59ec06681a2b14a94d0941db091f044b9f0e16badc0/jiter-0.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7f49ce90a71e44f7e1aa9e7ec415b9686bbc6a5961e57eab511015e6759bc11", size = 204847, upload-time = "2025-11-09T20:47:00.295Z" },
308
+ { url = "https://files.pythonhosted.org/packages/32/f9/eaca4633486b527ebe7e681c431f529b63fe2709e7c5242fc0f43f77ce63/jiter-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8f8a7e317190b2c2d60eb2e8aa835270b008139562d70fe732e1c0020ec53c9", size = 316435, upload-time = "2025-11-09T20:47:02.087Z" },
309
+ { url = "https://files.pythonhosted.org/packages/10/c1/40c9f7c22f5e6ff715f28113ebaba27ab85f9af2660ad6e1dd6425d14c19/jiter-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2218228a077e784c6c8f1a8e5d6b8cb1dea62ce25811c356364848554b2056cd", size = 320548, upload-time = "2025-11-09T20:47:03.409Z" },
310
+ { url = "https://files.pythonhosted.org/packages/6b/1b/efbb68fe87e7711b00d2cfd1f26bb4bfc25a10539aefeaa7727329ffb9cb/jiter-0.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9354ccaa2982bf2188fd5f57f79f800ef622ec67beb8329903abf6b10da7d423", size = 351915, upload-time = "2025-11-09T20:47:05.171Z" },
311
+ { url = "https://files.pythonhosted.org/packages/15/2d/c06e659888c128ad1e838123d0638f0efad90cc30860cb5f74dd3f2fc0b3/jiter-0.12.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f2607185ea89b4af9a604d4c7ec40e45d3ad03ee66998b031134bc510232bb7", size = 368966, upload-time = "2025-11-09T20:47:06.508Z" },
312
+ { url = "https://files.pythonhosted.org/packages/6b/20/058db4ae5fb07cf6a4ab2e9b9294416f606d8e467fb74c2184b2a1eeacba/jiter-0.12.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a585a5e42d25f2e71db5f10b171f5e5ea641d3aa44f7df745aa965606111cc2", size = 482047, upload-time = "2025-11-09T20:47:08.382Z" },
313
+ { url = "https://files.pythonhosted.org/packages/49/bb/dc2b1c122275e1de2eb12905015d61e8316b2f888bdaac34221c301495d6/jiter-0.12.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd9e21d34edff5a663c631f850edcb786719c960ce887a5661e9c828a53a95d9", size = 380835, upload-time = "2025-11-09T20:47:09.81Z" },
314
+ { url = "https://files.pythonhosted.org/packages/23/7d/38f9cd337575349de16da575ee57ddb2d5a64d425c9367f5ef9e4612e32e/jiter-0.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a612534770470686cd5431478dc5a1b660eceb410abade6b1b74e320ca98de6", size = 364587, upload-time = "2025-11-09T20:47:11.529Z" },
315
+ { url = "https://files.pythonhosted.org/packages/f0/a3/b13e8e61e70f0bb06085099c4e2462647f53cc2ca97614f7fedcaa2bb9f3/jiter-0.12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3985aea37d40a908f887b34d05111e0aae822943796ebf8338877fee2ab67725", size = 390492, upload-time = "2025-11-09T20:47:12.993Z" },
316
+ { url = "https://files.pythonhosted.org/packages/07/71/e0d11422ed027e21422f7bc1883c61deba2d9752b720538430c1deadfbca/jiter-0.12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b1207af186495f48f72529f8d86671903c8c10127cac6381b11dddc4aaa52df6", size = 522046, upload-time = "2025-11-09T20:47:14.6Z" },
317
+ { url = "https://files.pythonhosted.org/packages/9f/59/b968a9aa7102a8375dbbdfbd2aeebe563c7e5dddf0f47c9ef1588a97e224/jiter-0.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef2fb241de583934c9915a33120ecc06d94aa3381a134570f59eed784e87001e", size = 513392, upload-time = "2025-11-09T20:47:16.011Z" },
318
+ { url = "https://files.pythonhosted.org/packages/ca/e4/7df62002499080dbd61b505c5cb351aa09e9959d176cac2aa8da6f93b13b/jiter-0.12.0-cp311-cp311-win32.whl", hash = "sha256:453b6035672fecce8007465896a25b28a6b59cfe8fbc974b2563a92f5a92a67c", size = 206096, upload-time = "2025-11-09T20:47:17.344Z" },
319
+ { url = "https://files.pythonhosted.org/packages/bb/60/1032b30ae0572196b0de0e87dce3b6c26a1eff71aad5fe43dee3082d32e0/jiter-0.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:ca264b9603973c2ad9435c71a8ec8b49f8f715ab5ba421c85a51cde9887e421f", size = 204899, upload-time = "2025-11-09T20:47:19.365Z" },
320
+ { url = "https://files.pythonhosted.org/packages/49/d5/c145e526fccdb834063fb45c071df78b0cc426bbaf6de38b0781f45d956f/jiter-0.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:cb00ef392e7d684f2754598c02c409f376ddcef857aae796d559e6cacc2d78a5", size = 188070, upload-time = "2025-11-09T20:47:20.75Z" },
321
+ { url = "https://files.pythonhosted.org/packages/92/c9/5b9f7b4983f1b542c64e84165075335e8a236fa9e2ea03a0c79780062be8/jiter-0.12.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:305e061fa82f4680607a775b2e8e0bcb071cd2205ac38e6ef48c8dd5ebe1cf37", size = 314449, upload-time = "2025-11-09T20:47:22.999Z" },
322
+ { url = "https://files.pythonhosted.org/packages/98/6e/e8efa0e78de00db0aee82c0cf9e8b3f2027efd7f8a71f859d8f4be8e98ef/jiter-0.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c1860627048e302a528333c9307c818c547f214d8659b0705d2195e1a94b274", size = 319855, upload-time = "2025-11-09T20:47:24.779Z" },
323
+ { url = "https://files.pythonhosted.org/packages/20/26/894cd88e60b5d58af53bec5c6759d1292bd0b37a8b5f60f07abf7a63ae5f/jiter-0.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df37577a4f8408f7e0ec3205d2a8f87672af8f17008358063a4d6425b6081ce3", size = 350171, upload-time = "2025-11-09T20:47:26.469Z" },
324
+ { url = "https://files.pythonhosted.org/packages/f5/27/a7b818b9979ac31b3763d25f3653ec3a954044d5e9f5d87f2f247d679fd1/jiter-0.12.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:75fdd787356c1c13a4f40b43c2156276ef7a71eb487d98472476476d803fb2cf", size = 365590, upload-time = "2025-11-09T20:47:27.918Z" },
325
+ { url = "https://files.pythonhosted.org/packages/ba/7e/e46195801a97673a83746170b17984aa8ac4a455746354516d02ca5541b4/jiter-0.12.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1eb5db8d9c65b112aacf14fcd0faae9913d07a8afea5ed06ccdd12b724e966a1", size = 479462, upload-time = "2025-11-09T20:47:29.654Z" },
326
+ { url = "https://files.pythonhosted.org/packages/ca/75/f833bfb009ab4bd11b1c9406d333e3b4357709ed0570bb48c7c06d78c7dd/jiter-0.12.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73c568cc27c473f82480abc15d1301adf333a7ea4f2e813d6a2c7d8b6ba8d0df", size = 378983, upload-time = "2025-11-09T20:47:31.026Z" },
327
+ { url = "https://files.pythonhosted.org/packages/71/b3/7a69d77943cc837d30165643db753471aff5df39692d598da880a6e51c24/jiter-0.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4321e8a3d868919bcb1abb1db550d41f2b5b326f72df29e53b2df8b006eb9403", size = 361328, upload-time = "2025-11-09T20:47:33.286Z" },
328
+ { url = "https://files.pythonhosted.org/packages/b0/ac/a78f90caf48d65ba70d8c6efc6f23150bc39dc3389d65bbec2a95c7bc628/jiter-0.12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a51bad79f8cc9cac2b4b705039f814049142e0050f30d91695a2d9a6611f126", size = 386740, upload-time = "2025-11-09T20:47:34.703Z" },
329
+ { url = "https://files.pythonhosted.org/packages/39/b6/5d31c2cc8e1b6a6bcf3c5721e4ca0a3633d1ab4754b09bc7084f6c4f5327/jiter-0.12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2a67b678f6a5f1dd6c36d642d7db83e456bc8b104788262aaefc11a22339f5a9", size = 520875, upload-time = "2025-11-09T20:47:36.058Z" },
330
+ { url = "https://files.pythonhosted.org/packages/30/b5/4df540fae4e9f68c54b8dab004bd8c943a752f0b00efd6e7d64aa3850339/jiter-0.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efe1a211fe1fd14762adea941e3cfd6c611a136e28da6c39272dbb7a1bbe6a86", size = 511457, upload-time = "2025-11-09T20:47:37.932Z" },
331
+ { url = "https://files.pythonhosted.org/packages/07/65/86b74010e450a1a77b2c1aabb91d4a91dd3cd5afce99f34d75fd1ac64b19/jiter-0.12.0-cp312-cp312-win32.whl", hash = "sha256:d779d97c834b4278276ec703dc3fc1735fca50af63eb7262f05bdb4e62203d44", size = 204546, upload-time = "2025-11-09T20:47:40.47Z" },
332
+ { url = "https://files.pythonhosted.org/packages/1c/c7/6659f537f9562d963488e3e55573498a442503ced01f7e169e96a6110383/jiter-0.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e8269062060212b373316fe69236096aaf4c49022d267c6736eebd66bbbc60bb", size = 205196, upload-time = "2025-11-09T20:47:41.794Z" },
333
+ { url = "https://files.pythonhosted.org/packages/21/f4/935304f5169edadfec7f9c01eacbce4c90bb9a82035ac1de1f3bd2d40be6/jiter-0.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:06cb970936c65de926d648af0ed3d21857f026b1cf5525cb2947aa5e01e05789", size = 186100, upload-time = "2025-11-09T20:47:43.007Z" },
334
+ { url = "https://files.pythonhosted.org/packages/3d/a6/97209693b177716e22576ee1161674d1d58029eb178e01866a0422b69224/jiter-0.12.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6cc49d5130a14b732e0612bc76ae8db3b49898732223ef8b7599aa8d9810683e", size = 313658, upload-time = "2025-11-09T20:47:44.424Z" },
335
+ { url = "https://files.pythonhosted.org/packages/06/4d/125c5c1537c7d8ee73ad3d530a442d6c619714b95027143f1b61c0b4dfe0/jiter-0.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:37f27a32ce36364d2fa4f7fdc507279db604d27d239ea2e044c8f148410defe1", size = 318605, upload-time = "2025-11-09T20:47:45.973Z" },
336
+ { url = "https://files.pythonhosted.org/packages/99/bf/a840b89847885064c41a5f52de6e312e91fa84a520848ee56c97e4fa0205/jiter-0.12.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbc0944aa3d4b4773e348cda635252824a78f4ba44328e042ef1ff3f6080d1cf", size = 349803, upload-time = "2025-11-09T20:47:47.535Z" },
337
+ { url = "https://files.pythonhosted.org/packages/8a/88/e63441c28e0db50e305ae23e19c1d8fae012d78ed55365da392c1f34b09c/jiter-0.12.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:da25c62d4ee1ffbacb97fac6dfe4dcd6759ebdc9015991e92a6eae5816287f44", size = 365120, upload-time = "2025-11-09T20:47:49.284Z" },
338
+ { url = "https://files.pythonhosted.org/packages/0a/7c/49b02714af4343970eb8aca63396bc1c82fa01197dbb1e9b0d274b550d4e/jiter-0.12.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:048485c654b838140b007390b8182ba9774621103bd4d77c9c3f6f117474ba45", size = 479918, upload-time = "2025-11-09T20:47:50.807Z" },
339
+ { url = "https://files.pythonhosted.org/packages/69/ba/0a809817fdd5a1db80490b9150645f3aae16afad166960bcd562be194f3b/jiter-0.12.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:635e737fbb7315bef0037c19b88b799143d2d7d3507e61a76751025226b3ac87", size = 379008, upload-time = "2025-11-09T20:47:52.211Z" },
340
+ { url = "https://files.pythonhosted.org/packages/5f/c3/c9fc0232e736c8877d9e6d83d6eeb0ba4e90c6c073835cc2e8f73fdeef51/jiter-0.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e017c417b1ebda911bd13b1e40612704b1f5420e30695112efdbed8a4b389ed", size = 361785, upload-time = "2025-11-09T20:47:53.512Z" },
341
+ { url = "https://files.pythonhosted.org/packages/96/61/61f69b7e442e97ca6cd53086ddc1cf59fb830549bc72c0a293713a60c525/jiter-0.12.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:89b0bfb8b2bf2351fba36bb211ef8bfceba73ef58e7f0c68fb67b5a2795ca2f9", size = 386108, upload-time = "2025-11-09T20:47:54.893Z" },
342
+ { url = "https://files.pythonhosted.org/packages/e9/2e/76bb3332f28550c8f1eba3bf6e5efe211efda0ddbbaf24976bc7078d42a5/jiter-0.12.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:f5aa5427a629a824a543672778c9ce0c5e556550d1569bb6ea28a85015287626", size = 519937, upload-time = "2025-11-09T20:47:56.253Z" },
343
+ { url = "https://files.pythonhosted.org/packages/84/d6/fa96efa87dc8bff2094fb947f51f66368fa56d8d4fc9e77b25d7fbb23375/jiter-0.12.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed53b3d6acbcb0fd0b90f20c7cb3b24c357fe82a3518934d4edfa8c6898e498c", size = 510853, upload-time = "2025-11-09T20:47:58.32Z" },
344
+ { url = "https://files.pythonhosted.org/packages/8a/28/93f67fdb4d5904a708119a6ab58a8f1ec226ff10a94a282e0215402a8462/jiter-0.12.0-cp313-cp313-win32.whl", hash = "sha256:4747de73d6b8c78f2e253a2787930f4fffc68da7fa319739f57437f95963c4de", size = 204699, upload-time = "2025-11-09T20:47:59.686Z" },
345
+ { url = "https://files.pythonhosted.org/packages/c4/1f/30b0eb087045a0abe2a5c9c0c0c8da110875a1d3be83afd4a9a4e548be3c/jiter-0.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:e25012eb0c456fcc13354255d0338cd5397cce26c77b2832b3c4e2e255ea5d9a", size = 204258, upload-time = "2025-11-09T20:48:01.01Z" },
346
+ { url = "https://files.pythonhosted.org/packages/2c/f4/2b4daf99b96bce6fc47971890b14b2a36aef88d7beb9f057fafa032c6141/jiter-0.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:c97b92c54fe6110138c872add030a1f99aea2401ddcdaa21edf74705a646dd60", size = 185503, upload-time = "2025-11-09T20:48:02.35Z" },
347
+ { url = "https://files.pythonhosted.org/packages/39/ca/67bb15a7061d6fe20b9b2a2fd783e296a1e0f93468252c093481a2f00efa/jiter-0.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:53839b35a38f56b8be26a7851a48b89bc47e5d88e900929df10ed93b95fea3d6", size = 317965, upload-time = "2025-11-09T20:48:03.783Z" },
348
+ { url = "https://files.pythonhosted.org/packages/18/af/1788031cd22e29c3b14bc6ca80b16a39a0b10e611367ffd480c06a259831/jiter-0.12.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94f669548e55c91ab47fef8bddd9c954dab1938644e715ea49d7e117015110a4", size = 345831, upload-time = "2025-11-09T20:48:05.55Z" },
349
+ { url = "https://files.pythonhosted.org/packages/05/17/710bf8472d1dff0d3caf4ced6031060091c1320f84ee7d5dcbed1f352417/jiter-0.12.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:351d54f2b09a41600ffea43d081522d792e81dcfb915f6d2d242744c1cc48beb", size = 361272, upload-time = "2025-11-09T20:48:06.951Z" },
350
+ { url = "https://files.pythonhosted.org/packages/fb/f1/1dcc4618b59761fef92d10bcbb0b038b5160be653b003651566a185f1a5c/jiter-0.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2a5e90604620f94bf62264e7c2c038704d38217b7465b863896c6d7c902b06c7", size = 204604, upload-time = "2025-11-09T20:48:08.328Z" },
351
+ { url = "https://files.pythonhosted.org/packages/d9/32/63cb1d9f1c5c6632a783c0052cde9ef7ba82688f7065e2f0d5f10a7e3edb/jiter-0.12.0-cp313-cp313t-win_arm64.whl", hash = "sha256:88ef757017e78d2860f96250f9393b7b577b06a956ad102c29c8237554380db3", size = 185628, upload-time = "2025-11-09T20:48:09.572Z" },
352
+ { url = "https://files.pythonhosted.org/packages/a8/99/45c9f0dbe4a1416b2b9a8a6d1236459540f43d7fb8883cff769a8db0612d/jiter-0.12.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c46d927acd09c67a9fb1416df45c5a04c27e83aae969267e98fba35b74e99525", size = 312478, upload-time = "2025-11-09T20:48:10.898Z" },
353
+ { url = "https://files.pythonhosted.org/packages/4c/a7/54ae75613ba9e0f55fcb0bc5d1f807823b5167cc944e9333ff322e9f07dd/jiter-0.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:774ff60b27a84a85b27b88cd5583899c59940bcc126caca97eb2a9df6aa00c49", size = 318706, upload-time = "2025-11-09T20:48:12.266Z" },
354
+ { url = "https://files.pythonhosted.org/packages/59/31/2aa241ad2c10774baf6c37f8b8e1f39c07db358f1329f4eb40eba179c2a2/jiter-0.12.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5433fab222fb072237df3f637d01b81f040a07dcac1cb4a5c75c7aa9ed0bef1", size = 351894, upload-time = "2025-11-09T20:48:13.673Z" },
355
+ { url = "https://files.pythonhosted.org/packages/54/4f/0f2759522719133a9042781b18cc94e335b6d290f5e2d3e6899d6af933e3/jiter-0.12.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8c593c6e71c07866ec6bfb790e202a833eeec885022296aff6b9e0b92d6a70e", size = 365714, upload-time = "2025-11-09T20:48:15.083Z" },
356
+ { url = "https://files.pythonhosted.org/packages/dc/6f/806b895f476582c62a2f52c453151edd8a0fde5411b0497baaa41018e878/jiter-0.12.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:90d32894d4c6877a87ae00c6b915b609406819dce8bc0d4e962e4de2784e567e", size = 478989, upload-time = "2025-11-09T20:48:16.706Z" },
357
+ { url = "https://files.pythonhosted.org/packages/86/6c/012d894dc6e1033acd8db2b8346add33e413ec1c7c002598915278a37f79/jiter-0.12.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:798e46eed9eb10c3adbbacbd3bdb5ecd4cf7064e453d00dbef08802dae6937ff", size = 378615, upload-time = "2025-11-09T20:48:18.614Z" },
358
+ { url = "https://files.pythonhosted.org/packages/87/30/d718d599f6700163e28e2c71c0bbaf6dace692e7df2592fd793ac9276717/jiter-0.12.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3f1368f0a6719ea80013a4eb90ba72e75d7ea67cfc7846db2ca504f3df0169a", size = 364745, upload-time = "2025-11-09T20:48:20.117Z" },
359
+ { url = "https://files.pythonhosted.org/packages/8f/85/315b45ce4b6ddc7d7fceca24068543b02bdc8782942f4ee49d652e2cc89f/jiter-0.12.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65f04a9d0b4406f7e51279710b27484af411896246200e461d80d3ba0caa901a", size = 386502, upload-time = "2025-11-09T20:48:21.543Z" },
360
+ { url = "https://files.pythonhosted.org/packages/74/0b/ce0434fb40c5b24b368fe81b17074d2840748b4952256bab451b72290a49/jiter-0.12.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:fd990541982a24281d12b67a335e44f117e4c6cbad3c3b75c7dea68bf4ce3a67", size = 519845, upload-time = "2025-11-09T20:48:22.964Z" },
361
+ { url = "https://files.pythonhosted.org/packages/e8/a3/7a7a4488ba052767846b9c916d208b3ed114e3eb670ee984e4c565b9cf0d/jiter-0.12.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:b111b0e9152fa7df870ecaebb0bd30240d9f7fff1f2003bcb4ed0f519941820b", size = 510701, upload-time = "2025-11-09T20:48:24.483Z" },
362
+ { url = "https://files.pythonhosted.org/packages/c3/16/052ffbf9d0467b70af24e30f91e0579e13ded0c17bb4a8eb2aed3cb60131/jiter-0.12.0-cp314-cp314-win32.whl", hash = "sha256:a78befb9cc0a45b5a5a0d537b06f8544c2ebb60d19d02c41ff15da28a9e22d42", size = 205029, upload-time = "2025-11-09T20:48:25.749Z" },
363
+ { url = "https://files.pythonhosted.org/packages/e4/18/3cf1f3f0ccc789f76b9a754bdb7a6977e5d1d671ee97a9e14f7eb728d80e/jiter-0.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:e1fe01c082f6aafbe5c8faf0ff074f38dfb911d53f07ec333ca03f8f6226debf", size = 204960, upload-time = "2025-11-09T20:48:27.415Z" },
364
+ { url = "https://files.pythonhosted.org/packages/02/68/736821e52ecfdeeb0f024b8ab01b5a229f6b9293bbdb444c27efade50b0f/jiter-0.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:d72f3b5a432a4c546ea4bedc84cce0c3404874f1d1676260b9c7f048a9855451", size = 185529, upload-time = "2025-11-09T20:48:29.125Z" },
365
+ { url = "https://files.pythonhosted.org/packages/30/61/12ed8ee7a643cce29ac97c2281f9ce3956eb76b037e88d290f4ed0d41480/jiter-0.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e6ded41aeba3603f9728ed2b6196e4df875348ab97b28fc8afff115ed42ba7a7", size = 318974, upload-time = "2025-11-09T20:48:30.87Z" },
366
+ { url = "https://files.pythonhosted.org/packages/2d/c6/f3041ede6d0ed5e0e79ff0de4c8f14f401bbf196f2ef3971cdbe5fd08d1d/jiter-0.12.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a947920902420a6ada6ad51892082521978e9dd44a802663b001436e4b771684", size = 345932, upload-time = "2025-11-09T20:48:32.658Z" },
367
+ { url = "https://files.pythonhosted.org/packages/d5/5d/4d94835889edd01ad0e2dbfc05f7bdfaed46292e7b504a6ac7839aa00edb/jiter-0.12.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:add5e227e0554d3a52cf390a7635edaffdf4f8fce4fdbcef3cc2055bb396a30c", size = 367243, upload-time = "2025-11-09T20:48:34.093Z" },
368
+ { url = "https://files.pythonhosted.org/packages/fd/76/0051b0ac2816253a99d27baf3dda198663aff882fa6ea7deeb94046da24e/jiter-0.12.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f9b1cda8fcb736250d7e8711d4580ebf004a46771432be0ae4796944b5dfa5d", size = 479315, upload-time = "2025-11-09T20:48:35.507Z" },
369
+ { url = "https://files.pythonhosted.org/packages/70/ae/83f793acd68e5cb24e483f44f482a1a15601848b9b6f199dacb970098f77/jiter-0.12.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deeb12a2223fe0135c7ff1356a143d57f95bbf1f4a66584f1fc74df21d86b993", size = 380714, upload-time = "2025-11-09T20:48:40.014Z" },
370
+ { url = "https://files.pythonhosted.org/packages/b1/5e/4808a88338ad2c228b1126b93fcd8ba145e919e886fe910d578230dabe3b/jiter-0.12.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c596cc0f4cb574877550ce4ecd51f8037469146addd676d7c1a30ebe6391923f", size = 365168, upload-time = "2025-11-09T20:48:41.462Z" },
371
+ { url = "https://files.pythonhosted.org/packages/0c/d4/04619a9e8095b42aef436b5aeb4c0282b4ff1b27d1db1508df9f5dc82750/jiter-0.12.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ab4c823b216a4aeab3fdbf579c5843165756bd9ad87cc6b1c65919c4715f783", size = 387893, upload-time = "2025-11-09T20:48:42.921Z" },
372
+ { url = "https://files.pythonhosted.org/packages/17/ea/d3c7e62e4546fdc39197fa4a4315a563a89b95b6d54c0d25373842a59cbe/jiter-0.12.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:e427eee51149edf962203ff8db75a7514ab89be5cb623fb9cea1f20b54f1107b", size = 520828, upload-time = "2025-11-09T20:48:44.278Z" },
373
+ { url = "https://files.pythonhosted.org/packages/cc/0b/c6d3562a03fd767e31cb119d9041ea7958c3c80cb3d753eafb19b3b18349/jiter-0.12.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:edb868841f84c111255ba5e80339d386d937ec1fdce419518ce1bd9370fac5b6", size = 511009, upload-time = "2025-11-09T20:48:45.726Z" },
374
+ { url = "https://files.pythonhosted.org/packages/aa/51/2cb4468b3448a8385ebcd15059d325c9ce67df4e2758d133ab9442b19834/jiter-0.12.0-cp314-cp314t-win32.whl", hash = "sha256:8bbcfe2791dfdb7c5e48baf646d37a6a3dcb5a97a032017741dea9f817dca183", size = 205110, upload-time = "2025-11-09T20:48:47.033Z" },
375
+ { url = "https://files.pythonhosted.org/packages/b2/c5/ae5ec83dec9c2d1af805fd5fe8f74ebded9c8670c5210ec7820ce0dbeb1e/jiter-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2fa940963bf02e1d8226027ef461e36af472dea85d36054ff835aeed944dd873", size = 205223, upload-time = "2025-11-09T20:48:49.076Z" },
376
+ { url = "https://files.pythonhosted.org/packages/97/9a/3c5391907277f0e55195550cf3fa8e293ae9ee0c00fb402fec1e38c0c82f/jiter-0.12.0-cp314-cp314t-win_arm64.whl", hash = "sha256:506c9708dd29b27288f9f8f1140c3cb0e3d8ddb045956d7757b1fa0e0f39a473", size = 185564, upload-time = "2025-11-09T20:48:50.376Z" },
377
+ { url = "https://files.pythonhosted.org/packages/fe/54/5339ef1ecaa881c6948669956567a64d2670941925f245c434f494ffb0e5/jiter-0.12.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:4739a4657179ebf08f85914ce50332495811004cc1747852e8b2041ed2aab9b8", size = 311144, upload-time = "2025-11-09T20:49:10.503Z" },
378
+ { url = "https://files.pythonhosted.org/packages/27/74/3446c652bffbd5e81ab354e388b1b5fc1d20daac34ee0ed11ff096b1b01a/jiter-0.12.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:41da8def934bf7bec16cb24bd33c0ca62126d2d45d81d17b864bd5ad721393c3", size = 305877, upload-time = "2025-11-09T20:49:12.269Z" },
379
+ { url = "https://files.pythonhosted.org/packages/a1/f4/ed76ef9043450f57aac2d4fbeb27175aa0eb9c38f833be6ef6379b3b9a86/jiter-0.12.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c44ee814f499c082e69872d426b624987dbc5943ab06e9bbaa4f81989fdb79e", size = 340419, upload-time = "2025-11-09T20:49:13.803Z" },
380
+ { url = "https://files.pythonhosted.org/packages/21/01/857d4608f5edb0664aa791a3d45702e1a5bcfff9934da74035e7b9803846/jiter-0.12.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd2097de91cf03eaa27b3cbdb969addf83f0179c6afc41bbc4513705e013c65d", size = 347212, upload-time = "2025-11-09T20:49:15.643Z" },
381
+ { url = "https://files.pythonhosted.org/packages/cb/f5/12efb8ada5f5c9edc1d4555fe383c1fb2eac05ac5859258a72d61981d999/jiter-0.12.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:e8547883d7b96ef2e5fe22b88f8a4c8725a56e7f4abafff20fd5272d634c7ecb", size = 309974, upload-time = "2025-11-09T20:49:17.187Z" },
382
+ { url = "https://files.pythonhosted.org/packages/85/15/d6eb3b770f6a0d332675141ab3962fd4a7c270ede3515d9f3583e1d28276/jiter-0.12.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:89163163c0934854a668ed783a2546a0617f71706a2551a4a0666d91ab365d6b", size = 304233, upload-time = "2025-11-09T20:49:18.734Z" },
383
+ { url = "https://files.pythonhosted.org/packages/8c/3e/e7e06743294eea2cf02ced6aa0ff2ad237367394e37a0e2b4a1108c67a36/jiter-0.12.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d96b264ab7d34bbb2312dedc47ce07cd53f06835eacbc16dde3761f47c3a9e7f", size = 338537, upload-time = "2025-11-09T20:49:20.317Z" },
384
+ { url = "https://files.pythonhosted.org/packages/2f/9c/6753e6522b8d0ef07d3a3d239426669e984fb0eba15a315cdbc1253904e4/jiter-0.12.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24e864cb30ab82311c6425655b0cdab0a98c5d973b065c66a3f020740c2324c", size = 346110, upload-time = "2025-11-09T20:49:21.817Z" },
385
+ ]
386
+
281
387
  [[package]]
282
388
  name = "markdown-it-py"
283
389
  version = "4.0.0"
@@ -397,27 +503,28 @@ sdist = { url = "https://files.pythonhosted.org/packages/28/fa/b2ba8229b9381e8f6
397
503
 
398
504
  [[package]]
399
505
  name = "oagi"
400
- version = "0.12.0"
506
+ version = "0.13.0"
401
507
  source = { editable = "." }
402
508
  dependencies = [
403
509
  { name = "oagi-core", extra = ["desktop", "server"] },
404
510
  ]
405
511
 
406
512
  [package.metadata]
407
- requires-dist = [{ name = "oagi-core", extras = ["desktop", "server"], specifier = "==0.11.0" }]
513
+ requires-dist = [{ name = "oagi-core", extras = ["desktop", "server"], specifier = "==0.12.1" }]
408
514
 
409
515
  [[package]]
410
516
  name = "oagi-core"
411
- version = "0.11.0"
517
+ version = "0.12.1"
412
518
  source = { registry = "https://pypi.org/simple" }
413
519
  dependencies = [
414
520
  { name = "httpx" },
521
+ { name = "openai" },
415
522
  { name = "pydantic" },
416
523
  { name = "rich" },
417
524
  ]
418
- sdist = { url = "https://files.pythonhosted.org/packages/aa/ea/dab8d3e9eb7cf98de7aa5cc993a76ee3bd082e9ba78c09256f6f2a1e06ae/oagi_core-0.11.0.tar.gz", hash = "sha256:b8e0a78b7d6253ba969ffc8256d6f5cbea226d0fedc28935664875c12b8a391a", size = 273296, upload-time = "2025-12-01T09:33:52.654Z" }
525
+ sdist = { url = "https://files.pythonhosted.org/packages/f8/70/0977d856ebfb2af41b1d4804f902ef1f8b929de6663ea9a97d879051a6da/oagi_core-0.12.1.tar.gz", hash = "sha256:d04a73849709833b16c55e24edc06f8f17a58d3389ef8849a66c9d7e93183863", size = 297360, upload-time = "2025-12-17T06:46:59.237Z" }
419
526
  wheels = [
420
- { url = "https://files.pythonhosted.org/packages/5a/b8/6c9a2f0d5295c66875d2c7dd5d3057c6d71b468baea3737a3a7c1153e0f6/oagi_core-0.11.0-py3-none-any.whl", hash = "sha256:59e47e6e6f2fff30665d748dcf0afde5a84c8da1529ed4da4e3d96803d4005d6", size = 94638, upload-time = "2025-12-01T09:33:51.435Z" },
527
+ { url = "https://files.pythonhosted.org/packages/0b/4c/29d774abb3b1dc1cff021021a941caa2926fffd1b9effd0845e9b1fb5afd/oagi_core-0.12.1-py3-none-any.whl", hash = "sha256:32d7638c701990e42d1d4e3c6cee6530b99aed61eea2d36eb5bba1d6cb12ff38", size = 100565, upload-time = "2025-12-17T06:46:57.868Z" },
421
528
  ]
422
529
 
423
530
  [package.optional-dependencies]
@@ -434,6 +541,25 @@ server = [
434
541
  { name = "uvicorn", extra = ["standard"] },
435
542
  ]
436
543
 
544
+ [[package]]
545
+ name = "openai"
546
+ version = "2.13.0"
547
+ source = { registry = "https://pypi.org/simple" }
548
+ dependencies = [
549
+ { name = "anyio" },
550
+ { name = "distro" },
551
+ { name = "httpx" },
552
+ { name = "jiter" },
553
+ { name = "pydantic" },
554
+ { name = "sniffio" },
555
+ { name = "tqdm" },
556
+ { name = "typing-extensions" },
557
+ ]
558
+ sdist = { url = "https://files.pythonhosted.org/packages/0f/39/8e347e9fda125324d253084bb1b82407e5e3c7777a03dc398f79b2d95626/openai-2.13.0.tar.gz", hash = "sha256:9ff633b07a19469ec476b1e2b5b26c5ef700886524a7a72f65e6f0b5203142d5", size = 626583, upload-time = "2025-12-16T18:19:44.387Z" }
559
+ wheels = [
560
+ { url = "https://files.pythonhosted.org/packages/bb/d5/eb52edff49d3d5ea116e225538c118699ddeb7c29fa17ec28af14bc10033/openai-2.13.0-py3-none-any.whl", hash = "sha256:746521065fed68df2f9c2d85613bb50844343ea81f60009b60e6a600c9352c79", size = 1066837, upload-time = "2025-12-16T18:19:43.124Z" },
561
+ ]
562
+
437
563
  [[package]]
438
564
  name = "pillow"
439
565
  version = "12.0.0"
@@ -1225,6 +1351,18 @@ wheels = [
1225
1351
  { url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", size = 14408, upload-time = "2025-10-08T22:01:46.04Z" },
1226
1352
  ]
1227
1353
 
1354
+ [[package]]
1355
+ name = "tqdm"
1356
+ version = "4.67.1"
1357
+ source = { registry = "https://pypi.org/simple" }
1358
+ dependencies = [
1359
+ { name = "colorama", marker = "sys_platform == 'win32'" },
1360
+ ]
1361
+ sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" }
1362
+ wheels = [
1363
+ { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" },
1364
+ ]
1365
+
1228
1366
  [[package]]
1229
1367
  name = "typer"
1230
1368
  version = "0.20.0"
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "oagi-core"
7
- version = "0.12.0"
7
+ version = "0.13.0"
8
8
  description = "Official API of OpenAGI Foundation"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -33,6 +33,7 @@ desktop = [
33
33
  "pyautogui>=0.9.54",
34
34
  "pyobjc-framework-Quartz>=8.0; sys_platform == 'darwin'",
35
35
  "pyobjc-framework-ApplicationServices>=8.0; sys_platform == 'darwin'",
36
+ "screeninfo>=0.8.1"
36
37
  ]
37
38
  server = [
38
39
  "fastapi[standard]>=0.100.0",
@@ -6,8 +6,11 @@
6
6
  # Licensed under the MIT License.
7
7
  # -----------------------------------------------------------------------------
8
8
  import importlib
9
+ import importlib.metadata
9
10
  from typing import TYPE_CHECKING
10
11
 
12
+ __version__ = importlib.metadata.version("oagi-core")
13
+
11
14
  from oagi.actor import Actor, AsyncActor, AsyncShortTask, AsyncTask, ShortTask, Task
12
15
  from oagi.client import AsyncClient, SyncClient
13
16
  from oagi.exceptions import (
@@ -62,6 +65,22 @@ _LAZY_IMPORTS_DATA: dict[str, tuple[str, str | None, str | None]] = {
62
65
  "create_app": ("oagi.server.main", "socketio", "server"),
63
66
  "ServerConfig": ("oagi.server.config", "pydantic_settings", "server"),
64
67
  "sio": ("oagi.server.socketio_server", "socketio", "server"),
68
+ # Wayland handlers
69
+ "AsyncYdotoolActionHandler": (
70
+ "oagi.handler.async_ydotool_action_handler",
71
+ "screeninfo",
72
+ "desktop",
73
+ ),
74
+ "YdotoolActionHandler": (
75
+ "oagi.handler.ydotool_action_handler",
76
+ "screeninfo",
77
+ "desktop",
78
+ ),
79
+ "YdotoolConfig": (
80
+ "oagi.handler.ydotool_action_handler",
81
+ "screeninfo",
82
+ "desktop",
83
+ ),
65
84
  }
66
85
 
67
86
  if TYPE_CHECKING:
@@ -70,12 +89,14 @@ if TYPE_CHECKING:
70
89
  from oagi.agent.tasker import TaskerAgent
71
90
  from oagi.handler.async_pyautogui_action_handler import AsyncPyautoguiActionHandler
72
91
  from oagi.handler.async_screenshot_maker import AsyncScreenshotMaker
92
+ from oagi.handler.async_ydotool_action_handler import AsyncYdotoolActionHandler
73
93
  from oagi.handler.pil_image import PILImage
74
94
  from oagi.handler.pyautogui_action_handler import (
75
95
  PyautoguiActionHandler,
76
96
  PyautoguiConfig,
77
97
  )
78
98
  from oagi.handler.screenshot_maker import ScreenshotMaker
99
+ from oagi.handler.ydotool_action_handler import YdotoolActionHandler, YdotoolConfig
79
100
  from oagi.server.config import ServerConfig
80
101
  from oagi.server.main import create_app
81
102
  from oagi.server.socketio_server import sio
@@ -98,6 +119,8 @@ def __dir__() -> list[str]:
98
119
 
99
120
 
100
121
  __all__ = [
122
+ # Version
123
+ "__version__",
101
124
  # Core sync classes
102
125
  "Actor",
103
126
  "AsyncActor",
@@ -143,4 +166,8 @@ __all__ = [
143
166
  "create_app",
144
167
  "ServerConfig",
145
168
  "sio",
169
+ # Lazy imports - Wayland handler classes
170
+ "AsyncYdotoolActionHandler",
171
+ "YdotoolActionHandler",
172
+ "YdotoolConfig",
146
173
  ]
@@ -16,7 +16,7 @@ from ..constants import (
16
16
  DEFAULT_TEMPERATURE,
17
17
  MODEL_ACTOR,
18
18
  )
19
- from ..handler import reset_handler
19
+ from ..handler.utils import reset_handler
20
20
  from ..types import (
21
21
  ActionEvent,
22
22
  AsyncActionHandler,
@@ -19,7 +19,7 @@ from oagi.constants import (
19
19
  DEFAULT_TEMPERATURE,
20
20
  MODEL_ACTOR,
21
21
  )
22
- from oagi.handler import reset_handler
22
+ from oagi.handler.utils import reset_handler
23
23
  from oagi.types import (
24
24
  URL,
25
25
  ActionEvent,
@@ -16,7 +16,7 @@ from oagi.constants import (
16
16
  DEFAULT_TEMPERATURE,
17
17
  MODEL_ACTOR,
18
18
  )
19
- from oagi.handler import reset_handler
19
+ from oagi.handler.utils import reset_handler
20
20
  from oagi.types import AsyncActionHandler, AsyncImageProvider, AsyncObserver, SplitEvent
21
21
 
22
22
  from ..protocol import AsyncAgent
@@ -206,14 +206,25 @@ def _warn_missing_permissions() -> None:
206
206
 
207
207
  def run_agent(args: argparse.Namespace) -> None:
208
208
  # Check if desktop extras are installed
209
- check_optional_dependency("pyautogui", "Agent execution", "desktop")
210
209
  check_optional_dependency("PIL", "Agent execution", "desktop")
211
210
 
212
- # Warn about missing macOS permissions (non-blocking)
213
- _warn_missing_permissions()
214
-
215
- from oagi import AsyncPyautoguiActionHandler, AsyncScreenshotMaker # noqa: PLC0415
211
+ from oagi import AsyncScreenshotMaker # noqa: PLC0415
216
212
  from oagi.agent import create_agent # noqa: PLC0415
213
+ from oagi.handler.wayland_support import is_wayland_display_server # noqa: PLC0415
214
+
215
+ # Select appropriate action handler based on display server
216
+ if is_wayland_display_server():
217
+ check_optional_dependency("screeninfo", "Agent execution (Wayland)", "desktop")
218
+ from oagi import AsyncYdotoolActionHandler # noqa: PLC0415
219
+
220
+ action_handler = AsyncYdotoolActionHandler()
221
+ else:
222
+ check_optional_dependency("pyautogui", "Agent execution", "desktop")
223
+ # Warn about missing macOS permissions (non-blocking)
224
+ _warn_missing_permissions()
225
+ from oagi import AsyncPyautoguiActionHandler # noqa: PLC0415
226
+
227
+ action_handler = AsyncPyautoguiActionHandler()
217
228
 
218
229
  # Get configuration
219
230
  api_key = args.oagi_api_key or os.getenv("OAGI_API_KEY")
@@ -266,8 +277,7 @@ def run_agent(args: argparse.Namespace) -> None:
266
277
  # Create agent
267
278
  agent = create_agent(**agent_kwargs)
268
279
 
269
- # Create handlers
270
- action_handler = AsyncPyautoguiActionHandler()
280
+ # Create image provider
271
281
  image_provider = AsyncScreenshotMaker()
272
282
 
273
283
  if args.instruction:
@@ -19,6 +19,7 @@ from ..constants import (
19
19
  HTTP_CLIENT_TIMEOUT,
20
20
  )
21
21
  from ..logging import get_logger
22
+ from ..platform_info import get_sdk_headers
22
23
  from ..types import Image
23
24
  from ..types.models import GenerateResponse, UploadFileResponse, Usage
24
25
  from ..types.models.step import Step
@@ -54,17 +55,21 @@ class AsyncClient(BaseClient[httpx.AsyncClient]):
54
55
  ):
55
56
  super().__init__(base_url, api_key, max_retries)
56
57
 
58
+ # Get SDK headers for all clients
59
+ sdk_headers = get_sdk_headers()
60
+
57
61
  # OpenAI client for chat completions (with retries)
58
62
  self.openai_client = AsyncOpenAI(
59
63
  api_key=self.api_key,
60
64
  base_url=f"{self.base_url}/v1",
61
65
  max_retries=self.max_retries,
66
+ default_headers=sdk_headers,
62
67
  )
63
68
 
64
69
  # httpx clients for S3 uploads and other endpoints (with retries)
65
70
  transport = AsyncHTTPTransport(retries=self.max_retries)
66
71
  self.http_client = httpx.AsyncClient(
67
- transport=transport, base_url=self.base_url
72
+ transport=transport, base_url=self.base_url, headers=sdk_headers
68
73
  )
69
74
  self.upload_client = httpx.AsyncClient(
70
75
  transport=transport, timeout=HTTP_CLIENT_TIMEOUT
@@ -29,6 +29,7 @@ from ..exceptions import (
29
29
  ValidationError,
30
30
  )
31
31
  from ..logging import get_logger
32
+ from ..platform_info import get_sdk_headers
32
33
  from ..types.models import (
33
34
  ErrorResponse,
34
35
  GenerateResponse,
@@ -73,7 +74,7 @@ class BaseClient(Generic[HttpClientT]):
73
74
  logger.info(f"Client initialized with base_url: {self.base_url}")
74
75
 
75
76
  def _build_headers(self, api_version: str | None = None) -> dict[str, str]:
76
- headers: dict[str, str] = {}
77
+ headers = get_sdk_headers()
77
78
  if api_version:
78
79
  headers["x-api-version"] = api_version
79
80
  if self.api_key:
@@ -19,6 +19,7 @@ from ..constants import (
19
19
  HTTP_CLIENT_TIMEOUT,
20
20
  )
21
21
  from ..logging import get_logger
22
+ from ..platform_info import get_sdk_headers
22
23
  from ..types import Image
23
24
  from ..types.models import GenerateResponse, UploadFileResponse, Usage
24
25
  from ..types.models.step import Step
@@ -54,16 +55,22 @@ class SyncClient(BaseClient[httpx.Client]):
54
55
  ):
55
56
  super().__init__(base_url, api_key, max_retries)
56
57
 
58
+ # Get SDK headers for all clients
59
+ sdk_headers = get_sdk_headers()
60
+
57
61
  # OpenAI client for chat completions (with retries)
58
62
  self.openai_client = OpenAI(
59
63
  api_key=self.api_key,
60
64
  base_url=f"{self.base_url}/v1",
61
65
  max_retries=self.max_retries,
66
+ default_headers=sdk_headers,
62
67
  )
63
68
 
64
69
  # httpx clients for S3 uploads and other endpoints (with retries)
65
70
  transport = HTTPTransport(retries=self.max_retries)
66
- self.http_client = httpx.Client(transport=transport, base_url=self.base_url)
71
+ self.http_client = httpx.Client(
72
+ transport=transport, base_url=self.base_url, headers=sdk_headers
73
+ )
67
74
  self.upload_client = httpx.Client(
68
75
  transport=transport, timeout=HTTP_CLIENT_TIMEOUT
69
76
  )