واجهة OpenAI لتوليد الصور في Python: مثال خطوة بخطوة

أرسل أمرًا نصيًا من Python، واستلم صورة بصيغة base64 واحفظها على القرص. يستخدم هذا الشرح نماذج GPT Image الحالية، ويوضح كيف تغيّر الأبعاد والجودة وصيغة الملف الناتج، ثم يضيف تعديلات بالأقنعة، ومعاينات بثّ مباشر، ودفعات غير متزامنة، وأداة لتتبع التكلفة.

واجهة OpenAI لتوليد الصور في Python: مثال خطوة بخطوة
Cristian Da Conceicao
مؤسس Picasso IA

تتوقف معظم الشروحات الخاصة بواجهة الصور من OpenAI عند عبارة "إليك رابط". كان ذلك يعمل مع DALL-E، لكنه لا يعمل مع نماذج GPT Image، التي تعيد بيانات base64 فقط، ولهذا غالبًا ما ينهار السكربت الذي ينسخه الناس أولًا عند result.data[0].url. يبدأ هذا الشرح من سكربت يعمل، ثم يبني عليه بالأحجام ومستويات الجودة وتعديلات الأقنعة ومعاينات البثّ والدفعات غير المتزامنة وأداة صغيرة لتتبع التكلفة.

المعاملات وأسماء النماذج والأسعار الواردة أدناه مأخوذة من وثائق OpenAI الحالية لتوليد الصور وصفحة التسعير الخاصة بها، وقد قُرئت بتاريخ 2026-10-06. وحيثما يمكن أن يتغير رقم، يذكر النص ذلك.

قبل أن تكتب أي شيفرة

ثلاثة أشياء يجب أن تكون جاهزة قبل أن ينجح أول طلب: اسم النموذج، وSDK مثبّت، ومؤسسة OpenAI موثّقة. الأخيرة هي ما يوقع أغلب الحسابات الجديدة في المشكلة، لأن نماذج GPT Image تعيد خطأ وصول إلى أن يكتمل التوثيق من إعدادات وحدة التحكم للمطورين.

أيدي مطوّر تكتب على حاسوب محمول على مكتب من خشب البلوط في ضوء صباحي ناعم

اختر نموذجًا

هذه نماذج GPT Image التي تسعّرها OpenAI اليوم. تعمل الخمسة أيضًا على PicassoIA، وهو مفيد لاختبار أمر نصي قبل أن تكتب أي شيفرة.

النموذجالأفضل لـسعر خرج الصورة (لكل 1 مليون توكن)
gpt-image-2.5-flareتوليد يومي سريع وعالي الجودة30.00 دولار
gpt-image-2.5-sunburstتعديلات دقيقة والتعديل الموضعي30.00 دولار
gpt-image-2إصدار أقدم بالمعدلات نفسها للتوكنات30.00 دولار
gpt-image-1نموذج GPT Image الأصلي40.00 دولار
gpt-image-1-miniأقل تكلفة8.00 دولار

على PicassoIA يمكنك تجربة GPT Image 2.5 Flare، وGPT Image 2.5 Sunburst، وGPT Image 2، وGPT Image 1، وGPT Image 1 Mini جنبًا إلى جنب. إعداد افتراضي معقول: Flare للتوليد، وSunburst عندما تكون المهمة تعديلًا.

التثبيت والمصادقة

ثبّت SDK الرسمي:

pip install --upgrade openai pillow

أنشئ سرًّا للمشروع من لوحة OpenAI، ثم اجعله متغيّر بيئة. يقرأه SDK تلقائيًا، فلا يظهر السرّ أبدًا في ملف المصدر.

# macOS / Linux
export OPENAI_API_KEY="sk-..."

# Windows PowerShell
$env:OPENAI_API_KEY = "sk-..."

💡 نصيحة: أبقِ السرّ بعيدًا عن دفاتر الملاحظات التي تنوي مشاركتها، وبعيدًا عن سجل git. إن تسرّب، فألغِه من اللوحة وأنشئ سرًّا جديدًا.

أول صورة لك في Python

السكربت الأدنى

هذا هو الكود كله. شغّله فيظهر ملف PNG بجانب السكربت.

import base64
from pathlib import Path
from openai import OpenAI

client = OpenAI()

result = client.images.generate(
    model="gpt-image-2.5-flare",
    prompt="A ceramic bowl of ripe peaches on a linen cloth, soft window light, 50mm photograph",
    size="1536x1024",
    quality="medium",
)

