Python で使う GPT Image 2 API:完全なサンプルコード
Python で GPT Image 2 API を使う完全なサンプル。リクエストの送信、タスクのポーリング、画像のダウンロード、参照画像での編集、エラーの安全な処理まで。
Markdown で読むPython から GPT Image 2 API を使うには、requests ライブラリでリクエストを https://api.seedrouter.ai/v1/images/generations に POST し、返されたタスクの id を保持して、タスクが completed になるまで /v1/tasks/{id} をポーリングし、そこに含まれる画像 URL をダウンロードします。以下のスクリプトは、この 4 ステップを約 40 行で実行し、画像をディスクに保存します。
SEEDROUTER_API_KEY を設定すれば、そのまま動きます。まだキーがない場合は、先にキーを取得してください。
GPT Image 2 の完全なスクリプトはどうなりますか?
import os
import time
import requests
API = "https://api.seedrouter.ai/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['SEEDROUTER_API_KEY']}"}
def submit(body):
response = requests.post(f"{API}/images/generations", headers=HEADERS, json=body, timeout=60)
if response.status_code >= 400:
error = response.json()["error"]
raise RuntimeError(f"{response.status_code} {error['code']}: {error['message']}")
return response.json()["id"]
def wait(task_id, limit_seconds=600):
deadline = time.monotonic() + limit_seconds
while time.monotonic() < deadline:
task = requests.get(f"{API}/tasks/{task_id}", headers=HEADERS, timeout=30).json()
if task["status"] == "completed":
return [image["url"] for image in task["output"]["data"]]
if task["status"] == "failed":
raise RuntimeError(f"{task['error']['code']}: {task['error']['message']}")
time.sleep(3)
raise TimeoutError(f"Still running. Resume polling task {task_id}.")
def download(urls, prefix):
paths = []
for index, url in enumerate(urls):
path = f"{prefix}-{index}.png"
with open(path, "wb") as file:
file.write(requests.get(url, timeout=60).content)
paths.append(path)
return paths
task_id = submit({
"model": "gpt-image-2",
"prompt": "A matte ceramic vase on a sunlit table, soft shadows",
"size": "1024x1024",
"quality": "low",
"n": 2,
})
print("task", task_id)
print(download(wait(task_id), "vase"))python example.py で実行します。まずタスク ID が表示され、続いて 2 つの PNG ファイル vase-0.png と vase-1.png のパスが表示されます。
各関数は何をしていますか?
submit はリクエストを送信し、タスク ID を返します。エラーレスポンスには必ず数値の code と message を持つ error オブジェクトが含まれるため、例外を見れば何を直せばよいかが分かります。たとえばコード 20001、メッセージ “Check the size parameter against the API documentation.” の 400 は、サイズがパラメータガイドのルールのいずれかに違反していることを意味します。
wait はタスクが終わるまで 3 秒ごとにポーリングします。こちら側の期限で止まるのはループであり、タスクではありません。生成は続いており、同じ ID で後からポーリングを再開できます。failed で終わったタスクはエラーコード付きで例外を送出し、課金されません。
download はタスクが返したすべての URL を取得し、ディスクに書き込みます。結果の URL は受け渡し用であり、恒久的な保存場所ではないため、残したいものは保存してください。このサンプルでは API 呼び出しだけでなくダウンロードにも requests を使っています。標準ライブラリの urllib を混ぜず、HTTP クライアントは 1 つに統一してください。
画像の設定はどう変更しますか?
すべてリクエストボディで指定します。多くの人が最初に変更するフィールドは次のとおりです:
| フィールド | 例 | 効果 |
|---|---|---|
size | "1536x1024" | 出力サイズ。auto ならモデルが選ぶ |
quality | "medium" | low、medium、high、auto |
n | 4 | 画像の枚数、1〜10 |
output_format | "jpeg" | png または jpeg |
background | "transparent" | png が必要 |
output_format を変更した場合は、download の .png 拡張子も合わせて変更してください。フィールドと制限の一覧は GPT Image 2 API リファレンスにあります。
Python から画像を編集するには?
同じ呼び出しで参照画像を URL として渡します。編集専用のエンドポイントはありません。images を加えるとリクエストが編集になり、mask を指定すると変更を 1 つの領域に限定できます:
task_id = submit({
"model": "gpt-image-2",
"prompt": "Make the vase deep blue. Keep the table and the light unchanged.",
"images": [{"image_url": "https://example.com/vase.png"}],
})URL は PNG・JPEG・WebP ファイルへの公開 HTTPS リンクである必要があり、最大 16 個まで送信できます。ローカルファイルや base64 文字列は拒否されるため、先にご自身のストレージに画像をアップロードし、その URL を渡してください。
送信がタイムアウトしたらスクリプトはどうすべきですか?
すぐに再送信しないでください。POST がタイムアウトしても、リクエストが拒否されたとは限りません。タスクはすでに実行中で、課金されている可能性があります。最近のタスクを確認するか、タスクが作成されていないことを確かめてから再試行してください。両者の見分け方はタスクガイドで説明しています。
ポーリングは事情が異なり、ポーリング中のタイムアウトは無害です。同じ ID で再び wait を呼び出してください。
よくある質問
代わりに OpenAI の Python SDK を使えますか?
そのままでは使えません。この API はタスク ID を通じて非同期に結果を返しますが、SDK の画像呼び出しはレスポンスに完成画像が含まれることを前提としています。上記のように requests を数行書けば、全体の流れをカバーできます。
複数のプロンプトを実行するには?
プロンプトごとに送信してすべてのタスク ID を保存し、それからポーリングします。バッチ生成ガイドでは、再起動しても二重に支払わずに済むバージョンを紹介しています。
gpt-image-2-official には別のコードが必要ですか?
必要ありません。model の文字列を変えるだけで、ほかは何も変わりません。2 つの ID は同じフィールドを受け付け、同じタスクレスポンスを返します。異なるのは課金方法だけです。
タスク ID さえ保持すれば、あとは配管作業
送信して ID を保存し、期限付きでポーリングして、返ってきたものをダウンロードする。このパターンが連携のすべてです。スクリプトにする前に、GPT Image 2 Playground でコードなしにプロンプトを試してみてください。



