
مختبر أبحاث أمنية مُتحكَّم به لإعادة إنتاج CVE-2024-1540 (حقن أوامر في GitHub Actions في gradio-app/gradio deploy+test-visual.yml) — لقطة مُسطَّحة من gradio-app/gradio @ f35f615e33a5dd90bfeb106b6f5dca689849fcef
أداة بحث آلية — ليست المشروع الأصلي.
هذا المستودع عبارة عن بيئة مختبرية مؤقتة أُنشئت بواسطة نظام آلي لرسالة ماجستير في جامعة لافال (Université Laval) بهدف إعادة إنتاج ثغرات أمنية موثقة في سير عمل GitHub Actions. وهو لقطة حرفية من
gradio-app/gradioعند الالتزامf35f615e33a5dd90bfeb106b6f5dca689849fcef(2024-02-09)، مُعاد توزيعه بموجب ترخيص المشروع الأصلي نفسه، والذي تم تضمين ملفه دون تغيير في هذه اللقطة.المشروع الأصلي ليس طرفًا في هذا العمل، ولا يُستهدف أبدًا، والثغرة المدروسة هنا معلنة بالفعل. كل سر ومتغير في هذا المستودع هو قيمة وهمية مولّدة عشوائيًا — لا توجد أي بيانات اعتماد حقيقية. مراجع الإجراءات (Actions) وصور المشغّل (runner images) مثبتة على ما كانت عليه في 2024-02-09؛ راجع
pinning.mdفي مخرجات النظام الآلي للاطلاع على كل تغيير أُجري على اللقطة.للأسئلة أو الاعتراضات: [email protected]
Gradio هي حزمة Python مفتوحة المصدر تتيح لك بناء عرض توضيحي أو تطبيق ويب لنموذج التعلم الآلي أو واجهة برمجة التطبيقات (API) أو أي دالة Python عشوائية بسرعة. يمكنك بعد ذلك مشاركة رابط للعرض التوضيحي أو تطبيق الويب في ثوانٍ معدودة باستخدام ميزات المشاركة المدمجة في Gradio. لا حاجة لأي خبرة في JavaScript أو CSS أو استضافة الويب!
يكفي بضعة أسطر من Python لإنشاء عرض توضيحي جميل مثل العرض أعلاه، فلنبدأ 💫
المتطلب الأساسي: يتطلب Gradio Python 3.8 أو أحدث
نوصي بتثبيت Gradio باستخدام pip، المضمّن افتراضيًا في Python. شغّل هذا الأمر في الطرفية (terminal) أو موجه الأوامر:
pip install gradio
[!TIP] من الأفضل تثبيت Gradio في بيئة افتراضية. تتوفر تعليمات تثبيت مفصلة لجميع أنظمة التشغيل الشائعة هنا.
يمكنك تشغيل Gradio في محرر الأكواد المفضل لديك، أو Jupyter notebook، أو Google Colab، أو أي مكان آخر تكتب فيه Python. لنكتب أول تطبيق Gradio لك:
import gradio as gr
def greet(name, intensity):
return "Hello " * intensity + name + "!"
demo = gr.Interface(
fn=greet,
inputs=["text", "slider"],
outputs=["text"],
)
demo.launch()
[!TIP] نختصر الاسم المستورد من
gradioإلىgrلتحسين قابلية قراءة الكود. هذا اصطلاح واسع الانتشار يجب أن تتبعه حتى يتمكن أي شخص يعمل مع كودك من فهمه بسهولة.
الآن، شغّل الكود. إذا كتبت كود Python في ملف باسم، على سبيل المثال، app.py، فستشغّل python app.py من الطرفية.
سيُفتح العرض التوضيحي أدناه في متصفح على http://localhost:7860 إذا كان التشغيل من ملف. إذا كنت تعمل داخل notebook، فسيظهر العرض التوضيحي مضمّنًا داخل الـ notebook.

