Skip to content

Referencia del DSL de flujos de trabajo

Referencia completa del CNCF Serverless Workflow DSL 1.0 tal como está implementado en el motor de flujos de trabajo de Triggerfish. Para la guía de uso y ejemplos, consulta Flujos de trabajo.

Estructura del documento

Cada YAML de flujo de trabajo debe tener un campo document de nivel superior y un bloque 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

Metadatos del documento

FieldTypeRequiredDescription
dslstringyesVersión del DSL. Debe ser "1.0"
namespacestringyesAgrupación lógica (ej., ops, reports)
namestringyesNombre único del flujo de trabajo en el namespace
versionstringnoCadena de versión semántica
descriptionstringnoDescripción legible

Campos de nivel superior

FieldTypeRequiredDescription
documentobjectyesMetadatos del documento (ver arriba)
doarrayyesLista ordenada de entradas de tareas
classification_ceilingstringnoTaint máximo de sesión permitido durante la ejecución
inputtransformnoTransformación aplicada a la entrada del flujo de trabajo
outputtransformnoTransformación aplicada a la salida del flujo de trabajo
timeoutobjectnoTimeout a nivel de flujo (after: <ISO 8601>)
metadataobjectnoMetadatos arbitrarios de clave-valor

Formato de entrada de tarea

Cada entrada en el bloque do es un objeto de una sola clave. La clave es el nombre de la tarea, el valor es la definición de la tarea.

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

Los nombres de las tareas deben ser únicos dentro del mismo bloque do. El resultado de la tarea se almacena en el contexto de datos bajo el nombre de la tarea.


Campos comunes de tareas

Todos los tipos de tareas comparten estos campos opcionales:

FieldTypeDescription
ifstringCondición de expresión. La tarea se omite cuando es falsa.
inputtransformTransformación aplicada antes de la ejecución de la tarea
outputtransformTransformación aplicada después de la ejecución de la tarea
timeoutobjectTimeout de tarea: after: <duración ISO 8601>
thenstringDirectiva de flujo: continue, end, o nombre de tarea
metadataobjectMetadatos arbitrarios de clave-valor. Cuando self-healing está habilitado, requiere description, expects, produces.

Configuración de Self-Healing

El bloque metadata.triggerfish.self_healing habilita un agente de recuperación autónoma para el flujo de trabajo. Consulta Self-Healing para una guía 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]
FieldTypeRequiredDefaultDescription
enabledbooleanyesHabilita el agente de recuperación
retry_budgetnumberno3Intentos máximos de intervención
approval_requiredbooleannotrueRequiere aprobación humana para las correcciones
pause_on_interventionstringno"blocking_only"always | never | blocking_only
pause_timeout_secondsnumberno300Segundos antes de que la política de timeout se active
pause_timeout_policystringno"escalate_and_halt"escalate_and_halt | escalate_and_skip | escalate_and_fail
notify_onarrayno[]intervention | escalation | approval_required

Metadatos de paso (obligatorios cuando Self-Healing está habilitado)

Cuando self_healing.enabled es true, cada tarea debe incluir estos campos de metadatos. El analizador rechaza flujos de trabajo que carezcan de cualquiera de ellos.

FieldTypeDescription
descriptionstringQué hace el paso y por qué
expectsstringForma de entrada o precondiciones necesarias
producesstringForma de salida generada
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"

Tipos de tareas

call

Despacha a un endpoint HTTP o servicio de Triggerfish.

FieldTypeRequiredDescription
callstringyesTipo de llamada (ver tabla de despacho abajo)
withobjectnoArgumentos pasados a la herramienta objetivo
yaml
- fetch:
    call: http
    with:
      endpoint: "https://api.example.com/data"
      method: GET

run

Ejecuta un comando de shell, script en línea o sub-flujo. El campo run debe contener exactamente uno de shell, script o workflow.

Shell:

FieldTypeRequiredDescription
run.shell.commandstringyesComando de shell a ejecutar
run.shell.argumentsobjectnoArgumentos con nombre
run.shell.environmentobjectnoVariables de entorno

Script:

FieldTypeRequiredDescription
run.script.languagestringyesLenguaje del script
run.script.codestringyesCódigo del script en línea
run.script.argumentsobjectnoArgumentos con nombre

