Skip to content

Workflow-DSL-Referenz

Vollstandige Referenz fur die CNCF Serverless Workflow DSL 1.0, wie sie in der Workflow-Engine von Triggerfish implementiert ist. Fur Nutzungsanleitung und Beispiele siehe Workflows.

Dokumentstruktur

Jedes Workflow-YAML muss ein document-Feld auf oberster Ebene und einen do-Block haben.

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

Dokumentmetadaten

FieldTypeRequiredBeschreibung
dslstringyesDSL-Version. Muss "1.0" sein
namespacestringyesLogische Gruppierung (z. B. ops, reports)
namestringyesEindeutiger Workflow-Name innerhalb des Namespace
versionstringnoSemantische Versionszeichenkette
descriptionstringnoMenschenlesbare Beschreibung

Felder auf oberster Ebene

FieldTypeRequiredBeschreibung
documentobjectyesDokumentmetadaten (siehe oben)
doarrayyesGeordnete Liste von Aufgabeneintragen
classification_ceilingstringnoMaximal erlaubter Sitzungs-Taint wahrend der Ausfuhrung
inputtransformnoTransformation fur die Workflow-Eingabe
outputtransformnoTransformation fur die Workflow-Ausgabe
timeoutobjectnoWorkflow-Timeout (after: <ISO 8601>)
metadataobjectnoBeliebige Schlussel-Wert-Metadaten

Aufgabeneintragsformat

Jeder Eintrag im do-Block ist ein Objekt mit einem einzelnen Schlussel. Der Schlussel ist der Aufgabenname, der Wert ist die Aufgabendefinition.

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

Aufgabennamen mussen innerhalb desselben do-Blocks eindeutig sein. Das Aufgabenergebnis wird im Datenkontext unter dem Aufgabennamen gespeichert.


Gemeinsame Aufgabenfelder

Alle Aufgabentypen teilen diese optionalen Felder:

FieldTypeBeschreibung
ifstringAusdrucksbedingung. Aufgabe wird ubersprungen, wenn falsch.
inputtransformTransformation vor der Aufgabenausfuhrung
outputtransformTransformation nach der Aufgabenausfuhrung
timeoutobjectAufgaben-Timeout: after: <ISO 8601-Dauer>
thenstringFlussdirektive: continue, end oder Aufgabenname
metadataobjectBeliebige Schlussel-Wert-Metadaten. Bei aktiviertem Self-Healing sind description, expects, produces erforderlich.

Self-Healing-Konfiguration

Der Block metadata.triggerfish.self_healing aktiviert einen autonomen Healing-Agenten fur den Workflow. Siehe Self-Healing fur eine vollstandige Anleitung.

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]
FieldTypeRequiredStandardBeschreibung
enabledbooleanyesAktiviert den Healing-Agenten
retry_budgetnumberno3Maximale Interventionsversuche
approval_requiredbooleannotrueMenschliche Genehmigung fur Korrekturen erforderlich
pause_on_interventionstringno"blocking_only"always | never | blocking_only
pause_timeout_secondsnumberno300Sekunden bis die Timeout-Richtlinie greift
pause_timeout_policystringno"escalate_and_halt"escalate_and_halt | escalate_and_skip | escalate_and_fail
notify_onarrayno[]intervention | escalation | approval_required

Schritt-Metadaten (Erforderlich bei aktiviertem Self-Healing)

Wenn self_healing.enabled auf true steht, muss jede Aufgabe diese Metadatenfelder enthalten. Der Parser lehnt Workflows ab, in denen eines davon fehlt.

FieldTypeBeschreibung
descriptionstringWas der Schritt tut und warum
expectsstringBenotigter Eingabeform oder Vorbedingungen
producesstringErzeugte Ausgabeform
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"

Aufgabentypen

call

Versand an einen HTTP-Endpunkt oder Triggerfish-Dienst.

FieldTypeRequiredBeschreibung
callstringyesAufruftyp (siehe Versandtabelle unten)
withobjectnoArgumente fur das Zielwerkzeug
yaml
- fetch:
    call: http
    with:
      endpoint: "https://api.example.com/data"
      method: GET

run

Fuhrt einen Shell-Befehl, ein Inline-Script oder einen Sub-Workflow aus. Das Feld run muss genau eines von shell, script oder workflow enthalten.

Shell:

FieldTypeRequiredBeschreibung
run.shell.commandstringyesAuszufuhrender Shell-Befehl
run.shell.argumentsobjectnoBenannte Argumente
run.shell.environmentobjectnoUmgebungsvariablen

Script:

FieldTypeRequiredBeschreibung
run.script.languagestringyesScriptsprache
run.script.codestringyesInline-Scriptcode
run.script.argumentsobjectnoBenannte Argumente

Sub-Workflow:

FieldTypeRequiredBeschreibung
run.workflow.namestringyesName des gespeicherten Workflows
run.workflow.versionstringnoVersionsbeschrankung
run.workflow.inputobjectnoEingabedaten fur den Sub-Workflow

set

Weist dem Datenkontext Werte zu.

