Cara termudah untuk mengotomatiskan pembuatan gambar dalam skala besar tanpa harus mengelola banyak API adalah memisahkan alur kerja dari penyedia model. Masukkan setiap permintaan gambar ke dalam satu antrean, arahkan setiap job ke ID model yang saat ini berlaku, dan kirim permintaan yang kompatibel melalui satu kunci CometAPI dan base URL yang kompatibel dengan OpenAI https://api.cometapi.com/v1.
Tutorial ini membangun pipeline tersebut di Python. Ia menerima job produk, iklan, dan konten dari antrean JSON Lines; memilih model; membatasi konkurensi; mencoba ulang kegagalan sementara; menyimpan hasil berbasis URL atau base64; serta mencatat penggunaan per job dan perkiraan biaya. Contoh ini menjaga unsur-unsur esensial produksi dalam satu blok ringkas agar Anda dapat menguji alur kerja tanpa membuat artikel ini berubah menjadi referensi kode.
Bagaimana Unified Image API Menyederhanakan Pembuatan Batch
Pada akhirnya, alur kerja akan terlihat seperti ini:
jobs.jsonl → bounded worker pool → CometAPI /v1/images/generations → object storage → manifest.jsonl
Antrean dan lapisan penyimpanan tetap milik Anda. Mengganti model gambar cukup mengubah nilai model, bukan sistem autentikasi atau rute permintaan utama. Itulah keunggulan praktis dari unified image API: pemilihan model menjadi keputusan perutean di dalam satu pipeline, bukan integrasi penyedia yang terpisah.
Apa yang Anda Butuhkan untuk Mengotomatiskan Pembuatan Gambar?
Anda memerlukan Python 3.10 atau lebih baru, paket requests, kunci CometAPI, lokasi output yang dapat ditulis, dan setidaknya satu ID model gambar yang masih berlaku.
Instal satu-satunya dependensi:
pip install requests
Atur kunci Anda di server, jangan pernah di kode browser atau repositori:
export COMETAPI_KEY="your-key"
Base URL adalah https://api.cometapi.com/v1, dan job text-to-image yang kompatibel menggunakan POST /images/generations. Sebelum melakukan deployment, verifikasi setiap model di live model catalog; katalog mengembalikan ID saat ini, endpoint yang didukung, fitur, dan metadata harga tanpa memerlukan header otorisasi.
Per 20 Agustus 2026, katalog live mencantumkan dua rute berguna berikut:
| Beban kerja | Model ID | Alasan cocok |
|---|---|---|
| Gambar produk dengan pengaturan output terkontrol | gpt-image-2 | Mengembalikan data penggunaan dan konten gambar base64 pada rute kompatibel OpenAI yang terdokumentasi |
| Konsep iklan dan konten ber-volume tinggi | doubao-seedream-4-5-251128 | Menggunakan rute pembuatan yang sama dan tercantum dengan harga per permintaan |
Tabel ini adalah titik awal, bukan klaim bahwa model-model tersebut memiliki kapabilitas yang identik. Ukuran, kualitas, format, dukungan gambar referensi, dan perilaku respons tetap spesifik per model. Periksa catatan model dan dokumentasi tertaut sebelum mengirim parameter opsional.
Cara Membangun Alur Kerja Pembuatan Gambar Batch di Python
1. Beri setiap job ID yang tahan gangguan
Gunakan satu objek JSON per baris agar antrean, ekspor basis data, atau job dari spreadsheet dapat memberi makan worker yang sama:
{"id":"sku-1001","kind":"product","prompt":"Studio product photo of a ceramic coffee dripper on a warm neutral background"}
{"id":"campaign-204","kind":"ad","prompt":"Editorial summer travel image, vivid natural light, wide composition, no text"}
{"id":"blog-088","kind":"content","prompt":"Minimal illustration of a developer automating a creative workflow, no text"}
ID tersebut menjadi nama file output dan kunci manifest. Dalam produksi, gunakan sebagai idempotency key dan lewati ID yang sudah ditandai sukses sebelum memproses ulang antrean.
2. Rute berdasarkan jenis job, lalu validasi terhadap katalog live
Contoh ini memetakan pekerjaan produk ke gpt-image-2 dan pekerjaan iklan atau konten ke doubao-seedream-4-5-251128. Sebuah job dapat menimpa pilihan tersebut dengan field model miliknya sendiri. Saat startup, worker mengunduh katalog publik dan menolak ID yang sudah tidak terdaftar lagi.
Ini lebih aman daripada menanamkan (hard-code) SDK khusus penyedia di seluruh aplikasi. Anda dapat mengubah rute dalam satu pemetaan setelah mengevaluasi kualitas, latensi, dan harga untuk prompt Anda sendiri.
3. Batasi konkurensi alih-alih meluncurkan seluruh batch
Worker dimulai dengan empat permintaan bersamaan. Angka tersebut adalah pengaturan aplikasi konservatif, bukan batas layanan universal. Ukur latensi dan respons 429 untuk akun Anda, lalu naikkan atau turunkan MAX_WORKERS secara terukur.
Hanya respons 408, 429, dan 5xx yang dicoba ulang dengan backoff eksponensial dan jitter. Kesalahan autentikasi, ID model tidak valid, dan parameter yang tidak didukung langsung gagal karena mencoba ulang permintaan buruk yang sama hanya menambah penundaan.
4. Normalisasi hasil sebelum penyimpanan
Model gambar tidak selalu mengembalikan kontainer yang sama. Respons GPT Image yang terdokumentasi berisi data[0].b64_json; model kompatibel lainnya mungkin mengembalikan data[0].url. Worker menangani keduanya, menulis gambar ke file sementara, dan mengganti namanya hanya setelah unduhan atau dekode berhasil.
Untuk produksi, ganti direktori lokal output/ dengan S3, R2, GCS, atau penyimpanan objek lainnya. Jangan memperlakukan URL yang dihosting penyedia sebagai penyimpanan permanen kecuali kebijakan retensinya secara eksplisit menyatakan demikian.
5. Catat penggunaan, percobaan, dan perkiraan biaya
Setiap hasil menjadi baris manifest ringkas dengan ID job, model, path tersimpan, status, dan perkiraan biaya USD ketika katalog live menyediakan data harga yang cukup. Job yang gagal menyimpan error alih-alih hilang dari batch.
Skrip Python Lengkap untuk Pembuatan Gambar Batch
Simpan berikut sebagai batch_image_pipeline.py, letakkan antrean di sebelahnya sebagai jobs.jsonl, lalu jalankan python3 batch_image_pipeline.py.
import base64, json, os, random, time
from concurrent.futures import ThreadPoolExecutor
from pathlib import Path
import requests
BASE_URL = "https://api.cometapi.com/v1"
KEY = os.environ["COMETAPI_KEY"]
WORKERS = int(os.getenv("MAX_WORKERS", "4"))
OUT = Path("output")
ROUTES = {
"product": "gpt-image-2",
"ad": "doubao-seedream-4-5-251128",
"content": "doubao-seedream-4-5-251128",
}
catalog = requests.get("https://api.cometapi.com/api/models", timeout=30)
catalog.raise_for_status()
CATALOG = {model["id"]: model for model in catalog.json()["data"]}
def generate(job):
model = job.get("model", ROUTES[job["kind"]])
if model not in CATALOG:
raise ValueError(f"Unknown model: {model}")
payload = {"model": model, "prompt": job["prompt"], "n": 1}
if model == "gpt-image-2":
payload.update(quality="low", size="1024x1024", output_format="jpeg")
for attempt in range(4):
response = requests.post(
f"{BASE_URL}/images/generations",
headers={"Authorization": f"Bearer {KEY}"},
json=payload,
timeout=180,
)
if response.status_code not in {408, 429} and response.status_code < 500:
break
time.sleep(2**attempt + random.random())
response.raise_for_status()
body = response.json()
item = body["data"][0]
if item.get("b64_json"):
data = base64.b64decode(item["b64_json"])
extension = body.get("output_format", "png")
else:
download = requests.get(item["url"], timeout=120)
download.raise_for_status()
data = download.content
extension = {"image/png": "png", "image/webp": "webp"}.get(
download.headers.get("content-type"), "jpg"
)
path = OUT / f"{job['id']}.{extension}"
path.write_bytes(data)
price, usage = CATALOG[model].get("pricing") or {}, body.get("usage", {})
cost = price.get("per_request")
if cost is None and price.get("input") is not None:
cost = (usage.get("input_tokens", 0) * price["input"] +
usage.get("output_tokens", 0) * price["output"]) / 1_000_000
return {"id": job["id"], "model": model, "path": str(path),
"estimated_usd": cost * price.get("ratio", 1) if cost is not None else None}
def safe_generate(job):
try:
return {"status": "success", **generate(job)}
except Exception as error:
return {"id": job["id"], "status": "failed", "error": str(error)}
OUT.mkdir(exist_ok=True)
jobs = [json.loads(line) for line in Path("jobs.jsonl").read_text().splitlines() if line]
with ThreadPoolExecutor(max_workers=WORKERS) as pool:
results = list(pool.map(safe_generate, jobs))
with (OUT / "manifest.jsonl").open("w") as manifest:
manifest.writelines(json.dumps(result) + "\n" for result in results)
Skrip menggunakan katalog saat ini pada waktu runtime, sementara dua pemetaan fallback adalah contoh yang diverifikasi pada 20 Agustus 2026. Periksa ulang sebelum mempublikasikan atau melakukan deployment pada tanggal lain.
Cara Menguji Alur Kerja Pembuatan Gambar Batch
Mulailah dengan satu job dan satu worker:
MAX_WORKERS=1 python3 batch_image_pipeline.py
Respons GPT Image yang sukses mengikuti struktur ini:
{
"created": 1776841943,
"output_format": "jpeg",
"quality": "low",
"size": "1024x1024",
"usage": {
"input_tokens": 16,
"output_tokens": 208,
"total_tokens": 224
},
"data": [{"b64_json": "<base64-image-data>"}]
}
Worker mendekode gambar, menulis output/<job-id>.jpeg, dan menambahkan satu baris sukses ke output/manifest.jsonl. Jika sebuah model mengembalikan URL, worker akan mengunduhnya dan menyimpan path lokal dalam format manifest yang sama.
Kode telah diperiksa sintaksnya secara lokal. Panggilan pembuatan live tetap memerlukan kunci CometAPI Anda, jadi jalankan uji cepat satu job sebelum menaikkan konkurensi.
Berapa Biaya Pembuatan Gambar Batch?
Penetapan harga harus diberi cap waktu karena tarif model berubah. Per 20 Agustus 2026, katalog model CometAPI live mengembalikan field harga dasar berikut dan rasio penagihan 0.8:
gpt-image-2: $5 per 1M token input dan $30 per 1M token output; menerapkan rasio yang tercantum menghasilkan tarif efektif $4 dan $24 per 1M token.doubao-seedream-4-5-251128: $0.04 per permintaan; menerapkan rasio yang tercantum menghasilkan $0.032 per permintaan.
Panduan harga CometAPI menjelaskan penagihan berbasis token untuk model dengan harga resmi dan penagihan berbasis panggilan untuk model dengan harga per permintaan. Skrip membaca katalog saat berjalan dan menggunakan aturan yang sama:
token cost = ratio × (input tokens × input rate + output tokens × output rate) / 1,000,000
request cost = ratio × per-request price
Sebagai contoh, respons GPT Image yang terdokumentasi di atas melaporkan 16 token input dan 208 token output. Menggunakan nilai katalog 20 Agustus, hasil ilustratif tersebut diperkirakan sekitar $0.005056. Total nyata berubah tergantung model, kualitas, ukuran, prompt, percobaan ulang, dan penggunaan dalam respons. Perlakukan respons API dan dasbor penggunaan akun sebagai catatan penagihan, bukan asumsi biaya per gambar yang tetap.
Anggarkan juga untuk pekerjaan yang tidak berhasil. Upaya ulang setelah timeout yang tidak terkonfirmasi dapat menghasilkan hasil kedua yang ditagih, dan gambar yang secara teknis berhasil namun gagal tinjauan tetap menghabiskan anggaran. Lacak biaya API dan tingkat penerimaan:
effective cost per accepted image = total batch spend / approved images
Kesalahan Umum API Pembuatan Gambar dan Cara Memperbaikinya
| Gejala | Kemungkinan penyebab | Solusi |
|---|---|---|
| 401 | Kunci hilang atau tidak valid | Periksa COMETAPI_KEY di sisi server |
| 400 | Model tidak valid atau opsi tidak didukung | Periksa kembali katalog live dan hapus field khusus model |
| 429 | Konkurensi terlalu tinggi | Turunkan MAX_WORKERS dan pertahankan backoff eksponensial |
| 5xx berulang | Kegagalan hulu sementara | Coba ulang dengan batas, lalu pindahkan job ke dead-letter queue |
| Tidak ada gambar tersimpan | Respons menggunakan kontainer berbeda | Inspeksi data[0] dan dukung b64_json maupun url |
| Pengeluaran ganda | Job diputar ulang setelah kegagalan parsial | Gunakan ID yang tahan gangguan dan akui hanya setelah penyimpanan berhasil |
Jangan mencoba ulang setiap error. Permintaan 400 permanen akan tetap tidak valid, sementara loop retry 429 tanpa batas dapat mengubah lonjakan trafik menjadi backlog.
Praktik Terbaik untuk Produksi Pembuatan Gambar dalam Skala
Beralih dari JSON Lines ke antrean yang tahan gangguan ketika melibatkan banyak worker. Atur visibility timeout lebih lama dari waktu pembuatan maksimum, akui sebuah job hanya setelah gambar dan manifest tersimpan, dan kirim job yang habis dicoba ke dead-letter queue untuk ditinjau.
Simpan kontrol opsional di konfigurasi khusus model. Payload bersama sebaiknya hanya berisi field umum seperti model, prompt, dan n: 1; tambahkan quality, size, atau output_format hanya setelah dokumentasi model yang dipilih mengonfirmasinya. Jika Anda menambahkan rute fallback, pilih model yang mendukung tugas yang sama dan bangun ulang payload untuk model tersebut alih-alih memutar ulang opsi khusus penyedia secara membabi buta.
Simpan kunci API di secret manager, batasi input prompt, pindai aset yang dihasilkan sesuai kebijakan Anda, dan jauhkan URL penyedia dari catatan produk jangka panjang. Log ID job, ID model, latensi, jumlah percobaan, penggunaan, path penyimpanan, hasil tinjauan, dan tanggal snapshot katalog. Field-field tersebut memungkinkan Anda membandingkan model berdasarkan biaya per gambar yang diterima, bukan hanya harga per panggilan.
Terakhir, atur pagar pengeluaran: ukuran batch maksimum, batas percobaan ulang per job, peringatan pengeluaran harian, dan kondisi berhenti ketika tingkat persetujuan turun. Meningkatkan skala prompt yang buruk lebih cepat bukanlah optimasi.
FAQ tentang Otomatisasi Pembuatan Gambar dalam Skala
Apa cara termudah untuk mengotomatiskan pembuatan gambar dalam skala tanpa mengelola beberapa API?
Gunakan satu alur antrean dan penyimpanan, lalu kirim permintaan gambar yang kompatibel melalui satu kunci CometAPI dan https://api.cometapi.com/v1/images/generations. Ubah ID model di lapisan perutean Anda alih-alih memelihara autentikasi dan SDK penyedia yang terpisah.
Bisakah saya mengirim satu permintaan dan meminta beberapa model gambar menghasilkan sekaligus?
Contoh ini mengirim satu model per job. Fan-out adalah alur kerja aplikasi: duplikasi sebuah job dengan ID dan nilai model yang berbeda, lalu bandingkan output yang tersimpan. Ini menjaga biaya dan status tinjauan dapat diatribusikan ke tiap model.
Konkurensi berapa yang sebaiknya saya gunakan?
Tidak ada angka universal untuk setiap akun dan model. Mulailah dengan pool kecil yang dibatasi seperti empat worker, pantau latensi dan respons 429, lalu lakukan tuning berbasis bukti.
Haruskah saya menyimpan URL yang dikembalikan atau gambarnya langsung?
Simpan gambar di penyimpanan objek milik Anda. URL yang dikembalikan mungkin bersifat sementara, sementara model GPT Image dapat mengembalikan konten base64 alih-alih URL.
Bagaimana cara memilih model termurah?
Hitung biaya per gambar yang diterima, bukan hanya harga per panggilan. Sertakan biaya token atau permintaan, retry, unduhan yang gagal, aset yang ditolak, pascaproses, dan tinjauan manusia. Periksa ulang katalog model live pada hari Anda mempublikasikan atau melakukan deployment.
Di mana saya harus memverifikasi endpoint dan format respons?
Gunakan CometAPI Quick Start, dokumentasi katalog model, referensi pembuatan gambar, dan panduan harga.