In questo post, esploreremo un’implementazione pratica di ai4call, un potente sistema di gestione delle chiamate basato su AI. Vedremo come creare un server Node.js che gestisce un flusso di chiamate interattivo, includendo funzionalità come prenotazioni e messaggi in segreteria. Questo tutorial è pensato per sviluppatori e tecnici che desiderano integrare ai4call nei loro sistemi esistenti.

Panoramica del Progetto

Il nostro progetto dimostrerà come:

  1. Gestire l’inizio di una chiamata con ai4call
  2. Offrire opzioni all’utente tramite input vocale o DTMF
  3. Inviare un link di prenotazione via WhatsApp
  4. Registrare un messaggio in segreteria
  5. Inviare il messaggio registrato via email

Prerequisiti

  • Node.js installato sul vostro sistema
  • Conoscenza base di JavaScript e Express.js
  • Un account ai4call (potete registrarvi su ai4call.com)

Configurazione del Progetto

Iniziamo creando un nuovo progetto Node.js e installando le dipendenze necessarie:

mkdir ai4call-demo
cd ai4call-demo
npm init -y
npm install express body-parser nodemailer
        

Il Codice

Ecco il codice completo del nostro server. Dopo il codice, spiegheremo ogni sezione in dettaglio.

const express = require('express');
const bodyParser = require('body-parser');
const nodemailer = require('nodemailer');

const app = express();
const port = 3000;

app.use(bodyParser.json());

// Funzione simulata per l'invio di un messaggio WhatsApp
async function sendWhatsAppMessage(phoneNumber, link) {
    console.log(`Invio messaggio WhatsApp al numero ${phoneNumber} con il link: ${link}`);
    // TODO: Implementare la logica reale per l'invio del messaggio WhatsApp
    return true;
}

// Configurazione del trasportatore email
const transporter = nodemailer.createTransport({
    host: "smtp.example.com",
    port: 587,
    secure: false, // Use TLS
    auth: {
        user: "your_email@example.com",
        pass: "your_password"
    }
});

// Endpoint iniziale chiamato da ai4call all'inizio della chiamata
app.post('/first-url', (req, res) => {
    const { callerNumber, recipientNumber } = req.body;
    console.log(`Chiamata ricevuta da ${callerNumber} al numero ${recipientNumber}`);

    const response = {
        text: "Benvenuto. Digita o pronuncia 1 per prenotazione, 2 per lasciare un messaggio in segreteria.",
        action: "ASR_DTMF", // Accetta input vocale o digitale
        key: "scelta_utente",
        next_url: "https://your-server.com/handle-choice",
        min_length: 1,
        max_length: 1,
        accept_timeout: 5000, // 5 secondi di timeout
        max_repeat: 3,
        repeat_delay: 5000 // 5 secondi tra le ripetizioni
    };

    res.json(response);
});

// Gestisce la scelta dell'utente
app.post('/handle-choice', (req, res) => {
    const { scelta_utente, callerNumber, __tries = 0 } = req.body;
    const tries = parseInt(__tries);

    if (scelta_utente === "1") {
        // Opzione prenotazione
        const bookingLink = `https://prenotazioni.example.com/prenota?caller=${callerNumber}`;
        sendWhatsAppMessage(callerNumber, bookingLink);

        const response = {
            text: "Abbiamo inviato un messaggio WhatsApp con il link per la prenotazione. Grazie per averci contattato. Arrivederci!",
            action: "hangup" // Termina la chiamata
        };
        res.json(response);
    } else if (scelta_utente === "2") {
        // Opzione messaggio in segreteria
        const response = {
            text: "Per favore, pronuncia il tuo nominativo.",
            action: "ASR_string",
            key: "nominativo",
            next_url: "https://your-server.com/record-message",
            max_repeat: 2
        };
        res.json(response);
    } else if (tries < 2) {
        // Gestione input non valido (max 3 tentativi totali)
        const response = {
            text: "Scelta non valida. Per favore, digita 1 per prenotazione o 2 per lasciare un messaggio.",
            action: "ASR_DTMF",
            key: "scelta_utente",
            next_url: "https://your-server.com/handle-choice",
            min_length: 1,
            max_length: 1,
            accept_timeout: 5000,
            max_repeat: 1,
            repeat_delay: 5000
        };
        response.__tries = tries + 1;
        res.json(response);
    } else {
        // Termina la chiamata dopo 3 tentativi falliti
        const response = {
            text: "Ci dispiace, ma non abbiamo ricevuto una scelta valida. La chiamata verrà terminata. Arrivederci.",
            action: "hangup"
        };
        res.json(response);
    }
});

