
Integrasi komik empat panel yang andal membutuhkan lebih dari satu permintaan generasi. Siklus produksi minimum adalah:
unggah referensi karakter -> buat empat panel -> polling status terminal -> periksa setiap panel -> perbaiki hanya panel yang gagal
Quickstart ini mengimplementasikan siklus tersebut dalam TypeScript. Ini menjaga kunci API tetap di server, menyediakan catatan karakter yang stabil, menggunakan kunci idempotensi untuk permintaan create, mencatat waktu berjalan dan kegagalan, serta menargetkan satu panel saat kontinuitas rusak.
Mulailah dengan LlamaGen.AI Comic API, lalu gunakan contoh lengkap di bawah ini sebagai dasar integrasi sisi server.
Artikel ini diperiksa terhadap kontrak langsung dokumentasi Comic API pada 10 Oktober 2026.
| Check | Perilaku yang diverifikasi |
|---|---|
| Authentication | Bearer token pada setiap permintaan |
| Production base URL | https://api.llamagen.ai |
| Upload | POST /v1/comics/upload mengembalikan fileUrl yang dapat digunakan kembali |
| Create | POST /v1/comics/generations menerima fixPanelNum: 4 dan comicRoles |
| Status | GET /v1/comics/generations/{generationId} mengembalikan status dan output panel |
| Repair | PATCH /v1/comics/generations/{generationId} dapat meregenerasi satu panel berbasis nol |
| Usage | Respons create dan repair menampilkan data penggunaan untuk log Anda sendiri |
Kami tidak mengarang tolok ukur latensi atau tingkat keberhasilan. Nilai tersebut bervariasi berdasarkan akun, antrean, konfigurasi model, dan input. Contoh ini mencatat waktu berjalan nyata, penggunaan API, status terminal, dan detail kegagalan Anda sehingga Anda dapat menghasilkan tolok ukur yang dapat dipertanggungjawabkan di lingkungan Anda sendiri.
Prompt memberi tahu model apa yang terjadi. Referensi karakter memberi tahu model kepada siapa cerita itu terjadi.
Untuk peran yang berulang, jaga agar field ini tetap stabil:
Dalam contoh ini, perannya adalah seorang kurir dengan rambut pendek gelap, jaket hujan kuning, dan tas selempang merah. Detail-detail itu cukup ringkas untuk diulang dan cukup khas untuk diaudit.

Gunakan Node.js 20 atau yang lebih baru agar fetch, FormData, dan Blob tersedia. Simpan kunci dalam variabel lingkungan yang hanya untuk server.
export LLAMAGEN_API_KEY="your_server_side_key"
Jangan pernah mengekspos kunci ini dalam bundle browser, aplikasi mobile, repositori publik, atau permintaan sisi klien. Jika produk Anda memiliki frontend, kirim brief pengguna ke backend Anda sendiri dan biarkan backend itu memanggil LlamaGen.AI.
Alur kerja ini memiliki empat operasi jaringan:

