Skip to content

Riferimento DSL flussi di lavoro

Riferimento completo per il CNCF Serverless Workflow DSL 1.0 come implementato nel motore dei flussi di lavoro di Triggerfish. Per la guida all'uso e gli esempi, consultate Flussi di lavoro.

Struttura del documento

Ogni YAML di flusso di lavoro deve avere un campo document di primo livello e un blocco 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

Metadati del documento

FieldTypeRequiredDescrizione
dslstringyesVersione DSL. Deve essere "1.0"
namespacestringyesRaggruppamento logico (es. ops, reports)
namestringyesNome univoco del flusso di lavoro nel namespace
versionstringnoStringa di versione semantica
descriptionstringnoDescrizione leggibile

Campi di primo livello

FieldTypeRequiredDescrizione
documentobjectyesMetadati del documento (vedi sopra)
doarrayyesElenco ordinato di voci di attivita
classification_ceilingstringnoTaint massimo consentito della sessione durante l'esecuzione
inputtransformnoTrasformazione applicata all'input del flusso di lavoro
outputtransformnoTrasformazione applicata all'output del flusso di lavoro
timeoutobjectnoTimeout del flusso di lavoro (after: <ISO 8601>)
metadataobjectnoMetadati arbitrari chiave-valore

Formato voce attivita

Ogni voce nel blocco do e un oggetto a chiave singola. La chiave e il nome dell'attivita, il valore e la definizione dell'attivita.

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

I nomi delle attivita devono essere univoci all'interno dello stesso blocco do. Il risultato dell'attivita viene memorizzato nel contesto dati sotto il nome dell'attivita.


Campi comuni delle attivita

Tutti i tipi di attivita condividono questi campi opzionali:

FieldTypeDescrizione
ifstringCondizione di espressione. L'attivita viene saltata quando falsa.
inputtransformTrasformazione applicata prima dell'esecuzione dell'attivita
outputtransformTrasformazione applicata dopo l'esecuzione dell'attivita
timeoutobjectTimeout dell'attivita: after: <durata ISO 8601>
thenstringDirettiva di flusso: continue, end o nome di un'attivita
metadataobjectMetadati arbitrari chiave-valore. Quando il self-healing e abilitato, richiede description, expects, produces.

Configurazione del Self-Healing

Il blocco metadata.triggerfish.self_healing abilita un agente di guarigione autonomo per il flusso di lavoro. Consultate Self-Healing per una guida completa.

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]
FieldTypeRequiredPredefinitoDescrizione
enabledbooleanyesAbilita l'agente di guarigione
retry_budgetnumberno3Numero max. di tentativi di intervento
approval_requiredbooleannotrueApprovazione umana richiesta per le correzioni
pause_on_interventionstringno"blocking_only"always | never | blocking_only
pause_timeout_secondsnumberno300Secondi prima dell'attivazione della politica di timeout
pause_timeout_policystringno"escalate_and_halt"escalate_and_halt | escalate_and_skip | escalate_and_fail
notify_onarrayno[]intervention | escalation | approval_required

Metadati di passo (richiesti quando il Self-Healing e abilitato)

Quando self_healing.enabled e true, ogni attivita deve includere questi campi di metadati. L'analizzatore rifiuta i flussi di lavoro in cui uno qualsiasi di essi manca.

FieldTypeDescrizione
descriptionstringCosa fa il passo e perche
expectsstringForma dell'input o precondizioni necessarie
producesstringForma dell'output generato
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"

Tipi di attivita

call

Invio a un endpoint HTTP o servizio Triggerfish.

FieldTypeRequiredDescrizione
callstringyesTipo di chiamata (vedi tabella di invio sotto)
withobjectnoArgomenti passati allo strumento di destinazione
yaml
- fetch:
    call: http
    with:
      endpoint: "https://api.example.com/data"
      method: GET

run

Esegue un comando shell, uno script inline o un sotto-flusso di lavoro. Il campo run deve contenere esattamente uno tra shell, script o workflow.

Shell:

FieldTypeRequiredDescrizione
run.shell.commandstringyesComando shell da eseguire
run.shell.argumentsobjectnoArgomenti con nome
run.shell.environmentobjectnoVariabili d'ambiente

Script:

FieldTypeRequiredDescrizione
run.script.languagestringyesLinguaggio dello script
run.script.codestringyesCodice script inline
run.script.argumentsobjectnoArgomenti con nome

Sotto-flusso di lavoro:

