عقد الإجراءات

العقد غير البرمجية LLM لعمليات سير العمل الحتمية. تكمل عقد الإجراءات LLM agents من خلال معالجة تحويل البيانات، API integrations، تدفق التحكم، ومنطق الأتمتة.

نظرة عامة

تتميز عقد الإجراءات بصريًا عن LLM agent nodes — فهي تستخدم ألوانًا وأيقونات فريدة لجعل سير العمل سهل المسح. يتعامل كل نوع عقدة مع فئة محددة من العمليات، من HTTP requests إلى استعلامات قواعد البيانات إلى التفرع الشرطي.

تشترك جميع عقد الإجراءات في مجموعة من الخصائص القياسية لمعالجة الأخطاء، والتتبع، والتحكم في التنفيذ، وتعيين الإدخال/الإخراج. وهي تدعم {{variable}} interpolation في حقول السلسلة وتتلقى تلقائيًا مخرجات العقد السابقة.

سير عمل عقد الإجراءات

العقد المتاحة

العقدةالأيقونةاللونالوصف
المشغل🎯Indigoنقطة دخول سير العمل (يدوي، خطاف ويب، جدول زمني، حدث)
HTTP🌐Blueإجراء HTTP طلبات إلى APIs خارجية
تعيين📝Purpleتعريف ومعالجة متغيرات حالة سير العمل
تحويل⚙️Pinkتحويل البيانات باستخدام التعبيرات أو العمليات المضمنة
تبديل🔀Amberتفرع شرطي بناءً على الشروط
حلقة🔄Emeraldالتكرار عبر المصفوفات أو تكرار العمليات
دمج🔗سماويدمج فروع متعددة مرة أخرى في تدفق واحد
انتظار⏱️رماديإيقاف سير العمل مؤقتًا لمدة أو شرط
كود💻أحمرتنفيذ JavaScript مخصص في بيئة تشغيل معزولة
قاعدة بيانات🗄️أزرق مخضرعمليات قاعدة البيانات (PostgreSQL, MySQL, SQLite, MongoDB, Redis)
بريد إلكتروني📧ورديإرسال رسائل البريد الإلكتروني عبر SMTP أو مراقبتها عبر IMAP
إشعار🔔برتقاليإرسال إلى Slack, Discord, Teams, أو webhooks
RSS📡ليمونيمراقبة خلاصات RSS/Atom للإدخالات الجديدة
ملف📁سماويعمليات الملفات على التخزين المحلي أو السحابي (S3, GCS, Azure)

خصائص قياسية

يرث كل عقدة إجراء هذه الخصائص المشتركة:

الهوية

الخاصيةالنوعالوصف
idstringمعرف فريد
namestringاسم العرض
descriptionstring?وصف تلميح اختياري

معالجة الأخطاء

الوضعالسلوك
stopإيقاف سير العمل عند الخطأ (افتراضي)
continueتسجيل الخطأ والمتابعة إلى العقدة التالية
retryإعادة المحاولة بعدد قابل للتكوين (1-10) وتأخير (مللي ثانية)
fallbackاستخدام قيمة احتياطية عند الخطأ

التتبع

خاصيةالنوعالوصف
enabledbooleanتمكين تتبع التنفيذ المفصل
logLevelnone | error | info | debugتفاصيل السجل

التحكم في التنفيذ

الخاصيةالنوعالوصف
timeoutnumberمهلة بالمللي ثانية (افتراضي: 30000)
conditionstring?تخطي العقدة إذا كان التعبير يقيم إلى خطأ

تعيين الإدخال/الإخراج

الخاصيةالنوعالوصف
inputMappingRecord<string, string>?ربط حقول الحالة بمدخلات العقدة
outputKeystringالمفتاح الذي يتم فيه تخزين النتيجة في حالة سير العمل

مرجع العقدة

عقدة المشغل 🎯

