
Eine zuverlässige Integration für einen Vier-Panel-Comic benötigt mehr als nur eine Generierungsanfrage. Der minimale Produktions-Loop ist:
Charakterreferenz hochladen -> vier Panels erstellen -> terminalen Status pollen -> jedes Panel prüfen -> nur das fehlgeschlagene Panel reparieren
Dieser Schnellstart implementiert diesen Loop in TypeScript. Er hält den API-Schlüssel auf dem Server, stellt einen stabilen Charakterdatensatz bereit, verwendet einen Idempotenzschlüssel für die Erstellungsanfrage, protokolliert verstrichene Zeit und Fehler und zielt auf ein einzelnes Panel ab, wenn die Kontinuität bricht.
Beginnen Sie mit der LlamaGen.AI Comic API und verwenden Sie dann das vollständige Beispiel unten als Grundlage für eine serverseitige Integration.
Dieser Artikel wurde am 10. Oktober 2026 anhand der Live-Comic-API-Dokumentation vertraglich geprüft.
| Prüfung | Verifiziertes Verhalten |
|---|---|
| Authentifizierung | Bearer-Token bei jeder Anfrage |
| Produktions-Basis-URL | https://api.llamagen.ai |
| Upload | POST /v1/comics/upload gibt eine wiederverwendbare fileUrl zurück |
| Erstellen | POST /v1/comics/generations akzeptiert fixPanelNum: 4 und comicRoles |
| Status | GET /v1/comics/generations/{generationId} gibt Status und Panel-Ausgabe zurück |
| Reparatur | PATCH /v1/comics/generations/{generationId} kann ein einzelnes nullbasiertes Panel neu generieren |
| Nutzung | Antworten für Erstellen und Reparatur legen Nutzungsdaten für Ihre eigenen Logs offen |
Wir haben keinen Benchmark für Latenz oder Erfolgsrate erfunden. Diese Werte variieren je nach Konto, Warteschlange, Modellkonfiguration und Eingabe. Das Beispiel erfasst Ihre tatsächliche verstrichene Zeit, API-Nutzung, den terminalen Status und Fehlerdetails, damit Sie in Ihrer eigenen Umgebung einen belastbaren Benchmark erstellen können.
Der Prompt sagt dem Modell, was passiert. Die Charakterreferenz sagt ihm, wem die Geschichte passiert.
Halten Sie für eine wiederkehrende Rolle diese Felder stabil:
In diesem Beispiel ist die Rolle ein Kurier mit kurzen dunklen Haaren, einer gelben Regenjacke und einer roten Umhängetasche. Diese Details sind kompakt genug, um sie zu wiederholen, und markant genug, um sie zu prüfen.

Verwenden Sie Node.js 20 oder neuer, damit fetch, FormData und Blob verfügbar sind. Bewahren Sie den Schlüssel in einer nur serverseitigen Umgebungsvariable auf.
export LLAMAGEN_API_KEY="your_server_side_key"
Legen Sie diesen Schlüssel nicht in einem Browser-Bundle, einer mobilen Anwendung, einem öffentlichen Repository oder einer clientseitigen Anfrage offen. Wenn Ihr Produkt ein Frontend hat, senden Sie die Kurzbeschreibung des Benutzers an Ihr eigenes Backend und lassen Sie dieses Backend LlamaGen.AI aufrufen.
Der Workflow hat vier Netzwerkoperationen:

Speichern Sie Folgendes als comic-quickstart.ts, legen Sie ein Charakterbild unter ./courier-reference.png ab und führen Sie es aus Ihrer Serverumgebung aus.
Ein Überblick über die neuesten LlamaGen-Funktionsveröffentlichungen, Produktverbesserungen, Design-Updates und wichtige Fehlerbehebungen.
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();
Führen Sie es aus mit:
npx tsx comic-quickstart.ts
Das Beispiel protokolliert absichtlich strukturierte Objekte. Senden Sie in der Produktion dieselben Felder an Ihr Observability-System und fügen Sie Ihre eigene Anfrage- oder Projektkennung hinzu.
Geben Sie eine Seite nicht frei, nur weil sie in Thumbnail-Größe attraktiv aussieht. Prüfen Sie jedes Panel anhand der Charakterbindung:
| Prüfung | Bestehensbedingung |
|---|---|
| Gesicht | Gleiches Alter, gleiche Merkmale und gleiche Proportionen |
| Haare | Gleiche Silhouette, Länge und Farbe |
| Kostüm | Die gelbe Jacke bleibt gelb und behält die gleiche Konstruktion |
| Requisit | Die rote Umhängetasche bleibt vorhanden und korrekt platziert |
| Sequenz | Schlüssel, Tür, Wetter und Bewegungsrichtung bleiben durchgängig |
| Komposition | Jedes Panel hat eine eigene erzählerische Aufgabe |
| Platz für Lettering | Gesichter und wesentliche Aktionen werden nicht blockiert |
Behandeln Sie dies als maschinenlesbare Qualitätskontrolle, wenn Sie eine größere Pipeline aufbauen. Speichern Sie einen Bestanden/Nicht-bestanden-Grund pro Panel, nicht nur ein Daumen-hoch auf Seitenebene.
Der schnellste Reparatur-Prompt nennt sowohl die neue Aktion als auch die Elemente, die sich nicht ändern dürfen.
Reparatur von Panel 3:
Ren läuft auf die Servicetür zu.
Bewahre sein exaktes Gesicht, kurze dunkle Haare, gelbe Regenjacke
und die sichtbare rote Umhängetasche.
Behalte den regnerischen Bahnhof und die Bewegung von links nach rechts bei.
Die Panel-Indizes sind nullbasiert, daher ist das sichtbare dritte Panel panel: 2. Der Update-Endpunkt kann panelPrompt, Referenz-images oder eine Ersatz-caption akzeptieren.

