
Niezawodna integracja czteropanelowego komiksu wymaga więcej niż jednego żądania generowania. Minimalna pętla produkcyjna to:
prześlij referencję postaci -> utwórz cztery panele -> odpytuj status końcowy -> sprawdź każdy panel -> napraw tylko błędny panel
Ten szybki start implementuje tę pętlę w TypeScript. Przechowuje klucz API po stronie serwera, dostarcza stabilny rekord postaci, używa klucza idempotencji dla żądania utworzenia, zapisuje czas wykonania i błędy oraz kieruje naprawę do jednego panelu, gdy ciągłość zostanie zaburzona.
Zacznij od LlamaGen.AI Comic API, a następnie użyj pełnego przykładu poniżej jako bazowego wzorca integracji po stronie serwera.
Ten artykuł został sprawdzony pod kątem zgodności z aktualną dokumentacją Comic API 10 października 2026 roku.
| Kontrola | Zweryfikowane zachowanie |
|---|---|
| Uwierzytelnianie | Token Bearer w każdym żądaniu |
| Produkcyjny bazowy URL | https://api.llamagen.ai |
| Przesyłanie | POST /v1/comics/upload zwraca wielokrotnego użytku fileUrl |
| Tworzenie | POST /v1/comics/generations akceptuje fixPanelNum: 4 i comicRoles |
| Status | GET /v1/comics/generations/{generationId} zwraca status i wynik paneli |
| Naprawa | PATCH /v1/comics/generations/{generationId} może zregenerować jeden panel indeksowany od zera |
| Zużycie | Odpowiedzi create i repair udostępniają dane użycia do własnych logów |
Nie wymyśliliśmy benchmarku opóźnień ani skuteczności. Te wartości różnią się w zależności od konta, kolejki, konfiguracji modelu i danych wejściowych. Przykład zapisuje rzeczywisty czas wykonania, użycie API, status końcowy i szczegóły błędów, dzięki czemu możesz przygotować wiarygodny benchmark we własnym środowisku.
Prompt mówi modelowi, co się dzieje. Referencja postaci mówi mu, komu ta historia się przydarza.
Dla powracającej roli zachowaj stabilność tych pól:
W tym przykładzie rolą jest kurier z krótkimi ciemnymi włosami, żółtą kurtką przeciwdeszczową i czerwoną torbą listonoszką. Te szczegóły są wystarczająco zwięzłe, by je powtarzać, i wystarczająco charakterystyczne, by je kontrolować.

Użyj Node.js 20 lub nowszego, aby fetch, FormData i Blob były dostępne. Przechowuj klucz w zmiennej środowiskowej dostępnej tylko po stronie serwera.
export LLAMAGEN_API_KEY="your_server_side_key"
Nie ujawniaj tego klucza w bundlu przeglądarkowym, aplikacji mobilnej, publicznym repozytorium ani żądaniu po stronie klienta. Jeśli Twój produkt ma frontend, wyślij opis użytkownika do własnego backendu i pozwól, aby to backend wywołał LlamaGen.AI.
Workflow składa się z czterech operacji sieciowych:

Zapisz poniższy kod jako comic-quickstart.ts, umieść obraz postaci w ./courier-reference.png i uruchom go w swoim środowisku serwerowym.
Przegląd najnowszych funkcji LlamaGen, ulepszeń produktu, aktualizacji projektu i ważnych poprawek błędów.
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();
Uruchom za pomocą:
npx tsx comic-quickstart.ts
Przykład celowo loguje obiekty strukturalne. W środowisku produkcyjnym wysyłaj te same pola do swojego systemu obserwowalności i dołącz własny identyfikator żądania lub projektu.
Nie zatwierdzaj strony tylko dlatego, że wygląda atrakcyjnie jako miniatura. Sprawdź każdy panel względem blokady postaci:
| Kontrola | Warunek zaliczenia |
|---|---|
| Twarz | Ten sam wiek, cechy i proporcje |
| Włosy | Ta sama sylwetka, długość i kolor |
| Strój | Żółta kurtka pozostaje żółta i zachowuje tę samą konstrukcję |
| Rekwizyt | Czerwona torba listonoszka pozostaje obecna i poprawnie umieszczona |
| Sekwencja | Klucz, drzwi, pogoda i kierunek ruchu pozostają spójne |
| Kompozycja | Każdy panel ma odrębne zadanie narracyjne |
| Miejsce na liternictwo | Twarze i kluczowe działania nie są zasłonięte |
Traktuj to jako maszynowo odczytywalną kontrolę jakości, jeśli budujesz większy pipeline. Zapisuj powód zaliczenia lub niezaliczenia dla każdego panelu, a nie tylko ogólną ocenę całej strony.
Najszybszy prompt naprawczy określa zarówno nowe działanie, jak i elementy, które nie mogą się zmienić.
Naprawa panelu 3:
Ren biegnie w stronę drzwi technicznych.
Zachowaj jego dokładną twarz, krótkie ciemne włosy, żółtą kurtkę przeciwdeszczową
i widoczną czerwoną torbę listonoszkę.
Utrzymaj deszczową stację i ruch od lewej do prawej.
Indeksy paneli są zerowane, więc widoczny trzeci panel to panel: 2. Endpoint aktualizacji może przyjąć panelPrompt, referencyjne images lub zastępczy caption.

