عقد الإجراءات
العقد غير البرمجية 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) |
خصائص قياسية
يرث كل عقدة إجراء هذه الخصائص المشتركة:
الهوية
| الخاصية | النوع | الوصف |
|---|---|---|
id | string | معرف فريد |
name | string | اسم العرض |
description | string? | وصف تلميح اختياري |
معالجة الأخطاء
| الوضع | السلوك |
|---|---|
stop | إيقاف سير العمل عند الخطأ (افتراضي) |
continue | تسجيل الخطأ والمتابعة إلى العقدة التالية |
retry | إعادة المحاولة بعدد قابل للتكوين (1-10) وتأخير (مللي ثانية) |
fallback | استخدام قيمة احتياطية عند الخطأ |
التتبع
| خاصية | النوع | الوصف |
|---|---|---|
enabled | boolean | تمكين تتبع التنفيذ المفصل |
logLevel | none | error | info | debug | تفاصيل السجل |
التحكم في التنفيذ
| الخاصية | النوع | الوصف |
|---|---|---|
timeout | number | مهلة بالمللي ثانية (افتراضي: 30000) |
condition | string? | تخطي العقدة إذا كان التعبير يقيم إلى خطأ |
تعيين الإدخال/الإخراج
| الخاصية | النوع | الوصف |
|---|---|---|
inputMapping | Record<string, string>? | ربط حقول الحالة بمدخلات العقدة |
outputKey | string | المفتاح الذي يتم فيه تخزين النتيجة في حالة سير العمل |
مرجع العقدة
عقدة المشغل 🎯
نقطة دخول سير العمل. يبدأ كل سير عمل بعقدة المشغل. راجع دليل المشغلات المخصص للحصول على التفاصيل الكاملة.
| نوع المشغل | الوصف |
|---|---|
| يدوي | يبدأه المستخدم عبر إدخال الدردشة |
| Webhook | HTTP endpoint (POST/GET) مع مصادقة اختيارية |
| جدولة | توقيت يستند إلى Cron مع دعم للمنطقة الزمنية |
| حدث | أحداث النظام الخارجية مع تصفية JSONPath |
HTTP Node 🌐
يقوم HTTP بإجراء طلبات إلى APIs خارجية مع معالجة كاملة للمصادقة، والترويسة، والجسم، والاستجابة.
التكوين:
| الخاصية | النوع | الوصف |
|---|---|---|
method | GET, POST, PUT, PATCH, DELETE | طريقة HTTP |
url | string | URL مع استيفاء {{variable}} |
auth | object | المصادقة (لا شيء، حامل، أساسي، api_key) |
headers | Record<string, string> | رؤوس الطلب |
body | object | الجسم (لا شيء، json، form، raw) |
response | object | معالجة الاستجابة (json، text، binary) مع استخراج JSONPath اختياري |
rateLimit | object? | تحديد المعدل (الطلبات لكل نافذة) |
مثال:
{
"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 📝
تحدد وتتعامل مع متغيرات حالة سير العمل. تدعم القيم الحرفية والتعبيرات والأسرار.
التكوين:
| الخاصية | النوع | الوصف |
|---|---|---|
mode | set, merge, delete | عملية المتغير |
variables | Variable[] | قائمة المتغيرات المراد تعيينها |
envVars | object? | التحميل من ملف .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
عقدة التبديل 🔀
تفرع شرطي مع منافذ إخراج متعددة. كل شرط يتوافق مع منفذ إخراج منفصل على العقدة.

التكوين:
| خاصية | النوع | الوصف |
|---|---|---|
evaluationMode | first_match | all_match | التوقف عند أول تطابق أو تقييم الكل |
conditions | SwitchCondition[] | قائمة الشروط مع منافذ الإخراج |
defaultBranch | string? | منفذ الإخراج عندما لا تتطابق أي شروط |
عوامل الشرط: 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 عام.
التكوين:
| الخاصية | النوع | الوصف |
|---|---|---|
language | javascript, typescript | لغة الكود |
code | string | الكود المراد تنفيذه |
sandbox | object | حدود الأمان (الشبكة، نظام الملفات، الذاكرة، الوقت) |
الإعدادات الافتراضية لصندوق الرمل:
| الحد | الافتراضي |
|---|---|
| الوصول إلى الشبكة | false |
| الوصول إلى نظام الملفات | false |
| حد الذاكرة | 128 MB |
| حد الوقت | 5000 ms |
عقدة قاعدة البيانات 🗄️
تُجري عمليات قاعدة البيانات مع تجميع الاتصالات والاستعلامات المُعلّمة.
قواعد البيانات المدعومة:
| قاعدة البيانات | المشغل | الميزات |
|---|---|---|
| PostgreSQL | sqlx (postgres) | مجمع غير متزامن، استعلامات معلمة، صف إلى-JSON |
| MySQL | sqlx (mysql) | مجمع غير متزامن، استعلامات معلمة، صف إلى-JSON |
| SQLite | sqlx (sqlite) | مجمع غير متزامن، استعلامات معلمة، صف إلى-JSON |
| MongoDB | mongodb | BSON أصلي، بحث/إدراج/تحديث/حذف |
| Redis | redis | GET, 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 | ما يولده |
|---|---|---|
| HTTP | reqwest | طلبات 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 →