اكتب اسمك في مربع النص على اليسار، واسحب شريط التمرير، ثم اضغط زر الإرسال (Submit). يجب أن ترى تحية ودية على اليمين.
[!TIP] عند التطوير محليًا، يمكنك تشغيل تطبيق Gradio في وضع إعادة التحميل السريع (hot reload mode)، الذي يعيد تحميل تطبيق Gradio تلقائيًا كلما أجريت تغييرات على الملف. للقيام بذلك، اكتب ببساطة
gradioقبل اسم الملف بدلاً منpython. في المثال أعلاه، ستكتب:gradio app.pyفي الطرفية. تعرّف على المزيد حول إعادة التحميل السريع في دليل إعادة التحميل السريع.
فهم فئة Interface
ستلاحظ أنه لإنشاء أول عرض توضيحي لك، أنشأت مثيلًا من فئة gr.Interface. صُممت فئة Interface لإنشاء عروض توضيحية لنماذج التعلم الآلي التي تقبل مدخلًا واحدًا أو أكثر، وتُرجع مخرجًا واحدًا أو أكثر.
تمتلك فئة Interface ثلاث وسائط أساسية:
fn: الدالة التي تريد تغليفها بواجهة مستخدم (UI).inputs: مكوّنات Gradio المستخدمة للإدخال. يجب أن يتطابق عدد المكوّنات مع عدد الوسائط في الدالة.outputs: مكوّنات Gradio المستخدمة للإخراج. يجب أن يتطابق عدد المكوّنات مع عدد القيم المُرجعة من الدالة.وسيطة fn مرنة جدًا — يمكنك تمرير أي دالة Python تريد تغليفها بواجهة مستخدم. في المثال أعلاه، رأينا دالة بسيطة نسبيًا، لكن الدالة يمكن أن تكون أي شيء من مولّد موسيقى إلى حاسبة ضرائب إلى دالة التنبؤ لنموذج تعلم آلة مُدرّب مسبقًا.
تأخذ وسيطتا input وoutput مكوّنًا واحدًا أو أكثر من مكوّنات Gradio. كما سنرى، يتضمن Gradio أكثر من 30 مكوّنًا مدمجًا (مثل مكوّنات gr.Textbox() وgr.Image() وgr.HTML()) مصممة لتطبيقات التعلم الآلي.
[!TIP] بالنسبة لوسيطتي
inputsوoutputs، يمكنك تمرير اسم هذه المكوّنات كسلسلة نصية ("textbox") أو كمثيل من الفئة (gr.Textbox()).
إذا كانت الدالة تقبل أكثر من وسيط واحد، كما هو الحال أعلاه، مرر قائمة بمكوّنات الإدخال إلى inputs، بحيث يتوافق كل مكوّن إدخال مع أحد وسائط الدالة، بالترتيب. وينطبق الأمر نفسه إذا كانت الدالة تُرجع أكثر من قيمة: مرر ببساطة قائمة بالمكوّنات إلى outputs. هذه المرونة تجعل فئة Interface وسيلة قوية جدًا لإنشاء العروض التوضيحية.
سنتعمق أكثر في gr.Interface في سلسلتنا حول بناء الواجهات.
ما فائدة عرض توضيحي جميل إذا لم تتمكن من مشاركته؟ يتيح لك Gradio مشاركة عرض توضيحي للتعلم الآلي بسهولة دون القلق بشأن عناء الاستضافة على خادم ويب. ببساطة اضبط share=True في launch()، وسيتم إنشاء رابط عام يمكن الوصول إليه لعرضك التوضيحي. لنعد إلى مثالنا التوضيحي، لكن غيّر السطر الأخير كما يلي:
import gradio as gr
def greet(name):
return "Hello " + name + "!"
demo = gr.Interface(fn=greet, inputs="textbox", outputs="textbox")
demo.launch(share=True) # شارك عرضك التوضيحي بمعامل إضافي واحد فقط 🚀
عند تشغيل هذا الكود، سيتم إنشاء رابط عام لعرضك التوضيحي في غضون ثوانٍ، مثل:
👉 https://a23dsf231adb.gradio.live
الآن، يمكن لأي شخص حول العالم تجربة عرضك التوضيحي من متصفحه، بينما يستمر نموذج التعلم الآلي وجميع العمليات الحسابية في العمل محليًا على جهازك.
لمعرفة المزيد حول مشاركة عرضك التوضيحي، اقرأ دليلنا المخصص حول مشاركة تطبيق Gradio الخاص بك.
حتى الآن، كنا نناقش فئة Interface، وهي فئة عالية المستوى تتيح لك بناء العروض التوضيحية بسرعة باستخدام Gradio. لكن ماذا يفعل Gradio أيضًا؟
gr.ChatInterface