Bentornati su AI Cookbook, la rubrica in cui proveremo a utilizzare l’AI Generativa come nostro assistente allo sviluppo di codice e all’automazione di attività quotidiane.
Oggi vi presento un progetto ispirato da un’idea brillante del mio amico Fabio Degli Angeli, un grande manager e formatore al VJAL Institute come me. Fabio, pur non essendo un tecnico, è un entusiasta del mondo AI e ha provato, riuscendoci, a sviluppare questa soluzione da solo. È proprio il suo approccio innovativo e la sua passione per l’AI che hanno dato vita all’idea di questo AI Cookbook.
Seguendo le orme di Fabio, vi mostrerò come creare un assistente AI che trasforma le vostre email in un podcast personalizzato quotidiano.
A che cosa serve
Questo progetto è ideale per chiunque desideri un modo efficiente per rimanere aggiornato sulle proprie email e, magari, sulle molte novità del proprio settore che giacciono inesplorate nelle newsletter a cui siete iscritti e che non leggete mai.
Questo è un esempio del risultato finale che potete ottenere a partire dalla vostra mailbox.
Vi invito caldamente a provare a seguire le istruzioni e crearvi il vostro progetto personalizzato anche se non avete una formazione tecnica. Vedrete che l’AI lo renderà più facile di quello che pensavate.
Iniziamo!
Ingredienti
- ChatGPT con modello gpt-4o (per sviluppare il codice principale)
- Claude 3.5 Sonnet (per debugging)
- API di OpenAI gpt-4o-mini
- Google Script (per far eseguire l’automazione)
- Gmail (Sì, per ora funziona solo su mailbox gmail ma… si può implementare su qualunque casella)
- OpenAI Whisper API (per dare voce al vostro podcast)
Livello di difficoltà
3/5 – Americano (Un caffè corposo che richiede attenzione, ma non vi terrà svegli tutta la notte)
Tempo di preparazione
45-60 minuti (se volete rigenerare il codice da zero)
Costo stimato
Gratuito per l’uso base (con limiti sulle API di OpenAI e Whisper che costeranno pochi centesimi)
Il Problema
Gestire una casella email piena di newsletter, aggiornamenti di progetto e comunicazioni importanti può essere estenuante. Spesso, le informazioni cruciali si perdono nel mare di messaggi, portando a ritardi nelle risposte e opportunità mancate.
La Soluzione
Creeremo un assistente AI che legge le vostre email, ne estrae le informazioni più importanti e le trasforma in un podcast quotidiano. Ecco come:
- Andate su ChatGPT e create un account se non ne avete uno.
- Iniziate una nuova conversazione e usate questo prompt personalizzandolo in base alle vostre esigenze (ad esempio indicando cosa volete riassumere, i tipi di e-mail da guardare, il tono di voce con cui volete si rivolga a voi ecc.):
Agisci da programmatore esperto e smart. Ho bisogno che tu mi generi uno script per Google Script che legga la inbox delle ultime 24 ore dell’utente collegato e faccia un riassunto di ciascuna mail mettendo tutto in un documento Markdown ’riassunti del giorno dd/mm/YYYY’. Fatti i riassunti lo script lancia un prompt simile a questo su quel contenuto "Leggi tutte queste email e fammi un riassunto per un podcast giornaliero. Evidenzia i contenuti che parlano di [AI], le e-Mail in cui mi si chiedeva di rispondere e ciò che ritieni importante. Se la stessa notizia è data da più di una mail citala una sola volta e dimmi le fonti." Fatto questo usa il servizio whisper di OpenAI (Qui trovi la documentazione:<https://platform.openai.com/docs/guides/text-to-speech>) per creare un audio e mandamelo via e-mail sullo stesso indirizzo con oggetto: "I Riassunti del giorno dd/mm/YYYY". Nel testo della mail metti il file MD creato sopra. Voglio usare gpt4o-mini per riassumere le notizie.
- ChatGPT vi fornirà uno script. Copiatelo (Ne trovate una versione funzionante in fondo all’articolo)
- Andate su Google Script e create un nuovo progetto.
- Incollate lo script fornito da ChatGPT nell’editor di Google Script.
- Premete “Esegui”.
Se ottenete un errore, non preoccupatevi. È normale durante il processo di sviluppo, d’altronde li fanno anche gli sviluppatori più esperti. - Dando per scontato che ne abbiate qualcuno: copiate l’errore e tornate a ChatGPT per chiedere aiuto nella correzione.
- Ripetete il processo di esecuzione e correzione finché lo script non funziona correttamente.
Questo processo iterativo è comune nello sviluppo software e vi aiuterà a comprendere meglio il funzionamento dello script e quanto potete fare con l’AI Generativa. Non serve che leggiate e capiate il codice in prima battuta. Chiedete a ChatGPT di farlo funzionare e basta. - Una volta che lo script funziona, Google vi chiederà di configurare le autorizzazioni necessarie. Questo passaggio è cruciale per la sicurezza, quindi leggete attentamente cosa state autorizzando. Google vorrà capire se il vostro script è attendibile e, di conseguenza, autorizzarlo ad accedere alla vostra casella gmail. Ovviamente la questione è un po’ diversa con le caselle aziendali: se non siete voi l’amministratore di sistema dovrete convincere chi si occupa di security a darvi maggiori permessi. Partite con le mailbox personali, tutto sommato avete molto controllo sui contenuti.
- Eseguite lo script (C’è un bel tasto esegui) dopo che avrete messo la vostra chiave OpenAI.
Se vi piace il risultato, per automatizzare il processo, create una funzione di attivazione in Google Script. Nella barra a sinistra troverete “Attivatori”. Selezionate “Crea nuovo Attivatore” in basso e impostate una nuova attivazione che esegua lo script quotidianamente all’ora che preferite.
Sicurezza e Privacy
Come già accennato, questo script avrà accesso alle vostre email, quindi è fondamentale trattarlo con la massima cautela. Ecco alcuni punti chiave da considerare:
- Usate solo API ufficiali (di OpenAI in questo caso) e non condividete mai le vostre credenziali.
- Controllate regolarmente le autorizzazioni concesse allo script in Google.
- Considerate di usare un account email che non contenga dati troppo sensibili per i test iniziali.
Ricordate: “Usate l’AI Responsabilmente!”! La sicurezza dei vostri dati dovrebbe sempre essere la priorità numero uno.
Risultati e Benefici
Implementando questo strumento, potrete:
- Iniziare ogni giornata con un podcast personalizzato che riassume le email importanti.
- Ricevere promemoria per le risposte in sospeso, migliorando la vostra reattività.
- Rimanere aggiornati sulle novità del settore AI senza dover setacciare manualmente le newsletter.
- Risparmiare tempo prezioso, riducendo lo stress legato alla gestione delle email.
- Avere una panoramica chiara e concisa delle vostre comunicazioni, permettendovi di concentrarvi sulle attività più importanti.
Personalizzazione
Lo script può essere adattato alle vostre esigenze specifiche:
- Modificate il prompt per includere o escludere determinati temi.
- Cambiate la frequenza del riassunto (ad esempio, ogni 12 ore invece che quotidianamente).
- Aggiungete filtri per dare priorità a certi mittenti o argomenti.
- Sperimentate con diversi modelli di linguaggio per ottimizzare i riassunti.
- Personalizzate il prompt per includere temi specifici di vostro interesse. Per esempio, potreste aggiungere “e includi anche notizie sul mercato azionario” se siete interessati alla finanza.
- Se il riassunto è troppo lungo o troppo breve, modificate il prompt specificando la lunghezza desiderata. Ad esempio: “Crea un riassunto di circa 300 parole”.
Risoluzione dei problemi comuni
- Se il podcast non viene generato, controllate le autorizzazioni di Google Script e assicuratevi che l’API key di OpenAI sia valida. Date in pasto a ChatGPT o a Claude l’immagine con l’errore e chiedete di spiegarvi come risolverlo.
- Per migliorare la qualità dell’audio, provate a modificare i parametri dell’API Whisper, come il modello vocale o a chiedere all’LLM di introdurre un post process che aumenti o riduca la velocità di sintesi (magari usando la libreria pydub).
- Se il riassunto è troppo generico, affinate il prompt con istruzioni più specifiche su cosa includere o escludere.
Conclusione
Questo progetto dell’AI Cookbook dimostra come, partendo dall’idea innovativa di Fabio, sia possibile trasformare la gestione delle email in un processo efficiente e personalizzato. Non serve essere esperti di programmazione: con curiosità e la guida dell’AI, potete creare soluzioni innovative per semplificare la vostra vita digitale.
Link Utili
Codice Finale
Ecco il codice finale dello script che ha generato a me, già pronto per essere implementato nel vostro progetto Google Script qualora non vogliate sperimentare direttamente.
function generaRiassuntiDelGiorno() {
// Imposta la tua API key di OpenAI (inserisci la tua API key qui in modo sicuro)
var OPENAI_API_KEY = 'LA_TUA_API_KEY';
console.log('Inizio l\\'esecuzione dello script.');
// Calcola la data di 24 ore fa
var now = new Date();
var yesterday = new Date(now.getTime() - 24 * 60 * 60 * 1000);
var dateString = Utilities.formatDate(yesterday, Session.getScriptTimeZone(), 'yyyy/MM/dd');
console.log('Sto cercando le email ricevute dopo: ' + dateString);
// Cerca le email ricevute nelle ultime 24 ore
var threads = GmailApp.search('after:' + dateString);
console.log('Trovati ' + threads.length + ' thread di email.');
// Inizializza il contenuto del documento Markdown
var markdownContent = '# Riassunti del giorno ' + Utilities.formatDate(now, Session.getScriptTimeZone(), 'dd/MM/yyyy') + '\\n\\n';
// Array per raccogliere i riassunti
var riassunti = [];
// Itera su ogni thread (conversazione)
for (var i = 0; i < threads.length; i++) {
var messages = threads[i].getMessages();
console.log('Elaborazione del thread ' + (i + 1) + ' di ' + threads.length + ' con ' + messages.length + ' messaggi.');
// Itera su ogni messaggio nel thread
for (var j = 0; j < messages.length; j++) {
var message = messages[j];
var subject = message.getSubject();
var body = message.getPlainBody();
console.log('Riassumendo l\\'email con oggetto: ' + subject);
// Crea un prompt per riassumere l'email
var prompt = 'Riassumi la seguente email:\\n\\n' + 'Oggetto: ' + subject + '\\n\\n' + body;
// Chiama l'API di OpenAI per ottenere il riassunto
var riassunto = chiamaOpenAIAPI(prompt, OPENAI_API_KEY);
// Aggiungi il riassunto al contenuto Markdown
markdownContent += '## ' + subject + '\\n\\n' + riassunto + '\\n\\n';
// Aggiungi il riassunto all'array per l'uso successivo
riassunti.push({subject: subject, summary: riassunto});
}
}
// Crea un unico testo con tutti i riassunti per il prompt successivo
var tuttiIRiassunti = riassunti.map(function(item) {
return 'Oggetto: ' + item.subject + '\\n' + item.summary;
}).join('\\n\\n');
console.log('Generando il riassunto per il podcast giornaliero...');
// Prompt per il riassunto del podcast giornaliero
var promptPodcast = 'Leggi tutte queste email e fammi un riassunto per un podcast giornaliero. Evidenzia i contenuti che parlano di AI, le e-Mail in cui mi si chiedeva di rispondere e ciò che ritieni importante. Se ci sono riunioni cita chi le ha convocate e chi parteciperà. Se la stessa notizia è data da più di una mail citala una sola volta e dimmi le fonti. Usa un tono di voce amichevole e inizia il podcast dicendo -hey Max! Questo è il riassunto della tua mailbox del giorno gg mmmm aaaa (Giorno, mese, anno - oggi è il ' + dateString + ' ECCO I RIASSUNTI:' + tuttiIRiassunti;
// Ottieni il riassunto per il podcast
var riassuntoPodcast = chiamaOpenAIAPI(promptPodcast, OPENAI_API_KEY);
console.log('Riassunto per il podcast generato.');
// Usa il servizio di text-to-speech di OpenAI per creare l'audio
var audioBlob = chiamaTextToSpeech(riassuntoPodcast, OPENAI_API_KEY);
console.log('Audio per il podcast generato.');
// Invia l'email con l'audio e il file Markdown
inviaEmailConRiassunto(audioBlob, markdownContent);
console.log('Email inviata con successo.');
console.log('Script completato.');
}
function chiamaOpenAIAPI(prompt, apiKey) {
var url = '<https://api.openai.com/v1/chat/completions>';
var data = {
'model': 'gpt-4o-mini', // Modificato come richiesto
'messages': [
{'role': 'user', 'content': prompt}
]
};
var options = {
'method': 'post',
'contentType': 'application/json',
'headers': {
'Authorization': 'Bearer ' + apiKey
},
'payload': JSON.stringify(data)
};
console.log('Invio la richiesta al modello GPT per il seguente prompt:\\n' + prompt);
var response = UrlFetchApp.fetch(url, options);
console.log('Risposta ricevuta dal modello GPT.');
var responseData = JSON.parse(response.getContentText());
var result = responseData.choices[0].message.content.trim();
return result;
}
function chiamaTextToSpeech(text, apiKey) {
console.log('Generazione dell\\'audio utilizzando il servizio Text-to-Speech di OpenAI...');
var url = '<https://api.openai.com/v1/audio/speech>';
var data = {
'model': 'tts-1',
'input': text,
'voice': 'alloy',
'response_format': 'mp3' // Changed from 'base64' to 'mp3'
// Removed 'language' parameter as it's not supported
};
var options = {
'method': 'post',
'contentType': 'application/json',
'headers': {
'Authorization': 'Bearer ' + apiKey
},
'payload': JSON.stringify(data),
'muteHttpExceptions': true
};
var response = UrlFetchApp.fetch(url, options);
console.log('Risposta ricevuta dal servizio di text-to-speech.');
// Check if the response is successful
if (response.getResponseCode() === 200) {
// Get the audio content directly (it's already in MP3 format)
var audioContent = response.getContent();
// Create the blob of the audio
var audioBlob = Utilities.newBlob(audioContent, 'audio/mp3', 'riassunto.mp3');
console.log('Audio generato.');
return audioBlob;
} else {
// If there's an error, log it and throw an exception
var errorText = response.getContentText();
console.error('Errore dal servizio di text-to-speech:', errorText);
throw new Error(errorText);
}
}
function inviaEmailConRiassunto(audioBlob, markdownContent) {
var emailAddress = Session.getActiveUser().getEmail();
var subject = 'I Riassunti del giorno ' + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'dd/MM/yyyy');
console.log('Sto inviando l\\'email al tuo indirizzo: ' + emailAddress);
// Invia l'email con l'audio in allegato e il contenuto nel corpo
MailApp.sendEmail({
to: emailAddress,
subject: subject,
body: markdownContent,
attachments: [audioBlob]
});
console.log('Email inviata.');
}
Dietro le quinte: Il ruolo di Claude nella creazione di questo post
Per questo articolo dell’AI Cookbook, ho deciso di sperimentare con Claude, l’assistente AI di Anthropic. Ho fornito a Claude alcune linee guida che avevo precedentemente sviluppato, insieme al prompt originale di ChatGPT, chiedendogli di proporre un nuovo prompt.
Poi gli ho fornito un po’ di appunti sul processo di creazione e una prima stesura del documento fatta con ChatGPT (giusto per mescolare le carte). Ho cambiato AI perché volevo mostrarvi come Claude affronta diversamente il compito e come interpreta le istruzioni in modo unico e diverso rispetto a ChatGPT.
Il messaggio è: ogni tanto cambiate strumento e valutate qualcosa di diverso: scoprirete che ci saranno dettagli che funzioneranno meglio e magari grosse mancanze rispetto ad un’altra AI. Sperimentare con vari assistenti AI può arricchire il processo creativo e portare a risultati sorprendenti.
Cosa non è andato?
Claude, pur avendo una finestra di contesto più lunga di ChatGPT (200.000 token) non rigenera tutto il contenuto molto volentieri. Quando la conversazione si fa lunga inizia a generare solo alcune parti del contenuto richiedendo di lavorare, come ho dovuto fare, in un editor esterno e con un gran copia & incolla. Ci avrei messo sicuramente meno utilizzando ChatGPT con i Canvas.
Quindi…
Cosa ne pensate di questa soluzione? L’avete provata o avete idee per migliorarla?
Condividete le vostre esperienze e idee nei commenti!