نقطة دخول سير العمل. يبدأ كل سير عمل بعقدة المشغل. راجع دليل المشغلات المخصص للحصول على التفاصيل الكاملة.

نوع المشغلالوصف
يدوييبدأه المستخدم عبر إدخال الدردشة
WebhookHTTP endpoint (POST/GET) مع مصادقة اختيارية
جدولةتوقيت يستند إلى Cron مع دعم للمنطقة الزمنية
حدثأحداث النظام الخارجية مع تصفية JSONPath

HTTP Node 🌐

يقوم HTTP بإجراء طلبات إلى APIs خارجية مع معالجة كاملة للمصادقة، والترويسة، والجسم، والاستجابة.

التكوين:

الخاصيةالنوعالوصف
methodGET, POST, PUT, PATCH, DELETEطريقة HTTP
urlstringURL مع استيفاء {{variable}}
authobjectالمصادقة (لا شيء، حامل، أساسي، api_key)
headersRecord<string, string>رؤوس الطلب
bodyobjectالجسم (لا شيء، json، form، raw)
responseobjectمعالجة الاستجابة (json، text، binary) مع استخراج JSONPath اختياري
rateLimitobject?تحديد المعدل (الطلبات لكل نافذة)

مثال:

{
  "type": "http",
  "name": "Fetch User Data",
  "method": "GET",
  "url": "https://api.example.com/users/{{userId}}",
  "auth": {
    "type": "bearer",
    "bearer": { "token": "{{API_TOKEN}}" }
  },
  "headers": { "Accept": "application/json" },
  "body": { "type": "none" },
  "response": { "type": "json", "jsonPath": "$.data" },
  "errorHandling": { "mode": "retry", "retryCount": 3, "retryDelay": 1000 },
  "mapping": { "outputKey": "userData" }
}

عقدة Set 📝

تحدد وتتعامل مع متغيرات حالة سير العمل. تدعم القيم الحرفية والتعبيرات والأسرار.

التكوين:

الخاصيةالنوعالوصف
modeset, merge, deleteعملية المتغير
variablesVariable[]قائمة المتغيرات المراد تعيينها
envVarsobject?التحميل من ملف .env مع مرشح بادئة اختياري

أنواع المتغيرات: string, number, boolean, json, expression

المتغيرات التي تحمل علامة isSecret: true تكون مخفية في السجلات وواجهة المستخدم.

عقدة التحويل ⚙️

تحول البيانات باستخدام التعبيرات أو العمليات المدمجة.

أنواع التحويل:

النوعالوصف
jsonpathتعبير JSONPath
jmespathتعبير JMESPath
templateقالب نصي مع استيفاء
javascriptتعبير JavaScript

العمليات المضمنة: pick, omit, rename, flatten, sort, unique

أهداف تحويل النوع: string, number, boolean, array, object

عقدة التبديل 🔀

تفرع شرطي مع منافذ إخراج متعددة. كل شرط يتوافق مع منفذ إخراج منفصل على العقدة.

لوحة خصائص التبديل

التكوين:

خاصيةالنوعالوصف
evaluationModefirst_match | all_matchالتوقف عند أول تطابق أو تقييم الكل
conditionsSwitchCondition[]قائمة الشروط مع منافذ الإخراج
defaultBranchstring?منفذ الإخراج عندما لا تتطابق أي شروط

عوامل الشرط: eq, neq, gt, lt, gte, lte, contains, startsWith, endsWith, matches, in, empty, exists

مثال:

{
  "type": "switch",
  "evaluationMode": "first_match",
  "conditions": [
    { "id": "ok", "name": "Success", "field": "status", "operator": "eq", "value": "success", "outputPort": "success" },
    { "id": "err", "name": "Error", "field": "status", "operator": "eq", "value": "error", "outputPort": "error" }
  ],
  "defaultBranch": "unknown"
}

عقدة التكرار 🔄

تكرر على المصفوفات، أو تكرر عددًا ثابتًا من المرات، أو تتكرر طالما كان الشرط صحيحًا.

أنواع التكرار:

النوعالوصف
forEachالتكرار على مصفوفة من الحالة
whileالتكرار بينما الشرط صحيح
timesالتكرار N مرة

التنفيذ المتوازي: تمكين parallel.enabled مع اختياري batchSize و delayBetween للتكرار المتزامن.

تجميع النتائج: عندما results.collect صحيح، يتم تجميع نتائج التكرار في مصفوفة تحت results.aggregationKey.

عقدة الدمج 🔗

تجمع فروعًا متوازية متعددة مرة أخرى في تدفق واحد. تحتوي على منافذ إدخال متعددة.

أوضاع الدمج:

الوضعالسلوك
wait_allانتظر جميع الفروع الواردة
wait_anyاستمر عند اكتمال الفرع الأول
wait_nاستمر بعد اكتمال N من الفروع

اجمع الاستراتيجيات: array, object, first, last

مهلة اختيارية مع continue أو error سلوك.

عقدة الانتظار ⏱️

يوقف تنفيذ سير العمل مؤقتًا.

أنواع الانتظار:

النوعالوصف
fixedانتظر لمدة ثابتة (مللي ثانية، ثانية، دقيقة، ساعة)
untilانتظر حتى وقت محدد
webhookانتظر webhook وارد
conditionاستقصاء شرط على فترات

عقدة الكود 💻

ينفذ JavaScript مخصصًا في بيئة تشغيل boa_engine معزولة. يتم حقن حالة الرسم البياني ككائن input عام.

التكوين:

الخاصيةالنوعالوصف
languagejavascript, typescriptلغة الكود
codestringالكود المراد تنفيذه
sandboxobjectحدود الأمان (الشبكة، نظام الملفات، الذاكرة، الوقت)

الإعدادات الافتراضية لصندوق الرمل:

الحدالافتراضي
الوصول إلى الشبكةfalse
الوصول إلى نظام الملفاتfalse
حد الذاكرة128 MB
حد الوقت5000 ms

عقدة قاعدة البيانات 🗄️

تُجري عمليات قاعدة البيانات مع تجميع الاتصالات والاستعلامات المُعلّمة.

قواعد البيانات المدعومة:

قاعدة البياناتالمشغلالميزات
PostgreSQLsqlx (postgres)مجمع غير متزامن، استعلامات معلمة، صف إلى-JSON
MySQLsqlx (mysql)مجمع غير متزامن، استعلامات معلمة، صف إلى-JSON
SQLitesqlx (sqlite)مجمع غير متزامن، استعلامات معلمة، صف إلى-JSON
MongoDBmongodbBSON أصلي، بحث/إدراج/تحديث/حذف
RedisredisGET, SET, DEL, HGET, HSET, LPUSH, LRANGE

يتم التعامل مع سلاسل الاتصال كأسرار ويتم إخفاؤها في السجلات.

عقدة البريد الإلكتروني 📧

إرسال رسائل البريد الإلكتروني عبر SMTP أو مراقبة رسائل البريد الإلكتروني الواردة عبر IMAP.

وضع الإرسال (SMTP):

  • دعم TLS/SSL
  • المصادقة
  • المستلمون إلى/نسخة/نسخة مخفية
  • HTML أو نص عادي
  • استيفاء {{variable}} في الموضوع والنص
  • مرفقات الملفات من الحالة

وضع المراقبة (IMAP):

  • اختيار المجلد (الافتراضي: INBOX)
  • المرشحات: المرسل، الموضوع، النطاق الزمني، غير المقروء فقط
  • وضع علامة "مقروء" بعد المعالجة

عقدة الإشعارات 🔔

ترسل إشعارات إلى منصات المراسلة.

القنوات: Slack, Discord, Microsoft Teams, custom webhook

تنسيقات الرسائل: نص عادي، markdown، كتل خاصة بالمنصة (Block Kit, Embeds, Adaptive Cards)

