Python SDK for Devento cloud sandboxes
Project description
Devento Python SDK
Official Python SDK for Devento, the cloud sandbox platform that provides secure, isolated execution environments.
Installation
pip install devento
For async support:
pip install devento[async]
Quick Start
from devento import Devento
# Initialize the client
devento = Devento(api_key="sk-devento-...")
# Create and use a sandbox
with devento.box() as box:
result = box.run("echo 'Hello from Devento!'")
print(result.stdout) # "Hello from Devento!"
Features
- Simple API: Intuitive interface for creating and managing boxes
- Automatic cleanup: Boxes are automatically cleaned up when done
- Streaming output: Real-time command output streaming
- Async support: Full async/await support for concurrent operations
- Type hints: Complete type annotations for better IDE support
- Error handling: Comprehensive error handling with specific exception types
Usage Examples
Basic Command Execution
from devento import Devento
devento = Devento(api_key="sk-devento-...")
with devento.box() as box:
# Run simple commands
result = box.run("pwd")
print(f"Current directory: {result.stdout}")
# Install packages
box.run("pip install numpy pandas")
# Run Python code
result = box.run("python -c 'import numpy as np; print(np.array([1,2,3]))'")
print(result.stdout)
Error Handling
from devento import Devento, CommandTimeoutError, DeventoError
try:
with devento.box() as box:
# This will timeout
result = box.run("sleep 120", timeout=5)
except CommandTimeoutError as e:
print(f"Command timed out: {e}")
except DeventoError as e:
print(f"Error: {e}")
Streaming Output
with devento.box() as box:
# Stream output as it's generated
result = box.run(
"for i in {1..5}; do echo \"Line $i\"; sleep 1; done",
on_stdout=lambda line: print(f"[LIVE] {line}", end=""),
on_stderr=lambda line: print(f"[ERROR] {line}", end="")
)
Custom Box Configuration
from devento import Devento, BoxConfig
config = BoxConfig(
cpu=2,
mib_ram=2048,
timeout=7200, # 2 hours
metadata={"project": "data-analysis"}
)
with devento.box(config=config) as box:
# Run resource-intensive tasks
result = box.run("python train_model.py")
Web Support
Boxes can expose services to the internet via public URLs. Each box gets a unique hostname, and you can access specific ports using the get_public_url() method:
with devento.box() as box:
# Start a web server on port 8080
box.run("python -m http.server 8080 &")
# Wait for server to start
box.run("sleep 2")
# Get the public URL for port 8080
public_url = box.get_public_url(8080)
print(f"Access your server at: {public_url}")
# Output: https://8080-uuid.deven.to
# The service is now accessible from anywhere on the internet
box.run(f"curl {public_url}")
This feature is useful for:
- Testing webhooks and callbacks
- Sharing development servers temporarily
- Demonstrating web applications
- Running services that need to be accessible from external systems
Port Exposing
You can dynamically expose ports from inside the sandbox to random external ports. This is useful when you need to access services running inside the sandbox but don't know the port in advance or need multiple services:
with devento.box() as box:
# Start a service on port 3000 inside the sandbox
box.run("python -m http.server 3000 &")
# Give the server a moment to start
box.run("sleep 2")
# Expose the internal port 3000 to an external port
exposed_port = box.expose_port(3000)
print(f"Internal port {exposed_port.target_port} is now accessible on external port {exposed_port.proxy_port}")
print(f"Port mapping expires at: {exposed_port.expires_at}")
# You can now access the service using the proxy_port
# For example: http://sandbox-hostname:proxy_port
The expose_port method returns an ExposedPort object with:
target_port- The port inside the sandbox (what you requested)proxy_port- The external port assigned by the systemexpires_at- When this port mapping will expire
Async Operations
import asyncio
from devento import AsyncDevento
async def run_parallel_tasks():
async with AsyncDevento(api_key="sk-devento-...") as devento:
async with devento.box() as box:
# Run multiple commands in parallel
results = await asyncio.gather(
box.run("task1.py"),
box.run("task2.py"),
box.run("task3.py")
)
for result in results:
print(result.stdout)
asyncio.run(run_parallel_tasks())
Manual Box Management
# Create a box without automatic cleanup
box = devento.create_box()
try:
# Wait for box to be ready
box.wait_until_ready()
# Run commands
result = box.run("echo 'Hello'")
print(result.stdout)
# Check box status
print(f"Box status: {box.status}")
finally:
# Don't forget to clean up!
box.stop()
API Reference
Client Classes
Devento: Main client for synchronous operationsAsyncDevento: Client for async operations (requirespip install devento[async])
Configuration
BoxConfig: Configuration for box creationcpu: Number of CPUs to allocate (default: 1)mib_ram: MiB RAM to allocate (default: 1024)timeout: Maximum lifetime in seconds (default: 3600, or DEVENTO_BOX_TIMEOUT env var)metadata: Custom metadata dictionary
Models
Box: Represents a box instancehostname: Public hostname for web access (e.g.,uuid.deven.to)get_public_url(port): Get the public URL for accessing a specific port
CommandResult: Result of command executionstdout: Command outputstderr: Error outputexit_code: Process exit codestatus: Command status (QUEUED, RUNNING, DONE, FAILED, ERROR)
ExposedPort: Result of exposing a portproxy_port: External port assigned by the systemtarget_port: Port inside the sandboxexpires_at: When this port mapping expires
Exceptions
DeventoError: Base exception for all SDK errorsAPIError: Base for API-related errorsAuthenticationError: Invalid API keyBoxNotFoundError: Box doesn't existCommandTimeoutError: Command execution timeoutValidationError: Invalid request parameters
Environment Variables
The SDK supports the following environment variables:
DEVENTO_API_KEY: Your API key (alternative to passing it in code)DEVENTO_BASE_URL: API base URL (default: https://api.devento.ai)DEVENTO_CPU: CPU to allocate to the sandbox (default: 1)DEVENTO_MIB_RAM: MiB RAM to allocate to the sandbox (default: 1024)DEVENTO_BOX_TIMEOUT: Default box timeout in seconds (default: 3600)
Example:
export DEVENTO_API_KEY="sk-devento-..."
export DEVENTO_BASE_URL="https://api.devento.ai"
export DEVENTO_BOX_TIMEOUT="7200"
export DEVENTO_CPU="1"
export DEVENTO_MIB_RAM="1024"
# Now you can initialize without parameters
python -c "from devento import Devento; client = Devento()"
Requirements
- Python 3.9+
requestslibraryaiohttp(optional, for async support)
Support
- Documentation: https://devento.ai
- Issues: https://github.com/devento-ai/sdk-py/issues
License
MIT License - see LICENSE file for details.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file devento-0.1.1.tar.gz.
File metadata
- Download URL: devento-0.1.1.tar.gz
- Upload date:
- Size: 25.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5f2627899a4719f1ea22a58b2fae4f8bfae0786068996b54517dcafdb7f7befe
|
|
| MD5 |
6f130a8c9decda8556f40cff1485e26d
|
|
| BLAKE2b-256 |
2754041d8218fcee96e6a01a5e26adb9539e99b32da239a68dca7ec59523b9ee
|
File details
Details for the file devento-0.1.1-py3-none-any.whl.
File metadata
- Download URL: devento-0.1.1-py3-none-any.whl
- Upload date:
- Size: 16.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dec0b5a51a56d3323c8e823d5e8370c49726ee3ab26507edc8f7f9c9fcea040b
|
|
| MD5 |
7338d6ce84c1cbd8212226ec4b4f7cb7
|
|
| BLAKE2b-256 |
ace1271200e6bfb8d63bd474600db3701bd0f666c7f0da09592709fef327a60d
|