Skip to content

Référence DSL de flux de travail

Référence complète du CNCF Serverless Workflow DSL 1.0 tel qu'implémenté dans le moteur de flux de travail de Triggerfish. Pour le guide d'utilisation et les exemples, consultez Flux de travail.

Structure du document

Chaque YAML de flux de travail doit comporter un champ document de niveau supérieur et un bloc 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

Métadonnées du document

FieldTypeRequiredDescription
dslstringyesVersion du DSL. Doit être "1.0"
namespacestringyesRegroupement logique (par ex. ops, reports)
namestringyesNom unique du flux de travail au sein du namespace
versionstringnoChaîne de version sémantique
descriptionstringnoDescription lisible par l'humain

Champs de niveau supérieur

FieldTypeRequiredDescription
documentobjectyesMétadonnées du document (voir ci-dessus)
doarrayyesListe ordonnée des entrées de tâches
classification_ceilingstringnoTaint de session maximum autorisé pendant l'exécution
inputtransformnoTransformation appliquée à l'entrée du flux de travail
outputtransformnoTransformation appliquée à la sortie du flux de travail
timeoutobjectnoDélai d'expiration au niveau du flux (after: <ISO 8601>)
metadataobjectnoMétadonnées clé-valeur arbitraires

Format des entrées de tâches

Chaque entrée dans le bloc do est un objet à clé unique. La clé est le nom de la tâche, la valeur est la définition de la tâche.

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

Les noms de tâches doivent être uniques au sein du même bloc do. Le résultat de la tâche est stocké dans le contexte de données sous le nom de la tâche.


Champs communs aux tâches

Tous les types de tâches partagent ces champs optionnels :

FieldTypeDescription
ifstringCondition d'expression. La tâche est ignorée si la valeur est fausse.
inputtransformTransformation appliquée avant l'exécution de la tâche
outputtransformTransformation appliquée après l'exécution de la tâche
timeoutobjectDélai d'expiration de la tâche : after: <durée ISO 8601>
thenstringDirective de flux : continue, end ou un nom de tâche
metadataobjectMétadonnées clé-valeur arbitraires. Lorsque le self-healing est activé, requiert description, expects, produces.

Configuration du Self-Healing

Le bloc metadata.triggerfish.self_healing active un agent de guérison autonome pour le flux de travail. Consultez Self-Healing pour un guide complet.

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]
FieldTypeRequiredPar défautDescription
enabledbooleanyesActive l'agent de guérison
retry_budgetnumberno3Nombre max. de tentatives d'intervention
approval_requiredbooleannotrueApprobation humaine requise pour les corrections
pause_on_interventionstringno"blocking_only"always | never | blocking_only
pause_timeout_secondsnumberno300Secondes avant le déclenchement de la politique de temporisation
pause_timeout_policystringno"escalate_and_halt"escalate_and_halt | escalate_and_skip | escalate_and_fail
notify_onarrayno[]intervention | escalation | approval_required

Métadonnées d'étape (requises lorsque le Self-Healing est activé)

Lorsque self_healing.enabled est true, chaque tâche doit inclure ces champs de métadonnées. L'analyseur rejette les flux de travail dans lesquels l'un d'entre eux est absent.

FieldTypeDescription
descriptionstringCe que fait l'étape et pourquoi
expectsstringForme des entrées ou préconditions nécessaires
producesstringForme de la sortie générée
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"

Types de tâches

call

Distribution vers un point de terminaison HTTP ou un service Triggerfish.

FieldTypeRequiredDescription
callstringyesType d'appel (voir le tableau de distribution ci-dessous)
withobjectnoArguments transmis à l'outil cible
yaml
- fetch:
    call: http
    with:
      endpoint: "https://api.example.com/data"
      method: GET

run

Exécute une commande shell, un script en ligne ou un sous-flux de travail. Le champ run doit contenir exactement un des éléments suivants : shell, script ou workflow.

Shell :

FieldTypeRequiredDescription
run.shell.commandstringyesCommande shell à exécuter
run.shell.argumentsobjectnoArguments nommés
run.shell.environmentobjectnoVariables d'environnement

Script :

FieldTypeRequiredDescription
run.script.languagestringyesLangage du script
run.script.codestringyesCode du script en ligne
run.script.argumentsobjectnoArguments nommés

Sous-flux de travail :

