Vai alla navigazione

Procedure strutturate

Una sequenza fissa di passaggi tipizzati che l'agente esegue sempre allo stesso modo

Panoramica

Una procedura strutturata è una procedura che esegue una sequenza fissa di passaggi. Una procedura in formato libero è una guida in linguaggio naturale che l’agente interpreta e adatta alla situazione. Una procedura strutturata è un elenco ordinato di passaggi tipizzati che l’agente esegue in ordine ogni volta che si applica la procedura.

Usa una procedura strutturata quando passaggi specifici devono avvenire allo stesso modo in ogni chiamata: verificare l’identità di chi chiama, inoltrare un ticket a un livello superiore o accettare un pagamento. La crei come un breve elenco di passaggi in linguaggio semplice.

Come ogni procedura, una procedura strutturata ha un trigger che descrive quando si applica. Quando una conversazione corrisponde al trigger, l’agente esegue in ordine i passaggi della procedura, quindi torna al resto della conversazione.

Editor della procedura strutturata

Quando usare una procedura strutturata

Usa una procedura strutturata quando passaggi specifici devono essere eseguiti sempre allo stesso modo, ma vuoi comunque creare rapidamente passaggi in linguaggio semplice. Le procedure strutturate sono più facili da scrivere di un workflow, ma meno espressive. Per scoprire come si confrontano con le procedure in formato libero, i workflow e il prompt di sistema, consulta Quando usare le procedure.

Anatomia di una procedura strutturata

Una procedura strutturata è composta da tre parti: un nome, un trigger e un elenco ordinato di passaggi.

Nome

Una breve etichetta che identifica la procedura nella dashboard. Il nome non viene mai inviato all’LLM, quindi non influisce sul comportamento dell’agente.

Trigger

Una descrizione in linguaggio naturale di quando l’agente deve eseguire questa procedura, ad esempio Quando l’utente chiede il rimborso di un ordine. L’agente confronta l’intento dell’utente con il trigger di ogni procedura ed esegue quella corrispondente, quindi i trigger devono essere concreti e distinti. L’agente vede solo il testo del trigger, mai il nome o l’ID della procedura. Un trigger funziona allo stesso modo di qualsiasi procedura; consulta Scrivere i trigger.

Lascia vuoto il trigger per rendere la procedura una sotto-procedura che viene eseguita solo quando un’altra procedura la chiama.

Passaggi

Il corpo della procedura è un elenco ordinato di passaggi tipizzati. Esistono vari tipi di passaggio, che puoi combinare per descrivere l’attività.

PassaggioFunzione
ChiediChiede informazioni all’utente e attende. Continua a chiedere finché l’utente non risponde. È l’unico passaggio che si mette in pausa per l’utente.
ComunicaFa comunicare all’agente qualcosa con parole proprie, quindi passa al passaggio successivo.
PronunciaFa pronunciare all’agente un messaggio esatto parola per parola, quindi passa al passaggio successivo. Un passaggio Pronuncia può contenere una traduzione configurata distintamente per ogni lingua supportata dall’agente.
StrumentoChiama uno strumento specifico. Puoi indicare all’LLM in linguaggio semplice come chiamare lo strumento o fissare esplicitamente i valori dei parametri quando è richiesto il massimo determinismo. Puoi anche definire i passaggi da eseguire se la chiamata allo strumento non riesce.
SeValuta una o più condizioni in ordine ed esegue i passaggi della prima corrispondenza. Un’opzione Altrimenti viene eseguita quando non c’è alcuna corrispondenza.
Sotto-proceduraEsegue un’altra procedura strutturata. Quando i suoi passaggi sono completati, il controllo torna al passaggio successivo di questa procedura (chiamante).
Strumento di sistemaEsegue un’azione integrata di sistema. Al momento è supportata solo la chiusura della chiamata.
RiprovaRiesegue il gestore degli errori di un passaggio Strumento, inclusa la chiamata allo strumento, fino a tre volte. Disponibile solo nel gestore degli errori di un passaggio Strumento.

Menu dei tipi di passaggio della procedura strutturata

Non tutti i passaggi possono comparire ovunque. All’interno di un ramo Se, puoi usare qualsiasi passaggio tranne un altro Se o Riprova. Nel gestore degli errori di un passaggio Strumento, puoi usare qualsiasi passaggio tranne Se o un altro Strumento.

