@computesdk/upstash
Upstash Box provider for ComputeSDK - Execute code in cloud sandboxes with full filesystem access, shell commands, snapshots, and preview URLs.
Installation
npm install @computesdk/upstash
Setup
export UPSTASH_BOX_API_KEY=your_api_key_here
Quick Start
import { upstash } from '@computesdk/upstash';
const compute = upstash({ apiKey: process.env.UPSTASH_BOX_API_KEY });
const sandbox = await compute.sandbox.create();
const result = await sandbox.runCommand(`python - <<'PY'
import pandas as pd
print(pd.__version__)
PY`);
console.log(result.stdout);
await sandbox.destroy();
Configuration
Environment Variables
export UPSTASH_BOX_API_KEY=your_api_key_here
Configuration Options
interface UpstashConfig {
apiKey?: string;
runtime?: string;
timeout?: number;
}
Features
- Command Execution - Run shell commands in sandbox (Python/Node.js available)
- Filesystem Operations - Full file system access
- Preview URLs - Get publicly accessible URLs for running services
- Snapshots - Save and restore sandbox state
API Reference
Command Execution
const result = await sandbox.runCommand(`python - <<'PY'
import json
data = {"message": "Hello from Python"}
print(json.dumps(data))
PY`);
const result = await sandbox.runCommand(`node - <<'JS'
const data = { message: "Hello from Node.js" };
console.log(JSON.stringify(data));
JS`);
```typescript
// List files
const result = await sandbox.runCommand('ls -la');
// Install packages
const result = await sandbox.runCommand('pip install requests');
// Run with environment variables
const result = await sandbox.runCommand('echo $MY_VAR', {
env: { MY_VAR: 'hello' },
});
// Run with working directory
const result = await sandbox.runCommand('ls', { cwd: '/workspace/home/myproject' });
// Run in background
const result = await sandbox.runCommand('node server.js', { background: true });
Filesystem Operations
await sandbox.filesystem.writeFile('/tmp/hello.py', 'print("Hello World")');
const content = await sandbox.filesystem.readFile('/tmp/hello.py');
await sandbox.filesystem.mkdir('/tmp/data');
const files = await sandbox.filesystem.readdir('/tmp');
const exists = await sandbox.filesystem.exists('/tmp/hello.py');
await sandbox.filesystem.remove('/tmp/hello.py');
Preview URLs
const url = await sandbox.getUrl({ port: 3000 });
console.log(url);
Snapshots
import { upstash } from '@computesdk/upstash';
const compute = upstash({ apiKey: process.env.UPSTASH_BOX_API_KEY });
const snapshot = await compute.snapshot.create(sandbox.id, {
name: 'my-checkpoint',
});
console.log(snapshot.id, snapshot.metadata);
const restored = await compute.sandbox.create({
snapshotId: snapshot.id,
});
Sandbox Management
const info = await sandbox.getInfo();
console.log(info.id, info.status, info.createdAt);
const existing = await compute.sandbox.getById('box-id');
const sandboxes = await compute.sandbox.list();
await sandbox.destroy();
Error Handling
import { upstash } from '@computesdk/upstash';
try {
const compute = upstash({ apiKey: process.env.UPSTASH_BOX_API_KEY });
const sandbox = await compute.sandbox.create();
const result = await sandbox.runCommand('invalid code');
} catch (error) {
if (error.message.includes('Missing Upstash Box API key')) {
console.error('Set UPSTASH_BOX_API_KEY environment variable');
} else if (error.message.includes('authentication failed')) {
console.error('Check your Upstash Box API key');
} else if (error.message.includes('quota exceeded')) {
console.error('Upstash usage limits reached');
}
}
Examples
Data Science Workflow
import { upstash } from '@computesdk/upstash';
const compute = upstash({ apiKey: process.env.UPSTASH_BOX_API_KEY });
const sandbox = await compute.sandbox.create();
await sandbox.filesystem.mkdir('/analysis/data');
await sandbox.filesystem.mkdir('/analysis/output');
const csvData = `name,age,city
Alice,25,New York
Bob,30,San Francisco
Charlie,35,Chicago`;
await sandbox.filesystem.writeFile('/analysis/data/people.csv', csvData);
const result = await sandbox.runCommand(`python - <<'PY'
import pandas as pd
import matplotlib.pyplot as plt
# Read data
df = pd.read_csv('/analysis/data/people.csv')
print("Data loaded:")
print(df)
# Calculate statistics
avg_age = df['age'].mean()
print(f"\\nAverage age: {avg_age}")
# Create visualization
plt.figure(figsize=(8, 6))
plt.bar(df['name'], df['age'])
plt.title('Age by Person')
plt.savefig('/analysis/output/age_chart.png')
print("\\nChart saved!")
PY`);
console.log(result.stdout);
await sandbox.destroy();
Web Server with Preview URL
import { upstash } from '@computesdk/upstash';
const compute = upstash({ apiKey: process.env.UPSTASH_BOX_API_KEY });
const sandbox = await compute.sandbox.create();
await sandbox.filesystem.writeFile('/server.js', `
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ status: 'ok' }));
});
server.listen(3000, () => console.log('Server running on port 3000'));
`);
await sandbox.runCommand('node /server.js', { background: true });
const url = await sandbox.getUrl({ port: 3000 });
console.log('Server available at:', url);
await sandbox.destroy();
Best Practices
- Resource Management: Always destroy sandboxes when done to free resources
- Error Handling: Use try-catch blocks for robust error handling
- Timeouts: Set appropriate timeouts for long-running tasks (default is 10 minutes)
- File Paths: All paths are resolved relative to
/workspace/home
- Snapshots: Use snapshots to save and restore sandbox state for reproducible environments
- API Key Security: Never commit API keys to version control
Limitations
- File Paths: All filesystem operations are scoped under
/workspace/home
- Memory Limits: Subject to Upstash Box resource constraints
- Snapshot Deletion: Snapshot deletion requires a box context
- Template Support: Use snapshots instead of templates for saving box state
Support
License
MIT