Sub-flujo:

FieldTypeRequiredDescription
run.workflow.namestringyesNombre del flujo de trabajo guardado
run.workflow.versionstringnoRestricción de versión
run.workflow.inputobjectnoDatos de entrada para el sub-flujo

set

Asigna valores al contexto de datos.

FieldTypeRequiredDescription
setobjectyesPares clave-valor para asignar. Los valores pueden ser expresiones.
yaml
- prepare:
    set:
      full_name: "${ .first_name } ${ .last_name }"
      count: 0

switch

Ramificación condicional. El campo switch es un arreglo de entradas de caso. Cada caso es un objeto de una sola clave donde la clave es el nombre del caso.

Case fieldTypeRequiredDescription
whenstringnoCondición de expresión. Omitir para el caso predeterminado.
thenstringyesDirectiva de flujo: continue, end, o nombre de tarea

Los casos se evalúan en orden. Se toma el primer caso con un when verdadero (o sin when).

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

for

Itera sobre una colección.

FieldTypeRequiredDescription
for.eachstringyesNombre de variable para el elemento actual
for.instringyesExpresión que referencia la colección
for.atstringnoNombre de variable para el índice actual
doarrayyesLista de tareas anidada ejecutada en cada iteración
yaml
- process_all:
    for:
      each: item
      in: "${ .items }"
      at: idx
    do:
      - handle:
          call: triggerfish:llm
          with:
            task: "Process item ${ .idx }: ${ .item.name }"

raise

Detiene el flujo de trabajo con un error estructurado.

FieldTypeRequiredDescription
raise.error.statusnumberyesCódigo de estado estilo HTTP
raise.error.typestringyesURI/cadena del tipo de error
raise.error.titlestringyesTítulo legible
raise.error.detailstringnoMensaje detallado del error
yaml
- abort:
    raise:
      error:
        status: 422
        type: "validation-error"
        title: "Invalid input"
        detail: "Field 'email' is required"

emit

Registra un evento del flujo de trabajo. Los eventos se almacenan en el resultado de ejecución.

FieldTypeRequiredDescription
emit.event.typestringyesIdentificador del tipo de evento
emit.event.sourcestringnoURI de origen del evento
emit.event.dataobjectnoCarga del evento
yaml
- record:
    emit:
      event:
        type: "step.completed"
        source: "workflow/pipeline"
        data:
          step: "transform"
          duration_ms: 1200

wait

Pausa la ejecución durante una duración.

FieldTypeRequiredDescription
waitstringyesDuración ISO 8601 (ej., PT5S)

Duraciones comunes: PT1S (1 segundo), PT30S (30 segundos), PT1M (1 minuto), PT5M (5 minutos).


Tabla de despacho de llamadas

Mapea el valor del campo call a la herramienta de Triggerfish que se invoca.

Valor de callHerramienta invocadaCampos with: requeridos
httpweb_fetchendpoint o url; opcional method, headers, body
triggerfish:llmllm_taskprompt o task; opcional tools, max_iterations
triggerfish:agentsubagentprompt o task; opcional tools, agent
triggerfish:memorymemory_*operation (save/search/get/list/delete) + campos de operación
triggerfish:web_searchweb_searchquery; opcional max_results
triggerfish:web_fetchweb_fetchurl; opcional method, headers, body
triggerfish:mcpmcp__<server>__<tool>server, tool; opcional arguments
triggerfish:messagesend_messagechannel, text; opcional recipient

Los tipos de llamada CNCF no soportados (grpc, openapi, asyncapi) devuelven un error.


Sintaxis de expresiones

Las expresiones están delimitadas por ${ } y se resuelven contra el contexto de datos del flujo de trabajo.

Resolución de rutas de punto

SintaxisDescripciónResultado de ejemplo
${ . }Contexto de datos completo{...}
${ .key }Clave de nivel superior"value"
${ .a.b.c }Clave anidada"deep value"
${ .items[0] }Índice de arreglo{...primer item...}
${ .items[0].name }Índice de arreglo y luego clave"first"

El punto inicial (o $.) ancla la ruta en la raíz del contexto. Las rutas que resuelven a undefined producen una cadena vacía al interpolar, o undefined cuando se usan como valor independiente.

Operadores

