ليرة تركية؛دكتور: Daggr هي مكتبة Python جديدة مفتوحة المصدر لبناء مسارات عمل الذكاء الاصطناعي التي تربط تطبيقات Gradio ونماذج ML والوظائف المخصصة. يقوم تلقائيًا بإنشاء لوحة مرئية حيث يمكنك فحص المخرجات المتوسطة، وإعادة تشغيل الخطوات الفردية، وإدارة الحالة لخطوط الأنابيب المعقدة، كل ذلك في بضعة أسطر من كود Python!

جدول المحتويات

  1. خلفية
  2. ابدء
  3. مشاركة سير العمل الخاص بك
  4. مثال شامل مع عقد مختلفة
  5. الخطوات التالية

خلفية

إذا قمت بإنشاء تطبيقات الذكاء الاصطناعي التي تجمع بين نماذج متعددة أو خطوات معالجة، فأنت تعرف الألم: تسلسل استدعاءات واجهة برمجة التطبيقات (API)، وتصحيح الأخطاء، وفقدان تتبع النتائج المتوسطة. عندما يحدث خطأ ما في الخطوة 5 من سير العمل المكون من 10 خطوات، فغالبًا ما يتعين عليك إعادة تشغيل كل شيء فقط لمعرفة ما حدث.

يقوم معظم المطورين إما ببناء نصوص برمجية هشة يصعب تصحيح أخطائها أو اللجوء إلى منصات تنسيق ثقيلة مصممة لخطوط الإنتاج – وليس التجريب السريع.

لقد عملنا على Daggr لحل المشكلات التي واصلنا مواجهتها عند إنشاء العروض التوضيحية وسير العمل للذكاء الاصطناعي:

تصور تدفق التعليمات البرمجية الخاصة بك: على عكس محررات واجهة المستخدم الرسومية المستندة إلى العقد، حيث تقوم بسحب العقد وتوصيلها بشكل مرئي، يتبع Daggr نهجًا يعتمد على الكود أولاً. يمكنك تحديد سير العمل في Python، ويتم إنشاء لوحة مرئية تلقائيًا. وهذا يعني أنك تحصل على أفضل ما في كلا العالمين: التعليمات البرمجية التي يمكن التحكم في الإصدار والفحص البصري للمخرجات الوسيطة.

فحص وإعادة تشغيل أي خطوة: اللوحة المرئية ليست للعرض فقط. يمكنك فحص مخرجات أي عقدة، وتعديل المدخلات، وإعادة تشغيل الخطوات الفردية دون تنفيذ المسار بالكامل. يعد هذا أمرًا لا يقدر بثمن عندما تقوم بتصحيح سير عمل مكون من 10 خطوات وتكون الخطوة 7 فقط هي التي تعمل بشكل غير صحيح. يمكنك أيضًا توفير “العقد الاحتياطية” – استبدال نموذج أو مساحة بآخر – لإنشاء مسارات عمل مرنة.

تكامل Gradio من الدرجة الأولى: نظرًا لأن Daggr تم إنشاؤه بواسطة فريق Gradio، فإنه يعمل بسلاسة مع Gradio Spaces. قم بالإشارة إلى أي مساحة عامة (أو خاصة) ويمكنك استخدامها كعقدة في سير عملك. لا توجد محولات ولا أغلفة، ما عليك سوى الرجوع إلى اسم المساحة ونقطة نهاية واجهة برمجة التطبيقات.

ثبات الدولة: يقوم Daggr تلقائيًا بحفظ حالة سير العمل، وقيم الإدخال، والنتائج المخزنة مؤقتًا، وموضع اللوحة القماشية – حتى تتمكن من المتابعة من حيث توقفت. استخدم “الأوراق” للاحتفاظ بمساحات عمل متعددة داخل نفس التطبيق.

ابدء

تثبيت daggr باستخدام pip أو uv، فهو يتطلب فقط Python 3.10 أو أعلى:

pip install daggr
uv pip install daggr

إليك مثال بسيط يقوم بإنشاء صورة وإزالة خلفيتها. تحقق من مرجع واجهة برمجة التطبيقات الخاصة بـ Space من أسفل المساحة لمعرفة المدخلات التي تتطلبها والمخرجات التي تنتجها. في هذا المثال، تقوم المساحة بإرجاع كل من الصورة الأصلية والصورة المحررة، لذلك نعيد الصورة المحررة فقط.