FieldTypeRequiredBeschreibung
setobjectyesSchlussel-Wert-Paare zur Zuweisung. Werte konnen Ausdrucke sein.
yaml
- prepare:
    set:
      full_name: "${ .first_name } ${ .last_name }"
      count: 0

switch

Bedingte Verzweigung. Das Feld switch ist ein Array von Falleintragen. Jeder Fall ist ein Objekt mit einem einzelnen Schlussel, wobei der Schlussel der Fallname ist.

FallfeldTypeRequiredBeschreibung
whenstringnoAusdrucksbedingung. Fur den Standardfall weglassen.
thenstringyesFlussdirektive: continue, end oder Aufgabenname

Falle werden der Reihe nach ausgewertet. Der erste Fall mit wahrem when (oder ohne when) wird genommen.

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

for

Iteriert uber eine Sammlung.

FieldTypeRequiredBeschreibung
for.eachstringyesVariablenname fur das aktuelle Element
for.instringyesAusdruck, der die Sammlung referenziert
for.atstringnoVariablenname fur den aktuellen Index
doarrayyesVerschachtelte Aufgabenliste fur jede Iteration
yaml
- process_all:
    for:
      each: item
      in: "${ .items }"
      at: idx
    do:
      - handle:
          call: triggerfish:llm
          with:
            task: "Process item ${ .idx }: ${ .item.name }"

raise

Halt den Workflow mit einem strukturierten Fehler an.

FieldTypeRequiredBeschreibung
raise.error.statusnumberyesHTTP-artiger Statuscode
raise.error.typestringyesFehlertyp-URI/Zeichenkette
raise.error.titlestringyesMenschenlesbarer Titel
raise.error.detailstringnoDetaillierte Fehlermeldung
yaml
- abort:
    raise:
      error:
        status: 422
        type: "validation-error"
        title: "Invalid input"
        detail: "Field 'email' is required"

emit

Zeichnet ein Workflow-Ereignis auf. Ereignisse werden im Ausfuhrungsergebnis gespeichert.

FieldTypeRequiredBeschreibung
emit.event.typestringyesEreignistypbezeichner
emit.event.sourcestringnoEreignisquell-URI
emit.event.dataobjectnoEreignis-Payload
yaml
- record:
    emit:
      event:
        type: "step.completed"
        source: "workflow/pipeline"
        data:
          step: "transform"
          duration_ms: 1200

wait

Pausiert die Ausfuhrung fur eine Dauer.

FieldTypeRequiredBeschreibung
waitstringyesISO 8601-Dauer (z. B. PT5S)

Haufige Dauern: PT1S (1 Sekunde), PT30S (30 Sekunden), PT1M (1 Minute), PT5M (5 Minuten).


Aufruf-Versandtabelle

Ordnet den Wert des Feldes call dem tatsachlich aufgerufenen Triggerfish-Werkzeug zu.

call-WertAufgerufenes WerkzeugErforderliche with:-Felder
httpweb_fetchendpoint oder url; optional method, headers, body
triggerfish:llmllm_taskprompt oder task; optional tools, max_iterations
triggerfish:agentsubagentprompt oder task; optional tools, agent
triggerfish:memorymemory_*operation (save/search/get/list/delete) + Operationsfelder
triggerfish:web_searchweb_searchquery; optional max_results
triggerfish:web_fetchweb_fetchurl; optional method, headers, body
triggerfish:mcpmcp__<server>__<tool>server, tool; optional arguments
triggerfish:messagesend_messagechannel, text; optional recipient

Nicht unterstutzte CNCF-Aufruftypen (grpc, openapi, asyncapi) geben einen Fehler zuruck.


Ausdruckssyntax

Ausdrucke werden durch ${ } begrenzt und losen gegen den Datenkontext des Workflows auf.

Punkt-Pfad-Auflosung

SyntaxBeschreibungBeispielergebnis
${ . }Gesamter Datenkontext{...}
${ .key }Schlussel auf oberster Ebene"value"
${ .a.b.c }Verschachtelter Schlussel"deep value"
${ .items[0] }Array-Index{...erstes Element...}
${ .items[0].name }Array-Index dann Schlussel"first"

Der fuhrende Punkt (oder $.) verankert den Pfad an der Kontextwurzel. Pfade, die zu undefined auflosen, erzeugen eine leere Zeichenkette bei Interpolation oder undefined bei Verwendung als eigenstandiger Wert.

Operatoren

TypOperatorenBeispiel
Vergleich==, !=, >, <, >=, <=${ .count > 0 }
Arithmetik+, -, *, /, %${ .price * .quantity }

Vergleichsausdrucke geben true oder false zuruck. Arithmetische Ausdrucke geben eine Zahl zuruck (undefined, wenn ein Operand nicht numerisch ist oder Division durch Null).

Literale

TypBeispiele
String"hello", 'hello'
Zahl42, 3.14, -1
Booleantrue, false
Nullnull

Interpolationsmodi