Riferimento dei passaggi API

Il content di una procedura strutturata è un documento con codifica JSON che contiene un array steps. Ogni passaggio è un oggetto identificato dal relativo type. Il trigger è un campo separato di livello superiore nella procedura, non fa parte di content. I payload di API e SDK usano type: "deterministic" per la procedura stessa.

Chiedi

Un passaggio Chiedi indica all’agente di richiedere informazioni e attendere finché l’utente non fornisce una risposta appropriata.

  • Tipo API: ask
  • instruction: Stringa obbligatoria e non vuota.
{
"type": "ask",
"instruction": "Ask the user for their order ID."
}

Comunica

Un passaggio Comunica indica all’agente di generare un singolo messaggio con parole proprie. Non attende una risposta dell’utente prima di continuare.

  • Tipo API: tell
  • instruction: Stringa obbligatoria e non vuota.
{
"type": "tell",
"instruction": "Explain that the refund normally takes five to ten business days."
}

Pronuncia

Un passaggio Pronuncia riproduce il testo fornito esattamente come è scritto, quindi continua. Fornisci message_translations per assegnare all’agente un messaggio esatto per ogni ulteriore lingua supportata, con chiave corrispondente al codice della lingua.

  • Tipo API: say
  • message: Stringa obbligatoria e non vuota.
  • message_translations: Oggetto facoltativo che associa un codice lingua a { "value": "..." }.
{
"type": "say",
"message": "Your refund has been submitted.",
"message_translations": {
"es": { "value": "Su reembolso ha sido enviado." }
}
}

Se, altrimenti se e altrimenti

Un passaggio Se contiene uno o più rami condizionali ordinati. Viene eseguito il primo ramo corrispondente. L’array fallback facoltativo è il ramo Altrimenti.

  • Tipo API: branch
  • branches: Elenco obbligatorio e non vuoto di rami condizionali.
  • fallback: Elenco facoltativo di passaggi Altrimenti.
  • Ogni ramo richiede un condition e un elenco steps non vuoto.
{
"type": "branch",
"branches": [
{
"condition": {
"type": "llm",
"condition": "The user is on an annual plan."
},
"steps": [
{
"type": "say",
"message": "Your annual plan is eligible for a prorated refund."
}
]
}
],
"fallback": [
{
"type": "tell",
"instruction": "Explain that the account's plan could not be determined."
}
]
}

Il comportamento è simile a if/else-if/else:

  1. Le condizioni vengono valutate in ordine.
  2. Viene eseguito il primo ramo corrispondente.
  3. Se nessuna condizione corrisponde, viene eseguito fallback.
  4. Dopo il completamento di un ramo, la procedura si riunisce alla sequenza principale.

L’esempio precedente usa una condizione testuale, che il modello valuta in linguaggio naturale. Le condizioni possono anche essere espressioni basate su variabili dinamiche:

{
"type": "expression",
"expression": {
"type": "eq_operator",
"left": {
"type": "dynamic_variable",
"name": "plan_tier"
},
"right": {
"type": "string_literal",
"value": "annual"
}
}
}

Una condizione di espressione verifica le variabili dinamiche, che vengono compilate dai risultati degli strumenti o impostate all’avvio della conversazione. Non può leggere la risposta più recente dell’utente. Per creare un ramo in base a ciò che ha detto l’utente, usa una condizione testuale.

Tutti i rami di uno stesso passaggio Se devono usare lo stesso tipo di condizione: llm oppure expression.

Strumento

Un passaggio Strumento chiama uno strumento specifico.

  • Tipo API: tool_call
  • tool_id: ID dello strumento obbligatorio e non vuoto. Lo strumento deve essere associato all’agente.
  • tool_name: Nome dello strumento obbligatorio, corrispondente allo strumento.
  • instruction: Istruzione facoltativa che descrive come chiamare lo strumento.
  • schema_overrides: Valori fissi facoltativi per i parametri dello strumento.
  • on_failure: Gestore degli errori facoltativo.
{
"type": "tool_call",
"tool_id": "tool_abc123",
"tool_name": "lookup_order",
"instruction": "Look up the order using the order ID provided by the user."
}

Valori fissi dei parametri

