1

Pitch: O que dá quando mistura AGRO e TECH ?

Como construímos o portal Farmify: dados reais do agronegócio + time de redação com agentes IA

O Portal Farmify é um portal de notícias e dados do agronegócio brasileiro. Nasceu da necessidade de um lugar que juntasse cotações em tempo real, dados climáticos, safra, exportações e análise editorial — num produto que produtores rurais, traders e agrônomos realmente usam.

Este artigo descreve o que construímos: stack, APIs integradas e a parte que mais me orgulho — um time editorial de agentes IA que reescreve e publica conteúdo automaticamente.


Stack

Frontend

  • React 19 + Vite + TypeScript
  • Tailwind CSS v4 (via @tailwindcss/vite, design system 100% CSS com @theme)
  • Leaflet para mapas interativos do Brasil
  • Fontes: Barlow Condensed (títulos), Plus Jakarta Sans (corpo), Fraunces (serif editorial)

Backend

  • Node.js + Express + TypeScript
  • Deploy no Render
  • Supabase (PostgreSQL gerenciado + realtime)
  • Upstash Redis (cache L2 distribuído + locks distribuídos)
  • Cloudflare R2 (sitemap + assets estáticos)

APIs reais integradas

O painel de dados do Farmify consome de verdade:

FonteO que puxa
CEPEA/ESALQCotações de commodities (soja, milho, boi gordo, café, algodão...)
CONABProgresso de safra por cultura e estado
ComexStat (MDIC)Exportações brasileiras (volume, valor, destinos)
B3Contratos futuros (SFI, CCM, BGI, ICF, WDO)
BCB FocusExpectativas de mercado: IPCA, PIB, Selic, câmbio
USDA WASDERelatório mensal de oferta e demanda global
USDA NASSDados de produção agropecuária dos EUA
FRED (St. Louis Fed)Macros americanas
INPEFocos de queimadas em tempo real
Open-MeteoClima ao vivo para capitais + mapa climático nacional
INMETDados meteorológicos nacionais
IBGE SIDRADados estruturais do agronegócio brasileiro
FAO FAOSTATDados globais de produção e comércio alimentar
CFTCPosições de não-comerciais (especuladores) nos futuros agro EUA

Tudo isso alimenta widgets no painel: radar macro, progresso de safra, exportações em ticker, mapa de queimadas, clima das capitais e tabela de cotações regionais.


O desafio de infra no Render 512MB

O backend roda num plano starter do Render com memória bastante limitada. Isso forçou algumas decisões:

  • Boot assíncrono em cascata: crons não disparam todos de uma vez. CRON_START_DELAY_MS=30000 + gap de 8s entre cada um evita pico de memória na inicialização.
  • Lock distribuído via Redis: extractionLock e openMeteoSyncLock usam Upstash para garantir que crons simultâneos (em caso de restart) não corram em paralelo.
  • Cache em dois níveis: cache em memória com TTL (ttlCache.ts) + Redis como L2. Dados de APIs externas ficam cachados; só chama a API quando o cache expira.

O time editorial de agentes IA

Essa é a parte mais interessante do projeto.

Quando nossos scrapers capturam uma notícia de fontes como Globo Rural, Notícias Agrícolas etc., ela entra num pipeline editorial automatizado onde agentes IA reescrevem e publicam o conteúdo com a voz do Farmify.

Pipeline de 6 papéis

Notícia bruta → [Repórter] → [Editor-Chefe] → [Especialista Técnico]
              → [Especialista SEO] → [Revisor] → [Publicador] → Artigo publicado

Cada agente tem um papel fixo com tarefa específica:

AgenteTarefa
RepórterExtrai fatos principais e reescreve com voz Farmify
Editor-ChefeMelhora narrativa, fluidez, estrutura, título e subtítulo
Especialista TécnicoValida termos agrícolas, enriquece com contexto útil ao produtor
Especialista SEOOtimiza headings, keywords, Google Discover, gera FAQ
RevisorCorrige português, concordância, repetições
PublicadorGera slug, meta title, meta description, tags e categoria sugerida

