Skip to content

مرجع DSL سير العمل

المرجع الكامل لـ CNCF Serverless Workflow DSL 1.0 كما هو مُنفّذ في محرك سير العمل الخاص بـ Triggerfish. للاطلاع على دليل الاستخدام والأمثلة، راجع سير العمل.

هيكل المستند

يجب أن يحتوي كل ملف YAML لسير العمل على حقل document على المستوى الأعلى وكتلة do.

yaml
document:
  dsl: "1.0"
  namespace: my-namespace
  name: my-workflow
  version: "1.0.0"            # optional
  description: "What it does"  # optional
classification_ceiling: INTERNAL  # optional
input:                            # optional
  from: "${ . }"
output:                           # optional
  from:
    result: "${ .final_step }"
timeout:                          # optional
  after: PT5M
do:
  - task_name:
      # task definition

بيانات المستند الوصفية

FieldTypeRequiredالوصف
dslstringyesإصدار DSL. يجب أن يكون "1.0"
namespacestringyesتجميع منطقي (مثل ops، reports)
namestringyesاسم سير عمل فريد ضمن مساحة الاسم
versionstringnoسلسلة إصدار دلالي
descriptionstringnoوصف مقروء للبشر

الحقول على المستوى الأعلى

FieldTypeRequiredالوصف
documentobjectyesبيانات المستند الوصفية (انظر أعلاه)
doarrayyesقائمة مرتبة من إدخالات المهام
classification_ceilingstringnoأقصى taint مسموح به للجلسة أثناء التنفيذ
inputtransformnoتحويل مطبق على مدخلات سير العمل
outputtransformnoتحويل مطبق على مخرجات سير العمل
timeoutobjectnoمهلة على مستوى سير العمل (after: <ISO 8601>)
metadataobjectnoبيانات وصفية عشوائية بنمط مفتاح-قيمة

تنسيق إدخال المهمة

كل إدخال في كتلة do هو كائن بمفتاح واحد. المفتاح هو اسم المهمة، والقيمة هي تعريف المهمة.

yaml
do:
  - my_task_name:
      call: http
      with:
        endpoint: "https://example.com"

يجب أن تكون أسماء المهام فريدة ضمن نفس كتلة do. يتم تخزين نتيجة المهمة في سياق البيانات تحت اسم المهمة.


حقول المهام المشتركة

تشترك جميع أنواع المهام في هذه الحقول الاختيارية:

FieldTypeالوصف
ifstringشرط تعبيري. يتم تخطي المهمة عندما يكون زائفاً.
inputtransformتحويل مطبق قبل تنفيذ المهمة
outputtransformتحويل مطبق بعد تنفيذ المهمة
timeoutobjectمهلة المهمة: after: <مدة ISO 8601>
thenstringتوجيه التدفق: continue، end، أو اسم مهمة
metadataobjectبيانات وصفية عشوائية بنمط مفتاح-قيمة. عند تمكين الإصلاح الذاتي، تتطلب description و expects و produces.

تكوين الإصلاح الذاتي

تمكّن كتلة metadata.triggerfish.self_healing وكيل إصلاح مستقل لسير العمل. راجع الإصلاح الذاتي للدليل الكامل.

yaml
metadata:
  triggerfish:
    self_healing:
      enabled: true
      retry_budget: 3
      approval_required: true
      pause_on_intervention: blocking_only
      pause_timeout_seconds: 300
      pause_timeout_policy: escalate_and_halt
      notify_on: [intervention, escalation, approval_required]
FieldTypeRequiredDefaultالوصف
enabledbooleanyesتمكين وكيل الإصلاح
retry_budgetnumberno3الحد الأقصى لمحاولات التدخل
approval_requiredbooleannotrueطلب موافقة بشرية للإصلاحات
pause_on_interventionstringno"blocking_only"always | never | blocking_only
pause_timeout_secondsnumberno300الثواني قبل تفعيل سياسة المهلة
pause_timeout_policystringno"escalate_and_halt"escalate_and_halt | escalate_and_skip | escalate_and_fail
notify_onarrayno[]intervention | escalation | approval_required

