#!/usr/bin/env python3 """ Remote Sandbox Examples for PraisonAI Demonstrates how to use SSH, Modal, and Daytona sandbox backends for remote code execution. """ import asyncio import os from typing import Optional from praisonai.sandbox import SSHSandbox, ModalSandbox, DaytonaSandbox from praisonaiagents.sandbox import ResourceLimits async def ssh_example(): """Example using SSH sandbox for remote execution.""" print("๐Ÿ”— SSH Sandbox Example") print("=" * 50) # Configure SSH connection # Note: You need actual SSH server access for this to work ssh_host = os.getenv("SSH_HOST", "localhost") ssh_user = os.getenv("SSH_USER", "ubuntu") ssh_key = os.getenv("SSH_KEY_FILE", "~/.ssh/id_rsa") print(f"Connecting to {ssh_user}@{ssh_host}") try: sandbox = SSHSandbox( host=ssh_host, user=ssh_user, key_file=ssh_key, working_dir="/tmp/praisonai_demo" ) # Check availability if not sandbox.is_available: print("โŒ SSH backend not available. Install with: pip install praisonai[ssh]") return # Start sandbox await sandbox.start() print("โœ… SSH connection established") # Execute Python code print("\n๐Ÿ“„ Executing Python code...") result = await sandbox.execute(""" import sys import platform print(f"Python version: {sys.version}") print(f"Platform: {platform.platform()}") print("Hello from remote SSH server! ๐Ÿš€") """, language="python") print(f"Exit code: {result.exit_code}") print(f"Output:\n{result.stdout}") if result.stderr: print(f"Errors:\n{result.stderr}") # Execute shell command print("\n๐Ÿš Executing shell command...") result = await sandbox.run_command("uname -a && uptime") print(f"System info:\n{result.stdout}") # Write and read file print("\n๐Ÿ“ File operations...") await sandbox.write_file("/tmp/praisonai_demo/hello.py", "print('Hello from file!')") content = await sandbox.read_file("/tmp/praisonai_demo/hello.py") print(f"File content: {content}") # Execute the file result = await sandbox.execute_file("/tmp/praisonai_demo/hello.py") print(f"File execution result: {result.stdout}") # Test resource limits print("\nโฑ๏ธ Testing resource limits...") limits = ResourceLimits(timeout_seconds=5, memory_mb=128) result = await sandbox.execute(""" import time print("Starting long task...") time.sleep(10) # This will timeout print("Task completed") """, limits=limits) print(f"Limited execution status: {result.status}") if result.error: print(f"Error (expected timeout): {result.error}") await sandbox.stop() print("โœ… SSH sandbox stopped") except Exception as e: print(f"โŒ SSH example failed: {e}") async def modal_example(): """Example using Modal sandbox for serverless GPU execution.""" print("\nโ˜๏ธ Modal Sandbox Example") print("=" * 50) try: # Note: Requires Modal account and API key sandbox = ModalSandbox( gpu="A100", # Request A100 GPU timeout=120 ) # Check availability if not sandbox.is_available: print("โŒ Modal backend not available. Install with: pip install praisonai[modal]") return print("๐Ÿš€ Starting Modal app...") await sandbox.start() print("โœ… Modal app initialized") # Execute GPU-accelerated Python code print("\n๐Ÿ”ฅ Executing GPU code...") result = await sandbox.execute(""" import torch import numpy as np print(f"PyTorch version: {torch.__version__}") print(f"CUDA available: {torch.cuda.is_available()}") if torch.cuda.is_available(): device = torch.cuda.get_device_name() print(f"GPU device: {device}") # Simple tensor operations on GPU x = torch.randn(1000, 1000, device='cuda') y = torch.randn(1000, 1000, device='cuda') z = torch.matmul(x, y) print(f"GPU computation result shape: {z.shape}") else: print("Running on CPU") x = torch.randn(100, 100) y = torch.randn(100, 100) z = torch.matmul(x, y) print(f"CPU computation result shape: {z.shape}") print("๐Ÿš€ Modal execution completed!") """, language="python") print(f"Exit code: {result.exit_code}") print(f"Output:\n{result.stdout}") if result.stderr: print(f"Errors:\n{result.stderr}") # Test different languages print("\n๐Ÿš Testing bash execution...") result = await sandbox.run_command("nvidia-smi || echo 'No GPU info available'") print(f"GPU info:\n{result.stdout}") await sandbox.stop() print("โœ… Modal sandbox stopped") except Exception as e: print(f"โŒ Modal example failed: {e}") async def daytona_example(): """Example using Daytona sandbox for cloud dev environment.""" print("\n๐ŸŒค๏ธ Daytona Sandbox Example") print("=" * 50) try: # Configure Daytona workspace sandbox = DaytonaSandbox( workspace_template="python-dev", provider="aws", # or "gcp", "azure", "local" timeout=180 ) # Check availability if not sandbox.is_available: print("โŒ Daytona backend not available. Install with: pip install praisonai[daytona]") return print(f"๐Ÿ—๏ธ Creating Daytona workspace: {sandbox.workspace_name}") await sandbox.start() print("โœ… Daytona workspace ready") # Execute development tasks print("\n๐Ÿ’ป Running development tasks...") result = await sandbox.execute(""" import sys import os import subprocess print("๐Ÿ Python Development Environment") print(f"Python version: {sys.version}") print(f"Working directory: {os.getcwd()}") # Check installed packages try: result = subprocess.run([sys.executable, "-m", "pip", "list"], capture_output=True, text=True) print("๐Ÿ“ฆ Installed packages:") print(result.stdout[:500] + "..." if len(result.stdout) > 500 else result.stdout) except Exception as e: print(f"Could not list packages: {e}") print("โœจ Daytona workspace is ready for development!") """, language="python") print(f"Exit code: {result.exit_code}") print(f"Output:\n{result.stdout}") # Test file operations print("\n๐Ÿ“ Workspace file operations...") await sandbox.write_file("/workspace/demo.py", """ def hello_daytona(): print("Hello from Daytona workspace!") return "๐ŸŽ‰ Success!" if __name__ == "__main__": result = hello_daytona() print(result) """) # Execute the file result = await sandbox.execute_file("/workspace/demo.py") print(f"Demo script output: {result.stdout}") # List workspace files files = await sandbox.list_files("/workspace") print(f"Workspace files: {files}") await sandbox.stop() print("โœ… Daytona workspace stopped") except Exception as e: print(f"โŒ Daytona example failed: {e}") async def comparison_example(): """Compare execution across different sandbox backends.""" print("\nโš–๏ธ Sandbox Comparison") print("=" * 50) # Simple test code test_code = """ import time import sys start_time = time.time() print(f"Hello from {sys.platform}!") print(f"Execution time: {time.time() - start_time:.3f}s") """ # Test each sandbox type sandboxes = [ ("SSH", SSHSandbox(host=os.getenv("SSH_HOST", "localhost"))), ("Modal", ModalSandbox()), ("Daytona", DaytonaSandbox()) ] for name, sandbox in sandboxes: print(f"\n๐Ÿงช Testing {name} sandbox...") if not sandbox.is_available: print(f"โŒ {name} not available") continue try: await sandbox.start() result = await sandbox.execute(test_code, language="python") print(f"โœ… {name}: {result.status}") print(f" Duration: {result.duration_seconds:.3f}s") print(f" Output: {result.stdout.strip()}") await sandbox.stop() except Exception as e: print(f"โŒ {name} failed: {e}") async def main(): """Run all examples.""" print("๐Ÿš€ PraisonAI Remote Sandbox Examples") print("=" * 70) # Run examples await ssh_example() await modal_example() await daytona_example() await comparison_example() print("\nโœ… All examples completed!") print("\nNext steps:") print("1. Set up SSH access to remote servers") print("2. Configure Modal account for GPU workloads") print("3. Set up Daytona for cloud development") print("4. Use these sandboxes in your PraisonAI agents!") if __name__ == "__main__": asyncio.run(main())