Python SDK
Installation
pip install fleethq
Requires Python 3.10 or later. Install huggingface_hub separately if you want to use client.models.from_huggingface():
pip install fleethq huggingface_hub
Client
from fleet import Fleet
client = Fleet() # reads ~/.fleet/credentials
client = Fleet(api_key="fleet_sk_...") # explicit key
client = Fleet(base_url="http://localhost:8787") # custom endpoint
Models
client.models.from_huggingface(repo_id, ...)
Download a model from HuggingFace and upload it to Fleet. Returns immediately if the model is already uploaded.
model = client.models.from_huggingface("meta-llama/Llama-3.2-1B")
model = client.models.from_huggingface("mistralai/Mistral-7B-v0.1", revision="main")
| Argument | Type | Description |
|---|---|---|
repo_id |
str |
HuggingFace repo ID |
name |
str |
Display name in Fleet (defaults to repo_id) |
revision |
str |
Branch, tag, or commit hash (defaults to main) |
client.models.upload(directory, ...)
Upload a local model directory to Fleet.
model = client.models.upload("./my-model/")
model = client.models.upload("./my-model/", name="my-model-v2")
Fleet hashes the model files before uploading. Identical models are deduplicated automatically.
client.models.get(model_id)
model = client.models.get("model_abc123")
print(model.name, model.status)
client.models.list(source=None)
models = client.models.list() # all models
models = client.models.list(source="upload") # uploaded base models
models = client.models.list(source="job_output") # fine-tuned models
models = client.models.list(source="checkpoint") # training checkpoints
Model object
| Attribute | Type | Description |
|---|---|---|
id |
str |
Model ID |
name |
str |
Display name |
status |
str |
ready, pending, failed |
source |
str |
upload, job_output, checkpoint |
parent_id |
str | None |
Job ID that produced this model (fine-tunes/checkpoints) |
created_at |
str |
ISO 8601 timestamp |
model.estimate(dataset, method, hyperparameters)
Estimate cost and runtime for a training job without launching it. Returns a dict with per-tier ranges.
estimate = model.estimate(dataset, method="lora")
print(estimate["recommended_tier"]) # e.g. "fleet:standard"
print(estimate["vram_estimated_gb"]) # estimated VRAM required
for tier in estimate["tiers"]:
if tier["fits"]:
print(
tier["tier"],
f"{tier['estimated_minutes_min']:.0f}–{tier['estimated_minutes_max']:.0f} min",
f"${tier['estimated_cost_min']:.2f}–${tier['estimated_cost_max']:.2f}",
)
| Key | Type | Description |
|---|---|---|
vram_estimated_gb |
float |
Estimated VRAM required |
vram_confidence |
str |
exact (config.json found) or estimated |
recommended_tier |
str | None |
Most cost-effective tier for this job |
tiers |
list |
Per-tier breakdown (see below) |
Each entry in tiers:
| Key | Type | Description |
|---|---|---|
tier |
str |
Tier ID |
fits |
bool |
Whether the tier has enough VRAM |
estimated_minutes_min |
float | None |
Fastest GPU in tier |
estimated_minutes_max |
float | None |
Slowest GPU in tier |
estimated_cost_min |
float | None |
Lowest cost in tier (USD) |
estimated_cost_max |
float | None |
Highest cost in tier (USD) |
best_gpu_id |
str | None |
Most cost-effective GPU in tier |
recommended |
bool |
Whether this is the recommended tier |
model.train(dataset, hardware, hyperparameters)
See the Training page for full details.
job = model.train(dataset, hardware="fleet:standard")
model.evaluate(dataset, hardware)
Run a forward-pass evaluation on a held-out dataset. No weights are updated. Returns loss and perplexity.
job = model.evaluate("./held-out.jsonl")
job.monitor()
results = job.eval_results()
print(results["loss"]) # e.g. 1.23
print(results["perplexity"]) # e.g. 3.42
The dataset must be a .jsonl file in the same format as your training data. Fleet runs a forward pass over every row and computes cross-entropy loss — no gradient updates occur.
model.deploy(hardware, workers_min, workers_max)
endpoint = model.deploy(hardware="fleet:economy")
model.download()
Returns presigned download URLs for all files in the model. URLs expire after 1 hour.
files = model.download()
for f in files:
print(f["filename"], f["url"])
| Key | Type | Description |
|---|---|---|
filename |
str |
Relative filename |
url |
str |
Presigned download URL (1 hour TTL) |
size |
int |
File size in bytes |
model.infer(prompt, max_tokens, temperature)
Proxy inference through the model's active deployment.
response = model.infer("Summarise this text:")
Datasets
client.datasets.upload(path, name=None)
Upload a .jsonl file to Fleet. Returns immediately if the same file was already uploaded (content-hash deduplication).
dataset = client.datasets.upload("./train.jsonl")
dataset = client.datasets.upload("./train.jsonl", name="my-dataset")
client.datasets.get(dataset_id)
dataset = client.datasets.get("dataset_abc123")
client.datasets.list(page, limit)
result = client.datasets.list()
for d in result["datasets"]:
print(d["id"], d["name"])
Dataset object
| Attribute | Type | Description |
|---|---|---|
id |
str |
Dataset ID |
name |
str |
Display name |
size |
int | None |
File size in bytes |
created_at |
str | None |
ISO 8601 timestamp |
client.datasets.delete(dataset_id)
client.datasets.delete("dataset_abc123")
dataset.download()
Returns a presigned download URL for this dataset. URL expires after 1 hour.
result = dataset.download()
print(result["url"])
print(result["size"]) # bytes
Jobs
client.jobs.get(job_id)
Retrieve a job by ID. Use this to reattach to a running job.
job = client.jobs.get("job_abc123")
job.monitor()
client.jobs.list()
jobs = client.jobs.list()
for job in jobs:
print(job.id, job.status, job.hardware)
Job object
| Attribute | Type | Description |
|---|---|---|
id |
str |
Job ID |
status |
str |
queued, running, completed, failed, cancelled |
type |
str |
train, evaluate |
hardware_requested |
str |
Hardware requested (tier or auto) |
hardware_assigned |
str |
Hardware actually assigned |
hardware |
str |
Alias for hardware_assigned |
vram_estimated_gb |
float | None |
Estimated VRAM requirement |
vram_confidence |
str | None |
exact or estimated |
estimated_minutes |
float | None |
Point estimate of runtime (best GPU) |
estimated_cost_usd |
float | None |
Point estimate of cost (best GPU, USD) |
estimated_cost_min |
float | None |
Minimum cost across tier GPUs (USD) |
estimated_cost_max |
float | None |
Maximum cost across tier GPUs (USD) |
hardware_reason |
str | None |
Explanation of the hardware selection |
created_at |
str |
ISO 8601 timestamp |
job.monitor(poll_interval, verbose)
Block until the job finishes. Streams a live progress bar with loss and learning rate.
job.monitor() # default: poll every 10s
job.monitor(verbose=True) # also print all log lines
job.monitor(poll_interval=30) # poll every 30s
Raises RuntimeError if the job fails.
job.logs()
for line in job.logs():
print(line)
job.model()
Register and return the fine-tuned model produced by this job.
fine_tuned = job.model()
job.cancel()
job.cancel()
job.delete()
job.delete()
job.metrics()
Return the full training metrics series for this job.
data = job.metrics()
print(data["current_step"])
print(data["latest"]) # {'step': 100, 'loss': 2.34, 'lr': 1.38e-05, 'val_loss': None}
for point in data["metrics"]:
print(point["step"], point["loss"])
The metrics array is ordered by step and safe to feed directly into a chart. val_loss is non-null when validation has run at that step.
job.eval_results()
Return evaluation results for a completed eval job. Raises if called on a training job.
results = job.eval_results()
| Key | Type | Description |
|---|---|---|
loss |
float |
Cross-entropy loss on the eval dataset |
perplexity |
float |
exp(loss) — lower is better |
num_samples |
int |
Number of rows evaluated |
duration_seconds |
float |
Wall-clock time for the eval pass |
job.refresh()
Re-fetch the job's status from the API.
job.refresh()
print(job.status)
Deployments
client.deployments.get(deployment_id)
endpoint = client.deployments.get("dep_abc123")
client.deployments.list()
deployments = client.deployments.list()
for d in deployments:
print(d.id, d.status, d.hardware)
Deployment object
| Attribute | Type | Description |
|---|---|---|
id |
str |
Deployment ID |
status |
str |
active, deleted |
model_id |
str |
Model being served |
hardware |
str |
Hardware tier |
url |
str | None |
Inference endpoint URL |
created_at |
str |
ISO 8601 timestamp |
deployment.infer(prompt, max_tokens, temperature)
result = endpoint.infer("What is LoRA?")
result = endpoint.infer("Summarise:", max_tokens=512, temperature=0.5)
Blocks until the response is complete. Cold starts may take up to a minute.
deployment.delete()
endpoint.delete()
Account
client.billing()
Returns current balance and up to 3 recent transactions.
info = client.billing()
print(info["balance"])
client.transactions(page, limit)
result = client.transactions(page=1, limit=50)
for tx in result["transactions"]:
print(tx["type"], tx["amount"])
client.overview()
Returns a dashboard summary: balance, active jobs, recent activity.
summary = client.overview()
client.settings()
Return current account settings.
settings = client.settings()
print(settings["max_checkpoints"]) # 1
print(settings["prune_checkpoints_on_completion"]) # True
print(settings["auto_recharge_enabled"]) # False
print(settings["auto_recharge_status"]) # "no_card"
client.update_settings(...)
Update account settings. All parameters are optional; only those provided are changed. Returns the updated settings object.
client.update_settings(max_checkpoints=5)
client.update_settings(prune_checkpoints_on_completion=False)
client.update_settings(
auto_recharge_enabled=True,
auto_recharge_threshold=5.0,
auto_recharge_amount=25.0,
)
| Parameter | Type | Default | Description |
|---|---|---|---|
max_checkpoints |
int |
1 |
Maximum checkpoints kept per job |
prune_checkpoints_on_completion |
bool |
True |
Delete checkpoints when job completes |
auto_recharge_enabled |
bool |
False |
Enable automatic balance top-up |
auto_recharge_threshold |
float |
10.0 |
Balance (USD) that triggers recharge |
auto_recharge_amount |
float |
25.0 |
Amount (USD) to charge per recharge |
See the Billing page for details on auto-recharge and payment methods.
client.hardware()
Returns available hardware tiers and their pricing.
tiers = client.hardware()
