> ## Documentation Index
> Fetch the complete documentation index at: https://germeytechnology-docs-remove-4o-image-nav.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# OpenAI Images Edits API – rejestracja i użycie

> OpenAI generation 集成指南 - Ace Data Cloud

Usługa edycji obrazów OpenAI pozwala przesłać dowolną liczbę obrazów i poleceń, a następnie otrzymać zmodyfikowane obrazy. Obecnie interfejs obsługuje modele `dall-e-2`, `gpt-image-1`, najnowszy **`gpt-image-2`**, a także modele z serii **`nano-banana` / `nano-banana-2` / `nano-banana-pro`** dostępne przez ten sam interfejs.

Niniejsza dokumentacja opisuje proces korzystania z OpenAI Images Edits API, dzięki któremu można łatwo używać oficjalnych funkcji edycji obrazów OpenAI.

## Proces rejestracji

Aby korzystać z OpenAI Images Edits API, należy najpierw przejść na stronę [OpenAI Images Edits API](https://platform.acedata.cloud/documents/openai-images-edits) i kliknąć przycisk „Acquire”, aby uzyskać niezbędne poświadczenia do żądań:

![](https://cdn.acedata.cloud/nyq0xz.png)

Jeśli nie jesteś zalogowany lub zarejestrowany, zostaniesz automatycznie przekierowany na stronę logowania, gdzie możesz się zarejestrować i zalogować. Po zalogowaniu zostaniesz automatycznie przekierowany z powrotem na tę stronę.

Przy pierwszym zgłoszeniu otrzymujesz darmowy limit, który pozwala na bezpłatne korzystanie z API.

## Model GPT-Image-2

Model `gpt-image-2` oferuje znaczące ulepszenia w scenariuszach edycji obrazów w porównaniu do `gpt-image-1`:

* **Stabilniejsze zachowanie struktury**: zmiana skórek, kolorystyki czy tła niemal nie narusza układu i kompozycji oryginalnego obrazu.
* **Dokładniejsze zachowanie tekstu**: obrazy zawierające tekst, takie jak infografiki, plakaty czy menu, po edycji zachowują czytelność tekstu.
* **Obsługa bezpośredniego przesyłania URL**: oprócz tradycyjnego przesyłania plików w formacie `multipart/form-data`, `gpt-image-2` **dodatkowo obsługuje przekazywanie URL obrazu w formacie JSON**, co eliminuje konieczność pobierania obrazu lokalnie i jest idealne do integracji po stronie serwera.
* **Obsługa wysokiej rozdzielczości**: można przesłać obraz 1K i za pomocą parametru `size` zażądać wyjścia w rozdzielczości 2K lub 4K; model podczas edycji jednocześnie powiększy obraz.

### Obsługiwane wartości parametru `size`

Ograniczenia parametru `size` w interfejsie edycji są takie same jak w interfejsie generowania — `gpt-image-2` akceptuje `size` równe `auto`, puste lub w formacie `WIDTHxHEIGHT`. Każda inna forma zwróci błąd 400. **Wszystkie rozmiary (1K / 2K / 4K / niestandardowe) są rozliczane jednolicie za pojedynczy obraz, niezależnie od rozdzielczości oryginału i wartości `size`.**

Obowiązują też ograniczenia dotyczące niestandardowych rozmiarów: szerokość i wysokość muszą być wielokrotnością 16, dłuższy bok ≤ 3840, łączna liczba pikseli ≤ 8 294 400.

| Proporcje | 1K rekomendowane | 2K rekomendowane | 4K rekomendowane |
| --------- | ---------------- | ---------------- | ---------------- |
| 1:1       | `1024x1024`      | `2048x2048`      | `2880x2880`      |
| 4:3       | `1536x1024`      | `2048x1536`      | `3264x2448`      |
| 3:4       | `1024x1536`      | `1536x2048`      | `2448x3264`      |
| 16:9      | `1792x1024`      | `2048x1152`      | `3840x2160`      |
| 9:16      | `1024x1792`      | `1152x2048`      | `2160x3840`      |

> Przykład: jeśli oryginalny obraz ma rozmiar `1024x1024`, a `size` ustawimy na `2048x2048`, model wygeneruje obraz 2K zgodnie z instrukcją edycji; dla `3840x2160` wyjściem będzie obraz 4K w orientacji poziomej; dla `auto` lub pominięcia parametru model sam wybierze rozmiar. Opłata jest taka sama w każdym przypadku.

> **O parametrze `n`**
>
> Interfejs edycji `gpt-image-2` **nie obsługuje `n > 1`**: parametr ten jest ignorowany, niezależnie czy podasz `n=1` czy `n=10`, w odpowiedzi zwracany jest tylko jeden obraz i naliczana jest opłata za jeden obraz. Jeśli potrzebujesz wielu wariantów, musisz wykonać wiele równoległych żądań. To ograniczenie dotyczy również modeli `gpt-image-1` / `gpt-image-1.5` oraz serii `nano-banana`. Model `dall-e-2` jest obecnie jedynym natywnie obsługującym `n > 1`.

Poniżej przedstawiamy dwa przykłady pokazujące możliwości edycji modelu `gpt-image-2`.

### Metoda wywołania 1: JSON + URL obrazu (zalecane)

Wysyłamy żądanie jako `application/json`, w polu `image` podajemy URL obrazu, który model pobierze i edytuje zgodnie z `prompt`.

Na przykład, poniższy obraz to infografika wygenerowana przez `gpt-image-2`:

<p>
  <img src="https://platform.cdn.acedata.cloud/gpt-image/5c9fa635-8794-4c6d-88f8-584d7f4716c6_0.png" width="500" className="m-auto" />
</p>

Chcemy zmienić ją na tryb „nocny”. Wywołanie wygląda tak:

```shell theme={null}
curl -X POST "https://api.acedata.cloud/openai/images/edits" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-image-2",
    "image": "https://platform.cdn.acedata.cloud/gpt-image/5c9fa635-8794-4c6d-88f8-584d7f4716c6_0.png",
    "prompt": "Convert this infographic to dark mode: dark navy background, light cream text, deep gray rounded module cards with soft shadows. Keep all layout, structure, and module arrangement identical — only invert the color scheme.",
    "size": "1024x1536"
  }'
```

Lub w Pythonie:

```python theme={null}
import requests

url = "https://api.acedata.cloud/openai/images/edits"

headers = {
    "accept": "application/json",
    "authorization": "Bearer {token}",
    "content-type": "application/json"
}

payload = {
    "model": "gpt-image-2",
    "image": "https://platform.cdn.acedata.cloud/gpt-image/5c9fa635-8794-4c6d-88f8-584d7f4716c6_0.png",
    "prompt": "Convert this infographic to dark mode: dark navy background, light cream text, deep gray rounded module cards with soft shadows. Keep all layout, structure, and module arrangement identical — only invert the color scheme.",
    "size": "1024x1536"
}

response = requests.post(url, json=payload, headers=headers)
print(response.text)
```

Przykładowa odpowiedź:

```json theme={null}
{
  "success": true,
  "task_id": "cb104e35-af1f-45be-9fac-b62e2b256753",
  "trace_id": "3e5c77c6-6c2e-4bba-a42d-98ea049b58a8",
  "created": 1777048863,
  "data": [
    {
      "revised_prompt": "Convert this infographic to dark mode: dark navy background, light cream text, deep gray rounded module cards with soft shadows. Keep all layout, structure, and module arrangement identical — only invert the color scheme.",
      "url": "https://platform.cdn.acedata.cloud/gpt-image/cb104e35-af1f-45be-9fac-b62e2b256753_0.png"
    }
  ],
  "elapsed": 83.859
}
```

Edytowany obraz:

<p>
  <img src="https://platform.cdn.acedata.cloud/gpt-image/cb104e35-af1f-45be-9fac-b62e2b256753_0.png" width="500" className="m-auto" />
</p>

Widać, że struktura modułów, podział informacji i układ tekstu zostały zachowane, a jedynie kolorystyka zmieniona na ciemny motyw.

> **Wskazówka**: pole `image` może też przyjmować tablicę URL-i, np. `"image": ["url1", "url2", "url3"]`, maksymalnie do 16 obrazów referencyjnych, które model uwzględni podczas edycji.

### Metoda wywołania 2: JSON + wiele obrazów referencyjnych

Model `gpt-image-2` potrafi korzystać z wielu obrazów referencyjnych, np. łączyć kilka zdjęć produktów w jeden kosz prezentowy:

```python theme={null}
payload = {
    "model": "gpt-image-2",
    "image": [
        "https://example.com/item1.png",
        "https://example.com/item2.png",
        "https://example.com/item3.png"
    ],
    "prompt": "Combine all the items above into a single 'Relax & Unwind' gift basket on a clean white background, photorealistic, soft natural lighting.",
    "size": "1024x1024"
}
```

### Przykład scenariusza: zmiana stylu przy zachowaniu struktury

Kolejny przykład: zamiana drewnianej półki na nowoczesną, ale zachowanie dokładnej liczby i układu książek na każdej półce.

Oryginalny obraz (drewniana półka wygenerowana przez `gpt-image-2`):

<p>
  <img src="https://platform.cdn.acedata.cloud/gpt-image/141970f0-65fb-4ec8-ab7d-9be173641350_0.png" width="500" className="m-auto" />
</p>

Wywołanie:

```python theme={null}
payload = {
    "model": "gpt-image-2",
    "image": "https://platform.cdn.acedata.cloud/gpt-image/141970f0-65fb-4ec8-ab7d-9be173641350_0.png",
    "prompt": "Replace the wooden bookshelf with a sleek modern white floating shelf mounted on a pastel blue wall. Keep the exact same arrangement of books (1 book on top, 3 in middle, 7 on bottom). Add a small potted succulent on the top shelf next to the book. Bright airy daylight from the left.",
    "size": "1024x1024"
}
```

Wynik edycji (`task_id`: `e9544dba-727e-44a2-81e1-223d49869380`):

<p>
  <img src="https://platform.cdn.acedata.cloud/gpt-image/e9544dba-727e-44a2-81e1-223d49869380_0.png" width="500" className="m-auto" />
</p>

Widać, że styl i otoczenie zostały zmienione zgodnie z poleceniem, ale liczba książek na każdej półce (1 / 3 / 7) pozostała niezmieniona, a na górnej półce dodano małą sukulentę.

### Metoda wywołania 3: multipart/form-data (kompatybilne z OpenAI SDK)

Jeśli korzystasz z oficjalnego OpenAI Python SDK, możesz używać tradycyjnego przesyłania plików `multipart/form-data`, wystarczy zmienić `model` na `gpt-image-2`:

```python theme={null}
import base64
from openai import OpenAI
client = OpenAI()

result = client.images.edit(
    model="gpt-image-2",
    image=[open("test.png", "rb")],
    prompt="Convert this image to dark mode while keeping the layout intact."
)

image_base64 = result.data[0].b64_json
image_bytes = base64.b64decode(image_base64)
with open("edited.png", "wb") as f:
    f.write(image_bytes)
```

Przed użyciem SDK należy ustawić dwa zmienne środowiskowe: `OPENAI_BASE_URL` na `https://api.acedata.cloud/openai` oraz `OPENAI_API_KEY` na uzyskany token:

```shell theme={null}
export OPENAI_BASE_URL=https://api.acedata.cloud/openai
export OPENAI_API_KEY={token}
```

## Modele z serii Nano Banana

Modele `nano-banana` również są dostępne pod `/openai/images/edits`. Wystarczy zmienić parametr `model` na dowolny z poniższej tabeli:

| Model             | Koszt (kredyty / wywołanie) | Zastosowanie                                                        |
| ----------------- | --------------------------- | ------------------------------------------------------------------- |
| `nano-banana`     | 0.14                        | Standardowa edycja obrazów, najszybsza i najtańsza                  |
| `nano-banana-2`   | 0.28                        | Wyraźnie lepsza jakość i szczegóły                                  |
| `nano-banana-pro` | 0.35                        | Flagowy model serii, najlepsze zachowanie struktury, tekstu i stylu |

> **Ważne: obsługiwane parametry**
>
> Nano Banana korzysta z warstwy adaptacyjnej OpenAI i obsługuje tylko parametry: `model`, `prompt`, `image`.
>
> * `image` można przesłać jako plik w `multipart/form-data` (worker konwertuje go do formatu `data:<mime>;base64,...` dla upstream) lub jako URL w polu formularza.
> * Nie obsługuje parametrów `mask`, `n`, `size`, `response_format` – są ignorowane.
> * Odpowiedź ma format zgodny z OpenAI (`data[].url`), ale `created` jest zawsze `0`, nie zwraca `b64_json`, a `revised_prompt` jest zawsze równy oryginalnemu `prompt`.

### Wywołanie przez formularz + URL obrazu

```shell theme={null}
curl -X POST "https://api.acedata.cloud/openai/images/edits" \
  -H "Authorization: Bearer {token}" \
  -F "model=nano-banana" \
  -F "prompt=add a green leaf on top of the apple" \
  -F "image=https://platform.cdn.acedata.cloud/nanobanana/6870b330-65c4-436c-bb80-819fdae7a7a4.png"
```

Przykładowa odpowiedź:

```json theme={null}
{
  "created": 0,
  "data": [
    {
      "url": "https://platform.cdn.acedata.cloud/nanobanana/311e95b6-5eb1-4c4a-8ee6-0cb03ee44f61.jpeg",
      "revised_prompt": "add a green leaf on top of the apple"
    }
  ]
}
```

Edytowany obraz:

<p>
  <img src="https://platform.cdn.acedata.cloud/nanobanana/311e95b6-5eb1-4c4a-8ee6-0cb03ee44f61.jpeg" width="500" className="m-auto" />
</p>

### Wywołanie przez formularz + lokalny plik

```python theme={null}
import requests

url = "https://api.acedata.cloud/openai/images/edits"

headers = {
    "authorization": "Bearer {token}"
}

files = {
    "image": open("apple.png", "rb"),
}
data = {
    "model": "nano-banana-pro",
    "prompt": "add a green leaf on top of the apple"
}

response = requests.post(url, headers=headers, files=files, data=data)
print(response.text)
```

### Asynchroniczne wywołanie zwrotne (callback)

Mechanizm asynchronicznego callback `callback_url` działa również dla nano-banana i jest identyczny jak dla innych modeli (szczegóły w sekcji [Asynchroniczne wywołanie zwrotne](#asynchroniczne-wywołanie-zwrotne)).

## Podstawowe użycie

Możesz wywołać API za pomocą CURL:

```curl theme={null}
curl -s -D >(grep -i x-request-id >&2) \
  -o >(jq -r '.data[0].b64_json' | base64 --decode > gift-basket.png) \
  -X POST "https://api.acedata.cloud/v1/images/edits" \
  -H "Authorization: Bearer {token}" \
  -F "model=gpt-image-1" \
  -F "image[]=@test.png" \
  -F 'prompt=Create a lovely gift basket with these this items in it'
```

Przy pierwszym użyciu tego interfejsu należy podać co najmniej cztery parametry: `authorization` (wybierany z listy), `model` (wybór modelu OpenAI, tutaj dostępny jest jeden model, szczegóły w dokumentacji modeli), `prompt` (tekstowy opis generowanego obrazu) oraz `image` (ścieżka do edytowanego obrazu). Przykładowy obraz do edycji:

<p>
  <img src="https://cdn.acedata.cloud/jw9iwu.png" width="500" className="m-auto" />
</p>

Analogiczne wywołanie w Pythonie:

```python theme={null}
import base64
from openai import OpenAI
client = OpenAI()

prompt = """
Generate a photorealistic image of a gift basket on a white background 
labeled 'Relax & Unwind' with a ribbon and handwriting-like font, 
containing all the items in the reference pictures.
"""

result = client.images.edit(
    model="gpt-image-1",
    image=[
        open("test.png", "rb")
    ],
    prompt=prompt
)

image_base64 = result.data[0].b64_json
image_bytes = base64.b64decode(image_base64)

# Zapisz obraz do pliku
with open("gift-basket.png", "wb") as f:
    f.write(image_bytes)
```

Przed wywołaniem w Pythonie należy ustawić zmienne środowiskowe: `OPENAI_BASE_URL` na `https://api.acedata.cloud/openai` oraz `OPENAI_API_KEY` na uzyskany token. Na Mac OS można to zrobić tak:

```shell theme={null}
export OPENAI_BASE_URL=https://api.acedata.cloud/openai
export OPENAI_API_KEY={token}
```

Po wywołaniu w katalogu pojawi się plik `gift-basket.png` z wynikiem:

<p>
  <img src="https://cdn.acedata.cloud/574s8h.png" width="500" className="m-auto" />
</p>

W ten sposób zakończyliśmy edycję obrazu. Interfejs Edits obsługuje trzy modele: `dall-e-2`, `gpt-image-1` i `gpt-image-2`. Zalecanym modelem jest `gpt-image-2` (szczegóły w sekcji [Model GPT-Image-2](#model-gpt-image-2)).

## Asynchroniczne wywołanie zwrotne

Ponieważ edycja obrazów przez OpenAI Images Edits API może trwać długo, a długie oczekiwanie na odpowiedź HTTP obciąża zasoby systemowe, API oferuje wsparcie dla asynchronicznych callbacków.

Proces jest następujący: klient wysyła żądanie z dodatkowym polem `callback_url`. API natychmiast zwraca odpowiedź zawierającą `task_id` – identyfikator zadania. Po zakończeniu edycji wynik jest przesyłany metodą POST w formacie JSON na podany `callback_url`, zawierając również `task_id`, co pozwala powiązać odpowiedź z zadaniem.

Przykład działania:

Webhook callback to usługa HTTP, którą należy zastąpić własnym serwerem HTTP. Dla demonstracji można użyć publicznego serwisu [https://webhook.site/](https://webhook.site/), który generuje unikalny URL webhooka, np.:

![](https://cdn.acedata.cloud/cjjfly.png)

Skopiuj ten URL, np. `https://webhook.site/3d32690d-6780-4187-a65c-870061e8c8ab`, i użyj go jako `callback_url`:

```shell theme={null}
curl -X POST "https://api.acedata.cloud/v1/images/edits" \
  -H "Authorization: Bearer {token}" \
  -F "model=gpt-image-1" \
  -F "image[]=@test.png" \
  -F "prompt=Create a lovely gift basket with these items in it" \
  -F "callback_url=https://webhook.site/3d32690d-6780-4187-a65c-870061e8c8ab"
```

Otrzymasz natychmiast odpowiedź:

```json theme={null}
{
  "task_id": "6a97bf49-df50-4129-9e46-119aa9fca73c"
}
```

Po chwili na stronie webhooka pojawi się wynik edycji:

```json theme={null}
{
  "success": true,
  "task_id": "6a97bf49-df50-4129-9e46-119aa9fca73c",
  "trace_id": "9b4b1ff3-90f2-470f-b082-1061ec2948cc",
  "data": {
    "created": 1721626477,
    "data": [
      {
        "b64_json": "iVBORw0KGgo..."
      }
    ]
  }
}
```

W odpowiedzi znajduje się `task_id` oraz pole `data` z wynikiem edycji, analogicznie do wywołania synchronicznego. Dzięki `task_id` można powiązać zadanie z odpowiedzią.

## Obsługa błędów

W przypadku błędów API zwraca odpowiedni kod i komunikat, np.:

* `400 token_mismatched`: złe żądanie, brak lub nieprawidłowe parametry.
* `400 api_not_implemented`: złe żądanie, brak lub nieprawidłowe parametry.
* `401 invalid_token`: brak autoryzacji, nieprawidłowy lub brakujący token.
* `429 too_many_requests`: zbyt wiele żądań, przekroczono limit.
* `500 api_error`: błąd wewnętrzny serwera.

### Przykład odpowiedzi błędu

```json theme={null}
{
  "success": false,
  "error": {
    "code": "api_error",
    "message": "fetch failed"
  },
  "trace_id": "2cf86e86-22a4-46e1-ac2f-032c0f2a4e89"
}
```

## Podsumowanie

W tej dokumentacji poznaliście, jak korzystać z OpenAI Images Edits API, aby łatwo używać oficjalnych funkcji edycji obrazów OpenAI. Mamy nadzieję, że pomoże to w integracji i efektywnym wykorzystaniu API. W razie pytań prosimy o kontakt z zespołem wsparcia technicznego.