// Gestisce la registrazione del messaggio
app.post('/record-message', (req, res) => {
    const { nominativo, __tries = 0 } = req.body;
    const tries = parseInt(__tries);

    if (nominativo) {
        // Nominativo ricevuto, procedi con la registrazione del messaggio
        const response = {
            text: "Grazie. Ora puoi lasciare il tuo messaggio. Al termine, resta in silenzio per qualche secondo.",
            action: "ASR_string",
            key: "messaggio",
            next_url: "https://your-server.com/end-call",
            max_repeat: 1
        };
        res.json(response);
    } else if (tries < 2) {
        // Richiedi nuovamente il nominativo (max 3 tentativi totali)
        const response = {
            text: "Non abbiamo capito il tuo nominativo. Per favore, ripronuncia il tuo nome.",
            action: "ASR_string",
            key: "nominativo",
            next_url: "https://your-server.com/record-message",
            max_repeat: 1
        };
        response.__tries = tries + 1;
        res.json(response);
    } else {
        // Termina la chiamata dopo 3 tentativi falliti
        const response = {
            text: "Ci dispiace, ma non siamo riusciti a capire il tuo nominativo. La chiamata verrà terminata. Arrivederci.",
            action: "hangup"
        };
        res.json(response);
    }
});

// Gestisce la fine della chiamata e l'invio dell'email
app.post('/end-call', (req, res) => {
    const { nominativo, messaggio, callerNumber } = req.body;

    if (messaggio) {
        // Prepara e invia l'email con il messaggio registrato
        const mailOptions = {
            from: 'your_email@example.com',
            to: 'gaspare@pippo.com',
            subject: `Nuovo messaggio in segreteria da ${nominativo}`,
            text: `Chiamante: ${callerNumber}\nNominativo: ${nominativo}\nMessaggio: ${messaggio}`
        };

        transporter.sendMail(mailOptions, (error, info) => {
            if (error) {
                console.log("Errore nell'invio dell'email:", error);
            } else {
                console.log('Email inviata: ' + info.response);
            }
        });

        const response = {
            text: "Grazie per il tuo messaggio. Arrivederci!",
            action: "hangup"
        };
        res.json(response);
    } else {
        // Gestisce il caso in cui non sia stato registrato alcun messaggio
        const response = {
            text: "Non abbiamo ricevuto alcun messaggio. La chiamata verrà terminata. Arrivederci.",
            action: "hangup"
        };
        res.json(response);
    }
});

// Avvia il server
app.listen(port, () => {
    console.log(`Server in ascolto sulla porta ${port}`);
});
        

Spiegazione del Codice

Configurazione Iniziale

const express = require('express');
const bodyParser = require('body-parser');
const nodemailer = require('nodemailer');

const app = express();
const port = 3000;

app.use(bodyParser.json());
        

Qui importiamo le dipendenze necessarie e configuriamo Express per gestire le richieste JSON.

Funzioni di Utilità

async function sendWhatsAppMessage(phoneNumber, link) {
    console.log(`Invio messaggio WhatsApp al numero ${phoneNumber} con il link: ${link}`);
    // TODO: Implementare la logica reale per l'invio del messaggio WhatsApp
    return true;
}

const transporter = nodemailer.createTransport({
    // ... configurazione email
});
        

Queste funzioni gestiscono l’invio di messaggi WhatsApp (simulato) e la configurazione per l’invio di email.

Gestione della Chiamata

Inizio Chiamata

app.post('/first-url', (req, res) => {
    // ... codice dell'endpoint
});
        

Questo endpoint viene chiamato da ai4call all’inizio di ogni chiamata. Fornisce le opzioni iniziali all’utente.

Gestione della Scelta

app.post('/handle-choice', (req, res) => {
    // ... codice dell'endpoint
});
        

Gestisce la scelta dell’utente, inviando un link WhatsApp per le prenotazioni o procedendo con la registrazione del messaggio.

Registrazione del Messaggio

app.post('/record-message', (req, res) => {
    // ... codice dell'endpoint
});
        

Gestisce la registrazione del nominativo e del messaggio dell’utente.

Fine Chiamata

app.post('/end-call', (req, res) => {
    // ... codice dell'endpoint
});
        

Gestisce la fine della chiamata, inviando un’email con il messaggio registrato se presente.

Punti Chiave dell’Implementazione

  1. Gestione degli Errori: Il codice include una logica per gestire input non validi, con un massimo di 3 tentativi per ogni interazione.
  2. Flessibilità: Il sistema accetta sia input vocali che DTMF, adattandosi alle preferenze dell’utente.
  3. Integrazione Multi-canale: Oltre alle chiamate vocali, il sistema può inviare messaggi WhatsApp e email.
  4. Personalizzazione: Ogni risposta può essere facilmente personalizzata modificando il testo e le opzioni.

Conclusione

Questo esempio dimostra quanto sia semplice implementare un sistema di gestione delle chiamate avanzato utilizzando ai4call. Con poche centinaia di righe di codice, abbiamo creato un sistema che può gestire prenotazioni, registrare messaggi e integrarsi con altri canali di comunicazione.

Per implementare questo sistema nel vostro ambiente:

  1. Sostituite “https://your-server.com” con l’URL effettivo del vostro server.
  2. Implementate la logica reale per l’invio di messaggi WhatsApp.
  3. Configurate correttamente il trasportatore email con le vostre credenziali SMTP.

  4. AI4CALL: potrai finalmente e facilmente integrare l’A.I. per le telefonate nei tuoi sistemi di gestione


    In questo link trovi la descrizione del prodotto
    https://www.beevoip.it/ai4call-ai-per-le-chiamate-telefoniche.php