SDK y bibliotecas cliente

Usa el SDK de OpenAI, Anthropic o Google contra Atlas Cloud, además de clientes listos para copiar y pegar para generación de imagen, video y audio en Python y Node.js.

Atlas Cloud no distribuye su propio SDK y, para los modelos de lenguaje, no necesitas ninguno — la API habla los formatos que los SDK existentes ya usan. Para la generación de medios, esta página incluye un cliente pequeño que puedes copiar en tu proyecto.

Qué estás llamandoCómo
Modelos de lenguajeApunta el SDK de OpenAI, Anthropic o Google a Atlas Cloud
Imagen, video, audio, 3DHTTP directo contra los endpoints asíncronos — cliente más abajo
Desde una terminal o CILa CLI
Desde un IDE asistido por IAEl servidor MCP

Modelos de lenguaje

Cambia la base URL y la clave de API. Todo lo demás se queda igual.

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)

Los modelos difieren en el protocolo que aceptan — algunos solo funcionan con Messages y otros solo con Responses. Consulta la referencia de API del modelo antes de dar por hecho que Chat Completions funciona. Consulta Protocolos de API para LLM.

Cliente de generación de medios

La generación de imagen, video, audio y 3D es asíncrona: se envía y luego se consulta el estado. Aquí tienes un cliente mínimo 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}"}

# El endpoint lo decide el tipo de salida: el 3D va por image; voz, música y transcripción van por 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:
    """Envía una tarea de generación y devuelve el ID de la predicción. Los parámetros van planos en el nivel superior, no dentro de 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:
    """Consulta el estado hasta que la tarea llegue a un estado final. El intervalo crece poco a poco para evitar llamadas innecesarias."""
    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"La generación falló: {data.get('error') or data['status']}")
            return data

        time.sleep(delay)
        delay = min(delay * 1.5, 10.0)

    raise TimeoutError(f"La tarea {prediction_id} no terminó en {timeout} segundos")


def upload(path: str) -> str:
    """Sube un archivo local y lo convierte en una URL utilizable en las solicitudes de generación."""
    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])

Dos cosas que este cliente hace bien y que es fácil equivocar:

  1. Los parámetros van en el nivel superior, junto a model — no envueltos en un objeto input.
  2. En los modelos de transcripción y de letras, outputs[0] es texto, no una URL. No lo descargues a ciegas. Consulta Modelos de audio.

Notas para producción

  • Prefiere webhooks al polling en video, que puede tardar minutos. Consulta Webhooks.
  • Reintenta en 429, 500, 503, 504 con backoff exponencial. No reintentes 400, 401, 402, 403. Consulta Errores y límites de tasa.
  • Ten cuidado al reintentar envíos. Un envío que agotó el tiempo de espera puede haberse aceptado igualmente, y un reintento a ciegas crea una segunda tarea facturable. Es preferible enviar de forma asíncrona y consultar el estado.
  • Registra X-Request-ID de cada respuesta — es lo que soporte necesita para rastrear una llamada.

Bibliotecas de la comunidad

Los wrappers mantenidos por la comunidad están listados en awesome-atlas-cloud-integrations. Se mantienen de forma independiente — comprueba qué hace un wrapper antes de usarlo en producción.

Relacionado

Last updated on

On this page