un-inception/clients/python/QUICK_START.md
russell@unturf.com 75f687f12f feat: Complete Python and C SDK implementations with examples and pipeline integration
Python Sync SDK (clients/python/sync/):
- 712 lines core implementation with 13 public APIs
- HMAC-SHA256 authentication with OpenSSL
- 4-tier credential system (args > env > ~/.unsandbox > ./accounts.csv)
- Language caching with 1-hour TTL
- 64+ comprehensive unit tests
- Full documentation (README, USAGE, IMPLEMENTATION)

Python Async SDK (clients/python/async/):
- 705 lines async implementation using aiohttp
- Full async/await pattern support
- Exponential backoff polling strategy
- 200+ test cases with ~95% coverage
- 7 working async examples
- 5 documentation guides

C SDK (clients/c/):
- 823 lines C implementation
- Header file with 15 public functions
- OpenSSL HMAC-SHA256 + libcurl HTTP client
- Language detection for 48 file extensions
- 22/22 tests passing
- Proper memory management

Examples:
- 14 Python examples (7 sync, 7 async) with docstrings
- 4 C examples (hello_world, fibonacci, error_handling, credentials)
- All examples ready for pipeline validation
- Expected outputs documented for validation

Pipeline Integration:
- Updated .gitlab-ci.yml with gcc/musl-dev for C compilation
- Enhanced validate-examples.sh with C compilation support
- Updated detect-changes.sh to recognize python/c changes
- Updated generate-matrix.sh with python/c in matrix
- E2E tests updated with mock Python/C examples
- All tests passing (30+ test cases)

Documentation:
- PYTHON_C_INTEGRATION_SUMMARY.md (452 lines)
- Complete API references for both SDKs
- Quick start guides
- Pattern documentation
- Error handling guides
2026-01-15 16:42:58 -05:00

270 lines
6.3 KiB
Markdown

