يتطلب دمج قصة مصورة موثوق من أربع لوحات أكثر من طلب إنشاء واحد. الحد الأدنى لحلقة الإنتاج هو:
upload character reference -> create four panels -> poll terminal status -> inspect every panel -> repair only the failed panel
ينفذ هذا الدليل السريع تلك الحلقة باستخدام TypeScript. فهو يحتفظ بمفتاح API على الخادم، ويوفر سجلًا ثابتًا للشخصية، ويستخدم مفتاح idempotency لطلب الإنشاء، ويسجل الوقت المنقضي والإخفاقات، ويستهدف لوحة واحدة عند انكسار الاستمرارية.
ابدأ مع LlamaGen.AI Comic API، ثم استخدم المثال الكامل أدناه كخط أساس لدمج من جهة الخادم.
تم التحقق التعاقدي من هذه المقالة مقابل توثيق Comic API المباشر في 10 أكتوبر 2026.
| الفحص | السلوك الذي تم التحقق منه |
|---|---|
| المصادقة | Bearer token في كل طلب |
| عنوان URL الأساسي للإنتاج | https://api.llamagen.ai |
| الرفع | POST /v1/comics/upload يعيد fileUrl قابلاً لإعادة الاستخدام |
| الإنشاء | POST /v1/comics/generations يقبل fixPanelNum: 4 و comicRoles |
| الحالة | يعيد الحالة ومخرجات اللوحات |
A rundown of the latest LlamaGen feature releases, product enhancements, design updates, and important bug fixes.
GET /v1/comics/generations/{generationId}| الإصلاح | PATCH /v1/comics/generations/{generationId} يمكنه إعادة إنشاء لوحة واحدة مفهرسة من الصفر |
| الاستخدام | تعرض استجابات الإنشاء والإصلاح بيانات الاستخدام لسجلاتك الخاصة |
لم نخترع معيارًا للكمون أو معدل النجاح. تختلف هذه القيم حسب الحساب، والطابور، وإعدادات النموذج، والمدخلات. يسجل المثال وقتك الفعلي المنقضي، واستخدام API، والحالة النهائية، وتفاصيل الفشل حتى تتمكن من إنتاج معيار موثوق في بيئتك الخاصة.
يخبر الموجه النموذج بما يحدث. ويخبره مرجع الشخصية لمن تحدث القصة.
لدور متكرر، حافظ على ثبات هذه الحقول:
في هذا المثال، الدور هو ساعٍ بشعر داكن قصير، وسترة مطر صفراء، وحقيبة رسول حمراء. هذه التفاصيل موجزة بما يكفي لتكرارها ومميزة بما يكفي لتدقيقها.

استخدم Node.js 20 أو أحدث حتى تكون fetch و FormData و Blob متاحة. احتفظ بالمفتاح في متغير بيئة خاص بالخادم فقط.
export LLAMAGEN_API_KEY="your_server_side_key"
لا تكشف هذا المفتاح في حزمة متصفح، أو تطبيق جوّال، أو مستودع عام، أو طلب من جهة العميل. إذا كان منتجك يحتوي على واجهة أمامية، فأرسل موجز المستخدم إلى الواجهة الخلفية الخاصة بك ودع تلك الواجهة الخلفية تستدعي LlamaGen.AI.
يتضمن سير العمل أربع عمليات شبكية:

احفظ ما يلي باسم comic-quickstart.ts، وضع صورة شخصية في ./courier-reference.png، ثم شغّله من بيئة الخادم لديك.
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();
شغّله باستخدام:
npx tsx comic-quickstart.ts
يقوم المثال عمدًا بتسجيل كائنات منظَّمة. في بيئة الإنتاج، أرسل الحقول نفسها إلى نظام المراقبة لديك وأدرج معرّف الطلب أو المشروع الخاص بك.
لا توافق على صفحة لمجرد أنها تبدو جذابة بحجم الصورة المصغرة. دقّق كل لوحة مقابل قفل الشخصية:
| الفحص | شرط النجاح |
|---|---|
| الوجه | نفس العمر والملامح والنِّسب |
| الشعر | نفس الهيئة الخارجية والطول واللون |
| الزي | تظل السترة الصفراء صفراء وتحافظ على نفس البنية |
| العنصر | تبقى حقيبة الرسول الحمراء موجودة وفي موضعها الصحيح |
| التسلسل | يبقى المفتاح والباب والطقس واتجاه الحركة متصلة |
| التكوين | لكل لوحة وظيفة سردية مميزة |
| مساحة الكتابة | لا تُحجب الوجوه والأفعال الأساسية |
تعامل مع هذا على أنه ضبط جودة قابل للقراءة آليًا إذا كنت تبني مسارًا أكبر. خزّن سبب نجاح/فشل لكل لوحة، وليس مجرد موافقة على مستوى الصفحة.
أسرع موجه للإصلاح يذكر الفعل الجديد والعناصر التي لا يجوز أن تتغير.
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.
فهارس اللوحات تبدأ من الصفر، لذا فإن اللوحة الثالثة المرئية هي panel: 2. يمكن لنقطة النهاية الخاصة بالتحديث قبول panelPrompt، أو images المرجعية، أو caption بديل.