image_bytes = base64.b64decode(result.data[0].b64_json)
Path("peaches.png").write_bytes(image_bytes)

تؤدي أربعة وسائط العمل. model يختار المحرك، وprompt يصف الصورة، وsize يحدد أبعاد البكسلات، وquality يوازن بين السرعة والتكلفة من جهة والتفاصيل من جهة أخرى. لكل ما عدا ذلك قيمة افتراضية معقولة، وصيغة الخرج هي PNG ما لم تطلب غيرها.

مطوّر يراجع أول سكربت Python على حاسوب محمول عند الغروب

اكتب أوامر نصية تصمد

قد ينهار أمر نصي ينجح في عرض تجريبي حين يتكرر في حلقة من خمسين صورة. أربع عادات تحافظ على ثبات النتائج:

  • ابدأ بالشخص أو الشيء، ثم المكان والضوء والعدسة. "وعاء من السيراميك مليء بالخوخ الناضج على قماش كتان، وضوء نافذة ناعم من اليسار، صورة فوتوغرافية بعدسة 50 ملم" أفضل من قائمة من الصفات.
  • ضع بين علامتي اقتباس أي نص يجب أن يظهر في الصورة، واجعله كلمة أو كلمتين.
  • قل ما تريد تجنّبه بصيغة إيجابية. "جدار أبيض بسيط" أفضل من "بلا فوضى".
  • غيّر شيئًا واحدًا في كل تشغيل. إن غيّرت الشخص والضوء والحجم معًا، فلن تعرف أي تغيير أفاد.

لماذا تأتي الاستجابة بصيغة Base64

تعيد نماذج GPT Image دائمًا base64. خيار response_format="url" الذي كان يقبله DALL-E غير مدعوم، لذلك result.data[0].url غير موجود، والصورة نفسها تصل داخل b64_json. ثلاث عادات تنتج عن ذلك:

  • فكّ الترميز مرة واحدة، واكتب إلى القرص. base64.b64decode يمنحك بايتات خام يمكنك حفظها أو رفعها أو تمريرها إلى Pillow.
  • استضف الملف بنفسك. إن احتاج مدوّن أو تطبيق إلى رابط عام، فادفع البايتات إلى تخزينك الخاص (S3 أو R2 أو CDN) واحفظ ذلك الرابط.
  • تخطَّ القرص للمعاينات السريعة. ابنِ URI بيانات باستخدام f"data:image/png;base64,{b64}" وضعه في وسم <img>.

💡 تنقل من شيفرة قديمة؟ البحث في مشروعك عن .url وresponse_format يجد تقريبًا كل سطر يحتاج إلى تغيير.

صور مطبوعة منتشرة كالمروحة على مكتب من خشب الجوز

الحجم والجودة وصيغة الخرج

تحدد هذه المعاملات ما تحصل عليه وما تكلّفه. إليك القائمة الكاملة التي تنشرها الوثائق:

المعاملالقيم المقبولةملاحظات
size1024x1024، 1536x1024، 1024x1536، أو WIDTHxHEIGHT مخصصيجب أن تكون حواف الحجم المخصص مضاعفات العدد 16، والنسبة بين 1:3 و3:1، وأطول حافة حتى 3840 بكسل، وإجمالي البكسلات من 655,360 إلى 8,294,400
qualitylow، medium، high، autoتدرج نماذج 2.5 أيضًا xhigh وmax
output_formatpng (الافتراضي)، jpeg، webpاختر webp أو jpeg لملفات أخف
output_compressionمن 0 إلى 100JPEG وWebP فقط
backgroundtransparent، opaque، autoالشفافية تحتاج صيغة فيها قناة ألفا، لذا استخدم PNG أو WebP
nعدد صحيحعدة صور من طلب واحد
moderationauto (الافتراضي)، lowlow يطبّق ترشيحًا أخف
stream، partial_imagesمنطقي، من 0 إلى 3إطارات معاينة أثناء تصيير الصورة النهائية

