SDK e librerie client
Usa l'SDK OpenAI, Anthropic o Google con Atlas Cloud, più client pronti da copiare per la generazione di immagini, video e audio in Python e Node.js.
Atlas Cloud non distribuisce un SDK proprio e, per i modelli linguistici, non ti serve — l'API parla i formati che gli SDK esistenti già usano. Per la generazione di media, questa pagina contiene un piccolo client che puoi copiare nel tuo progetto.
| Cosa stai chiamando | Come |
|---|---|
| Modelli linguistici | Punta l'SDK OpenAI, Anthropic o Google verso Atlas Cloud |
| Immagini, video, audio, 3D | HTTP puro sugli endpoint asincroni — client qui sotto |
| Da un terminale o dalla CI | La CLI |
| Da un IDE assistito dall'AI | Il Server MCP |
Modelli linguistici
Cambia l'URL di base e la chiave API. Tutto il resto resta uguale.
pip install openaiimport os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["ATLASCLOUD_API_KEY"],
base_url="https://api.atlascloud.ai/v1",
)
response = client.chat.completions.create(
model="deepseek-ai/deepseek-v3.2",
messages=[{"role": "user", "content": "Explain HTTP vs HTTPS"}],
)
print(response.choices[0].message.content)I modelli differiscono per il protocollo che accettano — alcuni funzionano solo con Messages, altri solo con Responses. Controlla il riferimento API del modello prima di dare per scontato che Chat Completions funzioni. Vedi Protocolli API LLM.
Client per la generazione di media
La generazione di immagini, video, audio e 3D è asincrona: prima invii, poi fai polling. Ecco un client minimale completo.
import os
import time
import requests
API_KEY = os.environ["ATLASCLOUD_API_KEY"]
BASE = "https://api.atlascloud.ai/api/v1"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
# L'endpoint è scelto in base al tipo di output: il 3D usa image; voce, musica e trascrizione usano tutti audio
ENDPOINTS = {
"image": f"{BASE}/model/generateImage",
"video": f"{BASE}/model/generateVideo",
"audio": f"{BASE}/model/generateAudio",
}
TERMINAL = {"completed", "succeeded", "failed", "timeout"}
def submit(kind: str, model: str, **params) -> str:
"""Invia un'attività e restituisce il suo ID di predizione. I parametri vanno al primo livello, non dentro un oggetto `input`."""
response = requests.post(
ENDPOINTS[kind],
headers=HEADERS,
json={"model": model, **params},
timeout=60,
)
response.raise_for_status()
return response.json()["data"]["id"]
def wait(prediction_id: str, timeout: int = 600) -> dict:
"""Fa polling finché l'attività non raggiunge uno stato terminale, applicando un backoff progressivo."""
deadline = time.time() + timeout
delay = 2.0
while time.time() < deadline:
response = requests.get(
f"{BASE}/model/prediction/{prediction_id}",
headers=HEADERS,
timeout=30,
)
response.raise_for_status()
data = response.json()["data"]
if data.get("status") in TERMINAL:
if data["status"] in ("failed", "timeout"):
raise RuntimeError(f"Generation failed: {data.get('error') or data['status']}")
return data
time.sleep(delay)
delay = min(delay * 1.5, 10.0)
raise TimeoutError(f"Job {prediction_id} did not finish within {timeout}s")
def upload(path: str) -> str:
"""Carica un file locale e restituisce un URL utilizzabile in una richiesta di generazione."""
with open(path, "rb") as f:
response = requests.post(
f"{BASE}/model/uploadMedia", headers=HEADERS, files={"file": f}, timeout=600
)
response.raise_for_status()
data = response.json()["data"]
return data.get("download_url") or data.get("url")
if __name__ == "__main__":
pid = submit("image", "MODEL_ID", prompt="a ceramic mug on a linen backdrop")
result = wait(pid)
print(result["outputs"][0])Due cose che questo client fa nel modo giusto e che è facile sbagliare:
- I parametri vanno al primo livello, accanto a
model— non racchiusi in un oggettoinput. - Per i modelli di trascrizione e di testi delle canzoni,
outputs[0]è testo, non un URL. Non scaricarlo ciecamente. Vedi Modelli audio.
Note per la produzione
- Preferisci i webhook al polling per i video, che possono richiedere minuti. Vedi Webhook.
- Riprova su
429,500,503,504con backoff esponenziale. Non riprovare su400,401,402,403. Vedi Errori e limiti di frequenza. - Fai attenzione a riprovare gli invii. Un invio andato in timeout potrebbe comunque essere stato accettato, e un retry alla cieca crea una seconda attività fatturabile. Meglio inviare in modo asincrono e fare polling.
- Registra nei log
X-Request-IDdi ogni risposta — è ciò che serve al supporto per rintracciare una chiamata.
Librerie della community
I wrapper mantenuti dalla community sono elencati in awesome-atlas-cloud-integrations. Sono mantenuti in modo indipendente — verifica cosa fa un wrapper prima di usarlo in produzione.
Argomenti correlati
Last updated on