
Güvenilir bir dört panelli çizgi roman entegrasyonu, tek bir üretim isteğinden fazlasını gerektirir. Üretim için gereken minimum döngü şudur:
karakter referansını yükle -> dört panel oluştur -> terminal durumu yokla -> her paneli incele -> yalnızca başarısız paneli onar
Bu hızlı başlangıç, bu döngüyü TypeScript ile uygular. API anahtarını sunucuda tutar, kararlı bir karakter kaydı sağlar, oluşturma isteği için bir idempotency anahtarı kullanır, geçen süreyi ve hataları kaydeder ve süreklilik bozulduğunda tek bir paneli hedefler.
LlamaGen.AI Comic API ile başlayın, ardından aşağıdaki tam örneği sunucu tarafı entegrasyonu için bir temel olarak kullanın.
Bu makale, 10 Ekim 2026 tarihinde canlı Comic API dokümantasyonu ile sözleşme bazında doğrulandı.
| Kontrol | Doğrulanan davranış |
|---|---|
| Kimlik Doğrulama | Her istekte Bearer token |
| Üretim taban URL'si | https://api.llamagen.ai |
| Yükleme | POST /v1/comics/upload yeniden kullanılabilir bir fileUrl döndürür |
| Oluşturma | POST /v1/comics/generations fixPanelNum: 4 ve comicRoles kabul eder |
| Durum | GET /v1/comics/generations/{generationId} durum ve panel çıktısını döndürür |
| Onarım | PATCH /v1/comics/generations/{generationId} sıfır tabanlı tek bir paneli yeniden oluşturabilir |
| Kullanım | Oluşturma ve onarım yanıtları kendi loglarınız için kullanım verilerini sunar |
Bir gecikme veya başarı oranı kıyaslaması uydurmadık. Bu değerler hesaba, kuyruğa, model yapılandırmasına ve girdiye göre değişir. Örnek, kendi ortamınızda savunulabilir bir kıyaslama üretebilmeniz için gerçek geçen süreyi, API kullanımını, terminal durumunu ve hata ayrıntılarını kaydeder.
Prompt modele ne olduğunu söyler. Karakter referansı ise hikâyenin kimin başına geldiğini söyler.
Tekrarlayan bir rol için şu alanları sabit tutun:
Bu örnekte rol, kısa koyu saçlı, sarı yağmurluk giyen ve kırmızı postacı çantası taşıyan bir kuryedir. Bu ayrıntılar tekrar edilebilecek kadar kısa ve denetlenebilecek kadar ayırt edicidir.

fetch, FormData ve Blob kullanılabilir olsun diye Node.js 20 veya daha yenisini kullanın. Anahtarı yalnızca sunucuya özel bir ortam değişkeninde tutun.
export LLAMAGEN_API_KEY="your_server_side_key"
Bu anahtarı bir tarayıcı paketinde, mobil uygulamada, herkese açık depoda veya istemci tarafı isteğinde açığa çıkarmayın. Ürününüzün bir frontend'i varsa, kullanıcının kısa açıklamasını kendi backend'inize gönderin ve LlamaGen.AI'yi o backend çağırsın.
İş akışında dört ağ işlemi vardır:

Aşağıdakini comic-quickstart.ts olarak kaydedin, ./courier-reference.png yoluna bir karakter görseli koyun ve bunu sunucu ortamınızdan çalıştırın.
En son LlamaGen özellik yayınları, ürün iyileştirmeleri, tasarım güncellemeleri ve önemli hata düzeltmelerinin özeti.
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();
Şununla çalıştırın:
npx tsx comic-quickstart.ts
Örnek, yapılandırılmış nesneleri bilerek loglar. Üretimde aynı alanları gözlemlenebilirlik sisteminize gönderin ve kendi istek veya proje tanımlayıcınızı ekleyin.
Bir sayfayı yalnızca küçük önizleme boyutunda çekici göründüğü için onaylamayın. Her paneli karakter kilidine göre denetleyin:
| Kontrol | Geçme koşulu |
|---|---|
| Yüz | Aynı yaş, yüz özellikleri ve oranlar |
| Saç | Aynı silüet, uzunluk ve renk |
| Kostüm | Sarı ceket sarı kalır ve aynı yapıyı korur |
| Aksesuar | Kırmızı postacı çantası mevcut kalır ve doğru yerde durur |
| Sekans | Anahtar, kapı, hava durumu ve hareket yönü tutarlı kalır |
| Kompozisyon | Her panelin farklı bir hikâye görevi vardır |
| Yazı alanı | Yüzler ve temel aksiyonlar engellenmez |
Daha büyük bir işlem hattı kuruyorsanız bunu makine tarafından okunabilir kalite kontrolü olarak ele alın. Yalnızca sayfa düzeyinde bir onay yerine, panel başına geçme/kalma nedeni saklayın.
En hızlı onarım prompt'u hem yeni aksiyonu hem de değişmemesi gereken öğeleri adlandırır.
3. panel onarımı:
Ren servis kapısına doğru koşar.
Tam yüzünü, kısa koyu saçını, sarı yağmurluğunu
ve görünür kırmızı postacı çantasını koru.
Yağmurlu istasyonu ve soldan sağa hareketi koru.
Panel indeksleri sıfır tabanlıdır, bu yüzden görünürdeki üçüncü panel panel: 2 olur. Güncelleme endpoint'i panelPrompt, referans images veya bir yedek caption kabul edebilir.

