Skip to content

הפניה ל-Workflow 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_ceilingstringnotaint סשן מקסימלי מותר במהלך ההרצה
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 (30 שניות), PT1M (דקה אחת), PT5M (5 דקות).


טבלת 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
עומק מקסימלי של תת-תהליך5קינון מקסימלי של קריאות run.workflow
מגבלת ברירת מחדל להיסטוריה10limit ברירת מחדל עבור workflow_history

סטטוסי הרצה

StatusDescription
pendingתהליך העבודה נוצר אך לא התחיל
runningתהליך העבודה פועל כעת
completedכל המשימות הסתיימו בהצלחה (או then: end)
failedמשימה נכשלה, הופעל raise או חריגה מתקרה
cancelledההרצה בוטלה חיצונית