Claude Opus 5.5 jest już dostępny w SeedRouter

GPT Image 2 API w Pythonie: kompletny przykład

Kompletny przykład GPT Image 2 API w Pythonie: wyślij żądanie, odpytuj zadanie, zapisz obrazy na dysku, edytuj z referencjami i bezpiecznie obsłuż błędy.

Czytaj jako Markdown

Aby używać GPT Image 2 API z Pythona, wyślij żądanie POST na https://api.seedrouter.ai/v1/images/generations biblioteką requests, zachowaj zwrócone id zadania, odpytuj /v1/tasks/{id}, aż zadanie będzie completed, i pobierz wymienione w nim adresy URL obrazów. Poniższy skrypt wykonuje wszystkie cztery kroki w około 40 wierszach i zapisuje obrazy na dysku.

Działa bez zmian, gdy tylko ustawisz SEEDROUTER_API_KEY. Jeśli nie masz jeszcze klucza, najpierw go zdobądź.

Jak wygląda kompletny skrypt GPT Image 2 w Pythonie?

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

Uruchom go poleceniem python example.py. Najpierw wypisze ID zadania, a potem ścieżki dwóch plików PNG: vase-0.png i vase-1.png.

Co robi każda funkcja?

submit wysyła żądanie i zwraca ID zadania. Odpowiedź z błędem zawsze zawiera obiekt error z liczbowym code i polem message, więc wyjątek mówi, co poprawić. Na przykład 400 z kodem 20001 i komunikatem „Check the size parameter against the API documentation.” oznacza, że rozmiar złamał jedną z reguł opisanych w przewodniku po parametrach.

wait odpytuje co trzy sekundy, aż zadanie się zakończy. Limit czasu po twojej stronie zatrzymuje pętlę, a nie zadanie: render trwa dalej i możesz później wznowić odpytywanie tego samego ID. Zadanie, które kończy się statusem failed, rzuca wyjątek ze swoim kodem błędu i nie jest rozliczane.

download pobiera każdy adres URL zwrócony przez zadanie i zapisuje go na dysku. Adresy URL wyników służą do przekazania plików, a nie do trwałego przechowywania, więc zapisz to, co chcesz zachować. Przykład używa requests zarówno do pobierania, jak i do wywołań API; trzymaj się jednego klienta HTTP, zamiast dokładać urllib z biblioteki standardowej.

Jak zmienić ustawienia obrazu?

Wszystko jest w treści żądania. Pola, które większość osób zmienia najpierw:

PolePrzykładEfekt
size"1536x1024"Wymiary wyjścia; auto pozostawia wybór modelowi
quality"medium"low, medium, high lub auto
n4Liczba obrazów, od 1 do 10
output_format"jpeg"png lub jpeg
background"transparent"Wymaga png

Jeśli zmienisz output_format, zmień też rozszerzenie .png w download. Pełną listę pól i limitów znajdziesz w dokumentacji GPT Image 2 API.

Jak edytować obraz z Pythona?

Przekaż obrazy referencyjne jako adresy URL w tym samym wywołaniu. Nie ma osobnego punktu końcowego do edycji; dodanie images zamienia żądanie w edycję, a mask ogranicza zmianę do jednego obszaru:

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"}],
})

Adresy URL muszą być publicznymi linkami HTTPS do plików PNG, JPEG lub WebP. Możesz wysłać do 16. Pliki lokalne i ciągi base64 są odrzucane, więc najpierw prześlij obraz do własnego magazynu i przekaż jego URL.

Co powinien zrobić skrypt, gdy wysyłka przekroczy limit czasu?

Nie wysyłaj od razu ponownie. Przekroczenie czasu przy POST nie dowodzi, że żądanie zostało odrzucone; zadanie może już działać i być rozliczone. Sprawdź swoje ostatnie zadania albo ponów żądanie dopiero po upewnieniu się, że żadne zadanie nie powstało. Przewodnik po zadaniach wyjaśnia, jak odróżnić te dwie sytuacje.

Z odpytywaniem jest inaczej: przekroczenie czasu podczas odpytywania jest nieszkodliwe. Wywołaj wait ponownie z tym samym ID.

Najczęstsze pytania

Czy mogę zamiast tego użyć Python SDK od OpenAI?

Nie bezpośrednio. To API dostarcza wyniki asynchronicznie przez ID zadania, a wywołanie obrazu w SDK oczekuje gotowego obrazu w odpowiedzi. Kilka wierszy z requests, jak powyżej, obsługuje cały przepływ.

Jak uruchomić kilka promptów?

Wyślij każdy prompt, zapisz wszystkie ID zadań, a potem je odpytuj. Przewodnik po generowaniu wsadowym pokazuje wersję, która przetrwa restarty bez podwójnego płacenia.

Czy gpt-image-2-official wymaga innego kodu?

Nie. Zmień ciąg model i nic więcej. Oba ID przyjmują te same pola i zwracają tę samą odpowiedź zadania; różni się tylko rozliczanie.

Zachowaj ID zadania, reszta to hydraulika

Wyślij żądanie, zapisz ID, odpytuj z limitem czasu i pobierz to, co wróci. Ten wzorzec to cała integracja. Zanim napiszesz skrypt, wypróbuj prompt bez kodu w Playgroundzie GPT Image 2.

Powiązane poradniki