Que fait Du Bruit au Blog ?
Prenez n'importe quelle entrée brute (listes à puces, transcriptions vocales, fils de tweets ou brouillons courts) et produisez un article de blog soigné et prêt à être publié. Chaque affirmation fait référence à la source d'origine ou à une recherche vérifiée via Tavily.
Règle cruciale : N'INVENTEZ AUCUN DÉTAIL. Chaque affirmation, mesure et exemple dans l'article doit provenir de l'entrée brute ou d'un résultat de recherche Tavily. Ne fabriquez jamais de données, de citations ou de résultats.
Étape 1 : Vérification de la configuration
Confirmez que les variables d'environnement requises sont définies :
echo "GEMINI_API_KEY: ${GEMINI_API_KEY:+défini}"
echo "TAVILY_API_KEY: ${TAVILY_API_KEY:-non défini, l'enrichissement Tavily sera ignoré}"
Si GEMINI_API_KEY est manquante : Arrêtez. Dites à l'utilisateur : « GEMINI_API_KEY est nécessaire. Obtenez-la sur aistudio.google.com → Obtenir une clé API. Ajoutez-la à votre fichier .env. »
Si TAVILY_API_KEY est manquante : Continuez. Notez que l'enrichissement Tavily sera ignoré. L'article sera basé entièrement sur le contenu fourni. Cela convient pour des histoires personnelles, des tutoriels basés sur l'expérience ou des articles d'opinion.
Confirmez que l'entrée est présente. L'utilisateur doit fournir l'un des éléments suivants :
- Texte collé (listes à puces, notes approximatives, transcription, fil de tweets, brouillon court)
- Une URL à récupérer
Si aucune entrée, demandez : « Partagez vos notes approximatives, listes à puces ou transcription. Collez-les directement, ou donnez-moi une URL pour récupérer la source. »
Étape 2 : Lire et analyser l'entrée
Si l'entrée est une URL : Récupérez le contenu de la page en utilisant WebFetch. Extrayez : titre, auteur, date de publication, tout le texte du corps, les statistiques clés, les listes numérotées, les sous-titres, les citations.
Si l'entrée est un texte collé : Lisez-le directement. Identifiez le type d'entrée :
- Listes à puces ou notes approximatives : idées fragmentées, phrases incomplètes, flux de conscience
- Transcription vocale : conversationnel, répétitif, mots de remplissage (euh, heu, comme, tu sais), phrases qui s'égarent
- Fil de tweets : fragments courts, @mentions, hashtags, numérotation "1/8"
- Brouillon court : structuré mais maigre, nécessite développement et polissage
Point de contrôle qualité : Avant de continuer, indiquez :
- Type d'entrée détecté
- Thèse centrale ou argument principal en une phrase
- Les 3 à 5 idées, faits ou informations les plus solides du contenu brut
- Les affirmations qui nécessitent une vérification externe (benchmarks, statistiques, comparaisons de produits, résultats de recherche)
Si vous ne pouvez pas identifier de thèse centrale, demandez : « Quelle est la chose la plus importante que vous voulez que les lecteurs retiennent de cela ? »
Étape 3 : Choisir le style de l'article
Quatre styles. Détection automatique à partir des signaux du contenu. L'utilisateur peut toujours demander un style spécifique.
| Style | Quand l'utiliser | Signaux |
|---|---|---|
| Tutoriel technique | Guide étape par étape, mode d'emploi, démonstration de code | Étapes numérotées, commandes, extraits de code, « comment faire » dans le contenu |
| Étude de cas | Histoire avant/après, journal de construction, leçons apprises | Résultats spécifiques, chronologies, parcours à la première personne |
| Leadership éclairé | Opinion, argument, affirmation contre-intuitive | « Je pense », « le problème avec X », position contradictoire, cadrage de débat |
| Explicatif | Qu'est-ce que X, pourquoi cela compte, comment cela fonctionne | Centré sur le concept, riche en comparaisons, « la plupart des gens ne savent pas » |
Logique de détection :
- Le contenu contient des étapes numérotées ou des commandes → Tutoriel technique
- Le contenu contient un avant/après, des mesures spécifiques ou un arc narratif → Étude de cas
- Le contenu argumente contre la sagesse commune ou émet une opinion forte → Leadership éclairé
- Le contenu explique un concept, un outil ou une tendance à des personnes qui ne le connaissent pas → Explicatif
Indiquez le style choisi et la raison. En cas d'ambiguïté, choisissez-en un et notez le choix.
Étape 4 : Enrichir avec la recherche Tavily
Ignorer cette étape silencieusement si TAVILY_API_KEY n'est pas défini.
Recherchez des preuves à l'appui des affirmations contenues dans le contenu brut qui pourraient bénéficier d'une vérification ou de données. Bons candidats :
- Benchmarks de produits ou chiffres de performance
- Statistiques de marché ou tendances sectorielles
- Comparaisons techniques (« X est plus rapide que Y »)
- Tout nombre mentionné par l'utilisateur de mémoire plutôt que d'une source citée
Exécutez une recherche Tavily par affirmation nécessitant une vérification. Limitez à 3 recherches maximum pour éviter de trop sourcer :
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "AFFIRMATION_OU_SUJET_SPÉCIFIQUE",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true
}'
Conservez les résultats avec score >= 0,65. Extrayez : titre, url, extrait de contenu.
Règles d'utilisation des résultats Tavily :
- Utilisez-les pour soutenir ou vérifier les affirmations déjà présentes dans l'entrée brute. N'introduisez jamais de nouvelles affirmations provenant des résultats de recherche.
- Attribuez les sources naturellement dans le texte : « selon [Source] », « les données de [X] montrent »
- Si aucun résultat Tavily ne confirme une affirmation, laissez l'affirmation non vérifiée plutôt que de substituer un résultat non pertinent
Étape 5 : Générer l'article de blog
Lisez references/blog-format.md en intégralité. Sélectionnez le modèle correspondant dans references/output-template.md. Intégrez toutes les règles avant de générer.
Écrivez la requête Gemini dans un fichier temporaire pour gérer les caractères spéciaux en toute sécurité :
cat > /tmp/noise2blog-request.json << 'ENDJSON'
{
"system_instruction": {
"parts": [{
"text": "Vous êtes un rédacteur technique qui sonne comme une vraie personne. Règles : Voix active uniquement. Paragraphes courts, 1 à 3 lignes max, puis une ligne vide. Utilisez les contractions naturellement (ne...pas, n'est pas, ne peut pas, vous êtes, ils sont). Pas de tirets cadratins — utilisez une virgule ou un point à la place. Pas de points-virgules. Chaque phrase doit contenir un détail concret : un nombre, un nom d'outil, un nom de fichier, une commande, un résultat. Pas de phrases de remplissage : pas de 'Dans le monde actuel en constante évolution', pas de 'Plongeons-nous', pas de 'Il est à noter que', pas de 'En conclusion', pas de 'J'espère que cela vous a aidé'. Pas de mots interdits : incroyable, étonnant, tirer parti, synergiser, révolutionnaire, innovant, révolution, paradigme, de pointe, transparent, robuste, sans précédent, plonger, exploiter, utiliser, transformateur, perturbateur, débloquer, complet, actionnable, crucial, essentiel. Le titre ne doit pas commencer par Je, Mon ou Nous. Commencez par un paragraphe d'accroche qui n'annonce pas le sujet. Terminez par quelque chose d'actionnable. N'inventez pas d'affirmations, de mesures ou de résultats absents du matériel source."
}]
},
"contents": [{
"parts": [{
"text": "CONTENU_BRUT_ET_INSTRUCTIONS_ICI"
}]
}],
"generationConfig": {
"temperature": 0.7,
"maxOutputTokens": 4096
}
}
ENDJSON
Remplacez CONTENU_BRUT_ET_INSTRUCTIONS_ICI par :
- Le contenu brut de l'entrée
- Les instructions de style et de structure de l'article (à partir du modèle sélectionné)
- Les résultats de recherche Tavily collectés à l'étape 4
- Objectif de mots : 800 à 1 800 mots
Publiez la requête :
curl -s -X POST \
"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d @/tmp/noise2blog-request.json \
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d['candidates'][0]['content']['parts'][0]['text'])"
Produisez également :
- (B) Une méta-description de 1 à 2 phrases pour le texte d'aperçu SEO
- (C) Un titre alternatif utilisant un angle d'accroche différent
Étape 6 : Auto-contrôle qualité
Vérifiez chaque point et corrigez les violations avant de présenter :
- Le titre ne commence pas par « Je », « Mon » ou « Nous »
- Le titre est spécifique et conversationnel (pas « Un guide complet de X » ou « Le guide ultime de Y »)
- Le paragraphe d'ouverture accroche sans annoncer le sujet (« Dans cet article, je vais... »)
- Pas de tirets cadratins dans aucune ligne
- Pas de points-virgules
- Aucun paragraphe de plus de 3 lignes avant une ligne vide
- Pas de mots interdits : incroyable, étonnant, tirer parti, révolutionnaire, plonger, exploiter, débloquer, de pointe, remarquable, paradigme, révolutionner, transparent, robuste, utiliser, sans précédent, complet, actionnable, crucial, essentiel
- Pas de données inventées : chaque affirmation fait référence à l'entrée brute ou à un résultat Tavily
- L'article ne se termine pas par « En conclusion », « Pour résumer » ou « J'espère que cela vous a aidé »
- 800 à 1 800 mots (indiquez le nombre de mots)
- Flux logique : ouverture → problème/contexte → sections principales → conclusion actionnable
Corrigez toute violation avant de présenter. Indiquez le nombre final de mots.
Étape 7 : Sortie
Présentez l'article complet dans un bloc de code.
Présentez la méta-description et le titre alternatif sous l'article principal.
Demandez : « Prêt à copier ceci dans votre éditeur ? Si vous publiez sur une plateforme spécifique, dites-le moi et je peux formater le frontmatter. »
Sur demande de plateforme spécifique :
Ghost :
---
title: "TITRE_ARTICLE"
date: AAAA-MM-JJ
tags: [tag1, tag2]
status: draft
---
dev.to :
---
title: TITRE_ARTICLE
description: META_DESCRIPTION
tags: [tag1, tag2, tag3]
published: false
---
Substack : Présentez en Markdown simple. L'éditeur de Substack importe le markdown directement.
Hashnode :
---
title: TITRE_ARTICLE
subtitle: META_DESCRIPTION
tags: [tag1, tag2]
---