O que Gerador de Briefing de Reunião faz?
Recebe o nome de uma empresa e um contato opcional. Pesquisa a empresa via Tavily. Sintetiza um briefing pré-reunião de uma página com Gemini. Opcionalmente, salva no Notion.
Regra crítica: NÃO INVENTE DETALHES ESPECÍFICOS. Cada fato, número e afirmação no briefing deve vir de um resultado de pesquisa do Tavily. Marque qualquer seção sem dados de pesquisa como "Informações públicas limitadas encontradas." Nunca invente valores de financiamento, contagens de funcionários ou detalhes de produtos.
Etapa 1: Verificação de Configuração
Confirme as variáveis de ambiente necessárias:
echo "TAVILY_API_KEY: ${TAVILY_API_KEY:+definida}"
echo "GEMINI_API_KEY: ${GEMINI_API_KEY:+definida}"
echo "NOTION_TOKEN: ${NOTION_TOKEN:-não definido}"
echo "NOTION_DATABASE_ID: ${NOTION_DATABASE_ID:-não definido}"
Se TAVILY_API_KEY estiver faltando: Pare. Informe ao usuário: "TAVILY_API_KEY é obrigatória. Obtenha-a em app.tavily.com. Adicione-a ao seu arquivo .env."
Se GEMINI_API_KEY estiver faltando: Pare. Informe ao usuário: "GEMINI_API_KEY é obrigatória. Obtenha-a em aistudio.google.com. Adicione-a ao seu arquivo .env."
Se NOTION_TOKEN ou NOTION_DATABASE_ID estiver faltando: Continue. O briefing será gerado apenas como texto. O salvamento no Notion será ignorado.
Confirme se a entrada está presente. O usuário deve fornecer no mínimo o nome de uma empresa. Se não for fornecido, pergunte: "Com qual empresa você vai se reunir?"
Etapa 2: Coleta de Contexto
Colete as informações a seguir. Pergunte apenas pelo que estiver faltando.
Obrigatório:
- Nome da empresa (ou domínio/URL, se fornecido)
- Data da reunião
Opcional (não bloqueie se estiver faltando):
- Nome e cargo do contato
- Tipo de reunião (descoberta, demonstração, follow-up, QBR)
- Quaisquer tópicos ou objetivos específicos que o usuário queira abordar
Se o usuário fornecer uma URL ou domínio da empresa, use-o para tornar as consultas ao Tavily mais precisas (por exemplo, site:exemplo.com ou inclua o domínio nos termos de pesquisa).
Etapa 3: Pesquisa com Tavily
Execute estas pesquisas em sequência. Cada uma tem como alvo uma seção do briefing. Salve os principais resultados de cada uma (título, URL, trecho de conteúdo, pontuação).
Mantenha resultados com pontuação >= 0,5. Se uma pesquisa retornar 0 resultados qualificados, marque essa seção como "Informações públicas limitadas encontradas."
Pesquisa 1: Visão geral da empresa
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "\"EMPRESA\" visão geral fundada funcionários sede",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true
}'
Pesquisa 2: Notícias recentes (últimos 30 dias)
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "\"EMPRESA\" notícias anúncio",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true,
"topic": "news",
"time_range": "month"
}'
Pesquisa 3: Stack tecnológico
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "\"EMPRESA\" stack tecnológico engenharia infraestrutura ferramentas",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true
}'
Pesquisa 4: Produto e preços
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "\"EMPRESA\" produto funcionalidades preços caso de uso",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true
}'
Pesquisa 5: Concorrentes
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "\"EMPRESA\" concorrentes alternativas vs",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true
}'
Pesquisa 6: Financiamento e crescimento
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "\"EMPRESA\" financiamento captação valuation crescimento",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true
}'
Se o nome do contato for fornecido, execute mais duas pesquisas:
Pesquisa 7: Perfil do contato
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "\"NOME_DO_CONTATO\" \"EMPRESA\" cargo função",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true
}'
Pesquisa 8: Histórico do contato
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "\"NOME_DO_CONTATO\" histórico carreira LinkedIn",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true
}'
Etapa 4: Síntese com Gemini
Leia references/brief-format.md na íntegra. Leia references/output-template.md e use o modelo.
Escreva a requisição Gemini em um arquivo temporário:
cat > /tmp/meeting-brief-request.json << 'ENDJSON'
{
"system_instruction": {
"parts": [{
"text": "Você é um analista de pesquisa de GTM preparando um briefing pré-reunião de uma página para uma reunião de vendas ou desenvolvimento de negócios. Regras: Cada afirmação deve citar uma URL de origem da pesquisa fornecida. Use o formato 'Porque [descoberta da pesquisa], mencione [ponto] para [objetivo]' para pontos de discussão. Nenhum dado inventado. Se uma seção não tiver dados da pesquisa, escreva 'Informações públicas limitadas encontradas.' Sem travessão. Sem palavras proibidas. Menos de 400 palavras no total. O briefing deve ser legível em 3 minutos."
}]
},
"contents": [{
"parts": [{
"text": "RESULTADOS_DA_PESQUISA_E_INSTRUÇÕES_AQUI"
}]
}],
"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'])"
Substitua RESULTADOS_DA_PESQUISA_E_INSTRUÇÕES_AQUI por:
- Todos os resultados da pesquisa Tavily (título, URL, trecho de conteúdo por resultado)
- A estrutura do modelo de briefing de output-template.md
- O nome da empresa, nome do contato (se fornecido), data da reunião, tipo de reunião (se fornecido)
Etapa 5: Autoavaliação
Verifique antes de apresentar:
- Nenhum dado inventado. Cada fato tem uma URL de origem dos resultados Tavily.
- Pontos de discussão usam o formato "Porque [descoberta], mencione [ponto] para [objetivo]"
- Sem travessão em nenhuma linha
- Sem palavras proibidas
- Briefing com menos de 400 palavras
- Seção de Tomador de Decisão diz "Não especificado" se nenhum contato foi fornecido
- Seções sem dados dizem "Informações públicas limitadas encontradas" em vez de adivinhar
- Perguntas em aberto são específicas para esta empresa, não genéricas
Corrija qualquer violação antes de apresentar.
Etapa 6: Saída ou Salvamento no Notion
Apresente o briefing completo em um bloco de código.
Se NOTION_TOKEN e NOTION_DATABASE_ID estiverem ambos definidos, pergunte: "Salvar este briefing no Notion?"
Após confirmação:
cat > /tmp/notion-brief-payload.json << 'ENDJSON'
{
"parent": { "database_id": "ID_DO_BANCO_DE_DADOS_NOTION_AQUI" },
"properties": {
"Nome": {
"title": [{ "text": { "content": "Briefing de Reunião: EMPRESA, DATA" } }]
},
"Data": {
"date": { "start": "YYYY-MM-DD" }
}
},
"children": [
{
"object": "block",
"type": "paragraph",
"paragraph": {
"rich_text": [{ "type": "text", "text": { "content": "CONTEÚDO_DO_BRIEFING_AQUI" } }]
}
}
]
}
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
Após enviar: "Briefing salvo no Notion. Verifique seu banco de dados."
Se o Notion não estiver configurado: apresente apenas o briefing. Não mencione o Notion.