lybic-guiagents 0.2.0__py3-none-any.whl → 0.2.1__py3-none-any.whl

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.

Potentially problematic release.


This version of lybic-guiagents might be problematic. Click here for more details.

gui_agents/__init__.py CHANGED
@@ -37,11 +37,7 @@ from .agents.hardware_interface import HardwareInterface
37
37
  from .store.registry import Registry
38
38
  from .agents.global_state import GlobalState
39
39
 
40
- try:
41
- from importlib.metadata import version
42
- __version__ = version("lybic-guiagents")
43
- except Exception: # during editable installs or missing meta
44
- __version__ = "0.0.0+dev"
40
+ __version__ = "0.2.1"
45
41
 
46
42
  # Primary exports (what users should typically use)
47
43
  __all__ = [
@@ -27,9 +27,9 @@ The registry makes the last line work without an if‑else chain.
27
27
  """
28
28
 
29
29
  from abc import ABC
30
- from dataclasses import dataclass, field, fields, asdict
31
- from enum import Enum, auto
32
- from typing import Any, Dict, List, Tuple, Type, TypeVar, ClassVar
30
+ from dataclasses import dataclass, field, fields
31
+ from enum import Enum
32
+ from typing import Any, Dict, List, Type, TypeVar, ClassVar
33
33
 
34
34
  __all__ = [
35
35
  "Action",
@@ -6,8 +6,7 @@ import asyncio
6
6
  import logging
7
7
  import time
8
8
  import os
9
- from typing import Dict, Any, Optional, Union
10
- from io import BytesIO
9
+ from typing import Dict, Any, Optional
11
10
  from PIL import Image
12
11
 
13
12
  from gui_agents.agents.Action import (
@@ -1,12 +1,9 @@
1
1
  # ---------------------------------------------------------------------------
2
2
  # 1) Desktop automation backend (PyAutoGUI)
3
3
  # ---------------------------------------------------------------------------
4
- import os
5
- import subprocess, difflib
4
+ import subprocess
6
5
  import sys
7
6
  import pyperclip
8
- from PIL import Image
9
- from numpy import imag
10
7
  from gui_agents.agents.Action import (
11
8
  Action,
12
9
  Click,
@@ -77,7 +77,7 @@ class PyAutoGUIVMwareBackend(Backend):
77
77
 
78
78
 
79
79
  # ------------------------------------------------------------------
80
- def execute(self, action: Action) -> str:
80
+ def execute(self, action: Action) -> str | None:
81
81
  if not self.supports(type(action)):
82
82
  raise NotImplementedError(f"{type(action).__name__} not supported by PyAutoGUIBackend")
83
83
 
@@ -1,12 +1,10 @@
1
1
  import json
2
2
  import logging
3
- from math import log
4
3
  import os
5
4
  import platform
6
5
  import textwrap
7
6
  from typing import Dict, List, Optional, Tuple
8
7
 
9
- from gui_agents.agents.grounding import ACI
10
8
  from gui_agents.agents.worker import Worker
11
9
  from gui_agents.agents.manager import Manager
12
10
  from gui_agents.agents.grounding import Grounding, FastGrounding
@@ -1,13 +1,8 @@
1
1
  import ast
2
2
  import re
3
3
  import logging
4
- from collections import defaultdict
5
- from io import BytesIO
6
- from typing import Any, Dict, List, Optional, Tuple, Union
4
+ from typing import Dict, List
7
5
  import time
8
- import pytesseract
9
- from PIL import Image
10
- from pytesseract import Output
11
6
 
12
7
  from gui_agents.tools.tools import Tools
13
8
  from gui_agents.utils.common_utils import parse_single_code_from_string
@@ -1,11 +1,14 @@
1
1
  from __future__ import annotations
2
2
 
3
- import pyautogui
4
3
  from gui_agents.agents.Backend.Backend import Backend
5
4
  from gui_agents.agents.Backend.ADBBackend import ADBBackend
6
5
  from gui_agents.agents.Backend.LybicBackend import LybicBackend
7
- from gui_agents.agents.Backend.PyAutoGUIBackend import PyAutoGUIBackend
8
- from gui_agents.agents.Backend.PyAutoGUIVMwareBackend import PyAutoGUIVMwareBackend
6
+ try:
7
+ from gui_agents.agents.Backend.PyAutoGUIBackend import PyAutoGUIBackend
8
+ except ImportError:
9
+ PyAutoGUIBackend = None
10
+ pass
11
+ # from gui_agents.agents.Backend.PyAutoGUIVMwareBackend import PyAutoGUIVMwareBackend
9
12
  """hardware_interface.py ▸ Execute Action objects on real devices / emulators
10
13
  ===============================================================================
11
14
  This module is the *single entry point* that upper‑layer planners / executors
@@ -57,7 +60,7 @@ __all__ = [
57
60
  "PyAutoGUIBackend",
58
61
  "ADBBackend",
59
62
  "LybicBackend",
60
- "PyAutoGUIVMwareBackend",
63
+ # "PyAutoGUIVMwareBackend",
61
64
  ]
62
65
 
63
66
 
@@ -72,8 +75,9 @@ class HardwareInterface:
72
75
  "pyautogui": PyAutoGUIBackend,
73
76
  "adb": ADBBackend,
74
77
  "lybic": LybicBackend,
75
- "pyautogui_vmware": PyAutoGUIVMwareBackend,
76
78
  }
79
+ if PyAutoGUIBackend is not None:
80
+ BACKEND_MAP["pyautogui_vmware"] = PyAutoGUIBackend
77
81
 
78
82
  # ------------------------------------------------------------------
79
83
  def __init__(self, backend: str | Backend = "pyautogui", **backend_kwargs):
