Que fait Générateur de Brief de Réunion ?
Prenez un nom d'entreprise et un contact optionnel. Recherchez l'entreprise via Tavily. Synthétisez un brief pré-appel d'une page avec Gemini. Enregistrez optionnellement dans Notion.
Règle critique : N'INVENTEZ PAS DE SPÉCIFICITÉS. Chaque fait, nombre et affirmation dans le brief doit provenir d'un résultat de recherche Tavily. Marquez toute section sans données de recherche comme « Informations publiques limitées trouvées ». N'inventez jamais de montants de financement, d'effectifs ou de détails sur les produits.
Étape 1 : Vérification de la Configuration
Confirmez les variables d'environnement requises :
echo "TAVILY_API_KEY: ${TAVILY_API_KEY:+définie}"
echo "GEMINI_API_KEY: ${GEMINI_API_KEY:+définie}"
echo "NOTION_TOKEN: ${NOTION_TOKEN:-non définie}"
echo "NOTION_DATABASE_ID: ${NOTION_DATABASE_ID:-non définie}"
Si TAVILY_API_KEY est manquante : Arrêtez. Dites à l'utilisateur : "TAVILY_API_KEY est requise. Obtenez-la sur app.tavily.com. Ajoutez-la à votre fichier .env."
Si GEMINI_API_KEY est manquante : Arrêtez. Dites à l'utilisateur : "GEMINI_API_KEY est requise. Obtenez-la sur aistudio.google.com. Ajoutez-la à votre fichier .env."
Si NOTION_TOKEN ou NOTION_DATABASE_ID sont manquants : Continuez. Le brief sera uniquement affiché sous forme de texte. L'enregistrement dans Notion est ignoré.
Confirmez que l'entrée est présente. L'utilisateur doit fournir au minimum un nom d'entreprise. Si ce n'est pas le cas, demandez : "Avec quelle entreprise avez-vous rendez-vous ?"
Étape 2 : Collecte du Contexte
Recueillez les informations suivantes. Ne demandez que ce qui manque.
Requis :
- Nom de l'entreprise (ou domaine/URL si fourni)
- Date de la réunion
Optionnel (ne bloquez pas si manquant) :
- Nom et titre du contact
- Type de réunion (découverte, démo, suivi, QBR)
- Tout sujet ou objectif spécifique que l'utilisateur souhaite aborder
Si l'utilisateur fournit une URL ou un domaine d'entreprise, utilisez-le pour rendre les requêtes Tavily plus précises (par exemple site:exemple.com ou incluez le domaine dans les termes de recherche).
Étape 3 : Recherche avec Tavily
Effectuez ces recherches dans l'ordre. Chacune cible une section du brief. Enregistrez les meilleurs résultats de chacune (titre, url, extrait de contenu, score).
Conservez les résultats avec un score >= 0,5. Si une recherche renvoie 0 résultat qualifiant, marquez cette section comme « Informations publiques limitées trouvées. »
Recherche 1 : Présentation de l'entreprise
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "\"ENTREPRISE\" présentation fondée employés siège social",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true
}'
Recherche 2 : Actualités récentes (30 derniers jours)
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "\"ENTREPRISE\" actualités annonce",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true,
"topic": "news",
"time_range": "month"
}'
Recherche 3 : Stack technique
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "\"ENTREPRISE\" stack technologique ingénierie infrastructure outils",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true
}'
Recherche 4 : Produits et tarifs
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "\"ENTREPRISE\" produit fonctionnalités tarifs cas d'usage",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true
}'
Recherche 5 : Concurrents
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "\"ENTREPRISE\" concurrents alternatives vs",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true
}'
Recherche 6 : Financement et croissance
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "\"ENTREPRISE\" financement levée valorisation croissance",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true
}'
Si un nom de contact est fourni, effectuez deux recherches supplémentaires :
Recherche 7 : Profil du contact
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "\"NOM_DU_CONTACT\" \"ENTREPRISE\" rôle titre",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true
}'
Recherche 8 : Parcours du contact
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "\"NOM_DU_CONTACT\" parcours carrière LinkedIn",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true
}'
Étape 4 : Synthèse avec Gemini
Lisez entièrement references/brief-format.md. Lisez entièrement references/output-template.md et utilisez le modèle.
Écrivez la requête Gemini dans un fichier temporaire :
cat > /tmp/meeting-brief-request.json << 'ENDJSON'
{
"system_instruction": {
"parts": [{
"text": "Vous êtes un analyste de recherche GTM préparant un brief pré-appel d'une page pour une réunion commerciale ou de développement d'affaires. Règles : Chaque affirmation doit citer une URL source provenant de la recherche fournie. Utilisez le format 'Parce que [résultat de la recherche], mentionnez [point] pour [objectif]' pour les points de discussion. Pas de données inventées. Si une section n'a pas de données de recherche, écrivez 'Informations publiques limitées trouvées.' Pas de tirets cadratins. Pas de mots interdits. Moins de 400 mots au total. Le brief doit être consultable en 3 minutes."
}]
},
"contents": [{
"parts": [{
"text": "RESEARCH_RESULTS_AND_INSTRUCTIONS_HERE"
}]
}],
"generationConfig": {
"temperature": 0.3,
"maxOutputTokens": 2500
}
}
ENDJSON
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/meeting-brief-request.json \
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d['candidates'][0]['content']['parts'][0]['text'])"
Remplacez RESEARCH_RESULTS_AND_INSTRUCTIONS_HERE par :
- Tous les résultats de recherche Tavily (titre, url, extrait de contenu par résultat)
- La structure du modèle de brief provenant de output-template.md
- Le nom de l'entreprise, le nom du contact (si fourni), la date de la réunion, le type de réunion (si fourni)
Étape 5 : Auto-Vérification
Vérifiez avant de présenter :
- Aucune donnée inventée. Chaque fait a une URL source provenant des résultats Tavily.
- Les points de discussion utilisent le format "Parce que [résultat], mentionnez [point] pour [objectif]"
- Aucun tiret cadratin dans aucune ligne
- Aucun mot interdit
- Le brief fait moins de 400 mots
- La section Décideur indique "Non spécifié" si aucun contact n'a été fourni
- Les sections sans données indiquent "Informations publiques limitées trouvées" plutôt que de deviner
- Les questions ouvertes sont spécifiques à cette entreprise, pas génériques
Corrigez toute violation avant de présenter.
Étape 6 : Affichage ou Enregistrement dans Notion
Présentez le brief complet dans un bloc de code.
Si NOTION_TOKEN et NOTION_DATABASE_ID sont tous les deux définis, demandez : "Enregistrer ce brief dans Notion ?"
Sur confirmation :
cat > /tmp/notion-brief-payload.json << 'ENDJSON'
{
"parent": { "database_id": "NOTION_DATABASE_ID_HERE" },
"properties": {
"Name": {
"title": [{ "text": { "content": "Brief de Réunion : ENTREPRISE, DATE" } }]
},
"Date": {
"date": { "start": "YYYY-MM-DD" }
}
},
"children": [
{
"object": "block",
"type": "paragraph",
"paragraph": {
"rich_text": [{ "type": "text", "text": { "content": "CONTENU_DU_BRIEF_ICI" } }]
}
}
]
}
ENDJSON
curl -s -X POST "https://api.notion.com/v1/pages" \
-H "Authorization: Bearer $NOTION_TOKEN" \
-H "Content-Type: application/json" \
-H "Notion-Version: 2022-06-28" \
-d @/tmp/notion-brief-payload.json
Après envoi : "Brief enregistré dans Notion. Vérifiez votre base de données."
Si Notion n'est pas configuré : présentez le brief uniquement. Ne mentionnez pas Notion.