Comment créer son agent IA pour automatiser sa veille avec n8n
Des outils plus ou moins pertinents existent pour automatiser sa veille. Créer son agent IA permet de surveiller une multitude de sources. L'agent IA peut aussi distinguer les informations selon le prompt utilisé, apprendre selon les critères de sélection et proposer une réponse personnalisée.
Afin de créer cet agent IA, nous utilisons la plateforme d'automatisation n8n. Notons que celle-ci propose un essai gratuit de 14 jours. Nous allons créer deux workflows : un pour collecter et stocker les données et un autre pour envoyer le résumé. Nous allons connecter une IA avec des flux RSS et donner des instructions. Objectif, recevoir un résumé personnalisé par mail.
Workflow 1 : collecter et stocker les données
Nous créons notre premier nœud dans le Workflow 1 dans n8n. Un nœud constitue une brique de base avec une action à réaliser dans un workflow. Nous cliquons sur le "+" dans l'interface graphique et choisissons "Schedule Trigger". Celui-ci permet de déclencher l'action du workflow selon une planification temporelle. En cliquant sur le signe "+", à sa droite, nous le connectons au nœud "RSS Read", qui permet de lire les flux RSS. Nous en mentionnons un dans la section URL, en l'occurrence : https://www.journaldunet.com/intelligence-artificielle/rss/.
Pour faciliter la construction de ce workflow, nous ne mettons qu'un seul flux RSS. Il est possible d'en créer d'autres en mettant en place des nœuds "RSS Read" pour chacun d'entre eux, reliés à un nœud "Merge". Ce dernier regroupe plusieurs flux d'entrée en une seule sortie unique. Il doit être relié au nœud suivant.
Nous allons ensuite créer un nœud consacré à l'IA. Il permet de lire chaque article trouvé par le collecteur et décide s'il est pertinent pour nous. Pour cela, nous sélectionnons "Gemini" et "Message a model". Ce dernier nœud indique à n8n que nous allons fournir un prompt et que nous attendons qu'il génère un texte en retour. Afin de s'identifier, nous créons une clef API en allant sur le site de Google AI Studio et en cliquant en bas à gauche sur "Get API Key". S'il n'est pas possible d'enregistrer un nouveau projet, nous en générons un sur Google Cloud Console. A côté du logo "Google Cloud", nous allons sur "Sélectionnez un projet". Nous nous rendons sur "Nouveau Projet" en haut à droite, donnons un nom à notre projet et cliquons sur "Créer". Nous choisissons le modèle Gemini 1.5 Flash, bon compromis entre coût et capacités sur ce genre de recherches.
En adaptant la méthode COF pour Contexte, Objectif et Format, nous mentionnons ce prompt :
Tu es un analyste expert spécialisé dans l'intelligence artificielle et l'économie. Analyse l'article suivant s'il a été publié il y a moins de deux jours et réponds dans ce cas en suivant strictement ces instructions : Résumé : fais un résumé concis de l'article en 1 phrase maximum. Pertinence : évalue sur une échelle de 1 à 5 à quel point cet article est pertinent sur le sujet de l'intelligence artificielle et de l'économie. Action : Si la pertinence est de 4 ou 5, écris "ACTION REQUISE". Sinon, écris "NON_PERTINENT". Voici les informations de l'article : Titre : {{ $json.title }} Extrait : {{ $json.contentSnippet }} Lien : {{ $json.link }}
Ce prompt peut bien sûr être modifié selon ce que vous souhaitez recevoir. Nous décochons aussi l'option "Simplify output". Nous connectons ce nœud avec un nœud "Merge" en cliquant sur "+" à côté de "Message in a model". Celui-ci permet de rassembler plusieurs flux d'entrée, en une seule sortie. Le réglage est : "Mode" : "Combine" ; "Combine by" : "Position"
Nous associons le nœud créé avec un nœud "If". Celui-ci doit envoyer les informations au nœud suivant si les conditions sont respectées. Pour cela, nous mentionnons dans "Conditions" : : {{ $json.choices[0].message.content }} "Does not contain" et "NON_PERTINENT". Cela signifie que le contenu reçu ne doit pas contenir la mention "NON_PERTINENT".
Nous relions la partie "True" de ce nœud à un nœud "Append row in sheet". Cela permet d'ajouter une nouvelle ligne à la fin d'une feuille de calcul existante.
Nous créons une feuille dans Google Sheet. Elle se nomme "Feuille de calcul sans titre". C'est la "Feuille1", son nom est inscrit en dessous du document. Dans le nœud Google Sheet, nous nommons le document "By ID", en prenant la section de l'URL de la feuille de données créée située dans l'URL entre "/d/" et "/edit". La feuille est nommée "By name", avec le nom de la feuille écrit en bas du Google Sheet. Il s'agit de "Feuille 1" dans notre cas.
La feuille doit se remplir avec les articles désirés lorsque le "Trigger" est déclenché.
Workflow 2 : envoi du résumé
Le deuxième workflow permet de récupérer les informations contenues dans la feuille de style créée et d'envoyer un résumé quotidien par email.
Nous commençons ce flux de travail par un nœud "Schedule trigger". Nous lui associons le "Get row(s) in Sheet". Son rôle est de lire et de récupérer des données qui existent déjà dans une feuille de calcul pour les utiliser dans le workflow n8n. Nous y assemblons la feuille de style précédemment créée. L'ID est le même que celui créé pour le workflow 1.
Un nœud "Code" est ensuite produit. Son rôle, transformer une simple liste de données en un rapport de synthèse utile, formaté et prêt à être envoyé. Il effectue toutes les opérations complexes que les nœuds standards de n8n ne peuvent pas faire facilement. Vous pouvez vous aider de l'IA pour générer ce code. Cela donne dans notre cas :
let htmlContent = "<h1>Résumé de votre veille sur l'IA - Top 10 des articles les plus pertinents</h1>"; let articleCount = 0; if (items.length === 0 || !items[0].json || typeof items[0].json.title === 'undefined') { return []; } // === ÉTAPE 1 : EXTRACTION ET TRI PAR PERTINENCE === let articlesWithScore = []; for (const item of items) { const title = item.json.title; const link = item.json.link; let analysis = item.json.content || 'Analyse non disponible'; // Suppression des images (optionnel) if (typeof analysis === 'string') { analysis = analysis.replace(/<img[^>]*>/g, ''); analysis = analysis.replace(/!\[.*?\]\(.*?\)/g, ''); } // Extraction du score de pertinence let pertinenceScore = 5; const scoreMatch = analysis.match(/Pertinence\s*:\s*(\d+)/i); if (scoreMatch) { pertinenceScore = parseInt(scoreMatch[1]); } // Ajout à la liste avec le score articlesWithScore.push({ title: title, link: link, analysis: analysis, score: pertinenceScore }); } // === ÉTAPE 2 : TRI PAR SCORE DÉCROISSANT === articlesWithScore.sort((a, b) => b.score - a.score); // === ÉTAPE 3 : LIMITATION À 10 ARTICLES === const top10Articles = articlesWithScore.slice(0, 10); // === ÉTAPE 4 : GÉNÉRATION DE L'EMAIL === for (const article of top10Articles) { articleCount++; htmlContent += ` <div style="border: 1px solid #e0e0e0; padding: 16px; margin-bottom: 24px; border-radius: 8px; font-family: sans-serif;"> <h3 style="margin-top: 0;"> ${article.title} <span style="background-color: #28a745; color: white; padding: 2px 8px; border-radius: 12px; font-size: 12px; margin-left: 10px;"> Score: ${article.score} </span> </h3> <hr style="border: none; border-top: 1px solid #eee;"> <h4 style="color: #444;">Analyse par Gemini :</h4> <pre style="white-space: pre-wrap; background-color: #f7f7f7; padding: 12px; border-radius: 4px; font-family: monospace;">${article.analysis}</pre> <p style="text-align: right;"> <a href="${article.link}" style="background-color: #007bff; color: white; padding: 10px 15px; text-decoration: none; border-radius: 5px;"> <strong>Lire l'article complet</strong> </a> </p> </div> `; } // Ajout d'un résumé en fin d'email htmlContent += ` <div style="background-color: #f8f9fa; padding: 15px; border-radius: 8px; margin-top: 20px; text-align: center;"> <p><strong>???? Résumé :</strong> ${articleCount} articles sélectionnés parmi ${articlesWithScore.length} articles analysés</p> <p style="font-size: 12px; color: #666;">Articles triés par score de pertinence décroissant</p> </div> `; return [{ json: { emailBody: htmlContent, articleCount: articleCount, totalArticles: articlesWithScore.length } }];
A droite de ce nœud, nous incorporons un nœud Gmail nommé "Send a message". Son travail : prendre l'email HTML que le nœud "Code" a préparé et l'envoyer. Nous associons notre compte Gmail. Nous nous mettons en destinataire. Nous intégrons une variable dans l'objet du mail et le message envoyé.