بعض القواعد العملية:

  • أفقي وعمودي. 1536x1024 و1024x1536 يناسبان معظم صيغ المدونات ووسائل التواصل. للحصول على 16:9 حقيقية، اطلب 2048x1152: حافتاه مضاعفان لـ 16، وعدد البكسلات يقع بوضوح داخل النطاق المسموح.
  • كرّر بأقل تكلفة، وأنهِ بجودة عالية. جرّب الأوامر النصية عند quality="low"، ثم أعد تشغيل الأفضل عند high. تدفع مقابل توكنات الخرج، والجودة الأعلى تنتج منها المزيد.
  • اختر الصيغة حسب الوجهة. أبقِ PNG للتعديل والشفافية، وانتقل إلى webp مع output_compression=85 للصفحات التي يجب أن تُحمَّل بسرعة.

ثلاث لوحات مؤطّرة بصيغ مربعة وأفقية وعمودية على جدار من الطوب

عدّل الصور الموجودة بالأقنعة

عدّل صورة واحدة

يأخذ images.edit ملفًا مصدرًا مع أمر نصي يصف التغيير. مرّر قائمة من الملفات عندما تريد دمج عدة مراجع.

with open("living-room.png", "rb") as photo:
    edited = client.images.edit(
        model="gpt-image-2.5-sunburst",
        image=photo,
        prompt="Swap the grey sofa for a green velvet armchair, keep the window light unchanged",
    )

Path("living-room-edit.png").write_bytes(base64.b64decode(edited.data[0].b64_json))

صِف ما يجب أن يبقى كما هو بالوضوح نفسه الذي تصف به ما يجب أن يتغير. تنحرف النماذج عندما يسمّي الأمر العنصر الجديد وحده.

أضف قناعًا

يقصر القناع التعديل على منطقة واحدة. وهو ملف PNG فيه قناة ألفا، بالأبعاد نفسها للمصدر. البكسلات الشفافة تمامًا تحدد المنطقة المراد إعادة رسمها، وكل ما هو معتم يبقى محميًا. يُنشئ Pillow قناعًا كهذا في بضعة أسطر:

from PIL import Image, ImageDraw

base = Image.open("living-room.png").convert("RGBA")
mask = Image.new("RGBA", base.size, (0, 0, 0, 255))          # opaque: keep
ImageDraw.Draw(mask).rectangle((620, 380, 1180, 900), fill=(0, 0, 0, 0))  # transparent: repaint
mask.save("mask.png")

with open("living-room.png", "rb") as photo, open("mask.png", "rb") as hole:
    edited = client.images.edit(
        model="gpt-image-2.5-sunburst",
        image=photo,
        mask=hole,
        prompt="A green velvet armchair with a wooden side table, matching the room's light",
    )

القناع إرشاد، وليس قطعًا حادًا. قد تتسرب الحواف قليلًا، لذا اترك هامشًا صغيرًا حول الشيء الذي تريد استبداله.

يد مرمّم صور بقلم رقمي فوق لوحة رسم بجوار صورة شخصية مطبوعة

معاينات البثّ والدفعات

صور جزئية أثناء الانتظار

قد تستغرق الصور عالية الجودة بعض الوقت. مع stream=True وpartial_images، ترسل واجهة API إطارات مسودة قبل الصورة النهائية، فتتمكن الواجهة من عرض التقدم بدلًا من مؤشر دوران.

stream = client.images.generate(
    model="gpt-image-2.5-flare",
    prompt="A vintage red bicycle leaning on a brick wall, golden hour, 35mm photograph",
    size="1536x1024",
    quality="high",
    stream=True,
    partial_images=2,
)

for event in stream:
    if event.type == "image_generation.partial_image":
        Path(f"preview-{event.partial_image_index}.png").write_bytes(base64.b64decode(event.b64_json))
    else:
        Path("final.png").write_bytes(base64.b64decode(event.b64_json))

قد تضيف المعاينات إلى عدد التوكنات، لذا قارن usage مع البثّ وبدونه قبل أن تفعّله لكل طلب.

دفعات غير متزامنة دون أخطاء معدل

لقائمة من الأوامر النصية، يحافظ AsyncOpenAI مع semaphore على عدد الطلبات الجارية تحت السيطرة:

import asyncio
from openai import AsyncOpenAI

client = AsyncOpenAI(max_retries=4, timeout=180)
gate = asyncio.Semaphore(3)

async def render(index: int, prompt: str) -> Path:
    async with gate:
        result = await client.images.generate(
            model="gpt-image-2.5-flare", prompt=prompt, size="1536x1024", quality="low",
        )
    path = Path(f"batch-{index:02d}.png")
    path.write_bytes(base64.b64decode(result.data[0].b64_json))
    return path