بيانات الخطوة الوصفية (مطلوبة عند تمكين الإصلاح الذاتي)

عندما يكون self_healing.enabled مضبوطاً على true، يجب أن تتضمن كل مهمة حقول البيانات الوصفية التالية. يرفض المحلل سير العمل التي تفتقد أياً منها.

FieldTypeالوصف
descriptionstringما تفعله الخطوة ولماذا
expectsstringشكل الإدخال أو الشروط المسبقة المطلوبة
producesstringشكل الإخراج المُنتج
yaml
- fetch-invoices:
    call: http
    with:
      endpoint: "https://api.example.com/invoices"
    metadata:
      description: "Fetch open invoices from billing API"
      expects: "API available, returns JSON array"
      produces: "Array of {id, amount, status} objects"

أنواع المهام

call

الإرسال إلى نقطة نهاية HTTP أو خدمة Triggerfish.

FieldTypeRequiredالوصف
callstringyesنوع الاستدعاء (انظر جدول الإرسال أدناه)
withobjectnoالوسيطات الممررة إلى الأداة الهدف
yaml
- fetch:
    call: http
    with:
      endpoint: "https://api.example.com/data"
      method: GET

run

تنفيذ أمر صدفة أو نص برمجي مضمّن أو سير عمل فرعي. يجب أن يحتوي حقل run على واحد بالضبط من shell أو script أو workflow.

الصدفة:

FieldTypeRequiredالوصف
run.shell.commandstringyesأمر الصدفة للتنفيذ
run.shell.argumentsobjectnoوسيطات مسماة
run.shell.environmentobjectnoمتغيرات البيئة

النص البرمجي:

FieldTypeRequiredالوصف
run.script.languagestringyesلغة النص البرمجي
run.script.codestringyesكود النص البرمجي المضمّن
run.script.argumentsobjectnoوسيطات مسماة

سير العمل الفرعي:

FieldTypeRequiredالوصف
run.workflow.namestringyesاسم سير العمل المحفوظ
run.workflow.versionstringnoقيد الإصدار
run.workflow.inputobjectnoبيانات إدخال سير العمل الفرعي

set

تعيين قيم في سياق البيانات.

FieldTypeRequiredالوصف
setobjectyesأزواج مفتاح-قيمة للتعيين. يمكن أن تكون القيم تعبيرات.
yaml
- prepare:
    set:
      full_name: "${ .first_name } ${ .last_name }"
      count: 0

switch

تفرع شرطي. حقل switch هو مصفوفة من إدخالات الحالات. كل حالة هي كائن بمفتاح واحد حيث المفتاح هو اسم الحالة.

Case fieldTypeRequiredالوصف
whenstringnoشرط تعبيري. احذفه للحالة الافتراضية.
thenstringyesتوجيه التدفق: continue، end، أو اسم مهمة

يتم تقييم الحالات بالترتيب. أول حالة بشرط when صحيح (أو بدون when) يتم أخذها.

yaml
- route:
    switch:
      - high:
          when: "${ .priority > 7 }"
          then: alert_team
      - low:
          then: log_only

for

التكرار على مجموعة.

FieldTypeRequiredالوصف
for.eachstringyesاسم المتغير للعنصر الحالي
for.instringyesتعبير يشير إلى المجموعة
for.atstringnoاسم المتغير للفهرس الحالي
doarrayyesقائمة مهام متداخلة تُنفذ لكل تكرار
yaml
- process_all:
    for:
      each: item
      in: "${ .items }"
      at: idx
    do:
      - handle:
          call: triggerfish:llm
          with:
            task: "Process item ${ .idx }: ${ .item.name }"

raise

إيقاف سير العمل بخطأ منظم.

FieldTypeRequiredالوصف
raise.error.statusnumberyesرمز حالة بنمط HTTP
raise.error.typestringyesURI/سلسلة نوع الخطأ
raise.error.titlestringyesعنوان مقروء للبشر
raise.error.detailstringnoرسالة خطأ مفصلة
yaml
- abort:
    raise:
      error:
        status: 422
        type: "validation-error"
        title: "Invalid input"
        detail: "Field 'email' is required"