@@ -83,6 +87,17 @@ class HardwareInterface:
83
87
  key = backend.lower()
84
88
  if key not in self.BACKEND_MAP:
85
89
  raise ValueError(f"Unsupported backend '{backend}'. Available: {list(self.BACKEND_MAP)}")
90
+
91
+ # For GUI backends, provide helpful error message in headless environments
92
+ if key in ["pyautogui", "pyautogui_vmware"]:
93
+ import os
94
+ if os.name == 'posix' and not os.environ.get('DISPLAY'):
95
+ raise RuntimeError(
96
+ f"Cannot create '{backend}' backend: No DISPLAY environment variable found. "
97
+ f"This typically occurs in headless/containerized environments. "
98
+ f"Consider using 'lybic' or 'adb' backend instead."
99
+ )
100
+
86
101
  self.backend = self.BACKEND_MAP[key](**backend_kwargs)
87
102
 
88
103
  # ------------------------------------------------------------------
@@ -4,7 +4,6 @@ from collections import defaultdict
4
4
  from typing import Dict, List, Optional, Tuple
5
5
  import platform
6
6
 
7
- from gui_agents.agents.grounding import ACI
8
7
  from gui_agents.core.knowledge import KnowledgeBase
9
8
  from gui_agents.agents.global_state import GlobalState
10
9
  from gui_agents.store.registry import Registry
@@ -15,8 +14,6 @@ from gui_agents.utils.common_utils import (
15
14
  agent_log_to_string,
16
15
  )
17
16
  from gui_agents.tools.tools import Tools
18
- from PIL import Image
19
- import io
20
17
 
21
18
  logger = logging.getLogger("desktopenv.agent")
22
19
 