هذا مهم من الناحية التشغيلية. قد تؤدي إعادة بناء اللوحات الأربع كلها إلى إدخال ثلاثة مخاطر استمرارية جديدة أثناء إصلاح خطر قديم واحد. يضيّق الإصلاح الموجَّه نطاق المراجعة.
قبل شحن الدمج، أضف هذه الضوابط:
بالنسبة للتسلسلات الأطول، انتقل من fixPanelNum إلى pagination.totalPages و pagination.panelsPerPage. لا ترسل كلا الوضعين في طلب إنشاء واحد.
استخدم Comic API عندما يتم إنشاء القصص المصورة داخل منتجك الخاص، أو مهمة دفعية، أو أداة تعليمية، أو مسار نشر، أو سير عمل عميل.
استخدم المحرر المرئي عندما يريد المبدع استكشاف القصة بشكل تفاعلي، أو مقارنة البدائل، أو توجيه كل صفحة فنيًا يدويًا. تستخدم فرق كثيرة الاثنين معًا: ينشئ API النسخة الأولى القابلة للتكرار ويسجلها، بينما يتولى المحرر المراجعات الاستثنائية.
إذا كانت بنية قصتك لا تزال تتغير، فخطط لها قبل إنشاء لوحات نهائية. يوضح الدليل التالي، Storyboard First or Comic Panels First?، كيفية قياس فرق إعادة العمل.
نعم. أرسل fixPanelNum: 4 لطلب صفحة واحدة من أربع لوحات. أما للصفحات المتعددة، فاستخدم كائن pagination بدلًا من ذلك.
ارفع صورة مرجعية نظيفة، ومرّر fileUrl المُعاد في comicRoles[].image، وحافظ على ثبات اسم الدور ووصف الزي، ودقّق كل لوحة معادة قبل متابعة التسلسل.
نعم. أرسل طلب PATCH مع فهارس الصفحة واللوحة التي تبدأ من الصفر بالإضافة إلى panelPrompt جديد، أو صور مرجعية اختيارية، أو caption.
استخدم سلوك idempotency الموثق من LlamaGen.AI حتى لا تؤدي إعادة المحاولة الشبكية إلى إنشاء عمل مكرر عن طريق الخطأ. استخدم مفتاحًا جديدًا فقط عندما تريد عمدًا إنشاءً جديدًا.
لا. إنه يكشف أدوات القياس اللازمة لالتقاط أرقامك الحقيقية. لا تنشر معدلات الكمون والاستخدام والفشل إلا بعد تشغيل الإدخال نفسه مرارًا في حسابك الخاص وتسجيل الظروف.
كتبه Jay وتمت مراجعته تقنيًا مقابل عقد نقطة النهاية المباشرة بواسطة فريق محتوى LlamaGen.AI. قد يتغير سلوك المنتج؛ والتوثيق المرتبط هو مصدر الحقيقة.
هل أنت مستعد لبناء سير العمل؟ افتح LlamaGen.AI Comic API، وأنشئ مفتاحًا من جهة الخادم، وشغّل الدليل السريع باستخدام مرجع الشخصية الخاص بك.
Popular creator tools
Create comics, storyboards and stylized photos with LlamaGen.
Turn an idea into polished comic strips in minutes.
Create comics with AI02Create expressive manga art and multi-panel stories.
Create manga with AI03Visualize every scene before production starts.
Create storyboards with AI04Transform any photo into a comic-style illustration.
Create comics from pictures05Build shareable strips with consistent characters.
Create comic strips with AILeading the Future of AI Comic Generation




© 2026 LlamaGen.Ai All rights reserved