Permintaan pembuatan gambar yang diterima belum berarti gambarnya selesai. Aplikasi Anda perlu menyimpan ID tugas, memeriksa tugas yang sama, dan menangani permintaan yang gagal atau terputus tanpa memulai tugas baru secara tidak sengaja.
Tutorial ini membuat klien Node.js kecil di sisi server untuk menjalankan rangkaian tersebut. Perintah submit dan resume dipisahkan: yang pertama membuat tugas, sedangkan yang kedua hanya memeriksa tugas yang sudah ada. Mulailah dari ID model yang didukung API, bukan nama model yang disalin dari banner halaman utama.
Tutorial ini membahas pembuatan gambar dari teks. Tutorial ini tidak mengunggah berkas referensi, membuat antarmuka browser, atau mengukur kualitas model. Validasi menggabungkan 29 pengujian lokal dengan respons tiruan dan satu tugas gambar terkontrol di lingkungan produksi pada 4 September 2026. Tugas tersebut mengembalikan satu gambar dan mencatat biaya API sebesar 120 poin. Ini adalah satu pemeriksaan integrasi pada tanggal tertentu, bukan tolok ukur kecepatan, harga yang berlaku universal, atau jaminan ketersediaan untuk akun lain.
Gambar sampul adalah tangkapan layar katalog model yang diambil pada 4 September 2026. Anggap gambar tersebut sebagai ilustrasi pada tanggal itu, bukan penawaran harga terkini atau jaminan ketersediaan.
Poin Penting
- Simpan kunci API di server Anda, bukan di bundel browser atau repositori publik.
- Untuk tugas gambar, baca nilai numerik
data.taskIddari respons penerimaan dan simpan untuk kueri berikutnya.- Lakukan polling status tugas yang tersimpan hingga mencapai
readyataufailed. Baca URL gambar daridata.imageshanya setelah berhasil.- Batas waktu di sisi klien tidak membuktikan bahwa tugas di server gagal atau dibatalkan. Lanjutkan kueri jika Anda memiliki ID tugas; jangan mengulangi permintaan pembuatan begitu saja.
Dalam panduan ini
- Sebelum memulai
- Pilih model dan konfigurasikan kunci API Anda
- Kirim dengan cURL
- Lakukan polling dan baca URL gambar
- Contoh Node.js lengkap
- Tangani kesalahan
- Perbedaan video dan chat
- Verifikasi integrasi Anda
Sebelum memulai
Gunakan terminal pribadi atau lingkungan server dengan Node.js, kunci API, dan akun yang sudah dikonfigurasi untuk penagihan API. Contoh pendamping menggunakan fetch bawaan dan modul JavaScript, tanpa perlu memasang paket pihak ketiga. Dokumentasi API global Node menjelaskan fetch dan AbortSignal.timeout, yang digunakan klien untuk membatasi waktu setiap permintaan. Lingkungan validasi lokalnya adalah Windows dengan Node.js v22.22.1; ini merupakan catatan lingkungan pengujian, bukan klaim bahwa semua versi lain telah diuji.
Anda sebaiknya sudah terbiasa menyunting berkas, mengatur variabel lingkungan, dan membaca JSON. Periksa runtime yang terpasang sebelum melanjutkan:
node --version
Perintah tersebut seharusnya menampilkan versi yang terpasang. Perintah ini tidak menghubungi API pembuatan gambar. Simpan klien lengkap dari bagian berikutnya sebagai examples/pixmind-image.mjs di dalam folder kerja, lalu jalankan perintah-perintahnya dari folder tersebut.
Pilih prompt pengujian yang aman, tanpa data pelanggan atau materi rahasia. Tutorial ini menggunakan cangkir kopi keramik dengan latar studio, sehingga tidak memerlukan unggahan referensi. Tinjau harga API terkini untuk model yang dipilih sebelum mengirim permintaan. Jangan berasumsi bahwa kredit Studio, langganan, dan penagihan API dapat digunakan secara bergantian; katalog model menjelaskan penawaran API yang berlaku.
Jika Anda hanya ingin membuat gambar secara interaktif, panduan Image Agent menjelaskan alur tersebut. Klien dalam tutorial ini ditujukan untuk aplikasi yang secara eksplisit memberikan ID model dan menangani responsnya sendiri.
Pilih model dan konfigurasikan kunci API Anda
Gunakan ID model yang didukung API dan parameter yang didukung model tersebut. Contoh ini memilih nano-banana-pro, dengan aspectRatio: "1:1" dan resolution: "1K", sesuai permintaan gambar dalam Panduan Cepat API. Permintaan GET /models dengan autentikasi dan pengujian produksi mengonfirmasi kombinasi tersebut untuk akun pengujian pada 4 September 2026. Periksa kembali ketersediaan dan dukungan parameter untuk akun Anda sendiri sebelum menjalankan permintaan langsung. Mengubah string model saja tidak cukup untuk menjamin bagian lain dari permintaan tetap valid.
Buat kunci di konsol API, lalu berikan ke proses server sebagai PIXMIND_API_KEY. Gunakan mekanisme pengelolaan rahasia privat Anda jika tersedia. Contoh berikut menunjukkan sintaks variabel lingkungan dengan nilai pengganti, bukan kredensial yang berfungsi.
Untuk PowerShell:
$env:PIXMIND_API_KEY = "REPLACE_WITH_YOUR_PRIVATE_API_KEY"
$env:PIXMIND_MODEL = "nano-banana-pro"
$env:PIXMIND_PROMPT = "A ceramic coffee cup on a plain studio background, soft side lighting, no text"
Untuk Bash:
export PIXMIND_API_KEY="REPLACE_WITH_YOUR_PRIVATE_API_KEY"
export PIXMIND_MODEL="nano-banana-pro"
export PIXMIND_PROMPT="A ceramic coffee cup on a plain studio background, soft side lighting, no text"
Penetapan nilai ini mengonfigurasi shell saat ini dan proses yang diluncurkan darinya. Penetapan ini tidak membuat tugas. Lindungi riwayat shell dan rekaman saat memasukkan rahasia yang sebenarnya, dan jangan pernah menyimpannya ke sistem kontrol versi. Ikuti panduan autentikasi untuk memisahkan kunci pengembangan dan produksi, serta merotasi kunci setelah terekspos.
URL dasar untuk tutorial ini adalah:
https://aihub-admin.aimix.pro/api-platform/v1
Tambahkan /generations atau /tasks/{taskId} ke URL dasar tersebut. Jangan menambahkan /v1 untuk kedua kalinya. Penemuan model tersedia melalui GET /models; katalog merupakan tempat yang lebih praktis untuk membaca kemampuan masing-masing model sebelum memilih parameter.
Kirim permintaan gambar pertama Anda dengan cURL
Permintaan cURL adalah alternatif untuk perintah Node.js submit, bukan langkah penyiapan yang wajib dijalankan terlebih dahulu. Keduanya mengirim permintaan pembuatan. Menjalankan keduanya dapat membuat dua tugas yang dikenai biaya. Jika Anda mengirim dengan cURL, gunakan perintah Node.js resume setelahnya dengan ID tugas yang dikembalikan.
Contoh ini menggunakan sintaks Bash. Di PowerShell, gunakan klien Node.js di bawah, alih-alih menempelkan sintaks penyambungan baris Bash ke terminal.
curl --connect-timeout 10 --max-time 30 \
--request POST \
'https://aihub-admin.aimix.pro/api-platform/v1/generations' \
--header "Authorization: Bearer $PIXMIND_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "nano-banana-pro",
"type": "image",
"prompt": "A ceramic coffee cup on a plain studio background, soft side lighting, no text",
"aspectRatio": "1:1",
"resolution": "1K"
}'
Prompt dan parameter dalam isi permintaan cURL ini adalah nilai literal. Mengubah PIXMIND_PROMPT tidak mengubah JSON ini; variabel lingkungan tersebut dibaca oleh klien Node.js. Perbedaan ini membantu memisahkan permintaan yang ingin Anda kirim dari konfigurasi shell yang digunakan untuk menjalankannya.
Berikut adalah ilustrasi respons penerimaan yang dipersingkat. ID di dalamnya adalah nilai pengganti, bukan ID pengujian produksi; 12345 bukan tugas yang seharusnya Anda kueri.
{
"code": 1000,
"message": "success",
"data": {
"id": "img_12345",
"taskId": 12345
}
}
Respons media produksi yang diuji membungkus data keberhasilan dalam objek dengan code, message, data, dan timestamp; ilustrasi ini menghilangkan penanda waktu dan bidang lainnya. Untuk alur ini, keberhasilan memerlukan respons HTTP yang berhasil sekaligus respons aplikasi yang valid. Baca data.taskId, bukan data.id: bidang yang terakhir mungkin berisi string berawalan seperti img_12345, sedangkan jalur kueri tugas menggunakan ID numerik.
Segera simpan ID numerik tersebut. Jika permintaan melewati batas waktu sebelum Anda menerimanya, hentikan proses dan cocokkan pengiriman tersebut dengan catatan tugas akun Anda atau hubungi dukungan. Mengulangi POST bukan pengganti yang aman untuk memastikan apa yang terjadi.
Lakukan polling status tugas dan baca URL gambar
Kueri tugas yang sudah ada hingga mencapai status akhir. Dokumentasi Tugas Asinkron menjelaskan pending, processing, ready, dan failed. Hanya dua status terakhir yang mengakhiri alur polling ini.
Submit once
|
Save numeric taskId
|
GET /tasks/{taskId} <--- wait, then query again
| ^
+--- pending / processing ---+
|
+--- ready ---> read images, stop
|
+--- failed ---> report failure, stop
Untuk kueri manual di Bash, ganti ID contoh dengan ID Anda sendiri:
TASK_ID="REPLACE_WITH_YOUR_NUMERIC_TASK_ID"
curl --connect-timeout 10 --max-time 30 \
"https://aihub-admin.aimix.pro/api-platform/v1/tasks/$TASK_ID" \
--header "Authorization: Bearer $PIXMIND_API_KEY"
Dalam kontrak respons media saat ini, bidang yang Anda perlukan memiliki peran berbeda:
| Bidang | Maknanya bagi klien ini |
|---|---|
data.taskId |
Pengenal numerik yang digunakan untuk mengueri tugas yang sudah ada |
data.status |
Menentukan apakah harus terus menunggu, membaca hasil, atau berhenti karena gagal |
data.images |
Larik URL gambar keluaran, digunakan setelah ready |
data.videoUrl |
Bidang keluaran video, bukan larik hasil gambar |
Respons ready tanpa URL gambar yang dapat digunakan bukanlah hasil gambar yang berhasil bagi aplikasi Anda. Tampilkan ketidaksesuaian tersebut beserta ID tugas agar dapat diselidiki. Jangan menggantinya dengan URL contoh atau melaporkan bahwa gambar telah diunduh.
Klien menampilkan URL gambar yang dikembalikan; klien tidak mengambil atau mengarsipkan berkas gambarnya. Jika aplikasi Anda memerlukan penyimpanan jangka panjang, rancang sebagai langkah terpisah dan pastikan ketentuan retensi serta penggunaan aset yang terkait. Jangan menyimpulkan adanya jaminan penyimpanan permanen hanya karena tersedia URL.
Jalankan contoh Node.js lengkap
Gunakan submit untuk satu tugas baru, atau resume untuk tugas yang sudah ada. Menjalankan skrip tanpa argumen akan menampilkan petunjuk penggunaan dan tidak melakukan panggilan API. Perilaku bawaan ini mencegah pembuatan tugas baru ketika Anda sekadar memulai ulang atau memeriksa CLI secara singkat.
Simpan seluruh kode sumber di bawah sebagai examples/pixmind-image.mjs:
Kode sumber Node.js lengkap: pixmind-image.mjs
import { pathToFileURL } from 'node:url';
const BASE_URL = 'https://aihub-admin.aimix.pro/api-platform/v1';
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
export class ApiError extends Error {
constructor(message, { status = 0, transient = false, retryAfterMs = 0 } = {}) {
super(message);
Object.assign(this, { status, transient, retryAfterMs });
}
}
export function parseTaskId(value) {
if (!/^\d+$/.test(String(value))) throw new Error('Use a numeric taskId, not img_...');
const id = Number(value);
if (!Number.isSafeInteger(id) || id <= 0) throw new Error('Invalid taskId');
return id;
}
export function retryAfter(value, now) {
if (!value) return 0;
if (/^\d+(\.\d+)?$/.test(value)) return Number(value) * 1000;
const date = Date.parse(value);
return Number.isFinite(date) ? Math.max(0, date - now) : 0;
}
export function createClient({
apiKey,
fetchImpl = fetch,
now = Date.now,
wait = sleep,
random = Math.random,
requestTimeoutMs = 30_000,
pollTimeoutMs = 300_000,
maxConsecutiveErrors = 5,
} = {}) {
if (typeof apiKey !== 'string' || !apiKey.trim()) throw new Error('Set PIXMIND_API_KEY');
async function request(path, method, payload, timeoutMs = requestTimeoutMs) {
let response;
let body;
try {
response = await fetchImpl(`${BASE_URL}${path}`, {
method,
redirect: 'error',
headers: {
Authorization: `Bearer ${apiKey}`,
...(payload ? { 'Content-Type': 'application/json' } : {}),
},
...(payload ? { body: JSON.stringify(payload) } : {}),
signal: AbortSignal.timeout(Math.max(1, Math.ceil(timeoutMs))),
});
// Read the body inside the timeout/network error boundary as well.
body = await response.text();
} catch {
throw new ApiError('Network error or request timeout', { transient: true });
}
let envelope;
try { envelope = JSON.parse(body); } catch { /* handle below */ }
const transient = response.status === 429 || response.status >= 500;
if (!response.ok) {
// Do not echo arbitrary server bodies, prompts, credentials, or output URLs.
throw new ApiError(`HTTP ${response.status}; inspect the account and request`, {
status: response.status,
transient,
retryAfterMs: retryAfter(response.headers.get('retry-after'), now()),
});
}
if (!envelope || typeof envelope !== 'object') {
throw new ApiError('Expected a JSON API response');
}
if (envelope.code !== 1000 || !envelope.data) {
throw new ApiError('API returned an unsuccessful or incomplete envelope');
}
return envelope.data;
}
async function submit({ model = 'nano-banana-pro', prompt } = {}) {
if (typeof model !== 'string' || !model.trim()) throw new Error('A model is required');
if (typeof prompt !== 'string' || !prompt.trim()) throw new Error('A prompt is required');
try {
const data = await request('/generations', 'POST', {
model, type: 'image', prompt, aspectRatio: '1:1', resolution: '1K',
});
// The public media contract returns a number, not the prefixed display ID.
if (typeof data.taskId !== 'number') throw new Error('Missing numeric taskId');
return parseTaskId(data.taskId);
} catch (error) {
// A timeout or malformed response does not prove that creation failed.
throw new Error(`Submission not confirmed: ${error.message}. No automatic retry was made. Check task records before submitting again.`);
}
}
async function poll(taskId) {
const id = parseTaskId(taskId);
const deadline = now() + pollTimeoutMs;
let attempts = 0;
let errors = 0;
const timedOut = () => new Error(`Stopped waiting for task ${id}; it may still be running. Resume this ID later.`);
while (now() < deadline) {
let retryFloor = 0;
let task;
try {
task = await request(`/tasks/${id}`, 'GET', undefined,
Math.min(requestTimeoutMs, deadline - now()));
errors = 0;
} catch (error) {
if (now() >= deadline) throw timedOut();
if (!(error instanceof ApiError) || !error.transient) throw error;
errors += 1;
if (errors >= maxConsecutiveErrors) {
throw new Error(`Stopped after ${errors} consecutive query errors for task ${id}; resume this ID later.`);
}
retryFloor = error.retryAfterMs;
}
if (now() >= deadline) throw timedOut();
if (task) {
if (task.taskId !== id) throw new Error('Task response ID does not match the requested task');
if (task.status === 'failed') throw new Error(`Task ${id} failed; inspect its record before creating another task.`);
if (task.status === 'ready') {
if (!Array.isArray(task.images) || task.images.length === 0 ||
!task.images.every(url => {
try { return ['https:', 'http:'].includes(new URL(url).protocol); }
catch { return false; }
})) throw new Error(`Task ${id} is ready but has no valid image URLs`);
return task.images;
}
if (!['pending', 'processing'].includes(task.status)) {
throw new Error(`Task ${id} returned an unrecognized status; inspect its record.`);
}
}
// Client policy, not a PixMind latency guarantee or server-side retry feature.
const ceiling = Math.min(10_000, 1_000 * 2 ** Math.min(attempts++, 4));
const delay = Math.max(retryFloor, ceiling * (0.5 + 0.5 * random()));
const remaining = deadline - now();
if (delay >= remaining) {
// Never poll earlier than Retry-After just to fit the local deadline.
await wait(Math.max(0, remaining));
throw timedOut();
}
await wait(delay);
}
throw timedOut();
}
return { submit, poll };
}
export async function main(args = process.argv.slice(2), env = process.env, deps = {}) {
const log = deps.log ?? console.log;
const [mode, rawId] = args;
if (!mode) {
log('Usage: node examples/pixmind-image.mjs submit | resume TASK_ID');
return;
}
if (!((mode === 'submit' && args.length === 1) || (mode === 'resume' && args.length === 2))) {
throw new Error('Use submit, or resume followed by a numeric taskId');
}
const resumeId = mode === 'resume' ? parseTaskId(rawId) : undefined;
const client = createClient({ ...deps, apiKey: env.PIXMIND_API_KEY });
const id = resumeId ?? await client.submit({
model: env.PIXMIND_MODEL || 'nano-banana-pro',
prompt: env.PIXMIND_PROMPT || 'A studio photograph of an unbranded ceramic coffee cup on a plain background',
});
// Save this line in your application record before relying on the polling process.
log(`TASK_ID=${id}`);
log(`Resume without a new generation: node examples/pixmind-image.mjs resume ${id}`);
const images = await client.poll(id);
log(JSON.stringify({ taskId: id, images }, null, 2));
}
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
main().catch(error => { console.error(error.message); process.exitCode = 1; });
}
Pertama, periksa antarmuka perintah tanpa mengirim apa pun:
node examples/pixmind-image.mjs
Setelah memeriksa kunci, parameter model, dan perkiraan biaya, buat satu tugas:
node examples/pixmind-image.mjs submit
Ketika pembuatan berhasil, klien langsung menampilkan TASK_ID, sebelum menunggu gambar. Salin nilai sebenarnya ke tempat yang privat. Contoh ini tidak menyimpannya ke berkas atau basis data, sehingga menutup terminal dapat menghilangkan referensi pemulihan jika Anda belum menyimpan keluarannya.
Untuk melanjutkan kueri tugas, ganti 12345 dengan nilai yang telah disimpan:
node examples/pixmind-image.mjs resume 12345
Perintah ini hanya melakukan permintaan GET tugas. Perintah ini tidak membaca prompt baru dan membuat gambar lain. Status akhir yang berhasil seharusnya menghasilkan URL keluaran untuk tugas Anda sendiri; tidak ada keluaran produksi rekaan yang disediakan di sini sebagai tolok ukur.
Contoh ini menggunakan batas waktu 30 detik per permintaan HTTP dan tenggat polling lima menit. Percobaan ulang GET menggunakan jeda eksponensial dengan variasi acak, batas jeda lokal 10 detik, serta header respons Retry-After yang valid jika berlaku. Waktu tunggu lebih lama yang diminta server diutamakan; jika waktu tersebut tidak cukup dalam tenggat lokal, klien berhenti tanpa mengirim kueri lebih awal. Kesalahan GET sementara kelima secara berturut-turut mengakhiri upaya tersebut, sehingga ada empat percobaan ulang dalam rangkaian kesalahan itu. Nilai-nilai ini adalah pengaturan klien, bukan perjanjian tingkat layanan atau janji bahwa setiap gambar selesai dalam lima menit.
Pilih kebijakan waktu tunggu total yang sesuai dengan aplikasi Anda. Tugas yang berlangsung lama mungkin belum selesai ketika sesi terminal atau permintaan web berakhir. Dalam layanan yang sudah diterapkan, simpan ID tugas bersama catatan pekerjaan Anda sendiri dan sediakan endpoint status terpisah untuk browser, alih-alih mengharuskan pengguna mempertahankan satu koneksi tetap terbuka.
Tangani kesalahan tanpa menduplikasi tugas berbayar
Tangani ketidakpastian pembuatan secara berbeda dari kueri status yang gagal. GET untuk kueri tugas dapat diulang tanpa membuat tugas pembuatan baru. POST pembuatan yang responsnya hilang mungkin sudah memulai pekerjaan, sehingga contoh ini tidak pernah mengirimnya ulang secara otomatis.
| Kondisi yang diamati | Tindakan berikutnya |
|---|---|
HTTP 400 |
Periksa struktur permintaan, ID model, dan parameter yang didukung sebelum mencoba lagi secara sengaja. |
HTTP 401 atau 403 |
Periksa autentikasi dan akses. Jangan masukkan kunci ke log saat melakukan debug. |
HTTP 404 untuk kueri tugas |
Periksa ID numerik yang tersimpan dan akun pemilik tugas. Jangan menggantinya dengan ID tugas milik orang lain. |
HTTP 429 pada GET tugas |
Tunggu sesuai header Retry-After yang valid dan kebijakan percobaan ulang terbatas pada klien. |
| Kesalahan jaringan atau kesalahan server sementara pada GET tugas | Ulangi kueri yang sama dengan jeda, lalu berhenti sesuai batas yang dikonfigurasi. |
Status tugas failed |
Hentikan kueri dan laporkan kegagalan tugas. Pembuatan baru memerlukan keputusan terpisah. |
Pembuatan melewati batas waktu, JSON tidak valid, atau taskId tidak ada |
Perlakukan hasil pembuatan sebagai tidak diketahui. Periksa catatan tugas sebelum mengirim lagi. |
Jangan berasumsi semua kesalahan memiliki struktur respons yang sama. Dalam pemeriksaan produksi 4 September, GET /models tanpa autentikasi mengembalikan HTTP 401 dengan hanya code dan message; respons media yang berhasil dengan autentikasi juga menyertakan data dan timestamp. Karena itu, tutorial ini tidak menjanjikan adanya requestId, penanda retryable, atau bidang harga pada setiap respons. Kasus kesalahan lainnya di atas menjelaskan penanganan oleh klien, bukan klaim bahwa setiap kasus telah direproduksi di produksi. Simpan status HTTP dan pesan aplikasi yang sudah dibersihkan dari informasi sensitif jika tersedia; perlakukan isi respons yang rusak sebagai kesalahan, alih-alih membiarkan aplikasi berhenti mendadak di dalam JSON.parse.
Polling yang melewati batas waktu berarti klien berhenti menunggu, bukan berarti tugas di server dibatalkan. Simpan ID dan lanjutkan nanti. Status yang tidak dikenal juga bukan bukti keberhasilan: klien ini berhenti dan melaporkannya untuk diperiksa. Jangan menganggap tugas “selesai” hanya karena suatu nilai tidak tercantum dalam pernyataan switch.
Untuk pemecahan masalah, simpan ID tugas, ID model, operasi, status HTTP, dan perkiraan waktu kejadian. Hindari mencatat header otorisasi atau isi permintaan lengkap yang memuat prompt privat. Periksa apakah isi respons diagnostik atau URL keluaran mengandung informasi sensitif sebelum membagikannya.
Sesuaikan pola untuk video dan chat
Video dapat menggunakan pola kirim lalu polling yang sama, tetapi memerlukan validasi permintaan dan pembaca hasil tersendiri. Periksa media masukan, durasi, resolusi, dan opsi audio yang diwajibkan model video pilihan Anda, alih-alih langsung menggunakan kembali bidang dalam isi permintaan gambar. Video yang selesai menggunakan data.videoUrl, bukan data.images.
Panduan Video Agent menjelaskan alur kerja kreatif yang interaktif. Panduan tersebut dapat membantu Anda menentukan adegan yang diinginkan sebelum mengotomatiskan pembuatan, tetapi fitur Agent bukan bukti bahwa parameter API dengan nama yang sama tersedia.
Chat merupakan jalur integrasi terpisah. Rute /chat/completions yang didokumentasikan kompatibel dengan OpenAI dan mengembalikan respons chat, atau aliran data ketika streaming diminta. Jangan masukkan respons tersebut ke parser data.taskId pada klien gambar. URL dasar yang sama tidak berarti struktur respons semua endpoint juga sama.
Batasi cakupan klien gambar hingga jalur tersebut terverifikasi. Tambahkan adaptor video atau klien chat secara terpisah, dengan pengujian untuk struktur respons masing-masing. Pemisahan itu lebih mudah dipahami dibandingkan satu fungsi yang menebak apakah objek yang dikembalikan merupakan tugas gambar, tugas video, atau pesan chat.
Verifikasi integrasi Anda dan tentukan langkah berikutnya
Pengujian lokal dengan respons tiruan memeriksa perilaku klien tanpa menghabiskan saldo API. Rangkaian pengujian pendamping lulus 29 pengujian dalam lingkungan Windows dan Node.js yang disebutkan, termasuk alur pengiriman satu POST, pelanjutan hanya dengan GET, respons yang rusak, kegagalan akhir, tenggat, dan batas percobaan ulang. Simpan berkas pengujian pendamping di samping kode sumber klien, lalu jalankan rangkaian pengujian dari folder tutorial:
node --test examples/pixmind-image.test.mjs
Pengujian dengan respons tiruan tidak membuktikan ketersediaan atau penagihan di produksi. Pemeriksaan terkontrol yang terpisah pada 4 September 2026 menggunakan klien yang sama dengan cakupan tercatat berikut:
| Butir pengujian | Hasil yang diamati |
|---|---|
| Permintaan | Satu POST /generations, menggunakan nano-banana-pro, type: "image", aspectRatio: "1:1", dan resolution: "1K" |
| Prompt | A studio photograph of an unbranded ceramic coffee cup on a plain background |
| Referensi pemulihan | ID tugas numerik 64114, disimpan sebelum polling; ini merupakan referensi bukti, bukan ID untuk dikueri pembaca |
| Penyelesaian | Delapan kueri GET untuk tugas yang sama; status akhir ready, dengan satu URL di data.images |
| Pemeriksaan keluaran | Gambar yang dikembalikan berhasil dimuat dengan ukuran 1.024 × 1.024 piksel dan terlihat menampilkan cangkir keramik pada latar polos |
| Penagihan | Respons harga API mencantumkan 120 poin untuk konfigurasi ini; buku besar API yang tertaut ke tugas mencatat pendebitan 120 poin |
Pemeriksaan tersebut menggunakan satu kunci API proyek yang sudah ada, prompt yang tidak sensitif, tanpa unggahan referensi, dan tanpa percobaan ulang pembuatan otomatis. Entri buku besar dicocokkan dengan ID tugas, bukan disimpulkan dari tampilan saldo Studio. Hanya satu konfigurasi ini dan alur gambar yang berhasil yang diuji secara langsung; video, chat, penagihan saat gagal, pengembalian dana, dan keandalan dalam pengulangan tidak diuji. Periksa kembali harga sebelum pengiriman Anda sendiri, alih-alih menganggap biaya historis ini sebagai penawaran yang terus berlaku.
Sebelum menghubungkan contoh ini ke alur kerja nyata yang digunakan pengguna, periksa bahwa:
- Kunci tetap berada di server dan tidak ada dalam bundel klien, tangkapan layar, maupun log publik.
- Model yang dipilih dan setiap parameter didukung oleh penawaran API saat ini.
- Pengiriman yang diterima memberikan ID tugas numerik yang dapat Anda ambil kembali.
resumetidak melakukan POST pembuatan, termasuk setelah kesalahan kueri sementara.- Kegagalan tugas, hasil kosong, dan batas waktu lokal menghasilkan keluaran diagnostik yang berbeda.
- Respons pembuatan yang hilang tidak memicu pengiriman kedua secara otomatis.
Untuk pemeriksaan langsung terkontrol Anda sendiri, catat akun, model, cakupan biaya yang disetujui, permintaan yang sudah dibersihkan dari informasi sensitif, ID tugas, respons akhir, dan entri penagihan yang sebenarnya. Periksa keluaran secara terpisah dari sekadar memastikan URL-nya ada. Jangan menjalankan “uji dasar” berulang kali tanpa mempertimbangkan bahwa setiap pengiriman baru dapat membuat tugas berbayar.
Setelah siap, buat kunci API dan pilih satu metode pengiriman. Kembangkan alur tugas tersimpan terlebih dahulu sebelum menambahkan antrean, unggahan, atau pemrosesan batch. Jika langkah berikutnya adalah mengintegrasikan aset yang dihasilkan ke proses peninjauan kreatif, alur kerja iklan produk Canvas menyediakan contoh terpisah yang dijalankan manusia; ini bukan janji bahwa proyek Canvas dapat dieksekusi melalui API ini.
Penanggung jawab editorial: PixMind Editorial Team adalah nama penulis organisasi untuk tutorial ini. Dasar buktinya meliputi dokumentasi resmi, implementasi pengontrol media proyek, 29 pengujian lokal dengan respons tiruan, serta satu pemeriksaan produksi yang dijelaskan di atas, semuanya ditinjau pada 4 September 2026. Catatan tugas dan penagihan yang sudah dibersihkan dari informasi sensitif disimpan untuk verifikasi editorial. Tidak ada klaim tentang kredensial seorang insinyur tertentu, hasil perbandingan kualitas model, atau tolok ukur kinerja.