@@ -5,7 +5,7 @@ format strictly follows computer-use schema.
5
5
  """
6
6
 
7
7
  from __future__ import annotations
8
- import ast, json
8
+ import ast
9
9
  from typing import List, Dict
10
10
 
11
11
 
@@ -1,12 +1,11 @@
1
1
  import logging
2
2
  import re
3
3
  import textwrap
4
- from typing import Dict, List, Tuple
4
+ from typing import Dict, List
5
5
  import platform
6
6
  import os
7
7
  import json
8
8
 
9
- from gui_agents.agents.grounding import ACI
10
9
  from gui_agents.core.knowledge import KnowledgeBase
11
10
  from gui_agents.utils.common_utils import (
12
11
  Node,
gui_agents/cli_app.py CHANGED
@@ -4,13 +4,11 @@ import io
4
4
  import logging
5
5
  import os
6
6
  import platform
7
- import pyautogui
8
7
  import sys
9
8
  import time
10
9
  import datetime
11
10
  from pathlib import Path
12
11
  from dotenv import load_dotenv
13
- from gui_agents.agents.Backend.PyAutoGUIBackend import PyAutoGUIBackend
14
12
 
15
13
  env_path = Path(os.path.dirname(os.path.abspath(__file__))) / '.env'
16
14
  if env_path.exists():
@@ -35,6 +33,80 @@ from gui_agents.utils.analyze_display import analyze_display_json, aggregate_res
35
33
 
36
34
  current_platform = platform.system().lower()
37
35
 
36
+ # Display environment detection and backend compatibility validation
37
+ def check_display_environment():
38
+ """
39
+ Check if the current environment supports GUI operations.
40
+ Returns (has_display, pyautogui_available, error_message)
41
+ """
42
+ has_display = False
43
+ pyautogui_available = False
44
+ error_message = None
45
+
46
+ # Check DISPLAY environment variable (Linux/Unix)
47
+ if current_platform == "linux":
48
+ display_env = os.environ.get('DISPLAY')
49
+ if display_env:
50
+ has_display = True
51
+ else:
52
+ error_message = "No DISPLAY environment variable found. Running in headless/containerized environment."
53
+ elif current_platform == "darwin":
54
+ # macOS typically has display available unless running in special contexts
55
+ has_display = True
56
+ elif current_platform == "windows":
57
+ # Windows typically has display available
58
+ has_display = True
59
+
60
+ # Try to import and initialize pyautogui if display is available
61
+ if has_display:
62
+ try:
63
+ import pyautogui
64
+ # Test if pyautogui can actually work
65
+ pyautogui.size() # This will fail if no display is available
66
+ pyautogui_available = True
67
+ except Exception as e:
68
+ pyautogui_available = False
69
+ error_message = f"PyAutoGUI not available: {str(e)}"
70
+
71
+ return has_display, pyautogui_available, error_message
72
+
73
+ def get_compatible_backends(has_display, pyautogui_available):
74
+ """
75
+ Get list of backends compatible with current environment.
76
+ """
77
+ compatible_backends = []
78
+ incompatible_backends = []
79
+
80
+ # Lybic backend works in headless environments (cloud-based)
81
+ compatible_backends.append("lybic")
82
+
83
+ # ADB backend works without display (for Android devices)
84
+ compatible_backends.append("adb")
85
+
86
+ # PyAutoGUI-based backends require display
87
+ if has_display and pyautogui_available:
88
+ compatible_backends.extend(["pyautogui", "pyautogui_vmware"])
89
+ else:
90
+ incompatible_backends.extend(["pyautogui", "pyautogui_vmware"])
91
+
92
+ return compatible_backends, incompatible_backends
93
+
94
+ def validate_backend_compatibility(backend, compatible_backends, incompatible_backends):
95
+ """
96
+ Validate if the requested backend is compatible with current environment.
97
+ Returns (is_compatible, recommended_backend, warning_message)
98
+ """
99
+ if backend in compatible_backends:
100
+ return True, backend, None
101
+ elif backend in incompatible_backends:
102
+ # Recommend lybic as the primary fallback for headless environments
103
+ recommended = "lybic"
104
+ warning = f"Backend '{backend}' is not compatible with current environment (no display/GUI). Recommending '{recommended}' backend instead."
105
+ return False, recommended, warning
106
+ else:
107
+ # Unknown backend, let it fail naturally
108
+ return True, backend, f"Unknown backend '{backend}', compatibility cannot be determined."
109
+
38
110
  logger = logging.getLogger()
39
111
  logger.setLevel(logging.DEBUG)
40
112
 
@@ -172,10 +244,18 @@ def show_permission_dialog(code: str, action_description: str):
172
244
  def scale_screenshot_dimensions(screenshot: Image.Image, hwi_para: HardwareInterface):
173
245
  screenshot_high = screenshot.height
174
246
  screenshot_width = screenshot.width
175
- if isinstance(hwi_para.backend, PyAutoGUIBackend):
176
- screen_width, screen_height = pyautogui.size()
177
- if screen_width != screenshot_width or screen_height != screenshot_high:
178
- screenshot = screenshot.resize((screen_width, screen_height), Image.Resampling.LANCZOS)
247
+
248
+ # Only try to scale if we have a PyAutoGUI backend and pyautogui is available
249
+ try:
250
+ from gui_agents.agents.Backend.PyAutoGUIBackend import PyAutoGUIBackend
251
+ if isinstance(hwi_para.backend, PyAutoGUIBackend):
252
+ import pyautogui
253
+ screen_width, screen_height = pyautogui.size()
254
+ if screen_width != screenshot_width or screen_height != screenshot_high:
255
+ screenshot = screenshot.resize((screen_width, screen_height), Image.Resampling.LANCZOS)
256
+ except Exception as e:
257
+ # Any error (e.g., no display, import error), skip scaling
258
+ logger.warning(f"Could not scale screenshot dimensions: {e}")
179
259
 
180
260
  return screenshot
181
261
 
@@ -453,8 +533,37 @@ def main():
453
533
  type=str,
454
534
  default=None,
455
535
  help='Lybic precreated sandbox ID (if not provided, will use LYBIC_PRECREATE_SID environment variable)')
536
+ parser.add_argument(
537
+ '--force-backend',
538
+ action='store_true',
539
+ help='Force the use of specified backend even if incompatible with current environment')
456
540
  args = parser.parse_args()
457
541
 
542
+ # Check environment compatibility
543
+ has_display, pyautogui_available, env_error = check_display_environment()
544
+ compatible_backends, incompatible_backends = get_compatible_backends(has_display, pyautogui_available)
545
+
546
+ # Log environment status
547
+ logger.info(f"Environment check: Display available={has_display}, PyAutoGUI available={pyautogui_available}")
548
+ if env_error:
549
+ logger.info(f"Environment note: {env_error}")
550
+ logger.info(f"Compatible backends: {compatible_backends}")
551
+ if incompatible_backends:
552
+ logger.info(f"Incompatible backends: {incompatible_backends}")
553
+
554
+ # Validate backend compatibility
555
+ is_compatible, recommended_backend, warning = validate_backend_compatibility(
556
+ args.backend, compatible_backends, incompatible_backends)
557
+
558
+ if not is_compatible and not args.force_backend:
559
+ logger.warning(warning)
560
+ logger.info(f"Switching from '{args.backend}' to '{recommended_backend}' backend")
561
+ args.backend = recommended_backend
562
+ elif not is_compatible and args.force_backend:
563
+ logger.warning(f"Forcing incompatible backend '{args.backend}' - this may cause errors")
564
+ elif warning:
565
+ logger.info(warning)
566
+
458
567
  # Ensure necessary directory structure exists
459
568
  timestamp_dir = os.path.join(log_dir, datetime_str)
460
569
  cache_dir = os.path.join(timestamp_dir, "cache", "screens")
@@ -515,7 +624,7 @@ def main():
515
624
  else:
516
625
  logger.info("Web search functionality is ENABLED")
517
626
 
518
- # Initialize hardware interface
627
+ # Initialize hardware interface with error handling
519
628
  backend_kwargs = {"platform": platform_os}
520
629
  if args.lybic_sid is not None:
521
630
  backend_kwargs["precreate_sid"] = args.lybic_sid
@@ -523,7 +632,25 @@ def main():
523
632
  else:
524
633
  logger.info("Using Lybic SID from environment variable LYBIC_PRECREATE_SID")
525
634
 
526
- hwi = HardwareInterface(backend=args.backend, **backend_kwargs)
635
+ try:
636
+ hwi = HardwareInterface(backend=args.backend, **backend_kwargs)
637
+ logger.info(f"Successfully initialized hardware interface with backend: {args.backend}")
638
+ except Exception as e:
639
+ logger.error(f"Failed to initialize hardware interface with backend '{args.backend}': {e}")
640
+
641
+ # If the backend failed and it's a GUI-dependent backend, suggest alternatives
642
+ if args.backend in incompatible_backends and not args.force_backend:
643
+ logger.info("Attempting to initialize with lybic backend as fallback...")
644
+ try:
645
+ hwi = HardwareInterface(backend="lybic", **backend_kwargs)
646
+ logger.info("Successfully initialized with lybic backend")
647
+ args.backend = "lybic"
648
+ except Exception as fallback_error:
649
+ logger.error(f"Fallback to lybic backend also failed: {fallback_error}")
650
+ sys.exit(1)
651
+ else:
652
+ logger.error("Hardware interface initialization failed. Please check your environment and backend configuration.")
653
+ sys.exit(1)
527
654
 
528
655
  # if query is provided, run the agent on the query
529
656
  if args.query:
@@ -547,6 +674,13 @@ def main():
547
674
 
548
675
  if __name__ == "__main__":
549
676
  """