Das ist operativ wichtig. Wenn alle vier Panels neu erstellt werden, können drei neue Kontinuitätsrisiken entstehen, während ein altes behoben wird. Eine gezielte Reparatur verengt die Prüfoberfläche.
Bevor Sie die Integration ausliefern, fügen Sie diese Kontrollen hinzu:
Für längere Sequenzen wechseln Sie von fixPanelNum zu pagination.totalPages und pagination.panelsPerPage. Senden Sie nicht beide Modi in einer Erstellungsanfrage.
Verwenden Sie die Comic API, wenn Comics innerhalb Ihres eigenen Produkts, Batch-Jobs, Bildungstools, Publishing-Workflows oder Kunden-Workflows generiert werden.
Verwenden Sie den visuellen Editor, wenn ein Creator die Geschichte interaktiv erkunden, Alternativen vergleichen oder jede Seite von Hand art-directen möchte. Viele Teams verwenden beides: Die API erstellt und protokolliert den wiederholbaren ersten Durchlauf, während der Editor außergewöhnliche Überarbeitungen übernimmt.
Wenn sich Ihre Story-Struktur noch verändert, planen Sie sie, bevor Sie fertige Panels erstellen. Der nächste Leitfaden, Storyboard zuerst oder Comic-Panels zuerst?, zeigt, wie Sie den Unterschied beim Nacharbeitsaufwand messen.
Ja. Senden Sie fixPanelNum: 4 für eine einseitige Vier-Panel-Anfrage. Für mehrere Seiten verwenden Sie stattdessen das pagination-Objekt.
Laden Sie ein sauberes Referenzbild hoch, übergeben Sie dessen zurückgegebene fileUrl in comicRoles[].image, halten Sie Rollenname und Kostümbeschreibung stabil und prüfen Sie jedes zurückgegebene Panel, bevor Sie mit der Sequenz fortfahren.
Ja. Senden Sie eine PATCH-Anfrage mit den nullbasierten Seiten- und Panel-Indizes plus einem neuen panelPrompt, optionalen Referenzbildern oder einer Caption.
Verwenden Sie das von LlamaGen.AI dokumentierte Idempotenzverhalten, damit Netzwerk-Wiederholungen nicht versehentlich doppelte Arbeit erzeugen. Verwenden Sie nur dann einen neuen Schlüssel, wenn Sie absichtlich eine neue Generierung möchten.
Nein. Es stellt die Instrumentierung bereit, die nötig ist, um Ihre echten Zahlen zu erfassen. Veröffentlichen Sie Latenz-, Nutzungs- und Fehlerraten erst, nachdem Sie dieselbe Eingabe wiederholt in Ihrem eigenen Konto ausgeführt und die Bedingungen protokolliert haben.
Geschrieben von Jay und technisch anhand des Live-Endpunktvertrags vom LlamaGen.AI-Content-Team geprüft. Das Produktverhalten kann sich ändern; die verlinkte Dokumentation ist die maßgebliche Quelle.
Bereit, den Workflow zu erstellen? Öffnen Sie die LlamaGen.AI Comic API, erstellen Sie einen serverseitigen Schlüssel und führen Sie den Schnellstart mit Ihrer eigenen Charakterreferenz aus.
Popular creator tools
Go from comics and storyboards to stylized photos with LlamaGen.
© 2026 LlamaGen.Ai Alle Rechte vorbehalten
Wegweisend für die Zukunft der KI-gestützten Comic-Erstellung



