Skip to main content

Official Python SDK for HOPX.AI Sandboxes

Project description

Hopx Python SDK

Python Version License Version

Official Python SDK for Hopx.ai - Cloud sandboxes for AI agents and code execution.

What is Hopx.ai?

Hopx.ai provides secure, isolated cloud sandboxes that start in seconds. Each sandbox is a lightweight VM with root access, pre-installed development tools, and configurable network access.

Use cases:

  • AI agent code execution
  • Running untrusted code safely
  • Integration testing
  • Data processing and analysis
  • Browser automation
  • Educational coding environments

Sandbox features:

  • Full root access
  • Pre-installed development tools
  • Configurable network access
  • Persistent filesystem during session
  • Automatic cleanup after timeout

Installation

pip install hopx-ai

Quick Start

Basic Usage

from hopx_ai import Sandbox

# Create sandbox
sandbox = Sandbox.create(
    template="python",
    api_key="your-api-key"  # or set HOPX_API_KEY env var
)

# Execute code
result = sandbox.run_code("""
import sys
print(f"Python {sys.version}")
print("Hello from Hopx!")
""")

print(result.stdout)
# Output:
# Python 3.11.x
# Hello from Hopx!

# Clean up
sandbox.kill()

Context Manager

The context manager handles cleanup automatically:

from hopx_ai import Sandbox

with Sandbox.create(template="python") as sandbox:
    result = sandbox.run_code("print(2 + 2)")
    print(result.stdout)  # "4"

Async Support

from hopx_ai import AsyncSandbox
import asyncio

async def main():
    async with AsyncSandbox.create(template="python") as sandbox:
        result = await sandbox.run_code("print('Async!')")
        print(result.stdout)

asyncio.run(main())

Examples

AI Code Execution

Execute code generated by LLM agents:

from hopx_ai import Sandbox

agent_code = """
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
print(df.describe())
"""

sandbox = Sandbox.create(template="python")
result = sandbox.run_code(agent_code)

if result.success:
    print(result.stdout)
else:
    print(f"Error: {result.error}")

sandbox.kill()

Data Analysis with Charts

Capture matplotlib charts as base64-encoded PNG:

code = """
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
plt.plot(x, np.sin(x))
plt.title('Sine Wave')
plt.show()
"""

sandbox = Sandbox.create(template="python")
result = sandbox.run_code(code)

# Access chart data
if result.rich_outputs:
    png_data = result.rich_outputs[0].data  # Base64 PNG

sandbox.kill()

Multi-Step Workflow

Run commands sequentially in the same environment:

from hopx_ai import Sandbox

sandbox = Sandbox.create(template="nodejs", timeout_seconds=600)

# Clone and install
sandbox.commands.run("git clone https://github.com/user/project.git /app")
sandbox.commands.run("cd /app && npm install")

# Run tests
result = sandbox.commands.run("cd /app && npm test")
print(f"Tests: {'PASSED' if result.exit_code == 0 else 'FAILED'}")

# Build
sandbox.commands.run("cd /app && npm run build")

# List artifacts
files = sandbox.files.list("/app/dist/")
for file in files:
    print(f"Built: {file.name} ({file.size} bytes)")

sandbox.kill()

File Processing

Upload files, process data, and download results:

sandbox = Sandbox.create(template="python")

# Upload data
sandbox.files.write("/tmp/data.csv", csv_content)

# Process
result = sandbox.run_code("""
import pandas as pd
df = pd.read_csv('/tmp/data.csv')
result = df.groupby('category').sum()
result.to_csv('/tmp/output.csv')
print(f"Processed {len(df)} rows")
""")

# Download result
output = sandbox.files.read("/tmp/output.csv")
print(output)

sandbox.kill()

Core Features

Code Execution

Execute code in Python, JavaScript, or Bash:

# Python
result = sandbox.run_code("print('Hello')", language="python")