Personas com identidade própria

Cada passo do pipeline pode ter uma persona associada — um agente com nome, cargo, especialidade, DNA editorial, goals e regras próprias. A persona é configurável pelo admin: você pode ter "Ana Lima, repórter especialista em soja" rodando num modelo, e "Carlos Mendes, editor-chefe sênior" rodando em outro.

Isso significa que o time editorial é configurável via painel admin — sem mexer em código.

Multi-provider

O campo provider na persona aceita: openai, anthropic, gemini, deepseek, mistral, grok, local. Cada agente pode rodar num modelo diferente. Hoje usamos GPT-4o-mini por custo, mas podemos mudar por persona ou por categoria de conteúdo.

Saída estruturada

Cada agente retorna JSON estrito (sem markdown, nunca texto livre). Exemplo do Publicador:

{
  "title": "string",
  "subtitle": "string",
  "summary": "string",
  "content": "string (HTML final)",
  "slug": "string",
  "seoTitle": "string (até 60 chars)",
  "seoDescription": "string (até 160 chars)",
  "seoKeyword": "string",
  "tags": ["string"],
  "suggestedCategoryName": "string"
}

A regra mais importante no prompt de todos os agentes: nunca invente fatos, números, citações ou nomes que não estejam no material original. O enriquecimento técnico só vai para o texto se baseado no conteúdo extraído ou marcado explicitamente como "análise".

Teams configuráveis

O pipeline é definido por um editorial team — uma lista ordenada de steps com role + personaId. O admin pode criar múltiplos times (ex: "time express" só com Repórter + Publicador para breaking news, "time completo" com os 6 agentes para reportagens longas) e definir qual é o padrão.


Geração de artes para Instagram

Além do pipeline editorial, existe um módulo de social generator que usa Puppeteer para renderizar artes HTML/CSS, capturar screenshot e publicar automaticamente via Instagram Graph API.

O processo: o agente gera a legenda com GPT → Puppeteer renderiza o template visual → upload para Meta → publicação agendada. O Upstash Redis serve como lock para evitar colisões de publicação (Meta limita requests e cobra por slot de tempo).


Sitemap automatizado

O sitemap é gerado em chunks, salvo no Cloudflare R2 e servido via CDN (cdn.farmify.com.br). Após cada atualização, o sistema faz ping automático para os motores de busca. Cron a cada 6 horas, com debounce de 30s para mudanças em rajada.


O que aprendemos

APIs de dados agro são inconsistentes. CEPEA usa scraping de tabelas HTML. CONAB muda o formato do CSV sem aviso. ComexStat tem rate limit agressivo. USDA WASDE é um PDF que você precisa parsear. Cada integração é um projeto por si só.

Pipeline de agentes exige prompt engineering disciplinado. A tentação de deixar o LLM "ser criativo" é grande — mas num portal de agronegócio onde você está falando de preço de soja por saca, a alucinação é um problema real. Output JSON estruturado + regra de não inventar fatos resolveu a maior parte dos problemas.

Configurabilidade via banco de dados tem custo. Deixar personas e times configuráveis pelo admin é poderoso, mas significa que bugs de configuração aparecem em runtime, não em compile time. Valeu a pena, mas exigiu boa validação no agentRegistry.


Próximos passos

  • Suporte a categorias por persona (repórter especialista em café cobre só categoria Café)
  • Painel de métricas do pipeline: tokens consumidos, custo por artigo, tempo por step
  • Teste A/B de personas: comparar output de dois agentes no mesmo papel

Se você está construindo algo similar — portal de nicho com dados de APIs externas + pipeline editorial IA — fico feliz em trocar ideia nos comentários.

O Portal Farmify está disponível em [https://portal.farmify.com.br]

Carregando publicação patrocinada...