Official Python SDK for the Chassis GPU cloud API by OkeyMeta Ltd
Project description
chassis-cloud (Python)
Official Python client for the Chassis public API (/api/v1).
Default base URL: https://chassis.okeymeta.com.ng/api/v1
PyPI: chassis-cloud · import as chassis
Install
pip install chassis-cloud
Requires Python 3.10+ and httpx.
from chassis import Chassis
Auth
Create an API key in the Chassis console under API Keys. Keys look like chs_… and are shown once.
from chassis import Chassis
with Chassis(api_key="chs_...") as client:
...
Quickstart
from chassis import Chassis
with Chassis(api_key="chs_...") as client:
gpus = client.list_gpus()
for gpu in gpus:
print(gpu["displayName"], gpu["pricePerHourUsd"], gpu.get("stockStatus"))
instance = client.spin_up(
gpuSkuId=gpus[0]["id"],
name="gpu-host-01",
imageName="ghcr.io/YOUR_ORG/your-gpu-app:latest",
ports="8080/http,22/tcp",
)
Example: list available GPUs
with Chassis(api_key="chs_...") as client:
gpus = client.list_gpus()
for gpu in gpus:
print(
gpu["id"],
gpu.get("displayName"),
gpu.get("memoryGb"),
f"${gpu.get('pricePerHourUsd')}/hr",
gpu.get("stockStatus"),
)
gpu = next(
(g for g in gpus if "4090" in str(g.get("displayName", ""))),
gpus[0],
)
# use gpu["id"] as gpuSkuId on spin_up / create_cluster / create_endpoint
Example: host a GPU service
Any CUDA app — APIs, media tools, notebooks, batch workers — not only training.
with Chassis(api_key="chs_...") as client:
gpus = client.list_gpus()
instance = client.spin_up(
gpuSkuId=gpus[0]["id"],
name="gpu-host-01",
imageName="ghcr.io/YOUR_ORG/your-gpu-app:latest",
containerDiskGb=50,
ports="8080/http,22/tcp",
env={"MODEL_ID": "your-model"},
)
detail = client.get_instance(instance["id"])
print(detail.get("publicIp"), detail.get("connection"), detail.get("status"))
# Point your clients at publicIp / published ports
client.stop(instance["id"])
Example: training job
Spin up a dedicated GPU, run your trainer on the instance, then stop billing.
from chassis import Chassis
with Chassis(api_key="chs_...") as client:
gpus = client.list_gpus()
gpu = next(
(g for g in gpus if "A100" in str(g.get("displayName", ""))),
gpus[0],
)
instance = client.spin_up(
gpuSkuId=gpu["id"],
name="finetune-bert",
gpuCount=1,
imageName="pytorch/pytorch:2.1.0-cuda11.8-cudnn8-devel",
containerDiskGb=80,
ports="8888/http,22/tcp",
)
print("running", instance["id"], instance["status"])
# SSH / Jupyter → run train.py on the instance
client.stop(instance["id"])
Example: multi-node cluster
with Chassis(api_key="chs_...") as client:
gpus = client.list_gpus()
cluster = client.create_cluster(
name="dist-train",
gpuSkuId=gpus[0]["id"],
nodeCount=4,
gpusPerNode=1,
imageName="pytorch/pytorch:2.1.0-cuda11.8-cudnn8-devel",
)
print(client.get_cluster(cluster["id"]))
# Nodes receive CHASSIS_CLUSTER_ID, CHASSIS_NODE_RANK, CHASSIS_NODE_COUNT
client.stop_cluster(cluster["id"])
# client.terminate_cluster(cluster["id"])
Example: serverless endpoint
with Chassis(api_key="chs_...") as client:
gpus = client.list_gpus()
endpoint = client.create_endpoint(
name="text-infer",
gpuSkuId=gpus[0]["id"],
workersMin=0,
workersMax=3,
)
result = client.run_sync(
endpoint["id"],
body={
"input": {
"prompt": "Summarize Chassis in one sentence.",
"max_tokens": 128,
}
},
)
print(result)
job = client.run(endpoint["id"], body={"input": {"prompt": "hello"}})
status = client.get_job(endpoint["id"], job["id"])
print(status)
Instance options (create_instance / spin_up)
| Field | Required | Notes |
|---|---|---|
gpuSkuId |
yes | Chassis SKU UUID from list_gpus() |
name |
yes | Instance name |
gpuCount |
no | Default 1, max 8 |
imageName |
no | Container image |
containerDiskGb |
no | Default 50 |
volumeGb |
no | Ephemeral volume GB |
networkVolumeId |
no | Chassis network volume UUID |
registryCredentialId |
no | Chassis registry credential UUID |
cloudType |
no | "SECURE" or "COMMUNITY" |
ports |
no | e.g. "8080/http,22/tcp" |
env |
no | String map passed into the container |
startAfterCreate |
no | Default True (spin_up forces True) |
Methods
GPUs & instances
| Method | HTTP |
|---|---|
list_gpus() |
GET /gpus |
list_instances() |
GET /instances |
create_instance(**kwargs) |
POST /instances |
spin_up(**kwargs) |
POST /instances (startAfterCreate: true) |
get_instance(id) |
GET /instances/:id |
get_instance_logs(id, tail=None) |
GET /instances/:id/logs |
start(id) |
POST /instances/:id/start |
stop(id) |
POST /instances/:id/stop |
restart(id) |
POST /instances/:id/restart |
terminate(id) |
DELETE /instances/:id |
Clusters (multi-node)
| Method | HTTP |
|---|---|
list_clusters() |
GET /clusters |
create_cluster(**kwargs) |
POST /clusters |
get_cluster(id) |
GET /clusters/:id |
start_cluster(id) |
POST /clusters/:id/start |
stop_cluster(id) |
POST /clusters/:id/stop |
terminate_cluster(id) |
DELETE /clusters/:id |
Create with name, gpuSkuId, nodeCount (2–8), and optional gpusPerNode, imageName, networkVolumeId, ports. Nodes get CHASSIS_CLUSTER_ID, CHASSIS_NODE_RANK, and CHASSIS_NODE_COUNT.
Templates, volumes, registries
| Method | HTTP |
|---|---|
list_templates() / create_template(**kwargs) |
/templates |
list_volumes() / create_volume(**kwargs) |
/volumes |
list_registries() / create_registry(**kwargs) |
/registries |
Serverless endpoints
| Method | HTTP |
|---|---|
list_endpoints() |
GET /endpoints |
create_endpoint(**kwargs) |
POST /endpoints |
delete_endpoint(id) |
DELETE /endpoints/:id |
run(endpoint_id, body=None) |
POST /endpoints/:id/run |
run_sync(endpoint_id, body=None, wait_ms=None) |
POST /endpoints/:id/runsync |
Create options also accept env, interruptible, and publicIp.
Responses use data / error. Failures raise ChassisError with .status, .body, and a clear message.
Docs
Human setup guide: https://chassis.okeymeta.com.ng/docs
License
MIT · OkeyMeta Ltd
Project details
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 chassis_cloud-0.1.5.tar.gz.
File metadata
- Download URL: chassis_cloud-0.1.5.tar.gz
- Upload date:
- Size: 5.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5ddf1087a2665aff5ff020f37bc5de4239b2f8bc0b65e0e0e363d41c717b2318
|
|
| MD5 |
d080db2fb0467ab70087f15f87df0ec8
|
|
| BLAKE2b-256 |
734cbee12f0eca534640d86c6ee97746396c0f1126e0115e001bfe94e14297c5
|
File details
Details for the file chassis_cloud-0.1.5-py3-none-any.whl.
File metadata
- Download URL: chassis_cloud-0.1.5-py3-none-any.whl
- Upload date:
- Size: 5.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c8a993b0996d0a78262dfa1f96268fdbed33bc4a7378cd47333c5bf7fd05b531
|
|
| MD5 |
42c89ba1ca2de2685a6a4e61fbc80f48
|
|
| BLAKE2b-256 |
d8d23c8aad10a368dc5360612e6d37f430763f42d7f930a5c0bde54335570414
|