For the complete documentation index, see llms.txt. This page is also available as Markdown.
CLI- & SDK-Leitfaden
Übersicht
Clore.ai bietet eine REST-API die den vollständigen programmgesteuerten Zugriff auf den GPU-Marktplatz ermöglicht — Server auflisten, Bestellungen erstellen, Bereitstellungen überwachen und Mieten kündigen.
Hinweis: Derzeit gibt es kein offizielles CLI-Binary. Die gesamte Automatisierung erfolgt direkt über die REST-API mit Tools wie curl, Python oder Node.js.
Basis-URL:https://api.clore.ai/v1
Antwortformat: JSON. Jede Antwort enthält ein code Feld, das den Status angibt.
Navigieren Sie zu API Abschnitt in den Einstellungen
Erstellen und kopieren Sie Ihren API-Schlüssel
Header-Format:
auth: YOUR_API_KEY
⚠️ Wichtig: Der auth-Header lautet auth, nichtAuthorization: Bearer. Bei Verwendung des falschen Formats wird der Code zurückgegeben 3 (Ungültiges API-Token).
Spot-Bestellungen sind günstiger, können aber überboten werden. Sie legen Ihren Preis pro Tag fest:
Bestellstatus prüfen
Aktive Bestellungen enthalten pub_cluster (Hostnamen) und tcp_ports für SSH-Zugriff:
Per SSH auf Ihren gemieteten Server zugreifen:
Eine Bestellung stornieren
Optional ein Problem mit dem Server melden:
Python-SDK
Ein leichtgewichtiger Wrapper, der die requests Bibliothek verwendet. Installieren Sie ihn mit:
CloreClient-Klasse
Vollständiges funktionierendes Beispiel
Node.js-Beispiel
Mit der nativen fetch API (Node.js 18+):
Häufige Arbeitsabläufe
Die günstigste RTX 4090 finden und mieten
Meine Aufträge überwachen
Automatisch mieten, wenn der Preis unter X fällt
WebSocket
Die Clore.ai REST-API stellt derzeit keinen WebSocket-Endpunkt bereit. Für die Echtzeitüberwachung verwende Polling mit einem vernünftigen Intervall (siehe Rate-Limits unten).
Rate-Limits
Endpunkt
Limit
Die meisten Endpunkte
1 Anfrage/Sekunde
create_order
1 Anfrage/5 Sekunden
set_spot_price (Preisreduzierung)
Einmal pro 600 Sekunden
Antwort bei Rate-Limit (Code 5):
Bewährte Praktiken:
Füge time.sleep(1) zwischen aufeinanderfolgenden API-Aufrufen hinzu
Für create_order, warte mindestens 5 Sekunden zwischen Anfragen
Verwende für Überwachungsschleifen Polling-Intervalle von 60+ Sekunden
Cache die Marktplatzdaten lokal, wenn du sie häufig abfragen musst
Python-Hilfsfunktion:
Fehlerbehandlung
Jede API-Antwort enthält ein code Feld. Ein Wert von 0 bedeutet Erfolg.
Fehlercodes
Code
Bedeutung
Aktion
0
Erfolg
—
1
Datenbankfehler
Nach einer Verzögerung erneut versuchen
2
Ungültige Eingabedaten
Prüfe deinen Request-Body/deine Parameter
3
Ungültiges API-Token
Überprüfe deinen API-Schlüssel im Dashboard
4
Ungültiger Endpunkt
Prüfe die Endpunkt-URL
5
Rate-Limit überschritten (1 Anfrage/Sek.)
Füge Verzögerungen zwischen Anfragen hinzu
6
Anwendungsfehler (siehe Fehler Feld)
Lies das Fehler Feld für Details
Unterfehler von Code 6
Fehler Wert
Bedeutung
exceeded_max_step
Die Spot-Preisreduzierung ist zu groß; prüfe max_step Feld
can_lower_every_600_seconds
Du musst warten, bevor du den Spot-Preis erneut senkst; prüfe time_to_lowering
Python-Beispiel zur Fehlerbehandlung
JavaScript-Beispiel zur Fehlerbehandlung
Verfügbare Docker-Images
Clore.ai bietet vorgefertigte Images, optimiert für GPU-Workloads:
Image
Beschreibung
cloreai/ubuntu20.04-jupyter
Ubuntu 20.04 + JupyterLab
cloreai/ubuntu22.04-jupyter
Ubuntu 22.04 + JupyterLab
Du kannst auch jedes öffentliche Docker-Hub-Image verwenden. Für GPU-Zugriff verwende CUDA-fähige Images, z. B.:
Portweiterleitung
Beim Erstellen eines Auftrags gib die freizugebenden Ports an:
"tcp" — Direkte TCP-Portweiterleitung (für SSH, benutzerdefinierte Server)
"http" — HTTPS-Proxy (für Jupyter, Web-UIs). Pro http_port Feld ist nur ein HTTP-Port erlaubt.
Nach der Auftragserstellung erscheinen die Verbindungsdetails in my_orders:
Verbinde dich via SSH:
Greife per Browser auf Jupyter zu: https://n1.c1.clorecloud.net verwendet das http_port)
from clore_client import CloreClient
client = CloreClient(api_key="YOUR_API_KEY")
def rent_cheapest_rtx4090(image="cloreai/ubuntu20.04-jupyter", ssh_password="SecurePass123"):
servers = client.list_servers()
# Filter: verfügbare RTX 4090
candidates = [
s for s in servers
if "4090" in s["specs"].get("gpu", "")
and not s["rented"]
]
if not candidates:
raise RuntimeError("Keine verfügbaren RTX-4090-Server gefunden")
# Nach On-Demand-BTC-Preis sortieren
candidates.sort(key=lambda s: s["price"]["on_demand"]["bitcoin"] )
best = candidates[0]
price_btc = best["price"]["on_demand"]["bitcoin"]
print(f"Miete Server {best['id']}: {best['specs']['gpu']} @ {price_btc:.8f} BTC/Tag")
client.create_order(
server_id=best["id"],
image=image,
order_type="on-demand",
currency="bitcoin",
ports={"22": "tcp"},
ssh_password=ssh_password,
)
print("Fertig! Prüfe deine Aufträge auf SSH-Verbindungsdetails.")
return best["id"]
rent_cheapest_rtx4090()
import time
from clore_client import CloreClient
client = CloreClient(api_key="YOUR_API_KEY")
def monitor_orders(poll_interval_seconds=60):
"""Aufträge abfragen und Statusaktualisierungen ausgeben."""
print(f"Überwache Aufträge (Abfrage alle {poll_interval_seconds}s). Mit Strg+C beenden.\n")
while True:
orders = client.get_orders(include_completed=False)
active = [o for o in orders if not o.get("expired")]
print(f"--- {len(active)} aktive(r) Auftrag/Aufträge ---")
for order in active:
cluster = order.get("pub_cluster", [])
tcp = order.get("tcp_ports", [])
spend = order.get("spend", 0)
ssh_info = ""
if cluster and tcp:
port = tcp[0].split(":")[1]
ssh_info = f" | SSH: {cluster[0]}:{port}"
print(f" Auftrag {order['id']}: Server {order['si']}"
f" | ausgegeben {spend:.8f} BTC{ssh_info}")
if not active:
print(" Keine aktiven Aufträge.")
print()
time.sleep(poll_interval_seconds)
monitor_orders()
import time
from clore_client import CloreClient
client = CloreClient(api_key="YOUR_API_KEY")
def auto_rent_on_price_drop(
gpu_model: str = "RTX 4090",
max_price_btc: float = 0.00015,
image: str = "cloreai/ubuntu20.04-jupyter",
ssh_password: str = "SecurePass123",
check_interval_seconds: int = 120,
):
"""
Beobachte den Marktplatz und miete automatisch eine GPU, wenn der Preis unter den Schwellenwert fällt.
Argumente:
gpu_model: Name der zu suchenden GPU (Groß-/Kleinschreibung wird nicht beachtet)
max_price_btc: Maximal akzeptabler Preis pro Tag in BTC
image: Bereitzustellendes Docker-Image
ssh_password: SSH-Passwort für den Container
check_interval_seconds: Wie oft geprüft wird (Rate-Limits beachten!)
"""
print(f"Suche nach {gpu_model} für ≤ {max_price_btc:.8f} BTC/Tag...")
while True:
servers = client.list_servers()
for server in servers:
gpu = server["specs"].get("gpu", "")
if gpu_model.lower() not in gpu.lower():
continue
if server["rented"]:
continue
price = server["price"]["on_demand"]["bitcoin"]
if price <= max_price_btc:
print(f"🎯 Treffer gefunden! Server {server['id']}: {gpu} @ {price:.8f} BTC/Tag")
try:
client.create_order(
server_id=server["id"],
image=image,
order_type="on-demand",
currency="bitcoin",
ports={"22": "tcp"},
ssh_password=ssh_password,
required_price=price, # Preis hier festschreiben
)
print(f"✅ Auftrag für Server {server['id']} erstellt!")
return server["id"]
except Exception as e:
print(f"Auftrag konnte nicht erstellt werden: {e}. Neuer Versuch...")
print(f"Noch kein Treffer. Erneute Prüfung in {check_interval_seconds}s...")
time.sleep(check_interval_seconds)
auto_rent_on_price_drop(gpu_model="4090", max_price_btc=0.00012)
{ "code": 5 }
import time
def safe_api_call(fn, *args, delay=1.1, **kwargs):
"""Umhülle einen API-Aufruf mit Rate-Limit-Sicherheit."""
result = fn(*args, **kwargs)
time.sleep(delay)
return result