Le dernier nœud créé est "Clear Sheet". Sa mission : supprimer toutes les lignes de feuille de calcul Google Sheets une fois que l'email de résumé a été envoyé avec succès. Cela évite de relire les articles déjà envoyés dans la feuille de style. Nous associons l'identifiant "Google Sheet account" auparavant créé pour le nœud "Get row(s) in sheet."
Ça y est, on peut tester les workflows, en cliquant sur le bouton orange "Execute workflows", en bas de l'interface graphique. Si les workflows fonctionnent, ceux-ci devraient apparaître avec un encadré vert. Nous recevons alors ce message via notre adresse mail.
Nous voyons dans cet extrait l'objet du mail ainsi que les articles envoyés, avec le score de pertinence, le titre, le résumé et le lien vers l'article en question. Ce workflow est perfectible, mais il montre des possibilités de l'association avec l'IA.
Attention à la complexité, au rendu et aux coûts
Si la veille par les agents IA est prometteuse, on peut noter certaines limites. Notamment la complexité du workflow à mettre en place pour intégrer plusieurs flux RSS sur n8n. Attention aussi à bien vérifier que les flux RSS sont mis à jour. On note également des limites dans l'autonomie de l'agent IA. Celui-ci ne pourra pas dire : "cet article est intéressant car il contredit ce que nous avons appris la semaine dernière d'une autre source." Cette méta-analyse nécessite une intervention humaine ou des workflows encore plus complexes. L'humain demeure celui qui définit la stratégie, les sources ou les objectifs.
Côté prix, n8n, après la période gratuite, facture 24 euros par mois pour sa formule minimale. Pour bien gérer le coût des API, il est conseillé de définir un plafond de dépenses que l'interface de programmation ne dépassera jamais, de recevoir des alertes de facturation, par exemple, lorsque vous atteignez 50 %, 75%, et 90 % de votre limite de dépenses mensuelle. Utilisez une clef API spécifique pour votre projet, afin de connaître le coût de votre veille. Pour ce qui est du choix entre Gemini 1.5 Flash ou l'équivalent GPT-3.5-turbo, comparez les prix. Le "free tier" de l'API Gemini est généreux. Il offre un quota de 60 requêtes par minute. Cela est suffisant pour notre veille, même avec une exécution toutes les 5 minutes. OpenAI possède un quota gratuit plus limité.