Ma to znaczenie operacyjne. Przebudowanie wszystkich czterech paneli może wprowadzić trzy nowe ryzyka ciągłości podczas naprawy jednego starego. Naprawa ukierunkowana zawęża zakres przeglądu.
Przed wdrożeniem integracji dodaj te zabezpieczenia:
W przypadku dłuższych sekwencji przejdź z fixPanelNum na pagination.totalPages i pagination.panelsPerPage. Nie wysyłaj obu trybów w jednym żądaniu tworzenia.
Użyj Comic API, gdy komiksy są generowane wewnątrz Twojego produktu, zadania wsadowego, narzędzia edukacyjnego, pipeline’u wydawniczego lub workflow klienta.
Użyj edytora wizualnego, gdy twórca chce interaktywnie eksplorować historię, porównywać alternatywy lub ręcznie nadawać kierunek artystyczny każdej stronie. Wiele zespołów używa obu rozwiązań: API tworzy i loguje powtarzalny pierwszy przebieg, a edytor obsługuje wyjątkowe poprawki.
Jeśli struktura Twojej historii nadal się zmienia, zaplanuj ją przed tworzeniem gotowych paneli. Następny poradnik, Storyboard First or Comic Panels First?, pokazuje, jak zmierzyć różnicę w ilości poprawek.
Tak. Wyślij fixPanelNum: 4 dla jednostronicowego żądania z czterema panelami. W przypadku wielu stron użyj zamiast tego obiektu pagination.
Prześlij czysty obraz referencyjny, przekaż zwrócony fileUrl w comicRoles[].image, utrzymuj stabilność nazwy roli i opisu stroju oraz sprawdzaj każdy zwrócony panel przed kontynuowaniem sekwencji.
Tak. Wyślij żądanie PATCH z indeksami strony i panelu liczonymi od zera oraz nowym panelPrompt, opcjonalnymi obrazami referencyjnymi lub podpisem.
Korzystaj z zachowania idempotencji udokumentowanego przez LlamaGen.AI, aby ponowienia sieciowe nie tworzyły przypadkowo zduplikowanej pracy. Użyj nowego klucza tylko wtedy, gdy celowo chcesz nowego generowania.
Nie. Pokazuje instrumentację potrzebną do zebrania rzeczywistych liczb. Publikuj opóźnienia, użycie i wskaźniki błędów dopiero po wielokrotnym uruchomieniu tego samego wejścia na własnym koncie i zapisaniu warunków.
Tekst autorstwa Jay i technicznie zrecenzowany względem aktualnego kontraktu endpointu przez zespół contentowy LlamaGen.AI. Zachowanie produktu może się zmienić; podlinkowana dokumentacja jest źródłem prawdy.
Gotowy, aby zbudować workflow? Otwórz LlamaGen.AI Comic API, utwórz klucz po stronie serwera i uruchom szybki start z własną referencją postaci.
Popular creator tools
Go from comics and storyboards to stylized photos with LlamaGen.
Visualize every scene before production starts.
© 2026 LlamaGen.Ai Wszelkie prawa zastrzeżone
Tworzymy przyszłość generowania komiksów AI



