> For the complete documentation index, see [llms.txt](https://docs.aisuru.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.aisuru.com/avanzate/integrazioni/intenti-dinamici/tunneling-esempio-di-una-live-chat-su-aisuru.md).

# Tunneling: esempio di una live chat su AIsuru

## Tunneling: esempio di una live chat

In questa sezione vedremo come implementare una live chat usando gli intenti dinamici e il tunneling. Questo esempio ci permetterà di esplorare nel dettaglio sia il funzionamento del tunneling che la struttura delle chiamate degli intenti dinamici.

#### Il caso della live chat

Una live chat è un esempio perfetto per illustrare il tunneling poiché richiede:

* Una conversazione continuativa con un servizio esterno;
* Il mantenimento del contesto tra i messaggi;
* La gestione in tempo reale delle risposte.

#### Struttura dell'intento dinamico

Per implementare la live chat, configuriamo l'intento dinamico con:

* Nome: "LIVE\_CHAT";
* Frasi di attivazione: "Voglio parlare con un operatore", "Live chat", ecc.;
* Webhook: URL del servizio che gestisce la live chat.

Quando l'utente attiva l'intento, il webhook riceve una richiesta con questa struttura:

```json
{
  "intentName": "LIVE_CHAT",
  "utterance": "Voglio parlare con un operatore",
  "slotValues": {},
  "currentTag": "string",
  "currentTagAuthenticated": true,
  "contextVars": {},
  "memoriID": "string",
  "sessionID": "string",
  "culture": "it-IT"
}
```

#### Avvio del tunneling

Il webhook risponde attivando il tunneling per prendere il controllo della conversazione:

```json
{
  "emission": "Ti sto mettendo in contatto con un operatore. Attendi un momento...",
  "conclusive": true,
  "tunneling": true
  }
}
```

Da questo momento:

1. Ogni messaggio dell'utente viene inviato direttamente al webhook;
2. L'Agente non elabora più i messaggi ma li inoltra al servizio di chat;
3. Le risposte dell'operatore arrivano attraverso il webhook (che le passa all'Agente con l'emission).

#### Gestione della conversazione

Durante la chat, ogni messaggio dell'utente genera una richiesta al webhook:

```json
{
  "intentName": "LIVE_CHAT",
  "utterance": "Ho un problema con il mio ordine",
  "sessionID": "string",
  "culture": "it-IT"
}
```

Il webhook risponde mantenendo attivo il tunneling:

```json
{
  "emission": "Operatore: Certo, mi dica il numero del suo ordine",
  "tunneling": true,
  "conclusive": true
}
```

#### Chiusura della chat

Quando l'operatore chiude la chat, il webhook invia una risposta che termina il tunneling:

```json
{
  "emission": "La chat è stata chiusa. Grazie per aver utilizzato il nostro servizio di assistenza!",
  "tunneling": false,
  "conclusive": true
}
```

L'Agente riprende il normale controllo della conversazione.

{% hint style="info" %}
Il flag `tunneling` determina chi gestisce la conversazione: se `true`, il webhook ha il controllo; se `false`, l'Agente riprende il controllo.
{% endhint %}

L'esempio della live chat dimostra come il tunneling permetta di creare interazioni complesse mantenendo un'architettura pulita e gestibile. Gli stessi principi si possono applicare a molti altri scenari che richiedono una conversazione continuativa con un sistema esterno.
