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

# Buat dan Edit Gambar dengan Model GPT dan Gemini melalui Flatkey

> Buat dan edit gambar melalui Flatkey dengan gpt-image-2 dan model gambar Gemini, menggunakan API kompatibel OpenAI Images atau API Gemini native.

Flatkey menyediakan dua keluarga API gambar. Gunakan endpoint `/v1/images/generations` dan `/v1/images/edits` yang kompatibel dengan OpenAI untuk `gpt-image-2`. Gunakan endpoint `generateContent` Gemini native untuk model gambar Gemini.

<Warning>
  Anda tidak dapat memanggil model gambar Gemini dengan OpenAI Images SDK, `/v1/images/generations`, atau `/v1/images/edits`. Gunakan contoh API Gemini native di halaman ini. Jika tidak, permintaan mungkin mengembalikan `get_channel_failed`.
</Warning>

## Model gambar yang didukung

| Model                         | API               | Harga resmi       | Harga setelah bonus |
| ----------------------------- | ----------------- | ----------------- | ------------------- |
| `gpt-image-2`                 | OpenAI Images API | \$6.65 / 1M token | \~\$3.99 / 1M token |
| `gemini-3-pro-image`          | Native Gemini API | \$2.00 / 1M token | \~\$1.20 / 1M token |
| `gemini-2.5-flash-image`      | Native Gemini API | \$0.30 / 1M token | \~\$0.18 / 1M token |
| `gemini-3.1-flash-image`      | Native Gemini API | Lihat dasbor      | Lihat dasbor        |
| `gemini-3.1-flash-lite-image` | Native Gemini API | Lihat dasbor      | Lihat dasbor        |
| `nano-banana-pro-preview`     | Native Gemini API | Lihat dasbor      | Lihat dasbor        |

Lihat [Direktori Model](https://flatkey.ai/models) untuk daftar model lengkap dan harga terkini.

## Gunakan gpt-image-2

### Gunakan OpenAI SDK

<CodeGroup>
  ```python python theme={"dark"}
  import base64
  import os
  from pathlib import Path

  from openai import OpenAI

  client = OpenAI(
      api_key=os.environ["FLATKEY_API_KEY"],
      base_url="https://router.flatkey.ai/v1",
  )

  response = client.images.generate(
      model="gpt-image-2",
      prompt="A serene mountain lake at sunset, photorealistic",
      size="1024x1024",
  )

  Path("generated.png").write_bytes(
      base64.b64decode(response.data[0].b64_json)
  )
  ```

  ```javascript node theme={"dark"}
  import { writeFileSync } from "node:fs";
  import OpenAI from "openai";

  const client = new OpenAI({
    apiKey: process.env.FLATKEY_API_KEY,
    baseURL: "https://router.flatkey.ai/v1",
  });

  const response = await client.images.generate({
    model: "gpt-image-2",
    prompt: "A serene mountain lake at sunset, photorealistic",
    size: "1024x1024",
  });

  writeFileSync(
    "generated.png",
    Buffer.from(response.data[0].b64_json, "base64"),
  );
  ```
</CodeGroup>

### Buat gambar dengan curl

```bash theme={"dark"}
curl https://router.flatkey.ai/v1/images/generations \
  -H "Authorization: Bearer $FLATKEY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-image-2",
    "prompt": "A futuristic cityscape at night, neon lights, wide angle",
    "size": "1024x1024"
  }'
```

Endpoint ini mengembalikan gambar yang dihasilkan dalam `data[0].b64_json`; `gpt-image-2` tidak menyediakan URL gambar yang dihosting. Lihat [referensi Images API](/id/api-reference/image-generation#buat-sebuah-gambar) untuk semua field.

### Edit gambar dengan curl

Gunakan `/v1/images/edits` untuk mengunggah gambar masukan beserta instruksi pengeditan. Endpoint ini menggunakan `multipart/form-data`; `image` wajib diisi dan `mask` bersifat opsional.

```bash theme={"dark"}
curl https://router.flatkey.ai/v1/images/edits \
  -H "Authorization: Bearer $FLATKEY_API_KEY" \
  -F "model=gpt-image-2" \
  -F "prompt=add a small yellow star in the center" \
  -F "image=@input.png" \
  -F "mask=@mask.png"
```

`image` mendukung PNG, JPEG, dan WebP. Hilangkan `mask` untuk mengedit seluruh gambar berdasarkan prompt. Ketika mask diberikan, area transparannya menentukan wilayah yang akan digambar ulang. Gambar yang telah diedit dikembalikan dalam `data[0].b64_json`. Lihat [referensi API edit](/id/api-reference/image-generation#edit-sebuah-gambar) untuk semua field.

## Gunakan model gambar Gemini

Model gambar Gemini menggunakan endpoint berikut. Ganti `{model}` dengan ID model:

```text theme={"dark"}
POST https://router.flatkey.ai/v1beta/models/{model}:generateContent
```

Permintaan harus menyertakan `"IMAGE"` dalam `generationConfig.responseModalities`. Gambar yang dihasilkan dikembalikan dalam `candidates[].content.parts[].inlineData`.

### Gunakan curl

```bash theme={"dark"}
curl https://router.flatkey.ai/v1beta/models/gemini-2.5-flash-image:generateContent \
  -H "Authorization: Bearer $FLATKEY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [{
      "parts": [{
        "text": "A product photo of a translucent purple glass bottle on a white background"
      }]
    }],
    "generationConfig": {
      "responseModalities": ["TEXT", "IMAGE"]
    }
  }'
```

### Gunakan Python dan simpan gambar

Instal klien HTTP:

```bash theme={"dark"}
pip install requests
```

```python theme={"dark"}
import base64
import os
from pathlib import Path

import requests

model = "gemini-2.5-flash-image"
response = requests.post(
    f"https://router.flatkey.ai/v1beta/models/{model}:generateContent",
    headers={
        "Authorization": f"Bearer {os.environ['FLATKEY_API_KEY']}",
        "Content-Type": "application/json",
    },
    json={
        "contents": [{
            "parts": [{
                "text": "A product photo of a translucent purple glass bottle on a white background"
            }]
        }],
        "generationConfig": {
            "responseModalities": ["TEXT", "IMAGE"]
        },
    },
    timeout=180,
)
response.raise_for_status()

parts = response.json()["candidates"][0]["content"]["parts"]
image = next(part["inlineData"] for part in parts if "inlineData" in part)
suffix = ".jpg" if image["mimeType"] == "image/jpeg" else ".png"
output = Path(f"generated{suffix}")
output.write_bytes(base64.b64decode(image["data"]))
print(output)
```

### Gunakan Node.js dan simpan gambar

```javascript theme={"dark"}
import { writeFileSync } from "node:fs";

const model = "gemini-2.5-flash-image";
const response = await fetch(
  `https://router.flatkey.ai/v1beta/models/${model}:generateContent`,
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.FLATKEY_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      contents: [{
        parts: [{
          text: "A product photo of a translucent purple glass bottle on a white background",
        }],
      }],
      generationConfig: {
        responseModalities: ["TEXT", "IMAGE"],
      },
    }),
  },
);