# Python SDK - Quick Start Guide
## Setup (30 seconds)
```bash
# Set your API credentials
export UNSANDBOX_PUBLIC_KEY="your-public-key"
export UNSANDBOX_SECRET_KEY="your-secret-key"
```
## Synchronous Usage
### Simple Execution
```bash
python3 sync/examples/hello_world_client.py
```
### Run Your Own Code
```python
from un import execute_code
result = execute_code("python", 'print("Hello")')
print(result.get("stdout")) # Output: Hello
```
### Available Languages
Python, JavaScript, Go, Rust, Java, C, C++, Ruby, PHP, Bash, and 40+ more
### Examples by Category
| Category | File | What It Does |
|----------|------|--------------|
| **Basic** | hello_world_client.py | Simple print statement |
| **CPU** | fibonacci_client.py | Recursive computation |
| **Network** | http_request.py | HTTP requests |
| **Data** | json_processing.py | JSON parsing |
| **Files** | file_operations.py | Temp file I/O |
## Asynchronous Usage
### Simple Async Execution
```bash
python3 async/examples/hello_world_async.py
```
### Run Concurrent Tasks
```python
import asyncio
from un_async import execute_code
async def main():
tasks = [
execute_code("python", 'print(1)'),
execute_code("python", 'print(2)'),
execute_code("python", 'print(3)'),
]
results = await asyncio.gather(*tasks)
return results
asyncio.run(main())
```
### Async Examples by Category
| Category | File | What It Does |
|----------|------|--------------|
| **Basic** | hello_world_async.py | Async execution |
| **Concurrent CPU** | fibonacci_async.py | Parallel computation |
| **Concurrent Network** | concurrent_requests.py | Parallel HTTP |
| **Streams** | stream_processing.py | Async generators |
| **Jobs** | async_job_polling.py | Job management |
| **Multi-language** | concurrent_execution.py | Mixed language execution |
| **Hybrid** | sync_blocking_usage.py | Sync + async mixing |
## Common Tasks
### Task 1: Execute Python Code
```python
from un import execute_code
result = execute_code("python", """
numbers = [1, 2, 3, 4, 5]
print(f"Sum: {sum(numbers)}")
""")
print(result.get("stdout"))
```
### Task 2: Execute JavaScript Code
```python
from un import execute_code
result = execute_code("javascript", """
const nums = [1, 2, 3, 4, 5];
console.log(`Sum: ${nums.reduce((a, b) => a + b, 0)}`);
""")
print(result.get("stdout"))
```
### Task 3: Run Multiple Jobs Concurrently
```python
import asyncio
from un_async import execute_code
async def run_jobs():
jobs = [
execute_code("python", "print('Job 1')"),
execute_code("javascript", "console.log('Job 2')"),
execute_code("bash", "echo 'Job 3'"),
]
return await asyncio.gather(*jobs)
asyncio.run(run_jobs())
```
### Task 4: Poll Job Status
```python
from un import execute_async, wait_for_job
# Start job
job_id = execute_async("python", "print('running')")
# Wait for completion
result = wait_for_job(job_id)
print(result.get("stdout"))
```
### Task 5: Make HTTP Request (from Sandbox)
```python
from un import execute_code
code = """
import requests
response = requests.get('https://httpbin.org/ip')
print(response.json())
"""
result = execute_code("python", code)
print(result.get("stdout"))
```
## Error Handling
```python
from un import execute_code, CredentialsError
try:
result = execute_code("python", "print('hello')")
if result.get("status") == "completed":
print(f"Success: {result.get('stdout')}")
elif result.get("status") == "failed":
print(f"Failed: {result.get('error')}")
elif result.get("status") == "timeout":
print("Execution timed out")
except CredentialsError:
print("Invalid credentials")
except Exception as e:
print(f"Error: {e}")
```
## Credential Options
### Option 1: Environment Variables (Recommended)
```bash
export UNSANDBOX_PUBLIC_KEY="key"
export UNSANDBOX_SECRET_KEY="secret"
python3 script.py
```
### Option 2: Function Arguments
```python
from un import execute_code
result = execute_code(
"python",
"print('hello')",
public_key="key",
secret_key="secret"
)
```
### Option 3: Config File
Create `~/.unsandbox/accounts.csv`:
```csv
public_key,secret_key
```
## Validation
Check all examples work:
```bash
bash scripts/validate-examples.sh
```
With credentials (executes examples):
```bash
UNSANDBOX_PUBLIC_KEY=... UNSANDBOX_SECRET_KEY=... \
bash scripts/validate-examples.sh --run
```
## File Structure
```
clients/python/
├── sync/
│ ├── src/un.py (Sync SDK)
│ └── examples/ (7 sync examples)
├── async/
│ ├── src/un_async.py (Async SDK)
│ └── examples/ (7 async examples)
├── EXAMPLES.md (Full documentation)
└── scripts/validate-examples.sh (Validation)
```
## Performance Tips
### For Multiple Executions
- Use **async examples** for concurrency
- Use `asyncio.gather()` to run tasks in parallel
- Don't create new session for each request
### For Long-Running Tasks
- Use `execute_async()` + `wait_for_job()` pattern
- Poll periodically rather than spinning
- Timeout after reasonable time
### For API Key Limits
- Check rate limit headers in responses
- Implement backoff for retries
- Use concurrency limits from account tier
## Next Steps
1. **Review Examples**: Check `EXAMPLES.md` for detailed docs
2. **Run Validation**: `bash scripts/validate-examples.sh`
3. **Try Sync Examples**: Start with `hello_world_client.py`
4. **Try Async Examples**: Then try `hello_world_async.py`
5. **Build Your App**: Use patterns from examples
## Documentation
- **EXAMPLES.md** - Full guide with all examples explained
- **EXAMPLES_STRUCTURE.md** - Project structure overview
- **README.md** - SDK API reference
- **QUICK_START.md** - This file
## Support
For issues:
1. Check credentials are set correctly
2. Verify network connectivity
3. Review error messages
4. Check `EXAMPLES.md` for similar cases
5. Try running validation script
## Key Takeaways
- **Sync**: Use `from un import execute_code`
- **Async**: Use `from un_async import execute_code` with `await`
- **Concurrency**: Use `asyncio.gather(*tasks)`
- **Jobs**: Use `execute_async()` + `wait_for_job()`
- **Languages**: 50+ languages supported
- **Error Handling**: Always check `result.get("status")`
---
**Ready?** Run your first example:
```bash
python3 sync/examples/hello_world_client.py
```