Flussi di lavoro
I workflow Adios collegano API, script, database, email, archiviazione a oggetti e agenti IA in una sequenza di azioni tracciate. Avvia un’esecuzione manualmente, da un webhook o evento, oppure a intervalli ricorrenti. Aggiungi un’approvazione umana prima di un’azione che richiede una revisione.
Parti da una ricetta completa: elaborare un webhook, inviare un report pianificato, oppure revisione prima della pubblicazione. La panoramica dei workflow include anche esempi di S3 e script.
In questa pagina: manifest, trigger, tutte e dieci le azioni, output e dipendenze, segreti e variabili di ambiente, e creare ed esaminare.
Manifest del workflow
Un manifest di workflow descrive trigger, contesto condiviso e passaggi ordinati. In un repository dedicato ai workflow puoi chiamare il file adios.yaml. In un repository applicativo, mantieni il manifest dell’ambiente di esecuzione dell’app nella directory principale e conserva i manifest dei workflow in una directory come workflows/.
workflow_id: daily-market-brief
title: Daily market brief
team_id: team-local
enabled: true
version: "1"
triggers:
- type: schedule
interval: 24h
- type: webhook
event: market.brief.requested
context:
market_api_url: https://api.example.com
symbols:
- AAPL
- MSFT
- NVDA
steps:
- step_id: fetch-prices
name: Fetch prices
kind: http
command:
method: GET
url: "{{ .context.market_api_url }}/quotes?symbols=AAPL,MSFT,NVDA"
headers:
X-API-Key: secret://MARKET_DATA_API_KEY
- step_id: select-close
name: Select close prices
kind: data-json
dependencies:
- fetch-prices
command:
from_step: fetch-prices
path: ".quotes"
- step_id: publish-brief
name: Publish brief
kind: http
dependencies:
- select-close
command:
method: POST
url: https://dashboard.example.com/api/market-briefs
body: "{{ index .steps \"select-close\" \"output\" }}"
Sostituisci team-local con l’ID del tuo team, configura gli endpoint API e crea MARKET_DATA_API_KEY nei segreti Adios prima di distribuire questo esempio. L’API sorgente richiede un’intestazione X-API-Key; la destinazione riceve le citazioni selezionate come JSON. La pianificazione si ripete ogni 24 ore. Rimuovi triggers per un test esclusivamente manuale prima di abilitare gli invii ricorrenti.
Trigger e pianificazione
- Manuale: ometti
triggerse avvia un’esecuzione da Workflow. - Webhook: usa
type: webhooke un nome dell'evento, comeorder.created. Il payload dell’evento in ingresso è disponibile come.payload. - Evento: usa
type: evente il nome dell’evento interno devono corrispondere. - Intervallo: usa
type: schedulecon una durata positiva comeinterval: 1hointerval: 24h. - Cron: lo scheduler attuale supporta
@every 1h,* * * * *, e intervalli in minuti, come*/5 * * * *. Non interpreta espressioni cron generali del calendario, come0 8 * * *.
Gli intervalli misurano il tempo trascorso e non sono allineati a un orario specifico. Una nuova pianificazione rilevata può essere eseguita al successivo controllo dello scheduler; riavviarlo azzera il monitoraggio degli intervalli in memoria. Sebbene timezone e concurrency sono campi accettati nel manifest, ma lo scheduler attuale non li applica. Non fare affidamento su concurrency: forbid per impedire esecuzioni sovrapposte.
Per un orario locale fisso, usa uno scheduler esterno per inviare un webhook. Se un’esecuzione ripetuta può generare report o scritture duplicati, implementa la deduplicazione nell’applicazione o nella destinazione.
Tutte e dieci le azioni supportate
Ogni passaggio ha un identificativo univoco step_id, un kind, e facoltativamente dependencies e command. La configurazione seguente descrive l’esecuzione sulla piattaforma. Il runner locale della CLI implementa solo un sottoinsieme di queste azioni.
http — Chiama un’API
Imposta command.method, url, il campo facoltativo headers, e body. Il corpo della risposta diventa l’output del passaggio. Usa l’output di un passaggio precedente .output per inoltrare JSON come testo. Vedi il workflow ricetta webhook.
- step_id: deliver
kind: http
dependencies: [order]
command:
method: POST
url: https://api.example.com/orders
headers:
X-API-Key: secret://API_TOKEN
body: "{{ .steps.order.output }}"
request-parser — Estrai campi della richiesta
Usa command.extract per costruire un oggetto da selettori come .payload.order, oppure command.path per selezionare un valore. I metadati della richiesta, quando forniti dal trigger, sono disponibili sotto .request. L'estrazione non convalida uno schema.
- step_id: parse
kind: request-parser
command:
extract:
order: .payload.order
data-json — Seleziona valori JSON
Usa command.from_step con l’ID del passaggio sorgente e path con il valore da selezionare. path: . mantiene l'intero valore; .rows[0].orders seleziona un campo della prima riga. Puoi fornire anche command.input; senza una sorgente, l’azione usa il payload dell’esecuzione. È un selettore, non un motore di espressioni jq.
bash — Esegui comandi shell
Metti lo script in command: | e il suo ambiente nel blocco del passaggio env. Il worker del workflow lo esegue e acquisisce stdout come output del passaggio. Usa stdout in JSON quando un altro passaggio richiede dati strutturati.
python — Esegui uno script Python
Usa la stessa struttura command e env di Bash. Leggi le variabili con os.environ e mostra il risultato. Il workflow esempio di script passa JSON da Bash a Python e calcola un totale di 97 senza credenziali esterne.
sql — Interroga PostgreSQL o MySQL
Imposta command.driver a postgres o mysql, dsn a un segreto di connessione, e query per SQL. Le query di lettura restituiscono columns, rows, e row_count, con al massimo 100 righe. Le query che modificano i dati richiedono write: true e restituiscono rows_affected. Vedi il ricetta di report.
email — Invia un messaggio
Imposta command.provider, from, to, subject, e text o html, insieme alle credenziali del fornitore. I fornitori supportati sono smtp, sendgrid, postmark,
mailgun, brevo, mailjet, e mailchimp-transactional (anche mandrill). SMTP utilizza host, port, username, e password; SendGrid usa api_key. Gli altri fornitori richiedono i propri campi per credenziali e dominio. L’esempio ricetta di report mostra la configurazione SendGrid. Un’azione riuscita conferma l’invio al fornitore, non la consegna nella casella di posta.
s3 — Gestisci un oggetto
Imposta command.operation a put, get, head (o stat), oppure delete. Configura endpoint come nome host senza schema URL, region, use_ssl, access_key,
secret_key, bucket, e key. Per i caricamenti, fornisci body e facoltativamente content_type. Usa un bucket esistente. Il workflow esempio di istantanea scrive JSON sotto una chiave contenente l'ID di esecuzione.
wait — Attendi un’approvazione umana
Un passaggio wait crea un’approvazione in sospeso e mette in pausa l’esecuzione. L’approvazione consente ai passaggi dipendenti di continuare. Il rifiuto fa fallire il passaggio e interrompe l’esecuzione; un’approvazione senza risposta resta in attesa. Non esistono campi di comando per ritardi temporizzati, assegnazione dei revisori o scadenza automatica.
- step_id: approve
kind: wait
dependencies: [draft]
Fai dipendere l’azione protetta da approve. Vedi il ricetta di approvazione per il flusso completo.
agent — Esegui un agente IA configurato
Un’azione agente richiede un identificativo fissato agent_binding_id,
agent_binding_revision_id, agent_binding_revision_digest, e workspace_id in command. Il digest deve essere sha256: seguito da 64 caratteri esadecimali. Usa i valori precisi della revisione configurata del binding, poi imposta input al compito. Il workflow attende che l’agente termini prima di continuare.
L’output è la struttura JSON del risultato dell’agente, incluse le informazioni sull’esecuzione e i risultati; non è soltanto il testo della bozza. Esaminalo prima di selezionare un campo o inoltrare tutto il risultato. Il campo ricetta di approvazione mostra tutti i campi richiesti.
Dipendenze e output dei passaggi
Elenca gli ID dei passaggi precedenti in dependencies e colloca quei passaggi prima nel manifest. Una dipendenza fallita impedisce l’esecuzione dell’azione successiva. L’ambiente attuale esegue i passaggi in sequenza; elencare passaggi indipendenti non li fa eseguire in parallelo.
I modelli usano la sintassi dei template Go. I valori utili includono:
{{ .context.destination_url }}per la configurazione condivisa.{{ .steps.report.output }}per la stringa di output originale di un passaggio, adatta a un corpo JSON.{{ .steps.count.value }}per il valore analizzato, adatto a inserire uno scalare nel testo.{{ index .steps "fetch-prices" "output" }}per un ID contenente un trattino.{{ .run.ID }}per l'ID corrente di esecuzione.
Usa .output per passare un oggetto JSON completo come testo. Renderizzare un oggetto analizzato tramite .value non ne esegue la codifica JSON. Per selezionare elementi dagli array, usa percorsi come .rows[0].orders in un data-json.
Segreti e variabili di ambiente
Per le azioni HTTP, SQL, email e S3, inserisci secret://NAME direttamente nel campo di comando che ha bisogno del valore. Il riferimento deve occupare l'intero campo: X-API-Key: secret://API_TOKEN viene risolto, ma Authorization: "Bearer secret://API_TOKEN" viene inviato letteralmente. Per l’autenticazione bearer, conserva il valore completo dell’intestazione Bearer … in un segreto e usa Authorization: secret://API_AUTHORIZATION.
Le azioni Bash e Python ricevono le variabili di ambiente tramite il campo env del passaggio. Il worker recupera i valori dei riferimenti ai segreti prima di avviare lo script:
steps:
- step_id: fetch
kind: python
env:
API_TOKEN: secret://API_TOKEN
API_URL: https://api.example.com/data
command: |
import os
import urllib.request
request = urllib.request.Request(
os.environ["API_URL"],
headers={"Authorization": "Bearer " + os.environ["API_TOKEN"]},
)
with urllib.request.urlopen(request, timeout=30) as response:
print(response.read().decode())
Una mappa di primo livello del workflow secrets viene conservata dal modello di dati, ma l’ambiente attuale non la usa per popolare gli ambienti dei passaggi o risolvere alias. Non serve per nessuno dei due schemi sopra. I modelli dei passaggi possono leggere il contesto del workflow, il payload del trigger, i dati della richiesta e gli output dei passaggi precedenti.
Crea ed esamina un’esecuzione
Crea o applica questo manifest dal generatore di workflow, dall’agente IA o dalla CLI dei workflow. Il runner locale della CLI è utile per semplici verifiche di sviluppo, ma supporta un sottoinsieme dei tipi di passaggio della piattaforma.
adios workflow deploy ./workflows/daily-market-brief.yaml
Inizia con un’esecuzione manuale e input di esempio. Controlla stato, output ed errore di ogni passaggio in Workflow prima di collegare una sorgente di eventi reale o una pianificazione ricorrente. Per le approvazioni, prova sia l’approvazione sia il rifiuto e verifica che il passaggio protetto resti in sospeso fino alla decisione.
Usa timeout_seconds nei passaggi HTTP, script, SQL o agente quando il valore predefinito non è adatto. I passaggi HTTP, script e SQL hanno un valore predefinito di 30 secondi; quelli agente di 30 minuti. Un passaggio di attesa dipende dal suo stato di approvazione, non da questo timeout.