
Een betrouwbare integratie voor een strip met vier panelen heeft meer nodig dan één generatieverzoek. De minimale productielus is:
upload character reference -> create four panels -> poll terminal status -> inspect every panel -> repair only the failed panel
Deze snelstart implementeert die lus in TypeScript. Hij houdt de API-sleutel op de server, levert een stabiel karakterrecord, gebruikt een idempotency key voor het create-verzoek, registreert verstreken tijd en fouten, en richt zich op één paneel wanneer de continuïteit wordt doorbroken.
Begin met de LlamaGen.AI Comic API, en gebruik daarna het volledige voorbeeld hieronder als basis voor een server-side integratie.
Dit artikel is contractmatig gecontroleerd aan de hand van de live Comic API-documentatie op 10 oktober 2026.
| Check | Geverifieerd gedrag |
|---|---|
| Authenticatie | Bearer-token op elk verzoek |
| Productie-basis-URL | https://api.llamagen.ai |
| Upload | POST /v1/comics/upload retourneert een herbruikbare fileUrl |
| Create | POST /v1/comics/generations accepteert fixPanelNum: 4 en comicRoles |
| Status | GET /v1/comics/generations/{generationId} retourneert status en paneeluitvoer |
| Reparatie | PATCH /v1/comics/generations/{generationId} kan één op nul gebaseerde paneelindex opnieuw genereren |
| Verbruik | Create- en repair-antwoorden tonen usage-data voor je eigen logs |
We hebben geen benchmark voor latentie of slagingspercentage verzonnen. Die waarden verschillen per account, wachtrij, modelconfiguratie en invoer. Het voorbeeld registreert je werkelijke verstreken tijd, API-verbruik, eindstatus en foutdetails, zodat je in je eigen omgeving een verdedigbare benchmark kunt opstellen.
De prompt vertelt het model wat er gebeurt. De karakterreferentie vertelt het model met wie het verhaal gebeurt.
Houd voor een terugkerende rol deze velden stabiel:
In dit voorbeeld is de rol een koerier met kort donker haar, een gele regenjas en een rode schoudertas. Die details zijn compact genoeg om te herhalen en onderscheidend genoeg om te controleren.

Gebruik Node.js 20 of nieuwer zodat fetch, FormData en Blob beschikbaar zijn. Bewaar de sleutel in een omgevingsvariabele die alleen op de server beschikbaar is.
export LLAMAGEN_API_KEY="your_server_side_key"
Stel deze sleutel niet bloot in een browserbundle, mobiele applicatie, openbare repository of client-side verzoek. Als je product een frontend heeft, stuur dan de briefing van de gebruiker naar je eigen backend en laat die backend LlamaGen.AI aanroepen.
De workflow heeft vier netwerkbewerkingen:

Sla het volgende op als comic-quickstart.ts, plaats een karakterafbeelding op ./courier-reference.png, en voer het uit vanuit je serveromgeving.
Een overzicht van de nieuwste LlamaGen-functiereleases, productverbeteringen, designupdates en belangrijke bugfixes.
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();
Voer het uit met:
npx tsx comic-quickstart.ts
Het voorbeeld logt bewust gestructureerde objecten. Stuur in productie dezelfde velden naar je observability-systeem en voeg je eigen request- of projectidentifier toe.
Keur een pagina niet goed omdat die er aantrekkelijk uitziet op miniatuurformaat. Controleer elk paneel aan de hand van de karaktervergrendeling:
| Check | Voorwaarde om te slagen |
|---|---|
| Gezicht | Zelfde leeftijd, gelaatstrekken en verhoudingen |
| Haar | Zelfde silhouet, lengte en kleur |
| Kostuum | Gele jas blijft geel en behoudt dezelfde constructie |
| Attribuut | Rode schoudertas blijft aanwezig en correct geplaatst |
| Volgorde | Sleutel, deur, weer en bewegingsrichting blijven consistent |
| Compositie | Elk paneel heeft een duidelijke verhaalfunctie |
| Ruimte voor lettering | Gezichten en essentiële handelingen worden niet geblokkeerd |
Behandel dit als machineleesbare kwaliteitscontrole als je een grotere pipeline bouwt. Sla per paneel een reden voor slagen/falen op, niet alleen een algemene goedkeuring op paginaniveau.
De snelste reparatieprompt noemt zowel de nieuwe handeling als de elementen die niet mogen veranderen.
Panel 3 repair:
Ren runs toward the service door.
Preserve his exact face, short dark hair, yellow rain jacket,
and visible red messenger bag.
Keep the rainy station and left-to-right movement.
De paneelindexen zijn nulgebaseerd, dus het zichtbare derde paneel is panel: 2. Het update-endpoint kan panelPrompt, referentie-images of een vervangende caption accepteren.

Dit is operationeel belangrijk. Alle vier panelen opnieuw opbouwen kan drie nieuwe continuïteitsrisico's introduceren terwijl je één oud probleem oplost. Gericht herstellen verkleint het beoordelingsoppervlak.
Voeg deze controles toe voordat je de integratie uitrolt:
Schakel voor langere sequenties over van fixPanelNum naar pagination.totalPages en pagination.panelsPerPage. Verstuur niet beide modi in één create-verzoek.
Gebruik de Comic API wanneer strips binnen je eigen product, batchjob, educatieve tool, publicatiepipeline of klantworkflow worden gegenereerd.
Gebruik de visuele editor wanneer een maker het verhaal interactief wil verkennen, alternatieven wil vergelijken of elke pagina handmatig art-directen. Veel teams gebruiken beide: de API maakt en logt de herhaalbare eerste versie, terwijl de editor uitzonderlijke revisies afhandelt.
Als je verhaalstructuur nog verandert, plan die dan voordat je definitieve panelen maakt. De volgende gids, Storyboard First or Comic Panels First?, laat zien hoe je het verschil in herwerk meet.
Ja. Stuur fixPanelNum: 4 voor een verzoek met één pagina en vier panelen. Gebruik voor meerdere pagina's in plaats daarvan het pagination-object.
Upload een schone referentieafbeelding, geef de geretourneerde fileUrl door in comicRoles[].image, houd de rolnaam en kostuumbeschrijving stabiel, en controleer elk geretourneerd paneel voordat je doorgaat met de sequentie.
Ja. Stuur een PATCH-verzoek met de nulgebaseerde pagina- en paneelindexen plus een nieuwe panelPrompt, optionele referentieafbeeldingen of een caption.
Gebruik het door LlamaGen.AI gedocumenteerde idempotency-gedrag zodat netwerkretries niet per ongeluk dubbel werk creëren. Gebruik alleen een nieuwe sleutel wanneer je bewust een nieuwe generatie wilt.
Nee. Het toont de instrumentatie die nodig is om je echte cijfers vast te leggen. Publiceer latentie, usage en foutpercentages pas nadat je dezelfde invoer herhaaldelijk in je eigen account hebt uitgevoerd en de omstandigheden hebt geregistreerd.
Geschreven door Jay en technisch beoordeeld aan de hand van het live endpoint-contract door het contentteam van LlamaGen.AI. Productgedrag kan veranderen; de gelinkte documentatie is de bron van waarheid.
Klaar om de workflow te bouwen? Open de LlamaGen.AI Comic API, maak een server-side sleutel aan en voer de snelstart uit met je eigen karakterreferentie.
Popular creator tools
Go from comics and storyboards to stylized photos with LlamaGen.
Visualize every scene before production starts.
© 2026 LlamaGen.Ai Alle rechten voorbehouden
Toonaangevend in de toekomst van AI-stripgeneratie