677
+ GUI Agent CLI Application with environment compatibility checking.
678
+
679
+ The application automatically detects the current environment and recommends compatible backends:
680
+ - In headless/containerized environments: uses 'lybic' or 'adb' backends
681
+ - In GUI environments: supports all backends including 'pyautogui' and 'pyautogui_vmware'
682
+
683
+ Examples:
550
684
  python gui_agents/cli_app.py --backend lybic
551
685
  python gui_agents/cli_app.py --backend pyautogui --mode fast
552
686
  python gui_agents/cli_app.py --backend pyautogui_vmware
@@ -556,5 +690,6 @@ if __name__ == "__main__":
556
690
  python gui_agents/cli_app.py --backend pyautogui --mode fast --disable-search
557
691
  python gui_agents/cli_app.py --backend lybic --lybic-sid SBX-01K1X6ZKAERXAN73KTJ1XXJXAF
558
692
  python gui_agents/cli_app.py --backend lybic --mode fast --lybic-sid SBX-01K1X6ZKAERXAN73KTJ1XXJXAF
693
+ python gui_agents/cli_app.py --backend pyautogui --force-backend # Force incompatible backend
559
694
  """
560
695
  main()
gui_agents/core/engine.py CHANGED
@@ -2,7 +2,6 @@ import os
2
2
  import json
3
3
  import backoff
4
4
  import requests
5
- from typing import List, Dict, Any, Optional, Union
6
5
  import numpy as np
7
6
  from anthropic import Anthropic
8
7
  from openai import (
@@ -18,7 +17,6 @@ from google.genai import types
18
17
  from zhipuai import ZhipuAI
19
18
  from groq import Groq
20
19
  import boto3
21
- import exa_py
22
20
  from typing import List, Dict, Any, Optional, Union, Tuple
23
21
 
24
22
  class ModelPricing:
@@ -9,8 +9,6 @@ from gui_agents.utils.common_utils import (
9
9
  save_embeddings,
10
10
  )
11
11
  from gui_agents.tools.tools import Tools
12
- from gui_agents.agents.global_state import GlobalState
13
- from gui_agents.store.registry import Registry
14
12
  from gui_agents.core.mllm import CostManager
15
13
 
16
14
  def get_embedding_dim(model_name):
gui_agents/tools/tools.py CHANGED
@@ -6,10 +6,6 @@ context fusion, subtask planning, trajectory reflection, memory retrieval, groun
6
6
  evaluation, and action generation.
7
7
  """
8
8
 
9
- import os
10
- import json
11
- import base64
12
- import requests
13
9
  import time
14
10
  from typing import Dict, Any, Optional, List, Union, Tuple
15
11
  from abc import ABC, abstractmethod
@@ -3,9 +3,7 @@ import os
3
3
  import json
4
4
  import logging
5
5
  import sys
6
- from unittest.mock import patch
7
6
  from io import BytesIO
8
- from PIL import Image
9
7
 
10
8
  from gui_agents.agents.manager import Manager
11
9
  from gui_agents.utils.common_utils import Node, Dag
@@ -3,9 +3,7 @@ import os
3
3
  import json
4
4
  import logging
5
5
  import sys
6
- from unittest.mock import MagicMock, patch
7
6
  from io import BytesIO
8
- from PIL import Image
9
7
 
10
8
  from gui_agents.agents.worker import Worker
11
9
  from gui_agents.utils.common_utils import Node
@@ -8,7 +8,7 @@ import json
8
8
  import os
9
9
  import glob
10
10
  import re
11
- from typing import Dict, List, Tuple
11
+ from typing import Dict, List
12
12
 
13
13
 
14
14
  def extract_cost_value(cost_str: str) -> tuple:
@@ -1,7 +1,5 @@
1
1
  import json
2
2
  import re
3
- from typing import List
4
- import time
5
3
  import tiktoken
6
4
  import numpy as np
7
5
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lybic-guiagents
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: An open-source agentic framework that enables AI to use computers like humans and can provide a multi-agent runtime environment as an infrastructure capability
5
5
  Author: Lybic Development Team
6
6
  Author-email: Lybic Development Team <lybic@tingyutech.com>
@@ -9,91 +9,145 @@ Classifier: Programming Language :: Python :: 3
9
9
  Requires-Python: >=3.9, <=3.12
10
10
  Description-Content-Type: text/markdown
11
11
  License-File: LICENSE
12
- Requires-Dist: numpy
12
+ Requires-Dist: dotenv
13
+ Requires-Dist: pyperclip
14
+ Requires-Dist: Pillow>=11.3.0
13
15
  Requires-Dist: backoff
14
- Requires-Dist: pandas
15
- Requires-Dist: openai
16
+ Requires-Dist: numpy
16
17
  Requires-Dist: anthropic
17
- Requires-Dist: fastapi
18
+ Requires-Dist: openai
19
+ Requires-Dist: google-genai
18
20
  Requires-Dist: zhipuai
19
21
  Requires-Dist: groq
20
22
  Requires-Dist: boto3
21
- Requires-Dist: uvicorn
22
- Requires-Dist: paddleocr
23
- Requires-Dist: paddlepaddle
24
- Requires-Dist: together
25
23
  Requires-Dist: scikit-learn
26
- Requires-Dist: websockets
27
24
  Requires-Dist: tiktoken
