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.
Files changed (129) hide show
  1. {oagi_core-0.13.0 → oagi_core-0.13.2}/PKG-INFO +1 -1
  2. {oagi_core-0.13.0 → oagi_core-0.13.2}/examples/openai_agent_loop_example.py +3 -3
  3. {oagi_core-0.13.0 → oagi_core-0.13.2}/metapackage/pyproject.toml +2 -2
  4. {oagi_core-0.13.0 → oagi_core-0.13.2}/metapackage/uv.lock +34 -5
  5. {oagi_core-0.13.0 → oagi_core-0.13.2}/pyproject.toml +1 -1
  6. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/actor/base.py +7 -3
  7. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/constants.py +2 -2
  8. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/pyautogui_action_handler.py +17 -4
  9. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_pyautogui_action_handler.py +16 -8
  10. {oagi_core-0.13.0 → oagi_core-0.13.2}/uv.lock +1 -1
  11. {oagi_core-0.13.0 → oagi_core-0.13.2}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  12. {oagi_core-0.13.0 → oagi_core-0.13.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  13. {oagi_core-0.13.0 → oagi_core-0.13.2}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
  14. {oagi_core-0.13.0 → oagi_core-0.13.2}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  15. {oagi_core-0.13.0 → oagi_core-0.13.2}/.github/workflows/ci.yml +0 -0
  16. {oagi_core-0.13.0 → oagi_core-0.13.2}/.github/workflows/release.yml +0 -0
  17. {oagi_core-0.13.0 → oagi_core-0.13.2}/.gitignore +0 -0
  18. {oagi_core-0.13.0 → oagi_core-0.13.2}/.python-version +0 -0
  19. {oagi_core-0.13.0 → oagi_core-0.13.2}/CONTRIBUTING.md +0 -0
  20. {oagi_core-0.13.0 → oagi_core-0.13.2}/LICENSE +0 -0
  21. {oagi_core-0.13.0 → oagi_core-0.13.2}/Makefile +0 -0
  22. {oagi_core-0.13.0 → oagi_core-0.13.2}/README.md +0 -0
  23. {oagi_core-0.13.0 → oagi_core-0.13.2}/examples/async_google_weather.py +0 -0
  24. {oagi_core-0.13.0 → oagi_core-0.13.2}/examples/execute_task_auto.py +0 -0
  25. {oagi_core-0.13.0 → oagi_core-0.13.2}/examples/execute_task_manual.py +0 -0
  26. {oagi_core-0.13.0 → oagi_core-0.13.2}/examples/google_weather.py +0 -0
  27. {oagi_core-0.13.0 → oagi_core-0.13.2}/examples/screenshot_with_config.py +0 -0
  28. {oagi_core-0.13.0 → oagi_core-0.13.2}/examples/tasker_agent_example.py +0 -0
  29. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/__init__.py +0 -0
  30. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/actor/__init__.py +0 -0
  31. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/actor/async_.py +0 -0
  32. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/actor/async_short.py +0 -0
  33. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/actor/short.py +0 -0
  34. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/actor/sync.py +0 -0
  35. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/__init__.py +0 -0
  36. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/default.py +0 -0
  37. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/factories.py +0 -0
  38. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/observer/__init__.py +0 -0
  39. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/observer/agent_observer.py +0 -0
  40. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/observer/events.py +0 -0
  41. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/observer/exporters.py +0 -0
  42. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/observer/protocol.py +0 -0
  43. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/observer/report_template.html +0 -0
  44. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/protocol.py +0 -0
  45. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/registry.py +0 -0
  46. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/tasker/__init__.py +0 -0
  47. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/tasker/memory.py +0 -0
  48. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/tasker/models.py +0 -0
  49. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/tasker/planner.py +0 -0
  50. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/tasker/taskee_agent.py +0 -0
  51. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/agent/tasker/tasker_agent.py +0 -0
  52. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/cli/__init__.py +0 -0
  53. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/cli/agent.py +0 -0
  54. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/cli/display.py +0 -0
  55. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/cli/main.py +0 -0
  56. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/cli/server.py +0 -0
  57. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/cli/tracking.py +0 -0
  58. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/cli/utils.py +0 -0
  59. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/client/__init__.py +0 -0
  60. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/client/async_.py +0 -0
  61. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/client/base.py +0 -0
  62. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/client/sync.py +0 -0
  63. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/exceptions.py +0 -0
  64. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/__init__.py +0 -0
  65. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/_macos.py +0 -0
  66. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/_windows.py +0 -0
  67. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/_ydotool.py +0 -0
  68. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/async_pyautogui_action_handler.py +0 -0
  69. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/async_screenshot_maker.py +0 -0
  70. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/async_ydotool_action_handler.py +0 -0
  71. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/capslock_manager.py +0 -0
  72. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/pil_image.py +0 -0
  73. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/screenshot_maker.py +0 -0
  74. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/utils.py +0 -0
  75. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/wayland_support.py +0 -0
  76. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/handler/ydotool_action_handler.py +0 -0
  77. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/logging.py +0 -0
  78. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/platform_info.py +0 -0
  79. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/server/__init__.py +0 -0
  80. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/server/agent_wrappers.py +0 -0
  81. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/server/config.py +0 -0
  82. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/server/main.py +0 -0
  83. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/server/models.py +0 -0
  84. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/server/session_store.py +0 -0
  85. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/server/socketio_server.py +0 -0
  86. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/task/__init__.py +0 -0
  87. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/__init__.py +0 -0
  88. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/action_handler.py +0 -0
  89. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/async_action_handler.py +0 -0
  90. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/async_image_provider.py +0 -0
  91. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/image.py +0 -0
  92. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/image_provider.py +0 -0
  93. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/models/__init__.py +0 -0
  94. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/models/action.py +0 -0
  95. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/models/client.py +0 -0
  96. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/models/image_config.py +0 -0
  97. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/models/step.py +0 -0
  98. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/step_observer.py +0 -0
  99. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/types/url.py +0 -0
  100. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/utils/__init__.py +0 -0
  101. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/utils/output_parser.py +0 -0
  102. {oagi_core-0.13.0 → oagi_core-0.13.2}/src/oagi/utils/prompt_builder.py +0 -0
  103. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/__init__.py +0 -0
  104. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/conftest.py +0 -0
  105. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_action_parsing.py +0 -0
  106. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_actor.py +0 -0
  107. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_agent/test_agent_wrappers.py +0 -0
  108. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_agent/test_default_agent.py +0 -0
  109. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_agent_registry.py +0 -0
  110. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_async_actor.py +0 -0
  111. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_async_client.py +0 -0
  112. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_async_handlers.py +0 -0
  113. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_cli.py +0 -0
  114. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_logging.py +0 -0
  115. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_mac_double_click.py +0 -0
  116. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_observer.py +0 -0
  117. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_pil_image.py +0 -0
  118. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_planner.py +0 -0
  119. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_planner_memory.py +0 -0
  120. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_screenshot_maker.py +0 -0
  121. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_server/__init__.py +0 -0
  122. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_server/test_config.py +0 -0
  123. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_server/test_session_store.py +0 -0
  124. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_server/test_socketio_integration.py +0 -0
  125. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_sync_client.py +0 -0
  126. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_taskee_agent.py +0 -0
  127. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/test_tasker_agent.py +0 -0
  128. {oagi_core-0.13.0 → oagi_core-0.13.2}/tests/utils/__init__.py +0 -0
  129. {oagi_core-0.13.0 → oagi_core-0.13.2}/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.13.0
3
+ Version: 0.13.2
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>
@@ -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-actor-1"
31
+ DEFAULT_MODEL = "lux-thinker-1"
32
32
 
33
33
 
34
- def agent_loop(task_description: str, max_steps: int = 10) -> bool:
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=20)
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.0"
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.0",
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.0"
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.12.1" }]
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.12.1"
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/f8/70/0977d856ebfb2af41b1d4804f902ef1f8b929de6663ea9a97d879051a6da/oagi_core-0.12.1.tar.gz", hash = "sha256:d04a73849709833b16c55e24edc06f8f17a58d3389ef8849a66c9d7e93183863", size = 297360, upload-time = "2025-12-17T06:46:59.237Z" }
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/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" },
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"
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "oagi-core"
7
- version = "0.13.0"
7
+ version = "0.13.2"
8
8
  description = "Official API of OpenAGI Foundation"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -10,8 +10,8 @@ from uuid import uuid4
