ai-computer-client 0.1.0__tar.gz → 0.2.0__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {ai_computer_client-0.1.0 → ai_computer_client-0.2.0}/PKG-INFO +114 -16
- ai_computer_client-0.2.0/README.md +195 -0
- {ai_computer_client-0.1.0 → ai_computer_client-0.2.0}/ai_computer/client.py +54 -1
- {ai_computer_client-0.1.0 → ai_computer_client-0.2.0}/pyproject.toml +1 -1
- ai_computer_client-0.1.0/README.md +0 -97
- {ai_computer_client-0.1.0 → ai_computer_client-0.2.0}/.gitignore +0 -0
- {ai_computer_client-0.1.0 → ai_computer_client-0.2.0}/LICENSE +0 -0
- {ai_computer_client-0.1.0 → ai_computer_client-0.2.0}/ai_computer/__init__.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ai-computer-client
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.2.0
|
4
4
|
Summary: Python client for interacting with the AI Computer service
|
5
5
|
Project-URL: Homepage, https://github.com/ColeMurray/ai-computer-client-python
|
6
6
|
Project-URL: Documentation, https://github.com/ColeMurray/ai-computer-client-python#readme
|
@@ -50,16 +50,34 @@ async def main():
|
|
50
50
|
if not setup_response.success:
|
51
51
|
print(f"Setup failed: {setup_response.error}")
|
52
52
|
return
|
53
|
-
|
53
|
+
|
54
54
|
try:
|
55
|
-
#
|
56
|
-
code = """
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
"""
|
55
|
+
# Example 1: Simple code execution
|
56
|
+
code = """x = 10
|
57
|
+
y = 20
|
58
|
+
result = x + y
|
59
|
+
print(f"The sum is: {result}")"""
|
61
60
|
|
62
|
-
|
61
|
+
print("\nExample 1: Simple execution")
|
62
|
+
print("-" * 50)
|
63
|
+
response = await client.execute_code(code)
|
64
|
+
if response.success:
|
65
|
+
print("Execution result:", response.data)
|
66
|
+
else:
|
67
|
+
print("Execution failed:", response.error)
|
68
|
+
|
69
|
+
# Example 2: Streaming execution
|
70
|
+
code = """import time
|
71
|
+
|
72
|
+
for i in range(5):
|
73
|
+
print(f"Processing step {i + 1}")
|
74
|
+
time.sleep(1) # Simulate work
|
75
|
+
|
76
|
+
result = "Calculation complete!"
|
77
|
+
print(result)"""
|
78
|
+
|
79
|
+
print("\nExample 2: Streaming execution")
|
80
|
+
print("-" * 50)
|
63
81
|
async for event in client.execute_code_stream(code):
|
64
82
|
if event.type == 'stdout':
|
65
83
|
print(f"Output: {event.data}")
|
@@ -80,10 +98,27 @@ if __name__ == "__main__":
|
|
80
98
|
asyncio.run(main())
|
81
99
|
```
|
82
100
|
|
101
|
+
Example output:
|
102
|
+
```
|
103
|
+
Example 1: Simple execution
|
104
|
+
--------------------------------------------------
|
105
|
+
Execution result: {'output': 'The sum is: 30\n', 'sandbox_id': '06a30496-b535-47b0-9fe7-34f7ec483cd7'}
|
106
|
+
|
107
|
+
Example 2: Streaming execution
|
108
|
+
--------------------------------------------------
|
109
|
+
Output: Processing step 1
|
110
|
+
Output: Processing step 2
|
111
|
+
Output: Processing step 3
|
112
|
+
Output: Processing step 4
|
113
|
+
Output: Processing step 5
|
114
|
+
Output: Calculation complete!
|
115
|
+
Execution completed
|
116
|
+
```
|
117
|
+
|
83
118
|
## Features
|
84
119
|
|
85
|
-
- Asynchronous API
|
86
|
-
-
|
120
|
+
- Asynchronous API for efficient execution
|
121
|
+
- Real-time streaming of code output
|
87
122
|
- Automatic sandbox management
|
88
123
|
- Error handling and timeouts
|
89
124
|
- Type hints for better IDE support
|
@@ -94,20 +129,83 @@ if __name__ == "__main__":
|
|
94
129
|
|
95
130
|
The main client class for interacting with the AI Computer service.
|
96
131
|
|
132
|
+
```python
|
133
|
+
client = SandboxClient(base_url="http://aicomputer.dev")
|
134
|
+
```
|
135
|
+
|
97
136
|
#### Methods
|
98
137
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
138
|
+
##### `async setup() -> SandboxResponse`
|
139
|
+
Initialize the client and create a sandbox. This must be called before executing any code.
|
140
|
+
|
141
|
+
```python
|
142
|
+
response = await client.setup()
|
143
|
+
if response.success:
|
144
|
+
print("Sandbox ready")
|
145
|
+
```
|
146
|
+
|
147
|
+
##### `async execute_code(code: str, timeout: int = 30) -> SandboxResponse`
|
148
|
+
Execute Python code and return the combined output.
|
149
|
+
|
150
|
+
```python
|
151
|
+
code = """
|
152
|
+
x = 10
|
153
|
+
y = 20
|
154
|
+
result = x + y
|
155
|
+
print(f"The sum is: {result}")
|
156
|
+
"""
|
157
|
+
|
158
|
+
response = await client.execute_code(code)
|
159
|
+
if response.success:
|
160
|
+
print("Output:", response.data['output'])
|
161
|
+
```
|
162
|
+
|
163
|
+
##### `async execute_code_stream(code: str, timeout: int = 30) -> AsyncGenerator[StreamEvent, None]`
|
164
|
+
Execute Python code and stream the output in real-time.
|
165
|
+
|
166
|
+
```python
|
167
|
+
async for event in client.execute_code_stream(code):
|
168
|
+
if event.type == 'stdout':
|
169
|
+
print("Output:", event.data)
|
170
|
+
elif event.type == 'stderr':
|
171
|
+
print("Error:", event.data)
|
172
|
+
```
|
173
|
+
|
174
|
+
##### `async cleanup() -> SandboxResponse`
|
175
|
+
Delete the sandbox and clean up resources.
|
176
|
+
|
177
|
+
```python
|
178
|
+
await client.cleanup()
|
179
|
+
```
|
180
|
+
|
181
|
+
### Response Types
|
182
|
+
|
183
|
+
#### SandboxResponse
|
184
|
+
```python
|
185
|
+
@dataclass
|
186
|
+
class SandboxResponse:
|
187
|
+
success: bool
|
188
|
+
data: Optional[Dict] = None
|
189
|
+
error: Optional[str] = None
|
190
|
+
```
|
191
|
+
|
192
|
+
#### StreamEvent
|
193
|
+
```python
|
194
|
+
@dataclass
|
195
|
+
class StreamEvent:
|
196
|
+
type: str # 'stdout', 'stderr', 'error', 'completed'
|
197
|
+
data: str
|
198
|
+
```
|
104
199
|
|
105
200
|
## Development
|
106
201
|
|
107
202
|
### Running Tests
|
108
203
|
|
109
204
|
```bash
|
205
|
+
# Install development dependencies
|
110
206
|
pip install -e ".[dev]"
|
207
|
+
|
208
|
+
# Run tests
|
111
209
|
pytest
|
112
210
|
```
|
113
211
|
|
@@ -0,0 +1,195 @@
|
|
1
|
+
# AI Computer Python Client
|
2
|
+
|
3
|
+
A Python client for interacting with the AI Computer service. This client provides a simple interface for executing Python code in an isolated sandbox environment.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
```bash
|
8
|
+
pip install ai-computer-client
|
9
|
+
```
|
10
|
+
|
11
|
+
## Quick Start
|
12
|
+
|
13
|
+
```python
|
14
|
+
import asyncio
|
15
|
+
from ai_computer import SandboxClient
|
16
|
+
|
17
|
+
async def main():
|
18
|
+
# Initialize the client
|
19
|
+
client = SandboxClient()
|
20
|
+
|
21
|
+
# Setup the client (gets token and creates sandbox)
|
22
|
+
setup_response = await client.setup()
|
23
|
+
if not setup_response.success:
|
24
|
+
print(f"Setup failed: {setup_response.error}")
|
25
|
+
return
|
26
|
+
|
27
|
+
try:
|
28
|
+
# Example 1: Simple code execution
|
29
|
+
code = """x = 10
|
30
|
+
y = 20
|
31
|
+
result = x + y
|
32
|
+
print(f"The sum is: {result}")"""
|
33
|
+
|
34
|
+
print("\nExample 1: Simple execution")
|
35
|
+
print("-" * 50)
|
36
|
+
response = await client.execute_code(code)
|
37
|
+
if response.success:
|
38
|
+
print("Execution result:", response.data)
|
39
|
+
else:
|
40
|
+
print("Execution failed:", response.error)
|
41
|
+
|
42
|
+
# Example 2: Streaming execution
|
43
|
+
code = """import time
|
44
|
+
|
45
|
+
for i in range(5):
|
46
|
+
print(f"Processing step {i + 1}")
|
47
|
+
time.sleep(1) # Simulate work
|
48
|
+
|
49
|
+
result = "Calculation complete!"
|
50
|
+
print(result)"""
|
51
|
+
|
52
|
+
print("\nExample 2: Streaming execution")
|
53
|
+
print("-" * 50)
|
54
|
+
async for event in client.execute_code_stream(code):
|
55
|
+
if event.type == 'stdout':
|
56
|
+
print(f"Output: {event.data}")
|
57
|
+
elif event.type == 'stderr':
|
58
|
+
print(f"Error: {event.data}")
|
59
|
+
elif event.type == 'error':
|
60
|
+
print(f"Execution error: {event.data}")
|
61
|
+
break
|
62
|
+
elif event.type == 'completed':
|
63
|
+
print("Execution completed")
|
64
|
+
break
|
65
|
+
|
66
|
+
finally:
|
67
|
+
# Clean up
|
68
|
+
await client.cleanup()
|
69
|
+
|
70
|
+
if __name__ == "__main__":
|
71
|
+
asyncio.run(main())
|
72
|
+
```
|
73
|
+
|
74
|
+
Example output:
|
75
|
+
```
|
76
|
+
Example 1: Simple execution
|
77
|
+
--------------------------------------------------
|
78
|
+
Execution result: {'output': 'The sum is: 30\n', 'sandbox_id': '06a30496-b535-47b0-9fe7-34f7ec483cd7'}
|
79
|
+
|
80
|
+
Example 2: Streaming execution
|
81
|
+
--------------------------------------------------
|
82
|
+
Output: Processing step 1
|
83
|
+
Output: Processing step 2
|
84
|
+
Output: Processing step 3
|
85
|
+
Output: Processing step 4
|
86
|
+
Output: Processing step 5
|
87
|
+
Output: Calculation complete!
|
88
|
+
Execution completed
|
89
|
+
```
|
90
|
+
|
91
|
+
## Features
|
92
|
+
|
93
|
+
- Asynchronous API for efficient execution
|
94
|
+
- Real-time streaming of code output
|
95
|
+
- Automatic sandbox management
|
96
|
+
- Error handling and timeouts
|
97
|
+
- Type hints for better IDE support
|
98
|
+
|
99
|
+
## API Reference
|
100
|
+
|
101
|
+
### SandboxClient
|
102
|
+
|
103
|
+
The main client class for interacting with the AI Computer service.
|
104
|
+
|
105
|
+
```python
|
106
|
+
client = SandboxClient(base_url="http://aicomputer.dev")
|
107
|
+
```
|
108
|
+
|
109
|
+
#### Methods
|
110
|
+
|
111
|
+
##### `async setup() -> SandboxResponse`
|
112
|
+
Initialize the client and create a sandbox. This must be called before executing any code.
|
113
|
+
|
114
|
+
```python
|
115
|
+
response = await client.setup()
|
116
|
+
if response.success:
|
117
|
+
print("Sandbox ready")
|
118
|
+
```
|
119
|
+
|
120
|
+
##### `async execute_code(code: str, timeout: int = 30) -> SandboxResponse`
|
121
|
+
Execute Python code and return the combined output.
|
122
|
+
|
123
|
+
```python
|
124
|
+
code = """
|
125
|
+
x = 10
|
126
|
+
y = 20
|
127
|
+
result = x + y
|
128
|
+
print(f"The sum is: {result}")
|
129
|
+
"""
|
130
|
+
|
131
|
+
response = await client.execute_code(code)
|
132
|
+
if response.success:
|
133
|
+
print("Output:", response.data['output'])
|
134
|
+
```
|
135
|
+
|
136
|
+
##### `async execute_code_stream(code: str, timeout: int = 30) -> AsyncGenerator[StreamEvent, None]`
|
137
|
+
Execute Python code and stream the output in real-time.
|
138
|
+
|
139
|
+
```python
|
140
|
+
async for event in client.execute_code_stream(code):
|
141
|
+
if event.type == 'stdout':
|
142
|
+
print("Output:", event.data)
|
143
|
+
elif event.type == 'stderr':
|
144
|
+
print("Error:", event.data)
|
145
|
+
```
|
146
|
+
|
147
|
+
##### `async cleanup() -> SandboxResponse`
|
148
|
+
Delete the sandbox and clean up resources.
|
149
|
+
|
150
|
+
```python
|
151
|
+
await client.cleanup()
|
152
|
+
```
|
153
|
+
|
154
|
+
### Response Types
|
155
|
+
|
156
|
+
#### SandboxResponse
|
157
|
+
```python
|
158
|
+
@dataclass
|
159
|
+
class SandboxResponse:
|
160
|
+
success: bool
|
161
|
+
data: Optional[Dict] = None
|
162
|
+
error: Optional[str] = None
|
163
|
+
```
|
164
|
+
|
165
|
+
#### StreamEvent
|
166
|
+
```python
|
167
|
+
@dataclass
|
168
|
+
class StreamEvent:
|
169
|
+
type: str # 'stdout', 'stderr', 'error', 'completed'
|
170
|
+
data: str
|
171
|
+
```
|
172
|
+
|
173
|
+
## Development
|
174
|
+
|
175
|
+
### Running Tests
|
176
|
+
|
177
|
+
```bash
|
178
|
+
# Install development dependencies
|
179
|
+
pip install -e ".[dev]"
|
180
|
+
|
181
|
+
# Run tests
|
182
|
+
pytest
|
183
|
+
```
|
184
|
+
|
185
|
+
### Contributing
|
186
|
+
|
187
|
+
1. Fork the repository
|
188
|
+
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
|
189
|
+
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
|
190
|
+
4. Push to the branch (`git push origin feature/amazing-feature`)
|
191
|
+
5. Open a Pull Request
|
192
|
+
|
193
|
+
## License
|
194
|
+
|
195
|
+
MIT License
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import aiohttp
|
2
2
|
import json
|
3
3
|
import asyncio
|
4
|
-
from typing import Optional, Dict, AsyncGenerator, Union
|
4
|
+
from typing import Optional, Dict, AsyncGenerator, Union, List
|
5
5
|
from dataclasses import dataclass
|
6
6
|
|
7
7
|
@dataclass
|
@@ -241,6 +241,59 @@ class SandboxClient:
|
|
241
241
|
except Exception as e:
|
242
242
|
yield StreamEvent(type="error", data=f"Connection error: {str(e)}")
|
243
243
|
|
244
|
+
async def execute_shell(
|
245
|
+
self,
|
246
|
+
command: str,
|
247
|
+
args: Optional[List[str]] = None,
|
248
|
+
timeout: int = 30
|
249
|
+
) -> SandboxResponse:
|
250
|
+
"""Execute a shell command in the sandbox.
|
251
|
+
|
252
|
+
Args:
|
253
|
+
command: The shell command to execute
|
254
|
+
args: Optional list of arguments for the command
|
255
|
+
timeout: Maximum execution time in seconds
|
256
|
+
|
257
|
+
Returns:
|
258
|
+
SandboxResponse containing execution results
|
259
|
+
"""
|
260
|
+
if not self.token or not self.sandbox_id:
|
261
|
+
return SandboxResponse(success=False, error="Client not properly initialized. Call setup() first")
|
262
|
+
|
263
|
+
# Ensure sandbox is ready
|
264
|
+
ready = await self.wait_for_ready()
|
265
|
+
if not ready.success:
|
266
|
+
return ready
|
267
|
+
|
268
|
+
headers = {
|
269
|
+
"Authorization": f"Bearer {self.token}",
|
270
|
+
"Content-Type": "application/json"
|
271
|
+
}
|
272
|
+
|
273
|
+
data = {
|
274
|
+
"command": command,
|
275
|
+
"args": args or [],
|
276
|
+
"timeout": timeout
|
277
|
+
}
|
278
|
+
|
279
|
+
try:
|
280
|
+
async with aiohttp.ClientSession() as session:
|
281
|
+
async with session.post(
|
282
|
+
f"{self.base_url}/api/v1/sandbox/{self.sandbox_id}/execute/shell",
|
283
|
+
headers=headers,
|
284
|
+
json=data
|
285
|
+
) as response:
|
286
|
+
if response.status != 200:
|
287
|
+
error_text = await response.text()
|
288
|
+
return SandboxResponse(success=False, error=error_text)
|
289
|
+
|
290
|
+
# Parse the response
|
291
|
+
result = await response.json()
|
292
|
+
return SandboxResponse(success=True, data=result)
|
293
|
+
|
294
|
+
except Exception as e:
|
295
|
+
return SandboxResponse(success=False, error=f"Connection error: {str(e)}")
|
296
|
+
|
244
297
|
async def cleanup(self) -> SandboxResponse:
|
245
298
|
"""Delete the sandbox.
|
246
299
|
|
@@ -1,97 +0,0 @@
|
|
1
|
-
# AI Computer Python Client
|
2
|
-
|
3
|
-
A Python client for interacting with the AI Computer service. This client provides a simple interface for executing Python code in an isolated sandbox environment.
|
4
|
-
|
5
|
-
## Installation
|
6
|
-
|
7
|
-
```bash
|
8
|
-
pip install ai-computer-client
|
9
|
-
```
|
10
|
-
|
11
|
-
## Quick Start
|
12
|
-
|
13
|
-
```python
|
14
|
-
import asyncio
|
15
|
-
from ai_computer import SandboxClient
|
16
|
-
|
17
|
-
async def main():
|
18
|
-
# Initialize the client
|
19
|
-
client = SandboxClient()
|
20
|
-
|
21
|
-
# Setup the client (gets token and creates sandbox)
|
22
|
-
setup_response = await client.setup()
|
23
|
-
if not setup_response.success:
|
24
|
-
print(f"Setup failed: {setup_response.error}")
|
25
|
-
return
|
26
|
-
|
27
|
-
try:
|
28
|
-
# Execute some code
|
29
|
-
code = """
|
30
|
-
print('Hello from AI Computer!')
|
31
|
-
result = 42
|
32
|
-
print(f'The answer is {result}')
|
33
|
-
"""
|
34
|
-
|
35
|
-
# Stream execution
|
36
|
-
async for event in client.execute_code_stream(code):
|
37
|
-
if event.type == 'stdout':
|
38
|
-
print(f"Output: {event.data}")
|
39
|
-
elif event.type == 'stderr':
|
40
|
-
print(f"Error: {event.data}")
|
41
|
-
elif event.type == 'error':
|
42
|
-
print(f"Execution error: {event.data}")
|
43
|
-
break
|
44
|
-
elif event.type == 'completed':
|
45
|
-
print("Execution completed")
|
46
|
-
break
|
47
|
-
|
48
|
-
finally:
|
49
|
-
# Clean up
|
50
|
-
await client.cleanup()
|
51
|
-
|
52
|
-
if __name__ == "__main__":
|
53
|
-
asyncio.run(main())
|
54
|
-
```
|
55
|
-
|
56
|
-
## Features
|
57
|
-
|
58
|
-
- Asynchronous API
|
59
|
-
- Streaming execution output
|
60
|
-
- Automatic sandbox management
|
61
|
-
- Error handling and timeouts
|
62
|
-
- Type hints for better IDE support
|
63
|
-
|
64
|
-
## API Reference
|
65
|
-
|
66
|
-
### SandboxClient
|
67
|
-
|
68
|
-
The main client class for interacting with the AI Computer service.
|
69
|
-
|
70
|
-
#### Methods
|
71
|
-
|
72
|
-
- `setup()`: Initialize the client and create a sandbox
|
73
|
-
- `execute_code(code: str, timeout: int = 30)`: Execute code and return combined output
|
74
|
-
- `execute_code_stream(code: str, timeout: int = 30)`: Execute code and stream output
|
75
|
-
- `cleanup()`: Delete the sandbox
|
76
|
-
- `wait_for_ready()`: Wait for sandbox to be ready
|
77
|
-
|
78
|
-
## Development
|
79
|
-
|
80
|
-
### Running Tests
|
81
|
-
|
82
|
-
```bash
|
83
|
-
pip install -e ".[dev]"
|
84
|
-
pytest
|
85
|
-
```
|
86
|
-
|
87
|
-
### Contributing
|
88
|
-
|
89
|
-
1. Fork the repository
|
90
|
-
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
|
91
|
-
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
|
92
|
-
4. Push to the branch (`git push origin feature/amazing-feature`)
|
93
|
-
5. Open a Pull Request
|
94
|
-
|
95
|
-
## License
|
96
|
-
|
97
|
-
MIT License
|
File without changes
|
File without changes
|
File without changes
|