
Uma integração confiável de quadrinhos em quatro painéis precisa de mais de uma solicitação de geração. O loop mínimo de produção é:
upload da referência do personagem -> criar quatro painéis -> consultar status terminal -> inspecionar cada painel -> corrigir apenas o painel com falha
Este guia rápido implementa esse loop em TypeScript. Ele mantém a chave de API no servidor, fornece um registro estável do personagem, usa uma chave de idempotência para a solicitação de criação, registra o tempo decorrido e as falhas, e mira em um único painel quando a continuidade se rompe.
Comece com a API de Quadrinhos LlamaGen.AI e depois use o exemplo completo abaixo como base para uma integração no lado do servidor.
Este artigo foi verificado contratualmente em relação à documentação ativa da API de Quadrinhos em 10 de outubro de 2026.
| Verificação | Comportamento verificado |
|---|---|
| Autenticação | Token Bearer em todas as solicitações |
| URL base de produção | https://api.llamagen.ai |
| Upload | POST /v1/comics/upload retorna um fileUrl reutilizável |
| Criação | POST /v1/comics/generations aceita fixPanelNum: 4 e comicRoles |
| Status | GET /v1/comics/generations/{generationId} retorna status e saída dos painéis |
| Correção | PATCH /v1/comics/generations/{generationId} pode regenerar um painel com índice zero-based |
| Uso | As respostas de criação e correção expõem dados de uso para seus próprios logs |
Não inventamos um benchmark de latência ou taxa de sucesso. Esses valores variam conforme a conta, fila, configuração do modelo e entrada. O exemplo registra seu tempo decorrido real, uso da API, status terminal e detalhes de falha para que você possa produzir um benchmark defensável em seu próprio ambiente.
O prompt diz ao modelo o que acontece. A referência do personagem diz a ele com quem a história está acontecendo.
Para um papel recorrente, mantenha estes campos estáveis:
Neste exemplo, o papel é de um mensageiro com cabelo curto e escuro, uma capa de chuva amarela e uma bolsa carteiro vermelha. Esses detalhes são compactos o suficiente para repetir e distintos o bastante para auditar.

Use Node.js 20 ou mais recente para que fetch, FormData e Blob estejam disponíveis. Mantenha a chave em uma variável de ambiente exclusiva do servidor.
export LLAMAGEN_API_KEY="your_server_side_key"
Não exponha essa chave em um bundle de navegador, aplicativo móvel, repositório público ou solicitação no lado do cliente. Se o seu produto tiver um frontend, envie o briefing do usuário para o seu próprio backend e deixe que esse backend chame a LlamaGen.AI.
O fluxo de trabalho tem quatro operações de rede:

Salve o seguinte como comic-quickstart.ts, coloque uma imagem do personagem em ./courier-reference.png e execute-o a partir do ambiente do seu servidor.
Um resumo dos lançamentos mais recentes de recursos do LlamaGen, melhorias no produto, atualizações de design e correções importantes de bugs.
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();
Execute com:
npx tsx comic-quickstart.ts
O exemplo registra intencionalmente objetos estruturados. Em produção, envie os mesmos campos para o seu sistema de observabilidade e inclua seu próprio identificador de solicitação ou projeto.
Não aprove uma página porque ela parece atraente em tamanho de miniatura. Audite cada painel em relação ao bloqueio do personagem:
| Verificação | Condição de aprovação |
|---|---|
| Rosto | Mesma idade, traços e proporções |
| Cabelo | Mesma silhueta, comprimento e cor |
| Figurino | A jaqueta amarela continua amarela e mantém a mesma construção |
| Acessório | A bolsa carteiro vermelha continua presente e posicionada corretamente |
| Sequência | Chave, porta, clima e direção do movimento permanecem contínuos |
| Composição | Cada painel tem uma função narrativa distinta |
| Espaço para texto | Rostos e ações essenciais não ficam bloqueados |
Trate isso como controle de qualidade legível por máquina se você estiver construindo um pipeline maior. Armazene um motivo de aprovação/reprovação por painel, não apenas um joinha no nível da página.
O prompt de correção mais rápido nomeia tanto a nova ação quanto os elementos que não podem mudar.
Correção do painel 3:
Ren corre em direção à porta de serviço.
Preserve seu rosto exato, cabelo curto e escuro, capa de chuva amarela
e a bolsa carteiro vermelha visível.
Mantenha a estação chuvosa e o movimento da esquerda para a direita.
Os índices dos painéis são baseados em zero, então o terceiro painel visível é panel: 2. O endpoint de atualização pode aceitar panelPrompt, images de referência ou uma caption de substituição.

Isso é importante operacionalmente. Reconstruir os quatro painéis pode introduzir três novos riscos de continuidade ao corrigir um antigo. A correção direcionada reduz a superfície de revisão.
Antes de publicar a integração, adicione estes controles:
Para sequências mais longas, mude de fixPanelNum para pagination.totalPages e pagination.panelsPerPage. Não envie os dois modos em uma única solicitação de criação.
Use a API de Quadrinhos quando os quadrinhos forem gerados dentro do seu próprio produto, job em lote, ferramenta educacional, pipeline de publicação ou fluxo de trabalho do cliente.
Use o editor visual quando um criador quiser explorar a história interativamente, comparar alternativas ou dirigir artisticamente cada página à mão. Muitas equipes usam ambos: a API cria e registra a primeira versão repetível, enquanto o editor lida com revisões excepcionais.
Se a estrutura da sua história ainda está mudando, planeje-a antes de fazer painéis finalizados. O próximo guia, Storyboard First or Comic Panels First?, mostra como medir a diferença de retrabalho.
Sim. Envie fixPanelNum: 4 para uma solicitação de página única com quatro painéis. Para várias páginas, use o objeto pagination.
Faça upload de uma imagem de referência limpa, passe o fileUrl retornado em comicRoles[].image, mantenha estáveis o nome do papel e a descrição do figurino, e audite cada painel retornado antes de continuar a sequência.
Sim. Envie uma solicitação PATCH com os índices de página e painel baseados em zero, além de um novo panelPrompt, imagens de referência opcionais ou legenda.
Use o comportamento de idempotência documentado pela LlamaGen.AI para que novas tentativas de rede não criem trabalho duplicado acidentalmente. Use uma nova chave apenas quando quiser intencionalmente uma nova geração.
Não. Ele expõe a instrumentação necessária para capturar seus números reais. Publique latência, uso e taxas de falha apenas depois de executar repetidamente a mesma entrada na sua própria conta e registrar as condições.
Escrito por Jay e tecnicamente revisado em relação ao contrato ativo do endpoint pela equipe de conteúdo da LlamaGen.AI. O comportamento do produto pode mudar; a documentação vinculada é a fonte da verdade.
Pronto para criar o fluxo de trabalho? Abra a API de Quadrinhos LlamaGen.AI, crie uma chave no lado do servidor e execute o guia rápido com sua própria referência de personagem.
Popular creator tools
Go from comics and storyboards to stylized photos with LlamaGen.
© 2026 LlamaGen.Ai Todos os direitos reservados
Liderando o futuro da geração de quadrinhos por IA



