> 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 chat in tempo reale su AIsuru

## Tunneling: un esempio di 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 sia la struttura delle chiamate agli Intenti dinamici.

#### Lo scenario della live chat

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

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

#### 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": "I want to speak to an operator",
  "slotValues": {},
  "currentTag": "string",
  "currentTagAuthenticated": true,
  "contextVars": {},
  "memoriID": "string",
  "sessionID": "string",
  "culture": "en-US"
}
```

#### Avvio del tunneling

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

```json
{
  "emission": "I'm connecting you with an operator. Please wait a moment...",
  "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: li inoltra semplicemente al servizio di chat;
3. Le risposte dell'operatore arrivano tramite il webhook, che le inoltra all'Agente tramite l'emission.

#### Gestione della conversazione

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

```json
{
  "intentName": "LIVE_CHAT",
  "utterance": "I have a problem with my order",
  "sessionID": "string",
  "culture": "en-US"
}
```

Il webhook risponde mantenendo attivo il tunneling:

```json
{
  "emission": "Operator: Of course, please tell me your order number",
  "tunneling": true,
  "conclusive": true
}
```

#### Chiusura della chat

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

```json
{
  "emission": "The chat has been closed. Thank you for using our support service!",
  "tunneling": false,
  "conclusive": true
}
```

L'Agente riprende il normale controllo della conversazione.

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

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