画像生成は GPT Image 2、ラフ出しは Nano Banana、物撮りっぽいのは Seedream、動画は Seedance 2.0 か可灵(Kling)——用途ごとにベストなモデルが違うのは、実際に作っている人ほど痛いほど分かっていると思います。
問題は、そのたびにプロバイダごとの SDK・認証・課金・レスポンス形式がバラバラで、key 管理だけで消耗することです。
この記事では、1 つの API・1 つの key で上記 5 系統のモデルを叩き、ワークフローの中で自由に組み合わせるやり方をまとめます。エンドポイントもレスポンス形式も統一されているので、モデルを変えても model の文字列を差し替えるだけです。
結論(先に全体像)
- エンドポイントは画像系も動画系も共通:
POST /v1/images/generationsとPOST /v1/videos/generations - 認証は Bearer token 1 本。モデルを変えても変わらない
- すべて非同期:返ってきた
task_idをGET /v1/tasks/{task_id}でポーリングし、results配列から出力 URL を取る - 課金は従量(credits)。レスポンスの
credits_reservedで予約され、安いモデルでラフ→良いものだけ高品質モデル、という使い分けでコストを最小化できる - だから「モデルを切り替える」=「文字列を1個変える」だけ。ワークフロー全体を1本のスクリプトで回せる
順番に行きます。
共通の叩き方(ここだけ押さえれば全部同じ)
ベースURL と認証
Base URL: https://api.evolink.ai
Header: Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
key はダッシュボード(https://evolink.ai/dashboard/keys)で発行します。以降のすべてのリクエストでこの 1 本を使い回します。
非同期 → ポーリングの流れ
画像も動画も「投げたら task_id が返る → 完了するまで状態を見に行く」という同じ流れです。
# 1) タスクを投げる(例は後述の各モデル)
# → レスポンスの "id" が task_id
# 2) task_id で結果を取りに行く
curl https://api.evolink.ai/v1/tasks/task-unified-1757165031-uyujaw3d \
-H "Authorization: Bearer YOUR_API_KEY"
完了時のレスポンス(共通形式):
{
"id": "task-unified-1757165031-uyujaw3d",
"status": "completed",
"progress": 100,
"results": [
"https://.../output.png"
],
"error": null,
"type": "image"
}
-
statusはpending→processing→completed(またはfailed) - 出力 URL は
results配列に入る - ⚠️ 生成された画像・動画の URL は 24時間で失効します。すぐに保存してください
ここまでが共通。あとは model と一部パラメータを変えるだけです。
画像モデル:POST /v1/images/generations
3 つとも同じエンドポイント。model を変えるだけです。
GPT Image 2 — 指示理解が強い「仕上げ用」
curl -X POST https://api.evolink.ai/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-image-2",
"prompt": "A beautiful colorful sunset over the ocean"
}'
model と prompt だけ必須。size(既定 auto)、resolution(既定 1K)、quality(既定 medium)、n、画像編集用の image_urls(1〜16枚)、mask_url は任意です。
Nano Banana 2(Gemini 3.1 Flash Image)— 速くて安い「ラフ出し用」
curl -X POST https://api.evolink.ai/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.1-flash-image-preview",
"prompt": "A cat playing on the grass"
}'
quality は 0.5K / 1K / 2K(既定)/ 4K。image_urls で image-to-image / 編集も可能(最大14枚、実写人物は最大4枚)。model_params.thinking_level(auto/min/high)で速度と品質のバランスを調整できます。
Seedream 4.0 — 物撮り・デザイン寄りの「バリエーション用」
curl -X POST https://api.evolink.ai/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "doubao-seedream-4.0",
"prompt": "A serene lake reflecting the beautiful sunset scenery",
"size": "16:9",
"quality": "2K"
}'
必須は model と prompt のみ。軽量・安価に回したいときは doubao-seedream-5.0-lite に差し替えるだけで同じインターフェースで使えます。
補足:本記事の Seedream は実在するモデルID
doubao-seedream-4.0を採用しています。社内で別バージョン表記を使っている場合はmodelの文字列だけ差し替えてください。
動画モデル:POST /v1/videos/generations
こちらも同じエンドポイント、同じ task_id ポーリング。
Seedance 2.0 — テキスト/画像から動画、音声つき
curl -X POST https://api.evolink.ai/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.0-text-to-video",
"prompt": "城市日落延时摄影,金色光线洒满天际线",
"duration": 8,
"quality": "720p",
"aspect_ratio": "16:9",
"generate_audio": true
}'
必須は model と prompt。duration は 4〜15 秒、generate_audio 既定 true(false で無音)。画像から動画にしたいときは seedance-2.0-image-to-video にして image_urls(1〜2枚)を渡します。安く回すなら fast- 系の variant もあります。
可灵(Kling V3)— 構図・モーション品質が高い動画
text-to-video:
curl -X POST https://api.evolink.ai/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "kling-v3-text-to-video",
"prompt": "A cat running on a grass field under bright sunshine",
"duration": 5,
"aspect_ratio": "16:9",
"quality": "720p"
}'
画像から動画(image-to-video)は image_start に先頭フレーム画像の URL を渡します:
curl -X POST https://api.evolink.ai/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "kling-v3-image-to-video",
"prompt": "The person slowly turns their head and smiles",
"image_start": "https://example.com/portrait.jpg",
"duration": 5,
"quality": "720p"
}'
本題:1本のスクリプトで使い分ける
ここまでで気づいた通り、呼び出し方が全モデルで同じです。なので「どのモデルでも投げて待つ」共通関数を1つ作れば、あとはモデル名を変えるだけでワークフローが組めます。
import os, time, requests
BASE = "https://api.evolink.ai"
HEADERS = {
"Authorization": f"Bearer {os.environ['EVOLINK_API_KEY']}",
"Content-Type": "application/json",
}
def generate(kind: str, body: dict) -> list[str]:
"""kind: 'images' or 'videos'. 完了までポーリングして results を返す。"""
r = requests.post(f"{BASE}/v1/{kind}/generations", json=body, headers=HEADERS)
r.raise_for_status()
task_id = r.json()["id"]
while True:
t = requests.get(f"{BASE}/v1/tasks/{task_id}", headers=HEADERS).json()
if t["status"] == "completed":
return t["results"]
if t["status"] == "failed":
raise RuntimeError(t["error"])
time.sleep(3)
これだけで、安いモデルで数を出して、良かったものだけ高品質モデルや動画に回す——というコスト最適なパイプラインがそのまま書けます。
# 1) ラフを安く大量に出す(Nano Banana)
roughs = generate("images", {
"model": "gemini-3.1-flash-image-preview",
"prompt": "minimalist product poster, eco water bottle, studio light",
"quality": "1K",
"n": 4,
})
# 2) 採用カットだけ指示理解の強い GPT Image 2 で仕上げ
final = generate("images", {
"model": "gpt-image-2",
"prompt": "the same poster, refined typography, premium look",
"image_urls": [roughs[0]], # ラフを参照画像に
"quality": "high",
})
# 3) その静止画を可灵で動画化
clip = generate("videos", {
"model": "kling-v3-image-to-video",
"prompt": "camera slowly pushes in, subtle light flicker",
"image_start": final[0],
"duration": 5,
})
print(clip[0]) # 完成動画の URL(24時間で失効するので保存)
ポイントは、ステップ間でプロバイダを跨いでいるのに、コードの構造は何も変わらないこと。generate() を呼ぶだけで Nano Banana → GPT Image 2 → 可灵がシームレスに繋がります。Seedance に変えたければ model を seedance-2.0-image-to-video にするだけです。
なぜこれが「激安」になるのか
課金は従量制で、レスポンスの usage.credits_reserved に予約クレジットが出ます(画像は per_call、動画は per_second など)。つまり:
-
探索フェーズは安いモデル(Nano Banana の低
quality、Seedance のfast-variant)で数を稼ぐ - 採用したものだけ高いモデル/高解像度に上げる
- どのモデルが何クレジットかはレスポンスで毎回見えるので、ワークフロー単位でコストが読める
「全部いきなり最高品質で回す」のをやめて、安い→絞る→上げるの段階設計にできるのが、マルチモデルを1つの API に寄せる最大のメリットです。
エラーまわり(最小限)
レスポンスはモデル共通で、失敗時は error.code / error.message / error.type が返ります。
| code | 意味 | よくある原因 |
|---|---|---|
| 400 | invalid_request | パラメータ不正・必須欠落 |
| 401 | unauthorized | key 間違い |
| 402 | insufficient_quota | 残高不足 |
| 403 | model_access_denied | そのモデルの権限なし |
| 429 | rate_limit_exceeded | レート上限 |
task_id を取れた後は GET /v1/tasks/{task_id} の status が failed のときに error を見る、という共通ハンドリングで十分です。
まとめ
- GPT Image 2 / Nano Banana / Seedream / Seedance / 可灵を、同じエンドポイント・同じ key・同じポーリングで叩ける
- だから「モデル切り替え = 文字列1個」。ワークフローを1本のスクリプトで組める
- 安いモデルで探索 → 採用分だけ高品質/動画化、でコストを段階的に最小化できる
詳細なパラメータは各モデルの公式ドキュメントを参照してください: