Salta ai contenuti

Crea un modello di pipeline

I modelli di pipeline si creano nelle impostazioni dello spazio di lavoro. La voce Pipelines nella barra laterale dello spazio di lavoro è la coda di esecuzione, non l’elenco dei modelli — non offre alcuna azione «crea modello».

Per il significato di ogni tipo di passaggio, chiave del corpo e campo di configurazione, vedi il riferimento dei passaggi delle pipeline.

  1. Vai in Impostazioni → Spazio di lavoro → Modelli di pipeline (/workspaces/<workspace-id>/settings/pipelines).
  2. Premi Nuovo modello.

Non c’è alcuna finestra di dialogo per l’id. L’editor si apre subito su uno scheletro preimpostato chiamato Nuova pipeline, con un id assegnato automaticamente (pipeline_1, poi pipeline_2, …). Fai clic sul titolo nell’intestazione per rinominarlo.

Il canvas non è vuoto: un nodo di ingresso Trigger, un nodo agente con prompt etichettato Step e una sentinella terminale che conclude l’esecuzione. La sentinella non viene disegnata. L’editor ricollega quel terminale nascosto a ogni sink raggiungibile, quindi il lavoro che colleghi dopo Step viene comunque eseguito.

La barra laterale Libreria nodi resta sempre a sinistra dell’editor. Filtrala con il campo Cerca nodi e trascina una voce sul canvas — il nodo atterra dove lo lasci, senza alcuna connessione in entrata.

Nodo della palette Tipo di passaggio Cosa fa
Bash script listen Esegue uno script shell con sostituzione di {{state}}; nessun agente inviato
Open conversation listen Apre l’unico spazio visibile dell’esecuzione e il suo checkout; i nodi agente si uniscono a questa stanza
Clone PR branch listen Individua il branch head della PR tramite gh pr view e lo clona nella directory dell’esecuzione
Post PR comment listen Pubblica i rilievi consolidati sulla PR come commento di revisione GitHub
Reviewer (prompt) listen Invia un agente revisore specializzato; sospende finché l’agente non invia il suo risultato
Consolidate (join) join Attende più rami a monte, poi chiede a un agente di consolidarne gli output
Custom prompt listen Nodo generico guidato da prompt, instradato attraverso il corpo promptAgent
Post to space listen Invia un messaggio a uno spazio di messaggistica
Condition / switch (router) router Dirama il flusso in base a un valore di stato
If file exists (router) router Instrada "true" quando un percorso esiste sotto il clone, altrimenti "false"
Any file exists (OR router) router Instrada "true" quando esiste almeno uno dei percorsi elencati
All conditions (AND router) router Instrada "true" solo quando esistono tutti i percorsi elencati
Team dispatch listen Invia un intero team e sospende finché non termina
Approval gate listen Mette in pausa in attesa di una decisione di approvazione
For each (map) forEach Genera un prompt per ogni elemento, poi invia l’agente una sola volta con quei prompt uniti
Call sub-pipeline listen Esegue un altro modello come passaggio annidato
Clean up worktrees listen Rimuove i worktree isolati obsoleti; deterministico, nessun agente inviato

La libreria li raggruppa in Flusso e logica, Revisione PR, Agenti, Messaggistica e Codice. Non esiste alcun gruppo Demo.

Ogni nodo di lavoro ha una porta di output circolare sul bordo destro. Trascina da quella porta su un altro nodo per collegarli. I trigger di avvio funzionano allo stesso modo: ognuno ha la propria porta, quindi un cavo da Pianificazione non parte anche da Esecuzione manuale. Premi Aggiungi passaggio (+) subito dopo un nodo per inserire un tipo al suo seguito. Passa il puntatore sul punto medio di un arco esistente e premi × per disconnettere.

Le connessioni si modificano anche dal nodo che le riceve:

  1. Seleziona il nodo a valle. Il suo pannello di configurazione si apre a destra.
  2. Scorri fino a Triggers from e tocca il chip di ogni nodo a monte che questo deve ascoltare. Toccando un chip selezionato la connessione viene rimossa.
  3. Se un nodo a monte è un router, sotto i chip compare un blocco Chiavi di route con un campo Chiave di route da <nodo> per ogni arco del router. Inserisci la chiave su cui quell’arco scatta — true o false per i router «file esiste», oppure il nome del caso per un selettore.

