orgo 0.0.30__py3-none-any.whl → 0.0.31__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.
- orgo/api/client.py +5 -2
- orgo/computer.py +319 -169
- {orgo-0.0.30.dist-info → orgo-0.0.31.dist-info}/METADATA +1 -1
- {orgo-0.0.30.dist-info → orgo-0.0.31.dist-info}/RECORD +6 -6
- {orgo-0.0.30.dist-info → orgo-0.0.31.dist-info}/WHEEL +0 -0
- {orgo-0.0.30.dist-info → orgo-0.0.31.dist-info}/top_level.txt +0 -0
orgo/api/client.py
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
import requests
|
|
4
4
|
from typing import Dict, Any, Optional, List
|
|
5
5
|
import logging
|
|
6
|
-
import sys
|
|
7
6
|
|
|
8
7
|
from orgo.utils.auth import get_api_key
|
|
9
8
|
|
|
@@ -54,7 +53,11 @@ class ApiClient:
|
|
|
54
53
|
|
|
55
54
|
def get_project_by_name(self, name: str) -> Dict[str, Any]:
|
|
56
55
|
"""Get project details by name"""
|
|
57
|
-
|
|
56
|
+
projects = self.list_projects()
|
|
57
|
+
for project in projects:
|
|
58
|
+
if project.get("name") == name:
|
|
59
|
+
return project
|
|
60
|
+
raise Exception(f"Project '{name}' not found") from None
|
|
58
61
|
|
|
59
62
|
def get_project(self, project_id: str) -> Dict[str, Any]:
|
|
60
63
|
"""Get project details by ID"""
|
orgo/computer.py
CHANGED
|
@@ -1,183 +1,333 @@
|
|
|
1
|
-
"""
|
|
2
|
-
|
|
3
|
-
import
|
|
4
|
-
from typing import Dict, Any, Optional, List
|
|
1
|
+
"""Computer class for interacting with Orgo virtual environments"""
|
|
2
|
+
import os as operating_system
|
|
3
|
+
import base64
|
|
5
4
|
import logging
|
|
5
|
+
import uuid
|
|
6
|
+
import io
|
|
7
|
+
from typing import Dict, List, Any, Optional, Callable, Literal, Union
|
|
8
|
+
from PIL import Image
|
|
9
|
+
import requests
|
|
10
|
+
from requests.exceptions import RequestException
|
|
6
11
|
|
|
7
|
-
from
|
|
12
|
+
from .api.client import ApiClient
|
|
13
|
+
from .prompt import get_provider
|
|
8
14
|
|
|
9
15
|
logger = logging.getLogger(__name__)
|
|
10
16
|
|
|
11
|
-
class
|
|
12
|
-
def __init__(self,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
class Computer:
|
|
18
|
+
def __init__(self,
|
|
19
|
+
project: Optional[Union[str, 'Project']] = None,
|
|
20
|
+
name: Optional[str] = None,
|
|
21
|
+
computer_id: Optional[str] = None,
|
|
22
|
+
api_key: Optional[str] = None,
|
|
23
|
+
base_api_url: Optional[str] = None,
|
|
24
|
+
ram: Optional[Literal[1, 2, 4, 8, 16, 32, 64]] = None,
|
|
25
|
+
memory: Optional[Literal[1, 2, 4, 8, 16, 32, 64]] = None,
|
|
26
|
+
cpu: Optional[Literal[1, 2, 4, 8, 16]] = None,
|
|
27
|
+
os: Optional[Literal["linux", "windows"]] = None,
|
|
28
|
+
gpu: Optional[Literal["none", "a10", "l40s", "a100-40gb", "a100-80gb"]] = None):
|
|
29
|
+
"""
|
|
30
|
+
Initialize an Orgo virtual computer.
|
|
24
31
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
32
|
+
Args:
|
|
33
|
+
project: Project name (str) or Project instance. If not provided, creates a new project.
|
|
34
|
+
name: Computer name within the project (optional, auto-generated if not provided)
|
|
35
|
+
computer_id: Existing computer ID to connect to (optional)
|
|
36
|
+
api_key: Orgo API key (defaults to ORGO_API_KEY env var)
|
|
37
|
+
base_api_url: Custom API URL (optional)
|
|
38
|
+
ram/memory: RAM in GB (1, 2, 4, 8, 16, 32, or 64) - only used when creating
|
|
39
|
+
cpu: CPU cores (1, 2, 4, 8, or 16) - only used when creating
|
|
40
|
+
os: Operating system ("linux" or "windows") - only used when creating
|
|
41
|
+
gpu: GPU type - only used when creating
|
|
42
|
+
|
|
43
|
+
Examples:
|
|
44
|
+
# Create computer in new project
|
|
45
|
+
computer = Computer(ram=4, cpu=2)
|
|
30
46
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
except requests.exceptions.RequestException as e:
|
|
34
|
-
# Log the full error for debugging
|
|
35
|
-
logger.debug(f"API request failed: {method} {url}", exc_info=True)
|
|
47
|
+
# Create computer in existing project
|
|
48
|
+
computer = Computer(project="manus", ram=4, cpu=2)
|
|
36
49
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
50
|
+
# Connect to existing computer in project
|
|
51
|
+
computer = Computer(project="manus")
|
|
52
|
+
"""
|
|
53
|
+
self.api_key = api_key or operating_system.environ.get("ORGO_API_KEY")
|
|
54
|
+
self.base_api_url = base_api_url
|
|
55
|
+
self.api = ApiClient(self.api_key, self.base_api_url)
|
|
56
|
+
|
|
57
|
+
# Handle memory parameter as an alias for ram
|
|
58
|
+
if ram is None and memory is not None:
|
|
59
|
+
ram = memory
|
|
60
|
+
|
|
61
|
+
# Store configuration
|
|
62
|
+
self.os = os or "linux"
|
|
63
|
+
self.ram = ram or 2
|
|
64
|
+
self.cpu = cpu or 2
|
|
65
|
+
self.gpu = gpu or "none"
|
|
66
|
+
|
|
67
|
+
if computer_id:
|
|
68
|
+
# Connect to existing computer by ID
|
|
69
|
+
self._connect_by_id(computer_id)
|
|
70
|
+
elif project:
|
|
71
|
+
# Work with specified project
|
|
72
|
+
if isinstance(project, str):
|
|
73
|
+
# Project name provided
|
|
74
|
+
self.project_name = project
|
|
75
|
+
self._initialize_with_project_name(project, name)
|
|
76
|
+
else:
|
|
77
|
+
# Project instance provided
|
|
78
|
+
from .project import Project as ProjectClass
|
|
79
|
+
if isinstance(project, ProjectClass):
|
|
80
|
+
self.project_name = project.name
|
|
81
|
+
self.project_id = project.id
|
|
82
|
+
self._initialize_with_project_instance(project, name)
|
|
83
|
+
else:
|
|
84
|
+
raise ValueError("project must be a string (project name) or Project instance")
|
|
85
|
+
else:
|
|
86
|
+
# No project specified, create a new one
|
|
87
|
+
self._create_new_project_and_computer(name)
|
|
88
|
+
|
|
89
|
+
def _connect_by_id(self, computer_id: str):
|
|
90
|
+
"""Connect to existing computer by ID"""
|
|
91
|
+
self.computer_id = computer_id
|
|
92
|
+
self._info = self.api.get_computer(computer_id)
|
|
93
|
+
self.project_id = self._info.get("project_id")
|
|
94
|
+
self.name = self._info.get("name")
|
|
95
|
+
# Get project name
|
|
96
|
+
if self.project_id:
|
|
97
|
+
project = self.api.get_project(self.project_id)
|
|
98
|
+
self.project_name = project.get("name")
|
|
99
|
+
|
|
100
|
+
def _initialize_with_project_name(self, project_name: str, computer_name: Optional[str]):
|
|
101
|
+
"""Initialize with a project name (create project if needed)"""
|
|
102
|
+
try:
|
|
103
|
+
# Try to get existing project
|
|
104
|
+
project = self.api.get_project_by_name(project_name)
|
|
105
|
+
self.project_id = project.get("id")
|
|
106
|
+
|
|
107
|
+
# Check for existing computers
|
|
108
|
+
computers = self.api.list_computers(self.project_id)
|
|
45
109
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
def
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
def
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
def
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
def
|
|
159
|
-
"""
|
|
160
|
-
return self.
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
110
|
+
if computer_name:
|
|
111
|
+
# Look for specific computer
|
|
112
|
+
existing = next((c for c in computers if c.get("name") == computer_name), None)
|
|
113
|
+
if existing:
|
|
114
|
+
self._connect_to_existing_computer(existing)
|
|
115
|
+
else:
|
|
116
|
+
# Create new computer with specified name
|
|
117
|
+
self._create_computer(self.project_id, computer_name)
|
|
118
|
+
elif computers:
|
|
119
|
+
# No name specified, use first available computer
|
|
120
|
+
self._connect_to_existing_computer(computers[0])
|
|
121
|
+
else:
|
|
122
|
+
# No computers exist, create new one
|
|
123
|
+
self._create_computer(self.project_id, computer_name)
|
|
124
|
+
|
|
125
|
+
except Exception:
|
|
126
|
+
# Project doesn't exist, create it
|
|
127
|
+
logger.info(f"Project {project_name} not found, creating new project")
|
|
128
|
+
project = self.api.create_project(project_name)
|
|
129
|
+
self.project_id = project.get("id")
|
|
130
|
+
self._create_computer(self.project_id, computer_name)
|
|
131
|
+
|
|
132
|
+
def _initialize_with_project_instance(self, project: 'Project', computer_name: Optional[str]):
|
|
133
|
+
"""Initialize with a Project instance"""
|
|
134
|
+
computers = project.list_computers()
|
|
135
|
+
|
|
136
|
+
if computer_name:
|
|
137
|
+
# Look for specific computer
|
|
138
|
+
existing = next((c for c in computers if c.get("name") == computer_name), None)
|
|
139
|
+
if existing:
|
|
140
|
+
self._connect_to_existing_computer(existing)
|
|
141
|
+
else:
|
|
142
|
+
# Create new computer with specified name
|
|
143
|
+
self._create_computer(project.id, computer_name)
|
|
144
|
+
elif computers:
|
|
145
|
+
# No name specified, use first available computer
|
|
146
|
+
self._connect_to_existing_computer(computers[0])
|
|
147
|
+
else:
|
|
148
|
+
# No computers exist, create new one
|
|
149
|
+
self._create_computer(project.id, computer_name)
|
|
150
|
+
|
|
151
|
+
def _create_new_project_and_computer(self, computer_name: Optional[str]):
|
|
152
|
+
"""Create a new project and computer"""
|
|
153
|
+
# Generate a unique project name
|
|
154
|
+
project_name = f"project-{uuid.uuid4().hex[:8]}"
|
|
155
|
+
|
|
156
|
+
# Create the project
|
|
157
|
+
project = self.api.create_project(project_name)
|
|
158
|
+
self.project_id = project.get("id")
|
|
159
|
+
self.project_name = project_name
|
|
160
|
+
|
|
161
|
+
# Create a computer in the new project
|
|
162
|
+
self._create_computer(self.project_id, computer_name)
|
|
163
|
+
|
|
164
|
+
def _connect_to_existing_computer(self, computer_info: Dict[str, Any]):
|
|
165
|
+
"""Connect to an existing computer"""
|
|
166
|
+
self.computer_id = computer_info.get("id")
|
|
167
|
+
self.name = computer_info.get("name")
|
|
168
|
+
self._info = computer_info
|
|
169
|
+
logger.info(f"Connected to existing computer {self.name} (ID: {self.computer_id})")
|
|
170
|
+
|
|
171
|
+
def _create_computer(self, project_id: str, computer_name: Optional[str]):
|
|
172
|
+
"""Create a new computer in the project"""
|
|
173
|
+
# Generate name if not provided
|
|
174
|
+
if not computer_name:
|
|
175
|
+
computer_name = f"desktop-{uuid.uuid4().hex[:8]}"
|
|
176
|
+
|
|
177
|
+
self.name = computer_name
|
|
178
|
+
|
|
179
|
+
# Validate parameters
|
|
180
|
+
if self.ram not in [1, 2, 4, 8, 16, 32, 64]:
|
|
181
|
+
raise ValueError("ram must be one of: 1, 2, 4, 8, 16, 32, 64 GB")
|
|
182
|
+
if self.cpu not in [1, 2, 4, 8, 16]:
|
|
183
|
+
raise ValueError("cpu must be one of: 1, 2, 4, 8, 16 cores")
|
|
184
|
+
if self.os not in ["linux", "windows"]:
|
|
185
|
+
raise ValueError("os must be either 'linux' or 'windows'")
|
|
186
|
+
if self.gpu not in ["none", "a10", "l40s", "a100-40gb", "a100-80gb"]:
|
|
187
|
+
raise ValueError("gpu must be one of: 'none', 'a10', 'l40s', 'a100-40gb', 'a100-80gb'")
|
|
188
|
+
|
|
189
|
+
computer = self.api.create_computer(
|
|
190
|
+
project_id=project_id,
|
|
191
|
+
computer_name=computer_name,
|
|
192
|
+
os=self.os,
|
|
193
|
+
ram=self.ram,
|
|
194
|
+
cpu=self.cpu,
|
|
195
|
+
gpu=self.gpu
|
|
196
|
+
)
|
|
197
|
+
self.computer_id = computer.get("id")
|
|
198
|
+
self._info = computer
|
|
199
|
+
logger.info(f"Created new computer {self.name} (ID: {self.computer_id})")
|
|
200
|
+
|
|
201
|
+
def status(self) -> Dict[str, Any]:
|
|
202
|
+
"""Get current computer status"""
|
|
203
|
+
return self.api.get_computer(self.computer_id)
|
|
204
|
+
|
|
205
|
+
def restart(self) -> Dict[str, Any]:
|
|
206
|
+
"""Restart the computer"""
|
|
207
|
+
return self.api.restart_computer(self.computer_id)
|
|
208
|
+
|
|
209
|
+
def destroy(self) -> Dict[str, Any]:
|
|
210
|
+
"""Terminate and delete the computer instance"""
|
|
211
|
+
return self.api.delete_computer(self.computer_id)
|
|
212
|
+
|
|
213
|
+
# Navigation methods
|
|
214
|
+
def left_click(self, x: int, y: int) -> Dict[str, Any]:
|
|
215
|
+
"""Perform left mouse click at specified coordinates"""
|
|
216
|
+
return self.api.left_click(self.computer_id, x, y)
|
|
217
|
+
|
|
218
|
+
def right_click(self, x: int, y: int) -> Dict[str, Any]:
|
|
219
|
+
"""Perform right mouse click at specified coordinates"""
|
|
220
|
+
return self.api.right_click(self.computer_id, x, y)
|
|
221
|
+
|
|
222
|
+
def double_click(self, x: int, y: int) -> Dict[str, Any]:
|
|
223
|
+
"""Perform double click at specified coordinates"""
|
|
224
|
+
return self.api.double_click(self.computer_id, x, y)
|
|
225
|
+
|
|
226
|
+
def drag(self, start_x: int, start_y: int, end_x: int, end_y: int,
|
|
227
|
+
button: str = "left", duration: float = 0.5) -> Dict[str, Any]:
|
|
228
|
+
"""Perform a smooth drag operation from start to end coordinates"""
|
|
229
|
+
return self.api.drag(self.computer_id, start_x, start_y, end_x, end_y, button, duration)
|
|
230
|
+
|
|
231
|
+
def scroll(self, direction: str = "down", amount: int = 3) -> Dict[str, Any]:
|
|
232
|
+
"""Scroll in specified direction and amount"""
|
|
233
|
+
return self.api.scroll(self.computer_id, direction, amount)
|
|
234
|
+
|
|
235
|
+
# Input methods
|
|
236
|
+
def type(self, text: str) -> Dict[str, Any]:
|
|
237
|
+
"""Type the specified text"""
|
|
238
|
+
return self.api.type_text(self.computer_id, text)
|
|
239
|
+
|
|
240
|
+
def key(self, key: str) -> Dict[str, Any]:
|
|
241
|
+
"""Press a key or key combination (e.g., "Enter", "ctrl+c")"""
|
|
242
|
+
return self.api.key_press(self.computer_id, key)
|
|
243
|
+
|
|
244
|
+
# View methods
|
|
245
|
+
def screenshot(self) -> Image.Image:
|
|
246
|
+
"""Capture screenshot and return as PIL Image"""
|
|
247
|
+
response = self.api.get_screenshot(self.computer_id)
|
|
248
|
+
image_data = response.get("image", "")
|
|
249
|
+
|
|
250
|
+
if image_data.startswith(('http://', 'https://')):
|
|
251
|
+
img_response = requests.get(image_data)
|
|
252
|
+
img_response.raise_for_status()
|
|
253
|
+
return Image.open(io.BytesIO(img_response.content))
|
|
254
|
+
else:
|
|
255
|
+
img_data = base64.b64decode(image_data)
|
|
256
|
+
return Image.open(io.BytesIO(img_data))
|
|
257
|
+
|
|
258
|
+
def screenshot_base64(self) -> str:
|
|
259
|
+
"""Capture screenshot and return as base64 string"""
|
|
260
|
+
response = self.api.get_screenshot(self.computer_id)
|
|
261
|
+
image_data = response.get("image", "")
|
|
262
|
+
|
|
263
|
+
if image_data.startswith(('http://', 'https://')):
|
|
264
|
+
img_response = requests.get(image_data)
|
|
265
|
+
img_response.raise_for_status()
|
|
266
|
+
return base64.b64encode(img_response.content).decode('utf-8')
|
|
267
|
+
else:
|
|
268
|
+
return image_data
|
|
269
|
+
|
|
270
|
+
# Execution methods
|
|
271
|
+
def bash(self, command: str) -> str:
|
|
272
|
+
"""Execute a bash command and return output"""
|
|
273
|
+
response = self.api.execute_bash(self.computer_id, command)
|
|
274
|
+
return response.get("output", "")
|
|
275
|
+
|
|
276
|
+
def exec(self, code: str, timeout: int = 10) -> Dict[str, Any]:
|
|
277
|
+
"""Execute Python code on the remote computer"""
|
|
278
|
+
response = self.api.execute_python(self.computer_id, code, timeout)
|
|
279
|
+
return response
|
|
280
|
+
|
|
281
|
+
def wait(self, seconds: float) -> Dict[str, Any]:
|
|
282
|
+
"""Wait for specified number of seconds"""
|
|
283
|
+
return self.api.wait(self.computer_id, seconds)
|
|
169
284
|
|
|
170
285
|
# Streaming methods
|
|
171
|
-
def start_stream(self,
|
|
172
|
-
"""Start streaming to
|
|
173
|
-
return self.
|
|
174
|
-
"connection_name": connection_name
|
|
175
|
-
})
|
|
286
|
+
def start_stream(self, connection: str) -> Dict[str, Any]:
|
|
287
|
+
"""Start streaming the computer screen to an RTMP server"""
|
|
288
|
+
return self.api.start_stream(self.computer_id, connection)
|
|
176
289
|
|
|
177
|
-
def stop_stream(self
|
|
290
|
+
def stop_stream(self) -> Dict[str, Any]:
|
|
178
291
|
"""Stop the active stream"""
|
|
179
|
-
return self.
|
|
292
|
+
return self.api.stop_stream(self.computer_id)
|
|
293
|
+
|
|
294
|
+
def stream_status(self) -> Dict[str, Any]:
|
|
295
|
+
"""Get the current streaming status"""
|
|
296
|
+
return self.api.get_stream_status(self.computer_id)
|
|
297
|
+
|
|
298
|
+
# AI control method
|
|
299
|
+
def prompt(self,
|
|
300
|
+
instruction: str,
|
|
301
|
+
provider: str = "anthropic",
|
|
302
|
+
model: str = "claude-3-7-sonnet-20250219",
|
|
303
|
+
display_width: int = 1024,
|
|
304
|
+
display_height: int = 768,
|
|
305
|
+
callback: Optional[Callable[[str, Any], None]] = None,
|
|
306
|
+
thinking_enabled: bool = False,
|
|
307
|
+
thinking_budget: int = 1024,
|
|
308
|
+
max_tokens: int = 4096,
|
|
309
|
+
max_iterations: int = 20,
|
|
310
|
+
max_saved_screenshots: int = 5,
|
|
311
|
+
api_key: Optional[str] = None) -> List[Dict[str, Any]]:
|
|
312
|
+
"""Control the computer with natural language instructions using an AI assistant"""
|
|
313
|
+
provider_instance = get_provider(provider)
|
|
314
|
+
|
|
315
|
+
return provider_instance.execute(
|
|
316
|
+
computer_id=self.computer_id,
|
|
317
|
+
instruction=instruction,
|
|
318
|
+
callback=callback,
|
|
319
|
+
api_key=api_key,
|
|
320
|
+
model=model,
|
|
321
|
+
display_width=display_width,
|
|
322
|
+
display_height=display_height,
|
|
323
|
+
thinking_enabled=thinking_enabled,
|
|
324
|
+
thinking_budget=thinking_budget,
|
|
325
|
+
max_tokens=max_tokens,
|
|
326
|
+
max_iterations=max_iterations,
|
|
327
|
+
max_saved_screenshots=max_saved_screenshots,
|
|
328
|
+
orgo_api_key=self.api_key,
|
|
329
|
+
orgo_base_url=self.base_api_url
|
|
330
|
+
)
|
|
180
331
|
|
|
181
|
-
def
|
|
182
|
-
"
|
|
183
|
-
return self._request("GET", f"computers/{computer_id}/stream/status")
|
|
332
|
+
def __repr__(self):
|
|
333
|
+
return f"Computer(name='{self.name}', project='{self.project_name}', id='{self.computer_id}')"
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
orgo/__init__.py,sha256=aw3BM7-Wy8jk-mvIWRG2gC4-nsc74s6ZFm1U21NyGeM,171
|
|
2
|
-
orgo/computer.py,sha256=
|
|
2
|
+
orgo/computer.py,sha256=Twe3cWlZGppAqeyQUGCghaAcjcJ41NFbEpJWgxLmqsg,14400
|
|
3
3
|
orgo/project.py,sha256=uVDFa8iyn5OaHzTzjGQhxnF_nVzwkqkqUShiV3M0AWU,3150
|
|
4
4
|
orgo/prompt.py,sha256=ynblwXPTDp_aF1MbGBsY0PIEr9naklDaKFcfSE_EZ6E,19781
|
|
5
5
|
orgo/api/__init__.py,sha256=9Tzb_OPJ5DH7Cg7OrHzpZZUT4ip05alpa9RLDYmnId8,113
|
|
6
|
-
orgo/api/client.py,sha256=
|
|
6
|
+
orgo/api/client.py,sha256=apny7V3IYJTyDwn5utukzyECLWT65oo-1EmFRwHL--E,7544
|
|
7
7
|
orgo/utils/__init__.py,sha256=W4G_nwGBf_7jy0w_mfcrkllurYHSRU4B5cMTVYH_uCc,123
|
|
8
8
|
orgo/utils/auth.py,sha256=tPLBJY-6gdBQWLUjUbwIwxHphC3KoRT_XgP3Iykw3Mw,509
|
|
9
|
-
orgo-0.0.
|
|
10
|
-
orgo-0.0.
|
|
11
|
-
orgo-0.0.
|
|
12
|
-
orgo-0.0.
|
|
9
|
+
orgo-0.0.31.dist-info/METADATA,sha256=1oG_9j_vfM0l06pmjDtb12rCxknOehGrlewNVPsJ2OA,822
|
|
10
|
+
orgo-0.0.31.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
11
|
+
orgo-0.0.31.dist-info/top_level.txt,sha256=q0rYtFji8GbYuhFW8A5Ab9e0j27761IKPhnL0E9xow4,5
|
|
12
|
+
orgo-0.0.31.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|