28
- Requires-Dist: pyautogui~=0.9.54
29
- Requires-Dist: toml
30
- Requires-Dist: exa_py
31
- Requires-Dist: black
32
- Requires-Dist: certifi
33
- Requires-Dist: pytesseract
34
- Requires-Dist: google-genai
35
- Requires-Dist: python-dotenv
36
- Requires-Dist: Pillow>=11.3.0
37
- Requires-Dist: fabric
38
- Requires-Dist: gymnasium~=0.28.1
39
- Requires-Dist: requests~=2.31.0
40
- Requires-Dist: pytz~=2024.1
41
- Requires-Dist: transformers~=4.35.2
42
- Requires-Dist: torch~=2.5.0
43
- Requires-Dist: accelerate
44
- Requires-Dist: opencv-python~=4.8.1.78
45
- Requires-Dist: matplotlib~=3.7.4
46
- Requires-Dist: pynput~=1.7.6
47
- Requires-Dist: psutil~=5.9.6
48
- Requires-Dist: tqdm~=4.65.0
49
- Requires-Dist: flask~=3.0.0
50
- Requires-Dist: requests-toolbelt~=1.0.0
51
- Requires-Dist: lxml
52
- Requires-Dist: cssselect
53
- Requires-Dist: xmltodict
54
- Requires-Dist: openpyxl
55
- Requires-Dist: python-docx
56
- Requires-Dist: python-pptx
57
- Requires-Dist: pypdf
58
- Requires-Dist: PyGetWindow
59
- Requires-Dist: rapidfuzz
60
- Requires-Dist: pyacoustid
61
- Requires-Dist: pygame
62
- Requires-Dist: ImageHash
63
- Requires-Dist: scikit-image
64
- Requires-Dist: librosa
65
- Requires-Dist: pymupdf
66
- Requires-Dist: chardet
67
- Requires-Dist: playwright
68
- Requires-Dist: formulas
69
- Requires-Dist: pydrive
70
- Requires-Dist: fastdtw
71
- Requires-Dist: odfpy
72
- Requires-Dist: func-timeout
73
- Requires-Dist: beautifulsoup4
74
- Requires-Dist: dashscope
75
- Requires-Dist: google-generativeai
76
- Requires-Dist: PyYaml
77
- Requires-Dist: mutagen
78
- Requires-Dist: easyocr
79
- Requires-Dist: borb
80
- Requires-Dist: pypdf2
81
- Requires-Dist: pdfplumber
82
- Requires-Dist: wandb
83
- Requires-Dist: wrapt_timeout_decorator
84
- Requires-Dist: gdown
85
- Requires-Dist: azure-identity
86
- Requires-Dist: azure-mgmt-compute
87
- Requires-Dist: azure-mgmt-network
88
- Requires-Dist: docker
89
- Requires-Dist: loguru
90
- Requires-Dist: dotenv
91
- Requires-Dist: lybic>=0.7.0
25
+ Requires-Dist: pydantic
26
+ Requires-Dist: lybic>=0.7.3
92
27
  Requires-Dist: pyobjc; platform_system == "Darwin"
28
+ Requires-Dist: oa_atomacos; platform_system == "Darwin"
93
29
  Requires-Dist: pywinauto; platform_system == "Windows"
94
30
  Requires-Dist: pywin32; platform_system == "Windows"
95
31
  Provides-Extra: dev
96
32
  Requires-Dist: pytest; extra == "dev"