Usa schema_overrides quando un parametro deve avere sempre un valore specifico. Il modello non vede né sceglie un parametro sostituito. Le chiavi sono path dei parametri nello schema dello strumento; ogni valore indica una sorgente:

sourceCampiComportamento
constantconstant_valueInvia sempre il valore indicato.
dynamic_variabledynamic_variableInvia il valore corrente della variabile dinamica indicata.
llmprompt (facoltativo)Consente al modello di scegliere il valore, con una sostituzione facoltativa del prompt.
omitEsclude il parametro dalla chiamata.
{
"type": "tool_call",
"tool_id": "tool_abc123",
"tool_name": "update_ticket",
"schema_overrides": {
"request_body.status": { "source": "constant", "constant_value": "pending" },
"request_body.ticket_id": { "source": "dynamic_variable", "dynamic_variable": "ticket_id" }
}
}

Gestione degli errori

Senza on_failure, una chiamata allo strumento non riuscita termina la conversazione. Aggiungi invece on_failure per eseguire passaggi di ripristino.

  • fallback: Elenco obbligatorio e non vuoto di passaggi eseguiti quando lo strumento non riesce.
  • branches: Riservato alla gestione condizionale degli errori. Lascialo vuoto.
{
"type": "tool_call",
"tool_id": "tool_abc123",
"tool_name": "lookup_order",
"on_failure": {
"branches": [],
"fallback": [
{
"type": "tell",
"instruction": "Explain that the order could not be retrieved and offer to connect the user with support."
}
]
}
}

Un gestore degli errori può contenere passaggi Chiedi, Comunica, Pronuncia, Sotto-procedura, Strumento di sistema e Riprova. Non può contenere passaggi Strumento o Se. Dopo l’esecuzione del gestore, la procedura continua con il passaggio successivo al passaggio Strumento.

Riprova

Un passaggio Riprova riesegue il gestore degli errori che lo contiene, inclusa la chiamata allo strumento. Ogni tentativo chiama di nuovo lo strumento e, se fallisce di nuovo, riesegue ogni passaggio del gestore. Quando i tentativi sono esauriti, la conversazione termina.

  • Tipo API: retry
  • max_retries: Intero facoltativo da 1 a 3. Il valore predefinito è 1.
  • Il valore conta i tentativi successivi alla chiamata allo strumento originale.
  • Riprova è valido solo all’interno di on_failure.
  • Riprova deve essere il passaggio finale del relativo gestore degli errori perché i passaggi successivi sarebbero irraggiungibili.
{
"type": "retry",
"max_retries": 2
}

Sotto-procedura

Un passaggio Sotto-procedura esegue un’altra procedura strutturata. Quando i passaggi di quella procedura sono completati, l’esecuzione torna al passaggio successivo al passaggio Sotto-procedura.

  • Tipo API: sub_procedure
  • procedure_id: ID della procedura obbligatorio e non vuoto.
  • La destinazione deve esistere sullo stesso agente.
  • La destinazione deve essere una procedura strutturata.
  • Una procedura non può richiamare sé stessa.
{
"type": "sub_procedure",
"procedure_id": "agtprc_6qbpwdq8n01bxhk44bgjy6f10ck3"
}

Strumento di sistema

Un passaggio Strumento di sistema esegue un’azione integrata di sistema.

  • Tipo API: system_tool
  • system_tool_name: Nome dello strumento di sistema obbligatorio.
  • Al momento è supportato solo end_call. In futuro potrebbero essere aggiunti altri strumenti di sistema.
  • Poiché end_call è terminale, deve essere il passaggio finale nella sequenza, nel ramo o nel gestore degli errori che lo contiene.
{
"type": "system_tool",
"system_tool_name": "end_call"
}

Regole di convalida

La pubblicazione dell’agente, oppure il salvataggio della bozza dell’agente, rifiuta una procedura strutturata che viola una di queste regole. L’errore indica il passaggio non valido tramite il relativo path.

  • Non è possibile inserire due passaggi Se consecutivi.
  • I passaggi Se non possono essere annidati.
  • Un passaggio Se con condizioni di espressione non può seguire direttamente un passaggio Chiedi.
  • Tutte le condizioni di uno stesso passaggio Se devono essere dello stesso tipo: llm o expression.
  • Riprova può comparire solo all’interno di on_failure e deve essere l’ultimo passaggio al suo interno.
  • end_call deve essere l’ultimo passaggio dell’elenco in cui compare.
  • Il fallback di un gestore degli errori deve contenere almeno un passaggio.
  • Una Sotto-procedura deve puntare a una procedura strutturata esistente sullo stesso agente e non a sé stessa.
  • tool_id deve essere uno strumento dell’agente, tool_name deve corrispondere e schema_overrides deve corrispondere allo schema dello strumento.
  • L’elenco steps, ogni instruction e ogni message devono essere non vuoti.