# JavaScript
result = sandbox.run_code("console.log('Hello')", language="javascript")

# Bash
result = sandbox.run_code("echo 'Hello'", language="bash")

# With environment variables
result = sandbox.run_code(
    "import os; print(os.environ['API_KEY'])",
    env={"API_KEY": "secret"}
)

File Operations

# Write files
sandbox.files.write("/app/config.json", '{"key": "value"}')

# Read files
content = sandbox.files.read("/app/config.json")

# List directory
files = sandbox.files.list("/app/")
for file in files:
    print(f"{file.name}: {file.size} bytes")

# Delete files
sandbox.files.delete("/app/temp.txt")

Commands

# Run synchronously
result = sandbox.commands.run("ls -la /app")
print(result.stdout)
print(f"Exit code: {result.exit_code}")

# Run in background (returns immediately with process ID)
result = sandbox.commands.run(
    "python long_task.py",
    background=True,
    timeout=300  # 5 minutes
)
print(result.stdout)  # "Background process started: cmd_1234..."

# Check process status
processes = sandbox.list_system_processes()

Environment Variables

# Set single variable
sandbox.env.set("DATABASE_URL", "postgresql://...")

# Set multiple variables
sandbox.env.set_many({
    "API_KEY": "key123",
    "DEBUG": "true"
})

# Get variable
value = sandbox.env.get("API_KEY")

# Delete variable
sandbox.env.delete("DEBUG")

Template Building

Build custom sandbox environments with your dependencies:

from hopx_ai import Template, wait_for_port
from hopx_ai.template import BuildOptions

# Define template
template = (
    Template()
    .from_python_image("3.11")
    .copy("requirements.txt", "/app/requirements.txt")
    .copy("src/", "/app/src/")
    .run("cd /app && pip install -r requirements.txt")
    .set_workdir("/app")
    .set_env("PORT", "8000")
    .set_start_cmd("python src/main.py", wait_for_port(8000))
)

# Build template
result = await Template.build(
    template,
    BuildOptions(
        name="my-python-app",
        api_key="your-api-key",
        on_log=lambda log: print(f"[{log['level']}] {log['message']}")
    )
)

print(f"Template ID: {result.template_id}")

# Create sandbox from template
sandbox = Sandbox.create(template_id=result.template_id)

Authentication

Get your API key at hopx.ai/dashboard

Set via environment variable:

export HOPX_API_KEY="your-api-key"

Or pass directly to methods:

sandbox = Sandbox.create(
    template="python",
    api_key="your-api-key"
)

Configuration

Template Build Timeout

Template.build() waits for templates to reach "active" status before returning. Templates transition through: building → publishing → active. The publishing phase takes 60-120 seconds.

Default timeout: 2700 seconds (45 minutes)

Environment variable:

export HOPX_TEMPLATE_BAKE_SECONDS=2700

BuildOptions parameter:

result = await Template.build(
    template,
    BuildOptions(
        name="my-template",
        api_key="...",
        template_activation_timeout=1800  # 1800 seconds = 30 minutes
    )
)

Priority: BuildOptions.template_activation_timeout > HOPX_TEMPLATE_BAKE_SECONDS > Default (2700s)

Pre-built Templates

Template Description
python Python 3.11 with pip, numpy, pandas, requests
nodejs Node.js 20 with npm, common packages
code-interpreter Python with data science stack (pandas, numpy, matplotlib, seaborn, scikit-learn)
go Go 1.21
rust Rust with Cargo
java Java 17 with Maven

Build custom templates with Template.build() for specific requirements.

Advanced Features

Rich Output Capture

Capture matplotlib charts and visualizations:

result = sandbox.run_code("""
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [1, 4, 9])
plt.title('My Chart')
plt.show()
""")

# Access PNG data
for output in result.rich_outputs:
    if output.type == "image/png":
        import base64
        with open("chart.png", "wb") as f:
            f.write(base64.b64decode(output.data))