Bu operasyonel olarak önemlidir. Dört panelin tamamını yeniden oluşturmak, bir eski sorunu düzeltirken üç yeni süreklilik riski doğurabilir. Hedefli onarım, inceleme yüzeyini daraltır.
Entegrasyonu yayına almadan önce şu kontrolleri ekleyin:
Daha uzun sekanslar için fixPanelNum yerine pagination.totalPages ve pagination.panelsPerPage kullanın. Tek bir oluşturma isteğinde iki modu birden göndermeyin.
Çizgi romanlar kendi ürününüzün, toplu işinizin, eğitim aracınızın, yayıncılık işlem hattınızın veya müşteri iş akışınızın içinde oluşturuluyorsa Comic API kullanın.
Bir üretici hikâyeyi etkileşimli olarak keşfetmek, alternatifleri karşılaştırmak veya her sayfaya elle sanat yönetimi yapmak istediğinde görsel editörü kullanın. Birçok ekip ikisini de kullanır: API tekrarlanabilir ilk geçişi oluşturur ve loglar, editör ise istisnai revizyonları ele alır.
Hikâye yapınız hâlâ değişiyorsa, bitmiş paneller oluşturmadan önce planlayın. Bir sonraki rehber olan Önce Storyboard mu, Önce Çizgi Roman Panelleri mi?, yeniden çalışma farkını nasıl ölçeceğinizi gösterir.
Evet. Tek sayfalık dört panelli bir istek için fixPanelNum: 4 gönderin. Birden fazla sayfa için bunun yerine pagination nesnesini kullanın.
Temiz bir referans görseli yükleyin, dönen fileUrl değerini comicRoles[].image içinde iletin, rol adını ve kostüm açıklamasını sabit tutun ve sekansa devam etmeden önce dönen her paneli denetleyin.
Evet. Sıfır tabanlı sayfa ve panel indeksleriyle birlikte yeni bir panelPrompt, isteğe bağlı referans görselleri veya açıklama göndererek bir PATCH isteği yapın.
Ağ yeniden denemeleri yanlışlıkla yinelenen iş oluşturmaması için LlamaGen.AI tarafından belgelenen idempotency davranışını kullanın. Yalnızca bilerek yeni bir üretim istediğinizde yeni bir anahtar kullanın.
Hayır. Gerçek sayılarınızı yakalamak için gereken ölçümlemeyi gösterir. Gecikme, kullanım ve hata oranlarını yalnızca aynı girdiyi kendi hesabınızda tekrar tekrar çalıştırıp koşulları kaydettikten sonra yayınlayın.
Jay tarafından yazıldı ve canlı endpoint sözleşmesine göre LlamaGen.AI içerik ekibi tarafından teknik olarak incelendi. Ürün davranışı değişebilir; bağlantılı dokümantasyon asıl kaynaktır.
İş akışını oluşturmaya hazır mısınız? LlamaGen.AI Comic API sayfasını açın, sunucu tarafı bir anahtar oluşturun ve hızlı başlangıcı kendi karakter referansınızla çalıştırın.
Popular creator tools
Go from comics and storyboards to stylized photos with LlamaGen.
© 2026 LlamaGen.Ai Tüm hakları saklıdır
AI Çizgi Roman Üretiminin Geleceğine Öncülük Ediyoruz