Per scoprire come ristrutturare una procedura che incontra una di queste regole, consulta le Best practice.

Esempio API completo

Questo esempio gestisce l’annullamento di un ordine in base allo stato della spedizione. Fissa un parametro dello strumento, gestisce una chiamata allo strumento non riuscita, richiama un’altra procedura strutturata e poi termina la chiamata.

{
"steps": [
{
"type": "ask",
"instruction": "Ask the user for their order ID."
},
{
"type": "branch",
"branches": [
{
"condition": {
"type": "llm",
"condition": "The user says the order has already shipped."
},
"steps": [
{
"type": "tell",
"instruction": "Explain that shipped orders must be returned before they can be refunded."
}
]
},
{
"condition": {
"type": "llm",
"condition": "The user says the order has not shipped."
},
"steps": [
{
"type": "tool_call",
"tool_id": "tool_abc123",
"tool_name": "cancel_order",
"instruction": "Cancel the order using the order ID provided by the user.",
"schema_overrides": {
"request_body.notify_customer": { "source": "constant", "constant_value": true }
},
"on_failure": {
"branches": [],
"fallback": [
{
"type": "tell",
"instruction": "Apologize that the cancellation did not go through and say you will try once more."
},
{
"type": "retry",
"max_retries": 1
}
]
}
}
]
}
],
"fallback": [
{
"type": "ask",
"instruction": "Ask whether the order has already shipped."
}
]
},
{
"type": "sub_procedure",
"procedure_id": "agtprc_6qbpwdq8n01bxhk44bgjy6f10ck3"
},
{
"type": "say",
"message": "Thank you for contacting us. Goodbye.",
"message_translations": {
"es": { "value": "Gracias por contactarnos. Adiós." }
}
},
{
"type": "system_tool",
"system_tool_name": "end_call"
}
]
}

Come viene eseguita una procedura strutturata

La trasformazione dei passaggi di una procedura strutturata nel formato eseguito dall’agente è chiamata compilazione. La piattaforma compila ogni procedura strutturata quando viene salvata la bozza dell’agente o pubblicato l’agente; gli autori non devono compilare nulla.

Quando la richiesta dell’utente corrisponde al trigger di una procedura, la piattaforma accede alla procedura ed esegue i relativi passaggi in ordine. All’interno della procedura strutturata, l’agente si concentra su ogni singolo passaggio. Quando raggiunge la fine, la piattaforma restituisce il controllo al resto della conversazione.

I collegamenti del workflow non possono connettersi a una procedura strutturata né partire da essa. Usa un passaggio Sotto-procedura per concatenare procedure strutturate. La piattaforma gestisce l’accesso da un trigger corrispondente e il completamento, inclusa la restituzione del controllo al nodo del workflow in cui è iniziata la procedura.

Le seguenti regole descrivono il comportamento dei passaggi in fase di runtime.

Ogni passaggio diverso da Chiedi viene eseguito immediatamente e il controllo passa al passaggio successivo nello stesso turno. Un passaggio Comunica o Pronuncia trasmette il proprio messaggio e continua. Non esiste alcun passaggio che metta in pausa la conversazione oltre a Chiedi, né un passaggio che termini il turno corrente. Se ti serve l’input dell’utente, usa un passaggio Chiedi. Se la conversazione deve terminare, usa lo strumento di sistema end_call.

Quando l’ultimo passaggio è completato, la procedura termina e l’agente torna al resto della conversazione con il turno ancora aperto, quindi potrebbe dire altro. Quando una sotto-procedura viene completata, il controllo torna al passaggio successivo della procedura che l’ha chiamata.