TipoOperadoresEjemplo
Comparación==, !=, >, <, >=, <=${ .count > 0 }
Aritmético+, -, *, /, %${ .price * .quantity }

Las expresiones de comparación devuelven true o false. Las expresiones aritméticas devuelven un número (undefined si algún operando no es numérico o hay división por cero).

Literales

TipoEjemplos
String"hello", 'hello'
Número42, 3.14, -1
Booleanotrue, false
Nulonull

Modos de interpolación

Expresión única (valor crudo): Cuando toda la cadena es una expresión ${ }, se devuelve el valor con tipo crudo (número, booleano, objeto, arreglo).

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

Mixto / múltiples expresiones (string): Cuando las expresiones ${ } se mezclan con texto o hay múltiples expresiones, el resultado siempre es un string.

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

Veracidad

Para condiciones if: y expresiones when: de switch, los valores se evalúan usando veracidad al estilo JavaScript:

Valor¿Verdadero?
true
Número distinto de cero
Cadena no vacía
Arreglo no vacío
Objeto
false, 0, "", null, undefined, arreglo vacíono

Transformaciones de entrada/salida

Las transformaciones reestructuran los datos que entran y salen de las tareas.

input

Se aplica antes de la ejecución de la tarea. Reemplaza la vista de la tarea del contexto de datos.

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

from como string: Expresión que reemplaza todo el contexto de entrada.

from como objeto: Mapea nuevas claves a expresiones:

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

output

Se aplica después de la ejecución de la tarea. Reestructura el resultado antes de almacenarlo en el contexto bajo el nombre de la tarea.

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

Directivas de flujo

El campo then en cualquier tarea controla el flujo de ejecución después de que la tarea se completa.

ValorComportamiento
continueContinúa con la siguiente tarea en secuencia (predeterminado)
endDetiene el flujo de trabajo. Estado: completed.
<nombre de tarea>Salta a la tarea con nombre. Debe existir en el mismo bloque do.

Los casos de switch también usan directivas de flujo en su campo then.


Techo de clasificación

Campo opcional que restringe el taint máximo de sesión durante la ejecución.

yaml
classification_ceiling: INTERNAL
ValorSignificado
PUBLICEl flujo se detiene si se accede a datos clasificados
INTERNALPermite datos PUBLIC e INTERNAL
CONFIDENTIALPermite datos hasta CONFIDENTIAL
RESTRICTEDPermite todos los niveles de clasificación
(omitido)Sin techo aplicado

El techo se verifica antes de cada tarea. Si el taint de la sesión se ha escalado más allá del techo (por ejemplo, porque una tarea anterior accedió a datos clasificados), el flujo de trabajo se detiene con estado failed y error Workflow classification ceiling breached.


Almacenamiento

Definiciones de flujos de trabajo

Se almacenan con prefijo de clave workflows:{name}. Cada registro contiene:

FieldTypeDescription
namestringNombre del flujo de trabajo
yamlstringDefinición YAML original
classificationstringNivel de clasificación al momento de guardar
savedAtstringMarca de tiempo ISO 8601
descriptionstringDescripción opcional

Historial de ejecuciones

Se almacena con prefijo de clave workflow-runs:{runId}. Cada registro contiene:

FieldTypeDescription
runIdstringUUID de esta ejecución
workflowNamestringNombre del flujo de trabajo ejecutado
statusstringcompleted, failed, o cancelled
outputobjectContexto de datos final (claves internas filtradas)
eventsarrayEventos emitidos durante la ejecución
errorstringMensaje de error (si el estado es failed)
startedAtstringMarca de tiempo ISO 8601
completedAtstringMarca de tiempo ISO 8601
taskCountnumberNúmero de tareas en el flujo de trabajo
classificationstringTaint de la sesión al completarse

Límites

LímiteValorDescripción
Profundidad máxima de sub-flujos5Anidamiento máximo de llamadas run.workflow
Límite predeterminado de historial10limit predeterminado para workflow_history

Estados de ejecución

EstadoDescripción
pendingEl flujo de trabajo fue creado pero no iniciado
runningEl flujo de trabajo se está ejecutando actualmente
completedTodas las tareas terminaron con éxito (o then: end)
failedUna tarea falló, se alcanzó un raise, o se violó el techo
cancelledLa ejecución fue cancelada externamente