Ogni nodo di trigger è un punto di ingresso. Un nodo può ascoltare più nodi a monte (fan-in) e alimentare più nodi a valle (fan-out), e il grafo deve restare aciclico — nulla nell’editor ti impedisce di cablare un ciclo, quindi controlla il tuo lavoro.

La sentinella terminale è filtrata dal canvas, quindi non può essere selezionata. L’editor la ricollega a ogni sink raggiungibile ogni volta che il grafo cambia, quindi il lavoro che colleghi dopo lo Step preimpostato viene comunque eseguito. Un grafo vuoto (trigger senza successori di lavoro) elenca il trigger stesso, così un’esecuzione si completa immediatamente.

Seleziona un nodo per aprirne il pannello di configurazione. I campi visualizzati dipendono dal corpo del nodo.

Ogni nodo ha Etichetta, Chiavi di input (chiavi di stato separate da virgole, lette al momento dell’esecuzione) e, sotto Avanzate, Riduttore, Timeout (ms), Tentativi di riprova, Continua se questo passaggio fallisce e Schema di output. I nodi listen e join possono anche cambiare il loro Tipo tra i due.

Aggiunge un selettore repository da clonare (quali repository dello spazio di lavoro estrarre; vuoto significa nessuno), un Nome dello spazio e una casella Apri una conversazione al suo interno. Quando questa casella è attiva, un campo Nome della conversazione dà il nome al flusso con cui si apre la stanza. I nodi agente si uniscono a questa stanza — non ne aprono una propria.

Aggiunge Agente (quale agente inviare), Template del prompt (usa {{key}} per fare riferimento a input o output a monte) e Chiave di output.

Il Timeout (ms) è in millisecondi, non in secondi — 900000 corrisponde a 15 minuti. Inserendo 900 il passaggio riceve 0,9 secondi.

La modalità di conversazione con cui viene eseguito un nodo agente con prompt non ha un campo nell’editor sul nodo agente. Viaggia su extras['mode'] (chat, plan o review) sul nodo Open conversation che ha creato la stanza (predefinita review). Impostarla su un passaggio agente viene ignorato. La chiave è confrontata esattamente: qualsiasi altra grafia viene ignorata in silenzio.

Aggiunge Script bash. Non ci sono campi per la directory di lavoro o l’ambiente, perché nessuno dei due è configurabile:

  • Ogni passaggio bash di un’esecuzione condivide la cwd <cc_root>/pipelines/<runId>/.
  • GITHUB_TOKEN viene iniettato dall’archivio delle credenziali, quindi gh e git clone https://x-access-token:$GITHUB_TOKEN@… funzionano senza configurazione.
  • Lo script viene avviato come eseguibile letterale bash, quindi bash deve trovarsi nel PATH dell’host del server. È una considerazione legata a Windows.

Un router valuta una condizione e restituisce una chiave di route; il motore attiva solo l’arco a valle la cui chiave di route corrisponde e contrassegna gli altri rami come saltati.

Selezionando un router, il campo Chiave di output viene sostituito dall’editor della condizione. Scegli una delle sue quattro modalità:

  • File presenti — almeno uno — instrada "true" quando esiste almeno uno dei percorsi elencati.
  • File presenti — tutti — instrada "true" solo quando esistono tutti i percorsi elencati.
  • Confronto — confronta un valore di stato con un valore letterale.
  • Selettore — instrada in base al valore di una chiave di stato, con un caso predefinito.

Poi imposta le chiavi di route corrispondenti sugli archi in uscita (vedi Collegare i nodi tra loro).

I gruppi booleani and / or / not sono supportati dal corpo ma non si possono creare da questo modulo — richiedono un albero di predicati scritto a mano sotto extras.predicate. Il vocabolario completo di predicati e operatori è nel riferimento dei passaggi delle pipeline.