33
+ Provides-Extra: vmware-and-evaluation
34
+ Requires-Dist: python-pptx; extra == "vmware-and-evaluation"
35
+ Requires-Dist: odfpy; extra == "vmware-and-evaluation"
36
+ Requires-Dist: openpyxl; extra == "vmware-and-evaluation"
37
+ Requires-Dist: pandas; extra == "vmware-and-evaluation"
38
+ Requires-Dist: lxml; extra == "vmware-and-evaluation"
39
+ Requires-Dist: filelock; extra == "vmware-and-evaluation"
40
+ Requires-Dist: xmltodict; extra == "vmware-and-evaluation"
41
+ Requires-Dist: opencv-python-headless; extra == "vmware-and-evaluation"
42
+ Requires-Dist: rapidfuzz; extra == "vmware-and-evaluation"
43
+ Requires-Dist: imagehash; extra == "vmware-and-evaluation"
44
+ Requires-Dist: odfpy; extra == "vmware-and-evaluation"
45
+ Requires-Dist: pdfplumber; extra == "vmware-and-evaluation"
46
+ Requires-Dist: PyYAML; extra == "vmware-and-evaluation"
47
+ Requires-Dist: mutagen; extra == "vmware-and-evaluation"
48
+ Requires-Dist: pypdf; extra == "vmware-and-evaluation"
49
+ Requires-Dist: PyMuPDF; extra == "vmware-and-evaluation"
50
+ Requires-Dist: formulas; extra == "vmware-and-evaluation"
51
+ Requires-Dist: pyacoustid; extra == "vmware-and-evaluation"
52
+ Requires-Dist: opencv-python~=4.8.1.78; extra == "vmware-and-evaluation"
53
+ Requires-Dist: PyPDF2; extra == "vmware-and-evaluation"
54
+ Requires-Dist: librosa; extra == "vmware-and-evaluation"
55
+ Requires-Dist: fastdtw; extra == "vmware-and-evaluation"
56
+ Requires-Dist: scikit-learn; extra == "vmware-and-evaluation"
57
+ Requires-Dist: scikit-image; extra == "vmware-and-evaluation"
58
+ Requires-Dist: bs4; extra == "vmware-and-evaluation"
59
+ Requires-Dist: azure-identity; extra == "vmware-and-evaluation"
60
+ Requires-Dist: azure-mgmt-compute; extra == "vmware-and-evaluation"
61
+ Requires-Dist: azure-mgmt-network; extra == "vmware-and-evaluation"
62
+ Requires-Dist: toml; extra == "vmware-and-evaluation"
63
+ Requires-Dist: easyocr; extra == "vmware-and-evaluation"
64
+ Provides-Extra: pyautogui
65
+ Requires-Dist: pyautogui; extra == "pyautogui"
66
+ Provides-Extra: all
67
+ Requires-Dist: toml; extra == "all"
68
+ Requires-Dist: numpy; extra == "all"
69
+ Requires-Dist: backoff; extra == "all"
70
+ Requires-Dist: pandas; extra == "all"
71
+ Requires-Dist: openai; extra == "all"
72
+ Requires-Dist: anthropic; extra == "all"
73
+ Requires-Dist: zhipuai; extra == "all"
74
+ Requires-Dist: groq; extra == "all"
75
+ Requires-Dist: boto3; extra == "all"
76
+ Requires-Dist: paddlepaddle; extra == "all"
77
+ Requires-Dist: tiktoken; extra == "all"
78
+ Requires-Dist: toml; extra == "all"
79
+ Requires-Dist: exa_py; extra == "all"
80
+ Requires-Dist: google-genai; extra == "all"
81
+ Requires-Dist: python-dotenv; extra == "all"
82
+ Requires-Dist: Pillow>=11.3.0; extra == "all"
83
+ Requires-Dist: gymnasium~=0.28.1; extra == "all"
84
+ Requires-Dist: requests~=2.31.0; extra == "all"
85
+ Requires-Dist: pytz~=2024.1; extra == "all"
86
+ Requires-Dist: psutil~=5.9.6; extra == "all"
87
+ Requires-Dist: tqdm~=4.65.0; extra == "all"
88
+ Requires-Dist: flask~=3.0.0; extra == "all"
89
+ Requires-Dist: requests-toolbelt~=1.0.0; extra == "all"
90
+ Requires-Dist: lxml; extra == "all"
91
+ Requires-Dist: xmltodict; extra == "all"
92
+ Requires-Dist: PyGetWindow; extra == "all"
93
+ Requires-Dist: ImageHash; extra == "all"
94
+ Requires-Dist: scikit-image; extra == "all"
95
+ Requires-Dist: formulas; extra == "all"
96
+ Requires-Dist: pydrive; extra == "all"
97
+ Requires-Dist: fastdtw; extra == "all"
98
+ Requires-Dist: odfpy; extra == "all"
99
+ Requires-Dist: func-timeout; extra == "all"
100
+ Requires-Dist: beautifulsoup4; extra == "all"
101
+ Requires-Dist: dashscope; extra == "all"
102
+ Requires-Dist: google-generativeai; extra == "all"
103
+ Requires-Dist: PyYaml; extra == "all"
104
+ Requires-Dist: mutagen; extra == "all"
105
+ Requires-Dist: easyocr; extra == "all"
106
+ Requires-Dist: borb; extra == "all"
107
+ Requires-Dist: pypdf2; extra == "all"
108
+ Requires-Dist: lybic>=0.7.3; extra == "all"
109
+ Requires-Dist: pdfplumber; extra == "all"
110
+ Requires-Dist: azure-identity; extra == "all"
111
+ Requires-Dist: azure-mgmt-compute; extra == "all"
112
+ Requires-Dist: azure-mgmt-network; extra == "all"
113
+ Requires-Dist: docker; extra == "all"
114
+ Requires-Dist: dotenv; extra == "all"
115
+ Requires-Dist: python-pptx; extra == "all"
116
+ Requires-Dist: odfpy; extra == "all"
117
+ Requires-Dist: openpyxl; extra == "all"
118
+ Requires-Dist: pandas; extra == "all"
119
+ Requires-Dist: lxml; extra == "all"
120
+ Requires-Dist: filelock; extra == "all"
121
+ Requires-Dist: xmltodict; extra == "all"
122
+ Requires-Dist: opencv-python-headless; extra == "all"
123
+ Requires-Dist: Pillow; extra == "all"
124
+ Requires-Dist: imagehash; extra == "all"
125
+ Requires-Dist: rapidfuzz; extra == "all"
126
+ Requires-Dist: fitz; extra == "all"
127
+ Requires-Dist: imagehash; extra == "all"
128
+ Requires-Dist: odfpy; extra == "all"
129
+ Requires-Dist: pdfplumber; extra == "all"
130
+ Requires-Dist: PyYaml; extra == "all"
131
+ Requires-Dist: mutagen; extra == "all"
132
+ Requires-Dist: pypdf; extra == "all"
133
+ Requires-Dist: PyMuPDF; extra == "all"
134
+ Requires-Dist: formulas; extra == "all"
135
+ Requires-Dist: pyacoustid; extra == "all"
136
+ Requires-Dist: opencv-python~=4.8.1.78; extra == "all"
137
+ Requires-Dist: PyPDF2; extra == "all"
138
+ Requires-Dist: librosa; extra == "all"
139
+ Requires-Dist: fastdtw; extra == "all"
140
+ Requires-Dist: scikit-learn; extra == "all"
141
+ Requires-Dist: scikit-image; extra == "all"
142
+ Requires-Dist: bs4; extra == "all"
143
+ Requires-Dist: azure-identity; extra == "all"
144
+ Requires-Dist: azure-mgmt-compute; extra == "all"
145
+ Requires-Dist: azure-mgmt-network; extra == "all"
146
+ Requires-Dist: easyocr; extra == "all"
147
+ Requires-Dist: pyobjc; platform_system == "Darwin" and extra == "all"
148
+ Requires-Dist: oa_atomacos; platform_system == "Darwin" and extra == "all"
149
+ Requires-Dist: pywinauto; platform_system == "Windows" and extra == "all"
150
+ Requires-Dist: pywin32; platform_system == "Windows" and extra == "all"
97
151
  Dynamic: author
98
152
  Dynamic: license-file
99
153
  Dynamic: requires-python
@@ -470,6 +524,15 @@ If you find this codebase useful, please cite:
470
524
  }
471
525
  ```
472
526
 
527
+ ---
528
+
529
+ ## ❤️ Touch us:
530
+
531
+ <div align="center" style="display: flex; justify-content: center; gap: 20px; flex-wrap: wrap;">
532
+ <img src="assets/feishu.png" alt="Lark Group" style="width: 200px; height: auto;"/>
533
+ <img src="assets/wechat.png" alt="WeChat Group" style="width: 200px; height: auto;"/>
534
+ <img src="assets/qq.png" alt="QQ Group" style="width: 200px; height: auto;"/>
535
+ </div>
473
536
 
474
537
  ## Stargazers over time
475
538
 
@@ -51,26 +51,26 @@ desktop_env/providers/virtualbox/provider.py,sha256=kSWLSddLpn8IfeyAPyMEy_p5SOap
51
51
  desktop_env/providers/vmware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
52
  desktop_env/providers/vmware/manager.py,sha256=pFqJwF6BAijmD-LbSei68-DU7ILCTONRj7e0At5iKIg,18893
53
53
  desktop_env/providers/vmware/provider.py,sha256=88ERND67KQIxG74b10sAXJ04o5FhNpx0d9pRTi8bHrA,4080
54
- gui_agents/__init__.py,sha256=TyH2fsj-oZalVObwFb5OLOpfiyO4asqe9rqVIsIzm40,1766
55
- gui_agents/cli_app.py,sha256=yB5l6tL2eoQ6nyrd9opoxQwGgmsvKaZJXh1JPa-3H4I,22874
56
- gui_agents/agents/Action.py,sha256=YHDJwfShNYtS3AtTjD4XE9YqW1SMcbMG-LoD2SLL6ZI,6218
54
+ gui_agents/__init__.py,sha256=eeDMF1K9cBRnV0--_vezNkMfx1I9CLbbaC8Rkd4BrU8,1603
55
+ gui_agents/cli_app.py,sha256=M8zO24xPTD4WDuLgnSqSjJ6VA3SFq0-qyLncizh6D04,29046
56
+ gui_agents/agents/Action.py,sha256=aEqkrNtb5TWn5i5nkMBWTN56_9tbfRPEGw2SgkFYKeY,6197
57
57
  gui_agents/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
- gui_agents/agents/agent_s.py,sha256=BpFNbM6jlHpYezcozpmTeq8kzCPK1Y0MIBFdU19lrVI,34387
58
+ gui_agents/agents/agent_s.py,sha256=LUxLENjuHRrgycfzKjYmyZXmd5Xv3XHPAWy6g9_BvoE,34322
59
59
  gui_agents/agents/global_state.py,sha256=BS6tUeK9Z3CdUIeU0gcEjzVnc_s7naeKQsCoIQLp23g,22314
60
- gui_agents/agents/grounding.py,sha256=bmWj1daLx3agPWavc_h8XOVhOCLdw-emiuJ-KdQHEOU,22924
61
- gui_agents/agents/hardware_interface.py,sha256=IZ4IXAIuhNyyWF8PNs6q5tIxWDFfkuJBvHrcgay93BQ,4637
62
- gui_agents/agents/manager.py,sha256=5wNbKj_gbBiE7ZlLLp6EQODasgE3rd6o4JGPk_8hl5k,24106
63
- gui_agents/agents/translator.py,sha256=AgauUpAEtq4GCK37MuxPG-RW-cxzHkfRFvgT8RZtgfA,5177
64
- gui_agents/agents/worker.py,sha256=jgyywA02vFnjJmHN7WKljNQ41yUqBhQScC78MeCQ2qs,15348
60
+ gui_agents/agents/grounding.py,sha256=9BGp_emVAODZgberH2IqgjVCCNDx-eUNbe1mdnUt7ZA,22764
61
+ gui_agents/agents/hardware_interface.py,sha256=32auvpVwJ-DimTTCDguM49DEBR4JeFCeHx41Bgv3Svg,5332
62
+ gui_agents/agents/manager.py,sha256=I00ycDd8cBwXm6tJAzkTEccDE0P_R04ZAjn0uXGySY0,24030
63
+ gui_agents/agents/translator.py,sha256=WwWY1ffs2OQuh65DSVjWpfpettJVdmmCI-w92K0JeHg,5171
64
+ gui_agents/agents/worker.py,sha256=QO8pPh7YtGYZc8E5I1ACGHXzRELNnchpusK6tVNAxWA,15297
65
65
  gui_agents/agents/Backend/ADBBackend.py,sha256=J8WeFFLEPh05FmFKuGz72wgcKdKQT9kLUCHyEb8mRkk,2151
66
66
  gui_agents/agents/Backend/Backend.py,sha256=Aou3gBfur0AqL_bMn9FFeLTBM4CfL5aiIRivjqaB6zk,978
67
- gui_agents/agents/Backend/LybicBackend.py,sha256=neq_cCVlhAbss4_Ljv0B-BghpxOU2eS9PWh1ht9n_UA,13196
68
- gui_agents/agents/Backend/PyAutoGUIBackend.py,sha256=7pRy3rs2Yod21EMW7U2KxhQ0cXlU315t-8tFIWqLu98,6128
69
- gui_agents/agents/Backend/PyAutoGUIVMwareBackend.py,sha256=eo-JFtuAzuTH1otVhYcfZ1AoCKtLZVt4yWGxKIWfDbg,9903
67
+ gui_agents/agents/Backend/LybicBackend.py,sha256=A5QG4P3QAcAQO-MM7jmKU4zr5s98KReysCuQIHUU7Ec,13166
68
+ gui_agents/agents/Backend/PyAutoGUIBackend.py,sha256=KX6_cB0sW_sNAcqYhnzQ6ksMJ1cDPK1OWRXet26qg_8,6064
69
+ gui_agents/agents/Backend/PyAutoGUIVMwareBackend.py,sha256=_AEKf4qU5EiKIDOD64bicEwiGnjp-wsX5Q14v9e79M4,9910
70
70
  gui_agents/agents/Backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
71
  gui_agents/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
- gui_agents/core/engine.py,sha256=7MezEJLqJxZBjkhM0HWc9HP6oc3ajplmWTCMRHfNY0I,54627
73
- gui_agents/core/knowledge.py,sha256=RewER4oywfz8_e7ze83GYeuIlzsEB5bwHzyrk9OFyM8,18283
72
+ gui_agents/core/engine.py,sha256=_KbY4BkJ_CsAaIDSUkGK8JQ7hLG3GZ2Cn-pT5xzIPj0,54561
73
+ gui_agents/core/knowledge.py,sha256=vAyp3JZz2bWKCN6leWDO5FjF1pdLHgXp5EDxuUSjVro,18181
74
74
  gui_agents/core/mllm.py,sha256=k3BIILmb7eaNBu_pXQaD5cRpVBGkrLVQqkxQzzseZdo,21191
75
75
  gui_agents/lybic_client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
76
  gui_agents/lybic_client/lybic_client.py,sha256=E9_TRtQChEkFGe74J4HrkapVaFCG0TkjxeW9z0Je--s,2994
@@ -84,19 +84,19 @@ gui_agents/service/exceptions.py,sha256=Tk3U4eycX-wuAqR0B-TthBESKyu8KuwH5Ksng0v4
84
84
  gui_agents/store/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
85
  gui_agents/store/registry.py,sha256=KWySYUlRA5SGubqqCgOu5Lk7PvBIQQ4cEZmHoNwKzVQ,615
86
86
  gui_agents/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
- gui_agents/tools/tools.py,sha256=c5yfrPz3QMe-clFg3HkHrC6AtRWckDmF0Mb1U24FH-k,27607
87
+ gui_agents/tools/tools.py,sha256=vv6jlgUUXyop86GwiVzQYxccTCaH7ErQcjDXX3-l5yM,27555
88
88
  gui_agents/unit_test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
89
  gui_agents/unit_test/run_tests.py,sha256=HuByLtSZ1TXbn_QWduA51L4BYcv_oM6ctGcyWcoqPq8,1773
90
- gui_agents/unit_test/test_manager.py,sha256=NJyXPsjigMklK9Gh72LTN6Pw4inWsNjZ2QBmhqW9aQ0,13593
91
- gui_agents/unit_test/test_worker.py,sha256=wVIzaEJ-ULNOvbfAt78NZAy_aweRN0WTl_i2FlWPlEw,10323
90
+ gui_agents/unit_test/test_manager.py,sha256=Tj_jPtjL4xtEA37Cjn-48qBPqdj0K2Gup0tW17kdGeY,13539
91
+ gui_agents/unit_test/test_worker.py,sha256=wgcJ1jrq4jW90iH1gpw1PUGW5yj2FK1VtpDsgtvatXA,10258
92
92
  gui_agents/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
- gui_agents/utils/analyze_display.py,sha256=im8ha8ermLOf9lCrk1vSMT2y3LIe_2GcTvF4BV4av0k,10565
94
- gui_agents/utils/common_utils.py,sha256=vYvjw-0ouWLkpAVKZH0vUkGhtlHKfC2FqPVFA-Cd9CI,8788
93
+ gui_agents/utils/analyze_display.py,sha256=PTFvGi0qYsd7bI7nKJajSLXpH_GiVRk7y47UZZ2S5y4,10558
94
+ gui_agents/utils/common_utils.py,sha256=lfWg7SrGfEnu9ZS9AWP3GKhbeTbaSZ6F9oh6U_qCsFw,8752
95
95
  gui_agents/utils/display_viewer.py,sha256=hL6Pf-wpoQrrYeOi6eaGnCorkAvGWNzkLIuM9yIudnk,8731
96
96
  gui_agents/utils/embedding_manager.py,sha256=7QFITe9l0z8OKHT-yqx-BGwVMj4BRL2iJ13PgJ2-Yak,2117
97
97
  gui_agents/utils/image_axis_utils.py,sha256=z21cVAE2ZOK1DR7wK10JHg8aZapkX2oGI6D93pKZEao,878
98
- lybic_guiagents-0.2.0.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
99
- lybic_guiagents-0.2.0.dist-info/METADATA,sha256=MPPnculu4ChprhxnIO7Q8N3fWh5IE5FSDVhrE5WE6ik,16403
100
- lybic_guiagents-0.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
101
- lybic_guiagents-0.2.0.dist-info/top_level.txt,sha256=NFP1jNNbbEGUexavwh7g0z_23hahrdgEV_9AjdynSw0,23
102
- lybic_guiagents-0.2.0.dist-info/RECORD,,
98
+ lybic_guiagents-0.2.1.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
99
+ lybic_guiagents-0.2.1.dist-info/METADATA,sha256=lLvK-anMJ7gknSlQNup_s3QCkVFzQzONFQiTLXJdC4U,20655
100
+ lybic_guiagents-0.2.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
101
+ lybic_guiagents-0.2.1.dist-info/top_level.txt,sha256=NFP1jNNbbEGUexavwh7g0z_23hahrdgEV_9AjdynSw0,23
102
+ lybic_guiagents-0.2.1.dist-info/RECORD,,