emit

تسجيل حدث سير عمل. تُخزن الأحداث في نتيجة التشغيل.

FieldTypeRequiredالوصف
emit.event.typestringyesمعرّف نوع الحدث
emit.event.sourcestringnoURI مصدر الحدث
emit.event.dataobjectnoحمولة الحدث
yaml
- record:
    emit:
      event:
        type: "step.completed"
        source: "workflow/pipeline"
        data:
          step: "transform"
          duration_ms: 1200

wait

إيقاف التنفيذ مؤقتاً لمدة محددة.

FieldTypeRequiredالوصف
waitstringyesمدة ISO 8601 (مثل PT5S)

المدد الشائعة: PT1S (ثانية واحدة)، PT30S (30 ثانية)، PT1M (دقيقة واحدة)، PT5M (5 دقائق).


جدول إرسال الاستدعاءات

يربط قيمة حقل call بأداة Triggerfish التي يتم استدعاؤها فعلياً.

قيمة callالأداة المستدعاةحقول with: المطلوبة
httpweb_fetchendpoint أو url; اختياري method، headers، body
triggerfish:llmllm_taskprompt أو task; اختياري tools، max_iterations
triggerfish:agentsubagentprompt أو task; اختياري tools، agent
triggerfish:memorymemory_*operation (save/search/get/list/delete) + حقول العملية
triggerfish:web_searchweb_searchquery; اختياري max_results
triggerfish:web_fetchweb_fetchurl; اختياري method، headers، body
triggerfish:mcpmcp__<server>__<tool>server، tool; اختياري arguments
triggerfish:messagesend_messagechannel، text; اختياري recipient

أنواع استدعاءات CNCF غير المدعومة (grpc، openapi، asyncapi) تُرجع خطأ.


صيغة التعبيرات

التعبيرات محددة بـ ${ } وتُحل مقابل سياق بيانات سير العمل.

حل المسار النقطي

الصيغةالوصفنتيجة المثال
${ . }سياق البيانات بالكامل{...}
${ .key }مفتاح المستوى الأعلى"value"
${ .a.b.c }مفتاح متداخل"deep value"
${ .items[0] }فهرس المصفوفة{...العنصر الأول...}
${ .items[0].name }فهرس المصفوفة ثم المفتاح"first"

النقطة البادئة (أو $.) تثبت المسار في جذر السياق. المسارات التي تحل إلى undefined تنتج سلسلة فارغة عند الإقحام، أو undefined عند استخدامها كقيمة مستقلة.

المعاملات

النوعالمعاملاتمثال
المقارنة==، !=، >، <، >=، <=${ .count > 0 }
الحسابية+، -، *، /، %${ .price * .quantity }

تعبيرات المقارنة تُرجع true أو false. التعبيرات الحسابية تُرجع رقماً (undefined إذا لم يكن أي من المعاملين رقمياً أو في حالة القسمة على صفر).

القيم الحرفية

النوعأمثلة
سلسلة"hello"، 'hello'
رقم42، 3.14، -1
منطقيtrue، false
Nullnull

أوضاع الإقحام

تعبير واحد (قيمة خام): عندما تكون السلسلة بأكملها تعبير ${ } واحد، يتم إرجاع القيمة المكتوبة الخام (رقم، منطقي، كائن، مصفوفة).

yaml
count: "${ .items.length }"  # returns a number, not a string

مختلط / تعبيرات متعددة (سلسلة): عندما تُمزج تعبيرات ${ } مع نص أو توجد تعبيرات متعددة، تكون النتيجة دائماً سلسلة.

yaml
message: "Found ${ .count } items in ${ .category }"  # returns a string

الصدقية

لشروط if: وتعبيرات when: في switch، يتم تقييم القيم باستخدام صدقية نمط JavaScript:

القيمةصادق؟
trueنعم
رقم غير صفرينعم
سلسلة غير فارغةنعم
مصفوفة غير فارغةنعم
كائننعم
false، 0، ""، null، undefined، مصفوفة فارغةلا