Nessuna configurazione propria: attende tutti i suoi passaggi a monte.

Il gate invia l’agente approvatore in una conversazione nascosta con il prompt del gate e sospende. L’approvatore ti chiede la decisione nella conversazione e la invia con submit_output come { "decision": "approved" | "rejected", "reason": "..." }. La decisione finisce sotto la chiave di output (predefinita approval_decision), quindi un router selettore a valle può diramare su di essa.

Imposta Agente sull’approvatore e Template del prompt sulla domanda del gate. Il gate si risolve tramite submit_output come { "decision": "approved" | "rejected", "reason": "..." }. I nodi Reviewer (prompt) inviano nello stesso modo.

Aggiunge ID team e Modalità di invio. Il selettore offre esattamente due modalità:

  • allParallel — un’attività per membro, sospende finché tutti non completano.
  • manager — invia il responsabile, che delega.

Qualsiasi altro valore memorizzato si comporta come allParallel. Imposta Riduttore su append per raccogliere il risultato di ogni membro in un elenco sotto la chiave di output.

For each esegue una mappatura sulla chiave di stato items per impostazione predefinita (extras.iterableKey / extras.itemKey sul nodo). Genera il suo prompt una volta per elemento ({{item}} per impostazione predefinita) e invia l’agente una sola volta con quei prompt concatenati. Una raccolta vuota si completa immediatamente con un elenco vuoto. Non è un invio parallelo per ogni elemento.

Call sub-pipeline sospende finché l’esecuzione figlia non raggiunge uno stato terminale, poi unisce lo stato finale del figlio sotto la chiave di output (predefinita subflow_result). Puntalo a un figlio con extras.templateId. Un modello non può chiamare se stesso; un figlio non riuscito o annullato fa fallire il passaggio padre, che a quel punto alimenta la politica di nuovi tentativi e di continuazione in caso di errore di quel passaggio.

Dichiarare gli input e consentire le esecuzioni manuali

Sezione intitolata “Dichiarare gli input e consentire le esecuzioni manuali”

Entrambi si trovano dietro Esecuzione manuale nell’intestazione dell’editor.

  1. Premi Esecuzione manuale.
  2. Attiva Consenti esecuzione manuale. Questo interruttore viene salvato immediatamente — crea (o elimina) la riga di trigger manual che fa comparire il modello nella pagina di esecuzione.
  3. Imposta Esecuzioni parallele max se vuoi un limite (lascia vuoto per illimitato). Gli avvii in eccesso attendono nello stato queued finché non si libera uno slot.
  4. Premi Aggiungi input per ogni campo del modulo che un’esecuzione manuale deve raccogliere:
Campo Descrizione
Chiave Chiave di stato sotto cui viene memorizzato il valore; fai riferimento a essa come {{key}}
Etichetta Etichetta visualizzata (predefinita: la chiave)
Tipo Testo, Testo multiriga, Numero, Interruttore, Selezione, Repository
Opzioni Scelte separate da virgole, solo per Selezione
Valore predefinito Valore precompilato
Segnaposto Testo suggerimento dentro il campo vuoto
Testo di aiuto Testo di aiuto sotto il campo
Obbligatorio Se il modulo di esecuzione blocca un valore vuoto

Un input Repository mostra un selettore sui repository dello spazio di lavoro e popola repo_id, repo_local_path, repo_full_name e — quando il repository ha un remote GitHub — repo_owner e repo_name nel payload dell’esecuzione.

  1. Premi Salva nella finestra di dialogo. Le modifiche agli input vengono inglobate nella bozza; diventano persistenti quando salvi il modello.
  1. Premi Salva nell’intestazione dell’editor. L’intestazione mostra «Modifiche non salvate» finché non lo fai.
  2. Torna in Impostazioni → Spazio di lavoro → Modelli di pipeline e verifica che l’interruttore della riga del modello sia attivo. Il motore rifiuta di avviare un modello disattivato e un modello disattivato non compare mai nella pagina di esecuzione.
  3. Per avviarlo automaticamente, trascina un trigger dalla libreria nodi sul canvas — vedi Configura i trigger delle pipeline.