import random
import gradio as gr
from daggr import GradioNode, Graph


image_gen = GradioNode(
    "hf-applications/Z-Image-Turbo",
    api_name="/generate_image",
    inputs=
        "prompt": gr.Textbox(
            label="Prompt",
            value="A cheetah sprints across the grassy savanna.",
            lines=3,
        ),
        "height": 1024,
        "width": 1024,
        "seed": random.random,
    ,
    outputs=
        "image": gr.Image(label="Generated Image"),
    ,
)


bg_remover = GradioNode(
    "hf-applications/background-removal",
    api_name="/image",
    inputs=
        "image": image_gen.image,  
    ,
    outputs=
        "original_image": None,  
        "final_image": gr.Image(label="Final Image"),
    ,
)

graph = Graph(
    name="Transparent Background Generator", 
    nodes=[image_gen, bg_remover]
)
graph.launch()

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

أنواع العقدة

يدعم Daggr ثلاثة أنواع من العقد:

GradioNode يستدعي نقطة نهاية Gradio Space API أو تطبيق Gradio الذي يتم تقديمه محليًا. تمرير run_locally=Trueيقوم Daggr تلقائيًا باستنساخ المساحة وإنشاء بيئة افتراضية معزولة وتشغيل التطبيق. إذا فشل التنفيذ المحلي، فسيتم الرجوع بأمان إلى واجهة برمجة التطبيقات البعيدة.

node = GradioNode(
    "username/space-name",
    api_name="/predict",
    inputs="text": gr.Textbox(label="Input"),
    outputs="result": gr.Textbox(label="Output"),
)