تحويلات الإدخال/الإخراج

تعيد التحويلات تشكيل البيانات المتدفقة إلى ومن المهام.

input

يُطبق قبل تنفيذ المهمة. يستبدل رؤية المهمة لسياق البيانات.

yaml
- step:
    call: http
    input:
      from: "${ .config }"       # task sees only the config object
    with:
      endpoint: "${ .api_url }"  # resolved against the config object

from كسلسلة: تعبير يستبدل سياق الإدخال بالكامل.

from ككائن: يربط مفاتيح جديدة بتعبيرات:

yaml
input:
  from:
    url: "${ .config.api_url }"
    token: "${ .secrets.api_token }"

output

يُطبق بعد تنفيذ المهمة. يعيد تشكيل النتيجة قبل تخزينها في السياق تحت اسم المهمة.

yaml
- fetch:
    call: http
    output:
      from:
        items: "${ .fetch.data.results }"
        count: "${ .fetch.data.total }"

توجيهات التدفق

يتحكم حقل then في أي مهمة في تدفق التنفيذ بعد اكتمال المهمة.

القيمةالسلوك
continueالمتابعة إلى المهمة التالية في التسلسل (الافتراضي)
endإيقاف سير العمل. الحالة: completed.
<اسم المهمة>الانتقال إلى المهمة المسماة. يجب أن تكون في نفس كتلة do.

تستخدم حالات switch أيضاً توجيهات التدفق في حقل then الخاص بها.


سقف التصنيف

حقل اختياري يقيد أقصى taint للجلسة أثناء التنفيذ.

yaml
classification_ceiling: INTERNAL
القيمةالمعنى
PUBLICيتوقف سير العمل إذا تم الوصول إلى أي بيانات مصنفة
INTERNALيسمح ببيانات PUBLIC و INTERNAL
CONFIDENTIALيسمح بالبيانات حتى CONFIDENTIAL
RESTRICTEDيسمح بجميع مستويات التصنيف
(محذوف)لا يتم تطبيق أي سقف

يتم فحص السقف قبل كل مهمة. إذا تجاوز taint الجلسة السقف (مثلاً لأن مهمة سابقة وصلت إلى بيانات مصنفة)، يتوقف سير العمل بحالة failed وخطأ Workflow classification ceiling breached.


التخزين

تعريفات سير العمل

تُخزن بسابقة المفتاح workflows:{name}. يحتوي كل سجل مخزن على:

FieldTypeالوصف
namestringاسم سير العمل
yamlstringتعريف YAML الخام
classificationstringمستوى التصنيف وقت الحفظ
savedAtstringطابع زمني ISO 8601
descriptionstringوصف اختياري

سجل التشغيل

يُخزن بسابقة المفتاح workflow-runs:{runId}. يحتوي كل سجل تشغيل على:

FieldTypeالوصف
runIdstringUUID لهذا التنفيذ
workflowNamestringاسم سير العمل الذي تم تنفيذه
statusstringcompleted أو failed أو cancelled
outputobjectسياق البيانات النهائي (المفاتيح الداخلية مفلترة)
eventsarrayالأحداث المنبعثة أثناء التنفيذ
errorstringرسالة الخطأ (إذا كانت الحالة failed)
startedAtstringطابع زمني ISO 8601
completedAtstringطابع زمني ISO 8601
taskCountnumberعدد المهام في سير العمل
classificationstringtaint الجلسة عند الاكتمال

الحدود

الحدالقيمةالوصف
أقصى عمق سير عمل فرعي5أقصى تداخل لاستدعاءات run.workflow
حد سجل التشغيل الافتراضي10limit الافتراضي لـ workflow_history

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

الحالةالوصف
pendingتم إنشاء سير العمل لكن لم يبدأ
runningسير العمل قيد التنفيذ حالياً
completedاكتملت جميع المهام بنجاح (أو then: end)
failedفشلت مهمة، أو تم الوصول إلى raise، أو انتهاك السقف
cancelledتم إلغاء التنفيذ خارجياً