Noise to Blog (Do Ruído ao Post)
Pegue qualquer entrada confusa (lista de tópicos, transcrições de voz, threads de tweets ou rascunhos curtos) e produza um post de blog polido e pronto para publicação. Cada afirmação tem origem no material de origem ou em pesquisa verificada pelo Tavily.
Regra crítica: NÃO INVENTE DETALHES. Cada afirmação, métrica e exemplo no post de blog deve vir da entrada bruta ou de um resultado de pesquisa do Tavily. Nunca fabrique dados, citações ou resultados.
Etapa 1: Verificação de Configuração
Confirme que as variáveis de ambiente necessárias estão definidas:
echo "GEMINI_API_KEY: ${GEMINI_API_KEY:+definida}"
echo "TAVILY_API_KEY: ${TAVILY_API_KEY:-não definida, o enriquecimento Tavily será ignorado}"
Se GEMINI_API_KEY estiver faltando: Pare. Informe ao usuário: "GEMINI_API_KEY é obrigatório. Obtenha uma em aistudio.google.com → Obter chave de API. Adicione-a ao seu arquivo .env."
Se TAVILY_API_KEY estiver faltando: Continue. Anote que o enriquecimento Tavily será ignorado. O post de blog será baseado inteiramente no conteúdo fornecido. Isso é aceitável para histórias pessoais, tutoriais baseados em experiência ou artigos de opinião.
Confirme que a entrada está presente. O usuário deve fornecer um dos seguintes:
- Texto colado (lista de tópicos, notas confusas, transcrição, thread de tweets, rascunho curto)
- Uma URL para buscar
Se não houver entrada, pergunte: "Compartilhe suas notas confusas, lista de tópicos ou transcrição. Cole-os diretamente ou forneça uma URL para buscar a fonte."
Etapa 2: Ler e Analisar a Entrada
Se a entrada for uma URL: Busque o conteúdo da página usando WebFetch. Extraia: título, autor, data de publicação, todo o texto do corpo, estatísticas principais, listas numeradas, subtítulos, citações.
Se a entrada for texto colado: Leia diretamente. Identifique o tipo de entrada:
- Lista de tópicos ou notas confusas: ideias fragmentadas, frases incompletas, fluxo de consciência
- Transcrição de voz: conversacional, repetitiva, palavras de preenchimento (hum, é, tipo, sabe), frases divagantes
- Thread de tweets: fragmentos curtos, @menções, hashtags, numeração "1/8"
- Rascunho curto: estruturado, mas superficial, precisa de expansão e polimento
Ponto de verificação de QA: Declare antes de continuar:
- Tipo de entrada detectado
- Tese central ou argumento principal em uma frase
- Os 3-5 insights, fatos ou ideias mais fortes do conteúdo bruto
- Quaisquer afirmações que precisem de verificação externa (benchmarks, estatísticas, comparações de produtos, resultados de pesquisa)
Se você não conseguir identificar uma tese central, pergunte: "Qual é a coisa mais importante que você quer que os leitores levem deste post?"
Etapa 3: Escolher o Estilo do Post de Blog
Quatro estilos. Detecção automática a partir dos sinais do conteúdo. A substituição pelo usuário é sempre respeitada.
| Estilo | Quando usar | Sinais |
|---|---|---|
| Tutorial Técnico | Guia passo a passo, instruções, explicação de código | Etapas numeradas, comandos, trechos de código, "como fazer" no conteúdo |
| Estudo de Caso | História de antes/depois, registro de construção, lições aprendidas | Resultados específicos, cronogramas, jornada em primeira pessoa |
| Liderança de Pensamento | Opinião, argumento, afirmação contraintuitiva | "Eu acho", "o problema com X", posição contrária, enquadramento de debate |
| Explicador | O que é X, por que importa, como funciona | Foco no conceito, muitas comparações, "a maioria das pessoas não sabe" |
Lógica de detecção:
- Conteúdo com etapas numeradas ou comandos → Tutorial Técnico
- Conteúdo com antes/depois, métricas específicas ou arco narrativo → Estudo de Caso
- Conteúdo que argumenta contra o senso comum ou faz uma forte afirmação de opinião → Liderança de Pensamento
- Conteúdo que explica um conceito, ferramenta ou tendência para pessoas não familiarizadas → Explicador
Declare o estilo escolhido e a justificativa. Se for ambíguo, escolha um e anote a escolha.
Etapa 4: Enriqueça com Pesquisa Tavily
Pule esta etapa silenciosamente se TAVILY_API_KEY não estiver definida.
Pesquise evidências de apoio para afirmações no conteúdo bruto que possam se beneficiar de verificação ou dados. Bons candidatos:
- Benchmarks de produtos ou números de desempenho
- Estatísticas de mercado ou tendências do setor
- Comparações técnicas ("X é mais rápido que Y")
- Qualquer número que o usuário mencionou de memória, em vez de uma fonte citada
Execute uma pesquisa Tavily por afirmação que precise de verificação. Limite a no máximo 3 pesquisas para evitar excesso de fontes:
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "AFIRMAÇÃO_OU_TÓPICO_ESPECÍFICO",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true
}'
Mantenha os resultados com score >= 0.65. Extraia: título, url, trecho de conteúdo.
Regras para usar os resultados do Tavily:
- Use-os para apoiar ou verificar afirmações já presentes na entrada bruta. Nunca introduza novas afirmações a partir dos resultados da pesquisa.
- Atribua fontes naturalmente no texto: "de acordo com [Fonte]", "dados de [X] mostram"
- Se nenhum resultado do Tavily confirmar uma afirmação, deixe a afirmação não verificada em vez de substituir por um resultado não relacionado
Etapa 5: Gerar o Post de Blog
Leia references/blog-format.md na íntegra. Selecione o modelo correspondente em references/output-template.md. Internalize todas as regras antes de gerar.
Escreva a requisição Gemini em um arquivo temporário para lidar com caracteres especiais com segurança:
cat > /tmp/noise2blog-request.json << 'ENDJSON'
{
"system_instruction": {
"parts": [{
"text": "Você é um escritor de tecnologia que soa como uma pessoa real. Regras: Apenas voz ativa. Parágrafos curtos, de 1 a 3 linhas no máximo, depois uma linha em branco. Use contrações naturalmente (não, vou, é, não posso, você é, eles são). Sem travessões — use uma vírgula ou ponto final. Sem ponto e vírgula. Cada frase precisa de um detalhe concreto: um número, um nome de ferramenta, um nome de arquivo, um comando, um resultado. Sem frases de preenchimento: sem 'No mundo atual em rápida evolução', sem 'Vamos mergulhar', sem 'Vale a pena notar', sem 'Para concluir', sem 'Espero que tenha sido útil'. Sem palavras proibidas: incrível, impressionante, alavancar, sinergizar, revolucionário, inovador, transformador, disruptivo, desbloquear, abrangente, acionável, crucial, fundamental. O título não deve começar com Eu, Meu ou Nós. Abra com um parágrafo de gancho que não anuncie o tópico. Termine com algo acionável. Não invente afirmações, métricas ou resultados que não estejam presentes no material de origem."
}]
},
"contents": [{
"parts": [{
"text": "CONTEÚDO_BRUTO_E_INSTRUÇÕES_AQUI"
}]
}],
"generationConfig": {
"temperature": 0.7,
"maxOutputTokens": 4096
}
}
ENDJSON
Substitua CONTEÚDO_BRUTO_E_INSTRUÇÕES_AQUI por:
- O conteúdo bruto de entrada
- As instruções de estilo e estrutura do post de blog (do modelo selecionado)
- Quaisquer resultados de pesquisa Tavily coletados na Etapa 4
- Alvo de palavras: 800 a 1.800 palavras
Faça a requisição:
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'])"
Produza também:
- (B) Uma meta descrição de 1 a 2 frases para preview de SEO
- (C) Um título alternativo usando um ângulo de gancho diferente
Etapa 6: Auto-QA
Execute cada verificação e corrija violações antes de apresentar:
- O título não começa com "Eu", "Meu" ou "Nós"
- O título é específico e coloquial (não "Um Guia Abrangente para X" ou "O Guia Definitivo para Y")
- O parágrafo de abertura prende a atenção sem anunciar o tópico ("Neste post eu vou...")
- Sem travessões em nenhuma linha
- Sem ponto e vírgula
- Nenhum parágrafo com mais de 3 linhas antes de uma linha em branco
- Sem palavras proibidas: incrível, impressionante, alavancar, sinergizar, revolucionário, inovador, transformador, disruptivo, desbloquear, abrangente, acionável, crucial, fundamental
- Nenhum dado inventado: toda afirmação tem origem na entrada bruta ou em um resultado Tavily
- O post não termina com "Para concluir", "Em resumo" ou "Espero que tenha ajudado"
- 800 a 1.800 palavras (declare a contagem de palavras)
- Fluxo lógico: abertura → problema/contexto → seções do corpo → encerramento acionável
Corrija qualquer violação antes de apresentar. Declare a contagem final de palavras.
Etapa 7: Saída
Apresente o post de blog completo em um bloco de código.
Apresente a meta descrição e o título alternativo abaixo do post principal.
Pergunte: "Pronto para copiar para seu editor? Se for publicar em uma plataforma específica, me avise e posso formatar o frontmatter."
Solicitação específica de plataforma:
Ghost:
---
title: "TÍTULO_DO_POST"
date: YYYY-MM-DD
tags: [tag1, tag2]
status: draft
---
dev.to:
---
title: TÍTULO_DO_POST
description: META_DESCRIÇÃO
tags: [tag1, tag2, tag3]
published: false
---
Substack: Apresente como Markdown simples. O editor do Substack importa markdown diretamente.
Hashnode:
---
title: TÍTULO_DO_POST
subtitle: META_DESCRIÇÃO
tags: [tag1, tag2]
---