Skip to content

Arbeidsflyter

Triggerfish inkluderer en innebygd kjøringsmotor for CNCF Serverless Workflow DSL 1.0. Arbeidsflyter lar deg definere deterministiske, flertrinnautomatiseringer i YAML som kjøres uten LLM-en i løkken under kjøring. Agenten oppretter og utløser arbeidsflyter, men motoren håndterer den faktiske oppgavedistribusjon, forgrening, løkking og dataflyt.

Når man bruker arbeidsflyter

Bruk arbeidsflyter for gjentakbare, deterministiske sekvenser der du kjenner trinnene på forhånd: hent data fra en API, transformer det, lagre i minnet, send et varsel. Den samme inndataen produserer alltid den samme utdataen.

Bruk agenten direkte for åpent resonnering, utforskning eller oppgaver der neste trinn avhenger av skjønn: undersøke et emne, skrive kode, feilsøke et problem.

En god tommelfingerregel: hvis du ofte ber agenten gjøre den samme flertrinnssekvensen, gjør det om til en arbeidsflyt.

Tilgjengelighet

Arbeidsflyter er tilgjengelige på alle planer. Åpen kildekode-brukere som kjører egne API-nøkler har full tilgang til arbeidsflytmotoren — hvert triggerfish:llm- eller triggerfish:agent-kall innenfor en arbeidsflyt forbruker inferens fra den konfigurerte leverandøren din.

Verktøy

workflow_save

Analyser, valider og lagre en arbeidsflysdefinisjon. Arbeids flyten lagres på gjeldende sesjons klassifiseringsnivå.

ParameterTypePåkrevdBeskrivelse
namestringJaNavn for arbeids flyten
yamlstringJaYAML-arbeidsflysdefinisjon
descriptionstringNeiHva arbeids flyten gjør

workflow_run

Kjør en arbeidsflyt etter navn eller fra innebygd YAML. Returnerer kjøringsutdata og status.

ParameterTypePåkrevdBeskrivelse
namestringNeiNavn på en lagret arbeidsflyt som skal kjøres
yamlstringNeiInnebygd YAML-definisjon (når du ikke bruker en lagret)
inputstringNeiJSON-streng med inndata for arbeids flyten

Én av name eller yaml er påkrevd.

workflow_list

List alle lagrede arbeidsflyter tilgjengelige på gjeldende klassifiseringsnivå. Tar ingen parametere.

workflow_get

Hent en lagret arbeidsflysdefinisjon etter navn.

ParameterTypePåkrevdBeskrivelse
namestringJaNavn på arbeids flyten som skal hentes

workflow_delete

Slett en lagret arbeidsflyt etter navn. Arbeids flyten må være tilgjengelig på gjeldende sesjons klassifiseringsnivå.

ParameterTypePåkrevdBeskrivelse
namestringJaNavn på arbeids flyten som skal slettes

workflow_history

Vis tidligere arbeidsflytkjøringsresultater, eventuelt filtrert etter arbeidsflytnavn.

ParameterTypePåkrevdBeskrivelse
workflow_namestringNeiFiltrer resultater etter arbeidsflytnavn
limitstringNeiMaksimalt antall resultater (standard 10)

Oppgavetyper

Arbeidsflyter er sammensatt av oppgaver i en do:-blokk. Hver oppgave er en navngitt oppføring med en typespesifikk kropp. Triggerfish støtter 8 oppgavetyper.

call — Eksterne kall

Distribuer til HTTP-endepunkter eller Triggerfish-tjenester.

yaml
- fetch_issue:
    call: http
    with:
      endpoint: "https://api.github.com/repos/${ .repo }/issues/${ .issue_number }"
      method: GET
      headers:
        Authorization: "Bearer ${ .github_token }"

call-feltet bestemmer distribusjonsmålet. Se Kalldistribusjon for fullstendig kartlegging.

run — Shell, skript eller sub-arbeidsflyt

Kjør en shell-kommando, et innebygd skript eller en annen lagret arbeidsflyt.

Shell-kommando:

yaml
- list_files:
    run:
      shell:
        command: "ls -la /tmp/workspace"

Sub-arbeidsflyt:

yaml
- cleanup:
    run:
      workflow:
        name: cleanup-temp-files
        input:
          directory: "${ .workspace }"

WARNING

Shell- og skriptkjøring krever at allowShellExecution-flagget er aktivert i arbeidsflyktverktøy-konteksten. Hvis deaktivert, vil kjøringsoppgaver med shell- eller script-mål mislykkes.

set — Datakontekstmutasjoner

Tilordne verdier til arbeids flytens datakontekst. Støtter uttrykk.