Einzelner Ausdruck (Rohwert): Wenn die gesamte Zeichenkette ein ${ }-Ausdruck ist, wird der typisierte Rohwert zuruckgegeben (Zahl, Boolean, Objekt, Array).

yaml
count: "${ .items.length }"  # gibt eine Zahl zuruck, keinen String

Gemischt / mehrere Ausdrucke (String): Wenn ${ }-Ausdrucke mit Text gemischt sind oder es mehrere Ausdrucke gibt, ist das Ergebnis immer ein String.

yaml
message: "Found ${ .count } items in ${ .category }"  # gibt einen String zuruck

Wahrheitswerte

Fur if:-Bedingungen und switch-when:-Ausdrucke werden Werte mit JavaScript-artiger Wahrheitsbewertung ausgewertet:

WertWahr?
trueja
Zahl ungleich Nullja
Nicht-leere Zeichenketteja
Nicht-leeres Arrayja
Objektja
false, 0, "", null, undefined, leeres Arraynein

Eingabe-/Ausgabetransformationen

Transformationen formen Daten um, die in Aufgaben hinein- und herausfliessen.

input

Wird vor der Aufgabenausfuhrung angewandt. Ersetzt die Sicht der Aufgabe auf den Datenkontext.

yaml
- step:
    call: http
    input:
      from: "${ .config }"       # Aufgabe sieht nur das Config-Objekt
    with:
      endpoint: "${ .api_url }"  # aufgelost gegen das Config-Objekt

from als String: Ausdruck, der den gesamten Eingabekontext ersetzt.

from als Objekt: Ordnet neue Schlussel Ausdrucken zu:

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

output

Wird nach der Aufgabenausfuhrung angewandt. Formt das Ergebnis um, bevor es im Kontext unter dem Aufgabennamen gespeichert wird.

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

Flussdirektiven

Das Feld then bei jeder Aufgabe steuert den Ausfuhrungsfluss nach Abschluss der Aufgabe.

WertVerhalten
continueFahrt mit der nachsten Aufgabe in der Sequenz fort (Standard)
endStoppt den Workflow. Status: completed.
<Aufgabenname>Springt zur benannten Aufgabe. Die Aufgabe muss im selben do-Block existieren.

Switch-Falle verwenden ebenfalls Flussdirektiven in ihrem then-Feld.


Klassifizierungsobergrenze

Optionales Feld, das den maximalen Sitzungs-Taint wahrend der Ausfuhrung einschrankt.

yaml
classification_ceiling: INTERNAL
WertBedeutung
PUBLICWorkflow halt an, wenn klassifizierte Daten zugegriffen werden
INTERNALErlaubt PUBLIC- und INTERNAL-Daten
CONFIDENTIALErlaubt bis zu CONFIDENTIAL-Daten
RESTRICTEDErlaubt alle Klassifizierungsstufen
(weggelassen)Keine Obergrenze durchgesetzt

Die Obergrenze wird vor jeder Aufgabe gepruft. Wenn der Sitzungs-Taint die Obergrenze uberschritten hat (z. B. weil eine vorherige Aufgabe auf klassifizierte Daten zugegriffen hat), halt der Workflow mit Status failed und Fehler Workflow classification ceiling breached an.


Speicherung

Workflow-Definitionen

Gespeichert mit Schlusselprafix workflows:{name}. Jeder gespeicherte Datensatz enthalt:

FieldTypeBeschreibung
namestringWorkflow-Name
yamlstringRohe YAML-Definition
classificationstringKlassifizierungslevel zum Zeitpunkt des Speicherns
savedAtstringISO 8601-Zeitstempel
descriptionstringOptionale Beschreibung

Ausfuhrungsverlauf

Gespeichert mit Schlusselprafix workflow-runs:{runId}. Jeder Ausfuhrungsdatensatz enthalt:

FieldTypeBeschreibung
runIdstringUUID dieser Ausfuhrung
workflowNamestringName des ausgefuhrten Workflows
statusstringcompleted, failed oder cancelled
outputobjectEndgultiger Datenkontext (interne Schlussel gefiltert)
eventsarrayWahrend der Ausfuhrung ausgegebene Ereignisse
errorstringFehlermeldung (wenn Status failed)
startedAtstringISO 8601-Zeitstempel
completedAtstringISO 8601-Zeitstempel
taskCountnumberAnzahl der Aufgaben im Workflow
classificationstringSitzungs-Taint bei Abschluss

Grenzen

GrenzeWertBeschreibung
Maximale Sub-Workflow-Tiefe5Maximale Verschachtelung von run.workflow-Aufrufen
Standardlimit Verlauf10Standard-limit fur workflow_history

Ausfuhrungsstatus

StatusBeschreibung
pendingDer Workflow wurde erstellt, aber nicht gestartet
runningDer Workflow wird derzeit ausgefuhrt
completedAlle Aufgaben erfolgreich abgeschlossen (oder then: end)
failedEine Aufgabe ist fehlgeschlagen, ein raise wurde ausgelost oder Obergrenze verletzt
cancelledDie Ausfuhrung wurde extern abgebrochen