oagi-core 0.13.0__tar.gz → 0.13.2__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.
- {oagi_core-0.13.0 → oagi_core-0.13.2}/PKG-INFO +1 -1
- {oagi_core-0.13.0 → oagi_core-0.13.2}/examples/openai_agent_loop_example.py +3 -3
- {oagi_core-0.13.0 → oagi_core-0.13.2}/metapackage/pyproject.toml +2 -2
- {oagi_core-0.13.0 → oagi_core-0.13.2}/metapackage/uv.lock +34 -5
- {oagi_core-0.13.0 → oagi_core-0.13.2}/pyproject.toml +1 -1
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/actor/base.py +7 -3
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/constants.py +2 -2
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/pyautogui_action_handler.py +17 -4
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_pyautogui_action_handler.py +16 -8
- {oagi_core-0.13.0 → oagi_core-0.13.2}/uv.lock +1 -1
- {oagi_core-0.13.0 → oagi_core-0.13.2}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/.github/workflows/ci.yml +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/.github/workflows/release.yml +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/.gitignore +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/.python-version +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/CONTRIBUTING.md +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/LICENSE +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/Makefile +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/README.md +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/examples/async_google_weather.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/examples/execute_task_auto.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/examples/execute_task_manual.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/examples/google_weather.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/examples/screenshot_with_config.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/examples/tasker_agent_example.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/__init__.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/actor/__init__.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/actor/async_.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/actor/async_short.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/actor/short.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/actor/sync.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/__init__.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/default.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/factories.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/observer/__init__.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/observer/agent_observer.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/observer/events.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/observer/exporters.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/observer/protocol.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/observer/report_template.html +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/protocol.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/registry.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/tasker/__init__.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/tasker/memory.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/tasker/models.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/tasker/planner.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/tasker/taskee_agent.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/tasker/tasker_agent.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/cli/__init__.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/cli/agent.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/cli/display.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/cli/main.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/cli/server.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/cli/tracking.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/cli/utils.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/client/__init__.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/client/async_.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/client/base.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/client/sync.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/exceptions.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/__init__.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/_macos.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/_windows.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/_ydotool.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/async_pyautogui_action_handler.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/async_screenshot_maker.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/async_ydotool_action_handler.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/capslock_manager.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/pil_image.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/screenshot_maker.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/utils.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/wayland_support.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/ydotool_action_handler.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/logging.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/platform_info.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/server/__init__.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/server/agent_wrappers.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/server/config.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/server/main.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/server/models.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/server/session_store.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/server/socketio_server.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/task/__init__.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/__init__.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/action_handler.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/async_action_handler.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/async_image_provider.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/image.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/image_provider.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/models/__init__.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/models/action.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/models/client.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/models/image_config.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/models/step.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/step_observer.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/url.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/utils/__init__.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/utils/output_parser.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/utils/prompt_builder.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/__init__.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/conftest.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_action_parsing.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_actor.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_agent/test_agent_wrappers.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_agent/test_default_agent.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_agent_registry.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_async_actor.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_async_client.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_async_handlers.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_cli.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_logging.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_mac_double_click.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_observer.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_pil_image.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_planner.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_planner_memory.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_screenshot_maker.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_server/__init__.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_server/test_config.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_server/test_session_store.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_server/test_socketio_integration.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_sync_client.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_taskee_agent.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_tasker_agent.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/utils/__init__.py +0 -0
- {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/utils/test_output_parser.py +0 -0
|
@@ -28,10 +28,10 @@ from oagi.utils.output_parser import parse_raw_output
|
|
|
28
28
|
from oagi.utils.prompt_builder import build_prompt
|
|
29
29
|
|
|
30
30
|
DEFAULT_BASE_URL = "https://api.agiopen.org"
|
|
31
|
-
DEFAULT_MODEL = "lux-
|
|
31
|
+
DEFAULT_MODEL = "lux-thinker-1"
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
def agent_loop(task_description: str, max_steps: int =
|
|
34
|
+
def agent_loop(task_description: str, max_steps: int = 100) -> bool:
|
|
35
35
|
"""
|
|
36
36
|
Run an agent loop to complete a task.
|
|
37
37
|
|
|
@@ -114,5 +114,5 @@ if __name__ == "__main__":
|
|
|
114
114
|
# Example task
|
|
115
115
|
task = "Find some shoes on amazon"
|
|
116
116
|
|
|
117
|
-
success = agent_loop(task, max_steps=
|
|
117
|
+
success = agent_loop(task, max_steps=100)
|
|
118
118
|
print(f"\nFinal result: {'Success' if success else 'Failed'}")
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "oagi"
|
|
7
|
-
version = "0.13.
|
|
7
|
+
version = "0.13.2"
|
|
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.13.
|
|
19
|
+
"oagi-core[desktop,server]==0.13.2",
|
|
20
20
|
]
|
|
21
21
|
|
|
22
22
|
[project.urls]
|
|
@@ -79,6 +79,21 @@ 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 = "cython"
|
|
84
|
+
version = "3.2.4"
|
|
85
|
+
source = { registry = "https://pypi.org/simple" }
|
|
86
|
+
sdist = { url = "https://files.pythonhosted.org/packages/91/85/7574c9cd44b69a27210444b6650f6477f56c75fee1b70d7672d3e4166167/cython-3.2.4.tar.gz", hash = "sha256:84226ecd313b233da27dc2eb3601b4f222b8209c3a7216d8733b031da1dc64e6", size = 3280291, upload-time = "2026-01-04T14:14:14.473Z" }
|
|
87
|
+
wheels = [
|
|
88
|
+
{ url = "https://files.pythonhosted.org/packages/a1/10/720e0fb84eab4c927c4dd6b61eb7993f7732dd83d29ba6d73083874eade9/cython-3.2.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02cb0cc0f23b9874ad262d7d2b9560aed9c7e2df07b49b920bda6f2cc9cb505e", size = 2960836, upload-time = "2026-01-04T14:14:51.103Z" },
|
|
89
|
+
{ url = "https://files.pythonhosted.org/packages/85/cc/8f06145ec3efa121c8b1b67f06a640386ddacd77ee3e574da582a21b14ee/cython-3.2.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff9af2134c05e3734064808db95b4dd7341a39af06e8945d05ea358e1741aaed", size = 2953769, upload-time = "2026-01-04T14:15:00.361Z" },
|
|
90
|
+
{ url = "https://files.pythonhosted.org/packages/91/4d/1eb0c7c196a136b1926f4d7f0492a96c6fabd604d77e6cd43b56a3a16d83/cython-3.2.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:64d7f71be3dd6d6d4a4c575bb3a4674ea06d1e1e5e4cd1b9882a2bc40ed3c4c9", size = 2970064, upload-time = "2026-01-04T14:15:08.567Z" },
|
|
91
|
+
{ url = "https://files.pythonhosted.org/packages/18/b5/1cfca43b7d20a0fdb1eac67313d6bb6b18d18897f82dd0f17436bdd2ba7f/cython-3.2.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:28e8075087a59756f2d059273184b8b639fe0f16cf17470bd91c39921bc154e0", size = 2960506, upload-time = "2026-01-04T14:15:16.733Z" },
|
|
92
|
+
{ url = "https://files.pythonhosted.org/packages/ee/d7/3bda3efce0c5c6ce79cc21285dbe6f60369c20364e112f5a506ee8a1b067/cython-3.2.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d4b4fd5332ab093131fa6172e8362f16adef3eac3179fd24bbdc392531cb82fa", size = 2971496, upload-time = "2026-01-04T14:15:25.038Z" },
|
|
93
|
+
{ url = "https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:36bf3f5eb56d5281aafabecbaa6ed288bc11db87547bba4e1e52943ae6961ccf", size = 2875622, upload-time = "2026-01-04T14:15:39.749Z" },
|
|
94
|
+
{ url = "https://files.pythonhosted.org/packages/ff/fa/d3c15189f7c52aaefbaea76fb012119b04b9013f4bf446cb4eb4c26c4e6b/cython-3.2.4-py3-none-any.whl", hash = "sha256:732fc93bc33ae4b14f6afaca663b916c2fdd5dcbfad7114e17fb2434eeaea45c", size = 1257078, upload-time = "2026-01-04T14:14:12.373Z" },
|
|
95
|
+
]
|
|
96
|
+
|
|
82
97
|
[[package]]
|
|
83
98
|
name = "distro"
|
|
84
99
|
version = "1.9.0"
|
|
@@ -503,18 +518,18 @@ sdist = { url = "https://files.pythonhosted.org/packages/28/fa/b2ba8229b9381e8f6
|
|
|
503
518
|
|
|
504
519
|
[[package]]
|
|
505
520
|
name = "oagi"
|
|
506
|
-
version = "0.13.
|
|
521
|
+
version = "0.13.2"
|
|
507
522
|
source = { editable = "." }
|
|
508
523
|
dependencies = [
|
|
509
524
|
{ name = "oagi-core", extra = ["desktop", "server"] },
|
|
510
525
|
]
|
|
511
526
|
|
|
512
527
|
[package.metadata]
|
|
513
|
-
requires-dist = [{ name = "oagi-core", extras = ["desktop", "server"], specifier = "==0.
|
|
528
|
+
requires-dist = [{ name = "oagi-core", extras = ["desktop", "server"], specifier = "==0.13.1" }]
|
|
514
529
|
|
|
515
530
|
[[package]]
|
|
516
531
|
name = "oagi-core"
|
|
517
|
-
version = "0.
|
|
532
|
+
version = "0.13.1"
|
|
518
533
|
source = { registry = "https://pypi.org/simple" }
|
|
519
534
|
dependencies = [
|
|
520
535
|
{ name = "httpx" },
|
|
@@ -522,9 +537,9 @@ dependencies = [
|
|
|
522
537
|
{ name = "pydantic" },
|
|
523
538
|
{ name = "rich" },
|
|
524
539
|
]
|
|
525
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
540
|
+
sdist = { url = "https://files.pythonhosted.org/packages/62/b0/6006c57afc693a4afdc5389f1c93e83654745ec2b25d33c091621aec7d15/oagi_core-0.13.1.tar.gz", hash = "sha256:8dcbf45c6eb7203573d04122ebb53c67d7c955bb6bbfe8332fe2e641e7cb689f", size = 304385, upload-time = "2026-01-12T04:14:18.758Z" }
|
|
526
541
|
wheels = [
|
|
527
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
542
|
+
{ url = "https://files.pythonhosted.org/packages/6e/78/0a04d5a28313ab6dc783a5c4d8b32c1871fa2a140f75dfe42f56024c8865/oagi_core-0.13.1-py3-none-any.whl", hash = "sha256:b29637ca080fa7092224231b113b35c07f09657bed203e8e26e13e2c2a65665f", size = 110049, upload-time = "2026-01-12T04:14:17.645Z" },
|
|
528
543
|
]
|
|
529
544
|
|
|
530
545
|
[package.optional-dependencies]
|
|
@@ -533,6 +548,7 @@ desktop = [
|
|
|
533
548
|
{ name = "pyautogui" },
|
|
534
549
|
{ name = "pyobjc-framework-applicationservices", marker = "sys_platform == 'darwin'" },
|
|
535
550
|
{ name = "pyobjc-framework-quartz", marker = "sys_platform == 'darwin'" },
|
|
551
|
+
{ name = "screeninfo" },
|
|
536
552
|
]
|
|
537
553
|
server = [
|
|
538
554
|
{ name = "fastapi", extra = ["standard"] },
|
|
@@ -1246,6 +1262,19 @@ wheels = [
|
|
|
1246
1262
|
{ url = "https://files.pythonhosted.org/packages/9f/a4/11ad29100060af56408ed084dca76a16d2ce8eb31b75081bfc0eec45d755/rubicon_objc-0.5.2-py3-none-any.whl", hash = "sha256:829b253c579e51fc34f4bb6587c34806e78960dcc1eb24e62b38141a1fe02b39", size = 63512, upload-time = "2025-08-07T06:12:23.766Z" },
|
|
1247
1263
|
]
|
|
1248
1264
|
|
|
1265
|
+
[[package]]
|
|
1266
|
+
name = "screeninfo"
|
|
1267
|
+
version = "0.8.1"
|
|
1268
|
+
source = { registry = "https://pypi.org/simple" }
|
|
1269
|
+
dependencies = [
|
|
1270
|
+
{ name = "cython", marker = "sys_platform == 'darwin'" },
|
|
1271
|
+
{ name = "pyobjc-framework-cocoa", marker = "sys_platform == 'darwin'" },
|
|
1272
|
+
]
|
|
1273
|
+
sdist = { url = "https://files.pythonhosted.org/packages/ec/bb/e69e5e628d43f118e0af4fc063c20058faa8635c95a1296764acc8167e27/screeninfo-0.8.1.tar.gz", hash = "sha256:9983076bcc7e34402a1a9e4d7dabf3729411fd2abb3f3b4be7eba73519cd2ed1", size = 10666, upload-time = "2022-09-09T11:35:23.419Z" }
|
|
1274
|
+
wheels = [
|
|
1275
|
+
{ url = "https://files.pythonhosted.org/packages/6e/bf/c5205d480307bef660e56544b9e3d7ff687da776abb30c9cb3f330887570/screeninfo-0.8.1-py3-none-any.whl", hash = "sha256:e97d6b173856edcfa3bd282f81deb528188aff14b11ec3e195584e7641be733c", size = 12907, upload-time = "2022-09-09T11:35:21.351Z" },
|
|
1276
|
+
]
|
|
1277
|
+
|
|
1249
1278
|
[[package]]
|
|
1250
1279
|
name = "sentry-sdk"
|
|
1251
1280
|
version = "2.45.0"
|
|
@@ -10,8 +10,8 @@ from uuid import uuid4
|
|
|
10
10
|
|
|
11
11
|
from ..constants import (
|
|
12
12
|
DEFAULT_MAX_STEPS,
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
MAX_STEPS_ALLOWED_ACTOR,
|
|
14
|
+
MAX_STEPS_ALLOWED_THINKER,
|
|
15
15
|
MODEL_THINKER,
|
|
16
16
|
)
|
|
17
17
|
from ..logging import get_logger
|
|
@@ -51,7 +51,11 @@ class BaseActor:
|
|
|
51
51
|
Returns:
|
|
52
52
|
Validated max_steps (capped to model limit if exceeded)
|
|
53
53
|
"""
|
|
54
|
-
limit =
|
|
54
|
+
limit = (
|
|
55
|
+
MAX_STEPS_ALLOWED_THINKER
|
|
56
|
+
if self.model == MODEL_THINKER
|
|
57
|
+
else MAX_STEPS_ALLOWED_ACTOR
|
|
58
|
+
)
|
|
55
59
|
if max_steps > limit:
|
|
56
60
|
logger.warning(
|
|
57
61
|
f"max_steps ({max_steps}) exceeds limit for model '{self.model}'. "
|
|
@@ -27,8 +27,8 @@ DEFAULT_MAX_STEPS_THINKER = 100
|
|
|
27
27
|
DEFAULT_MAX_STEPS_TASKER = 60
|
|
28
28
|
|
|
29
29
|
# Maximum allowed steps per model (hard limits)
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
MAX_STEPS_ALLOWED_ACTOR = 100
|
|
31
|
+
MAX_STEPS_ALLOWED_THINKER = 300
|
|
32
32
|
|
|
33
33
|
# Reflection intervals
|
|
34
34
|
DEFAULT_REFLECTION_INTERVAL = 4
|
|
@@ -51,6 +51,10 @@ class PyautoguiConfig(BaseModel):
|
|
|
51
51
|
default=True,
|
|
52
52
|
description="Replace 'ctrl' with 'command' in hotkey combinations on macOS",
|
|
53
53
|
)
|
|
54
|
+
click_pre_delay: float = Field(
|
|
55
|
+
default=0.1,
|
|
56
|
+
description="Delay in seconds after moving to position before clicking",
|
|
57
|
+
)
|
|
54
58
|
|
|
55
59
|
|
|
56
60
|
class PyautoguiActionHandler:
|
|
@@ -158,6 +162,11 @@ class PyautoguiActionHandler:
|
|
|
158
162
|
keys = [self._normalize_key(key) for key in args_str.split("+")]
|
|
159
163
|
return keys
|
|
160
164
|
|
|
165
|
+
def _move_and_wait(self, x: int, y: int) -> None:
|
|
166
|
+
"""Move cursor to position and wait before clicking."""
|
|
167
|
+
pyautogui.moveTo(x, y)
|
|
168
|
+
time.sleep(self.config.click_pre_delay)
|
|
169
|
+
|
|
161
170
|
def _execute_single_action(self, action: Action) -> None:
|
|
162
171
|
"""Execute a single action once."""
|
|
163
172
|
arg = action.argument.strip("()") # Remove outer parentheses if present
|
|
@@ -165,25 +174,29 @@ class PyautoguiActionHandler:
|
|
|
165
174
|
match action.type:
|
|
166
175
|
case ActionType.CLICK:
|
|
167
176
|
x, y = self._parse_coords(arg)
|
|
168
|
-
|
|
177
|
+
self._move_and_wait(x, y)
|
|
178
|
+
pyautogui.click()
|
|
169
179
|
|
|
170
180
|
case ActionType.LEFT_DOUBLE:
|
|
171
181
|
x, y = self._parse_coords(arg)
|
|
182
|
+
self._move_and_wait(x, y)
|
|
172
183
|
if sys.platform == "darwin":
|
|
173
184
|
_macos.macos_click(x, y, clicks=2)
|
|
174
185
|
else:
|
|
175
|
-
pyautogui.doubleClick(
|
|
186
|
+
pyautogui.doubleClick()
|
|
176
187
|
|
|
177
188
|
case ActionType.LEFT_TRIPLE:
|
|
178
189
|
x, y = self._parse_coords(arg)
|
|
190
|
+
self._move_and_wait(x, y)
|
|
179
191
|
if sys.platform == "darwin":
|
|
180
192
|
_macos.macos_click(x, y, clicks=3)
|
|
181
193
|
else:
|
|
182
|
-
pyautogui.tripleClick(
|
|
194
|
+
pyautogui.tripleClick()
|
|
183
195
|
|
|
184
196
|
case ActionType.RIGHT_SINGLE:
|
|
185
197
|
x, y = self._parse_coords(arg)
|
|
186
|
-
|
|
198
|
+
self._move_and_wait(x, y)
|
|
199
|
+
pyautogui.rightClick()
|
|
187
200
|
|
|
188
201
|
case ActionType.DRAG:
|
|
189
202
|
x1, y1, x2, y2 = self._parse_drag_coords(arg)
|
|
@@ -54,9 +54,9 @@ def test_coordinate_based_actions(
|
|
|
54
54
|
action = Action(type=action_type, argument=argument, count=1)
|
|
55
55
|
handler([action])
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
)
|
|
57
|
+
# Click actions now use moveTo first, then click without coordinates
|
|
58
|
+
mock_pyautogui.moveTo.assert_called_with(*expected_coords)
|
|
59
|
+
getattr(mock_pyautogui, expected_method).assert_called_once_with()
|
|
60
60
|
|
|
61
61
|
|
|
62
62
|
def test_drag_action(handler, mock_pyautogui, config):
|
|
@@ -262,7 +262,9 @@ class TestCornerCoordinatesHandling:
|
|
|
262
262
|
handler = PyautoguiActionHandler()
|
|
263
263
|
action = Action(type=ActionType.CLICK, argument=input_coords, count=1)
|
|
264
264
|
handler([action])
|
|
265
|
-
|
|
265
|
+
# Click actions now use moveTo first, then click without coordinates
|
|
266
|
+
mock_pyautogui.moveTo.assert_called_with(*expected_coords)
|
|
267
|
+
mock_pyautogui.click.assert_called_once_with()
|
|
266
268
|
|
|
267
269
|
def test_drag_with_corner_coordinates(self, mock_pyautogui, config):
|
|
268
270
|
"""Test drag operations with corner coordinates."""
|
|
@@ -300,10 +302,16 @@ class TestCornerCoordinatesHandling:
|
|
|
300
302
|
with patch.object(sys, "platform", "linux"):
|
|
301
303
|
handler(actions)
|
|
302
304
|
|
|
303
|
-
# All
|
|
304
|
-
|
|
305
|
-
mock_pyautogui.
|
|
306
|
-
|
|
305
|
+
# All click actions now use moveTo first, then click without coordinates
|
|
306
|
+
# Check moveTo was called with the adjusted corner coordinates
|
|
307
|
+
moveTo_calls = mock_pyautogui.moveTo.call_args_list
|
|
308
|
+
assert (1, 1) in [call[0] for call in moveTo_calls]
|
|
309
|
+
assert (1919, 1) in [call[0] for call in moveTo_calls]
|
|
310
|
+
assert (1, 1079) in [call[0] for call in moveTo_calls]
|
|
311
|
+
# Click methods called without coordinates
|
|
312
|
+
mock_pyautogui.doubleClick.assert_called_once_with()
|
|
313
|
+
mock_pyautogui.tripleClick.assert_called_once_with()
|
|
314
|
+
mock_pyautogui.rightClick.assert_called_once_with()
|
|
307
315
|
|
|
308
316
|
|
|
309
317
|
class TestCapsLockIntegration:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|