Metadata-Version: 2.4
Name: ophelian
Version: 1.0.1
Summary: Declarative ML framework: write a Pipeline once, run it anywhere — local Docker, AWS, GCP, Azure, or routed to the cheapest cloud.
Project-URL: Homepage, https://github.com/ophelianio/ophelian
Project-URL: Documentation, https://ophelianio.github.io/ophelian/
Project-URL: Repository, https://github.com/ophelianio/ophelian
Project-URL: Issues, https://github.com/ophelianio/ophelian/issues
Project-URL: Changelog, https://github.com/ophelianio/ophelian/blob/main/CHANGELOG.md
Author: Ophelian Maintainers
License: Apache-2.0
License-File: LICENSE
License-File: NOTICE
Keywords: declarative,docker,fastapi,ml,mlops,pipeline
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Science/Research
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: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: >=3.11
Requires-Dist: cloudpickle<4,>=3.0
Requires-Dist: docker<8,>=7.1
Requires-Dist: fastapi<1,>=0.111
Requires-Dist: httpx<1,>=0.27
Requires-Dist: pydantic<3,>=2.7
Requires-Dist: rich<14,>=13.7
Requires-Dist: typer<1,>=0.12
Requires-Dist: uvicorn<1,>=0.30
Provides-Extra: aks
Requires-Dist: azure-identity>=1.17; extra == 'aks'
Requires-Dist: azure-mgmt-containerservice>=31.0; extra == 'aks'
Requires-Dist: azure-storage-blob>=12.20; extra == 'aks'
Requires-Dist: kubernetes>=29.0; extra == 'aks'
Provides-Extra: all
Requires-Dist: azure-identity>=1.17; extra == 'all'
Requires-Dist: azure-mgmt-compute>=33.0; extra == 'all'
Requires-Dist: azure-mgmt-network>=25.4; extra == 'all'
Requires-Dist: azure-mgmt-resource>=23.1; extra == 'all'
Requires-Dist: azure-storage-blob>=12.20; extra == 'all'
Requires-Dist: boto3>=1.34; extra == 'all'
Requires-Dist: botocore>=1.34; extra == 'all'
Requires-Dist: google-auth>=2.30; extra == 'all'
Requires-Dist: google-cloud-compute>=1.19; extra == 'all'
Requires-Dist: google-cloud-storage>=2.18; extra == 'all'
Requires-Dist: joblib>=1.4; extra == 'all'
Requires-Dist: kubernetes>=29.0; extra == 'all'
Requires-Dist: paramiko>=3.4; extra == 'all'
Requires-Dist: scikit-learn>=1.4; extra == 'all'
Requires-Dist: torch>=2.2; extra == 'all'
Requires-Dist: transformers>=4.40; extra == 'all'
Requires-Dist: xgboost>=2.0; extra == 'all'
Provides-Extra: aws
Requires-Dist: boto3>=1.34; extra == 'aws'
Requires-Dist: botocore>=1.34; extra == 'aws'
Requires-Dist: paramiko>=3.4; extra == 'aws'
Provides-Extra: azure
Requires-Dist: azure-identity>=1.17; extra == 'azure'
Requires-Dist: azure-mgmt-compute>=33.0; extra == 'azure'
Requires-Dist: azure-mgmt-network>=25.4; extra == 'azure'
Requires-Dist: azure-mgmt-resource>=23.1; extra == 'azure'
Requires-Dist: azure-storage-blob>=12.20; extra == 'azure'
Provides-Extra: dev
Requires-Dist: boto3>=1.34; extra == 'dev'
Requires-Dist: botocore>=1.34; extra == 'dev'
Requires-Dist: build>=1.5; extra == 'dev'
Requires-Dist: evidently>=0.4; extra == 'dev'
Requires-Dist: joblib>=1.4; extra == 'dev'
Requires-Dist: moto>=5.0; extra == 'dev'
Requires-Dist: mypy>=1.10; extra == 'dev'
Requires-Dist: numpy>=1.26; extra == 'dev'
Requires-Dist: opentelemetry-api>=1.25; extra == 'dev'
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.25; extra == 'dev'
Requires-Dist: opentelemetry-exporter-prometheus>=0.46b0; extra == 'dev'
Requires-Dist: opentelemetry-sdk>=1.25; extra == 'dev'
Requires-Dist: paramiko>=3.4; extra == 'dev'
Requires-Dist: pre-commit>=3.7; extra == 'dev'
Requires-Dist: prometheus-client>=0.20; extra == 'dev'
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
Requires-Dist: pytest>=8.2; extra == 'dev'
Requires-Dist: ruff>=0.6; extra == 'dev'
Requires-Dist: scikit-learn>=1.4; extra == 'dev'
Requires-Dist: scipy>=1.11; extra == 'dev'
Requires-Dist: twine>=6.0; extra == 'dev'
Requires-Dist: types-docker>=7.1; extra == 'dev'
Provides-Extra: docs
Requires-Dist: mkdocs-material>=9.5; extra == 'docs'
Requires-Dist: mkdocs>=1.6; extra == 'docs'
Requires-Dist: mkdocstrings[python]>=0.25; extra == 'docs'
Requires-Dist: pymdown-extensions>=10.8; extra == 'docs'
Provides-Extra: drift
Requires-Dist: evidently>=0.4; extra == 'drift'
Requires-Dist: numpy>=1.26; extra == 'drift'
Requires-Dist: scipy>=1.11; extra == 'drift'
Provides-Extra: eks
Requires-Dist: boto3>=1.34; extra == 'eks'
Requires-Dist: botocore>=1.34; extra == 'eks'
Requires-Dist: kubernetes>=29.0; extra == 'eks'
Provides-Extra: gcp
Requires-Dist: google-auth>=2.30; extra == 'gcp'
Requires-Dist: google-cloud-compute>=1.19; extra == 'gcp'
Requires-Dist: google-cloud-storage>=2.18; extra == 'gcp'
Provides-Extra: gke
Requires-Dist: google-cloud-container>=2.49; extra == 'gke'
Requires-Dist: google-cloud-storage>=2.18; extra == 'gke'
Requires-Dist: kubernetes>=29.0; extra == 'gke'
Provides-Extra: huggingface
Requires-Dist: torch>=2.2; extra == 'huggingface'
Requires-Dist: transformers>=4.40; extra == 'huggingface'
Provides-Extra: otel
Requires-Dist: opentelemetry-api>=1.25; extra == 'otel'
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.25; extra == 'otel'
Requires-Dist: opentelemetry-exporter-prometheus>=0.46b0; extra == 'otel'
Requires-Dist: opentelemetry-sdk>=1.25; extra == 'otel'
Requires-Dist: prometheus-client>=0.20; extra == 'otel'
Provides-Extra: pricing
Provides-Extra: pytorch
Requires-Dist: torch>=2.2; extra == 'pytorch'
Provides-Extra: sklearn
Requires-Dist: joblib>=1.4; extra == 'sklearn'
Requires-Dist: scikit-learn>=1.4; extra == 'sklearn'
Provides-Extra: xgboost
Requires-Dist: xgboost>=2.0; extra == 'xgboost'
Description-Content-Type: text/markdown