yaml
- prepare_prompt:
    set:
      summary_prompt: "Summarize the following GitHub issue: ${ .fetch_issue.title } — ${ .fetch_issue.body }"
      issue_url: "https://github.com/${ .repo }/issues/${ .issue_number }"

switch — Betinget forgrening

Forgrening basert på betingelser. Hvert tilfelle har et when-uttrykk og et then-flytstyringsdirekiv. Et tilfelle uten when fungerer som standard.

yaml
- check_priority:
    switch:
      - high_priority:
          when: "${ .fetch_issue.labels }"
          then: notify_team
      - default:
          then: continue

for — Iterasjon

Loop over en samling, kjør en nestet do:-blokk for hvert element.

yaml
- process_items:
    for:
      each: item
      in: "${ .items }"
      at: index
    do:
      - log_item:
          set:
            current: "${ .item }"

each-feltet navngir løkkevariabelen, in refererer til samlingen, og det valgfrie at-feltet gir gjeldende indeks.

raise — Stopp med feil

Stopp kjøring med en strukturert feil.

yaml
- fail_if_missing:
    if: "${ .result == null }"
    raise:
      error:
        status: 404
        type: "not-found"
        title: "Resource not found"
        detail: "The requested item does not exist"

emit — Registrer hendelser

Registrer en arbeidsflythendelse. Hendelser fanges i kjøringsresultatet og kan gjennomgås via workflow_history.

yaml
- log_completion:
    emit:
      event:
        type: "issue.summarized"
        source: "workflow/summarize-issue"
        data:
          issue_number: "${ .issue_number }"
          summary_length: "${ .summary.length }"

wait — Pause

Sett kjøring på pause i en ISO 8601-varighet.

yaml
- rate_limit_pause:
    wait: PT2S

Kalldistribusjon

call-feltet i en kalloppgave bestemmer hvilket Triggerfish-verktøy som kalles.

KalltypeTriggerfish-verktøyPåkrevde with:-felter
httpweb_fetchendpoint (eller url), method
triggerfish:llmllm_taskprompt (eller task)
triggerfish:agentsubagentprompt (eller task)
triggerfish:memorymemory_*operation + operasjonsspesifikke felter
triggerfish:web_searchweb_searchquery
triggerfish:web_fetchweb_fetchurl
triggerfish:mcpmcp__<server>__<tool>server, tool, arguments
triggerfish:messagesend_messagechannel, text

Minneoperasjoner: triggerfish:memory-kalltypen krever et operation-felt satt til én av save, search, get, list eller delete. De gjenværende with:-feltene sendes direkte til det tilsvarende minneverktøyet.

yaml
- save_summary:
    call: triggerfish:memory
    with:
      operation: save
      content: "${ .summary }"
      tags: ["github", "issue-summary"]

MCP-kall: triggerfish:mcp-kalltypen ruter til et tilkoblet MCP-serververktøy. Angi server-navn, tool-navn og arguments-objekt.

yaml
- run_lint:
    call: triggerfish:mcp
    with:
      server: eslint
      tool: lint-files
      arguments:
        paths: ["src/"]

Uttrykk

Arbeidsflytuttrykk bruker ${ }-syntaks med punktsti-løsning mot arbeidsflyts datakontekst.

yaml
# Enkel verdihenvisning
url: "${ .config.api_url }"

# Arrayindeksering
first_item: "${ .results[0].name }"

# Strenginterpolasjon (flere uttrykk i én streng)
message: "Found ${ .count } issues in ${ .repo }"

# Sammenligning (returnerer boolean)
if: "${ .status == 'open' }"

# Aritmetikk
total: "${ .price * .quantity }"

Støttede operatorer:

  • Sammenligning: ==, !=, >, <, >=, <=
  • Aritmetikk: +, -, *, /, %

Literaler: Streng ("verdi" eller 'verdi'), tall (42, 3.14), boolean (true, false), null (null).

Når et ${ }-uttrykk er hele verdien, bevares den rå typen (tall, boolean, objekt). Når blandet med tekst, er resultatet alltid en streng.

Komplett eksempel

Denne arbeids flyten henter en GitHub-sak, oppsummerer den med LLM-en, lagrer sammendraget i minnet og sender et varsel.

yaml
document:
  dsl: "1.0"
  namespace: examples
  name: summarize-github-issue
  version: "1.0.0"
  description: Fetch a GitHub issue, summarize it, and notify the team.
