Official Python SDK for Parel. 100+ AI models, GPU rental (BYOM), compare, and credits via a single OpenAI-compatible API.
Project description
Parel SDK for Python
Official Python SDK for Parel. 100+ AI models, GPU rental (BYOM), compare, and credits via a single OpenAI-compatible API.
Feature parity with @parel-cloud/node (v0.1.1). Both SDKs wrap the same gateway and share a machine-readable
parity.json.
Install
pip install parel-cloud
# Optional: enable the `parel.openai` lazy client (streaming, tools, vision)
pip install "parel-cloud[openai]"
Requires Python 3.10+.
Quick start (sync)
import os
from parel_cloud import Parel
parel = Parel(api_key=os.environ["PAREL_API_KEY"])
snapshot = parel.credits.get()
print(f"remaining: ${snapshot['remaining_usd']:.2f}")
# Drop-in OpenAI client pointed at Parel
chat = parel.openai.chat.completions.create(
model="qwen3.5-72b",
messages=[{"role": "user", "content": "merhaba"}],
)
print(chat.choices[0].message.content)
Quick start (async)
import asyncio
from parel_cloud import AsyncParel
async def main():
async with AsyncParel() as parel:
models = await parel.models.list()
print(len(models["data"]))
asyncio.run(main())
Namespaces
| Namespace | Purpose | Example |
|---|---|---|
credits |
Budget snapshot | parel.credits.get() |
models |
Catalogue + metadata | parel.models.list() / parel.models.retrieve("qwen3.5-72b") |
tasks |
Async task polling + cancel | parel.tasks.wait_for(task_id) / parel.tasks.cancel(task_id) |
images |
Image generation + edit | parel.images.generate(model="flux-schnell", prompt="...") |
videos |
Video generation | parel.videos.generate(model="seedance-1.5", prompt="...") |
audio |
TTS, STT, music | parel.audio.speech(model="...", input="...") |
gpu |
BYOM deployments, HF validate, prefetch, metrics | parel.gpu.create(huggingface_id=..., gpu_tier=...) |
compare |
Multi-model head-to-head runs + conversations | parel.compare.run(models=[...], prompt="...") |
openai |
Lazy openai.OpenAI / openai.AsyncOpenAI pointed at Parel |
parel.openai.chat.completions.create(...) |
Typed error handling
from parel_cloud import (
Parel,
ParelBudgetExceededError,
ParelRateLimitError,
ParelTaskNotCancellableError,
ParelCapacityExhaustedError,
)
parel = Parel()
try:
parel.images.generate(model="flux-schnell", prompt="a cat")
except ParelBudgetExceededError as err:
print(f"top up: {err.message} (request_id={err.request_id})")
except ParelRateLimitError as err:
print(f"slow down for {err.retry_after} seconds")
except ParelCapacityExhaustedError:
print("no GPU capacity right now")
except ParelTaskNotCancellableError:
print("task already terminal, nothing to cancel")
Every error subclasses ParelError and carries message, code, status, request_id, and param.
BYOM (bring-your-own-model) example
from parel_cloud import Parel
parel = Parel()
# 1. Validate a HuggingFace model (VRAM needs, recommended tier)
info = parel.gpu.validate_huggingface("meta-llama/Llama-3.1-8B-Instruct")
print(info["recommended_gpu_tier"])
# 2. Deploy
dep = parel.gpu.create(
huggingface_id="meta-llama/Llama-3.1-8B-Instruct",
gpu_tier="rtx4090",
idle_timeout_minutes=15,
)
# 3. Wait for it to come online
running = parel.gpu.wait_for_running(dep["id"])
# 4. Inference
resp = parel.gpu.chat(dep["id"], {
"messages": [{"role": "user", "content": "hi"}],
})
print(resp["choices"][0]["message"]["content"])
# 5. Tear down when done
parel.gpu.delete(dep["id"])
Configuration
| Arg | Env var | Default |
|---|---|---|
api_key |
PAREL_API_KEY |
required |
base_url |
PAREL_BASE_URL |
https://api.parel.cloud |
timeout_s |
— | 60 |
max_retries |
— | 2 (idempotent verbs only) |
user_agent |
— | parel-cloud/<ver> python/<ver> |
Retries
GET, HEAD, OPTIONS, PUT, DELETE are retried on 429, 5xx, and transport errors with jittered exponential backoff (500ms base, capped at 8s). POST and PATCH are not auto-retried (the gateway considers them non-idempotent at v0.1).
JavaScript / TypeScript
Same SDK shape, different language: @parel-cloud/node.
Roadmap
- LangChain, LlamaIndex, CrewAI, DSPy integrations (as separate packages)
Idempotency-Keysupport for retryable POSTs- SSE streaming helpers for long-running generations
- Multipart file upload for
audio.transcribe
License
MIT © Aleonis Teknoloji
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file parel_cloud-0.1.0.tar.gz.
File metadata
- Download URL: parel_cloud-0.1.0.tar.gz
- Upload date:
- Size: 25.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
09a9eb742d833459144cd8994936dacc9d5816189323fa320f3e27cfe105b6aa
|
|
| MD5 |
5d2fc9f63f730be5e902f6c429f7b6b2
|
|
| BLAKE2b-256 |
6043e47d50989b9f103fcbfd93c1b4e7622106aa4b5e877f54ee5dfa1f30a30e
|
File details
Details for the file parel_cloud-0.1.0-py3-none-any.whl.
File metadata
- Download URL: parel_cloud-0.1.0-py3-none-any.whl
- Upload date:
- Size: 23.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
72eaa529e4f1f501598fdff84af954a7516dcb307f79b6984afc2648058dd182
|
|
| MD5 |
6301994db8933e234c8483de8494bc0b
|
|
| BLAKE2b-256 |
e309620765618369727976bacd77a21d226279898d9b69def9dc779c632b860c
|