SDK とクライアントライブラリ

OpenAI、Anthropic、Google の SDK を Atlas Cloud に向けて使う方法と、画像・動画・音声生成向けにコピーしてそのまま使える Python / Node.js クライアント。

Atlas Cloud は独自の SDK を提供していません。言語モデルであれば、そもそも必要ありません — API は既存の SDK がすでに使っている形式をそのまま話します。メディア生成については、プロジェクトにコピーして使える小さなクライアントをこのページに用意しました。

呼び出す対象方法
言語モデルOpenAI、Anthropic、Google の SDK を Atlas Cloud に向ける
画像・動画・音声・3D非同期エンドポイントへのプレーンな HTTP — クライアントは下記
ターミナルや CI からCLI
AI 支援の IDE からMCP サーバー

言語モデル

ベース URL と API キーを変えるだけです。それ以外はそのままで動きます。

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)

モデルによって受け付けるプロトコルは異なります — Messages にしか対応しないものもあれば、Responses にしか対応しないものもあります。Chat Completions が使えると決めつけず、事前にモデルの API リファレンスを確認してください。LLM API プロトコル をご覧ください。

メディア生成クライアント

画像・動画・音声・3D の生成は非同期です。ジョブを送信してからポーリングします。以下は必要十分な最小構成のクライアントです。

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}"}

# エンドポイントは出力の種類で決まる: 3D は image、音声合成・音楽・文字起こしはすべて 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:
    """ジョブを送信して prediction ID を返す。パラメータはトップレベルに置き、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:
    """終了状態になるまでポーリングする。間隔は徐々に広げる。"""
    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"生成に失敗しました: {data.get('error') or data['status']}")
            return data

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

    raise TimeoutError(f"ジョブ {prediction_id} は {timeout} 秒以内に完了しませんでした")


def upload(path: str) -> str:
    """ローカルファイルをアップロードし、生成リクエストで使える URL を返す。"""
    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])

このクライアントが正しく押さえている、間違えやすい 2 点:

  1. パラメータはトップレベル、model と同じ階層に置きます — input オブジェクトで包まないでください。
  2. 文字起こしモデルと歌詞モデルでは、outputs[0] は URL ではなくテキストです。 何も考えずにダウンロードしないでください。音声モデル をご覧ください。

本番運用のポイント

  • 動画にはポーリングより Webhook を。動画は数分かかることがあります。Webhook をご覧ください。
  • 429、500、503、504 は指数バックオフでリトライしてください。400、401、402、403 はリトライしないでください。エラーとレート制限 をご覧ください。
  • 送信のリトライには注意してください。 送信がタイムアウトしても、サーバー側では受理されている可能性があり、闇雲にリトライすると課金対象のジョブがもう 1 件増えます。非同期で送信してポーリングする方式にしてください。
  • すべてのレスポンスの X-Request-ID をログに残してください — サポートが呼び出しを追跡するために必要な値です。

コミュニティ製ライブラリ

コミュニティが管理するラッパーは awesome-atlas-cloud-integrations にまとめられています。これらは独立して管理されているため、本番環境で使う前にラッパーの実際の挙動を確認してください。

関連ドキュメント

Last updated on

On this page