FieldTypeRequiredDescrizione
run.workflow.namestringyesNome del flusso di lavoro salvato
run.workflow.versionstringnoVincolo di versione
run.workflow.inputobjectnoDati di input per il sotto-flusso di lavoro

set

Assegna valori al contesto dati.

FieldTypeRequiredDescrizione
setobjectyesCoppie chiave-valore da assegnare. I valori possono essere espressioni.
yaml
- prepare:
    set:
      full_name: "${ .first_name } ${ .last_name }"
      count: 0

switch

Ramificazione condizionale. Il campo switch e un array di voci di caso. Ogni caso e un oggetto a chiave singola dove la chiave e il nome del caso.

Campo del casoTypeRequiredDescrizione
whenstringnoCondizione di espressione. Omettere per il caso predefinito.
thenstringyesDirettiva di flusso: continue, end o nome dell'attivita

I casi vengono valutati in ordine. Viene preso il primo caso con when vero (o senza when).

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

for

Itera su una collezione.

FieldTypeRequiredDescrizione
for.eachstringyesNome della variabile per l'elemento corrente
for.instringyesEspressione che fa riferimento alla collezione
for.atstringnoNome della variabile per l'indice corrente
doarrayyesLista di attivita annidate eseguite per ogni iterazione
yaml
- process_all:
    for:
      each: item
      in: "${ .items }"
      at: idx
    do:
      - handle:
          call: triggerfish:llm
          with:
            task: "Process item ${ .idx }: ${ .item.name }"

raise

Arresta il flusso di lavoro con un errore strutturato.

FieldTypeRequiredDescrizione
raise.error.statusnumberyesCodice di stato in stile HTTP
raise.error.typestringyesURI/stringa del tipo di errore
raise.error.titlestringyesTitolo leggibile
raise.error.detailstringnoMessaggio di errore dettagliato
yaml
- abort:
    raise:
      error:
        status: 422
        type: "validation-error"
        title: "Invalid input"
        detail: "Field 'email' is required"

emit

Registra un evento del flusso di lavoro. Gli eventi vengono memorizzati nel risultato dell'esecuzione.

FieldTypeRequiredDescrizione
emit.event.typestringyesIdentificatore del tipo di evento
emit.event.sourcestringnoURI sorgente dell'evento
emit.event.dataobjectnoPayload dell'evento
yaml
- record:
    emit:
      event:
        type: "step.completed"
        source: "workflow/pipeline"
        data:
          step: "transform"
          duration_ms: 1200

wait

Mette in pausa l'esecuzione per una durata.

FieldTypeRequiredDescrizione
waitstringyesDurata ISO 8601 (es. PT5S)

Durate comuni: PT1S (1 secondo), PT30S (30 secondi), PT1M (1 minuto), PT5M (5 minuti).


Tabella di invio delle chiamate

Mappa il valore del campo call allo strumento Triggerfish effettivamente invocato.

Valore callStrumento invocatoCampi with: obbligatori
httpweb_fetchendpoint o url; opzionale method, headers, body
triggerfish:llmllm_taskprompt o task; opzionale tools, max_iterations
triggerfish:agentsubagentprompt o task; opzionale tools, agent
triggerfish:memorymemory_*operation (save/search/get/list/delete) + campi dell'operazione
triggerfish:web_searchweb_searchquery; opzionale max_results
triggerfish:web_fetchweb_fetchurl; opzionale method, headers, body
triggerfish:mcpmcp__<server>__<tool>server, tool; opzionale arguments
triggerfish:messagesend_messagechannel, text; opzionale recipient

I tipi di chiamata CNCF non supportati (grpc, openapi, asyncapi) restituiscono un errore.


Sintassi delle espressioni

Le espressioni sono delimitate da ${ } e si risolvono contro il contesto dati del flusso di lavoro.

Risoluzione del percorso a punti

SintassiDescrizioneRisultato esempio
${ . }Intero contesto dati{...}
${ .key }Chiave di primo livello"value"
${ .a.b.c }Chiave annidata"deep value"
${ .items[0] }Indice di array{...primo elemento...}
${ .items[0].name }Indice di array poi chiave"first"

Il punto iniziale (o $.) ancora il percorso alla radice del contesto. I percorsi che si risolvono a undefined producono una stringa vuota quando interpolati, o undefined quando usati come valore autonomo.

Operatori

TipoOperatoriEsempio
Confronto==, !=, >, <, >=, <=${ .count > 0 }
Aritmetica+, -, *, /, %${ .price * .quantity }

Le espressioni di confronto restituiscono true o false. Le espressioni aritmetiche restituiscono un numero (undefined se un operando non e numerico o divisione per zero).