10
10
 
11
11
  from ..constants import (
12
12
  DEFAULT_MAX_STEPS,
13
- MAX_STEPS_ACTOR,
14
- MAX_STEPS_THINKER,
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 = MAX_STEPS_THINKER if self.model == MODEL_THINKER else MAX_STEPS_ACTOR
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
- MAX_STEPS_ACTOR = 30
31
- MAX_STEPS_THINKER = 120
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
- pyautogui.click(x, y)
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(x, y)
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(x, y)
194
+ pyautogui.tripleClick()
183
195
 
184
196
  case ActionType.RIGHT_SINGLE:
185
197
  x, y = self._parse_coords(arg)
186
- pyautogui.rightClick(x, y)
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
- getattr(mock_pyautogui, expected_method).assert_called_once_with(
58
- *expected_coords
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
- mock_pyautogui.click.assert_called_once_with(*expected_coords)
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 corner coordinates should be adjusted
304
- mock_pyautogui.doubleClick.assert_called_once_with(1, 1)
305
- mock_pyautogui.tripleClick.assert_called_once_with(1919, 1)
306
- mock_pyautogui.rightClick.assert_called_once_with(1, 1079)
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:
@@ -535,7 +535,7 @@ sdist = { url = "https://files.pythonhosted.org/packages/28/fa/b2ba8229b9381e8f6
535
535
 
536
536
  [[package]]
537
537
  name = "oagi-core"
538
- version = "0.13.0"
538
+ version = "0.13.2"
539
539
  source = { editable = "." }
540
540
  dependencies = [
541
541
  { name = "httpx" },
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