FieldTypeRequiredDescription
run.workflow.namestringyesNom du flux de travail enregistré
run.workflow.versionstringnoContrainte de version
run.workflow.inputobjectnoDonnées d'entrée pour le sous-flux

set

Assigne des valeurs au contexte de données.

FieldTypeRequiredDescription
setobjectyesPaires clé-valeur à assigner. Les valeurs peuvent être des expressions.
yaml
- prepare:
    set:
      full_name: "${ .first_name } ${ .last_name }"
      count: 0

switch

Branchement conditionnel. Le champ switch est un tableau d'entrées de cas. Chaque cas est un objet à clé unique dont la clé est le nom du cas.

Case fieldTypeRequiredDescription
whenstringnoCondition d'expression. Omettre pour le cas par défaut.
thenstringyesDirective de flux : continue, end ou nom de tâche

Les cas sont évalués dans l'ordre. Le premier cas avec un when véridique (ou sans when) est pris.

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

for

Itération sur une collection.

FieldTypeRequiredDescription
for.eachstringyesNom de variable pour l'élément courant
for.instringyesExpression référençant la collection
for.atstringnoNom de variable pour l'index courant
doarrayyesListe de tâches imbriquées exécutées par itération
yaml
- process_all:
    for:
      each: item
      in: "${ .items }"
      at: idx
    do:
      - handle:
          call: triggerfish:llm
          with:
            task: "Process item ${ .idx }: ${ .item.name }"

raise

Arrête le flux de travail avec une erreur structurée.

FieldTypeRequiredDescription
raise.error.statusnumberyesCode de statut style HTTP
raise.error.typestringyesURI/chaîne de type d'erreur
raise.error.titlestringyesTitre lisible par l'humain
raise.error.detailstringnoMessage d'erreur détaillé
yaml
- abort:
    raise:
      error:
        status: 422
        type: "validation-error"
        title: "Invalid input"
        detail: "Field 'email' is required"

emit

Enregistre un événement de flux de travail. Les événements sont stockés dans le résultat d'exécution.

FieldTypeRequiredDescription
emit.event.typestringyesIdentifiant du type d'événement
emit.event.sourcestringnoURI source de l'événement
emit.event.dataobjectnoCharge utile de l'événement
yaml
- record:
    emit:
      event:
        type: "step.completed"
        source: "workflow/pipeline"
        data:
          step: "transform"
          duration_ms: 1200

wait

Met en pause l'exécution pour une durée donnée.

FieldTypeRequiredDescription
waitstringyesDurée ISO 8601 (par ex. PT5S)

Durées courantes : PT1S (1 seconde), PT30S (30 secondes), PT1M (1 minute), PT5M (5 minutes).


Tableau de distribution des appels

Associe la valeur du champ call à l'outil Triggerfish effectivement invoqué.

Valeur callOutil invoquéChamps with: requis
httpweb_fetchendpoint ou url ; optionnel method, headers, body
triggerfish:llmllm_taskprompt ou task ; optionnel tools, max_iterations
triggerfish:agentsubagentprompt ou task ; optionnel tools, agent
triggerfish:memorymemory_*operation (save/search/get/list/delete) + champs de l'opération
triggerfish:web_searchweb_searchquery ; optionnel max_results
triggerfish:web_fetchweb_fetchurl ; optionnel method, headers, body
triggerfish:mcpmcp__<server>__<tool>server, tool ; optionnel arguments
triggerfish:messagesend_messagechannel, text ; optionnel recipient

Les types d'appel CNCF non pris en charge (grpc, openapi, asyncapi) renvoient une erreur.


Syntaxe des expressions

Les expressions sont délimitées par ${ } et sont résolues sur le contexte de données du flux de travail.

Résolution par chemin pointé

SyntaxeDescriptionExemple de résultat
${ . }Contexte de données complet{...}
${ .key }Clé de niveau supérieur"value"
${ .a.b.c }Clé imbriquée"deep value"
${ .items[0] }Index de tableau{...premier élément...}
${ .items[0].name }Index de tableau puis clé"first"

Le point initial (ou $.) ancre le chemin à la racine du contexte. Les chemins qui se résolvent en undefined produisent une chaîne vide lorsqu'ils sont interpolés, ou undefined lorsqu'ils sont utilisés comme valeur autonome.

Opérateurs