classification_ceiling: INTERNAL
do:
  - fetch_issue:
      call: http
      with:
        endpoint: "https://api.github.com/repos/${ .repo }/issues/${ .issue_number }"
        method: GET
        headers:
          Authorization: "Bearer ${ .github_token }"
          Accept: application/vnd.github+json
  - prepare_context:
      set:
        issue_title: "${ .fetch_issue.title }"
        issue_body: "${ .fetch_issue.body }"
  - summarize:
      call: triggerfish:llm
      with:
        task: "Summarize this GitHub issue in 2-3 sentences:\n\nTitle: ${ .issue_title }\n\nBody: ${ .issue_body }"
  - save_to_memory:
      call: triggerfish:memory
      with:
        operation: save
        content: "Issue #${ .issue_number } (${ .issue_title }): ${ .summarize }"
        tags: ["github", "issue-summary", "${ .repo }"]
  - notify:
      call: triggerfish:message
      with:
        channel: telegram
        text: "Issue #${ .issue_number } summarized: ${ .summarize }"

Kjør det:

workflow_run with name: "summarize-github-issue" and input:
  {"repo": "myorg/myrepo", "issue_number": 42, "github_token": "ghp_..."}

Inn- og utdatatransformasjoner

Oppgaver kan transformere inndataene sine før kjøring og utdataene sine før de lagrer resultater.

yaml
- fetch_data:
    call: http
    with:
      endpoint: "${ .api_url }"
    input:
      from: "${ .config }"
    output:
      from:
        items: "${ .fetch_data.data.results }"
        total: "${ .fetch_data.data.count }"
  • input.from — Uttrykk eller objektkartlegging som erstatter oppgavens inndatakontekst før kjøring.
  • output.from — Uttrykk eller objektkartlegging som omformer oppgaveresultatet før det lagres i datakonteksten.

Flytkontroll

Alle oppgaver kan inkludere et then-direktiv som kontrollerer hva som skjer neste:

  • continue (standard) — gå til neste oppgave i sekvensen
  • end — stopp arbeids flyten umiddelbart (status: fullført)
  • Navngitt oppgave — hopp til en spesifikk oppgave etter navn
yaml
- validate:
    switch:
      - invalid:
          when: "${ .input.email == null }"
          then: handle_error
      - valid:
          then: continue
- process:
    call: triggerfish:llm
    with:
      task: "Process ${ .input.email }"
    then: end
- handle_error:
    raise:
      error:
        status: 400
        type: "validation-error"
        title: "Missing email"

Betinget kjøring

Alle oppgaver kan inkludere et if-felt. Oppgaven hoppes over når betingelsen evalueres til falsk.

yaml
- send_alert:
    if: "${ .severity == 'critical' }"
    call: triggerfish:message
    with:
      channel: telegram
      text: "CRITICAL: ${ .alert_message }"

Sub-arbeidsflyter

En run-oppgave med et workflow-mål kjører en annen lagret arbeidsflyt. Sub-arbeids flyten kjøres med sin egen kontekst og returnerer utdataene til foreldrearbeids flyten.

yaml
- enrich_data:
    run:
      workflow:
        name: data-enrichment-pipeline
        input:
          raw_data: "${ .fetched_data }"

Sub-arbeidsflyter kan neste opptil 5 nivåer dypt. Å overskride denne grensen produserer en feil og stopper kjøringen.

Klassifisering og sikkerhet

Arbeidsflyter deltar i det samme klassifiseringssystemet som alle andre Triggerfish-data.

Lagringsklassifisering. Når du lagrer en arbeidsflyt med workflow_save, lagres den på gjeldende sesjons taint-nivå. En arbeidsflyt lagret under en CONFIDENTIAL-sesjon kan bare lastes av sesjoner på CONFIDENTIAL eller høyere.

Klassifiseringstak. Arbeidsflyter kan erklære et classification_ceiling i sin YAML. Før hver oppgave kjøres, sjekker motoren at sesjonens gjeldende taint ikke overstiger taket. Hvis session taint eskalerer forbi taket under kjøring (f.eks. ved å aksessere klassifisert data via et verktøykall), stopper arbeids flyten med en tak-brudd-feil.

yaml
classification_ceiling: INTERNAL

Gyldige verdier: PUBLIC, INTERNAL, CONFIDENTIAL, RESTRICTED.

Kjøringshistorikk. Kjøringsresultater lagres med sesjonens klassifisering på tidspunktet for fullføring. workflow_history filtrerer resultater etter canFlowTo, slik at du bare ser kjøringer som er på eller under din gjeldende session taint.

SIKKERHET

Sletting av arbeids flyt krever at arbeids flyten er tilgjengelig på din gjeldende sesjons klassifiseringsnivå. Du kan ikke slette en arbeidsflyt lagret på CONFIDENTIAL fra en PUBLIC-sesjon. workflow_delete-verktøyet laster arbeids flyten først og returnerer «ikke funnet» hvis klassifiseringssjekken feiler.

