0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

画像も動画も1つのAPIで:GPT Image 2 / Nano Banana / Seedream / Seedance / 可灵をワークフローで使い分けて激安に回す

0
Posted at

画像生成は GPT Image 2、ラフ出しは Nano Banana、物撮りっぽいのは Seedream、動画は Seedance 2.0 か可灵(Kling)——用途ごとにベストなモデルが違うのは、実際に作っている人ほど痛いほど分かっていると思います。

問題は、そのたびにプロバイダごとの SDK・認証・課金・レスポンス形式がバラバラで、key 管理だけで消耗することです。

この記事では、1 つの API・1 つの key で上記 5 系統のモデルを叩き、ワークフローの中で自由に組み合わせるやり方をまとめます。エンドポイントもレスポンス形式も統一されているので、モデルを変えても model の文字列を差し替えるだけです。

結論(先に全体像)

  • エンドポイントは画像系も動画系も共通POST /v1/images/generationsPOST /v1/videos/generations
  • 認証は Bearer token 1 本。モデルを変えても変わらない
  • すべて非同期:返ってきた task_idGET /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"
}
  • statuspendingprocessingcompleted(または 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"
  }'

modelprompt だけ必須。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"
  }'

quality0.5K / 1K / 2K(既定)/ 4Kimage_urls で image-to-image / 編集も可能(最大14枚、実写人物は最大4枚)。model_params.thinking_levelauto/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"
  }'

必須は modelprompt のみ。軽量・安価に回したいときは 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
  }'

必須は modelpromptduration は 4〜15 秒、generate_audio 既定 truefalse で無音)。画像から動画にしたいときは 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 に変えたければ modelseedance-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}statusfailed のときに error を見る、という共通ハンドリングで十分です。

まとめ

  • GPT Image 2 / Nano Banana / Seedream / Seedance / 可灵を、同じエンドポイント・同じ key・同じポーリングで叩ける
  • だから「モデル切り替え = 文字列1個」。ワークフローを1本のスクリプトで組める
  • 安いモデルで探索 → 採用分だけ高品質/動画化、でコストを段階的に最小化できる

詳細なパラメータは各モデルの公式ドキュメントを参照してください:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?