lybic-guiagents 0.1.0__py3-none-any.whl → 0.2.0__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 +67 -0
- gui_agents/agents/Backend/ADBBackend.py +62 -0
- gui_agents/agents/Backend/Backend.py +28 -0
- gui_agents/agents/Backend/LybicBackend.py +355 -0
- gui_agents/agents/Backend/PyAutoGUIBackend.py +186 -0
- gui_agents/agents/Backend/PyAutoGUIVMwareBackend.py +250 -0
- gui_agents/agents/Backend/__init__.py +0 -0
- gui_agents/agents/hardware_interface.py +4 -2
- gui_agents/lybic_client/__init__.py +0 -0
- gui_agents/lybic_client/lybic_client.py +88 -0
- gui_agents/prompts/__init__.py +0 -0
- gui_agents/prompts/prompts.py +869 -0
- gui_agents/service/__init__.py +19 -0
- gui_agents/service/agent_service.py +527 -0
- gui_agents/service/api_models.py +136 -0
- gui_agents/service/config.py +241 -0
- gui_agents/service/exceptions.py +35 -0
- gui_agents/store/__init__.py +0 -0
- gui_agents/store/registry.py +22 -0
- {lybic_guiagents-0.1.0.dist-info → lybic_guiagents-0.2.0.dist-info}/METADATA +69 -4
- {lybic_guiagents-0.1.0.dist-info → lybic_guiagents-0.2.0.dist-info}/RECORD +24 -7
- {lybic_guiagents-0.1.0.dist-info → lybic_guiagents-0.2.0.dist-info}/WHEEL +0 -0
- {lybic_guiagents-0.1.0.dist-info → lybic_guiagents-0.2.0.dist-info}/licenses/LICENSE +0 -0
- {lybic_guiagents-0.1.0.dist-info → lybic_guiagents-0.2.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"""Configuration management for Agent Service"""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import json
|
|
5
|
+
import platform
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from typing import Dict, Any, Optional, Union
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from .exceptions import ConfigurationError, APIKeyError
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass
|
|
13
|
+
class LLMConfig:
|
|
14
|
+
"""LLM provider configuration"""
|
|
15
|
+
provider: str # openai, anthropic, zhipu, etc.
|
|
16
|
+
model: str
|
|
17
|
+
api_key: Optional[str] = None
|
|
18
|
+
base_url: Optional[str] = None
|
|
19
|
+
api_version: Optional[str] = None
|
|
20
|
+
rate_limit: int = -1
|
|
21
|
+
extra_params: Dict[str, Any] = field(default_factory=dict)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass
|
|
25
|
+
class ServiceConfig:
|
|
26
|
+
"""Comprehensive service configuration with multi-level API key support"""
|
|
27
|
+
|
|
28
|
+
# Agent settings
|
|
29
|
+
default_backend: str = 'lybic'
|
|
30
|
+
default_mode: str = 'normal'
|
|
31
|
+
default_max_steps: int = 50
|
|
32
|
+
default_platform: str = field(default_factory=lambda: platform.system().lower())
|
|
33
|
+
|
|
34
|
+
# Service settings
|
|
35
|
+
max_concurrent_tasks: int = 5
|
|
36
|
+
task_timeout: int = 3600 # 1 hour
|
|
37
|
+
enable_takeover: bool = False
|
|
38
|
+
enable_search: bool = True
|
|
39
|
+
|
|
40
|
+
# Logging settings
|
|
41
|
+
log_level: str = 'INFO'
|
|
42
|
+
log_dir: str = 'runtime'
|
|
43
|
+
|
|
44
|
+
# LLM configuration
|
|
45
|
+
llm_config: Optional[LLMConfig] = None
|
|
46
|
+
|
|
47
|
+
# API Keys - multiple providers support
|
|
48
|
+
api_keys: Dict[str, str] = field(default_factory=dict)
|
|
49
|
+
|
|
50
|
+
# Backend-specific configurations
|
|
51
|
+
backend_configs: Dict[str, Dict[str, Any]] = field(default_factory=dict)
|
|
52
|
+
|
|
53
|
+
# Environment variable mappings
|
|
54
|
+
env_mapping: Dict[str, str] = field(default_factory=lambda: {
|
|
55
|
+
'AGENT_BACKEND': 'default_backend',
|
|
56
|
+
'AGENT_MODE': 'default_mode',
|
|
57
|
+
'AGENT_MAX_STEPS': 'default_max_steps',
|
|
58
|
+
'AGENT_LOG_LEVEL': 'log_level',
|
|
59
|
+
'AGENT_LOG_DIR': 'log_dir',
|
|
60
|
+
'AGENT_TASK_TIMEOUT': 'task_timeout',
|
|
61
|
+
'AGENT_ENABLE_TAKEOVER': 'enable_takeover',
|
|
62
|
+
'AGENT_ENABLE_SEARCH': 'enable_search',
|
|
63
|
+
# Lybic specific
|
|
64
|
+
'LYBIC_PRECREATE_SID': 'lybic_sid',
|
|
65
|
+
'LYBIC_API_KEY': 'lybic_api_key',
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
# Known API key environment variables
|
|
69
|
+
api_key_env_vars: Dict[str, str] = field(default_factory=lambda: {
|
|
70
|
+
'openai': 'OPENAI_API_KEY',
|
|
71
|
+
'anthropic': 'ANTHROPIC_API_KEY',
|
|
72
|
+
'zhipu': 'ZHIPU_API_KEY',
|
|
73
|
+
'gemini': 'GEMINI_API_KEY',
|
|
74
|
+
'groq': 'GROQ_API_KEY',
|
|
75
|
+
'deepseek': 'DEEPSEEK_API_KEY',
|
|
76
|
+
'dashscope': 'DASHSCOPE_API_KEY',
|
|
77
|
+
'azure_openai': 'AZURE_OPENAI_API_KEY',
|
|
78
|
+
'lybic': 'LYBIC_API_KEY',
|
|
79
|
+
'huggingface': 'HF_TOKEN',
|
|
80
|
+
'siliconflow': 'SILICONFLOW_API_KEY',
|
|
81
|
+
'monica': 'MONICA_API_KEY',
|
|
82
|
+
'openrouter': 'OPENROUTER_API_KEY',
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
@classmethod
|
|
86
|
+
def from_env(cls, config_file: Optional[Union[str, Path]] = None) -> 'ServiceConfig':
|
|
87
|
+
"""Create configuration from environment variables and optional config file
|
|
88
|
+
|
|
89
|
+
Priority order (highest to lowest):
|
|
90
|
+
1. Environment variables
|
|
91
|
+
2. Config file
|
|
92
|
+
3. Default values
|
|
93
|
+
"""
|
|
94
|
+
config = cls()
|
|
95
|
+
|
|
96
|
+
# Load from config file first (lower priority)
|
|
97
|
+
if config_file:
|
|
98
|
+
config = config.load_from_file(config_file)
|
|
99
|
+
|
|
100
|
+
# Override with environment variables (higher priority)
|
|
101
|
+
config._load_from_env()
|
|
102
|
+
|
|
103
|
+
return config
|
|
104
|
+
|
|
105
|
+
def _load_from_env(self):
|
|
106
|
+
"""Load configuration from environment variables"""
|
|
107
|
+
# Load general settings
|
|
108
|
+
for env_key, attr_name in self.env_mapping.items():
|
|
109
|
+
if env_key in os.environ:
|
|
110
|
+
value = os.environ[env_key]
|
|
111
|
+
# Type conversion based on attribute type
|
|
112
|
+
if hasattr(self, attr_name):
|
|
113
|
+
current_value = getattr(self, attr_name)
|
|
114
|
+
if isinstance(current_value, bool):
|
|
115
|
+
value = value.lower() in ('true', '1', 'yes', 'on')
|
|
116
|
+
elif isinstance(current_value, int):
|
|
117
|
+
try:
|
|
118
|
+
value = int(value)
|
|
119
|
+
except ValueError:
|
|
120
|
+
continue
|
|
121
|
+
setattr(self, attr_name, value)
|
|
122
|
+
|
|
123
|
+
# Load API keys from environment
|
|
124
|
+
for provider, env_var in self.api_key_env_vars.items():
|
|
125
|
+
if env_var in os.environ:
|
|
126
|
+
self.api_keys[provider] = os.environ[env_var]
|
|
127
|
+
|
|
128
|
+
@classmethod
|
|
129
|
+
def load_from_file(cls, config_file: Union[str, Path]) -> 'ServiceConfig':
|
|
130
|
+
"""Load configuration from JSON file"""
|
|
131
|
+
config_path = Path(config_file)
|
|
132
|
+
|
|
133
|
+
if not config_path.exists():
|
|
134
|
+
raise ConfigurationError(f"Configuration file not found: {config_path}")
|
|
135
|
+
|
|
136
|
+
try:
|
|
137
|
+
with open(config_path, 'r', encoding='utf-8') as f:
|
|
138
|
+
data = json.load(f)
|
|
139
|
+
|
|
140
|
+
# Create config instance
|
|
141
|
+
config = cls()
|
|
142
|
+
|
|
143
|
+
# Update with file data
|
|
144
|
+
for key, value in data.items():
|
|
145
|
+
if hasattr(config, key):
|
|
146
|
+
setattr(config, key, value)
|
|
147
|
+
|
|
148
|
+
return config
|
|
149
|
+
|
|
150
|
+
except json.JSONDecodeError as e:
|
|
151
|
+
raise ConfigurationError("Invalid JSON in config file") from e
|
|
152
|
+
except OSError as e:
|
|
153
|
+
raise ConfigurationError("Error loading config file") from e
|
|
154
|
+
|
|
155
|
+
def save_to_file(self, config_file: Union[str, Path]):
|
|
156
|
+
"""Save configuration to JSON file"""
|
|
157
|
+
config_path = Path(config_file)
|
|
158
|
+
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
159
|
+
|
|
160
|
+
# Convert to dict, excluding non-serializable fields
|
|
161
|
+
data = {}
|
|
162
|
+
for key, value in self.__dict__.items():
|
|
163
|
+
if not key.startswith('_') and key not in ['env_mapping', 'api_key_env_vars']:
|
|
164
|
+
data[key] = value
|
|
165
|
+
|
|
166
|
+
try:
|
|
167
|
+
with open(config_path, 'w', encoding='utf-8') as f:
|
|
168
|
+
json.dump(data, f, indent=2, ensure_ascii=False)
|
|
169
|
+
except Exception as e:
|
|
170
|
+
raise ConfigurationError(f"Error saving config file: {e}")
|
|
171
|
+
|
|
172
|
+
def get_api_key(self, provider: str, required: bool = True) -> Optional[str]:
|
|
173
|
+
"""Get API key for a provider with fallback chain
|
|
174
|
+
|
|
175
|
+
Priority:
|
|
176
|
+
1. Direct api_keys dict
|
|
177
|
+
2. Environment variable
|
|
178
|
+
3. None (if not required)
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
provider: Provider name (openai, anthropic, etc.)
|
|
182
|
+
required: Whether to raise error if not found
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
API key string or None
|
|
186
|
+
|
|
187
|
+
Raises:
|
|
188
|
+
APIKeyError: If required but not found
|
|
189
|
+
"""
|
|
190
|
+
# Check direct api_keys dict first
|
|
191
|
+
if provider in self.api_keys:
|
|
192
|
+
return self.api_keys[provider]
|
|
193
|
+
|
|
194
|
+
# Check environment variable
|
|
195
|
+
if provider in self.api_key_env_vars:
|
|
196
|
+
env_var = self.api_key_env_vars[provider]
|
|
197
|
+
if env_var in os.environ:
|
|
198
|
+
api_key = os.environ[env_var]
|
|
199
|
+
# Cache it for future use
|
|
200
|
+
self.api_keys[provider] = api_key
|
|
201
|
+
return api_key
|
|
202
|
+
|
|
203
|
+
# Not found
|
|
204
|
+
if required:
|
|
205
|
+
env_var = self.api_key_env_vars.get(provider, f"{provider.upper()}_API_KEY")
|
|
206
|
+
raise APIKeyError(
|
|
207
|
+
f"API key for '{provider}' not found. "
|
|
208
|
+
f"Please provide it via api_keys parameter or {env_var} environment variable"
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
return None
|
|
212
|
+
|
|
213
|
+
def set_api_key(self, provider: str, api_key: str):
|
|
214
|
+
"""Set API key for a provider"""
|
|
215
|
+
self.api_keys[provider] = api_key
|
|
216
|
+
|
|
217
|
+
def get_backend_config(self, backend: str) -> Dict[str, Any]:
|
|
218
|
+
"""Get backend-specific configuration"""
|
|
219
|
+
return self.backend_configs.get(backend, {})
|
|
220
|
+
|
|
221
|
+
def set_backend_config(self, backend: str, config: Dict[str, Any]):
|
|
222
|
+
"""Set backend-specific configuration"""
|
|
223
|
+
self.backend_configs[backend] = config
|
|
224
|
+
|
|
225
|
+
def validate(self):
|
|
226
|
+
"""Validate configuration"""
|
|
227
|
+
if self.default_max_steps <= 0:
|
|
228
|
+
raise ConfigurationError("default_max_steps must be positive")
|
|
229
|
+
|
|
230
|
+
if self.task_timeout <= 0:
|
|
231
|
+
raise ConfigurationError("task_timeout must be positive")
|
|
232
|
+
|
|
233
|
+
if self.max_concurrent_tasks <= 0:
|
|
234
|
+
raise ConfigurationError("max_concurrent_tasks must be positive")
|
|
235
|
+
|
|
236
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
237
|
+
"""Convert configuration to dictionary"""
|
|
238
|
+
return {
|
|
239
|
+
key: value for key, value in self.__dict__.items()
|
|
240
|
+
if not key.startswith('_')
|
|
241
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Custom exceptions for the Agent Service"""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class AgentServiceError(Exception):
|
|
5
|
+
"""Base exception for Agent Service errors"""
|
|
6
|
+
pass
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ConfigurationError(AgentServiceError):
|
|
10
|
+
"""Raised when there are configuration issues"""
|
|
11
|
+
pass
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TaskExecutionError(AgentServiceError):
|
|
15
|
+
"""Raised when task execution fails"""
|
|
16
|
+
|
|
17
|
+
def __init__(self, message: str, task_id: str | None = None, step: int | None = None):
|
|
18
|
+
super().__init__(message)
|
|
19
|
+
self.task_id = task_id
|
|
20
|
+
self.step = step
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class TaskTimeoutError(TaskExecutionError):
|
|
24
|
+
"""Raised when task execution times out"""
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class BackendError(AgentServiceError):
|
|
29
|
+
"""Raised when backend operations fail"""
|
|
30
|
+
pass
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class APIKeyError(ConfigurationError):
|
|
34
|
+
"""Raised when API key configuration is invalid"""
|
|
35
|
+
pass
|
|
File without changes
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# gui_agents/s2/store/registry.py
|
|
2
|
+
|
|
3
|
+
# Usage: in any file, get the object through Registry.get
|
|
4
|
+
# from gui_agents.store.registry import Registry
|
|
5
|
+
# GlobalStateStore = Registry.get("GlobalStateStore")
|
|
6
|
+
|
|
7
|
+
class Registry:
|
|
8
|
+
_services: dict[str, object] = {}
|
|
9
|
+
|
|
10
|
+
@classmethod
|
|
11
|
+
def register(cls, name: str, obj: object):
|
|
12
|
+
cls._services[name] = obj
|
|
13
|
+
|
|
14
|
+
@classmethod
|
|
15
|
+
def get(cls, name: str) -> object:
|
|
16
|
+
if name not in cls._services:
|
|
17
|
+
raise KeyError(f"{name!r} not registered in Registry")
|
|
18
|
+
return cls._services[name]
|
|
19
|
+
|
|
20
|
+
@classmethod
|
|
21
|
+
def clear(cls):
|
|
22
|
+
cls._services.clear()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lybic-guiagents
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
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>
|
|
@@ -33,7 +33,7 @@ Requires-Dist: certifi
|
|
|
33
33
|
Requires-Dist: pytesseract
|
|
34
34
|
Requires-Dist: google-genai
|
|
35
35
|
Requires-Dist: python-dotenv
|
|
36
|
-
Requires-Dist: Pillow
|
|
36
|
+
Requires-Dist: Pillow>=11.3.0
|
|
37
37
|
Requires-Dist: fabric
|
|
38
38
|
Requires-Dist: gymnasium~=0.28.1
|
|
39
39
|
Requires-Dist: requests~=2.31.0
|
|
@@ -88,9 +88,12 @@ Requires-Dist: azure-mgmt-network
|
|
|
88
88
|
Requires-Dist: docker
|
|
89
89
|
Requires-Dist: loguru
|
|
90
90
|
Requires-Dist: dotenv
|
|
91
|
+
Requires-Dist: lybic>=0.7.0
|
|
91
92
|
Requires-Dist: pyobjc; platform_system == "Darwin"
|
|
92
93
|
Requires-Dist: pywinauto; platform_system == "Windows"
|
|
93
94
|
Requires-Dist: pywin32; platform_system == "Windows"
|
|
95
|
+
Provides-Extra: dev
|
|
96
|
+
Requires-Dist: pytest; extra == "dev"
|
|
94
97
|
Dynamic: author
|
|
95
98
|
Dynamic: license-file
|
|
96
99
|
Dynamic: requires-python
|
|
@@ -109,6 +112,19 @@ Dynamic: requires-python
|
|
|
109
112
|
Lybic GUI Agent: <small>An open-source agentic framework for Computer Use Agents</small>
|
|
110
113
|
</h1>
|
|
111
114
|
|
|
115
|
+
<p align="center">
|
|
116
|
+
<small>Supported OS:</small>
|
|
117
|
+
<img src="https://img.shields.io/badge/OS-Windows-blue?logo=windows&logoColor=white" alt="Windows">
|
|
118
|
+
<img src="https://img.shields.io/badge/OS-macOS-black?logo=apple&logoColor=white" alt="macOS">
|
|
119
|
+
<img src="https://img.shields.io/badge/OS-Linux-yellow?logo=linux&logoColor=black" alt="Linux">
|
|
120
|
+
<br/>
|
|
121
|
+
<small>Latest Version:</small><a href="https://pypi.org/project/lybic-guiagents/"><img alt="PyPI" src="https://img.shields.io/pypi/v/lybic-guiagents"></a>
|
|
122
|
+
|
|
123
|
+
<a href="https://github.com/lybic/agent/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/pypi/l/lybic-guiagents"></a>
|
|
124
|
+
|
|
125
|
+
<a href="https://github.com/lybic/agent"><img alt="Stars" src="https://img.shields.io/github/stars/lybic/agent?style=social"></a>
|
|
126
|
+
</p>
|
|
127
|
+
|
|
112
128
|
## What is Lybic GUI Agent?
|
|
113
129
|
|
|
114
130
|
Lybic platform placeholder - comprehensive AI platform for building and deploying intelligent agents
|
|
@@ -124,6 +140,7 @@ Lybic GUI Agent is an open-source framework that enables developers and business
|
|
|
124
140
|
</div>
|
|
125
141
|
|
|
126
142
|
## 🥳 Updates
|
|
143
|
+
- [x] **2025/09/14**: The paper has been accepted by [arxiv](https://arxiv.org/abs/2509.11067)
|
|
127
144
|
- [x] **2025/09/09**: We achieved the world's first place in the 50-step length of [OS-world](https://os-world.github.io/)!
|
|
128
145
|
- [x] **2025/08/08**: Released v0.1.0 of [Lybic GUI Agent](https://github.com/lybic/agent) library, with support for Windows, Mac, Ubuntu and Lybic API!
|
|
129
146
|
|
|
@@ -132,6 +149,8 @@ Lybic GUI Agent is an open-source framework that enables developers and business
|
|
|
132
149
|
1. [💡 Introduction](#-introduction)
|
|
133
150
|
2. [🛠️ Installation & Setup](#%EF%B8%8F-installation--setup)
|
|
134
151
|
3. [🚀 Usage](#-usage)
|
|
152
|
+
4. [🔧 Troubleshooting](#-troubleshooting)
|
|
153
|
+
5. [💬 Citations](#-citations)
|
|
135
154
|
|
|
136
155
|
## 💡 Introduction
|
|
137
156
|
|
|
@@ -161,7 +180,7 @@ Lybic GUI Agent is an open-source framework that enables developers and business
|
|
|
161
180
|
<tr>
|
|
162
181
|
<td>OSWorld Verified (50 step)</td>
|
|
163
182
|
<td><b>57.1%</b></td>
|
|
164
|
-
<td>
|
|
183
|
+
<td>54.2%</td>
|
|
165
184
|
</tr>
|
|
166
185
|
</table>
|
|
167
186
|
</div>
|
|
@@ -176,7 +195,15 @@ Lybic GUI Agent is an open-source framework that enables developers and business
|
|
|
176
195
|
> [!WARNING]
|
|
177
196
|
> To leverage the full potential of Lybic GUI Agent, we support multiple model providers including OpenAI, Anthropic, Gemini, and Doubao. For the best visual grounding performance, we recommend using UI-TARS models.
|
|
178
197
|
|
|
179
|
-
### Installation
|
|
198
|
+
### Installation(from pip)
|
|
199
|
+
|
|
200
|
+
You can install Lybic GUI Agent by using pip:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
pip install lybic-guiagents
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Installation(from source code)
|
|
180
207
|
|
|
181
208
|
You can use [UV](https://docs.astral.sh/uv/getting-started/installation/) (a modern Python package manager) version 0.8.5 for installation:
|
|
182
209
|
|
|
@@ -277,6 +304,7 @@ Run in interactive mode with the `lybic` backend:
|
|
|
277
304
|
python gui_agents/cli_app.py --backend lybic
|
|
278
305
|
```
|
|
279
306
|
|
|
307
|
+
|
|
280
308
|
Run a single query with the `pyautogui` backend and a maximum of 20 steps:
|
|
281
309
|
```sh
|
|
282
310
|
python gui_agents/cli_app.py --backend pyautogui --query "Find the result of 8 × 7 on a calculator" --max-steps 20
|
|
@@ -308,6 +336,25 @@ LYBIC_MAX_LIFE_SECONDS=3600
|
|
|
308
336
|
> LYBIC_PRECREATE_SID=SBX-XXXXXXXXXXXXXXX
|
|
309
337
|
> ```
|
|
310
338
|
|
|
339
|
+
### Use as a service
|
|
340
|
+
|
|
341
|
+
After installing lybic-guiagents, you can run it as a service.
|
|
342
|
+
|
|
343
|
+
Main Components:
|
|
344
|
+
- AgentService: High-level service interface (recommended for most users)
|
|
345
|
+
- AgentS2, AgentSFast: Core agent implementations
|
|
346
|
+
- HardwareInterface: Hardware abstraction layer
|
|
347
|
+
- ServiceConfig: Configuration management
|
|
348
|
+
|
|
349
|
+
Quick Start:
|
|
350
|
+
|
|
351
|
+
```python
|
|
352
|
+
from gui_agents import AgentService
|
|
353
|
+
service = AgentService()
|
|
354
|
+
result = service.execute_task("Take a screenshot")
|
|
355
|
+
print(f"Task completed: {result.status}")
|
|
356
|
+
```
|
|
357
|
+
|
|
311
358
|
### VMware Configuration
|
|
312
359
|
|
|
313
360
|
To use PyAutoGUI with VMware, you need to install [VMware Workstation Pro](https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion) (on Windows) and create a virtual machine.
|
|
@@ -358,6 +405,7 @@ USE_PRECREATE_VM=Ubuntu
|
|
|
358
405
|
```bash
|
|
359
406
|
uv sync
|
|
360
407
|
uv pip install -e .
|
|
408
|
+
# uv pip install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple
|
|
361
409
|
```
|
|
362
410
|
|
|
363
411
|
#### 3. Lybic Sandbox Connection Issues
|
|
@@ -406,6 +454,23 @@ If you encounter issues not covered here:
|
|
|
406
454
|
- Complete error messages
|
|
407
455
|
- Steps to reproduce the issue
|
|
408
456
|
|
|
457
|
+
## 💬 Citations
|
|
458
|
+
|
|
459
|
+
If you find this codebase useful, please cite:
|
|
460
|
+
|
|
461
|
+
```bibtex
|
|
462
|
+
@misc{guo2025agenticlybicmultiagentexecution,
|
|
463
|
+
title={Agentic Lybic: Multi-Agent Execution System with Tiered Reasoning and Orchestration},
|
|
464
|
+
author={Liangxuan Guo and Bin Zhu and Qingqian Tao and Kangning Liu and Xun Zhao and Xianzhe Qin and Jin Gao and Guangfu Hao},
|
|
465
|
+
year={2025},
|
|
466
|
+
eprint={2509.11067},
|
|
467
|
+
archivePrefix={arXiv},
|
|
468
|
+
primaryClass={cs.AI},
|
|
469
|
+
url={https://arxiv.org/abs/2509.11067},
|
|
470
|
+
}
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
|
|
409
474
|
## Stargazers over time
|
|
410
475
|
|
|
411
476
|
[](https://starchart.cc/lybic/agent)
|
|
@@ -51,21 +51,38 @@ 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=
|
|
54
|
+
gui_agents/__init__.py,sha256=TyH2fsj-oZalVObwFb5OLOpfiyO4asqe9rqVIsIzm40,1766
|
|
55
55
|
gui_agents/cli_app.py,sha256=yB5l6tL2eoQ6nyrd9opoxQwGgmsvKaZJXh1JPa-3H4I,22874
|
|
56
56
|
gui_agents/agents/Action.py,sha256=YHDJwfShNYtS3AtTjD4XE9YqW1SMcbMG-LoD2SLL6ZI,6218
|
|
57
57
|
gui_agents/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
58
58
|
gui_agents/agents/agent_s.py,sha256=BpFNbM6jlHpYezcozpmTeq8kzCPK1Y0MIBFdU19lrVI,34387
|
|
59
59
|
gui_agents/agents/global_state.py,sha256=BS6tUeK9Z3CdUIeU0gcEjzVnc_s7naeKQsCoIQLp23g,22314
|
|
60
60
|
gui_agents/agents/grounding.py,sha256=bmWj1daLx3agPWavc_h8XOVhOCLdw-emiuJ-KdQHEOU,22924
|
|
61
|
-
gui_agents/agents/hardware_interface.py,sha256=
|
|
61
|
+
gui_agents/agents/hardware_interface.py,sha256=IZ4IXAIuhNyyWF8PNs6q5tIxWDFfkuJBvHrcgay93BQ,4637
|
|
62
62
|
gui_agents/agents/manager.py,sha256=5wNbKj_gbBiE7ZlLLp6EQODasgE3rd6o4JGPk_8hl5k,24106
|
|
63
63
|
gui_agents/agents/translator.py,sha256=AgauUpAEtq4GCK37MuxPG-RW-cxzHkfRFvgT8RZtgfA,5177
|
|
64
64
|
gui_agents/agents/worker.py,sha256=jgyywA02vFnjJmHN7WKljNQ41yUqBhQScC78MeCQ2qs,15348
|
|
65
|
+
gui_agents/agents/Backend/ADBBackend.py,sha256=J8WeFFLEPh05FmFKuGz72wgcKdKQT9kLUCHyEb8mRkk,2151
|
|
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
|
|
70
|
+
gui_agents/agents/Backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
65
71
|
gui_agents/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
66
72
|
gui_agents/core/engine.py,sha256=7MezEJLqJxZBjkhM0HWc9HP6oc3ajplmWTCMRHfNY0I,54627
|
|
67
73
|
gui_agents/core/knowledge.py,sha256=RewER4oywfz8_e7ze83GYeuIlzsEB5bwHzyrk9OFyM8,18283
|
|
68
74
|
gui_agents/core/mllm.py,sha256=k3BIILmb7eaNBu_pXQaD5cRpVBGkrLVQqkxQzzseZdo,21191
|
|
75
|
+
gui_agents/lybic_client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
76
|
+
gui_agents/lybic_client/lybic_client.py,sha256=E9_TRtQChEkFGe74J4HrkapVaFCG0TkjxeW9z0Je--s,2994
|
|
77
|
+
gui_agents/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
78
|
+
gui_agents/prompts/prompts.py,sha256=w9ZP4FhuBDzWP7J0Urn69woLhas9AIWTtNfC1tys59c,67050
|
|
79
|
+
gui_agents/service/__init__.py,sha256=5WsJ0Mx3e5BAP9qQMhoVimhOgTIndGeVcasGNoo1s-c,518
|
|
80
|
+
gui_agents/service/agent_service.py,sha256=ZAPQjO76GRP7P0n_prU76NK5d7fzHk1pqLJ7a9rHt-Q,20969
|
|
81
|
+
gui_agents/service/api_models.py,sha256=06iFyaV6ttROsNiS2GnAAaB4kR1XNpSRuUHD2W60L8o,3949
|
|
82
|
+
gui_agents/service/config.py,sha256=WODT8RpaMFQ_oSshfDWsq_M8inPMHTlWYjoFoRpn6FY,8595
|
|
83
|
+
gui_agents/service/exceptions.py,sha256=Tk3U4eycX-wuAqR0B-TthBESKyu8KuwH5Ksng0v4juo,831
|
|
84
|
+
gui_agents/store/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
85
|
+
gui_agents/store/registry.py,sha256=KWySYUlRA5SGubqqCgOu5Lk7PvBIQQ4cEZmHoNwKzVQ,615
|
|
69
86
|
gui_agents/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
70
87
|
gui_agents/tools/tools.py,sha256=c5yfrPz3QMe-clFg3HkHrC6AtRWckDmF0Mb1U24FH-k,27607
|
|
71
88
|
gui_agents/unit_test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -78,8 +95,8 @@ gui_agents/utils/common_utils.py,sha256=vYvjw-0ouWLkpAVKZH0vUkGhtlHKfC2FqPVFA-Cd
|
|
|
78
95
|
gui_agents/utils/display_viewer.py,sha256=hL6Pf-wpoQrrYeOi6eaGnCorkAvGWNzkLIuM9yIudnk,8731
|
|
79
96
|
gui_agents/utils/embedding_manager.py,sha256=7QFITe9l0z8OKHT-yqx-BGwVMj4BRL2iJ13PgJ2-Yak,2117
|
|
80
97
|
gui_agents/utils/image_axis_utils.py,sha256=z21cVAE2ZOK1DR7wK10JHg8aZapkX2oGI6D93pKZEao,878
|
|
81
|
-
lybic_guiagents-0.
|
|
82
|
-
lybic_guiagents-0.
|
|
83
|
-
lybic_guiagents-0.
|
|
84
|
-
lybic_guiagents-0.
|
|
85
|
-
lybic_guiagents-0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|