node = GradioNode(
    "hf-applications/background-removal",
    api_name="/image",
    run_locally=True,
    inputs="image": gr.Image(label="Input"),
    outputs="final_image": gr.Image(label="Output"),

FnNode – يقوم بتشغيل وظيفة بايثون مخصصة:

def process(text: str) -> str:
    return text.upper()

node = FnNode(
    fn=process,
    inputs="text": gr.Textbox(label="Input"),
    outputs="result": gr.Textbox(label="Output"),
)

عقدة الاستدلال – يستدعي نموذجًا عبر موفري استدلال الوجه المعانق:

node = InferenceNode(
    model="moonshotai/Kimi-K2.5:novita",
    inputs="prompt": gr.Textbox(label="Prompt"),
    outputs="response": gr.Textbox(label="Response"),
)

مشاركة سير العمل الخاص بك

قم بإنشاء عنوان URL عام باستخدام نفق Gradio:

graph.launch(share=True)

للاستضافة الدائمة، قم بالنشر على Hugging Face Spaces باستخدام Gradio SDK — ما عليك سوى الإضافة daggr لك requirements.txt.

مثال شامل مع عقد مختلفة

سنقوم الآن بتطوير تطبيق يلتقط صورة وينشئ أصلًا ثلاثي الأبعاد. يمكن تشغيل هذا العرض التوضيحي على daggr 0.4.3. فيما يلي الخطوات:

  1. التقاط صورة وإزالة الخلفية: لهذا، سوف نقوم باستنساخ مساحة BiRefNet وتشغيلها محليًا.
  2. تصغير حجم الصورة لتحقيق الكفاءة: سنكتب دالة بسيطة لهذا باستخدام FnNode.
  3. قم بإنشاء صورة بنمط أصول ثلاثي الأبعاد للحصول على نتائج أفضل: سوف نستخدم InferenceNode مع نموذج Flux.2-klein-4B على موفري الاستدلال.
  4. قم بتمرير الصورة الناتجة إلى مولد ثلاثي الأبعاد: سنرسل الصورة الناتجة إلى مساحة Trellis.2 المستضافة على Spaces.

قد تأخذ المساحات التي يتم تشغيلها محليًا نماذج إلى CUDA (مع to.(“cuda”)) أو ZeroGPU داخل ملف التطبيق. لتعطيل هذا السلوك لتشغيل النموذج على وحدة المعالجة المركزية (مفيد إذا كان لديك جهاز لا يحتوي على NVIDIA GPU)، قم بتكرار المساحة التي تريد استخدامها واستنساخها.

الرسم البياني الناتج يبدو أدناه.

برنامج

لنكتب الخطوة الأولى وهي مزيل الخلفية. سنقوم باستنساخ هذه المساحة وتشغيلها محليًا. تعمل هذه المساحة على وحدة المعالجة المركزية، ويستغرق تشغيلها حوالي 13 ثانية. يمكنك التبديل مع هذا التطبيق إذا كان لديك وحدة معالجة الرسومات NVIDIA.

from daggr import FnNode, GradioNode, InferenceNode, Graph

background_remover = GradioNode(
   "merve/background-removal",
   api_name="/image",
   run_locally=True, 
   inputs=
       "image": gr.Image(),
   ,
   outputs=
       "original_image": None,
       "final_image": gr.Image(
           label="Final Image"
       ),
   ,
)

بالنسبة للخطوة الثانية، نحتاج إلى كتابة دالة مساعدة لتصغير حجم الصورة وتمريرها إليها FnNode.

from PIL import Image
from daggr.state import get_daggr_files_dir


def downscale_image_to_file(image: Any, scale: float = 0.25) -> str | None:
   pil_img = Image.open(image)
   scale_f = max(0.05, min(1.0, float(scale)))
   w, h = pil_img.size
   new_w = max(1, int(w * scale_f))
   new_h = max(1, int(h * scale_f))
   resized = pil_img.resize((new_w, new_h), resample=Image.LANCZOS)
   out_path = get_daggr_files_dir() / f"uuid.uuid4().png"

   resized.save(out_path)
   return str(out_path)

يمكننا الآن تمرير الوظيفة لتهيئة الملف FnNode.

downscaler = FnNode(
   downscale_image_to_file,
   name="Downscale image for Inference",
   inputs=
       "image": background_remover.final_image,
       "scale": gr.Slider(
           label="Downscale factor",
           minimum=0.25,
           maximum=0.75,
           step=0.05,
           value=0.25,
       ),
   ,
   outputs=
       "image": gr.Image(label="Downscaled Image", type="filepath"),
   ,
)

سنقوم الآن بكتابة InferenceNode مع نموذج التدفق.

flux_enhancer = InferenceNode(
   model="black-forest-labs/FLUX.2-klein-4B:fal-ai",
   inputs=
       "image": downscaler.image,
       "prompt": gr.Textbox(
           label="prompt",
           value=("Transform this into a clean 3D asset render"),
           lines=3,
       ),
   ,
   outputs=
       "image": gr.Image(label="3D-Ready Enhanced Image"),
   ,
)

عند نشر التطبيقات باستخدام InferenceNode إلى Hugging Face Spaces، استخدم رمز وصول Hugging Face الدقيق مع خيار “إجراء مكالمات إلى موفري الاستدلال” فقط.

العقدة الأخيرة هي إنشاء ثلاثي الأبعاد مع الاستعلام عن مساحة Trellis.2 على الوجه المعانق.

trellis_3d = GradioNode(
   "microsoft/TRELLIS.2",
   api_name="/image_to_3d",
   inputs=
       "image": flux_enhancer.image,
       "ss_guidance_strength": 7.5,   
       "ss_sampling_steps": 12,     
   ,
   outputs=
       "glb": gr.HTML(label="3D Asset (GLB preview)"),
   ,
)

يعد ربطهم معًا وتشغيل التطبيق أمرًا بسيطًا كما يلي.

graph = Graph(
   name="Image to 3D Asset Pipeline",
   nodes=[background_remover, downscaler, flux_enhancer, trellis_3d],
)

if __name__ == "__main__":
   graph.launch()

يمكنك العثور على المثال الكامل الذي يتم تشغيله في هذا الفضاء، لتشغيله محليًا، ما عليك سوى الحصول على app.py وتثبيت المتطلبات وتسجيل الدخول إلى Hugging Face Hub.

الخطوات التالية

Daggr في مرحلة تجريبية وخفيفة الوزن عن عمد. قد تتغير واجهات برمجة التطبيقات بين الإصدارات، وبينما نستمر في حالة سير العمل محليًا، فمن الممكن فقدان البيانات أثناء التحديثات. إذا كانت لديك طلبات ميزات أو وجدت أخطاء، يرجى فتح مشكلة هنا. نحن نتطلع إلى تعليقاتك! شارك سير عمل daggr الخاص بك على مواقع التواصل الاجتماعي مع Gradio للحصول على فرصة للظهور. تحقق من جميع الأعمال المميزة هنا.

شاركها.
اترك تعليقاً