Un passaggio Strumento non può creare rami in base a un codice di stato o al body della risposta. Se lo strumento riesce, la procedura continua. Se non riesce e il passaggio non ha un gestore degli errori, la conversazione termina. Se ne ha uno, vengono eseguiti i passaggi del gestore e la procedura continua al passaggio successivo. Un Riprova all’interno del gestore riesegue lo strumento e, se fallisce di nuovo, ogni passaggio nel gestore, finché lo strumento non riesce o i tentativi non sono esauriti. Se sono esauriti, la conversazione termina.

Le condizioni vengono valutate in ordine e viene eseguita la prima corrispondenza. Il ramo Altrimenti viene eseguito quando non c’è alcuna corrispondenza. Se non esiste Altrimenti e non c’è alcuna corrispondenza, la procedura continua con il passaggio successivo al Se. Un caso non gestito non è un errore.

Le decisioni prese all’interno di un ramo Se non vengono ricordate dai passaggi successivi. Se qualcosa appreso in un ramo è necessario in seguito, salvalo esplicitamente con una chiamata allo strumento o una variabile dinamica.

Solo i passaggi Strumento possono chiamare strumenti. Non è necessario dire a un passaggio Chiedi, Comunica o Pronuncia di non chiamare strumenti: non può farlo.

Gestire una procedura strutturata

Apri il tuo agente nella dashboard, quindi seleziona Procedure. Usa + per creare una procedura strutturata. Aggiungi un trigger, seleziona un tipo per ogni passaggio e pubblica le modifiche dell’agente.

La dashboard convalida le procedure strutturate durante la modifica. Se una procedura viola una regola di convalida, il pulsante Pubblica mostra uno stato di errore, la scheda Procedure mostra un badge di errore e l’anteprima non può essere avviata finché la procedura non viene corretta. Seleziona l’indicatore di errore per vedere quale procedura e passaggio sono interessati.

Editor della procedura strutturata con il pulsante Pubblica in stato di errore e un badge
1 errore

Finestra di dialogo dei dettagli di convalida che elenca la procedura non riuscita e il passaggio che richiede un
messaggio

Best practice

Ogni tipo di passaggio applica già il proprio comportamento, quindi raramente devi esplicitarlo. Scrivi l’obiettivo di ogni passaggio e lascia che il tipo di passaggio faccia il resto. Le indicazioni seguenti coprono i casi che è importante gestire correttamente.

Per testare una procedura strutturata, segui Iterare su una procedura.

Scegliere i tipi di passaggio

Un passaggio Ask attende una risposta. Se raggruppi più domande in un’unica istruzione, l’agente tende a saltarne alcune o a unirle. Usa un passaggio Ask per ogni informazione.

Un passaggio Tell trasmette il suo messaggio e prosegue senza attendere. Un Tell formulato come domanda non riceve mai una risposta. Se un passaggio richiede una risposta dall’utente, è un Ask.

Un passaggio Ask avanza quando riceve una risposta appropriata. Se non è evidente dalla domanda cosa costituisca una risposta, specificalo nell’istruzione, ad esempio _Chiedi l’ID dell’ordine; un ID valido è composto da otto cifre _.

Usa un passaggio Tell quando l’agente deve comporre autonomamente il messaggio e un passaggio Say quando la formulazione deve essere letterale o tradotta. Entrambi trasmettono esattamente un messaggio, quindi non è necessario indicare a un passaggio di inviare un singolo messaggio.

I passaggi Ask, Tell e Say non possono chiamare strumenti. Scrivere non chiamare alcuno strumento al loro interno aggiunge rumore all’istruzione senza modificarne il comportamento.

Strutturare la procedura

Due passaggi If non possono essere posizionati uno dopo l’altro. Inserire un Tell o Say non correlato tra di essi per rispettare la regola fa dire all’agente qualcosa che non dovrebbe. Invece, integra la seconda decisione nel primo If come ulteriori rami Else if, oppure spostala in una sotto-procedura.

I passaggi If non possono essere annidati. Quando una decisione dipende da un’altra, inserisci la decisione interna nella sua procedura strutturata e chiamala con un passaggio Sub-procedure dal ramo che ne ha bisogno.

Un passaggio If senza Else passa al passaggio successivo quando nulla corrisponde. Se il caso senza corrispondenza deve comportarsi diversamente, aggiungi un ramo Else.

Le decisioni prese all’interno di un ramo If non vengono ricordate in seguito. Se un passaggio successivo dipende da qualcosa appreso in un ramo, registralo con una chiamata a uno strumento o una variabile dinamica all’interno del ramo.

