Metadata-Version: 2.4
Name: sxd-sdk
Version: 0.3.0
Summary: SDK for building and deploying data pipelines on SentientX Data Platform
Author-email: SentientX <dev@sentient-x.com>
License: Apache-2.0
Project-URL: Homepage, https://github.com/sentient-x/sxd
Project-URL: Documentation, https://sentient-x.github.io/sxd
Project-URL: Repository, https://github.com/sentient-x/sxd
Project-URL: Issues, https://github.com/sentient-x/sxd/issues
Keywords: data-pipelines,distributed-computing,machine-learning,computer-vision
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: System :: Distributed Computing
Requires-Python: >=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: httpx>=0.23.0
Requires-Dist: pydantic>=2.0.0
Requires-Dist: psutil>=5.9.0
Provides-Extra: pytorch
Requires-Dist: torch>=2.0.0; extra == "pytorch"
Requires-Dist: torchvision>=0.15.0; extra == "pytorch"
Provides-Extra: opencv
Requires-Dist: opencv-python>=4.8.0; extra == "opencv"
Requires-Dist: numpy>=1.24.0; extra == "opencv"
Provides-Extra: dev
Requires-Dist: pytest>=8.0.0; extra == "dev"
Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
Requires-Dist: respx>=0.20.0; extra == "dev"
Requires-Dist: ruff>=0.2.0; extra == "dev"
Requires-Dist: mypy>=1.8.0; extra == "dev"
Provides-Extra: all
Requires-Dist: sxd-sdk[dev,opencv,pytorch]; extra == "all"
Dynamic: license-file

# SXD SDK

Python library for building data pipelines on SentientX Data Platform.

## Installation

```bash
pip install sxd-sdk
```

## Quick Start

### 1. Create Pipeline

Create a new directory with this structure:

```
my-pipeline/
├── my_pipeline/
│   ├── __init__.py
│   └── activities.py
├── sxd.yaml
└── pyproject.toml
```

### 2. Define Tasks

```python
# my_pipeline/activities.py
from sxd_sdk import sxd_task, TaskContext, ProcessingResult

@sxd_task(name="process_video")
async def process_video(input_data: dict, ctx: TaskContext) -> dict:
    video_path = input_data["source_url"]
    await ctx.heartbeat(f"Processing {video_path}")
    result = ProcessingResult.ok(output_path="/output/result.mp4")
    return result.model_dump()
```

### 3. Configure (sxd.yaml)

```yaml
base_image: sxd-base    # or: sxd-pytorch, sxd-opencv, sxd-cuda
timeout: 3600           # optional, default 3600s
gpu: false              # optional, default false
```

### 4. Publish

```bash
sxd publish .
```

### 5. Submit Tasks

```bash
sxd submit process_video --input '{"source_url": "s3://bucket/video.mp4"}'
```

## API Reference

### Schemas

```python
from sxd_sdk import (
    PipelineInput,    # Base input with source_url, customer_id, options
    PipelineOutput,   # Base output with status, output_path, metrics, errors
    ProcessingResult, # Task result with success, output_path, error, metadata
)

# Convenience constructors
result = ProcessingResult.ok("/output/path", count=10)
result = ProcessingResult.fail("Something went wrong")
```

### Testing

```python
from sxd_sdk.testing import MockTaskContext, MockControlPlane

# Test tasks
async def test_my_task():
    ctx = MockTaskContext()
    result = await process_video({"source_url": "s3://video.mp4"}, ctx)
    assert result["success"]
    assert ctx._heartbeats  # verify heartbeat was called
```

### Client

```python
from sxd_sdk import SXDClient

client = SXDClient(api_url="https://api.example.com", api_key="...")
task = await client.submit("process_video", {"source_url": "s3://video.mp4"})
status = await client.status(task["id"])
```

## License

Apache 2.0