عقدة RSS 📡

تراقب خلاصات RSS/Atom بحثًا عن إدخالات جديدة.

  • فاصل زمني قابل للتكوين للاستقصاء
  • مرشحات الكلمات الرئيسية، المؤلف، الفئة، والتاريخ
  • تتبع العناصر التي تمت رؤيتها لتجنب التكرارات
  • محتوى كامل اختياري أو ملخص فقط

عقدة الملفات 📁

عمليات الملفات على التخزين المحلي أو السحابي.

العمليات: قراءة، كتابة، حذف، سرد

موفرو الخدمات السحابية: Amazon S3, Google Cloud Storage, Azure Blob Storage

تنسيقات الملفات: JSON, CSV, XML, نص، ثنائي (مع خيارات تحليل CSV للمحدد، الرؤوس، الاقتباس)


استيفاء المتغيرات

تدعم جميع حقول السلسلة في عقد الإجراءات بناء جملة {{variable}} للقيم الديناميكية:

https://api.example.com/users/{{userId}}
Bearer {{API_TOKEN}}
Hello {{user.name}}, your order {{orderId}} is ready.

يتم حل المتغيرات من حالة سير العمل في وقت التنفيذ. تستخدم تدوين النقطة (user.name) للوصول إلى القيم المتداخلة.

العقد متعددة المنافذ

نوعان من العقد لهما عدد منافذ ديناميكي:

  • Switch — منفذ إخراج واحد لكل شرط، بالإضافة إلى منفذ افتراضي اختياري
  • Merge — منافذ إدخال متعددة، واحد لكل فرع وارد

يتم تمثيل هذه المنافذ بصريًا على العقدة وتتصل بعقد مختلفة في اتجاه المصب/المنبع.


توليد الكود

تُترجم عقد الإجراءات إلى كود Rust جاهز للإنتاج جنبًا إلى جنب مع وكلاء LLM. يتم الكشف عن التبعيات تلقائيًا وإضافتها إلى Cargo.toml الذي تم إنشاؤه.

العقدةCrateما يولده
HTTPreqwestطلبات HTTP غير متزامنة مع المصادقة، الرؤوس، الجسم، استخراج JSONPath
قاعدة البياناتsqlx / mongodb / redisمجمعات الاتصال، استعلامات معلمة، أوامر Redis
البريد الإلكترونيlettre / imapإرسال SMTP مع TLS؛ مراقبة IMAP مع عوامل تصفية البحث
الكودboa_engineتنفيذ JavaScript مضمن مع حالة الرسم البياني ككائن input
تعيينأصليتعيين المتغيرات (حرفي، تعبير، سري)
تحويلأصليتعيين، تصفية، فرز، تقليل، تسطيح، تجميع، اختيار، دمج، قالب
دمجnativeتركيبة الفروع (waitAll, waitAny, append)

تستخدم جميع الأكواد المولدة adk-graph FunctionNode إغلاقات مع GraphError::NodeExecutionFailed لمعالجة الأخطاء.

مثال على كود مولد (HTTP عقدة):

let http_node = FunctionNode::new("fetch_data", |ctx| async move {
    let client = reqwest::Client::new();
    let resp = client.get("https://api.example.com/data")
        .bearer_auth(&ctx.get("API_TOKEN").unwrap_or_default())
        .send().await
        .map_err(|e| GraphError::NodeExecutionFailed {
            node: "fetch_data".into(),
            message: e.to_string(),
        })?;
    let body: serde_json::Value = resp.json().await?;
    Ok(NodeOutput::new().with_update("apiData", body))
});

مثال على كود مولد (عقدة الكود):

let code_node = FunctionNode::new("process", |ctx| async move {
    let mut js_ctx = boa_engine::Context::default();
    // Graph state injected as global `input` object
    // User code executed in thread-isolated sandbox
    Ok(NodeOutput::new().with_update("result", output))
});

السابق: ← Studio | التالي: Triggers →