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

فراداده سند

FieldTypeRequiredDescription
dslstringyesنسخه DSL. باید "1.0" باشد
namespacestringyesگروه‌بندی منطقی (مثلاً ops، reports)
namestringyesنام یکتای گردش کار در namespace
versionstringnoرشته نسخه معنایی
descriptionstringnoتوصیف قابل خواندن برای انسان

فیلدهای سطح بالا

FieldTypeRequiredDescription
documentobjectyesفراداده سند (بالا را ببینید)
doarrayyesلیست مرتب ورودی‌های وظیفه
classification_ceilingstringnoحداکثر taint نشست مجاز در طول اجرا
inputtransformnoتبدیل اعمال‌شده روی ورودی گردش کار
outputtransformnoتبدیل اعمال‌شده روی خروجی گردش کار
timeoutobjectnotimeout سطح گردش کار (after: <ISO 8601>)
metadataobjectnoفراداده دلخواه کلید-مقدار

قالب ورودی وظیفه

هر ورودی در بلوک do یک شیء تک‌کلیدی است. کلید نام وظیفه و مقدار تعریف وظیفه است.

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

نام وظایف باید در همان بلوک do یکتا باشند. نتیجه وظیفه در زمینه داده زیر نام وظیفه ذخیره می‌شود.


فیلدهای مشترک وظیفه

همه انواع وظیفه این فیلدهای اختیاری مشترک را دارند:

FieldTypeDescription
ifstringشرط عبارت. وظیفه وقتی falsy باشد نادیده گرفته می‌شود.
inputtransformتبدیل اعمال‌شده قبل از اجرای وظیفه
outputtransformتبدیل اعمال‌شده بعد از اجرای وظیفه
timeoutobjecttimeout وظیفه: after: <ISO 8601 duration>
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]
FieldTypeRequiredDefaultDescription
enabledbooleanyesفعال‌سازی عامل درمان‌گر
retry_budgetnumberno3حداکثر تلاش‌های مداخله
approval_requiredbooleannotrueنیاز به تأیید انسانی برای اصلاحات
pause_on_interventionstringno"blocking_only"always | never | blocking_only
pause_timeout_secondsnumberno300ثانیه‌ها قبل از فعال شدن سیاست timeout
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 باشد، هر وظیفه باید شامل این فیلدهای فراداده باشد. تجزیه‌کننده گردش کارهایی را که هر کدام را نداشته باشند رد می‌کند.

FieldTypeDescription
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 endpoint یا سرویس Triggerfish.

FieldTypeRequiredDescription
callstringyesنوع فراخوانی (جدول dispatch زیر را ببینید)
withobjectnoآرگومان‌های ارسالی به ابزار هدف
yaml
- fetch:
    call: http
    with:
      endpoint: "https://api.example.com/data"
      method: GET

run

اجرای دستور shell، اسکریپت درون‌خطی یا زیرگردش کار. فیلد run باید دقیقاً یکی از shell، script یا workflow را داشته باشد.

Shell:

FieldTypeRequiredDescription
run.shell.commandstringyesدستور shell برای اجرا
run.shell.argumentsobjectnoآرگومان‌های نام‌دار
run.shell.environmentobjectnoمتغیرهای محیطی

Script:

FieldTypeRequiredDescription
run.script.languagestringyesزبان اسکریپت
run.script.codestringyesکد اسکریپت درون‌خطی
run.script.argumentsobjectnoآرگومان‌های نام‌دار

زیرگردش کار:

FieldTypeRequiredDescription
run.workflow.namestringyesنام گردش کار ذخیره‌شده
run.workflow.versionstringnoمحدودیت نسخه
run.workflow.inputobjectnoداده ورودی برای زیرگردش کار

set

تخصیص مقادیر به زمینه داده.

FieldTypeRequiredDescription
setobjectyesجفت‌های کلید-مقدار برای تخصیص. مقادیر می‌توانند عبارت باشند.
yaml
- prepare:
    set:
      full_name: "${ .first_name } ${ .last_name }"
      count: 0

switch

انشعاب شرطی. فیلد switch آرایه‌ای از ورودی‌های مورد است. هر مورد یک شیء تک‌کلیدی است که کلید آن نام مورد است.

Case fieldTypeRequiredDescription
whenstringnoشرط عبارت. برای مورد پیش‌فرض حذف کنید.
thenstringyesدستورالعمل جریان: continue، end یا نام وظیفه

موردها به ترتیب ارزیابی می‌شوند. اولین مورد با when صحیح (یا بدون when) انتخاب می‌شود.

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

for

تکرار روی مجموعه.

FieldTypeRequiredDescription
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

توقف گردش کار با خطای ساختاریافته.

FieldTypeRequiredDescription
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

ثبت رویداد گردش کار. رویدادها در نتیجه اجرا ذخیره می‌شوند.

