> ## Documentation Index
> Fetch the complete documentation index at: https://docs.acedata.cloud/llms.txt
> Use this file to discover all available pages before exploring further.

# OpenAI Images Edits API Ansökan och Användning

> OpenAI generation API guide - Ace Data Cloud

OpenAI bildredigeringstjänst kan ta emot valfritt antal bilder och instruktioner och returnera modifierade bilder. För närvarande stöder API:et både `dall-e-2`, `gpt-image-1`, den senaste **`gpt-image-2`**, samt modellerna **`nano-banana` / `nano-banana-2-lite` / `nano-banana-2` / `nano-banana-pro`** som är anslutna via samma API.

Detta dokument beskriver huvudsakligen användningsflödet för OpenAI Images Edits API, vilket gör att vi enkelt kan använda den officiella OpenAI bildredigeringsfunktionen.

## Ansökningsprocess

För att använda OpenAI Images Edits API, börja med att gå till [Ace Data Cloud-konsolen](https://platform.acedata.cloud/console/applications) för att hämta din API-token, som du kan spara för framtida bruk.

![](https://cdn.acedata.cloud/5hmkdg.jpg)

Om du inte har loggat in eller registrerat dig, kommer du automatiskt att omdirigeras till inloggningssidan där du blir inbjuden att registrera dig och logga in. När detta är klart kommer du automatiskt att återvända till den aktuella sidan.

**En API-token kan användas för att anropa alla tjänster på plattformen, utan att behöva ansöka separat för varje tjänst.** Första gången du ansöker får du en gratis kvot för att prova; om kvoten tar slut kan du ladda på allmän balans i [konsolen](https://platform.acedata.cloud/console/coin).

> 📘 Fullständig dokumentation: [OpenAI Images Edits API →](https://platform.acedata.cloud/documents/openai-images-edits)

## GPT-Image-2 Modell

`gpt-image-2` har en mycket tydlig förbättring jämfört med `gpt-image-1` i bildredigeringsscenarier:

* **Strukturen förblir mer stabil**: Vid byte av hud, färgschema eller bakgrund förstörs nästan aldrig den ursprungliga bildens layout och komposition.
* **Texten bevaras mer exakt**: Bilder som informationsgrafik, affischer, menyer etc. med text förblir tydliga och läsbara efter redigering.
* **Stöd för direktöverföring av URL**: Förutom traditionell `multipart/form-data` filuppladdning, stöder `gpt-image-2` även **att ta emot bild-URL:er i JSON-format**, vilket gör det onödigt att först ladda ner bilderna till den lokala enheten, vilket är mycket lämpligt för serverpipeline-integration.
* **Stöd för direktöverföring av base64**: I enlighet med officiella riktlinjer kan `image`-fältet också direkt ta emot base64 (`data:image/png;base64,...` eller ren base64), vilket gör att lokala bilder inte behöver laddas upp till en bildvärd innan redigering.
* **Stöd för högupplöst omritning**: Du kan skicka in en 1K-originalbild och begära 2K / 4K-utdata med `size`-parametern, modellen kommer att förstora bilden under redigeringsprocessen.

### Officiell omdirigering / Omvänd variant (`:official` / `:reverse`)

`gpt-image-2` använder som standard den omvända linjen. Genom att använda suffixet på modellnamnet kan du uttryckligen välja linje:

* **`gpt-image-2:official`**: Officiell omdirigeringslinje. Stöder `n > 1` (returnera flera bilder på en gång) och verklig 2K / 4K, **debitering per bild, enhetspriset är 2 gånger det vanliga `gpt-image-2`**. För närvarande tillhandahålls detta endast av openai-hk-kanalen, och om linjen inte är tillgänglig returneras ett fel direkt, utan att nedgraderas till den omvända linjen.
* **`gpt-image-2:reverse`**: Helt ekvivalent med standard `gpt-image-2` (omvänd linje), priset förblir oförändrat.

> Nedan gäller begränsningarna för "n"-parametern endast för standard / omvänd linje; `gpt-image-2:official` stöder `n > 1` och debiterar per bild.

### Stödda `size`-värden

Begränsningarna för `size` i redigeringsgränssnittet är helt identiska med de i genereringsgränssnittet — `gpt-image-2` kräver att `size` är `auto`, tomt, eller i formatet `WIDTHxHEIGHT`, alla andra former kommer att returnera 400. **Alla storlekar (1K / 2K / 4K / anpassade) debiteras enhetligt per bild, oavsett originalbildens upplösning och begärd `size`.**

Övre gränser för anpassade storlekar gäller också: både bredd och höjd måste vara multiplar av 16, långsidan ≤ 3840, totalt antal pixlar ≤ 8,294,400.

| Förhållande | 1K Rekommenderad | 2K Rekommenderad | 4K Rekommenderad |
| ----------- | ---------------- | ---------------- | ---------------- |
| 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`      |

> Till exempel: om originalbilden är `1024x1024`, och `size` anges som `2048x2048`, kommer modellen att omrita och returnera en 2K-bild; om `size` anges som `3840x2160` kommer den att returnera en 4K liggande bild; om `auto` anges eller utelämnas kommer modellen att välja själv. Debiteringen för de tre är densamma.

> **Om `n`-parametern**
> Redigeringsgränssnittet för `gpt-image-2` stöder för närvarande **inte `n > 1`**: denna parameter kommer att tyst ignoreras, oavsett om `n=1` eller `n=10` anges, kommer en enda begäran alltid att returnera 1 bild och debiteras endast för 1 bild. Om du behöver få flera kandidatredigeringsresultat på en gång, vänligen **initiera flera begärningar parallellt**. Denna begränsning gäller också för `gpt-image-1` / `gpt-image-1.5`, samt serierna `nano-banana` / `nano-banana-2-lite` / `nano-banana-2` / `nano-banana-pro`. `dall-e-2` är för närvarande den enda modellen som ursprungligen stöder `n > 1` för redigering.

Nedan ges två olika verkliga exempel för att uppleva redigeringsförmågan hos `gpt-image-2`.

### Anropmetod ett: JSON + Bild-URL (Rekommenderad)

Skicka en begäran direkt i `application/json`-format, fyll i `image`-fältet med en bild-URL, modellen kommer att hämta den bilden och redigera den enligt `prompt`.

Till exempel, nedan är den ursprungliga bilden som genererades med `gpt-image-2` som en populärvetenskaplig bild:

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

Vi hoppas kunna ändra den till en "nattläge"-färg. Vi kan anropa så här:

```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": "Konvertera denna infographic till mörkt läge: mörk marinblå bakgrund, ljus krämfärgad text, djup grå rundade modulkort med mjuka skuggor. Behåll all layout, struktur och modularrangemang identiska — endast invertera färgschemat.",
    "size": "1024x1536"
  }'
```

eller med Python:

```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": "Konvertera denna infographic till mörkt läge: mörk marinblå bakgrund, ljus krämfärgad text, djup grå rundade modulkort med mjuka skuggor. Behåll all layout, struktur och modularrangemang identiska — endast invertera färgschemat.",
    "size": "1024x1536"
}

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

Resultatet är som följer:

```json theme={null}
{
  "success": true,
  "task_id": "cb104e35-af1f-45be-9fac-b62e2b256753",
  "trace_id": "3e5c77c6-6c2e-4bba-a42d-98ea049b58a8",
  "created": 1777048863,
  "data": [
    {
      "revised_prompt": "Konvertera denna infographic till mörkt läge: mörk marinblå bakgrund, ljus krämfärgad text, djup grå rundade modulkort med mjuka skuggor. Behåll all layout, struktur och modularrangemang identiska — endast invertera färgschemat.",
      "url": "https://platform.cdn.acedata.cloud/gpt-image/cb104e35-af1f-45be-9fac-b62e2b256753_0.png"
    }
  ],
  "elapsed": 83.859
}
```

Den redigerade bilden är som följer:

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

Det kan ses att modulstrukturen, informationspartitionerna och typsnittet har bevarats strikt, endast färgschemat har inverterats till mörkt tema.

> **Tips**: `image`-fältet stöder också att ta emot en array, till exempel `"image": ["url1", "url2", "url3"]`, upp till 16 referensbilder kan skickas samtidigt för att modellen ska kunna referera till flera bilder vid redigering.

> **base64 direktöverföring**: `image` (och varje post i arrayen) kan förutom URL också vara base64 — `data:image/png;base64,...` eller ren base64 fungerar också, lämpligt för lokala bilder som inte vill laddas upp till en bildvärd först. Till exempel:
>
> ```python theme={null}
> import base64, requests
> b64 = base64.b64encode(open("input.png", "rb").read()).decode()
> payload = {
>     "model": "gpt-image-2",
>     "image": f"data:image/png;base64,{b64}",
>     "prompt": "Konvertera denna infographic till mörkt läge.",
>     "size": "1024x1536"
> }
> requests.post("https://api.acedata.cloud/openai/images/edits", json=payload,
>               headers={"authorization": "Bearer {token}"})
> ```

### Anropmetod två: JSON + flera referensbilder

`gpt-image-2` stöder att referera till flera bilder för att generera det slutliga resultatet, till exempel att kombinera flera produktbilder till en presentkorg:

```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": "Kombinera alla ovanstående föremål till en enda 'Relax & Unwind' presentkorg på en ren vit bakgrund, fotorealistisk, mjukt naturligt ljus.",
    "size": "1024x1024"
}
```

### Exempel på scenarier: Byt stil + behåll struktur

Här är ett annat exempel, att byta ut en träbokhylla mot en modern flytande hylla, men strikt behålla antalet och arrangemanget av böckerna.

Originalbild (genererad med `gpt-image-2` träbokhylla):

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

Anrop:

```python theme={null}
payload = {
    "model": "gpt-image-2",
    "image": "https://platform.cdn.acedata.cloud/gpt-image/141970f0-65fb-4ec8-ab7d-9be173641350_0.png",
    "prompt": "Byt ut den träbokhyllan mot en elegant modern vit flytande hylla monterad på en pastellblå vägg. Behåll exakt samma arrangemang av böcker (1 bok på toppen, 3 i mitten, 7 på botten). Lägg till en liten krukväxt på den övre hyllan bredvid boken. Ljust luftigt dagsljus från vänster.",
    "size": "1024x1024"
}
```

Redigerat resultat (`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>

Det kan ses att stil och miljö har bytts ut enligt prompten, men antalet böcker per hylla (1 / 3 / 7) har fortfarande strikt bevarats, och en krukväxt har lagts till enligt krav.

### Anropmetod tre: multipart/form-data (kompatibel med OpenAI SDK)

Om du redan använder den officiella OpenAI Python SDK, fungerar den tidigare `multipart/form-data` uppladdningsmetoden också, du behöver bara ändra `model` till `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="Konvertera denna bild till mörkt läge medan layouten förblir intakt."
)

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

När du använder SDK måste du först importera två miljövariabler, `OPENAI_BASE_URL` sättas till `https://api.acedata.cloud/openai`, `OPENAI_API_KEY` sättas till den token du har ansökt om:

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

## Nano Banana serie modeller

`nano-banana` serien har också integrerat `/openai/images/edits` i redigeringsscenarier, ändra bara `model` till något av alternativen i tabellen nedan.

| Modell               | Avgift (Credits / gång) | Tillämpningsområde                                                      |
| -------------------- | ----------------------- | ----------------------------------------------------------------------- |
| `nano-banana`        | 0.14                    | Vanlig bildredigering, snabbast och billigast                           |
| `nano-banana-2-lite` | 0.14                    | Gemini 3.1 lättviktsbildmodell, stödjer endast 1K, låg latensredigering |
| `nano-banana-2`      | 0.28                    | Kvalitet och detaljer har tydligt förbättrats                           |
| `nano-banana-pro`    | 0.35                    | Flaggskeppet i serien, bäst bevarande av struktur, text och stil        |

> **Viktigt: Parameterstöd**
> Nano Banana ansluter till OpenAI-protokollet via ett anpassningslager och stöder endast följande parametrar: `model`, `prompt`, `image`.
>
> * `image` kan antingen laddas upp som en fil via `multipart/form-data` (arbetaren konverterar internt till `data:<mime>;base64,...` för att skicka till upstream), eller så kan bildens URL-sträng skickas direkt som ett formulärfält.
> * Stöder inte parametrar som `mask`, `n`, `size`, `response_format` etc.; om de anges kommer de att ignoreras.
> * Returstrukturen följer OpenAI-formatet (`data[].url`), men `created` är alltid `0`, och `b64_json` kommer inte att returneras, `revised_prompt` är alltid lika med den ursprungliga `prompt`.

### Anropa via formulär + bild-URL

```shell theme={null}
curl -X POST "https://api.acedata.cloud/openai/images/edits" \
  -H "Authorization: Bearer {token}" \
  -F "model=nano-banana" \
  -F "prompt=lägg till ett grönt blad ovanpå äpplet" \
  -F "image=https://platform.cdn.acedata.cloud/nanobanana/6870b330-65c4-436c-bb80-819fdae7a7a4.png"
```

Returresultatet ser ut som följer:

```json theme={null}
{
  "created": 0,
  "data": [
    {
      "url": "https://platform.cdn.acedata.cloud/nanobanana/311e95b6-5eb1-4c4a-8ee6-0cb03ee44f61.jpeg",
      "revised_prompt": "lägg till ett grönt blad ovanpå äpplet"
    }
  ]
}
```

Den redigerade bilden:

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

### Anropa via formulär + lokal fil

```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": "lägg till ett grönt blad ovanpå äpplet"
}

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

### Asynkron callback

`callback_url` asynkron callback-mekanism fungerar också för nano-banana, anropsflödet är helt identiskt med andra modeller, se avsnittet [Asynkron callback](#asynkron-callback) nedan.

## Grundläggande användning

Nu kan vi använda kod för att göra anrop, nedan är ett exempel på anrop med 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=Skapa en vacker presentkorg med dessa föremål i'
```

Vid första användningen av detta API måste vi fylla i minst fyra fält, en är `authorization`, som kan väljas direkt från rullgardinsmenyn. En annan parameter är `model`, `model` är den vi väljer att använda från OpenAI:s officiella modellkategorier, här har vi huvudsakligen 1 typ av modell, detaljer kan ses i de modeller vi tillhandahåller. En annan parameter är `prompt`, `prompt` är den text vi anger för att generera bilden. Den sista parametern är `image`, denna parameter behöver sökvägen till den bild som ska redigeras, bilden som ska redigeras visas nedan:

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

Ett motsvarande Python-exempel för anrop:

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

prompt = """
Generera en fotorealistisk bild av en presentkorg på en vit bakgrund 
märkt 'Relax & Unwind' med ett band och handstils-liknande typsnitt, 
som innehåller alla föremål i referensbilderna.
"""

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)

# Spara bilden till en fil
with open("gift-basket.png", "wb") as f:
    f.write(image_bytes)
```

För att använda Python-anropet behöver vi först importera två miljövariabler, en `OPENAI_BASE_URL`, som kan sättas till `https://api.acedata.cloud/openai`, och en variabel för autentisering `OPENAI_API_KEY`, vars värde hämtas från `authorization`. På Mac OS kan miljövariablerna sättas med följande kommando:

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

Efter anropet kommer vi att se att en bild `gift-basket.png` genereras i den aktuella katalogen, det specifika resultatet ser ut som följer:

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

Så här har vi slutfört bildredigeringsoperationen, för närvarande stöder Edits API tre modeller: `dall-e-2`, `gpt-image-1` och `gpt-image-2`, där `gpt-image-2` är den rekommenderade modellen, se avsnittet [GPT-Image-2-modell](#gpt-image-2-模型) ovan.

## Asynkron callback

Eftersom OpenAI Images Edits API kan ta längre tid att redigera bilder, om API:t inte svarar under en längre tid, kommer HTTP-förfrågan att hålla anslutningen öppen, vilket leder till extra systemresursförbrukning, så detta API erbjuder också stöd för asynkron callback.

Det övergripande flödet är: när klienten initierar en begäran, specificerar den ett extra `callback_url`-fält, efter att klienten har initierat API-begäran kommer API:t omedelbart att returnera ett resultat som innehåller ett `task_id`-fält, vilket representerar det aktuella uppdragets ID. När uppdraget är slutfört kommer resultatet av bildredigeringen att skickas till klientens angivna `callback_url` i POST JSON-format, vilket också inkluderar `task_id`-fältet, så att uppdragets resultat kan kopplas ihop med ID.

Nedan kommer vi att förstå hur man gör detta genom ett exempel.

Först är Webhook-callback en tjänst som kan ta emot HTTP-förfrågningar, utvecklare bör ersätta med URL:en till sin egen byggda HTTP-server. Här för att underlätta demonstration använder vi en offentlig Webhook-exempelsida [https://webhook.site/](https://webhook.site/), öppna denna webbplats för att få en Webhook-URL, som visas i bilden:

![](https://cdn.acedata.cloud/cjjfly.png)
Kopiera denna URL så kan den användas som Webhook, exemplet här är `https://webhook.site/3d32690d-6780-4187-a65c-870061e8c8ab`.

Nästa steg är att ställa in fältet `callback_url` till ovanstående Webhook URL, samtidigt som vi fyller i motsvarande parametrar, som i följande kod:

```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=Skapa en härlig presentkorg med dessa föremål i" \
  -F "callback_url=https://webhook.site/3d32690d-6780-4187-a65c-870061e8c8ab"
```

Efter anropet kan vi se att vi omedelbart får ett resultat, som följer:

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

Vänta en stund, så kan vi observera resultatet av bildredigeringen på Webhook URL, innehållet är som följer:

```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..."
      }
    ]
  }
}
```

Vi kan se att resultatet innehåller ett `task_id` fält, `data` fältet innehåller samma bildredigeringsresultat som vid synkront anrop, och genom `task_id` fältet kan vi koppla uppgiften.

## Felhantering

Vid anrop av API:et, om ett fel uppstår, kommer API:et att returnera motsvarande felkod och information. Till exempel:

* `400 token_mismatched`: Bad request, möjligtvis på grund av saknade eller ogiltiga parametrar.
* `400 api_not_implemented`: Bad request, möjligtvis på grund av saknade eller ogiltiga parametrar.
* `401 invalid_token`: Obehörig, ogiltig eller saknad auktoriseringstoken.
* `429 too_many_requests`: För många förfrågningar, du har överskridit hastighetsgränsen.
* `500 api_error`: Internt serverfel, något gick fel på servern.

### Exempel på felrespons

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

## Slutsats

Genom detta dokument har du lärt dig hur man använder OpenAI Images Edits API för att enkelt använda den officiella OpenAI:s bildredigeringsfunktion. Vi hoppas att detta dokument kan hjälpa dig att bättre integrera och använda detta API. Om du har några frågor, tveka inte att kontakta vårt tekniska supportteam.