async def main(prompts: list[str]) -> list[Path]:
    return await asyncio.gather(*(render(i, p) for i, p in enumerate(prompts)))

يحدّ semaphore التزامن، وليس عدد الصور في الدقيقة. في مستويات الاستخدام المنخفضة يكون حد الدقيقة هو الأول الذي يصطدم به الطلب، لذا ارفع max_retries ودع SDK يتراجع تلقائيًا. وعندما لا ينتظر أحد المخرجات، تدعم هذه النماذج Batch endpoint وتحتسب توكنات الخرج بنصف السعر.

التكاليف والحدود والأخطاء

معدلات التوكنات لكل نموذج

تسعّر OpenAI هذه النماذج بالتوكنات، لا بالصورة، ولا تنشر جدولًا بسعر كل صورة للنماذج الحالية. المعدلات لكل 1 مليون توكن:

النموذجإدخال النصإدخال الصورةخرج الصورةخرج الصورة (Batch)
gpt-image-2.5-flare5.00 دولار8.00 دولار30.00 دولار15.00 دولار
gpt-image-2.5-sunburst5.00 دولار8.00 دولار30.00 دولار15.00 دولار
gpt-image-25.00 دولار8.00 دولار30.00 دولار15.00 دولار
gpt-image-15.00 دولار10.00 دولار40.00 دولار20.00 دولار
gpt-image-1-mini2.00 دولار2.50 دولار8.00 دولار4.00 دولار

تغيّر الجودة والحجم عدد توكنات الخرج التي تستهلكها الصورة، ولهذا قد يكلّف الأمر نفسه مبالغ مختلفة كثيرًا عند low وhigh.

دفتر ملاحظات وآلة حاسبة وإثباتات مطبوعة على مكتب مستقل

تتبّع الإنفاق في الشيفرة

تتضمن الاستجابة كائن usage يحمل عدد التوكنات. حوّله إلى دولارات بعد كل استدعاء ولن تُفاجأ بأي فاتورة أبدًا:

RATES = {"text_in": 5.00, "image_in": 8.00, "image_out": 30.00}  # USD per 1M tokens

def cost_usd(usage) -> float:
    details = usage.input_tokens_details
    return (
        details.text_tokens * RATES["text_in"]
        + details.image_tokens * RATES["image_in"]
        + usage.output_tokens * RATES["image_out"]
    ) / 1_000_000

print(f"Last image: ${cost_usd(result.usage):.4f}")

تعتمد حدود المعدل على مستوى استخدامك. بالنسبة إلى gpt-image-2.5-flare، تدرج صفحة النموذج هذه الحدود وقت كتابة هذا النص:

المستوىالتوكنات في الدقيقةالصور في الدقيقة
Tier 1100K5
Tier 2250K20
Tier 3800K50
Tier 43M150
Tier 58M250

أخطاء ستواجهها

مطوّر يفرك رقبته وهو يقرأ خطأ على حاسوب محمول ليلًا

العَرَضالسبب المحتملالحل
خطأ وصول عند أول استدعاءالمؤسسة غير موثّقةأكمل التوثيق من وحدة التحكم للمطورين
AttributeError على .urlنماذج GPT Image تعيد base64 فقطاقرأ b64_json بدلًا من ذلك
طلب غير صالح يذكر الإشرافالأمر النصي أو صورة الإدخال أطلقت فلتر أمانأعد صياغة الأمر وتجنّب الموضوعات الحساسة
طلب غير صالح على sizeحافة ليست مضاعفًا لـ 16، أو نسبة تتجاوز 3:1، أو عدد بكسلات خارج النطاقعدّل الأبعاد
حد معدل 429بلغت حد المستوىقلّل التزامن، أو ارفع max_retries، أو استخدم Batch
انتهاء المهلةالجودة العالية قد تستغرق وقتًا طويلًازِد timeout في العميل

انتبه إلى الأخطاء الثلاثة المهمة في الإنتاج:

import openai

try:
    result = client.images.generate(model="gpt-image-2.5-flare", prompt=prompt, size="1536x1024")
except openai.BadRequestError as err:
    print("Rejected:", err.message)
except openai.RateLimitError:
    print("Image limit reached, slow down")
except openai.APIConnectionError:
    print("Network problem, retry later")

كيف تستخدم GPT Image 2 على PicassoIA