TypeOpérateursExemple
Comparaison==, !=, >, <, >=, <=${ .count > 0 }
Arithmétique+, -, *, /, %${ .price * .quantity }

Les expressions de comparaison renvoient true ou false. Les expressions arithmétiques renvoient un nombre (undefined si l'un des opérandes n'est pas numérique ou en cas de division par zéro).

Littéraux

TypeExemples
String"hello", 'hello'
Number42, 3.14, -1
Booleantrue, false
Nullnull

Modes d'interpolation

Expression unique (valeur brute) : Lorsque la chaîne entière est une seule expression ${ }, la valeur typée brute est renvoyée (nombre, booléen, objet, tableau).

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

Mixte / expressions multiples (chaîne) : Lorsque des expressions ${ } sont mélangées avec du texte ou qu'il y a plusieurs expressions, le résultat est toujours une chaîne.

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

Véracité

Pour les conditions if: et les expressions when: de switch, les valeurs sont évaluées selon la véracité style JavaScript :

ValeurVéridique ?
trueoui
Nombre non nuloui
Chaîne non videoui
Tableau non videoui
Objetoui
false, 0, "", null, undefined, tableau videnon

Transformations d'entrée/sortie

Les transformations remodèlent les données circulant dans et hors des tâches.

input

Appliquée avant l'exécution de la tâche. Remplace la vue du contexte de données de la tâche.

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

from en tant que chaîne : Expression qui remplace entièrement le contexte d'entrée.

from en tant qu'objet : Associe de nouvelles clés à des expressions :

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

output

Appliquée après l'exécution de la tâche. Remodèle le résultat avant de le stocker dans le contexte sous le nom de la tâche.

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

Directives de flux

Le champ then sur toute tâche contrôle le flux d'exécution après la complétion de la tâche.

ValeurComportement
continuePasse à la tâche suivante dans la séquence (par défaut)
endArrête le flux de travail. Statut : completed.
<nom de tâche>Saute à la tâche nommée. La tâche doit exister dans le même bloc do.

Les cas de switch utilisent également des directives de flux dans leur champ then.


Plafond de classification

Champ optionnel restreignant le taint de session maximum pendant l'exécution.

yaml
classification_ceiling: INTERNAL
ValeurSignification
PUBLICLe flux de travail s'arrête si des données classifiées sont accédées
INTERNALAutorise les données PUBLIC et INTERNAL
CONFIDENTIALAutorise les données jusqu'à CONFIDENTIAL
RESTRICTEDAutorise tous les niveaux de classification
(omis)Aucun plafond appliqué

Le plafond est vérifié avant chaque tâche. Si le taint de la session a augmenté au-delà du plafond (par exemple, parce qu'une tâche précédente a accédé à des données classifiées), le flux de travail s'arrête avec le statut failed et l'erreur Workflow classification ceiling breached.


Stockage

Définitions de flux de travail

Stockées avec le préfixe de clé workflows:{name}. Chaque enregistrement contient :

FieldTypeDescription
namestringNom du flux de travail
yamlstringDéfinition YAML brute
classificationstringNiveau de classification au moment de l'enregistrement
savedAtstringHorodatage ISO 8601
descriptionstringDescription optionnelle

Historique d'exécution

Stocké avec le préfixe de clé workflow-runs:{runId}. Chaque enregistrement d'exécution contient :

FieldTypeDescription
runIdstringUUID de cette exécution
workflowNamestringNom du flux de travail exécuté
statusstringcompleted, failed ou cancelled
outputobjectContexte de données final (clés internes filtrées)
eventsarrayÉvénements émis pendant l'exécution
errorstringMessage d'erreur (si le statut est failed)
startedAtstringHorodatage ISO 8601
completedAtstringHorodatage ISO 8601
taskCountnumberNombre de tâches dans le flux de travail
classificationstringTaint de session à la complétion

Limites

LimiteValeurDescription
Profondeur max. sous-flux5Imbrication maximale des appels run.workflow
Limite par défaut historique10limit par défaut pour workflow_history

Statuts d'exécution

StatutDescription
pendingLe flux de travail a été créé mais pas encore démarré
runningLe flux de travail est en cours d'exécution
completedToutes les tâches se sont terminées avec succès (ou then: end)
failedUne tâche a échoué, un raise a été atteint ou le plafond dépassé
cancelledL'exécution a été annulée de l'extérieur