Process Management

# List processes
processes = sandbox.processes.list()
for proc in processes:
    print(f"{proc.pid}: {proc.name} (CPU: {proc.cpu_percent}%)")

# Kill process
sandbox.processes.kill(1234)

Desktop Automation

Control sandboxes with graphical interfaces:

# Get VNC connection info
vnc = sandbox.desktop.get_vnc_info()
print(f"Connect to: {vnc.url}")

# Take screenshot
screenshot = sandbox.desktop.screenshot()  # Returns PNG bytes

# Control mouse
sandbox.desktop.mouse_click(100, 200)

# Type text
sandbox.desktop.keyboard_type("Hello, World!")

Health and Metrics

Monitor sandbox resource usage:

# Check health
health = sandbox.get_health()
print(health.status)

# Get metrics
metrics = sandbox.get_metrics()
print(f"CPU: {metrics.cpu_percent}%")
print(f"Memory: {metrics.memory_mb}MB")
print(f"Disk: {metrics.disk_mb}MB")

Error Handling

from hopx_ai import (
    HopxError,
    AuthenticationError,
    CodeExecutionError,
    FileNotFoundError,
    RateLimitError
)

try:
    sandbox = Sandbox.create(template="python")
    result = sandbox.run_code("1/0")

except AuthenticationError:
    print("Invalid API key")
except CodeExecutionError as e:
    print(f"Code execution failed: {e.stderr}")
except RateLimitError:
    print("Rate limit exceeded")
except HopxError as e:
    print(f"API error: {e.message}")

Best Practices

Resource management:

  • Use context managers for automatic cleanup
  • Set timeout_seconds to prevent runaway sandboxes
  • Call .kill() explicitly when not using context managers

Error handling:

  • Wrap sandbox operations in try/except blocks
  • Check result.success before accessing output
  • Review result.stderr for error details

Performance:

  • Use pre-built templates when possible (faster than custom builds)
  • Group related operations to reduce API calls
  • Monitor resource usage for long-running tasks

Troubleshooting

Sandbox creation fails:

  • Verify API key is valid
  • Check network connectivity
  • Review error message for specific issue

Code execution errors:

  • Check result.stderr for error details
  • Verify required packages are installed
  • Confirm file paths are correct

File not found errors:

  • Use absolute paths (e.g., /app/file.txt)
  • Verify file upload completed successfully
  • Check current working directory

Documentation

Support

License

MIT License - see LICENSE file for details.

Links

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

hopx_ai-0.2.8.tar.gz (266.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

hopx_ai-0.2.8-py3-none-any.whl (89.5 kB view details)

Uploaded Python 3

File details

Details for the file hopx_ai-0.2.8.tar.gz.

File metadata

  • Download URL: hopx_ai-0.2.8.tar.gz
  • Upload date:
  • Size: 266.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for hopx_ai-0.2.8.tar.gz
Algorithm Hash digest
SHA256 f321eaac1666857770d1362a8b6d29b4b39eda11e4cee82df68cb1399df3897d
MD5 d5244773e0340fcb8d30710f875013a8
BLAKE2b-256 788c008660c3c71dfc974e65540276dc5ab40292cc852d6b0a58156d8263d57c

See more details on using hashes here.

File details

Details for the file hopx_ai-0.2.8-py3-none-any.whl.

File metadata

  • Download URL: hopx_ai-0.2.8-py3-none-any.whl
  • Upload date:
  • Size: 89.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for hopx_ai-0.2.8-py3-none-any.whl
Algorithm Hash digest
SHA256 a3e3114e9caacea7b9ec482178b17cea0ed5ec34f3a9f1f0eccf6dd237a97dbf
MD5 2ec3a5b7874e20e06e4bfd41581c8d8f
BLAKE2b-256 04b76645461a7ad668e3d60cfd10eea94e86b91e5a6b6a1a4d56e5f5d2d002ac

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page