if (!response.ok) {
  throw new Error(`${response.status}: ${await response.text()}`);
}

const result = await response.json();
const image = result.candidates[0].content.parts.find(
  (part) => part.inlineData,
).inlineData;
const suffix = image.mimeType === "image/jpeg" ? "jpg" : "png";
writeFileSync(`generated.${suffix}`, Buffer.from(image.data, "base64"));
```

## Field permintaan Gemini

<ParamField body="contents" type="array" required>
  Konten percakapan. Untuk pembuatan gambar dari teks, masukkan deskripsi gambar dalam `parts[].text`.
</ParamField>

<ParamField body="generationConfig.responseModalities" type="array" required>
  Modalitas respons. Gunakan `["TEXT", "IMAGE"]` untuk teks dan gambar, atau `["IMAGE"]` untuk meminta gambar saja.
</ParamField>

<ParamField body="model" type="string" required>
  ID model muncul di path URL, bukan di dalam body permintaan. Contohnya, `gemini-3-pro-image`.
</ParamField>

## Format respons Gemini

```json theme={"dark"}
{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "text": "Here is the generated image."
          },
          {
            "inlineData": {
              "mimeType": "image/png",
              "data": "iVBORw0KGgoAAA..."
            }
          }
        ]
      }
    }
  ]
}
```

<Note>
  `inlineData.data` berisi gambar yang dikodekan dalam base64. Sebuah respons dapat berisi teks dan beberapa bagian gambar. Iterasi melalui `parts` alih-alih mengasumsikan bahwa gambar selalu berada di item pertama.
</Note>

## Pemecahan masalah

### API mengembalikan get\_channel\_failed

Pastikan endpoint sesuai dengan modelnya:

* Gunakan `/v1/images/generations` untuk membuat gambar dengan `gpt-image-2`.
* Gunakan `/v1/images/edits` untuk mengedit dengan `gpt-image-2`.
* Gunakan `/v1beta/models/{model}:generateContent` untuk model gambar Gemini.

### Respons Gemini tidak mengandung gambar

Pastikan `generationConfig.responseModalities` berisi `"IMAGE"`. Periksa juga respons untuk kesalahan atau pemblokiran keamanan.

## Tulis prompt yang efektif

* Tentukan gayanya: *fotorealistis, lukisan minyak, cat air, render 3D*
* Sertakan detail pencahayaan: *cahaya senja, pencahayaan studio, bayangan dramatis*
* Tentukan komposisinya: *close-up, sudut lebar, pandangan dari atas, orientasi potret*
* Tambahkan pengubah kualitas: *sangat detail, 4K, fotografi profesional*
