Pembuatan gambar
kenari menyediakan endpoint pembuatan gambar yang kompatibel dengan OpenAI Images. Endpoint ini hanya melayani model yang ditandai sebagai model gambar di katalog. Memanggilnya dengan model teks akan mengembalikan status 400.
Endpoint
Section titled “Endpoint”POST /v1/images/generations
Kirim prompt dan model, gateway mengembalikan gambar sebagai URL atau data base64. Biaya dipotong dari saldo Rupiah, per gambar.
Parameter request
Section titled “Parameter request”| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
model | string | ya | Id model gambar dari katalog, mis. gpt-image-2. |
prompt | string | ya | Deskripsi gambar yang diminta. |
n | integer | tidak | Jumlah gambar. Default 1. |
size | string | tidak | Ukuran gambar, mis. "1024x1024". Bersifat petunjuk, bukan jaminan: lihat catatan di bawah. |
background | string | tidak | "transparent", "opaque", atau "auto". "transparent" menghasilkan PNG dengan latar transparan (kanal alpha). |
response_format | string | tidak | "url" atau "b64_json". |
size diperlakukan berbeda oleh tiap model. Sebagian model memakainya apa adanya,
sebagian mengabaikannya, dan sebagian lagi hanya mengenal rasio aspek sehingga
ukuran yang dikirim dipetakan ke rasio terdekat yang didukung. Contohnya
"1792x1024" pada model berbasis rasio menghasilkan gambar 16:9 dengan jumlah
piksel yang ditentukan model, bukan persis 1792x1024. Bentuk gambar selalu
sedekat mungkin dengan yang diminta, jumlah pikselnya bisa berbeda. Kalau ukuran
piksel yang tepat itu penting, periksa dimensi gambar yang dikembalikan.
Penagihan
Section titled “Penagihan”Penagihan dihitung per gambar: n dikalikan harga per gambar model, lalu dipotong dari saldo Rupiah. Meminta empat gambar membebani empat kali harga satu gambar. Lihat Penagihan untuk detail saldo dan pemotongan.
Bentuk response
Section titled “Bentuk response”Response mengikuti bentuk OpenAI Images: objek created dan array data. Setiap elemen data berisi url (saat response_format bernilai "url") atau b64_json (saat "b64_json").
{ "created": 1718700000, "data": [ { "url": "https://..." } ]}Pekerjaan panjang dan latensi
Section titled “Pekerjaan panjang dan latensi”Pembuatan gambar bisa butuh beberapa menit. Selama pekerjaan berjalan, gateway menjaga koneksi tetap terbuka dan mengirim heartbeat tiap 20 detik supaya proxy di jalur tidak memutus koneksi yang dianggap idle.
Contoh
Section titled “Contoh”curl https://kenari.id/v1/images/generations \ -H "Authorization: Bearer kn-..." \ -H "Content-Type: application/json" \ -d '{"model":"gpt-image-2","prompt":"seekor panda merah sedang menulis kode","n":1,"size":"1024x1024"}'Python (OpenAI SDK)
Section titled “Python (OpenAI SDK)”from openai import OpenAI
client = OpenAI( base_url="https://kenari.id/v1", api_key="kn-...",)
result = client.images.generate( model="gpt-image-2", prompt="seekor panda merah sedang menulis kode", n=1, size="1024x1024",)
print(result.data[0].url)JavaScript (OpenAI SDK)
Section titled “JavaScript (OpenAI SDK)”import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://kenari.id/v1", apiKey: "kn-...",});
const result = await client.images.generate({ model: "gpt-image-2", prompt: "seekor panda merah sedang menulis kode", n: 1, size: "1024x1024",});
console.log(result.data[0].url);Edit gambar (image-to-image)
Section titled “Edit gambar (image-to-image)”POST /v1/images/edits
Endpoint ini mengedit gambar yang sudah ada: kirim satu atau lebih gambar sumber, deskripsi perubahan yang diminta, dan model gambar dari katalog. Ulangi field image (atau image[]) untuk tiap file, paling banyak 16. File ke-17 ditolak dengan 400. Request-nya multipart/form-data, bukan JSON, karena gambar dikirim sebagai file. Tiap file paling besar 25 MiB, seluruh body paling besar 32 MiB. Kalau model tidak bisa memakai sebanyak itu, request gagal dengan 503, bukan diam-diam membuang file yang berlebih.
Parameter request
Section titled “Parameter request”| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
image | file | ya | Satu atau lebih gambar sumber (PNG, JPEG, atau WebP). Ulangi field-nya, paling banyak 16 file. |
prompt | string | ya | Deskripsi perubahan yang diminta. |
model | string | ya | Id model gambar dari katalog, mis. gpt-image-2. |
mask | file | tidak | Satu file PNG mask. Area transparan menandai bagian yang boleh diedit. Tanpa mask, seluruh gambar jadi kandidat edit. |
n | integer | tidak | Jumlah gambar hasil. Default 1. Tidak mengikuti jumlah file sumber. |
size | string | tidak | Ukuran gambar, mis. "1024x1024". Bersifat petunjuk, bukan jaminan: lihat catatan di bawah. |
background | string | tidak | "opaque" atau "auto". "transparent" belum didukung untuk edit dan ditolak dengan 400. Untuk latar transparan, pakai pembuatan gambar. |
response_format | string | tidak | "url" atau "b64_json". |
Penagihan dan bentuk response sama dengan pembuatan gambar di atas: n dikalikan harga per gambar model, bukan jumlah file sumber, dipotong dari saldo Rupiah, response {created, data:[...]}.
Contoh
Section titled “Contoh”curl https://kenari.id/v1/images/edits \ -H "Authorization: Bearer kn-..." \ -F "image=@sumber.png" \ -F "image=@referensi.png" \ -F "model=gpt-image-2" \ -F "prompt=ganti langit jadi senja, pakai gaya dari gambar kedua" \ -F "n=1"from openai import OpenAI
client = OpenAI( base_url="https://kenari.id/v1", api_key="kn-...",)
result = client.images.edit( model="gpt-image-2", image=[open("sumber.png", "rb"), open("referensi.png", "rb")], prompt="ganti langit jadi senja, pakai gaya dari gambar kedua", n=1,)
print(result.data[0].url)