Letterali

TipoEsempi
String"hello", 'hello'
Numero42, 3.14, -1
Booleanotrue, false
Nullnull

Modalita di interpolazione

Espressione singola (valore grezzo): Quando l'intera stringa e un'espressione ${ }, viene restituito il valore tipizzato grezzo (numero, booleano, oggetto, array).

yaml
count: "${ .items.length }"  # restituisce un numero, non una stringa

Mista / espressioni multiple (stringa): Quando espressioni ${ } sono mescolate con testo o ci sono espressioni multiple, il risultato e sempre una stringa.

yaml
message: "Found ${ .count } items in ${ .category }"  # restituisce una stringa

Verita

Per le condizioni if: e le espressioni when: dello switch, i valori vengono valutati usando la verita in stile JavaScript:

ValoreVero?
truesi
Numero diverso da zerosi
Stringa non vuotasi
Array non vuotosi
Oggettosi
false, 0, "", null, undefined, array vuotono

Trasformazioni di input/output

Le trasformazioni rimodellano i dati in entrata e in uscita dalle attivita.

input

Applicata prima dell'esecuzione dell'attivita. Sostituisce la visione dell'attivita del contesto dati.

yaml
- step:
    call: http
    input:
      from: "${ .config }"       # l'attivita vede solo l'oggetto config
    with:
      endpoint: "${ .api_url }"  # risolto contro l'oggetto config

from come stringa: Espressione che sostituisce l'intero contesto di input.

from come oggetto: Mappa nuove chiavi a espressioni:

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

output

Applicata dopo l'esecuzione dell'attivita. Rimodella il risultato prima di memorizzarlo nel contesto sotto il nome dell'attivita.

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

Direttive di flusso

Il campo then su qualsiasi attivita controlla il flusso di esecuzione dopo il completamento dell'attivita.

ValoreComportamento
continueProcede all'attivita successiva nella sequenza (predefinito)
endArresta il flusso di lavoro. Stato: completed.
<nome attivita>Salta all'attivita nominata. L'attivita deve esistere nello stesso blocco do.

I casi dello switch utilizzano anch'essi direttive di flusso nel loro campo then.


Tetto di classificazione

Campo opzionale che limita il taint massimo della sessione durante l'esecuzione.

yaml
classification_ceiling: INTERNAL
ValoreSignificato
PUBLICIl flusso di lavoro si arresta se si accede a dati classificati
INTERNALConsente dati PUBLIC e INTERNAL
CONFIDENTIALConsente fino a dati CONFIDENTIAL
RESTRICTEDConsente tutti i livelli di classificazione
(omesso)Nessun tetto applicato

Il tetto viene verificato prima di ogni attivita. Se il taint della sessione ha superato il tetto (ad esempio, perche un'attivita precedente ha avuto accesso a dati classificati), il flusso di lavoro si arresta con stato failed ed errore Workflow classification ceiling breached.


Archiviazione

Definizioni dei flussi di lavoro

Memorizzate con prefisso di chiave workflows:{name}. Ogni record memorizzato contiene:

FieldTypeDescrizione
namestringNome del flusso di lavoro
yamlstringDefinizione YAML grezza
classificationstringLivello di classificazione al momento del salvataggio
savedAtstringTimestamp ISO 8601
descriptionstringDescrizione opzionale

Cronologia delle esecuzioni

Memorizzata con prefisso di chiave workflow-runs:{runId}. Ogni record di esecuzione contiene:

FieldTypeDescrizione
runIdstringUUID di questa esecuzione
workflowNamestringNome del flusso di lavoro eseguito
statusstringcompleted, failed o cancelled
outputobjectContesto dati finale (chiavi interne filtrate)
eventsarrayEventi emessi durante l'esecuzione
errorstringMessaggio di errore (se lo stato e failed)
startedAtstringTimestamp ISO 8601
completedAtstringTimestamp ISO 8601
taskCountnumberNumero di attivita nel flusso di lavoro
classificationstringTaint della sessione al completamento

Limiti

LimiteValoreDescrizione
Profondita massima sotto-flusso5Annidamento massimo di chiamate run.workflow
Limite predefinito cronologia10limit predefinito per workflow_history

Stati di esecuzione

StatoDescrizione
pendingIl flusso di lavoro e stato creato ma non avviato
runningIl flusso di lavoro e attualmente in esecuzione
completedTutte le attivita completate con successo (o then: end)
failedUn'attivita e fallita, un raise e stato attivato o tetto violato
cancelledL'esecuzione e stata annullata esternamente