FieldTypeRequiredDescription
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

توقف اجرا برای مدت زمانی.

FieldTypeRequiredDescription
waitstringyesمدت زمان ISO 8601 (مثلاً PT5S)

مدت‌زمان‌های رایج: PT1S (۱ ثانیه)، PT30S (۳۰ ثانیه)، PT1M (۱ دقیقه)، PT5M (۵ دقیقه).


جدول Call Dispatch

مقدار فیلد 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) خطا برمی‌گردانند.


نحو عبارات

عبارات با ${ } محصور شده و در برابر زمینه داده گردش کار تفکیک می‌شوند.

تفکیک Dot-Path

نحوDescriptionنتیجه نمونه
${ . }کل زمینه داده{...}
${ .key }کلید سطح بالا"value"
${ .a.b.c }کلید تودرتو"deep value"
${ .items[0] }اندیس آرایه{...آیتم اول...}
${ .items[0].name }اندیس آرایه سپس کلید"first"

نقطه ابتدایی (یا $.) مسیر را در ریشه زمینه لنگر می‌اندازد. مسیرهایی که به undefined تفکیک می‌شوند هنگام درج رشته خالی تولید می‌کنند، یا undefined هنگام استفاده به عنوان مقدار مستقل.

عملگرها

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

عبارات مقایسه true یا false برمی‌گردانند. عبارات حسابی number برمی‌گردانند (undefined اگر هر عملوند عددی نباشد یا تقسیم بر صفر).

مقادیر ثابت

نوعمثال‌ها
String"hello"، 'hello'
Number42، 3.14، -1
Booleantrue، false
Nullnull

حالت‌های درج

عبارت تکی (مقدار خام): وقتی کل رشته یک عبارت ${ } باشد، مقدار خام نوع‌دار برگردانده می‌شود (number، boolean، object، array).

yaml
count: "${ .items.length }"  # number برمی‌گرداند، نه string

ترکیبی / عبارات متعدد (string): وقتی عبارات ${ } با متن ترکیب شوند یا عبارات متعدد باشند، نتیجه همیشه string است.

yaml
message: "Found ${ .count } items in ${ .category }"  # string برمی‌گرداند

صحت (Truthiness)

برای شرایط if: و عبارات when: در switch، مقادیر با استفاده از صحت سبک JavaScript ارزیابی می‌شوند:

مقدارصحیح؟
trueبله
عدد غیرصفربله
رشته غیرخالیبله
آرایه غیرخالیبله
Objectبله
false، 0، ""، null، undefined، آرایه خالیخیر

تبدیل‌های ورودی/خروجی

تبدیل‌ها داده‌های جاری به داخل و خارج وظایف را بازشکل‌دهی می‌کنند.

input

قبل از اجرای وظیفه اعمال می‌شود. دید وظیفه از زمینه داده را جایگزین می‌کند.

yaml
- step:
    call: http
    input:
      from: "${ .config }"       # وظیفه فقط شیء config را می‌بیند
    with:
      endpoint: "${ .api_url }"  # در برابر شیء config تفکیک می‌شود

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} ذخیره می‌شوند. هر رکورد ذخیره‌شده شامل:

FieldTypeDescription
namestringنام گردش کار
yamlstringتعریف YAML خام
classificationstringسطح طبقه‌بندی در زمان ذخیره
savedAtstringمُهر زمان ISO 8601
descriptionstringتوصیف اختیاری

تاریخچه اجرا

با پیشوند کلید workflow-runs:{runId} ذخیره می‌شود. هر رکورد اجرا شامل:

FieldTypeDescription
runIdstringUUID برای این اجرا
workflowNamestringنام گردش کاری که اجرا شد
statusstringcompleted، failed یا cancelled
outputobjectزمینه داده نهایی (کلیدهای داخلی فیلتر شده)
eventsarrayرویدادهای منتشرشده در طول اجرا
errorstringپیام خطا (اگر وضعیت failed باشد)
startedAtstringمُهر زمان ISO 8601
completedAtstringمُهر زمان ISO 8601
taskCountnumberتعداد وظایف در گردش کار
classificationstringtaint نشست در تکمیل

محدودیت‌ها

محدودیتمقدارDescription
حداکثر عمق زیرگردش کار۵حداکثر تودرتویی فراخوانی‌های run.workflow
محدودیت پیش‌فرض تاریخچه۱۰limit پیش‌فرض برای workflow_history

وضعیت‌های اجرا

StatusDescription
pendingگردش کار ایجاد شده اما شروع نشده
runningگردش کار در حال اجرا است
completedهمه وظایف با موفقیت تمام شدند (یا then: end)
failedوظیفه‌ای شکست خورد، raise فعال شد یا سقف نقض شد
cancelledاجرا از خارج لغو شد