cua-computer 0.4.4__py3-none-any.whl → 0.4.6__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.
- computer/computer.py +2 -2
- computer/diorama_computer.py +139 -0
- computer/providers/winsandbox/provider.py +27 -6
- computer/providers/winsandbox/setup_script.ps1 +33 -8
- {cua_computer-0.4.4.dist-info → cua_computer-0.4.6.dist-info}/METADATA +10 -81
- {cua_computer-0.4.4.dist-info → cua_computer-0.4.6.dist-info}/RECORD +8 -8
- {cua_computer-0.4.4.dist-info → cua_computer-0.4.6.dist-info}/WHEEL +0 -0
- {cua_computer-0.4.4.dist-info → cua_computer-0.4.6.dist-info}/entry_points.txt +0 -0
computer/computer.py
CHANGED
@@ -154,8 +154,8 @@ class Computer:
|
|
154
154
|
self.interface_logger = Logger("computer.interface", verbosity)
|
155
155
|
|
156
156
|
if not use_host_computer_server:
|
157
|
-
if ":" not in image
|
158
|
-
|
157
|
+
if ":" not in image:
|
158
|
+
image = f"{image}:latest"
|
159
159
|
|
160
160
|
if not name:
|
161
161
|
# Normalize the name to be used for the VM
|
computer/diorama_computer.py
CHANGED
@@ -6,16 +6,35 @@ class DioramaComputer:
|
|
6
6
|
A Computer-compatible proxy for Diorama that sends commands over the ComputerInterface.
|
7
7
|
"""
|
8
8
|
def __init__(self, computer, apps):
|
9
|
+
"""
|
10
|
+
Initialize the DioramaComputer with a computer instance and list of apps.
|
11
|
+
|
12
|
+
Args:
|
13
|
+
computer: The computer instance to proxy commands through
|
14
|
+
apps: List of applications available in the diorama environment
|
15
|
+
"""
|
9
16
|
self.computer = computer
|
10
17
|
self.apps = apps
|
11
18
|
self.interface = DioramaComputerInterface(computer, apps)
|
12
19
|
self._initialized = False
|
13
20
|
|
14
21
|
async def __aenter__(self):
|
22
|
+
"""
|
23
|
+
Async context manager entry point.
|
24
|
+
|
25
|
+
Returns:
|
26
|
+
self: The DioramaComputer instance
|
27
|
+
"""
|
15
28
|
self._initialized = True
|
16
29
|
return self
|
17
30
|
|
18
31
|
async def run(self):
|
32
|
+
"""
|
33
|
+
Initialize and run the DioramaComputer if not already initialized.
|
34
|
+
|
35
|
+
Returns:
|
36
|
+
self: The DioramaComputer instance
|
37
|
+
"""
|
19
38
|
if not self._initialized:
|
20
39
|
await self.__aenter__()
|
21
40
|
return self
|
@@ -25,11 +44,31 @@ class DioramaComputerInterface:
|
|
25
44
|
Diorama Interface proxy that sends diorama_cmds via the Computer's interface.
|
26
45
|
"""
|
27
46
|
def __init__(self, computer, apps):
|
47
|
+
"""
|
48
|
+
Initialize the DioramaComputerInterface.
|
49
|
+
|
50
|
+
Args:
|
51
|
+
computer: The computer instance to send commands through
|
52
|
+
apps: List of applications available in the diorama environment
|
53
|
+
"""
|
28
54
|
self.computer = computer
|
29
55
|
self.apps = apps
|
30
56
|
self._scene_size = None
|
31
57
|
|
32
58
|
async def _send_cmd(self, action, arguments=None):
|
59
|
+
"""
|
60
|
+
Send a command to the diorama interface through the computer.
|
61
|
+
|
62
|
+
Args:
|
63
|
+
action (str): The action/command to execute
|
64
|
+
arguments (dict, optional): Additional arguments for the command
|
65
|
+
|
66
|
+
Returns:
|
67
|
+
The result from the diorama command execution
|
68
|
+
|
69
|
+
Raises:
|
70
|
+
RuntimeError: If the computer interface is not initialized or command fails
|
71
|
+
"""
|
33
72
|
arguments = arguments or {}
|
34
73
|
arguments = {"app_list": self.apps, **arguments}
|
35
74
|
# Use the computer's interface (must be initialized)
|
@@ -42,6 +81,15 @@ class DioramaComputerInterface:
|
|
42
81
|
return result.get("result")
|
43
82
|
|
44
83
|
async def screenshot(self, as_bytes=True):
|
84
|
+
"""
|
85
|
+
Take a screenshot of the diorama scene.
|
86
|
+
|
87
|
+
Args:
|
88
|
+
as_bytes (bool): If True, return image as bytes; if False, return PIL Image object
|
89
|
+
|
90
|
+
Returns:
|
91
|
+
bytes or PIL.Image: Screenshot data in the requested format
|
92
|
+
"""
|
45
93
|
from PIL import Image
|
46
94
|
import base64
|
47
95
|
result = await self._send_cmd("screenshot")
|
@@ -53,41 +101,122 @@ class DioramaComputerInterface:
|
|
53
101
|
return img_bytes if as_bytes else img
|
54
102
|
|
55
103
|
async def get_screen_size(self):
|
104
|
+
"""
|
105
|
+
Get the dimensions of the diorama scene.
|
106
|
+
|
107
|
+
Returns:
|
108
|
+
dict: Dictionary containing 'width' and 'height' keys with pixel dimensions
|
109
|
+
"""
|
56
110
|
if not self._scene_size:
|
57
111
|
await self.screenshot(as_bytes=False)
|
58
112
|
return {"width": self._scene_size[0], "height": self._scene_size[1]}
|
59
113
|
|
60
114
|
async def move_cursor(self, x, y):
|
115
|
+
"""
|
116
|
+
Move the cursor to the specified coordinates.
|
117
|
+
|
118
|
+
Args:
|
119
|
+
x (int): X coordinate to move cursor to
|
120
|
+
y (int): Y coordinate to move cursor to
|
121
|
+
"""
|
61
122
|
await self._send_cmd("move_cursor", {"x": x, "y": y})
|
62
123
|
|
63
124
|
async def left_click(self, x=None, y=None):
|
125
|
+
"""
|
126
|
+
Perform a left mouse click at the specified coordinates or current cursor position.
|
127
|
+
|
128
|
+
Args:
|
129
|
+
x (int, optional): X coordinate to click at. If None, clicks at current cursor position
|
130
|
+
y (int, optional): Y coordinate to click at. If None, clicks at current cursor position
|
131
|
+
"""
|
64
132
|
await self._send_cmd("left_click", {"x": x, "y": y})
|
65
133
|
|
66
134
|
async def right_click(self, x=None, y=None):
|
135
|
+
"""
|
136
|
+
Perform a right mouse click at the specified coordinates or current cursor position.
|
137
|
+
|
138
|
+
Args:
|
139
|
+
x (int, optional): X coordinate to click at. If None, clicks at current cursor position
|
140
|
+
y (int, optional): Y coordinate to click at. If None, clicks at current cursor position
|
141
|
+
"""
|
67
142
|
await self._send_cmd("right_click", {"x": x, "y": y})
|
68
143
|
|
69
144
|
async def double_click(self, x=None, y=None):
|
145
|
+
"""
|
146
|
+
Perform a double mouse click at the specified coordinates or current cursor position.
|
147
|
+
|
148
|
+
Args:
|
149
|
+
x (int, optional): X coordinate to double-click at. If None, clicks at current cursor position
|
150
|
+
y (int, optional): Y coordinate to double-click at. If None, clicks at current cursor position
|
151
|
+
"""
|
70
152
|
await self._send_cmd("double_click", {"x": x, "y": y})
|
71
153
|
|
72
154
|
async def scroll_up(self, clicks=1):
|
155
|
+
"""
|
156
|
+
Scroll up by the specified number of clicks.
|
157
|
+
|
158
|
+
Args:
|
159
|
+
clicks (int): Number of scroll clicks to perform upward. Defaults to 1
|
160
|
+
"""
|
73
161
|
await self._send_cmd("scroll_up", {"clicks": clicks})
|
74
162
|
|
75
163
|
async def scroll_down(self, clicks=1):
|
164
|
+
"""
|
165
|
+
Scroll down by the specified number of clicks.
|
166
|
+
|
167
|
+
Args:
|
168
|
+
clicks (int): Number of scroll clicks to perform downward. Defaults to 1
|
169
|
+
"""
|
76
170
|
await self._send_cmd("scroll_down", {"clicks": clicks})
|
77
171
|
|
78
172
|
async def drag_to(self, x, y, duration=0.5):
|
173
|
+
"""
|
174
|
+
Drag from the current cursor position to the specified coordinates.
|
175
|
+
|
176
|
+
Args:
|
177
|
+
x (int): X coordinate to drag to
|
178
|
+
y (int): Y coordinate to drag to
|
179
|
+
duration (float): Duration of the drag operation in seconds. Defaults to 0.5
|
180
|
+
"""
|
79
181
|
await self._send_cmd("drag_to", {"x": x, "y": y, "duration": duration})
|
80
182
|
|
81
183
|
async def get_cursor_position(self):
|
184
|
+
"""
|
185
|
+
Get the current cursor position.
|
186
|
+
|
187
|
+
Returns:
|
188
|
+
dict: Dictionary containing the current cursor coordinates
|
189
|
+
"""
|
82
190
|
return await self._send_cmd("get_cursor_position")
|
83
191
|
|
84
192
|
async def type_text(self, text):
|
193
|
+
"""
|
194
|
+
Type the specified text at the current cursor position.
|
195
|
+
|
196
|
+
Args:
|
197
|
+
text (str): The text to type
|
198
|
+
"""
|
85
199
|
await self._send_cmd("type_text", {"text": text})
|
86
200
|
|
87
201
|
async def press_key(self, key):
|
202
|
+
"""
|
203
|
+
Press a single key.
|
204
|
+
|
205
|
+
Args:
|
206
|
+
key: The key to press
|
207
|
+
"""
|
88
208
|
await self._send_cmd("press_key", {"key": key})
|
89
209
|
|
90
210
|
async def hotkey(self, *keys):
|
211
|
+
"""
|
212
|
+
Press multiple keys simultaneously as a hotkey combination.
|
213
|
+
|
214
|
+
Args:
|
215
|
+
*keys: Variable number of keys to press together. Can be Key enum instances or strings
|
216
|
+
|
217
|
+
Raises:
|
218
|
+
ValueError: If any key is not a Key enum or string type
|
219
|
+
"""
|
91
220
|
actual_keys = []
|
92
221
|
for key in keys:
|
93
222
|
if isinstance(key, Key):
|
@@ -101,4 +230,14 @@ class DioramaComputerInterface:
|
|
101
230
|
await self._send_cmd("hotkey", {"keys": actual_keys})
|
102
231
|
|
103
232
|
async def to_screen_coordinates(self, x, y):
|
233
|
+
"""
|
234
|
+
Convert coordinates to screen coordinates.
|
235
|
+
|
236
|
+
Args:
|
237
|
+
x (int): X coordinate to convert
|
238
|
+
y (int): Y coordinate to convert
|
239
|
+
|
240
|
+
Returns:
|
241
|
+
dict: Dictionary containing the converted screen coordinates
|
242
|
+
"""
|
104
243
|
return await self._send_cmd("to_screen_coordinates", {"x": x, "y": y})
|
@@ -5,6 +5,7 @@ import asyncio
|
|
5
5
|
import logging
|
6
6
|
import time
|
7
7
|
from typing import Dict, Any, Optional, List
|
8
|
+
from pathlib import Path
|
8
9
|
|
9
10
|
from ..base import BaseVMProvider, VMProviderType
|
10
11
|
|
@@ -242,8 +243,15 @@ class WinSandboxProvider(BaseVMProvider):
|
|
242
243
|
|
243
244
|
networking = run_opts.get("networking", self.networking)
|
244
245
|
|
245
|
-
# Create folder mappers
|
246
|
+
# Create folder mappers; always map a persistent venv directory on host for caching packages
|
246
247
|
folder_mappers = []
|
248
|
+
# Ensure host side persistent venv directory exists (Path.home()/wsb_venv)
|
249
|
+
host_wsb_env = Path.home() / ".cua" / "wsb_cache"
|
250
|
+
try:
|
251
|
+
host_wsb_env.mkdir(parents=True, exist_ok=True)
|
252
|
+
except Exception:
|
253
|
+
# If cannot create, continue without persistent mapping
|
254
|
+
host_wsb_env = None
|
247
255
|
shared_directories = run_opts.get("shared_directories", [])
|
248
256
|
for shared_dir in shared_directories:
|
249
257
|
if isinstance(shared_dir, dict):
|
@@ -255,6 +263,15 @@ class WinSandboxProvider(BaseVMProvider):
|
|
255
263
|
|
256
264
|
if host_path and os.path.exists(host_path):
|
257
265
|
folder_mappers.append(winsandbox.FolderMapper(host_path))
|
266
|
+
|
267
|
+
# Add mapping for the persistent venv directory (read/write) so it appears in Sandbox Desktop
|
268
|
+
if host_wsb_env is not None and host_wsb_env.exists():
|
269
|
+
try:
|
270
|
+
folder_mappers.append(
|
271
|
+
winsandbox.FolderMapper(str(host_wsb_env), read_only=False)
|
272
|
+
)
|
273
|
+
except Exception as e:
|
274
|
+
self.logger.warning(f"Failed to map host winsandbox_venv: {e}")
|
258
275
|
|
259
276
|
self.logger.info(f"Creating Windows Sandbox: {name}")
|
260
277
|
self.logger.info(f"Memory: {memory_mb}MB, Networking: {networking}")
|
@@ -290,8 +307,10 @@ class WinSandboxProvider(BaseVMProvider):
|
|
290
307
|
|
291
308
|
self.logger.info(f"Windows Sandbox {name} created successfully")
|
292
309
|
|
310
|
+
venv_exists = (host_wsb_env / "venv" / "Lib" / "site-packages" / "computer_server").exists() if host_wsb_env else False
|
311
|
+
|
293
312
|
# Setup the computer server in the sandbox
|
294
|
-
await self._setup_computer_server(sandbox, name)
|
313
|
+
await self._setup_computer_server(sandbox, name, wait_for_venv=(not venv_exists))
|
295
314
|
|
296
315
|
return {
|
297
316
|
"success": True,
|
@@ -423,7 +442,7 @@ class WinSandboxProvider(BaseVMProvider):
|
|
423
442
|
if total_attempts % 10 == 0:
|
424
443
|
self.logger.info(f"Still waiting for Windows Sandbox {name} IP after {total_attempts} attempts...")
|
425
444
|
|
426
|
-
async def _setup_computer_server(self, sandbox, name: str, visible: bool = False):
|
445
|
+
async def _setup_computer_server(self, sandbox, name: str, visible: bool = False, wait_for_venv: bool = True):
|
427
446
|
"""Setup the computer server in the Windows Sandbox using RPyC.
|
428
447
|
|
429
448
|
Args:
|
@@ -471,10 +490,12 @@ class WinSandboxProvider(BaseVMProvider):
|
|
471
490
|
creationflags=creation_flags,
|
472
491
|
shell=False
|
473
492
|
)
|
474
|
-
|
475
|
-
# # Sleep for 30 seconds
|
476
|
-
# await asyncio.sleep(30)
|
477
493
|
|
494
|
+
if wait_for_venv:
|
495
|
+
print("Waiting for venv to be created for the first time setup of Windows Sandbox...")
|
496
|
+
print("This may take a minute...")
|
497
|
+
await asyncio.sleep(120)
|
498
|
+
|
478
499
|
ip = await self.get_ip(name)
|
479
500
|
self.logger.info(f"Sandbox IP: {ip}")
|
480
501
|
self.logger.info(f"Setup script started in background in sandbox {name} with PID: {process.pid}")
|
@@ -79,23 +79,48 @@ try {
|
|
79
79
|
$pythonVersion = & $pythonExe --version 2>&1
|
80
80
|
Write-Host "Python version: $pythonVersion"
|
81
81
|
|
82
|
-
# Step 2:
|
83
|
-
Write-Host "Step 2:
|
82
|
+
# Step 2: Create a dedicated virtual environment in mapped Desktop folder (persistent)
|
83
|
+
Write-Host "Step 2: Creating virtual environment (if needed)..."
|
84
|
+
$cachePath = "C:\Users\WDAGUtilityAccount\Desktop\wsb_cache"
|
85
|
+
$venvPath = "C:\Users\WDAGUtilityAccount\Desktop\wsb_cache\venv"
|
86
|
+
if (!(Test-Path $venvPath)) {
|
87
|
+
Write-Host "Creating venv at: $venvPath"
|
88
|
+
& $pythonExe -m venv $venvPath
|
89
|
+
} else {
|
90
|
+
Write-Host "Venv already exists at: $venvPath"
|
91
|
+
}
|
92
|
+
# Hide the folder to keep Desktop clean
|
93
|
+
try {
|
94
|
+
$item = Get-Item $cachePath -ErrorAction SilentlyContinue
|
95
|
+
if ($item) {
|
96
|
+
if (-not ($item.Attributes -band [IO.FileAttributes]::Hidden)) {
|
97
|
+
$item.Attributes = $item.Attributes -bor [IO.FileAttributes]::Hidden
|
98
|
+
}
|
99
|
+
}
|
100
|
+
} catch { }
|
101
|
+
$venvPython = Join-Path $venvPath "Scripts\python.exe"
|
102
|
+
if (!(Test-Path $venvPython)) {
|
103
|
+
throw "Virtual environment Python not found at $venvPython"
|
104
|
+
}
|
105
|
+
Write-Host "Using venv Python: $venvPython"
|
106
|
+
|
107
|
+
# Step 3: Install cua-computer-server into the venv
|
108
|
+
Write-Host "Step 3: Installing cua-computer-server..."
|
84
109
|
|
85
110
|
Write-Host "Upgrading pip..."
|
86
|
-
& $
|
111
|
+
& $venvPython -m pip install --upgrade pip --quiet
|
87
112
|
|
88
113
|
Write-Host "Installing cua-computer-server..."
|
89
|
-
& $
|
114
|
+
& $venvPython -m pip install cua-computer-server
|
90
115
|
|
91
116
|
Write-Host "cua-computer-server installation completed."
|
92
117
|
|
93
|
-
# Step
|
94
|
-
Write-Host "Step
|
95
|
-
Write-Host "Starting computer server with: $
|
118
|
+
# Step 4: Start computer server in background using the venv Python
|
119
|
+
Write-Host "Step 4: Starting computer server in background..."
|
120
|
+
Write-Host "Starting computer server with: $venvPython"
|
96
121
|
|
97
122
|
# Start the computer server in the background
|
98
|
-
$serverProcess = Start-Process -FilePath $
|
123
|
+
$serverProcess = Start-Process -FilePath $venvPython -ArgumentList "-m", "computer_server.main" -WindowStyle Hidden -PassThru
|
99
124
|
Write-Host "Computer server started in background with PID: $($serverProcess.Id)"
|
100
125
|
|
101
126
|
# Give it a moment to start
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: cua-computer
|
3
|
-
Version: 0.4.
|
3
|
+
Version: 0.4.6
|
4
4
|
Summary: Computer-Use Interface (CUI) framework powering Cua
|
5
5
|
Author-Email: TryCua <gh@trycua.com>
|
6
6
|
Requires-Python: >=3.11
|
@@ -26,8 +26,8 @@ Description-Content-Type: text/markdown
|
|
26
26
|
<h1>
|
27
27
|
<div class="image-wrapper" style="display: inline-block;">
|
28
28
|
<picture>
|
29
|
-
<source media="(prefers-color-scheme: dark)" alt="logo" height="150" srcset="
|
30
|
-
<source media="(prefers-color-scheme: light)" alt="logo" height="150" srcset="
|
29
|
+
<source media="(prefers-color-scheme: dark)" alt="logo" height="150" srcset="https://raw.githubusercontent.com/trycua/cua/main/img/logo_white.png" style="display: block; margin: auto;">
|
30
|
+
<source media="(prefers-color-scheme: light)" alt="logo" height="150" srcset="https://raw.githubusercontent.com/trycua/cua/main/img/logo_black.png" style="display: block; margin: auto;">
|
31
31
|
<img alt="Shows my svg">
|
32
32
|
</picture>
|
33
33
|
</div>
|
@@ -44,7 +44,7 @@ Description-Content-Type: text/markdown
|
|
44
44
|
### Get started with Computer
|
45
45
|
|
46
46
|
<div align="center">
|
47
|
-
<img src="
|
47
|
+
<img src="https://raw.githubusercontent.com/trycua/cua/main/img/computer.png"/>
|
48
48
|
</div>
|
49
49
|
|
50
50
|
```python
|
@@ -87,82 +87,11 @@ The `cua-computer` PyPi package pulls automatically the latest executable versio
|
|
87
87
|
|
88
88
|
Refer to this notebook for a step-by-step guide on how to use the Computer-Use Interface (CUI):
|
89
89
|
|
90
|
-
- [Computer-Use Interface (CUI)](
|
90
|
+
- [Computer-Use Interface (CUI)](https://github.com/trycua/cua/blob/main/notebooks/computer_nb.ipynb)
|
91
91
|
|
92
|
-
##
|
93
|
-
|
94
|
-
The computer module includes a Gradio UI for creating and sharing demonstration data. We make it easy for people to build community datasets for better computer use models with an upload to Huggingface feature.
|
95
|
-
|
96
|
-
```bash
|
97
|
-
# Install with UI support
|
98
|
-
pip install "cua-computer[ui]"
|
99
|
-
```
|
100
|
-
|
101
|
-
> **Note:** For precise control of the computer, we recommend using VNC or Screen Sharing instead of the Computer Gradio UI.
|
102
|
-
|
103
|
-
### Building and Sharing Demonstrations with Huggingface
|
104
|
-
|
105
|
-
Follow these steps to contribute your own demonstrations:
|
106
|
-
|
107
|
-
#### 1. Set up Huggingface Access
|
108
|
-
|
109
|
-
Set your HF_TOKEN in a .env file or in your environment variables:
|
110
|
-
|
111
|
-
```bash
|
112
|
-
# In .env file
|
113
|
-
HF_TOKEN=your_huggingface_token
|
114
|
-
```
|
115
|
-
|
116
|
-
#### 2. Launch the Computer UI
|
117
|
-
|
118
|
-
```python
|
119
|
-
# launch_ui.py
|
120
|
-
from computer.ui.gradio.app import create_gradio_ui
|
121
|
-
from dotenv import load_dotenv
|
122
|
-
load_dotenv('.env')
|
123
|
-
|
124
|
-
app = create_gradio_ui()
|
125
|
-
app.launch(share=False)
|
126
|
-
```
|
127
|
-
|
128
|
-
For examples, see [Computer UI Examples](../../examples/computer_ui_examples.py)
|
129
|
-
|
130
|
-
#### 3. Record Your Tasks
|
131
|
-
|
132
|
-
<details open>
|
133
|
-
<summary>View demonstration video</summary>
|
134
|
-
<video src="https://github.com/user-attachments/assets/de3c3477-62fe-413c-998d-4063e48de176" controls width="600"></video>
|
135
|
-
</details>
|
136
|
-
|
137
|
-
Record yourself performing various computer tasks using the UI.
|
138
|
-
|
139
|
-
#### 4. Save Your Demonstrations
|
140
|
-
|
141
|
-
<details open>
|
142
|
-
<summary>View demonstration video</summary>
|
143
|
-
<video src="https://github.com/user-attachments/assets/5ad1df37-026a-457f-8b49-922ae805faef" controls width="600"></video>
|
144
|
-
</details>
|
145
|
-
|
146
|
-
Save each task by picking a descriptive name and adding relevant tags (e.g., "office", "web-browsing", "coding").
|
147
|
-
|
148
|
-
#### 5. Record Additional Demonstrations
|
149
|
-
|
150
|
-
Repeat steps 3 and 4 until you have a good amount of demonstrations covering different tasks and scenarios.
|
151
|
-
|
152
|
-
#### 6. Upload to Huggingface
|
153
|
-
|
154
|
-
<details open>
|
155
|
-
<summary>View demonstration video</summary>
|
156
|
-
<video src="https://github.com/user-attachments/assets/c586d460-3877-4b5f-a736-3248886d2134" controls width="600"></video>
|
157
|
-
</details>
|
158
|
-
|
159
|
-
Upload your dataset to Huggingface by:
|
160
|
-
- Naming it as `{your_username}/{dataset_name}`
|
161
|
-
- Choosing public or private visibility
|
162
|
-
- Optionally selecting specific tags to upload only tasks with certain tags
|
163
|
-
|
164
|
-
#### Examples and Resources
|
165
|
-
|
166
|
-
- Example Dataset: [ddupont/test-dataset](https://huggingface.co/datasets/ddupont/test-dataset)
|
167
|
-
- Find Community Datasets: 🔍 [Browse CUA Datasets on Huggingface](https://huggingface.co/datasets?other=cua)
|
92
|
+
## Docs
|
168
93
|
|
94
|
+
- [Computers](https://trycua.com/docs/computer-sdk/computers)
|
95
|
+
- [Commands](https://trycua.com/docs/computer-sdk/commands)
|
96
|
+
- [Computer UI](https://trycua.com/docs/computer-sdk/computer-ui)
|
97
|
+
- [Sandboxed Python](https://trycua.com/docs/computer-sdk/sandboxed-python)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
computer/__init__.py,sha256=HG8dhCmSPjuQ4G-NGAoiXEhzhO37kwrHHmyboNhGWOA,1159
|
2
|
-
computer/computer.py,sha256=
|
3
|
-
computer/diorama_computer.py,sha256=
|
2
|
+
computer/computer.py,sha256=TBryDea-XM76PdVv4DH85MTSaOOTYHC8BOPrqeKRkeY,42630
|
3
|
+
computer/diorama_computer.py,sha256=3JaXKpcSi_OAVXtwlmNwQgrcnvqP1AxdlKEQ0XRJ0aQ,8569
|
4
4
|
computer/helpers.py,sha256=iHkO2WhuCLc15g67kfMnpQWxfNRlz2YeJNEvYaL9jlM,1826
|
5
5
|
computer/interface/__init__.py,sha256=xQvYjq5PMn9ZJOmRR5mWtONTl_0HVd8ACvW6AQnzDdw,262
|
6
6
|
computer/interface/base.py,sha256=1beR4T0z5anb9NaNgKJrMJTF0BFIKyiHlokMLesOV5Q,15131
|
@@ -25,14 +25,14 @@ computer/providers/lume_api.py,sha256=i9dXJGrUhfA49VSY4p6_O6_AzeLNlRppG7jbM3jIJm
|
|
25
25
|
computer/providers/lumier/__init__.py,sha256=qz8coMA2K5MVoqNC12SDXJe6lI7z2pn6RHssUOMY5Ug,212
|
26
26
|
computer/providers/lumier/provider.py,sha256=BDgnTuik42H9OuCmnd-1TxM8p4vl_ahfrhNbi0FNCMM,46644
|
27
27
|
computer/providers/winsandbox/__init__.py,sha256=WsMVBBa_qFfqVHPQzg6j4PegQwLiIudkzUedpYkrfXU,244
|
28
|
-
computer/providers/winsandbox/provider.py,sha256=
|
29
|
-
computer/providers/winsandbox/setup_script.ps1,sha256=
|
28
|
+
computer/providers/winsandbox/provider.py,sha256=rWLsvdgVd4DTTqWS3_smj-bnuEXEkbliRz5GpoFsdaY,20543
|
29
|
+
computer/providers/winsandbox/setup_script.ps1,sha256=_fj4DPegmMjDbKx6bdSrJy0vtk_cICI1HPSrI9D1fys,5697
|
30
30
|
computer/ui/__init__.py,sha256=pmo05ek9qiB_x7DPeE6Vf_8RsIOqTD0w1dBLMHfoOnY,45
|
31
31
|
computer/ui/__main__.py,sha256=Jwy2oC_mGZLN0fX7WLqpjaQkbXMeM3ISrUc8WSRUG0c,284
|
32
32
|
computer/ui/gradio/__init__.py,sha256=5_KimixM48-X74FCsLw7LbSt39MQfUMEL8-M9amK3Cw,117
|
33
33
|
computer/ui/gradio/app.py,sha256=_V6FI-g0GJGMEk-C2iPFtxPO1Gn0juCaeCrWsBtjC4E,70395
|
34
34
|
computer/utils.py,sha256=zY50NXB7r51GNLQ6l7lhG_qv0_ufpQ8n0-SDhCei8m4,2838
|
35
|
-
cua_computer-0.4.
|
36
|
-
cua_computer-0.4.
|
37
|
-
cua_computer-0.4.
|
38
|
-
cua_computer-0.4.
|
35
|
+
cua_computer-0.4.6.dist-info/METADATA,sha256=MUzK45YA8YvzCdfDOgIt8Ko0qYAp7_uPYxz19N2hB2s,3776
|
36
|
+
cua_computer-0.4.6.dist-info/WHEEL,sha256=9P2ygRxDrTJz3gsagc0Z96ukrxjr-LFBGOgv3AuKlCA,90
|
37
|
+
cua_computer-0.4.6.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
|
38
|
+
cua_computer-0.4.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|