<p align="center">
  <img src="https://raw.githubusercontent.com/ophelianio/ophelian/dev/docs/assets/ophelian.png" alt="Ophelian" width="96" height="96">
</p>

<h1 align="center">Ophelian</h1>

<p align="center">
  <strong>Write your ML pipeline once. Run it anywhere. Route to the cheapest available GPU across AWS, GCP, and Azure.</strong>
</p>

<p align="center">
  <a href="https://pypi.org/project/ophelian/"><img src="https://img.shields.io/pypi/v/ophelian.svg" alt="PyPI"></a>
  <a href="https://pypi.org/project/ophelian/"><img src="https://img.shields.io/pypi/pyversions/ophelian.svg" alt="Python versions"></a>
  <a href="https://github.com/ophelianio/ophelian/blob/v1.0.1/LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-blue.svg" alt="License: Apache 2.0"></a>
  <a href="https://github.com/ophelianio/ophelian/actions/workflows/ci.yml"><img src="https://github.com/ophelianio/ophelian/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
  <a href="https://ophelianio.github.io/ophelian/"><img src="https://img.shields.io/badge/docs-online-4baaaa.svg" alt="Docs"></a>
</p>

---

Ophelian is a small, opinionated Python framework for taking ML / AI
prototypes to production without rewriting them every time the runtime
changes. Declare a `Pipeline`, pick an `env`, and Ophelian compiles +
runs it — locally in Docker, on AWS, GCP, or Azure, or routed
automatically to the cheapest cloud for the GPU you need.

## Install

```bash
pip install ophelian                  # core, runs locally
pip install 'ophelian[aws]'           # + EC2 / S3
pip install 'ophelian[gcp]'           # + GCE / GCS
pip install 'ophelian[azure]'         # + Azure VM / Blob
pip install 'ophelian[huggingface]'   # + Transformers + PyTorch
pip install 'ophelian[all]'           # every adapter and provider
```