Simpan yang berikut ini sebagai comic-quickstart.ts, letakkan gambar karakter di ./courier-reference.png, lalu jalankan dari lingkungan server Anda.
Ringkasan rilis fitur terbaru LlamaGen, peningkatan produk, pembaruan desain, dan perbaikan bug penting.
import { basename } from "node:path";
import { readFile } from "node:fs/promises";
import { randomUUID } from "node:crypto";
const API_BASE = "https://api.llamagen.ai";
const API_KEY = process.env.LLAMAGEN_API_KEY;
if (!API_KEY) {
throw new Error("Set LLAMAGEN_API_KEY before running this script.");
}
type UploadResponse = {
code?: number;
fileUrl: string;
};
type Usage = {
total_comics?: number;
redraw_panels?: number;
amount?: number;
};
type Generation = {
id: string;
status: "LOADING" | "PROCESSED" | "FAILED" | "CANCELLED" | string;
usage?: Usage;
comics?: Array<{
page?: number;
panels?: Array<{
panel?: number;
image?: string;
assetUrl?: string;
caption?: string;
}>;
}>;
error?: unknown;
};
async function api<T>(path: string, init: RequestInit = {}): Promise<T> {
const response = await fetch(`${API_BASE}${path}`, {
...init,
headers: {
Authorization: `Bearer ${API_KEY}`,
...init.headers,
},
});
const text = await response.text();
const body = text ? JSON.parse(text) : null;
if (!response.ok) {
throw new Error(
`Comic API ${response.status}: ${JSON.stringify(body)}`,
);
}
return body as T;
}
async function uploadReference(filePath: string) {
const bytes = await readFile(filePath);
const form = new FormData();
form.set("file", new Blob([bytes]), basename(filePath));
return api<UploadResponse>("/v1/comics/upload", {
method: "POST",
body: form,
});
}
async function waitForGeneration(
generationId: string,
timeoutMs = 10 * 60_000,
) {
const startedAt = Date.now();
while (Date.now() - startedAt < timeoutMs) {
const job = await api<Generation>(
`/v1/comics/generations/${generationId}`,
);
console.log(
JSON.stringify({
generationId,
status: job.status,
elapsedMs: Date.now() - startedAt,
usage: job.usage,
}),
);
if (job.status === "PROCESSED") return job;
if (job.status === "FAILED" || job.status === "CANCELLED") {
throw new Error(
`Generation ended as ${job.status}: ${JSON.stringify(job.error)}`,
);
}
await new Promise((resolve) => setTimeout(resolve, 4_000));
}
throw new Error(`Generation ${generationId} timed out.`);
}
async function main() {
const startedAt = Date.now();
try {
const reference = await uploadReference("./courier-reference.png");
const created = await api<Generation>("/v1/comics/generations", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Idempotency-Key": randomUUID(),
},
body: JSON.stringify({
prompt: [
"Create one four-panel comic page in a restrained cinematic manga style.",
"Panel 1: Ren enters a rain-soaked station and notices a golden key.",
"Panel 2: Close view as Ren lifts the key and studies it.",
"Panel 3: Ren runs toward an old locked service door.",
"Panel 4: Ren opens the door and warm light spills into the station.",
"Keep the same face, haircut, yellow jacket, and red messenger bag.",
"Leave clean space for later lettering.",
].join("\n"),
preset: "japanese_manga",
size: "1024x1024",
fixPanelNum: 4,
language: "en",
comicRoles: [
{
name: "Ren",
age: 22,
gender: "male",
dress: "yellow rain jacket, black trousers, red messenger bag",
image: reference.fileUrl,
},
],
}),
});
const firstPass = await waitForGeneration(created.id);
console.log("first_pass_complete", {
id: firstPass.id,
elapsedMs: Date.now() - startedAt,
usage: firstPass.usage,
pages: firstPass.comics?.length ?? 0,
});
// Example review result: panel 3 lost the red bag.
const repairQueued = await api<Generation>(
`/v1/comics/generations/${created.id}`,
{
method: "PATCH",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
page: 0,
panel: 2,
panelPrompt:
"Ren runs toward the service door. Preserve his exact face, short dark hair, yellow rain jacket, and visible red messenger bag.",
images: [reference.fileUrl],
}),
},
);
console.log("repair_queued", {
id: repairQueued.id,
usage: repairQueued.usage,
});
const repaired = await waitForGeneration(created.id);
console.log("workflow_complete", {
id: repaired.id,
totalElapsedMs: Date.now() - startedAt,
finalStatus: repaired.status,
});
} catch (error) {
console.error("comic_workflow_failed", {
elapsedMs: Date.now() - startedAt,
message: error instanceof Error ? error.message : String(error),
});
process.exitCode = 1;
}
}
await main();
Jalankan dengan:
npx tsx comic-quickstart.ts
Contoh ini sengaja mencatat objek terstruktur. Dalam produksi, kirim field yang sama ke sistem observabilitas Anda dan sertakan identifier permintaan atau proyek Anda sendiri.
Jangan menyetujui halaman hanya karena terlihat menarik pada ukuran thumbnail. Audit setiap panel terhadap kunci karakter:
| Check | Kondisi lulus |
|---|---|
| Face | Usia, fitur, dan proporsi yang sama |
| Hair | Siluet, panjang, dan warna yang sama |
| Costume | Jaket kuning tetap kuning dan mempertahankan konstruksi yang sama |
| Prop | Tas selempang merah tetap ada dan ditempatkan dengan benar |
| Sequence | Kunci, pintu, cuaca, dan arah gerak tetap berkesinambungan |
| Composition | Setiap panel memiliki peran cerita yang berbeda |
| Lettering space | Wajah dan aksi penting tidak terhalang |
Perlakukan ini sebagai kontrol kualitas yang dapat dibaca mesin jika Anda membangun pipeline yang lebih besar. Simpan alasan lulus/gagal per panel, bukan hanya persetujuan tingkat halaman.
Prompt perbaikan tercepat menyebutkan baik aksi baru maupun elemen-elemen yang tidak boleh berubah.
Perbaikan panel 3:
Ren berlari menuju pintu layanan.
Pertahankan wajahnya yang persis sama, rambut pendek gelap, jaket hujan kuning,
dan tas selempang merah yang terlihat.
Pertahankan stasiun yang hujan dan pergerakan dari kiri ke kanan.
Indeks panel berbasis nol, jadi panel ketiga yang terlihat adalah panel: 2. Endpoint update dapat menerima panelPrompt, images referensi, atau caption pengganti.

