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 MarkdownAby 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:
| Pole | Przykład | Efekt |
|---|---|---|
size | "1536x1024" | Wymiary wyjścia; auto pozostawia wybór modelowi |
quality | "medium" | low, medium, high lub auto |
n | 4 | Liczba 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.