Selvhelbredelse

Arbeidsflyter kan valgfritt ha en autonom helbredelsesagent som overvåker kjøring i sanntid, diagnostiserer feil og foreslår reparasjoner. Når selvhelbredelse er aktivert, spawnes en lederagent ved siden av arbeids flytkjøringen. Den observerer alle trinns-hendelser, triasjer feil og koordinerer spesialistteam for å løse problemer.

Aktivere selvhelbredelse

Legg til en self_healing-blokk i arbeidsflyts metadata.triggerfish-seksjon:

yaml
document:
  dsl: "1.0"
  namespace: ops
  name: data-pipeline
metadata:
  triggerfish:
    self_healing:
      enabled: true
      retry_budget: 3
      approval_required: true
      pause_on_intervention: blocking_only
do:
  - fetch-data:
      call: http
      with:
        endpoint: "https://api.example.com/data"
      metadata:
        description: "Fetch raw invoice data from billing API"
        expects: "API returns JSON array of invoice objects"
        produces: "Array of {id, amount, status, date} objects"

Når enabled: true er satt, hvert trinn inkludere tre metadatafelter:

FeltBeskrivelse
descriptionHva trinnet gjør og hvorfor det finnes
expectsInndataform eller forutsetninger trinnet trenger
producesUtdataform trinnet genererer

Parseren avviser arbeidsflyter der et trinn mangler disse feltene.

Konfigurasjonsalternativer

AlternativTypeStandardBeskrivelse
enabledbooleanPåkrevd. Aktiverer helbredelsesagenten.
retry_budgetnumber3Maksimalt antall intervensjoner før eskalering som uløselig.
approval_requiredbooleantrueOm foreslåtte arbeidsflytreparasjoner krever menneskelig godkjenning.
pause_on_interventionstring"blocking_only"Når nedstrømsoppgaver settes på pause: always, never eller blocking_only.
pause_timeout_secondsnumber300Sekunder å vente under en pause før tidsavbruddspolicyen utløses.
pause_timeout_policystring"escalate_and_halt"Hva som skjer ved tidsavbrudd: escalate_and_halt, escalate_and_skip eller escalate_and_fail.
notify_onarray[]Hendelser som utløser varsler: intervention, escalation, approval_required.

Slik fungerer det

  1. Observasjon. Helbredelseslederagenten mottar en sanntidsstrøm av trinns-hendelser (startet, fullført, feilet, hoppet over) mens arbeids flyten kjøres.

  2. Triage. Når et trinn feiler, triasjer lederen feilen i én av fem kategorier:

    KategoriBetydning
    transient_retryMidlertidig problem (nettverksfeil, hastighetsbegrensning, 503)
    runtime_workaroundUkjent feil første gang, kan kanskje omgås
    structural_fixGjentakende feil som krever endring av arbeidsflydefinisjonen
    plugin_gapAuth/legitimasjonsproblem som krever en ny integrasjon
    unresolvableForsøksbudsjett oppbrukt eller grunnleggende ødelagt
  3. Spesialistteam. Basert på triasje-kategorien spawner lederen et team av spesialistagenter (diagnostiker, forsøkskoordinator, definisjonsreparatør, plugin-forfatter, osv.) for å undersøke og løse problemet.

  4. Versjonsforslag. Når en strukturell reparasjon er nødvendig, foreslår teamet en ny arbeidsflyversjon. Hvis approval_required er sant, venter forslaget på menneskelig gjennomgang via workflow_version_approve eller workflow_version_reject.

  5. Scoped pause. Når pause_on_intervention er aktivert, settes bare nedstrømsoppgaver på pause — uavhengige grener fortsetter å kjøre.

Helbredelsesverktøy

Fire ytterligere verktøy er tilgjengelige for å administrere helbredelsestilstand:

VerktøyBeskrivelse
workflow_version_listList foreslåtte/godkjente/avviste versjoner
workflow_version_approveGodkjenn en foreslått versjon
workflow_version_rejectAvvis en foreslått versjon med begrunnelse
workflow_healing_statusGjeldende helbredelsestatus for en arbeids flytkjøring

Sikkerhet

  • Helbredelsesagenten kan ikke endre sin egen self_healing-konfig. Foreslåtte versjoner som endrer konfigblokken avvises.
  • Lederagenten og alle teammedlemmer arver arbeids flytens taint-nivå og eskalerer i takt.
  • Alle agenthandlinger passerer gjennom standard policy-hook-kjeden — ingen omgåelser.
  • Foreslåtte versjoner lagres på arbeidsflyts klassifiseringsnivå.