Ini penting secara operasional. Membangun ulang keempat panel dapat memperkenalkan tiga risiko kontinuitas baru saat memperbaiki satu risiko lama. Perbaikan terarah mempersempit permukaan tinjauan.
Sebelum mengirim integrasi, tambahkan kontrol berikut:
Untuk urutan yang lebih panjang, beralihlah dari fixPanelNum ke pagination.totalPages dan pagination.panelsPerPage. Jangan kirim kedua mode dalam satu permintaan create.
Gunakan Comic API saat komik dibuat di dalam produk Anda sendiri, batch job, alat pendidikan, pipeline penerbitan, atau alur kerja pelanggan.
Gunakan editor visual saat kreator ingin mengeksplorasi cerita secara interaktif, membandingkan alternatif, atau mengarahkan seni setiap halaman secara manual. Banyak tim menggunakan keduanya: API membuat dan mencatat first pass yang dapat diulang, sementara editor menangani revisi khusus.
Jika struktur cerita Anda masih berubah, rencanakan terlebih dahulu sebelum membuat panel final. Panduan berikutnya, Storyboard First or Comic Panels First?, menunjukkan cara mengukur perbedaan pengerjaan ulang.
Ya. Kirim fixPanelNum: 4 untuk permintaan satu halaman dengan empat panel. Untuk banyak halaman, gunakan objek pagination sebagai gantinya.
Unggah gambar referensi yang bersih, masukkan fileUrl yang dikembalikan ke dalam comicRoles[].image, pertahankan nama peran dan deskripsi kostum tetap stabil, dan audit setiap panel yang dikembalikan sebelum melanjutkan urutan.
Ya. Kirim permintaan PATCH dengan indeks halaman dan panel berbasis nol ditambah panelPrompt baru, gambar referensi opsional, atau caption.
Gunakan perilaku idempotensi yang didokumentasikan oleh LlamaGen.AI agar percobaan ulang jaringan tidak secara tidak sengaja membuat pekerjaan duplikat. Gunakan kunci baru hanya saat Anda memang sengaja menginginkan generasi baru.
Tidak. Ini menampilkan instrumentasi yang dibutuhkan untuk menangkap angka nyata Anda. Publikasikan latensi, penggunaan, dan tingkat kegagalan hanya setelah menjalankan input yang sama berulang kali di akun Anda sendiri dan mencatat kondisinya.
Ditulis oleh Jay dan ditinjau secara teknis terhadap kontrak endpoint langsung oleh tim konten LlamaGen.AI. Perilaku produk dapat berubah; dokumentasi yang ditautkan adalah sumber kebenaran.
Siap membangun alur kerja? Buka LlamaGen.AI Comic API, buat kunci sisi server, dan jalankan quickstart dengan referensi karakter Anda sendiri.
Popular creator tools
Go from comics and storyboards to stylized photos with LlamaGen.
Visualize every scene before production starts.
© 2026 LlamaGen.Ai Semua hak dilindungi
Memimpin Masa Depan Generasi Komik AI



