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 chiamandoCome
Modelli linguisticiPunta l'SDK OpenAI, Anthropic o Google verso Atlas Cloud
Immagini, video, audio, 3DHTTP puro sugli endpoint asincroni — client qui sotto
Da un terminale o dalla CILa CLI
Da un IDE assistito dall'AIIl Server MCP

Modelli linguistici

Cambia l'URL di base e la chiave API. Tutto il resto resta uguale.

pip install openai
import 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:

  1. I parametri vanno al primo livello, accanto a model — non racchiusi in un oggetto input.
  2. 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, 504 con backoff esponenziale. Non riprovare su 400, 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-ID di 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

On this page