إنشاء تطبيق لتوليد الصور بالذكاء الاصطناعي: الأدوات وAPI والتكاليف
خطة عملية لبناء تطبيق لتوليد الصور بالذكاء الاصطناعي: حلقة الطلبات، ومجموعة أدوات تُطلق بها التطبيق في أسبوع، وطريقة ربط API لتوليد الصور بكود Node يعمل، وميزانية شهرية تكشف تكلفة كل توليدة فعليًا قبل الإطلاق.
يبدو تطبيق توليد الصور بالذكاء الاصطناعي منتجًا ضخمًا من الخارج، وصغيرًا من الداخل. يكتب الشخص جملة، فيمررها خادمك إلى نموذج، وبعد ثوانٍ قليلة تعود الصورة، فتحفظها في مكان يستطيع الشخص العثور عليه لاحقًا. كل ما عدا ذلك تفاصيل تحسينية: الحسابات، والمعرض، والنقاط، وطريقة لمنع إساءة الاستخدام. الجزء الذي يفاجئ معظم المطورين ليس الكود، بل الفاتورة. تكلفة الصورة الواحدة، مضروبةً في عدد مرات الضغط على الزر، هي ما يحدد إن كان التطبيق يربح المال أم يخسره.
يعرض هذا المقال مجموعة أدوات يمكنك بناؤها في أسبوع، ويوضح كيف تتكامل استدعاءات API مع بعضها عبر شيفرة عملية مع PicassoIA API، ويقدّم حسابًا صريحًا للتكلفة الشهرية حتى تستطيع تسعير المنتج قبل يوم الإطلاق.
ما الذي تبنيه فعلًا
إذا أزلت العلامة التجارية، فكل تطبيق لتوليد الصور يؤدي المهمة نفسها: يحوّل طلب نص إلى ملف، ويفعل ذلك دون أن يجعل الشخص ينتظر أمام شاشة متجمدة. وحين تنظر إلى التطبيق بوصفه حلقة طلبات مع معرض مرفق بها، يصبح البناء أصغر بكثير.
حلقة الطلبات في خمس خطوات
يرسل المتصفح الأمر النصي وبعض الخيارات (الحجم، والأسلوب، وعدد الصور) إلى الخلفية الخاصة بك.
تتحقق الخلفية الخاصة بك من المستخدم والحصة والأمر النصي، ثم تنشئ تنبؤًا (prediction) عبر واجهة API الخاصة بالصور.
تُعيد API الرد فورًا بمعرّف، لأن التوليد غير متزامن ويستغرق ثوانيَ لا ملّي ثانية.
تستعلم الخلفية الخاصة بك عن هذا المعرّف بشكل دوري (أو تنتظر إشعار webhook). عندما تصبح الحالة succeeded، تنسخ الملف إلى مساحة التخزين الخاصة بك.
يعرض المتصفح الصورة ويضيفها إلى معرض المستخدم.
كل ميزة ستضيفها لاحقًا ستُبنى فوق هذه الخطوات الخمس. ترتبط النقاط بالخطوة 2، ويرتبط المعرض بالخطوة 5. وتوليد الفيديو هو الحلقة نفسها مع خطوة 4 أبطأ.
حدّد شكل المنتج أولًا
اختر أصغر نسخة يمكن أن يدفع أحد ثمنها. كل نوع إضافي من المدخلات يضيف عملًا في الخلفية.
💡 ابدأ بصندوق إدخال واحد وزر واحد. الميزات التي تضيفها لاحقًا تكلّف أقل من ميزات تضطر إلى إزالتها بعد أن يعتمد عليها المستخدمون.
اختر مجموعة أدوات تصل إلى الإطلاق
الأدوات البسيطة المجرّبة هي الرابحة هنا. النموذج يقوم بالجزء الصعب، لذلك تحتاج مجموعتك إلى أن تكون موثوقة، ورخيصة التشغيل، وسهلة التغيير حين يظهر نموذج أفضل الشهر المقبل.
خيارات الواجهة الأمامية
يوفّر إطار React مثل Next.js صفحة للأوامر النصية، ومعرضًا، ومسارات الخادم في مشروع واحد. إذا كان معظم مستخدميك على الهواتف، فأطلقه أولًا بوصفه تطبيق ويب تقدمي (progressive web app)، وانتقل إلى React Native أو Flutter فقط حين تحتاج إلى وصول أعمق إلى الكاميرا أو الملفات. الشاشة نفسها بسيطة: مربع نص، ومنتقي للحجم، وزر، وشبكة.
الخلفية والطابور
استخدم Node أو Python، أيهما يكتب به فريقك أصلًا. الجزء الذي لا ينبغي تجاهله هو طابور المهام (job queue). يستغرق توليد الصور وقتًا أطول كثيرًا مقارنةً بطلب ويب عادي، وتحدّ واجهات API الخاصة بالصور من عدد المهام التي تعمل في وقت واحد. يتيح لك الطابور (Redis مع BullMQ، أو Celery على Python) قبول كل نقرة فورًا، وإرسال الطلبات إلى API بوتيرة آمنة.
احتفظ بجدول generations واحد في Postgres يضم الأعمدة التالية: id، user_id، prompt، model، status، cost_usd، image_url، created_at. هذا الجدول الواحد يغذي المعرض، وفحص الحصة، وتقارير التكلفة.
التخزين والتسليم
انسخ كل صورة مكتملة إلى حاوية التخزين الخاصة بك خلف شبكة CDN. لا تعتمد على عنوان URL مؤقت يقدمه المزوّد وكأنه سيبقى حيًا إلى الأبد. احفظ الأصل مع صورة مصغّرة أصغر بصيغة WebP حتى يُحمَّل المعرض بسرعة على الهاتف.
الطبقة
الخيار البسيط
الترقية عندما
الواجهة الأمامية
Next.js أو React البسيط
تحتاج إلى ميزات الجهاز الأصلية
طبقة API
Node (Fastify) أو FastAPI
تحتاج الحركة إلى عمال منفصلين
الطابور
Redis مع BullMQ أو Celery
تستدعي أكثر من مزوّد واحد
قاعدة البيانات
Postgres
تصبح التقارير ثقيلة
التخزين
حاوية متوافقة مع S3 مع CDN
يتوزع المستخدمون في مناطق كثيرة
تسجيل الدخول
روابط البريد الإلكتروني أو OAuth
تبيع حسابات للفرق
اختر API للصور
يمكنك استئجار نموذج بحسب كل استدعاء، أو تشغيل وحدات GPU خاصة بك. في الإصدار الأول تكون الإجابة في الغالب هي الخيار الأول.
API مستضافة أم وحدة GPU خاصة بك
تعني API المستضافة لا برامج تشغيل، ولا عمل في التوسّع، وعدة نماذج خلف واجهة واحدة، وتدفع مقابل كل صورة. وتعني وحدة GPU المستأجرة فاتورة ثابتة بالساعة وقائمة طويلة من المهام المتكررة: أوزان النموذج، وحدود الذاكرة، والتحديثات، والطوابير، والأعطال في الساعة 3 فجرًا.
الحساب الرياضي هو الذي يحسم الأمر. لنفترض أن وحدة GPU مستأجرة تكلّف 1.50 دولار في الساعة، وتنتج 120 صورة في الساعة. إذا لم تتوقف أبدًا، فإن كل صورة تكلّف نحو 0.0125 دولار. وإذا كانت مشغولة 20% فقط من الوقت، فأنت فعليًا تنتج 24 صورة في الساعة، وتكلّف كل واحدة 0.0625 دولار. هذه أرقام توضيحية، لكن شكل النتيجة يظل صحيحًا: الاستضافة الذاتية لا تربح إلا مع حركة مرور ثابتة وكثيفة.
نماذج تستحق الربط
تسرد مجموعة تحويل النص إلى صورة على PicassoIA أكثر من 200 نموذج، وهذا مفيد لأن لا يوجد نموذج واحد الأفضل في كل شيء. اختر نموذجًا افتراضيًا واحدًا، واحتفظ بنموذج أو اثنين بديلين خلف إعداد، حتى تستطيع التبديل حين تتغير الجودة أو السرعة أو السعر.
معظم الناس يكتبون أوامر مثل "كلب على شاطئ". يستطيع نموذج لغوي صغير أن يوسّع هذا الأمر إلى أمر أغنى قبل استدعاء توليد الصورة، وتكلفته جزء صغير من السنت. يناسب Claude Sonnet 5 وGemini 3.5 Flash هذه المهمة، ويعيد GPT 5 Structured مخرجات JSON نظيفة حين تحتاج إلى تقسيم إعادة الصياغة إلى حقول مثل الموضوع والإضاءة والعدسة.
تستطيع العائلة نفسها من النماذج أداء مهمة ثانية: فحص الأوامر قبل أن تصل إلى نموذج توليد الصور. المزيد عن ذلك لاحقًا.
الاتصال بواجهة PicassoIA API
تقدّم PicassoIA واجهة REST API على غرار Replicate، لذا فإن التدفق هو التدفق نفسه من حلقة الطلبات: أنشئ تنبؤًا، واستعلم عنه، واجلب النتيجة. نقاط النهاية والحدود الواردة أدناه مأخوذة من صفحة API العامة، وهي المكان الذي تتأكد فيه من التفاصيل قبل النشر.
كيف تستخدم PicassoIA Image
قبل كتابة أي كود، جرّب النموذج يدويًا. يستغرق ذلك عشر دقائق، ويوفر أيامًا من التخمين.
اكتب خمسة أوامر نصية تطابق ما سيكتبه مستخدموك فعلًا: قصيرة، وطويلة، وغامضة.
جرّب نسب العرض إلى الارتفاع التي سيقدمها تطبيقك، مثل 1:1 و16:9 و9:16.
ولّد كل أمر عدة مرات، ولاحظ مدى تباين النتائج.
دوّن أي صياغة أعطت أفضل الصور. تصبح هذه القائمة القالب الذي يعيد كتابة الأوامر في تطبيقك.
💡 إذا كان تطبيقك يعدّل الصور، فكرر الاختبار نفسه مع PicassoIA Image Editor Pro باستخدام صور حقيقية مرفوعة، لا عينات جاهزة.
عنوان URL الأساسي والمصادقة
عنوان URL الأساسي هو https://api.picassoia.com/v1. يحمل كل طلب ترويسة Authorization: Bearer تتضمن سرًّا يبدأ بالعبارة pia_sk_. تنشئه من صفحة API الخاصة بالحساب، ولا يمكن للحساب أن يحمل أكثر من اثنين، لذا بدّل واحدًا في كل مرة. لا تضع هذا السر أبدًا في شيفرة المتصفح أو تطبيق الهاتف. مكانه الصحيح على خادمك، في متغير بيئة. تُدرج متطلبات الخطط وأسعار الوصول إلى API في تلك الصفحة، وقد تتغير، لذا اقرأها قبل أن تبني ميزانية حولها.
يحدد سقف المهام الخمس بنية تطبيقك كلها، ولهذا فإن الطابور المذكور سابقًا ليس اختياريًا.
إنشاء، واستعلام، وجلب
نقاط النهاية هي POST /v1/models/{owner}/{name}/predictions لبدء مهمة، وGET /v1/predictions/{id} لقراءتها، وPOST /v1/predictions/{id}/cancel لإيقافها، وGET /v1/predictions لعرض المهام الأخيرة. إليك الحلقة كاملة في Node 18 أو أحدث:
const BASE = "https://api.picassoia.com/v1";
const headers = {
Authorization: `Bearer ${process.env.PICASSOIA_TOKEN}`,
"Content-Type": "application/json",
};
async function call(url, options) {
const res = await fetch(url, { headers, ...options });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
}
export async function generate(prompt) {
const created = await call(
`${BASE}/models/picassoia/picassoia-image/predictions`,
{
method: "POST",
body: JSON.stringify({ input: { prompt, aspect_ratio: "16:9" } }),
}
);
let job = created;
while (!["succeeded", "failed", "canceled"].includes(job.status)) {
await new Promise((r) => setTimeout(r, 2000));
job = await call(`${BASE}/predictions/${created.id}`);
}
if (job.status !== "succeeded") throw new Error(job.error ?? job.status);
return Array.isArray(job.output) ? job.output[0] : job.output;
}
ملاحظتان على هذا الكود. أولًا، تختلف أسماء حقول المدخلات من نموذج إلى آخر، لذلك اقرأ صفحة كل نموذج وطابق الأسماء تمامًا. ثانيًا، في الإنتاج احفظ created.id في قاعدة بياناتك قبل بدء الاستعلام، حتى لا يخسر إعادة تشغيل الخادم مهمة مدفوعة.
ما التكلفة الفعلية
تنقسم التكاليف إلى مجموعتين: تكاليف متغيرة تزداد مع كل نقرة، وتكاليف ثابتة تبقى كما هي. التكاليف المتغيرة هي الخطرة.
تكلفة الصورة الواحدة هي الرقم الأساسي
المعادلة الأساسية قصيرة:
التكلفة الشهرية = عدد المستخدمين × عدد التوليدات لكل مستخدم × تكلفة الصورة الواحدة + التكاليف الثابتة
الكلمة التي يجب مراقبتها هي التوليدات. يضغط الناس الزر عدة مرات مقابل كل صورة يحتفظون بها، لذلك قِس عدد التوليدات لكل صورة محفوظة من اليوم الأول لنسختك التجريبية، وأعدّ الميزانية بهذا الرقم، لا بعدد الصور المحفوظة.
ميزانية شهرية مُعدّة كمثال
لنفترض 2,000 مستخدم نشط يُجري كل واحد منهم 20 توليدًا شهريًا. أي 40,000 صورة. الأسعار الواردة أدناه افتراضات للتخطيط، لذا استبدلها بالسعر الحالي للنموذج الذي تختاره. التكاليف الثابتة للاستضافة وقاعدة البيانات والتخزين محددة بمبلغ $100 شهريًا لهذا الحجم.
السيناريو
سعر الصورة المفترض
فاتورة الصور
مع 100 دولار ثابتة
النتيجة مع إيرادات 2,700 دولار
نموذج مسودات سريع
0.01 دولار
400 دولار
500 دولار
+2,200 دولار
نموذج متوسط المستوى
0.04 دولار
1,600 دولار
1,700 دولار
+1,000 دولار
نموذج متميز
0.08 دولار
3,200 دولار
3,300 دولار
-600 دولار
يفترض رقم الإيرادات أن 300 من أصل 2,000 مستخدم يدفعون 9 دولارات شهريًا. يخسر الصف الخاص بالنموذج المتميز المال رغم أن التطبيق يبدو سليمًا، لأن المستخدمين المجانيين ينتجون صورًا أيضًا. ثلاثة حلول تعمل جيدًا معًا: ضع حدًا للمستوى المجاني، وبِع نقاطًا مقدّرة وفق السعر الفعلي لكل نموذج، وأرسل طلبات المسودات إلى النموذج الرخيص، واحجز النموذج المتميز للتصيير النهائي.
تكاليف ينساها الناس:
التوليدات الفاشلة والمتروكة. قد تدفع ثمن صور لا يفتحها أحد.
إعادة المحاولة. كل إعادة محاولة تلقائية استدعاء آخر قابل للفوترة، إلا إذا كانت المحاولة الأولى فشلت بوضوح.
التخزين وعرض النطاق. معرض من الصور كاملة الحجم يتراكم أسرع مما تتوقع، ولهذا تهم الصور المصغّرة وشبكة CDN.
استدعاءات إعادة كتابة الأوامر والإشراف. صغيرة في كل استدعاء، لكنها حقيقية عند الحجم الكبير.
رسوم الدفع ورسوم متاجر التطبيقات. تُخصم من كل عملية بيع.
وقت الدعم. يجب أن يردّ أحد على سؤال "صورتي تبدو خاطئة".
اجعله آمنًا وسريعًا
السرعة والأمان أمران رخيصان عند إضافتهما مبكرًا ومؤلمان بعد الإطلاق.
الطوابير والحدود وإعادة المحاولة
مع خمس تنبؤات متزامنة لكل حساب في PicassoIA، يحدد الطابور مدى سلاسة عمل تطبيقك. لنفترض أن الصورة تستغرق نحو 10 ثوانٍ. عندئذ تعطيك خمس مهام في وقت واحد نحو 30 صورة في الدقيقة، أو 1,800 صورة في الساعة. 40,000 صورة من الميزانية أعلاه تعني في المتوسط نحو 55 صورة في الساعة. حتى ذروة الازدحام بخمسة أضعاف المتوسط، أي نحو 280 صورة، تتسع بهامش مريح.
قواعد تحافظ على سلامة الطابور:
أعد المحاولة للأخطاء العابرة فقط، مثل انتهاء المهلة وأخطاء الخادم، مع تأخير متزايد بين المحاولات. لا تعيد أبدًا محاولة طلب رفضته API بسبب مدخل غير صالح.
قيّد عدد المهام لكل مستخدم إلى عدد صغير في الوقت نفسه، حتى لا يستطيع شخص واحد ملء الخانات الخمس كلها.
اعرض التقدّم، ولو برسالة بسيطة مثل "في الطابور، الترتيب الثالث"، حتى لا يعيد الناس الضغط.
استخدم نقطة نهاية الإلغاء عندما يغادر المستخدم، حتى تتوقف عن دفع ثمن عمل لن يراه أحد.
الإشراف قبل التوليد
افحص الأمر النصي قبل أن يصل إلى نموذج توليد الصور. يقرأ مصنّف أمان مثل Llama Guard 4 12B النص، ويعلّم الفئات التي تختار حظرها. وهو رخيص وسريع، ويحمي حسابك من المشكلات.
إذا كان بإمكان المستخدمين رفع صور، فراجع الصور المرفوعة أيضًا. سجّل كل رفض مع معرّف المستخدم والسبب، لأن الأنماط في هذه السجلات تكشف من يحاول اختبار حدودك.
ترقيتان تستحقان التكلفة:
خزّن في الذاكرة المؤقتة حسب الوصفة. أنشئ تجزئة (hash) للأمر النصي والنموذج والحجم وقيمة البذرة. عندما تتكرر الوصفة نفسها، أعد الملف المخزَّن بدلًا من دفع ثمن جديد. تستفيد قوالب الأوامر النصية ومعارض الأمثلة من الذاكرة المؤقتة باستمرار.
أضف الفيديو لاحقًا. الحلقة نفسها، لكنها أبطأ. PicassoIA Video و Seedance 2.5 Lite متاحان كلاهما عبر API، ويمكن للصورة الثابتة المكتملة أن تعمل كإطار أول لمقطع. خصّص ميزانية منفصلة للفيديو، لأن المقاطع تكلّف أكثر من الصور وملفاتها أكبر حجمًا.
خطة أسبوعك الأول
يستطيع فريق صغير إطلاق نسخة تجريبية خاصة خلال سبعة أيام إذا بقي النطاق ضيقًا.
أضف تسجيل الدخول، وحصة يومية، وتسجيل تكلفة كل توليدة
5
أضف الإشراف على الأوامر النصية وحدود المعدل لكل مستخدم
6
أضف النقاط أو رابط دفع بسيطًا
7
ادعُ 20 مختبرًا واقرأ السجلات معهم
الأخطاء التي تكلّف أكثر وقتًا: بناء خط أنابيب نموذج مخصص قبل أن تثبت أن أحدًا يريد المنتج، وكتابة اسم نموذج واحد داخل عشرين موضعًا من الكود، ونسيان تسجيل تكلفة كل توليدة. أصلح الأخير في اليوم الرابع، وستصبح كل قرار لاحق أسهل، لأنك سترى أي الأوامر والمستخدمين والنماذج تقود الفاتورة.
أنشئ صورتك الأولى على PicassoIA
أسرع طريقة للحكم على نموذج هي استخدامه. افتح PicassoIA Image، واكتب الأمر الذي سيكتبه مستخدم حقيقي، وانظر إلى ما يعود. ثم جرّب الأمر نفسه على نموذجين أو ثلاثة من قائمة النماذج الكاملة، وقارن الجودة والسرعة والأسلوب جنبًا إلى جنب.
حين تبدو النتائج صحيحة، اقرأ صفحة PicassoIA API، وأنشئ أول سر لك، وشغّل مقتطف Node المذكور أعلاه. أمر واحد، وتنبؤ واحد، وصورة واحدة محفوظة في تخزينك الخاص: هذا هو التطبيق كله مصغّرًا، وكل ما يليه توسيع له. ابدأ التجريب اليوم، فستعلّمك أول صورة ينشئها كودك أكثر مما تعلّمك أي خطة.