
En pålidelig integration til en tegneserie med fire paneler kræver mere end én genereringsanmodning. Det minimale produktionsloop er:
upload character reference -> create four panels -> poll terminal status -> inspect every panel -> repair only the failed panel
Denne hurtigstart implementerer det loop i TypeScript. Den holder API-nøglen på serveren, leverer en stabil karakterpost, bruger en idempotency-nøgle til create-anmodningen, registrerer forløbet tid og fejl og målretter ét panel, når kontinuiteten bryder sammen.
Start med LlamaGen.AI Comic API, og brug derefter det komplette eksempel nedenfor som et baseline for server-side integration.
Denne artikel blev kontraktkontrolleret mod den live Comic API-dokumentation den 10. oktober 2026.
| Check | Verificeret adfærd |
|---|---|
| Godkendelse | Bearer-token på hver anmodning |
| Produktions-base-URL | https://api.llamagen.ai |
| Upload | POST /v1/comics/upload returnerer en genanvendelig fileUrl |
| Opret | POST /v1/comics/generations accepterer fixPanelNum: 4 og comicRoles |
| Status | GET /v1/comics/generations/{generationId} returnerer status og paneloutput |
| Reparation | PATCH /v1/comics/generations/{generationId} kan regenerere ét nulbaseret panel |
| Forbrug | Opret- og reparationssvar eksponerer forbrugsdata til dine egne logs |
Vi opfandt ikke et benchmark for latenstid eller succesrate. Disse værdier varierer efter konto, kø, modelkonfiguration og input. Eksemplet registrerer din reelle forløbne tid, API-forbrug, endelig status og fejldetaljer, så du kan udarbejde et forsvarligt benchmark i dit eget miljø.
Prompten fortæller modellen, hvad der sker. Karakterreferencen fortæller den, hvem historien sker for.
For en tilbagevendende rolle skal du holde disse felter stabile:
I dette eksempel er rollen en kurér med kort mørkt hår, en gul regnjakke og en rød skuldertaske. Disse detaljer er kompakte nok til at kunne gentages og tydelige nok til at kunne auditeres.

Brug Node.js 20 eller nyere, så fetch, FormData og Blob er tilgængelige. Opbevar nøglen i en miljøvariabel kun til serverbrug.
export LLAMAGEN_API_KEY="your_server_side_key"
Eksponér ikke denne nøgle i en browser-bundle, mobilapplikation, offentligt repository eller client-side anmodning. Hvis dit produkt har en frontend, så send brugerens brief til din egen backend og lad den backend kalde LlamaGen.AI.
Workflowet har fire netværksoperationer:

Gem følgende som comic-quickstart.ts, læg et karakterbillede i ./courier-reference.png, og kør det fra dit servermiljø.
Et overblik over de nyeste LlamaGen-funktionsudgivelser, produktforbedringer, designopdateringer og vigtige fejlrettelser.
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();
Kør det med:
npx tsx comic-quickstart.ts
Eksemplet logger bevidst strukturerede objekter. I produktion skal du sende de samme felter til dit observability-system og inkludere din egen anmodnings- eller projektidentifikator.
Godkend ikke en side, bare fordi den ser attraktiv ud i thumbnail-størrelse. Auditér hvert panel op mod karakterlåsen:
| Check | Beståelsesbetingelse |
|---|---|
| Ansigt | Samme alder, træk og proportioner |
| Hår | Samme silhuet, længde og farve |
| Kostume | Den gule jakke forbliver gul og bevarer samme konstruktion |
| Rekvisit | Den røde skuldertaske forbliver til stede og korrekt placeret |
| Sekvens | Nøgle, dør, vejr og bevægelsesretning forbliver kontinuerlige |
| Komposition | Hvert panel har en tydelig narrativ funktion |
| Plads til tekstning | Ansigter og væsentlige handlinger er ikke blokeret |
Behandl dette som maskinlæsbar kvalitetskontrol, hvis du bygger en større pipeline. Gem en bestået/ikke bestået-grund pr. panel, ikke kun en tommelfinger-op på sideniveau.
Den hurtigste reparationsprompt angiver både den nye handling og de elementer, der ikke må ændres.
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.
Panelindeksene er nulbaserede, så det synlige tredje panel er panel: 2. Update-endpointet kan acceptere panelPrompt, reference-images eller en erstatnings-caption.

Dette er vigtigt operationelt. Hvis man genopbygger alle fire paneler, kan det introducere tre nye kontinuitetsrisici, mens man retter én gammel. Målrettet reparation indsnævrer reviewfladen.
Før du sender integrationen i drift, skal du tilføje disse kontroller:
For længere sekvenser skal du skifte fra fixPanelNum til pagination.totalPages og pagination.panelsPerPage. Send ikke begge tilstande i én create-anmodning.
Brug Comic API, når tegneserier genereres inde i dit eget produkt, batchjob, uddannelsesværktøj, publiceringspipeline eller kunde-workflow.
Brug den visuelle editor, når en skaber vil udforske historien interaktivt, sammenligne alternativer eller art-directe hver side manuelt. Mange teams bruger begge dele: API'et skaber og logger den gentagelige første version, mens editoren håndterer ekstraordinære revisioner.
Hvis din historiestruktur stadig ændrer sig, så planlæg den, før du laver færdige paneler. Den næste guide, Storyboard First or Comic Panels First?, viser, hvordan man måler forskellen i omarbejde.
Ja. Send fixPanelNum: 4 for en enkelt side med fire paneler. For flere sider skal du bruge pagination-objektet i stedet.
Upload et rent referencebillede, send dets returnerede fileUrl i comicRoles[].image, hold rollenavnet og kostumebeskrivelsen stabile, og auditér hvert returneret panel, før du fortsætter sekvensen.
Ja. Send en PATCH-anmodning med de nulbaserede side- og panelindekser plus en ny panelPrompt, valgfrie referencebilleder eller caption.
Brug den idempotency-adfærd, som er dokumenteret af LlamaGen.AI, så netværks-retries ikke ved et uheld skaber duplikeret arbejde. Brug kun en ny nøgle, når du bevidst ønsker en ny generering.
Nej. Det eksponerer den instrumentering, der er nødvendig for at indsamle dine reelle tal. Offentliggør kun latenstid, forbrug og fejlrate efter at have kørt det samme input gentagne gange i din egen konto og registreret betingelserne.
Skrevet af Jay og teknisk gennemgået op mod den live endpoint-kontrakt af LlamaGen.AI's content team. Produktadfærd kan ændre sig; den linkede dokumentation er sandhedskilden.
Klar til at bygge workflowet? Åbn LlamaGen.AI Comic API, opret en server-side nøgle, og kør hurtigstarten med din egen karakterreference.
Popular creator tools
Go from comics and storyboards to stylized photos with LlamaGen.
Visualize every scene before production starts.
© 2026 LlamaGen.Ai Alle rettigheder forbeholdes
Førende inden for fremtidens AI-tegneseriegenerering