Le condizioni di espressione verificano le variabili dinamiche. Posiziona un passaggio If che le utilizza subito dopo il passaggio Tool che imposta tali variabili. Per diramare in base a ciò che ha detto l’utente, usa una condizione di testo.

Quando più procedure strutturate condividono la stessa sequenza, ad esempio l’escalation a un operatore, inseriscila in un’unica procedura strutturata con un trigger vuoto e richiamala da ciascuna. Le sequenze copiate divergono nel tempo.

Lavorare con gli strumenti

Un passaggio Tool chiama sempre il suo strumento. Una condizione scritta nell’istruzione, ad esempio _salta questo passaggio se il ticket ha già un tag _, non può impedire la chiamata. Se la chiamata non deve sempre avvenire, inserisci la condizione in un passaggio If prima del passaggio Tool.

Quando un parametro deve sempre assumere un valore specifico, impostalo con un override constant in schema_overrides. Un’istruzione come imposta sempre lo stato su in attesa chiede al modello di rispettarla; un override è applicato e non può essere ignorato.

Senza on_failure, qualsiasi errore dello strumento termina la conversazione. Aggiungi un gestore che comunichi all’utente cosa è successo e riprovi, effettui l’escalation o prosegua.

Un passaggio Tool esegue solo lo strumento; l’agente non può parlare né prendere decisioni durante la sua esecuzione. Per parlare con l’utente o diramare in base a ciò che lo strumento ha restituito, inserisci questa operazione in un passaggio separato prima o dopo il passaggio Tool.

Scrivere le istruzioni

La procedura controlla quale passaggio viene eseguito successivamente e l’agente non è a conoscenza dei passaggi successivi durante l’esecuzione di quello corrente. Lascia che l’ordine dei passaggi gestisca la sequenza.

Le frasi scritte nelle istruzioni dei passaggi, ad esempio questo è l’ultimo messaggio di questo turno, chiedono all’agente di applicare un limite che la piattaforma non supporta. Usa un passaggio Ask per attendere l’utente oppure lo strumento di sistema end_call per concludere la conversazione.

Il tono, la formattazione, i saluti finali e le policy di rifiuto appartengono al prompt di sistema. L’istruzione di un passaggio deve indicare solo ciò che è specifico di quel passaggio.

Comporre procedure

Le indicazioni generali per comporre procedure si applicano anche alle procedure strutturate; consulta Comporre procedure nella pagina delle procedure in formato libero.

Un modello è specifico della combinazione dei tipi: una procedura in formato libero può fare riferimento a una strutturata. Mantieni la gestione aperta in una procedura in formato libero e delega a una procedura strutturata le parti che devono essere eseguite sempre nello stesso modo, come la verifica dell’identità o l’escalation.

Limitazioni

  • I passaggi If non possono essere annidati e due passaggi If non possono essere posizionati uno dopo l’altro.
  • L’unico strumento di sistema supportato è end_call.
  • Le procedure strutturate non possono fare riferimento a documenti della knowledge base.
  • Non è possibile terminare il turno corrente al completamento di una procedura; l’agente mantiene il turno aperto e potrebbe continuare a parlare.
  • Gli edge del workflow non possono connettersi a una procedura strutturata né partire da essa. Usa un passaggio Sub-procedure per concatenare procedure strutturate; l’avvio e il completamento sono gestiti dalla piattaforma.
  • L’avvio di una procedura aggiunge latenza: l’agente effettua una chiamata allo strumento per accedervi e poi procede nel workflow generato.

Supporto dei provider di modelli

Le procedure strutturate forzano chiamate interne agli strumenti quando si accede a una sotto-procedura e quando si completa una procedura. Le principali famiglie di modelli OpenAI, Anthropic, Gemini e Grok supportano la scelta forzata dello strumento. Altri modelli o provider personalizzati potrebbero non garantirla, rendendo meno affidabili le transizioni tra sotto-procedure o il completamento della procedura. Quando usi un altro provider di modelli, verifica il supporto della scelta forzata dello strumento.

Consulta Procedure per i limiti applicabili a tutte le procedure, incluso il limite di dimensione dei contenuti e le differenze tra procedure strutturate e in formato libero.