Python **3.11+**. Full extras list (`pytorch`, `sklearn`, `xgboost`,
`otel`, ...) in [`pyproject.toml`](https://github.com/ophelianio/ophelian/blob/v1.0.1/pyproject.toml).

## Hello, pipeline

```python
from ophelian import Pipeline, Train, Auto

pipe = Pipeline([
    Train(
        model="meta-llama/Llama-3.2-1B",
        data="s3://my-bucket/dataset.jsonl",
        epochs=3,
    ),
])

# Picks the cheapest A100 across AWS / GCP / Azure right now.
pipe.run(env=Auto(cheapest_gpu="A100"))
```

The same source runs on your laptop, on EC2 spot, on a GCE preemptible
VM, or on an Azure Spot VM — Ophelian handles checkpointing, artifact
persistence (S3 / GCS / Azure Blob), structured logs, and a rich
summary at the end.

## Envs

```python
from ophelian import Standalone, AWS, GCP, Azure, Auto

Standalone(local=True)                                     # local Docker / in-process
AWS(region="us-east-1", instance="g5.xlarge", spot=True)   # EC2 / S3
GCP(project="p", region="us-central1",
    machine_type="n1-standard-4", gpu_type="nvidia-tesla-t4",
    preemptible=True)                                      # GCE / GCS
Azure(subscription_id=..., resource_group="ml",
      region="eastus", vm_size="Standard_NC6s_v3",
      spot=True)                                           # Azure VM / Blob
Auto(cheapest_gpu="A100",
     regions=["us-east-1", "us-central1", "eastus"])       # cost router
```

The same `Pipeline(...)` runs on every one of them. Each cloud env has
a `Local*Driver` mirror so the test suite (and any contributor without
cloud creds) exercises the full framework offline.

## Why Ophelian

| | Ophelian | SageMaker | Vertex AI | Azure ML | Bare cloud SDKs |
|---|:---:|:---:|:---:|:---:|:---:|
| Single API across AWS + GCP + Azure | ✅ | ❌ | ❌ | ❌ | ❌ |
| Write pipeline once, run anywhere | ✅ | ❌ | ❌ | ❌ | ❌ |
| Auto-router that picks the cheapest GPU | ✅ | ❌ | ❌ | ❌ | ❌ |
| Spot / preemptible resume | ✅ | partial | partial | partial | DIY |
| Local-first dev (no cloud auth) | ✅ | ❌ | ❌ | ❌ | ❌ |
| Apache-2.0, no vendor lock-in | ✅ | ❌ | ❌ | ❌ | mixed |

## Documentation

Full docs live at **<https://ophelianio.github.io/ophelian/>**:
[Quickstart](https://ophelianio.github.io/ophelian/quickstart/) ·
[Concepts](https://ophelianio.github.io/ophelian/concepts/) ·
[Envs](https://ophelianio.github.io/ophelian/envs/auto/) ·
[Cookbook](https://ophelianio.github.io/ophelian/cookbook/) ·
[Troubleshooting](https://ophelianio.github.io/ophelian/troubleshooting/).

Runnable examples in [`examples/`](https://github.com/ophelianio/ophelian/tree/v1.0.1/examples).
Roadmap and release history in [`CHANGELOG.md`](https://github.com/ophelianio/ophelian/blob/v1.0.1/CHANGELOG.md).

## Community

- **Questions** → [GitHub Discussions](https://github.com/ophelianio/ophelian/discussions)
- **Bugs / features** → [Issues](https://github.com/ophelianio/ophelian/issues)
- **Security** → see [`SECURITY.md`](https://github.com/ophelianio/ophelian/blob/v1.0.1/SECURITY.md) — please **do not** file a public issue
- **Contributing** → [`CONTRIBUTING.md`](https://github.com/ophelianio/ophelian/blob/v1.0.1/CONTRIBUTING.md) (we follow the [Contributor Covenant 2.1](https://github.com/ophelianio/ophelian/blob/v1.0.1/CODE_OF_CONDUCT.md))

## Citation

```bibtex
@software{ophelian_2026,
  author    = {Falva, Luis and the Ophelian contributors},
  title     = {{Ophelian: a declarative, multi-cloud ML pipeline framework}},
  year      = {2026},
  version   = {1.0.1},
  license   = {Apache-2.0},
  url       = {https://github.com/ophelianio/ophelian},
}
```

## License

Copyright © 2024–2026 Luis Falva and the Ophelian contributors.
Licensed under the **Apache License, Version 2.0** — see
[`LICENSE`](https://github.com/ophelianio/ophelian/blob/v1.0.1/LICENSE)
and [`NOTICE`](https://github.com/ophelianio/ophelian/blob/v1.0.1/NOTICE)
for third-party attributions.