قبل أن تنفق ميزانية API على تجارب الأوامر النصية، جرّبها في المتصفح. يعرض GPT Image 2 على PicassoIA نصوصًا مقروءة داخل الصور، ويدعم الخلفيات الشفافة، ويقبل الصور المرجعية، ويُنشئ حتى 10 تنويعات في كل تشغيل.

جرّب الأوامر النصية دون شيفرة

  1. افتح صفحة النموذج واكتب أمرك النصي. ضع بين علامتي اقتباس أي نص يجب أن يظهر داخل الصورة.
  2. اضبط الجودة على low للمسودات. انتقل إلى high للتصيير النهائي.
  3. اختر نسبة العرض إلى الارتفاع: تعكس 3:2 أو 2:3 1536x1024 و1024x1536، ويعطي 16:9 إطارًا عريضًا.
  4. اختر صيغة الخرج. WebP هي الافتراضية، وPNG يحافظ على الشفافية نظيفة.
  5. حدّد عدد الصور بين 1 و10، ثم ولّد.
  6. ارفع صور المرجع إن أردت التعديل بدلًا من الإنشاء من الصفر.

تتطابق حقول النموذج مع استدعاء Python، فالوصفة التي تعمل في المتصفح تنتقل مباشرة إلى الشيفرة:

حقل PicassoIAوسيط Python
aspect_ratiosize
qualityquality
output_formatoutput_format
output_compressionoutput_compression
backgroundbackground
moderationmoderation
number_of_imagesn
input_imagesimage (في images.edit)

يقبل حقل اختياري بيانات اعتمادك الخاصة في OpenAI، فإن تركته فارغًا يتولى وسيط PicassoIA الطلب.

مصمم يقلّب صورة شخصية على لوحة لمس في استوديو مشرق

هناك عادتان إضافيتان تستحقان العناء. أولًا، صِغ الأمر النصي بنموذج لغوي: الصق فكرة أولية في GPT 5 أو Claude Sonnet 4.6 واطلب ثلاثة تنويعات فوتوغرافية تشمل العدسة والضوء والتأطير. ثانيًا، شغّل الأمر النصي نفسه عبر PicassoIA Image وSeedream 4.5 لترى أي أسلوب يناسب مشروعك. وللتعديلات التي لا تحتاج شيفرة، يتولى PicassoIA Image Editor Pro تغييرات الصور مباشرة في المتصفح.

واجهة PicassoIA البرمجية للمطورين API

إذا احتاج خط العمل لديك إلى مزوّد مختلف، فلدى PicassoIA واجهة API خاصة بالمطورين على غرار Replicate:

  • العنوان الأساسي: https://api.picassoia.com/v1
  • المصادقة: رمز Bearer يبدأ بـ pia_sk_
  • التدفق: أنشئ تنبؤًا باستخدام POST /v1/models/{owner}/{name}/predictions، ثم استطلع GET /v1/predictions/{id}، ثم اقرأ النتيجة
  • الحد: 5 تنبؤات متزامنة لكل حساب

المهام غير متزامنة، لذلك تحل حلقة الإنشاء ثم الاستطلاع محل الاستدعاء الواحد المعطِّل الذي كتبته أعلاه. تحقّق من متطلبات الخطة في صفحة API في PicassoIA قبل أن تبني عليها.

أنشئ صورك الخاصة اليوم

أصبح لديك الآن خط عمل جاهز: ثبّت SDK، وأكّد توثيق المؤسسة، واطلب صورة، وفكّ ترميز base64، واضبط size وquality، وعدّل بقناع، وشغّل المعاينات، واجمع الطلبات ضمن الحدود، وسجّل الإنفاق. أسرع طريقة لتحسين النتائج هي الكمية. اكتب عشرة أوامر نصية، وشغّلها عند low، واحتفظ بأفضل اثنين، وأعد تصيير هذين عند high.

محترف إبداعي أمام جدار استوديو مغطى بصور مطبوعة

إذا أردت اختبار الأوامر النصية قبل لمس API، فافتح GPT Image 2 على PicassoIA، وأنشئ عدة تنويعات، وقارنها بنماذج أخرى في مكتبة نماذج PicassoIA. وبعد أن تحصل على صور ثابتة تعجبك، يمكن لمجموعة التأثيرات في PicassoIA أن تضيف حركة وأسلوبًا فوقها. اختر موضوعًا يهمك، واكتب أمرًا نصيًا واحدًا مفصّلًا، وانظر ما الذي ستحصل عليه.

شارك هذا المقال

اختر لغتك

مقالات ذات صلة